| 1 package com.daffodilwoods.daffodildb.server.sql99.ddl.descriptors; 2 3 import com.daffodilwoods.daffodildb.server.datadictionarysystem.*; 4 import com.daffodilwoods.daffodildb.server.datasystem.interfaces.*; 5 import com.daffodilwoods.daffodildb.server.serversystem.*; 6 import com.daffodilwoods.daffodildb.server.serversystem.dmlvalidation.constraintsystem.*; 7 import com.daffodilwoods.daffodildb.server.sql99.common.*; 8 import com.daffodilwoods.daffodildb.server.sql99.dql.execution.*; 9 import com.daffodilwoods.daffodildb.server.sql99.dql.iterator.*; 10 import com.daffodilwoods.daffodildb.server.sql99.expression.booleanvalueexpression.*; 11 import com.daffodilwoods.daffodildb.server.sql99.utils.*; 12 import com.daffodilwoods.daffodildb.utils.*; 13 import com.daffodilwoods.database.general.*; 14 import com.daffodilwoods.database.resource.*; 15 import com.daffodilwoods.database.utility.*; 16 import com.daffodilwoods.database.utility.TypeConverter; 17 import com.daffodilwoods.daffodildb.server.datasystem.interfaces.Utility; 18 19 public class ColumnDescriptor extends Descriptor { 20 28 public String table_catalog; 29 public String table_schema; 30 public String table_name; 31 public String column_name; 32 public int ordinal_position; 33 public String dtd_identifier; 34 public String domain_catalog; 35 public String domain_schema; 36 public String domain_name; 37 public String column_default; 38 public String isNullable = SqlSchemaConstants.YES; 39 public String isSelfReferencing = SqlSchemaConstants.NO; 40 public String isAutoIncrement = SqlSchemaConstants.NO; 41 42 44 public DataTypeDescriptor dataTypeDescriptor; 45 public TableDescriptor tableDescriptor; 46 47 private int type = -1; 48 private Boolean fixed; 49 50 52 public String actualName; 53 54 public ColumnDescriptor() throws DException { 55 } 56 57 public ColumnDescriptor(String tableCatalog, String tableSchema, 58 String tableName, String columnName) throws DException { 59 table_catalog = tableCatalog; 60 table_schema = tableSchema; 61 table_name = tableName; 62 column_name = columnName; 63 } 64 65 70 public void load(_ServerSession serverSession) throws DException { 71 DataDictionary dd = (DataDictionary) serverSession.getDataDictionary(); 72 _SelectQueryIterator columnIterator = (_SelectQueryIterator) dd.getPreparedStatementGetter(). 73 getColumnsTableExecuter().executeForFresh(new Object [] {table_catalog, table_schema, table_name, 74 column_name}); 75 if (!columnIterator.first()) 76 throw new DException("DSE255", new Object [] {column_name, 77 table_catalog + "." + table_schema + "." + table_name}); 78 Object [] columnData = (Object []) columnIterator.getObject(); 79 loadDataFromRecord(columnData); 80 loadDataTypeDescriptor(serverSession); 81 } 82 83 88 public void loadDataFromRecord(_SelectQueryIterator iter) throws DException { 89 loadDataFromRecord( (Object []) iter.getObject()); 90 } 91 92 97 private void loadDataFromRecord(Object [] columnData) throws DException { 98 table_catalog = (String ) columnData[SystemTablesFields.columns_table_catalog]; 99 table_schema = (String ) columnData[SystemTablesFields.columns_table_schema]; 100 table_name = (String ) columnData[SystemTablesFields.columns_table_name]; 101 column_name = (String ) columnData[SystemTablesFields.columns_column_name]; 102 ordinal_position = columnData[SystemTablesFields.columns_ordinal_position].hashCode(); 103 dtd_identifier = (String ) columnData[SystemTablesFields.columns_dtd_identifier]; 104 domain_catalog = (String ) columnData[SystemTablesFields.columns_domain_catalog]; 105 domain_schema = (String ) columnData[SystemTablesFields.columns_domain_schema]; 106 domain_name = (String ) columnData[SystemTablesFields.columns_domain_name]; 107 column_default = (String ) columnData[SystemTablesFields.columns_column_default]; 108 isNullable = (String ) columnData[SystemTablesFields.columns_is_nullable]; 109 isSelfReferencing = (String ) columnData[SystemTablesFields.columns_is_self_referencing]; 110 isAutoIncrement = (String ) columnData[SystemTablesFields.columns_is_autoIncrement]; 111 if (isAutoIncrement.equalsIgnoreCase(SqlSchemaConstants.YES)) 112 tableDescriptor.setAutoIncrement(); 113 } 114 115 121 public void loadDataTypeDescriptor(_ServerSession serverSession) throws 122 DException { 123 dataTypeDescriptor = new DataTypeDescriptor(); 124 dataTypeDescriptor.object_catalog = table_catalog; 125 dataTypeDescriptor.object_schema = table_schema; 126 dataTypeDescriptor.object_name = table_name; 127 dataTypeDescriptor.object_type = SqlKeywords.TABLE; 128 dataTypeDescriptor.dtd_identifier = dtd_identifier; 129 dataTypeDescriptor.load(serverSession); 130 this.dataTypeDescriptor = dataTypeDescriptor; 131 } 132 133 136 public void save(_ServerSession serverSession) throws DException { 137 139 dtd_identifier = table_name + "." + column_name; 140 Object [] columnValues = new Object [] { 141 table_catalog, table_schema, table_name, 142 column_name, new Integer (ordinal_position), dtd_identifier, 143 domain_catalog, domain_schema, domain_name, column_default, 144 isNullable, isSelfReferencing, isAutoIncrement}; 145 try { 146 SqlSchemaConstants.insert(serverSession, 147 SqlSchemaConstants.columns_TableName, null, 148 columnValues); 149 } catch (PrimaryConstraintException de) { 150 DException tde = new DException("DSE1136", new Object [] {column_name, 151 tableDescriptor.getTableName()}); 152 throw tde; 153 } catch (SizeMisMatchException de) { 154 if (de.getDseCode().equals("DSE773")) { 155 DException tde = new DException("DSE8103", null); 156 throw tde; 157 } 158 } catch (DException de) { 159 if (de.getDseCode().equals("DSE1255")) { 160 DException tde = new DException("DSE1136", new Object [] {column_name, 161 tableDescriptor.getTableName()}); 162 throw tde; 163 } 164 if (de.getDseCode().equals("DSE773")) { 165 DException tde = new DException("DSE8103", null); 166 throw tde; 167 } 168 throw de; 169 } 170 dataTypeDescriptor.save(serverSession); 171 } 172 173 176 public void updateColumnDefault(_ServerSession serverSession) throws DException { 177 TableDetails tableDetail = new TableDetails(); 178 tableDetail.setTableName(SqlSchemaConstants.columns_TableName.getTableName()); 179 _ServerSession systemSession = serverSession.getSystemServerSession(); 180 _ServerSession globalSession = serverSession.getGlobalSession(); 181 booleanvalueexpression condition = ( (DataDictionary) serverSession.getDataDictionary()). 182 getPreparedStatementGetter().getColumnsTableCondition(); 183 ConditionSingleTableExecuter conSingTE = new ConditionSingleTableExecuter(null, 184 tableDetail, globalSession, condition, null); 185 _Iterator iter = globalSession.getInternalIterator(SqlSchemaConstants.columns_TableName, conSingTE); 186 iter.setConditionVariableValue(condition.getReferences(new TableDetails[] { 187 tableDetail}), FieldUtility.getFields(new Object [] {table_catalog, table_schema, table_name, column_name}), 1); 188 SqlSchemaConstants.update(systemSession, 189 SqlSchemaConstants.columns_TableName, iter, 190 new int[] {SystemTablesFields.columns_column_default} 191 , new Object [] {column_default}); 192 } 193 194 public void update(_ServerSession serverSession, int[] columns, Object [] values) throws DException { 195 TableDetails tableDetail = new TableDetails(); 196 tableDetail.setTableName(SqlSchemaConstants.columns_TableName.getTableName()); 197 _ServerSession systemSession = serverSession.getSystemServerSession(); 198 _ServerSession globalSession = serverSession.getGlobalSession(); 199 booleanvalueexpression condition = ( (DataDictionary) serverSession.getDataDictionary()). 200 getPreparedStatementGetter().getColumnsTableCondition(); 201 ConditionSingleTableExecuter conSingTE = new ConditionSingleTableExecuter(null, 202 tableDetail, globalSession, condition, null); 203 _Iterator iter = globalSession.getInternalIterator(SqlSchemaConstants.columns_TableName, conSingTE); 204 _Reference[] ref = null; 205 Object [] val = null; 206 try { 207 ref = condition.getReferences(new TableDetails[] {tableDetail}); 208 val = new Object [] {table_catalog, table_schema, table_name, column_name}; 209 val = FieldUtility.getFields(val); 210 iter.setConditionVariableValue(ref, val, 1); 211 } catch (ArrayIndexOutOfBoundsException ex) { 212 throw ex; 213 } 214 SqlSchemaConstants.update(systemSession, 215 SqlSchemaConstants.columns_TableName, iter, columns, values); 216 } 217 218 222 public void delete(_ServerSession serverSession) throws DException { 223 booleanvalueexpression condition = ( (DataDictionary) serverSession.getDataDictionary()). 224 getPreparedStatementGetter().getColumnsTableCondition(); 225 super.deleteColumnDescriptor(serverSession, SqlSchemaConstants.columns_TableName, condition, 226 new Object [] {table_catalog, table_schema, table_name, column_name}); 227 dataTypeDescriptor.delete(serverSession); 228 } 229 230 233 public void deleteConstraints(_ServerSession serverSession) throws DException { 234 _SelectQueryIterator retIter = SqlSchemaConstants.getIterator(serverSession, 235 queryforConstraints, (Object []) getParameters()); 236 if (retIter.first()) { 237 do { 238 TableConstraintDescriptor constraint = new TableConstraintDescriptor(); 239 Object [] values = (Object []) retIter.getObject(); 240 constraint.constraint_catalog = (String ) values[0]; 241 constraint.constraint_schema = (String ) values[1]; 242 constraint.constraint_name = (String ) values[2]; 243 constraint.load(serverSession); 244 constraint.delete(serverSession); 245 } while (retIter.next()); 246 } 247 } 248 249 252 public QualifiedIdentifier isColumnReferencedFromViews(_ServerSession serverSession) throws DException { 253 _SelectQueryIterator iter = SqlSchemaConstants.getIterator(serverSession, 254 getClause(SqlSchemaConstants.view_colum_usage_TableName.getIdentifier()), getParameters()); 255 if (!iter.first()) 256 return null; 257 Object [] data = (Object []) iter.getObject(); 258 return new QualifiedIdentifier( (String ) data[0], (String ) data[1], (String ) data[2]); 259 } 260 261 private String getClause(String tableName) throws DException { 262 StringBuffer clause = new StringBuffer (); 263 clause.append("select * from "); 264 clause.append(tableName); 265 clause.append(" where "); 266 if (tableName.equalsIgnoreCase(SqlSchemaConstants. 267 triggered_update_columns_TableName. 268 getIdentifier())) { 269 clause.append(" event_object_catalog = ? "); 270 clause.append(" and event_object_schema = ? "); 271 clause.append(" and event_object_table = ? "); 272 clause.append(" and event_object_column = ? "); 273 } else { 274 clause.append(" table_catalog = ? "); 275 clause.append(" and table_schema = ? "); 276 clause.append(" and table_name = ? "); 277 clause.append(" and column_name = ? "); 278 } 279 return clause.toString(); 280 } 281 282 285 public QualifiedIdentifier isColumnReferencedFromCompositeKey(_ServerSession serverSession) throws DException { 286 String clause = " Select * from " + 287 SystemTables.key_column_usage_TableName + " as one, " 288 + SystemTables.table_constraints_TableName + " as two " 289 + " where one.table_catalog = ? and one.table_schema = ? and one.table_name = ? and one.column_name = ? " 290 + " and Not(two.table_catalog = ? and two.table_schema = ? and two.table_name = ?) " 291 + " and one.CONSTRAINT_CATALOG = two.CONSTRAINT_CATALOG and one.CONSTRAINT_SCHEMA = two.CONSTRAINT_SCHEMA " 292 + " and one.CONSTRAINT_NAME = two.CONSTRAINT_NAME " 293 + " and two.constraint_type in('" + SqlKeywords.PRIMARY + " " + SqlKeywords.KEY + "'" + " ,'" + SqlKeywords.UNIQUE + "' " + " ,'" + SqlKeywords.FOREIGN + " " + SqlKeywords.KEY + "' )"; 294 295 String clause1 = " Select one.CONSTRAINT_CATALOG,one.CONSTRAINT_SCHEMA,one.CONSTRAINT_NAME from " + 296 SystemTables.key_column_usage_TableName + " as one, " 297 + SystemTables.key_column_usage_TableName + " as two, " 298 + SystemTables.table_constraints_TableName + " as three " 299 + " where one.table_catalog = ? and one.table_schema = ? and one.table_name = ? and one.column_name = ? " 300 + " and one.CONSTRAINT_CATALOG = two.CONSTRAINT_CATALOG and one.CONSTRAINT_SCHEMA = two.CONSTRAINT_SCHEMA " 301 + " and one.CONSTRAINT_NAME = two.CONSTRAINT_NAME " 302 + " and one.CONSTRAINT_CATALOG = three.CONSTRAINT_CATALOG and one.CONSTRAINT_SCHEMA = three.CONSTRAINT_SCHEMA " 303 + " and one.CONSTRAINT_NAME = three.CONSTRAINT_NAME " 304 + " and three.constraint_type in( '" + SqlKeywords.PRIMARY + " " + SqlKeywords.KEY + "'" + " ,'" + SqlKeywords.UNIQUE + "' " + " ,'" + SqlKeywords.FOREIGN + " " + SqlKeywords.KEY + "' )" 305 + " group by one.CONSTRAINT_CATALOG,one.CONSTRAINT_SCHEMA,one.CONSTRAINT_NAME " 306 + " having count(*) >1 "; 307 308 _SelectQueryIterator ret_iterator = SqlSchemaConstants.getIterator(serverSession, clause, 309 new Object [] {table_catalog, table_schema, table_name, column_name, 310 table_catalog, table_schema, table_name}); 311 312 if (!ret_iterator.first()) { 313 _SelectQueryIterator ret_iterator1 = SqlSchemaConstants.getIterator(serverSession, clause1, 314 new Object [] {table_catalog, table_schema, table_name, column_name}); 315 if (ret_iterator1.first()) { 316 Object [] data1 = (Object []) ret_iterator1.getObject(); 317 QualifiedIdentifier qu = new QualifiedIdentifier( (String ) data1[0], (String ) data1[1], (String ) data1[2]); 318 throw new DException("DSE8163", new Object [] {qu.getIdentifier(), table_name, column_name}); 319 } 320 return null; 321 } 322 Object [] data = (Object []) ret_iterator.getObject(); 323 return new QualifiedIdentifier( (String ) data[0], (String ) data[1], (String ) data[2]); 324 } 325 326 329 public QualifiedIdentifier isColumnReferencedFromTriggers(_ServerSession 330 serverSession) throws DException { 331 _SelectQueryIterator iter = SqlSchemaConstants.getIterator(serverSession, 332 getClause(SqlSchemaConstants.trigger_column_usage_TableName. 333 getIdentifier()), getParameters()); 334 if (iter.first()) { 335 Object [] data = (Object []) iter.getObject(); 336 return new QualifiedIdentifier( (String ) data[SystemTablesFields. 337 triggerColumnUsage_trigger_catalog], 338 (String ) data[SystemTablesFields. 339 triggerColumnUsage_trigger_schema], 340 (String ) data[SystemTablesFields. 341 triggerColumnUsage_trigger_name]); 342 } 343 344 iter = SqlSchemaConstants.getIterator(serverSession, 345 getClause(SqlSchemaConstants. 346 triggered_update_columns_TableName.getIdentifier()), getParameters()); 347 if (!iter.first()) 348 return null; 349 Object [] data = (Object []) iter.getObject(); 350 return new QualifiedIdentifier( (String ) data[SystemTablesFields. 351 triggerUpdateColumn_trigger_catalog], 352 (String ) data[SystemTablesFields. 353 triggerUpdateColumn_trigger_schema], 354 (String ) data[SystemTablesFields. 355 triggerUpdateColumn_trigger_name]); 356 } 357 358 361 public QualifiedIdentifier isColumnReferencedFromReferentialConstraints(_ServerSession serverSession) throws DException { 362 _SelectQueryIterator iterator = SqlSchemaConstants.getIterator(serverSession, 363 queryForColumnReferential, new Object [] {table_catalog, table_schema, table_name, column_name}); 364 if (!iterator.first()) 365 return null; 366 Object [] data = (Object []) iterator.getObject(); 367 return new QualifiedIdentifier( (String ) data[SystemTablesFields.referential_constraints_constraint_catalog], 368 (String ) data[SystemTablesFields.referential_constraints_constraint_schema], 369 (String ) data[SystemTablesFields.referential_constraints_constraint_name]); 370 } 371 372 375 public QualifiedIdentifier isColumnReferencedFromCheckConstraints(_ServerSession serverSession) throws DException { 376 String clause = " Select * from " + 377 SystemTables.check_column_usage_TableName + " as one, " 378 + SystemTables.table_constraints_TableName + " as two " 379 + " where one.table_catalog = ? and one.table_schema = ? and one.table_name = ? and one.column_name = ? " 380 + " and Not(two.table_catalog = ? and two.table_schema = ? and two.table_name = ?) " 381 + " and one.CONSTRAINT_CATALOG = two.CONSTRAINT_CATALOG and one.CONSTRAINT_SCHEMA = two.CONSTRAINT_SCHEMA " 382 + " and one.CONSTRAINT_NAME = two.CONSTRAINT_NAME "; 383 384 String clause1 = " Select one.CONSTRAINT_CATALOG,one.CONSTRAINT_SCHEMA,one.CONSTRAINT_NAME from " + 385 SystemTables.check_column_usage_TableName + " as one, " 386 + SystemTables.check_column_usage_TableName + " as two " 387 + " where one.table_catalog = ? and one.table_schema = ? and one.table_name = ? and one.column_name = ? " 388 + " and one.CONSTRAINT_CATALOG = two.CONSTRAINT_CATALOG and one.CONSTRAINT_SCHEMA = two.CONSTRAINT_SCHEMA " 389 + " and one.CONSTRAINT_NAME = two.CONSTRAINT_NAME " 390 + " group by one.CONSTRAINT_CATALOG,one.CONSTRAINT_SCHEMA,one.CONSTRAINT_NAME " 391 + " having count(*) >1 "; 392 393 _SelectQueryIterator ret_iterator = SqlSchemaConstants.getIterator(serverSession, clause, 394 new Object [] {table_catalog, table_schema, table_name, column_name, table_catalog, table_schema, table_name}); 395 if (!ret_iterator.first()) { 396 _SelectQueryIterator ret_iterator1 = SqlSchemaConstants.getIterator(serverSession, clause1, 397 new Object [] {table_catalog, table_schema, table_name, column_name}); 398 399 if (ret_iterator1.first()) { 400 Object [] data1 = (Object []) ret_iterator1.getObject(); 401 QualifiedIdentifier qu = new QualifiedIdentifier( (String ) data1[0], (String ) data1[1], (String ) data1[2]); 402 throw new DException("DSE7083", new Object [] {qu.getIdentifier(), table_name, column_name}); 403 } 404 return null; 405 } 406 407 Object [] data = (Object []) ret_iterator.getObject(); 408 return new QualifiedIdentifier( (String ) data[0], (String ) data[1], (String ) data[2]); 409 } 411 412 public boolean isFixedColumn() throws DException { 413 if (fixed == null) 414 fixed = Utility.getBooleanValue(dataTypeDescriptor.isFixedLength()); 415 return fixed.booleanValue(); 416 } 417 418 public int getType() throws DException { 419 if (type == -1) 420 type = TypeConverter.getDataBaseType(dataTypeDescriptor.data_Type); 421 return type; 422 } 423 424 426 public boolean isBlobClob() throws DException { 427 return isBlobClob(getType()); 428 } 429 430 432 private boolean isBlobClob(int type) throws DException { 433 return type == Datatype.BLOB || 434 type == Datatype.BINARYLARGEOBJECT || 435 type == Datatype.LONGVARBINARY || 436 type == Datatype.CLOB || 437 type == Datatype.CHARACTERLARGEOBJECT || 438 type == Datatype.CHARLARGEOBJECT || 439 type == Datatype.LONGVARCHAR; 440 } 441 442 444 public boolean isCharcterType() throws DException { 445 return isCharcterType(getType()); 446 } 447 448 450 private boolean isCharcterType(int type) throws DException { 451 return type == Datatype.CLOB || 452 type == Datatype.CHAR || 453 type == Datatype.CHARACTER || 454 type == Datatype.CHARACTERLARGEOBJECT || 455 type == Datatype.CHARACTERVARYING || 456 type == Datatype.CHARLARGEOBJECT || 457 type == Datatype.CHARVARYING || 458 type == Datatype.CLOB || 459 type == Datatype.LONGVARCHAR || 460 type == Datatype.VARCHAR; 461 } 462 463 465 private Object [] getParameters() { 466 return new Object [] { 467 table_catalog, table_schema, table_name, column_name}; 468 } 469 470 472 public QualifiedIdentifier getQualifiedTableName() { 473 return new QualifiedIdentifier(table_catalog, table_schema, table_name); 474 } 475 476 private static String queryForColumnReferential = null; 477 static { 478 StringBuffer buffer = new StringBuffer (200); 479 buffer.append(" select * from ") 480 .append(SystemTables.referential_constraints_TableName) 481 .append(" where( unique_constraint_catalog, unique_constraint_schema, ") 482 .append(" unique_constraint_name ) ") 483 .append( 484 " in ( select tabCons.constraint_catalog, tabCons.constraint_schema, ") 485 .append(" tabCons.constraint_name from ") 486 .append(SystemTables.table_constraints_TableName).append(" as tabCons,") 487 .append(SystemTables.key_column_usage_TableName).append(" as keyCol ") 488 .append( 489 " where tabCons.constraint_catalog = keyCol.constraint_catalog ") 490 .append(" and tabCons.constraint_schema = keyCol.constraint_schema ") 491 .append(" and tabCons.constraint_name = keyCol.constraint_name ") 492 .append(" and tabCons.table_catalog = ? ") 493 .append(" and tabCons.table_schema = ? ") 494 .append(" and tabCons.table_name = ? ") 495 .append(" and ( tabCons.constraint_type = 'PRIMARY Key' or tabCons.constraint_type = 'UNIQUE' )") 496 .append(" and keyCol.column_name = ? )") 497 ; 498 queryForColumnReferential = buffer.toString(); 499 } 500 501 504 private static String queryforConstraints = "select constraint_catalog, " 505 + " constraint_schema, constraint_name from " 506 + SystemTables.key_column_usage_TableName 507 + " where table_catalog = ? and table_schema = ? " 508 + " and table_name = ? and column_name = ? "; 509 510 512 public int getDescriptorType() { 513 return COLUMN_DESCRIPTOR; 514 } 515 516 public void setTableDescriptor(TableDescriptor tableDes) { 517 tableDescriptor = tableDes; 518 } 519 } 520 | Popular Tags |