1 package com.daffodilwoods.daffodildb.server.sql99.dml; 2 3 import java.util.*; 4 import com.daffodilwoods.daffodildb.server.datadictionarysystem.*; 5 import com.daffodilwoods.daffodildb.server.datasystem.interfaces.*; 6 import com.daffodilwoods.daffodildb.server.serversystem.*; 7 import com.daffodilwoods.daffodildb.server.sessionsystem.*; 8 import com.daffodilwoods.daffodildb.server.sql99.common.*; 9 import com.daffodilwoods.daffodildb.server.sql99.dql.iterator.*; 10 import com.daffodilwoods.daffodildb.server.sql99.dql.semanticchecker.*; 11 import com.daffodilwoods.daffodildb.server.sql99.expression.booleanvalueexpression.*; 12 import com.daffodilwoods.daffodildb.server.sql99.token.*; 13 import com.daffodilwoods.daffodildb.server.sql99.utils.*; 14 import com.daffodilwoods.database.general.*; 15 import com.daffodilwoods.database.resource.*; 16 import com.daffodilwoods.daffodildb.server.sql99.expression.correlationname; 17 import com.daffodilwoods.daffodildb.server.sql99.dql.plan.table.SingleTablePlan; 18 import com.daffodilwoods.database.utility.P; 19 import java.util.ArrayList ; 20 21 public class deletestatementsearched implements com.daffodilwoods.daffodildb.utils.parser.StatementExecuter, SQLdatachangestatement, Parameters,TypeConstants { 22 public SRESERVEDWORD1206543922searchcondition _OptSRESERVEDWORD1206543922searchcondition0; 23 public correlationname _Optcorrelationname1 ; 24 public targettable _targettable2; 25 public SRESERVEDWORD1206543922 _OptSRESERVEDWORD12065439223; 26 public SRESERVEDWORD1206543922 _SRESERVEDWORD12065439224; 27 28 private boolean checkingPerformed; 29 private ArrayList knownReferences; 30 private _Reference[] questionMarks; 31 private String aliasName =null; 32 private _Reference[] refToCheck; 33 private ColumnDetails[] columnDetail =null; 34 public _Reference[] checkSemantic(_ServerSession serverSession) throws DException { 35 TableDetails tableDetails = (TableDetails) _targettable2.run(serverSession); 36 if(_Optcorrelationname1 != null){ 37 aliasName = (String ) _Optcorrelationname1.run(serverSession); 38 tableDetails.setAliasName(aliasName); 39 } 40 41 SemanticChecker.initializeCatalogNameAndSchemaNameOfTable(tableDetails, serverSession); 42 _ColumnCharacteristics cc = serverSession.getColumnCharacteristics(tableDetails.getQualifiedIdentifier()); 43 tableDetails.cc = cc; 44 tableDetails.setTableType(cc.getTableType()); 45 46 if (tableDetails.getTableType() == TypeConstants.VIEW) { 47 throw new DmlStatementException("DSE1277", new Object [] {tableDetails.getQualifiedTableName()} 48 , new DException("DSE1267", null)); 49 } 50 51 tableDetails.cc = serverSession.getColumnCharacteristics(tableDetails.getQualifiedIdentifier()); 52 checkingPerformed = true; 53 54 _PrivilegeTable privilegeTable = serverSession.getUserSession().getPrivilegeCharacteristics().getPrivilegeTable(tableDetails.getQualifiedIdentifier()); 55 if (!privilegeTable.hasTablePrivileges(PrivilegeTable.DELETE)) { 56 throw new PrivilegeException("DSE340", new Object [] {"DELETE", tableDetails.getQualifiedIdentifier()}); 57 } 58 59 knownReferences = new ArrayList (4); 60 if (_OptSRESERVEDWORD1206543922searchcondition0 != null) { 61 ArrayList list = new ArrayList (); 62 GeneralPurposeStaticClass.addRecursively(_OptSRESERVEDWORD1206543922searchcondition0.getColumnDetails(), list); 63 ColumnDetails[] cds = (ColumnDetails[]) list.toArray(new ColumnDetails[0]); 64 int[] columns = getColumnInWhereClause(cds, cc); 65 if (columns != null) { 66 boolean fetchRight = privilegeTable.hasColumnPrivileges(_PrivilegeTable.SELECT, 67 columns); 68 if (!fetchRight) { 69 throw new DException("DSE8132", null); 70 } 71 } 72 73 return getWhereReferences(tableDetails, serverSession); 74 } 75 return null; 76 } 77 78 private int[] getColumnInWhereClause(ColumnDetails[] cds, _ColumnCharacteristics cc) throws DException { 79 int[] columns = new int[cds.length]; 80 int j = 0; 81 for (int i = 0; i < cds.length; i++) { 82 if (cds[i].getType() == ColumnDetails.COLUMNDETAIL) { 83 try { 84 columns[j] = cds[i].getIndex(); 85 } catch (DException e) { 86 int tt = cc.getColumnIndex(cds[i].getColumn()); 87 cds[i].setIndex(tt); 88 columns[j] = tt; 89 } 90 j++; 91 } 92 } 93 if (j > 0) { 94 int[] toReturn = new int[j]; 95 System.arraycopy(columns, 0, toReturn, 0, j); 96 return toReturn; 97 } 98 return null; 99 } 100 101 public Object run(Object object) throws DException { 102 _StatementExecutionContext sec = (_StatementExecutionContext) object; 103 _ServerSession ss = sec.getServerSession(); 104 if (!checkingPerformed) { 105 performChecking(ss); 106 } 107 TableDetails tableDetails = _targettable2.getTableDetails(); 108 QualifiedIdentifier tableName = tableDetails.getQualifiedIdentifier(); 109 booleanvalueexpression condition = _OptSRESERVEDWORD1206543922searchcondition0 == null ? null : (booleanvalueexpression) _OptSRESERVEDWORD1206543922searchcondition0.run(object); 110 111 SingleTablePlan singleTablePlan = new SingleTablePlan(tableName.toString(),condition,tableDetails,null,true,columnDetail); 112 singleTablePlan.setInternalIteratorRequired(true); 113 _Iterator iterator = singleTablePlan.execute(ss); 114 ArrayList listOfTables = new ArrayList (); 115 QualifiedIdentifier table = null; 116 ArrayList dropTablesList = new ArrayList (); 117 if (_OptSRESERVEDWORD1206543922searchcondition0 != null) { 118 _OptSRESERVEDWORD1206543922searchcondition0.getTablesIncluded(listOfTables); 119 120 for (int i = 0; i < listOfTables.size(); i++) { 121 String [] table_Name = (String []) listOfTables.get(i); 122 if (table_Name.length < 3) { 123 if (table_Name.length == 1) 124 table = new QualifiedIdentifier(ss.getCurrentCatalog(), 125 ss.getCurrentSchema(), table_Name[0]); 126 else 127 table = new QualifiedIdentifier(ss.getCurrentCatalog(), 128 table_Name[0], table_Name[1]); 129 } else 130 table = new QualifiedIdentifier(table_Name[0], table_Name[1], 131 table_Name[2]); 132 if (ss.getColumnCharacteristics(table).getTableType() == TypeConstants.TABLE) 133 dropTablesList.add( ( (_MergeTable) ss.getIndexTable(table)).getDropTableInfo()); 134 } 135 } 136 table = tableDetails.getQualifiedIdentifier(); 137 dropTablesList.add( ( (_MergeTable) ss.getIndexTable(table)).getDropTableInfo()); 138 _DropTableInfo[] dropTableInfo = (_DropTableInfo[]) dropTablesList.toArray(new _DropTableInfo[0]); 139 140 DeleteExecuter dExecuter = new DeleteExecuter(sec, tableDetails, iterator, System.currentTimeMillis(), knownReferences.size() > 0 ? (_Reference[]) knownReferences.toArray(new _Reference[0]) : null, questionMarks, dropTableInfo, table); 141 return dExecuter; 142 } 143 144 public Object [] getParameters(Object object) throws DException { 145 if (_OptSRESERVEDWORD1206543922searchcondition0 == null) { 146 return null; 147 } 148 return _OptSRESERVEDWORD1206543922searchcondition0.getParameters(object); 149 } 150 151 public ParameterInfo[] getParameterInfo() throws DException { 152 _ColumnCharacteristics cc = _targettable2.getTableDetails().getColumnCharacteristics(); 153 if (_OptSRESERVEDWORD1206543922searchcondition0 == null) { 154 return null; 155 } 156 ParameterInfo[] param = _OptSRESERVEDWORD1206543922searchcondition0.getParameterInfo(); 157 ArrayList list = new ArrayList (); 158 for (int i = 0; i < param.length; i++) { 159 if (param[i].getQuestionMark()) { 160 list.add(param[i]); 161 } 162 } 163 ParameterInfo[] tt = new ParameterInfo[list.size()]; 164 list.toArray(tt); 165 return tt; 166 } 167 168 public _Reference[] getReferences() throws com.daffodilwoods.database.resource.DException { 169 return _OptSRESERVEDWORD1206543922searchcondition0 == null ? null : _OptSRESERVEDWORD1206543922searchcondition0.getReferences(new TableDetails[] {_targettable2.getTableDetails()}); 170 } 171 172 private _Reference[] checkColumnsValidity(ColumnDetails[] columns, TableDetails tableDetails, _ServerSession serverSession) throws DException { 173 ArrayList aList = new ArrayList (5); 174 SetColumnProperties.setTableNamesAndDatatypesOfAllColumns(serverSession, columns, new TableDetails[] {tableDetails} 175 , aList, new ArrayList ()); 176 for (int i = 0, length = aList.size(); i < length; i++) { 177 ( (ColumnDetails) aList.get(i)).setUnderLyingReference(true); 178 } 179 return aList.size() > 0 ? (_Reference[]) aList.toArray(new _Reference[0]) : null; 180 } 181 182 private boolean check(TableDetails tableDetails, String [] columnName) throws DException { 183 try { 184 if (_Optcorrelationname1 != null) { 185 String aliasName = (String ) _Optcorrelationname1.run(null); 186 if (columnName.length >= 2 && aliasName.equalsIgnoreCase(columnName[0])) { 187 return true; 188 } 189 } 190 191 String [] tableName = tableDetails.getTableName(); 192 for (int i = columnName.length - 2, j = tableName.length - 1, 193 length = columnName.length; i >= 0 && j >= 0; i--, j--) { 194 if (!tableName[j].equalsIgnoreCase(columnName[i])) { 195 return false; 196 } 197 } 198 return tableDetails.cc.getColumnIndex(columnName[columnName.length - 1]) != 199 -1; 200 } catch (Exception ex) { 201 return false; 202 } 203 } 204 205 private _Reference[] getWhereReferences(TableDetails tableDetails, _ServerSession serverSession) throws DException { 206 ArrayList list =new ArrayList (); 207 ColumnDetails[] whereColumnDetails = _OptSRESERVEDWORD1206543922searchcondition0.getColumnDetails(); 208 _Reference[] ref1 = checkColumnsValidity(whereColumnDetails, tableDetails, serverSession); 209 setKnownReferences(ref1, tableDetails,list); 210 _Reference[] ref2 = _OptSRESERVEDWORD1206543922searchcondition0.checkSemantic(serverSession); 211 _Reference[] ref3 = makeProvisionForKnownReferences(ref2, tableDetails); 212 list.addAll(knownReferences); 213 _Reference[] ref4 =(_Reference[])list.toArray(new _Reference[0]); 214 215 whereColumnDetails = removeUnknownColumnDetailFromWhereClause(whereColumnDetails,tableDetails); 216 columnDetail =GeneralPurposeStaticClass.getJoinOfColumnDetailsAndReferences(whereColumnDetails,ref4); 217 for (int i = 0; i < columnDetail.length; i++) { 218 if(columnDetail[i].getTableDetails()==null) 219 columnDetail[i].setTableDetails(tableDetails); 220 } 221 return GeneralPurposeStaticClass.getJointReferences(ref1, ref3); 222 } 223 224 private _Reference[] makeProvisionForKnownReferences(_Reference[] columns, TableDetails tableDetails) throws DException { 225 ArrayList toReturn = new ArrayList (5); 226 if (columns != null) { 227 int len = columns.length; 228 for (int i = 0; i < len; i++) { 229 if ( (columns[i].getReferenceType() != SimpleConstants.VARIABLECOLUMN) && check(tableDetails, ( (ColumnDetails) columns[i]).getColumnName())) { 230 knownReferences.add(columns[i]); 231 232 } else { 233 toReturn.add(columns[i]); 234 } 235 } 236 } 237 return toReturn.size() > 0 ? (_Reference[]) toReturn.toArray(new _Reference[0]) : null; 238 } 239 240 244 private void setKnownReferences(_Reference[] columns, TableDetails tableDetails,ArrayList alist) throws DException { 245 if (columns != null ) { 246 int len = columns.length; 247 for (int i = 0; i < len; i++) { 248 if ( (columns[i].getReferenceType() != SimpleConstants.VARIABLECOLUMN) && check(tableDetails, ( (ColumnDetails) columns[i]).getColumnName())) { 249 alist.add(columns[i]); 250 } 251 } 252 } 253 } 254 255 private ColumnDetails[] removeUnknownColumnDetailFromWhereClause(ColumnDetails[] cd,TableDetails tableDetails) throws DException{ 256 ArrayList listcd =new ArrayList (); 257 for (int j = 0, length1 = cd.length; j < length1; ++j) { 258 if ((cd[j].getType() == REFERENCE || cd[j].getUnderLyingReference()) && cd[j].getTable() != null ) { 259 if (cd[j].getTable().equals(tableDetails)) 260 listcd.add(cd[j]); 261 } 262 } 263 ColumnDetails[] cdlast = (ColumnDetails[]) listcd.toArray(new ColumnDetails[0]); 264 return cdlast ; 265 } 266 267 private void performChecking(_ServerSession serverSession) throws DException { 268 refToCheck = checkSemantic(serverSession); 269 if (refToCheck != null) { 270 for (int i = 0; i < refToCheck.length; i++) { 271 if (refToCheck[i].getReferenceType() != SimpleConstants.VARIABLECOLUMN) { 272 String targetTableName = _targettable2.getTableDetails().getQualifiedTableName(); 273 ColumnDetails columnDetails = ( (ColumnDetails) refToCheck[i]); 274 String [] column_name = columnDetails.getColumnName(); 275 if (column_name.length == 1) { 276 throw new DmlStatementException("DSE1277", new Object [] {targetTableName} 277 , new DException("DSE1130", new Object [] {refToCheck[i].getColumn(), targetTableName})); 278 } else if (column_name.length == 2) { 279 String tableName = _targettable2.getTableDetails().getQualifiedTableName(); 280 int lastIndexOfDot = tableName.lastIndexOf("."); 281 tableName = tableName.substring(lastIndexOfDot + 1); 282 if( aliasName == null || !aliasName.equalsIgnoreCase(column_name[0])){ 283 if (tableName.equalsIgnoreCase(column_name[0])) { 284 throw new DmlStatementException("DSE1277", 285 new Object [] {targetTableName} 286 , 287 new DException("DSE1130", 288 new Object [] {refToCheck[i].getColumn(), targetTableName})); 289 } 290 else { 291 throw new DmlStatementException("DSE1277", 292 new Object [] {targetTableName} 293 , 294 new DException("DSE1130", 295 new Object [] {refToCheck[i].getColumn(), column_name[0]})); 296 } 297 } 298 } else if (column_name.length == 3) { 299 String tableName = _targettable2.getTableDetails().getQualifiedTableName(); 300 int lastIndexOfDot = tableName.lastIndexOf("."); 301 tableName = tableName.substring(lastIndexOfDot + 1); 302 String schemName = _targettable2.getTableDetails().getSchemaName(); 303 if ( (schemName + "." + tableName).equalsIgnoreCase(column_name[0] + "." + column_name[1])) { 304 throw new DmlStatementException("DSE1277", new Object [] {targetTableName} 305 , new DException("DSE1130", new Object [] {refToCheck[i].getColumn(), targetTableName})); 306 } else { 307 throw new DmlStatementException("DSE1277", new Object [] {targetTableName} 308 , new DException("DSE1130", new Object [] {refToCheck[i].getColumn(), column_name[0] + "." + column_name[1]})); 309 } 310 } else { 311 if ( (targetTableName).equalsIgnoreCase(column_name[0] + "." + column_name[1] + column_name[2])) { 312 throw new DmlStatementException("DSE1277", new Object [] {targetTableName} 313 , new DException("DSE1130", new Object [] {refToCheck[i].getColumn(), targetTableName})); 314 } else { 315 throw new DmlStatementException("DSE1277", new Object [] {targetTableName} 316 , new DException("DSE1130", new Object [] {refToCheck[i].getColumn(), column_name[0] + "." + column_name[1] + "." + column_name[2]})); 317 } 318 } 319 } 320 } 321 } 322 questionMarks = refToCheck; 323 } 324 325 public Object clone() throws CloneNotSupportedException { 326 return this; 327 } 328 329 public String toString() { 330 StringBuffer sb = new StringBuffer (); 331 sb.append(" "); 332 sb.append(_SRESERVEDWORD12065439224); 333 sb.append(" "); 334 if(_OptSRESERVEDWORD12065439223 != null ) { 335 sb.append(_OptSRESERVEDWORD12065439223); 336 } 337 sb.append(" "); 338 sb.append(_targettable2); 339 sb.append(" "); 340 if(_Optcorrelationname1 != null ) { 341 sb.append(_Optcorrelationname1); 342 sb.append(" "); 343 } 344 345 if(_OptSRESERVEDWORD1206543922searchcondition0 != null ) { 346 sb.append(_OptSRESERVEDWORD1206543922searchcondition0); 347 } 348 return sb.toString(); 349 } 350 351 } 352 | Popular Tags |