1 30 31 32 package org.hsqldb; 33 34 import org.hsqldb.HsqlNameManager.HsqlName; 35 import org.hsqldb.lib.HashMap; 36 import org.hsqldb.lib.HashSet; 37 import org.hsqldb.lib.HsqlArrayList; 38 import org.hsqldb.lib.Iterator; 39 import org.hsqldb.lib.WrapperIterator; 40 import org.hsqldb.persist.HsqlProperties; 41 import org.hsqldb.store.ValuePool; 42 43 50 116 class DatabaseInformationMain extends DatabaseInformation { 117 118 120 121 protected static final HsqlName[] sysTableHsqlNames; 122 123 124 protected final int[] sysTableSessions = new int[sysTableNames.length]; 125 126 127 protected final boolean[] sysTableSessionDependent = 128 new boolean[sysTableNames.length]; 129 130 131 protected final Table[] sysTables = new Table[sysTableNames.length]; 132 133 134 protected static final HashSet nonCachedTablesSet; 135 136 140 protected static final HashMap columnNameMap; 141 142 146 protected Session session; 147 148 149 protected static final String [] tableTypes = new String [] { 150 "GLOBAL TEMPORARY", "SYSTEM TABLE", "TABLE", "VIEW" 151 }; 152 153 154 protected DINameSpace ns; 155 156 static { 157 columnNameMap = new HashMap(); 158 nonCachedTablesSet = new HashSet(); 159 sysTableHsqlNames = new HsqlName[sysTableNames.length]; 160 161 for (int i = 0; i < sysTableNames.length; i++) { 162 sysTableHsqlNames[i] = 163 HsqlNameManager.newHsqlSystemObjectName(sysTableNames[i]); 164 sysTableHsqlNames[i].schema = 165 SchemaManager.INFORMATION_SCHEMA_HSQLNAME; 166 } 167 168 nonCachedTablesSet.add("SYSTEM_CACHEINFO"); 170 nonCachedTablesSet.add("SYSTEM_SESSIONINFO"); 171 nonCachedTablesSet.add("SYSTEM_SESSIONS"); 172 nonCachedTablesSet.add("SYSTEM_PROPERTIES"); 173 nonCachedTablesSet.add("SYSTEM_SEQUENCES"); 174 } 175 176 200 DatabaseInformationMain(Database db) throws HsqlException { 201 202 super(db); 203 204 init(); 205 } 206 207 221 protected final void addColumn(Table t, String name, int type, int size, 222 boolean nullable) throws HsqlException { 223 224 HsqlName cn; 225 Column c; 226 227 cn = (HsqlName) columnNameMap.get(name); 228 229 if (cn == null) { 230 cn = database.nameManager.newHsqlName(name, false); 231 232 columnNameMap.put(name, cn); 233 } 234 235 c = new Column(cn, nullable, type, size, 0, false, null); 236 237 t.addColumn(c); 238 } 239 240 252 protected final void addColumn(Table t, String name, int type, 253 boolean nullable) throws HsqlException { 254 addColumn(t, name, type, 0, nullable); 255 } 256 257 267 protected final void addColumn(Table t, String name, 268 int type) throws HsqlException { 269 addColumn(t, name, type, true); 270 } 271 272 279 protected final Iterator allTables() { 280 return new WrapperIterator(database.schemaManager.allTablesIterator(), 281 new WrapperIterator(sysTables, true)); 282 } 283 284 290 protected final void cacheClear() throws HsqlException { 291 292 int i = sysTables.length; 293 294 while (i-- > 0) { 295 Table t = sysTables[i]; 296 297 if (t != null) { 298 t.clearAllRows(session); 299 } 300 301 sysTableSessions[i] = -1; 302 } 303 304 isDirty = false; 305 } 306 307 315 protected Table generateTable(int tableIndex) throws HsqlException { 316 317 Table t = sysTables[tableIndex]; 318 319 switch (tableIndex) { 353 354 case SYSTEM_BESTROWIDENTIFIER : 355 return SYSTEM_BESTROWIDENTIFIER(); 356 357 case SYSTEM_CATALOGS : 358 return SYSTEM_CATALOGS(); 359 360 case SYSTEM_COLUMNPRIVILEGES : 361 return SYSTEM_COLUMNPRIVILEGES(); 362 363 case SYSTEM_COLUMNS : 364 return SYSTEM_COLUMNS(); 365 366 case SYSTEM_CROSSREFERENCE : 367 return SYSTEM_CROSSREFERENCE(); 368 369 case SYSTEM_INDEXINFO : 370 return SYSTEM_INDEXINFO(); 371 372 case SYSTEM_PRIMARYKEYS : 373 return SYSTEM_PRIMARYKEYS(); 374 375 case SYSTEM_PROCEDURECOLUMNS : 376 return SYSTEM_PROCEDURECOLUMNS(); 377 378 case SYSTEM_PROCEDURES : 379 return SYSTEM_PROCEDURES(); 380 381 case SYSTEM_SCHEMAS : 382 return SYSTEM_SCHEMAS(); 383 384 case SYSTEM_TABLEPRIVILEGES : 385 return SYSTEM_TABLEPRIVILEGES(); 386 387 case SYSTEM_TABLES : 388 return SYSTEM_TABLES(); 389 390 case SYSTEM_TABLETYPES : 391 return SYSTEM_TABLETYPES(); 392 393 case SYSTEM_TYPEINFO : 394 return SYSTEM_TYPEINFO(); 395 396 case SYSTEM_USERS : 397 return SYSTEM_USERS(); 398 399 case SYSTEM_ALLTYPEINFO : 401 return SYSTEM_ALLTYPEINFO(); 402 403 case SYSTEM_CHECK_CONSTRAINTS : 404 return SYSTEM_CHECK_CONSTRAINTS(); 405 406 case SYSTEM_SEQUENCES : 407 return SYSTEM_SEQUENCES(); 408 409 default : 410 return null; 411 } 412 } 413 414 420 protected final void init() throws HsqlException { 421 422 ns = new DINameSpace(database); 423 424 sysTableSessionDependent[SYSTEM_ALIASES] = 426 sysTableSessionDependent[SYSTEM_CLASSPRIVILEGES] = 427 sysTableSessionDependent[SYSTEM_BESTROWIDENTIFIER] = 428 sysTableSessionDependent[SYSTEM_COLUMNPRIVILEGES] = 429 sysTableSessionDependent[SYSTEM_COLUMNS] = 430 sysTableSessionDependent[SYSTEM_CROSSREFERENCE] = 431 sysTableSessionDependent[SYSTEM_INDEXINFO] = 432 sysTableSessionDependent[SYSTEM_PRIMARYKEYS] = 433 sysTableSessionDependent[SYSTEM_PROCEDURES] = 434 sysTableSessionDependent[SYSTEM_PROCEDURECOLUMNS] = 435 sysTableSessionDependent[SYSTEM_TABLEPRIVILEGES] = 436 sysTableSessionDependent[SYSTEM_TABLES] = 437 sysTableSessionDependent[SYSTEM_TRIGGERCOLUMNS] = 438 sysTableSessionDependent[SYSTEM_TRIGGERS] = 439 sysTableSessionDependent[SYSTEM_VIEWS] = 440 sysTableSessionDependent[SYSTEM_TEXTTABLES] = 441 sysTableSessionDependent[SYSTEM_CHECK_CONSTRAINTS] = 442 sysTableSessionDependent[SYSTEM_SEQUENCES] = 443 sysTableSessionDependent[SYSTEM_USAGE_PRIVILEGES] = 444 sysTableSessionDependent[SYSTEM_TABLE_CONSTRAINTS] = 445 sysTableSessionDependent[SYSTEM_CHECK_COLUMN_USAGE] = 446 sysTableSessionDependent[SYSTEM_CHECK_ROUTINE_USAGE] = 447 sysTableSessionDependent[SYSTEM_CHECK_TABLE_USAGE] = 448 sysTableSessionDependent[SYSTEM_VIEW_COLUMN_USAGE] = 449 sysTableSessionDependent[SYSTEM_VIEW_TABLE_USAGE] = 450 sysTableSessionDependent[SYSTEM_VIEW_ROUTINE_USAGE] = 451 sysTableSessionDependent[SYSTEM_AUTHORIZATIONS] = true; 452 453 Table t; 454 455 461 for (int i = 0; i < sysTables.length; i++) { 462 t = sysTables[i] = generateTable(i); 463 464 if (t != null) { 465 t.setDataReadOnly(true); 466 } 467 } 468 469 GranteeManager gm = database.getGranteeManager(); 470 471 for (int i = 0; i < sysTableHsqlNames.length; i++) { 472 if (sysTables[i] != null) { 473 gm.grant(GranteeManager.PUBLIC_ROLE_NAME, 474 sysTableHsqlNames[i], UserManager.SELECT); 475 } 476 } 477 480 } 481 482 491 protected final boolean isAccessibleTable(Table table) 492 throws HsqlException { 493 return session.isAccessible(table.getName()); 494 } 495 496 503 protected final Table createBlankTable(HsqlName name) 504 throws HsqlException { 505 return new Table(database, name, Table.SYSTEM_TABLE); 506 } 507 508 519 final Table getSystemTable(Session session, 520 String name) throws HsqlException { 521 522 Table t; 523 int tableIndex; 524 525 this.session = session; 527 528 if (!isSystemTable(name)) { 529 return null; 530 } 531 532 tableIndex = getSysTableID(name); 533 t = sysTables[tableIndex]; 534 535 if (t == null) { 537 return t; 538 } 539 540 if (!withContent) { 546 return t; 547 } 548 549 if (isDirty) { 550 cacheClear(); 551 } 552 553 int oldSessionId = sysTableSessions[tableIndex]; 554 boolean tableValid = oldSessionId != -1; 555 556 if (session.getId() != oldSessionId 558 && sysTableSessionDependent[tableIndex]) { 559 tableValid = false; 560 } 561 562 if (nonCachedTablesSet.contains(name)) { 563 tableValid = false; 564 } 565 566 if (tableValid) { 568 return t; 569 } 570 571 t.clearAllRows(session); 573 574 sysTableSessions[tableIndex] = session.getId(); 575 576 t = generateTable(tableIndex); 578 579 return t; 583 } 584 585 710 final Table SYSTEM_BESTROWIDENTIFIER() throws HsqlException { 711 712 Table t = sysTables[SYSTEM_BESTROWIDENTIFIER]; 713 714 if (t == null) { 715 t = createBlankTable(sysTableHsqlNames[SYSTEM_BESTROWIDENTIFIER]); 716 717 addColumn(t, "SCOPE", Types.SMALLINT, false); addColumn(t, "COLUMN_NAME", Types.VARCHAR, false); addColumn(t, "DATA_TYPE", Types.SMALLINT, false); addColumn(t, "TYPE_NAME", Types.VARCHAR, 32, false); addColumn(t, "COLUMN_SIZE", Types.INTEGER); 722 addColumn(t, "BUFFER_LENGTH", Types.INTEGER); 723 addColumn(t, "DECIMAL_DIGITS", Types.SMALLINT); 724 addColumn(t, "PSEUDO_COLUMN", Types.SMALLINT, false); addColumn(t, "TABLE_CAT", Types.VARCHAR); 726 addColumn(t, "TABLE_SCHEM", Types.VARCHAR); 727 addColumn(t, "TABLE_NAME", Types.VARCHAR, false); addColumn(t, "NULLABLE", Types.SMALLINT, false); addColumn(t, "IN_KEY", Types.BOOLEAN, false); 731 t.createPrimaryKey(null, new int[] { 735 0, 8, 9, 10, 1 736 }, false); 737 738 return t; 739 } 740 741 Integer scope; Integer pseudo; 744 745 String tableCatalog; String tableSchema; String tableName; Boolean inKey; 757 Iterator tables; 764 Table table; 765 DITableInfo ti; 766 int[] cols; 767 Object [] row; 768 HsqlProperties p; 769 770 final int iscope = 0; 772 final int icolumn_name = 1; 773 final int idata_type = 2; 774 final int itype_name = 3; 775 final int icolumn_size = 4; 776 final int ibuffer_length = 5; 777 final int idecimal_digits = 6; 778 final int ipseudo_column = 7; 779 final int itable_cat = 8; 780 final int itable_schem = 9; 781 final int itable_name = 10; 782 final int inullable = 11; 783 final int iinKey = 12; 784 785 ti = new DITableInfo(); 787 p = database.getProperties(); 788 tables = p.isPropertyTrue("hsqldb.system_table_bri") ? allTables() 789 : database 790 .schemaManager 791 .allTablesIterator(); 792 793 while (tables.hasNext()) { 795 table = (Table) tables.next(); 796 797 if (table.isView() ||!isAccessibleTable(table)) { 798 continue; 799 } 800 801 cols = table.getBestRowIdentifiers(); 802 803 if (cols == null) { 804 continue; 805 } 806 807 ti.setTable(table); 808 809 inKey = ValuePool.getBoolean(table.isBestRowIdentifiersStrict()); 810 tableCatalog = ns.getCatalogName(table); 811 tableSchema = table.getSchemaName(); 812 tableName = ti.getName(); 813 scope = ti.getBRIScope(); 814 pseudo = ti.getBRIPseudo(); 815 816 for (int i = 0; i < cols.length; i++) { 817 row = t.getEmptyRowData(); 818 row[iscope] = scope; 819 row[icolumn_name] = ti.getColName(i); 820 row[idata_type] = ti.getColDataType(i); 821 row[itype_name] = ti.getColDataTypeName(i); 822 row[icolumn_size] = ti.getColSize(i); 823 row[ibuffer_length] = ti.getColBufLen(i); 824 row[idecimal_digits] = ti.getColScale(i); 825 row[ipseudo_column] = pseudo; 826 row[itable_cat] = tableCatalog; 827 row[itable_schem] = tableSchema; 828 row[itable_name] = tableName; 829 row[inullable] = ti.getColNullability(i); 830 row[iinKey] = inKey; 831 832 t.insertSys(row); 833 } 834 } 835 836 t.setDataReadOnly(true); 837 838 return t; 839 } 840 841 855 final Table SYSTEM_CATALOGS() throws HsqlException { 856 857 Table t = sysTables[SYSTEM_CATALOGS]; 858 859 if (t == null) { 860 t = createBlankTable(sysTableHsqlNames[SYSTEM_CATALOGS]); 861 862 addColumn(t, "TABLE_CAT", Types.VARCHAR, false); 864 t.createPrimaryKey(null, new int[]{ 0 }, true); 867 868 return t; 869 } 870 871 Object [] row; 872 Iterator catalogs; 873 874 catalogs = ns.iterateCatalogNames(); 875 876 while (catalogs.hasNext()) { 877 row = t.getEmptyRowData(); 878 row[0] = (String ) catalogs.next(); 879 880 t.insertSys(row); 881 } 882 883 t.setDataReadOnly(true); 884 885 return t; 886 } 887 888 919 final Table SYSTEM_COLUMNPRIVILEGES() throws HsqlException { 920 921 Table t = sysTables[SYSTEM_COLUMNPRIVILEGES]; 922 923 if (t == null) { 924 t = createBlankTable(sysTableHsqlNames[SYSTEM_COLUMNPRIVILEGES]); 925 926 addColumn(t, "TABLE_CAT", Types.VARCHAR); 927 addColumn(t, "TABLE_SCHEM", Types.VARCHAR); 928 addColumn(t, "TABLE_NAME", Types.VARCHAR, false); addColumn(t, "COLUMN_NAME", Types.VARCHAR, false); addColumn(t, "GRANTOR", Types.VARCHAR, false); addColumn(t, "GRANTEE", Types.VARCHAR, false); addColumn(t, "PRIVILEGE", Types.VARCHAR, 10, false); addColumn(t, "IS_GRANTABLE", Types.VARCHAR, 3, false); 935 t.createPrimaryKey(null, new int[] { 939 3, 6, 5, 4, 2, 1, 0 940 }, false); 941 942 return t; 943 } 944 945 Result rs; 946 947 rs = session.sqlExecuteDirectNoPreChecks( 948 "select a.TABLE_CAT, a.TABLE_SCHEM, a.TABLE_NAME, b.COLUMN_NAME, " 949 + "a.GRANTOR, a.GRANTEE, a.PRIVILEGE, a.IS_GRANTABLE " 950 + "from INFORMATION_SCHEMA.SYSTEM_TABLEPRIVILEGES a, " 951 + "INFORMATION_SCHEMA.SYSTEM_COLUMNS b " 952 + "where a.TABLE_NAME = b.TABLE_NAME and " 953 + "a.TABLE_SCHEM = b.TABLE_SCHEM;"); 954 955 t.insertSys(rs); 956 t.setDataReadOnly(true); 957 958 return t; 959 } 960 961 999 final Table SYSTEM_COLUMNS() throws HsqlException { 1000 1001 Table t = sysTables[SYSTEM_COLUMNS]; 1002 1003 if (t == null) { 1004 t = createBlankTable(sysTableHsqlNames[SYSTEM_COLUMNS]); 1005 1006 addColumn(t, "TABLE_CAT", Types.VARCHAR); 1007 addColumn(t, "TABLE_SCHEM", Types.VARCHAR); 1008 addColumn(t, "TABLE_NAME", Types.VARCHAR, false); addColumn(t, "COLUMN_NAME", Types.VARCHAR, false); addColumn(t, "DATA_TYPE", Types.SMALLINT, false); addColumn(t, "TYPE_NAME", Types.VARCHAR, 32, false); addColumn(t, "COLUMN_SIZE", Types.INTEGER); 1013 addColumn(t, "BUFFER_LENGTH", Types.INTEGER); 1014 addColumn(t, "DECIMAL_DIGITS", Types.INTEGER); 1015 addColumn(t, "NUM_PREC_RADIX", Types.INTEGER); 1016 addColumn(t, "NULLABLE", Types.INTEGER, false); addColumn(t, "REMARKS", Types.VARCHAR); 1018 addColumn(t, "COLUMN_DEF", Types.VARCHAR); 1019 addColumn(t, "SQL_DATA_TYPE", Types.INTEGER); 1020 addColumn(t, "SQL_DATETIME_SUB", Types.INTEGER); 1021 addColumn(t, "CHAR_OCTET_LENGTH", Types.INTEGER); 1022 addColumn(t, "ORDINAL_POSITION", Types.INTEGER, false); addColumn(t, "IS_NULLABLE", Types.VARCHAR, 3, false); addColumn(t, "SCOPE_CATLOG", Types.VARCHAR); 1025 addColumn(t, "SCOPE_SCHEMA", Types.VARCHAR); 1026 addColumn(t, "SCOPE_TABLE", Types.VARCHAR); 1027 addColumn(t, "SOURCE_DATA_TYPE", Types.VARCHAR); 1028 addColumn(t, "TYPE_SUB", Types.INTEGER, false); 1030 t.createPrimaryKey(null, new int[] { 1034 1, 2, 16, 0 1035 }, false); 1036 1037 return t; 1038 } 1039 1040 String tableCatalog; 1042 String tableSchema; 1043 String tableName; 1044 1045 int columnCount; 1047 Iterator tables; 1048 Table table; 1049 Object [] row; 1050 DITableInfo ti; 1051 1052 final int itable_cat = 0; 1054 final int itable_schem = 1; 1055 final int itable_name = 2; 1056 final int icolumn_name = 3; 1057 final int idata_type = 4; 1058 final int itype_name = 5; 1059 final int icolumn_size = 6; 1060 final int ibuffer_length = 7; 1061 final int idecimal_digits = 8; 1062 final int inum_prec_radix = 9; 1063 final int inullable = 10; 1064 final int iremark = 11; 1065 final int icolumn_def = 12; 1066 final int isql_data_type = 13; 1067 final int isql_datetime_sub = 14; 1068 final int ichar_octet_length = 15; 1069 final int iordinal_position = 16; 1070 final int iis_nullable = 17; 1071 final int itype_sub = 22; 1072 1073 tables = allTables(); 1075 ti = new DITableInfo(); 1076 1077 while (tables.hasNext()) { 1079 table = (Table) tables.next(); 1080 1081 if (!isAccessibleTable(table)) { 1082 continue; 1083 } 1084 1085 ti.setTable(table); 1086 1087 tableCatalog = ns.getCatalogName(table); 1088 tableSchema = table.getSchemaName(); 1089 tableName = ti.getName(); 1090 columnCount = table.getColumnCount(); 1091 1092 for (int i = 0; i < columnCount; i++) { 1093 row = t.getEmptyRowData(); 1094 row[itable_cat] = tableCatalog; 1095 row[itable_schem] = tableSchema; 1096 row[itable_name] = tableName; 1097 row[icolumn_name] = ti.getColName(i); 1098 row[idata_type] = ti.getColDataType(i); 1099 row[itype_name] = ti.getColDataTypeName(i); 1100 row[icolumn_size] = ti.getColSize(i); 1101 row[ibuffer_length] = ti.getColBufLen(i); 1102 row[idecimal_digits] = ti.getColScale(i); 1103 row[inum_prec_radix] = ti.getColPrecRadix(i); 1104 row[inullable] = ti.getColNullability(i); 1105 row[iremark] = ti.getColRemarks(i); 1106 row[icolumn_def] = ti.getColDefault(i); 1107 row[isql_data_type] = ti.getColSqlDataType(i); 1108 row[isql_datetime_sub] = ti.getColSqlDateTimeSub(i); 1109 row[ichar_octet_length] = ti.getColCharOctLen(i); 1110 row[iordinal_position] = ValuePool.getInt(i + 1); 1111 row[iis_nullable] = ti.getColIsNullable(i); 1112 row[itype_sub] = ti.getColDataTypeSub(i); 1113 1114 t.insertSys(row); 1115 } 1116 } 1117 1118 t.setDataReadOnly(true); 1119 1120 return t; 1121 } 1122 1123 1157 final Table SYSTEM_CROSSREFERENCE() throws HsqlException { 1158 1159 Table t = sysTables[SYSTEM_CROSSREFERENCE]; 1160 1161 if (t == null) { 1162 t = createBlankTable(sysTableHsqlNames[SYSTEM_CROSSREFERENCE]); 1163 1164 addColumn(t, "PKTABLE_CAT", Types.VARCHAR); 1165 addColumn(t, "PKTABLE_SCHEM", Types.VARCHAR); 1166 addColumn(t, "PKTABLE_NAME", Types.VARCHAR, false); addColumn(t, "PKCOLUMN_NAME", Types.VARCHAR, false); addColumn(t, "FKTABLE_CAT", Types.VARCHAR); 1169 addColumn(t, "FKTABLE_SCHEM", Types.VARCHAR); 1170 addColumn(t, "FKTABLE_NAME", Types.VARCHAR, false); addColumn(t, "FKCOLUMN_NAME", Types.VARCHAR, false); addColumn(t, "KEY_SEQ", Types.SMALLINT, false); addColumn(t, "UPDATE_RULE", Types.SMALLINT, false); addColumn(t, "DELETE_RULE", Types.SMALLINT, false); addColumn(t, "FK_NAME", Types.VARCHAR); 1176 addColumn(t, "PK_NAME", Types.VARCHAR); 1177 addColumn(t, "DEFERRABILITY", Types.SMALLINT, false); 1179 t.createPrimaryKey(null, new int[] { 1184 4, 5, 6, 8, 11 1185 }, false); 1186 1187 return t; 1188 } 1189 1190 String pkTableCatalog; 1192 String pkTableSchema; 1193 String pkTableName; 1194 String pkColumnName; 1195 String fkTableCatalog; 1196 String fkTableSchema; 1197 String fkTableName; 1198 String fkColumnName; 1199 Integer keySequence; 1200 Integer updateRule; 1201 Integer deleteRule; 1202 String fkName; 1203 String pkName; 1204 Integer deferrability; 1205 1206 Iterator tables; 1208 Table table; 1209 Table fkTable; 1210 Table pkTable; 1211 int columnCount; 1212 int[] mainCols; 1213 int[] refCols; 1214 Constraint[] constraints; 1215 Constraint constraint; 1216 int constraintCount; 1217 HsqlArrayList fkConstraintsList; 1218 Object [] row; 1219 DITableInfo pkInfo; 1220 DITableInfo fkInfo; 1221 1222 final int ipk_table_cat = 0; 1224 final int ipk_table_schem = 1; 1225 final int ipk_table_name = 2; 1226 final int ipk_column_name = 3; 1227 final int ifk_table_cat = 4; 1228 final int ifk_table_schem = 5; 1229 final int ifk_table_name = 6; 1230 final int ifk_column_name = 7; 1231 final int ikey_seq = 8; 1232 final int iupdate_rule = 9; 1233 final int idelete_rule = 10; 1234 final int ifk_name = 11; 1235 final int ipk_name = 12; 1236 final int ideferrability = 13; 1237 1238 tables = database.schemaManager.allTablesIterator(); 1239 pkInfo = new DITableInfo(); 1240 fkInfo = new DITableInfo(); 1241 1242 deferrability = ValuePool.getInt(Constraint.NOT_DEFERRABLE); 1244 1245 fkConstraintsList = new HsqlArrayList(); 1254 1255 while (tables.hasNext()) { 1256 table = (Table) tables.next(); 1257 1258 if (!isAccessibleTable(table)) { 1259 continue; 1260 } 1261 1262 constraints = table.getConstraints(); 1263 constraintCount = constraints.length; 1264 1265 for (int i = 0; i < constraintCount; i++) { 1266 constraint = (Constraint) constraints[i]; 1267 1268 if (constraint.getType() == Constraint.FOREIGN_KEY 1269 && isAccessibleTable(constraint.getRef())) { 1270 fkConstraintsList.add(constraint); 1271 } 1272 } 1273 } 1274 1275 for (int i = 0; i < fkConstraintsList.size(); i++) { 1280 constraint = (Constraint) fkConstraintsList.get(i); 1281 pkTable = constraint.getMain(); 1282 1283 pkInfo.setTable(pkTable); 1284 1285 pkTableName = pkInfo.getName(); 1286 fkTable = constraint.getRef(); 1287 1288 fkInfo.setTable(fkTable); 1289 1290 fkTableName = fkInfo.getName(); 1291 pkTableCatalog = ns.getCatalogName(pkTable); 1292 pkTableSchema = pkTable.getSchemaName(); 1293 fkTableCatalog = ns.getCatalogName(fkTable); 1294 fkTableSchema = fkTable.getSchemaName(); 1295 mainCols = constraint.getMainColumns(); 1296 refCols = constraint.getRefColumns(); 1297 columnCount = refCols.length; 1298 fkName = constraint.getFkName(); 1299 pkName = constraint.getPkName(); 1300 1301 deleteRule = ValuePool.getInt(constraint.getDeleteAction()); 1303 updateRule = ValuePool.getInt(constraint.getUpdateAction()); 1304 1305 for (int j = 0; j < columnCount; j++) { 1306 keySequence = ValuePool.getInt(j + 1); 1307 pkColumnName = pkInfo.getColName(mainCols[j]); 1308 fkColumnName = fkInfo.getColName(refCols[j]); 1309 row = t.getEmptyRowData(); 1310 row[ipk_table_cat] = pkTableCatalog; 1311 row[ipk_table_schem] = pkTableSchema; 1312 row[ipk_table_name] = pkTableName; 1313 row[ipk_column_name] = pkColumnName; 1314 row[ifk_table_cat] = fkTableCatalog; 1315 row[ifk_table_schem] = fkTableSchema; 1316 row[ifk_table_name] = fkTableName; 1317 row[ifk_column_name] = fkColumnName; 1318 row[ikey_seq] = keySequence; 1319 row[iupdate_rule] = updateRule; 1320 row[idelete_rule] = deleteRule; 1321 row[ifk_name] = fkName; 1322 row[ipk_name] = pkName; 1323 row[ideferrability] = deferrability; 1324 1325 t.insertSys(row); 1326 } 1327 } 1328 1329 t.setDataReadOnly(true); 1330 1331 return t; 1332 } 1333 1334 1365 final Table SYSTEM_INDEXINFO() throws HsqlException { 1366 1367 Table t = sysTables[SYSTEM_INDEXINFO]; 1368 1369 if (t == null) { 1370 t = createBlankTable(sysTableHsqlNames[SYSTEM_INDEXINFO]); 1371 1372 addColumn(t, "TABLE_CAT", Types.VARCHAR); 1374 addColumn(t, "TABLE_SCHEM", Types.VARCHAR); 1375 addColumn(t, "TABLE_NAME", Types.VARCHAR, false); addColumn(t, "NON_UNIQUE", Types.BOOLEAN, false); addColumn(t, "INDEX_QUALIFIER", Types.VARCHAR); 1378 addColumn(t, "INDEX_NAME", Types.VARCHAR); 1379 addColumn(t, "TYPE", Types.SMALLINT, false); addColumn(t, "ORDINAL_POSITION", Types.SMALLINT, false); addColumn(t, "COLUMN_NAME", Types.VARCHAR); 1382 addColumn(t, "ASC_OR_DESC", Types.VARCHAR, 1, true); 1383 addColumn(t, "CARDINALITY", Types.INTEGER); 1384 addColumn(t, "PAGES", Types.INTEGER); 1385 addColumn(t, "FILTER_CONDITION", Types.VARCHAR); 1386 1387 addColumn(t, "ROW_CARDINALITY", Types.INTEGER); 1389 1390 t.createPrimaryKey(null, new int[] { 1394 3, 6, 5, 7, 4, 2 1395 }, false); 1396 1397 return t; 1398 } 1399 1400 String tableCatalog; 1402 String tableSchema; 1403 String tableName; 1404 Boolean nonUnique; 1405 String indexQualifier; 1406 String indexName; 1407 Integer indexType; 1408 1409 Integer cardinality; 1413 Integer pages; 1414 String filterCondition; 1415 Integer rowCardinality; 1416 1417 Iterator tables; 1419 Table table; 1420 int indexCount; 1421 int[] cols; 1422 int col; 1423 int colCount; 1424 Object [] row; 1425 DITableInfo ti; 1426 HsqlProperties p; 1427 1428 final int itable_cat = 0; 1430 final int itable_schem = 1; 1431 final int itable_name = 2; 1432 final int inon_unique = 3; 1433 final int iindex_qualifier = 4; 1434 final int iindex_name = 5; 1435 final int itype = 6; 1436 final int iordinal_position = 7; 1437 final int icolumn_name = 8; 1438 final int iasc_or_desc = 9; 1439 final int icardinality = 10; 1440 final int ipages = 11; 1441 final int ifilter_condition = 12; 1442 final int irow_cardinality = 13; 1443 1444 ti = new DITableInfo(); 1446 p = database.getProperties(); 1447 tables = p.isPropertyTrue("hsqldb.system_table_indexinfo") 1448 ? allTables() 1449 : database.schemaManager.allTablesIterator(); 1450 1451 while (tables.hasNext()) { 1453 table = (Table) tables.next(); 1454 1455 if (table.isView() ||!isAccessibleTable(table)) { 1456 continue; 1457 } 1458 1459 ti.setTable(table); 1460 1461 tableCatalog = ns.getCatalogName(table); 1462 tableSchema = table.getSchemaName(); 1463 tableName = ti.getName(); 1464 1465 filterCondition = null; 1467 1468 indexQualifier = tableCatalog; 1470 indexCount = table.getIndexCount(); 1471 1472 for (int i = 0; i < indexCount; i++) { 1474 colCount = ti.getIndexVisibleColumns(i); 1475 1476 if (colCount < 1) { 1477 continue; 1478 } 1479 1480 indexName = ti.getIndexName(i); 1481 nonUnique = ti.isIndexNonUnique(i); 1482 cardinality = ti.getIndexCardinality(i); 1483 pages = ValuePool.getInt(0); 1484 rowCardinality = ti.getIndexRowCardinality(i); 1485 cols = ti.getIndexColumns(i); 1486 indexType = ti.getIndexType(i); 1487 1488 for (int k = 0; k < colCount; k++) { 1489 col = cols[k]; 1490 row = t.getEmptyRowData(); 1491 row[itable_cat] = tableCatalog; 1492 row[itable_schem] = tableSchema; 1493 row[itable_name] = tableName; 1494 row[inon_unique] = nonUnique; 1495 row[iindex_qualifier] = indexQualifier; 1496 row[iindex_name] = indexName; 1497 row[itype] = indexType; 1498 row[iordinal_position] = ValuePool.getInt(k + 1); 1499 row[icolumn_name] = ti.getColName(col); 1500 row[iasc_or_desc] = ti.getIndexColDirection(i, col); 1501 row[icardinality] = cardinality; 1502 row[ipages] = pages; 1503 row[irow_cardinality] = rowCardinality; 1504 row[ifilter_condition] = filterCondition; 1505 1506 t.insertSys(row); 1507 } 1508 } 1509 } 1510 1511 t.setDataReadOnly(true); 1512 1513 return t; 1514 } 1515 1516 1538 final Table SYSTEM_PRIMARYKEYS() throws HsqlException { 1539 1540 Table t = sysTables[SYSTEM_PRIMARYKEYS]; 1541 1542 if (t == null) { 1543 t = createBlankTable(sysTableHsqlNames[SYSTEM_PRIMARYKEYS]); 1544 1545 addColumn(t, "TABLE_CAT", Types.VARCHAR); 1546 addColumn(t, "TABLE_SCHEM", Types.VARCHAR); 1547 addColumn(t, "TABLE_NAME", Types.VARCHAR, false); addColumn(t, "COLUMN_NAME", Types.VARCHAR, false); addColumn(t, "KEY_SEQ", Types.SMALLINT, false); addColumn(t, "PK_NAME", Types.VARCHAR); 1551 1552 t.createPrimaryKey(null, new int[] { 1556 3, 2, 1, 0 1557 }, false); 1558 1559 return t; 1560 } 1561 1562 String tableCatalog; 1564 String tableSchema; 1565 String tableName; 1566 1567 String primaryKeyName; 1570 1571 Iterator tables; 1573 Table table; 1574 Object [] row; 1575 Index index; 1576 int[] cols; 1577 int colCount; 1578 DITableInfo ti; 1579 HsqlProperties p; 1580 1581 final int itable_cat = 0; 1583 final int itable_schem = 1; 1584 final int itable_name = 2; 1585 final int icolumn_name = 3; 1586 final int ikey_seq = 4; 1587 final int ipk_name = 5; 1588 1589 ti = new DITableInfo(); 1591 p = database.getProperties(); 1592 tables = p.isPropertyTrue("hsqldb.system_table_primarykeys") 1593 ? allTables() 1594 : database.schemaManager.allTablesIterator(); 1595 1596 while (tables.hasNext()) { 1597 table = (Table) tables.next(); 1598 1599 if (table.isView() ||!isAccessibleTable(table) 1600 ||!table.hasPrimaryKey()) { 1601 continue; 1602 } 1603 1604 index = table.getPrimaryIndex(); 1605 1606 ti.setTable(table); 1607 1608 tableCatalog = ns.getCatalogName(table); 1609 tableSchema = table.getSchemaName(); 1610 tableName = ti.getName(); 1611 primaryKeyName = index.getName().name; 1612 cols = index.getColumns(); 1613 colCount = cols.length; 1614 1615 for (int j = 0; j < colCount; j++) { 1616 row = t.getEmptyRowData(); 1617 row[itable_cat] = tableCatalog; 1618 row[itable_schem] = tableSchema; 1619 row[itable_name] = tableName; 1620 row[icolumn_name] = ti.getColName(cols[j]); 1621 row[ikey_seq] = ValuePool.getInt(j + 1); 1622 row[ipk_name] = primaryKeyName; 1623 1624 t.insertSys(row); 1625 } 1626 } 1627 1628 t.setDataReadOnly(true); 1629 1630 return t; 1631 } 1632 1633 1676 Table SYSTEM_PROCEDURECOLUMNS() throws HsqlException { 1677 1678 Table t = sysTables[SYSTEM_PROCEDURECOLUMNS]; 1679 1680 if (t == null) { 1681 t = createBlankTable(sysTableHsqlNames[SYSTEM_PROCEDURECOLUMNS]); 1682 1683 addColumn(t, "PROCEDURE_CAT", Types.VARCHAR); 1687 addColumn(t, "PROCEDURE_SCHEM", Types.VARCHAR); 1688 addColumn(t, "PROCEDURE_NAME", Types.VARCHAR, false); addColumn(t, "COLUMN_NAME", Types.VARCHAR, false); addColumn(t, "COLUMN_TYPE", Types.SMALLINT, false); addColumn(t, "DATA_TYPE", Types.SMALLINT, false); addColumn(t, "TYPE_NAME", Types.VARCHAR, 32, false); addColumn(t, "PRECISION", Types.INTEGER); 1694 addColumn(t, "LENGTH", Types.INTEGER); 1695 addColumn(t, "SCALE", Types.SMALLINT); 1696 addColumn(t, "RADIX", Types.SMALLINT); 1697 addColumn(t, "NULLABLE", Types.SMALLINT, false); addColumn(t, "REMARKS", Types.VARCHAR); 1699 1700 addColumn(t, "SPECIFIC_NAME", Types.VARCHAR, false); 1705 addColumn(t, "SEQ", Types.INTEGER, false); 1710 t.createPrimaryKey(null, new int[] { 1715 1, 2, 13, 14, 0 1716 }, false); 1717 1718 return t; 1719 } 1720 1721 t.setDataReadOnly(true); 1722 1723 return t; 1724 } 1725 1726 1755 Table SYSTEM_PROCEDURES() throws HsqlException { 1756 1757 Table t = sysTables[SYSTEM_PROCEDURES]; 1758 1759 if (t == null) { 1760 t = createBlankTable(sysTableHsqlNames[SYSTEM_PROCEDURES]); 1761 1762 addColumn(t, "PROCEDURE_CAT", Types.VARCHAR); 1766 addColumn(t, "PROCEDURE_SCHEM", Types.VARCHAR); 1767 addColumn(t, "PROCEDURE_NAME", Types.VARCHAR, false); addColumn(t, "NUM_INPUT_PARAMS", Types.INTEGER); 1769 addColumn(t, "NUM_OUTPUT_PARAMS", Types.INTEGER); 1770 addColumn(t, "NUM_RESULT_SETS", Types.INTEGER); 1771 addColumn(t, "REMARKS", Types.VARCHAR); 1772 1773 addColumn(t, "PROCEDURE_TYPE", Types.SMALLINT, false); 1777 addColumn(t, "ORIGIN", Types.VARCHAR, 32, false); addColumn(t, "SPECIFIC_NAME", Types.VARCHAR, false); 1783 t.createPrimaryKey(null, new int[] { 1788 1, 2, 9, 0 1789 }, false); 1790 1791 return t; 1792 } 1793 1794 t.setDataReadOnly(true); 1795 1796 return t; 1797 } 1798 1799 1816 final Table SYSTEM_SCHEMAS() throws HsqlException { 1817 1818 Table t = sysTables[SYSTEM_SCHEMAS]; 1819 1820 if (t == null) { 1821 t = createBlankTable(sysTableHsqlNames[SYSTEM_SCHEMAS]); 1822 1823 addColumn(t, "TABLE_SCHEM", Types.VARCHAR, false); addColumn(t, "TABLE_CATALOG", Types.VARCHAR); 1825 addColumn(t, "IS_DEFAULT", Types.BOOLEAN); 1826 1827 t.createPrimaryKey(null, new int[]{ 0 }, true); 1830 1831 return t; 1832 } 1833 1834 Iterator schemas; 1835 Object [] row; 1836 1837 schemas = database.schemaManager.fullSchemaNamesIterator(); 1839 1840 String defschema = database.schemaManager.getDefaultSchemaName(); 1841 1842 while (schemas.hasNext()) { 1844 row = t.getEmptyRowData(); 1845 1846 String schema = (String ) schemas.next(); 1847 1848 row[0] = schema; 1849 row[1] = ns.getCatalogName(row[0]); 1850 row[2] = schema.equals(defschema) ? Boolean.TRUE 1851 : Boolean.FALSE; 1852 1853 t.insertSys(row); 1854 } 1855 1856 t.setDataReadOnly(true); 1857 1858 return t; 1859 } 1860 1861 1885 final Table SYSTEM_TABLEPRIVILEGES() throws HsqlException { 1886 1887 Table t = sysTables[SYSTEM_TABLEPRIVILEGES]; 1888 1889 if (t == null) { 1890 t = createBlankTable(sysTableHsqlNames[SYSTEM_TABLEPRIVILEGES]); 1891 1892 addColumn(t, "TABLE_CAT", Types.VARCHAR); 1893 addColumn(t, "TABLE_SCHEM", Types.VARCHAR); 1894 addColumn(t, "TABLE_NAME", Types.VARCHAR, false); addColumn(t, "GRANTOR", Types.VARCHAR, false); addColumn(t, "GRANTEE", Types.VARCHAR, false); addColumn(t, "PRIVILEGE", Types.VARCHAR, 10, false); addColumn(t, "IS_GRANTABLE", Types.VARCHAR, 3, false); 1900 t.createPrimaryKey(null, new int[] { 1904 1, 2, 5, 4, 3, 0 1905 }, false); 1906 1907 return t; 1908 } 1909 1910 String tableCatalog; 1912 String tableSchema; 1913 String tableName; 1914 String grantorName; 1915 String granteeName; 1916 String privilege; 1917 String isGrantable; 1918 1919 HsqlArrayList users; 1921 User user; 1922 String [] tablePrivileges; 1923 Iterator tables; 1924 Table table; 1925 HsqlName accessKey; 1926 Object [] row; 1927 1928 final int itable_cat = 0; 1930 final int itable_schem = 1; 1931 final int itable_name = 2; 1932 final int igrantor = 3; 1933 final int igrantee = 4; 1934 final int iprivilege = 5; 1935 final int iis_grantable = 6; 1936 1937 grantorName = GranteeManager.DBA_ADMIN_ROLE_NAME; 1939 users = database.getUserManager().listVisibleUsers(session, true); 1940 tables = allTables(); 1941 1942 while (tables.hasNext()) { 1944 table = (Table) tables.next(); 1945 accessKey = table.getName(); 1946 1947 if (!isAccessibleTable(table)) { 1950 continue; 1951 } 1952 1953 tableName = table.getName().name; 1954 tableCatalog = ns.getCatalogName(table); 1955 tableSchema = table.getSchemaName(); 1956 1957 for (int i = 0; i < users.size(); i++) { 1958 user = (User) users.get(i); 1959 granteeName = user.getName(); 1960 1961 if (user.isAdmin()) { 1962 tablePrivileges = 1963 UserManager.getRightsArray(UserManager.ALL); 1964 } else { 1965 tablePrivileges = 1966 user.listGrantedTablePrivileges(accessKey); 1967 } 1968 1969 isGrantable = (user.isAdmin()) ? "YES" 1970 : "NO"; 1971 1972 for (int j = 0; j < tablePrivileges.length; j++) { 1973 privilege = (String ) tablePrivileges[j]; 1974 row = t.getEmptyRowData(); 1975 row[itable_cat] = tableCatalog; 1976 row[itable_schem] = tableSchema; 1977 row[itable_name] = tableName; 1978 row[igrantor] = grantorName; 1979 row[igrantee] = granteeName; 1980 row[iprivilege] = privilege; 1981 row[iis_grantable] = isGrantable; 1982 1983 t.insertSys(row); 1984 } 1985 } 1986 } 1987 1988 t.setDataReadOnly(true); 1989 1990 return t; 1991 } 1992 1993 2023 final Table SYSTEM_TABLES() throws HsqlException { 2024 2025 Table t = sysTables[SYSTEM_TABLES]; 2026 2027 if (t == null) { 2028 t = createBlankTable(sysTableHsqlNames[SYSTEM_TABLES]); 2029 2030 addColumn(t, "TABLE_CAT", Types.VARCHAR); 2034 addColumn(t, "TABLE_SCHEM", Types.VARCHAR); 2035 addColumn(t, "TABLE_NAME", Types.VARCHAR, false); addColumn(t, "TABLE_TYPE", Types.VARCHAR, 16, false); addColumn(t, "REMARKS", Types.VARCHAR); 2038 2039 addColumn(t, "TYPE_CAT", Types.VARCHAR); 2043 addColumn(t, "TYPE_SCHEM", Types.VARCHAR); 2044 addColumn(t, "TYPE_NAME", Types.VARCHAR); 2045 addColumn(t, "SELF_REFERENCING_COL_NAME", Types.VARCHAR); 2046 addColumn(t, "REF_GENERATION", Types.VARCHAR); 2047 2048 addColumn(t, "HSQLDB_TYPE", Types.VARCHAR, 6, true); 2052 addColumn(t, "READ_ONLY", Types.BOOLEAN, false); 2054 t.createPrimaryKey(null, new int[] { 2059 3, 1, 2, 0 2060 }, false); 2061 2062 return t; 2063 } 2064 2065 Iterator tables; 2067 Table table; 2068 Object [] row; 2069 HsqlName accessKey; 2070 DITableInfo ti; 2071 2072 final int itable_cat = 0; 2075 final int itable_schem = 1; 2076 final int itable_name = 2; 2077 final int itable_type = 3; 2078 final int iremark = 4; 2079 2080 final int itype_cat = 5; 2082 final int itype_schem = 6; 2083 final int itype_name = 7; 2084 final int isref_cname = 8; 2085 final int iref_gen = 9; 2086 2087 final int ihsqldb_type = 10; 2089 final int iread_only = 11; 2090 2091 tables = allTables(); 2093 ti = new DITableInfo(); 2094 2095 while (tables.hasNext()) { 2097 table = (Table) tables.next(); 2098 2099 if (!isAccessibleTable(table)) { 2100 continue; 2101 } 2102 2103 ti.setTable(table); 2104 2105 row = t.getEmptyRowData(); 2106 row[itable_cat] = ns.getCatalogName(table); 2107 row[itable_schem] = table.getSchemaName(); 2108 row[itable_name] = ti.getName(); 2109 row[itable_type] = ti.getStandardType(); 2110 row[iremark] = ti.getRemark(); 2111 row[ihsqldb_type] = ti.getHsqlType(); 2112 row[iread_only] = ti.isReadOnly(); 2113 2114 t.insertSys(row); 2115 } 2116 2117 t.setDataReadOnly(true); 2118 2119 return t; 2120 } 2121 2122 2156 Table SYSTEM_TABLETYPES() throws HsqlException { 2157 2158 Table t = sysTables[SYSTEM_TABLETYPES]; 2159 2160 if (t == null) { 2161 t = createBlankTable(sysTableHsqlNames[SYSTEM_TABLETYPES]); 2162 2163 addColumn(t, "TABLE_TYPE", Types.VARCHAR, 16, false); 2165 t.createPrimaryKey(null, new int[]{ 0 }, true); 2168 2169 return t; 2170 } 2171 2172 Object [] row; 2173 2174 for (int i = 0; i < tableTypes.length; i++) { 2175 row = t.getEmptyRowData(); 2176 row[0] = tableTypes[i]; 2177 2178 t.insertSys(row); 2179 } 2180 2181 t.setDataReadOnly(true); 2182 2183 return t; 2184 } 2185 2186 2234 final Table SYSTEM_TYPEINFO() throws HsqlException { 2235 2236 Table t = sysTables[SYSTEM_TYPEINFO]; 2237 2238 if (t == null) { 2239 t = createBlankTable(sysTableHsqlNames[SYSTEM_TYPEINFO]); 2240 2241 addColumn(t, "TYPE_NAME", Types.VARCHAR, 32, false); 2245 addColumn(t, "DATA_TYPE", Types.SMALLINT, false); 2246 addColumn(t, "PRECISION", Types.INTEGER); 2247 addColumn(t, "LITERAL_PREFIX", Types.VARCHAR, 2, true); 2248 addColumn(t, "LITERAL_SUFFIX", Types.VARCHAR, 2, true); 2249 addColumn(t, "CREATE_PARAMS", Types.VARCHAR); 2250 addColumn(t, "NULLABLE", Types.SMALLINT); 2251 addColumn(t, "CASE_SENSITIVE", Types.BOOLEAN); 2252 addColumn(t, "SEARCHABLE", Types.SMALLINT); 2253 addColumn(t, "UNSIGNED_ATTRIBUTE", Types.BOOLEAN); 2254 addColumn(t, "FIXED_PREC_SCALE", Types.BOOLEAN); 2255 addColumn(t, "AUTO_INCREMENT", Types.BOOLEAN); 2256 addColumn(t, "LOCAL_TYPE_NAME", Types.VARCHAR); 2257 addColumn(t, "MINIMUM_SCALE", Types.SMALLINT); 2258 addColumn(t, "MAXIMUM_SCALE", Types.SMALLINT); 2259 addColumn(t, "SQL_DATA_TYPE", Types.INTEGER); 2260 addColumn(t, "SQL_DATETIME_SUB", Types.INTEGER); 2261 addColumn(t, "NUM_PREC_RADIX", Types.INTEGER); 2262 2263 addColumn(t, "TYPE_SUB", Types.INTEGER); 2267 2268 t.createPrimaryKey(null, new int[] { 2271 1, 18 2272 }, true); 2273 2274 return t; 2275 } 2276 2277 Result rs; 2278 2279 rs = session.sqlExecuteDirectNoPreChecks( 2280 "select TYPE_NAME, DATA_TYPE, PRECISION, LITERAL_PREFIX, LITERAL_SUFFIX, CREATE_PARAMS, NULLABLE, CASE_SENSITIVE, SEARCHABLE," 2281 + "UNSIGNED_ATTRIBUTE, FIXED_PREC_SCALE, AUTO_INCREMENT, LOCAL_TYPE_NAME, MINIMUM_SCALE, " 2282 + "MAXIMUM_SCALE, SQL_DATA_TYPE, SQL_DATETIME_SUB, NUM_PREC_RADIX, TYPE_SUB " 2283 + "from INFORMATION_SCHEMA.SYSTEM_ALLTYPEINFO where AS_TAB_COL = true;"); 2284 2285 t.insertSys(rs); 2286 t.setDataReadOnly(true); 2287 2288 return t; 2289 } 2290 2291 2365 final Table SYSTEM_ALLTYPEINFO() throws HsqlException { 2366 2367 Table t = sysTables[SYSTEM_ALLTYPEINFO]; 2368 2369 if (t == null) { 2370 t = createBlankTable(sysTableHsqlNames[SYSTEM_ALLTYPEINFO]); 2371 2372 addColumn(t, "TYPE_NAME", Types.VARCHAR, 32, false); 2376 addColumn(t, "DATA_TYPE", Types.SMALLINT, false); 2377 addColumn(t, "PRECISION", Types.INTEGER); 2378 addColumn(t, "LITERAL_PREFIX", Types.VARCHAR, 2, true); 2379 addColumn(t, "LITERAL_SUFFIX", Types.VARCHAR, 2, true); 2380 addColumn(t, "CREATE_PARAMS", Types.VARCHAR); 2381 addColumn(t, "NULLABLE", Types.SMALLINT); 2382 addColumn(t, "CASE_SENSITIVE", Types.BOOLEAN); 2383 addColumn(t, "SEARCHABLE", Types.SMALLINT); 2384 addColumn(t, "UNSIGNED_ATTRIBUTE", Types.BOOLEAN); 2385 addColumn(t, "FIXED_PREC_SCALE", Types.BOOLEAN); 2386 addColumn(t, "AUTO_INCREMENT", Types.BOOLEAN); 2387 addColumn(t, "LOCAL_TYPE_NAME", Types.VARCHAR); 2388 addColumn(t, "MINIMUM_SCALE", Types.SMALLINT); 2389 addColumn(t, "MAXIMUM_SCALE", Types.SMALLINT); 2390 addColumn(t, "SQL_DATA_TYPE", Types.INTEGER); 2391 addColumn(t, "SQL_DATETIME_SUB", Types.INTEGER); 2392 addColumn(t, "NUM_PREC_RADIX", Types.INTEGER); 2393 2394 addColumn(t, "INTERVAL_PRECISION", Types.INTEGER); 2398 2399 addColumn(t, "AS_TAB_COL", Types.BOOLEAN); 2405 2406 addColumn(t, "AS_PROC_COL", Types.BOOLEAN); 2414 2415 addColumn(t, "MAX_PREC_ACT", Types.BIGINT); 2420 addColumn(t, "MIN_SCALE_ACT", Types.INTEGER); 2421 addColumn(t, "MAX_SCALE_ACT", Types.INTEGER); 2422 2423 addColumn(t, "COL_ST_CLS_NAME", Types.VARCHAR); 2427 addColumn(t, "COL_ST_IS_SUP", Types.BOOLEAN); 2428 2429 addColumn(t, "STD_MAP_CLS_NAME", Types.VARCHAR); 2433 addColumn(t, "STD_MAP_IS_SUP", Types.BOOLEAN); 2434 2435 addColumn(t, "CST_MAP_CLS_NAME", Types.VARCHAR); 2440 addColumn(t, "CST_MAP_IS_SUP", Types.BOOLEAN); 2441 2442 addColumn(t, "MCOL_JDBC", Types.INTEGER); 2447 addColumn(t, "MCOL_ACT", Types.BIGINT); 2448 2449 addColumn(t, "DEF_OR_FIXED_SCALE", Types.INTEGER); 2453 2454 addColumn(t, "REMARKS", Types.VARCHAR); 2458 2459 addColumn(t, "TYPE_SUB", Types.INTEGER); 2463 2464 t.createPrimaryKey(null, new int[] { 2467 1, 34 2468 }, true); 2469 2470 return t; 2471 } 2472 2473 Object [] row; 2474 int type; 2475 DITypeInfo ti; 2476 2477 final int itype_name = 0; 2481 final int idata_type = 1; 2482 final int iprecision = 2; 2483 final int iliteral_prefix = 3; 2484 final int iliteral_suffix = 4; 2485 final int icreate_params = 5; 2486 final int inullable = 6; 2487 final int icase_sensitive = 7; 2488 final int isearchable = 8; 2489 final int iunsigned_attribute = 9; 2490 final int ifixed_prec_scale = 10; 2491 final int iauto_increment = 11; 2492 final int ilocal_type_name = 12; 2493 final int iminimum_scale = 13; 2494 final int imaximum_scale = 14; 2495 final int isql_data_type = 15; 2496 final int isql_datetime_sub = 16; 2497 final int inum_prec_radix = 17; 2498 2499 final int iinterval_precision = 18; 2505 2506 final int iis_sup_as_tcol = 19; 2510 final int iis_sup_as_pcol = 20; 2511 2512 final int imax_prec_or_len_act = 21; 2514 final int imin_scale_actual = 22; 2515 final int imax_scale_actual = 23; 2516 2517 final int ics_cls_name = 24; 2519 final int ics_cls_is_supported = 25; 2520 2521 final int ism_cls_name = 26; 2523 final int ism_cls_is_supported = 27; 2524 2525 final int icm_cls_name = 28; 2527 final int icm_cls_is_supported = 29; 2528 2529 final int imax_char_oct_len_jdbc = 30; 2531 final int imax_char_oct_len_act = 31; 2532 2533 final int idef_or_fixed_scale = 32; 2535 2536 final int iremarks = 33; 2538 2539 final int itype_sub = 34; 2541 2542 ti = new DITypeInfo(); 2543 2544 for (int i = 0; i < Types.ALL_TYPES.length; i++) { 2545 ti.setTypeCode(Types.ALL_TYPES[i][0]); 2546 ti.setTypeSub(Types.ALL_TYPES[i][1]); 2547 2548 row = t.getEmptyRowData(); 2549 row[itype_name] = ti.getTypeName(); 2550 row[idata_type] = ti.getDataType(); 2551 row[iprecision] = ti.getPrecision(); 2552 row[iliteral_prefix] = ti.getLiteralPrefix(); 2553 row[iliteral_suffix] = ti.getLiteralSuffix(); 2554 row[icreate_params] = ti.getCreateParams(); 2555 row[inullable] = ti.getNullability(); 2556 row[icase_sensitive] = ti.isCaseSensitive(); 2557 row[isearchable] = ti.getSearchability(); 2558 row[iunsigned_attribute] = ti.isUnsignedAttribute(); 2559 row[ifixed_prec_scale] = ti.isFixedPrecisionScale(); 2560 row[iauto_increment] = ti.isAutoIncrement(); 2561 row[ilocal_type_name] = ti.getLocalName(); 2562 row[iminimum_scale] = ti.getMinScale(); 2563 row[imaximum_scale] = ti.getMaxScale(); 2564 row[isql_data_type] = ti.getSqlDataType(); 2565 row[isql_datetime_sub] = ti.getSqlDateTimeSub(); 2566 row[inum_prec_radix] = ti.getNumPrecRadix(); 2567 2568 row[iinterval_precision] = ti.getIntervalPrecision(); 2570 2571 row[iis_sup_as_tcol] = ti.isSupportedAsTCol(); 2573 row[iis_sup_as_pcol] = ti.isSupportedAsPCol(); 2574 2575 row[imax_prec_or_len_act] = ti.getPrecisionAct(); 2577 row[imin_scale_actual] = ti.getMinScaleAct(); 2578 row[imax_scale_actual] = ti.getMaxScaleAct(); 2579 2580 row[ics_cls_name] = ti.getColStClsName(); 2582 row[ics_cls_is_supported] = ti.isColStClsSupported(); 2583 2584 row[ism_cls_name] = ti.getStdMapClsName(); 2586 row[ism_cls_is_supported] = ti.isStdMapClsSupported(); 2587 2588 row[icm_cls_name] = ti.getCstMapClsName(); 2590 2591 try { 2592 ns.classForName((String ) row[icm_cls_name]); 2593 2594 row[icm_cls_is_supported] = Boolean.TRUE; 2595 } catch (Exception e) { 2596 row[icm_cls_is_supported] = Boolean.FALSE; 2597 } 2598 2599 row[imax_char_oct_len_jdbc] = ti.getCharOctLen(); 2601 row[imax_char_oct_len_act] = ti.getCharOctLenAct(); 2602 2603 row[idef_or_fixed_scale] = ti.getDefaultScale(); 2605 2606 row[iremarks] = ti.getRemarks(); 2608 2609 row[itype_sub] = ti.getDataTypeSub(); 2611 2612 t.insertSys(row); 2613 } 2614 2615 t.setDataReadOnly(true); 2616 2617 return t; 2618 } 2619 2620 2627 Table SYSTEM_USERS() throws HsqlException { 2628 2629 Table t = sysTables[SYSTEM_USERS]; 2630 2631 if (t == null) { 2632 t = createBlankTable(sysTableHsqlNames[SYSTEM_USERS]); 2633 2634 addColumn(t, "USER", Types.VARCHAR, false); 2635 addColumn(t, "ADMIN", Types.BOOLEAN, false); 2636 2637 t.createPrimaryKey(null, new int[]{ 0 }, true); 2640 2641 return t; 2642 } 2643 2644 HsqlArrayList users; 2646 User user; 2647 int userCount; 2648 Object [] row; 2649 2650 users = database.getUserManager().listVisibleUsers(session, false); 2652 2653 for (int i = 0; i < users.size(); i++) { 2655 row = t.getEmptyRowData(); 2656 user = (User) users.get(i); 2657 row[0] = user.getName(); 2658 row[1] = ValuePool.getBoolean(user.isAdmin()); 2659 2660 t.insertSys(row); 2661 } 2662 2663 t.setDataReadOnly(true); 2664 2665 return t; 2666 } 2667 2668 2716 final Table SYSTEM_CHECK_CONSTRAINTS() throws HsqlException { 2717 2718 Table t = sysTables[SYSTEM_CHECK_CONSTRAINTS]; 2719 2720 if (t == null) { 2721 t = createBlankTable(sysTableHsqlNames[SYSTEM_CHECK_CONSTRAINTS]); 2722 2723 addColumn(t, "CONSTRAINT_CATALOG", Types.VARCHAR); 2724 addColumn(t, "CONSTRAINT_SCHEMA", Types.VARCHAR); 2725 addColumn(t, "CONSTRAINT_NAME", Types.VARCHAR, false); addColumn(t, "CHECK_CLAUSE", Types.VARCHAR, false); 2728 t.createPrimaryKey(null, new int[] { 2731 0, 1, 2 2732 }, false); 2733 2734 return t; 2735 } 2736 2737 Iterator tables; 2740 Table table; 2741 Constraint[] tableConstraints; 2742 int constraintCount; 2743 Constraint constraint; 2744 HsqlArrayList constraintList; 2745 Object [] row; 2746 2747 final int icons_cat = 0; 2749 final int icons_schem = 1; 2750 final int icons_name = 2; 2751 final int icons_clause = 3; 2752 2753 tables = database.schemaManager.allTablesIterator(); 2754 constraintList = new HsqlArrayList(); 2755 2756 while (tables.hasNext()) { 2757 table = (Table) tables.next(); 2758 2759 if (!isAccessibleTable(table)) { 2760 continue; 2761 } 2762 2763 tableConstraints = table.getConstraints(); 2764 constraintCount = tableConstraints.length; 2765 2766 for (int i = 0; i < constraintCount; i++) { 2767 constraint = (Constraint) tableConstraints[i]; 2768 2769 if (constraint.getType() == Constraint.CHECK) { 2770 constraintList.add(constraint); 2771 } 2772 } 2773 } 2774 2775 for (int i = 0; i < constraintList.size(); i++) { 2776 row = t.getEmptyRowData(); 2777 constraint = (Constraint) constraintList.get(i); 2778 table = constraint.getMain(); 2779 row[icons_cat] = ns.getCatalogName(table); 2780 row[icons_schem] = table.getSchemaName(); 2781 row[icons_name] = constraint.constName.name; 2782 2783 try { 2784 row[icons_clause] = constraint.core.check.getDDL(); 2785 } catch (Exception e) {} 2786 2787 t.insertSys(row); 2788 } 2789 2790 t.setDataReadOnly(true); 2791 2792 return t; 2793 } 2794 2795 2870 final Table SYSTEM_SEQUENCES() throws HsqlException { 2871 2872 Table t = sysTables[SYSTEM_SEQUENCES]; 2873 2874 if (t == null) { 2875 t = createBlankTable(sysTableHsqlNames[SYSTEM_SEQUENCES]); 2876 2877 addColumn(t, "SEQUENCE_CATALOG", Types.VARCHAR); 2878 addColumn(t, "SEQUENCE_SCHEMA", Types.VARCHAR); 2879 addColumn(t, "SEQUENCE_NAME", Types.VARCHAR, true); addColumn(t, "DTD_IDENTIFIER", Types.VARCHAR, true); addColumn(t, "MAXIMUM_VALUE", Types.VARCHAR, 20, true); addColumn(t, "MINIMUM_VALUE", Types.VARCHAR, 20, true); addColumn(t, "INCREMENT", Types.VARCHAR, 20, true); addColumn(t, "CYCLE_OPTION", Types.VARCHAR, 3, true); 2886 addColumn(t, "START_WITH", Types.VARCHAR, 20, true); 2889 t.createPrimaryKey(null, new int[] { 2892 0, 1, 2 2893 }, false); 2894 2895 return t; 2896 } 2897 2898 final int iseq_cat = 0; 2900 final int iseq_schem = 1; 2901 final int iseq_name = 2; 2902 final int iseq_dtdid = 3; 2903 final int iseq_max = 4; 2904 final int iseq_min = 5; 2905 final int iseq_incr = 6; 2906 final int iseq_cycopt = 7; 2907 final int iseq_start = 8; 2908 2909 final String min = ValuePool.getString("0"); 2911 final String intMax = 2912 ValuePool.getString(String.valueOf(Integer.MAX_VALUE)); 2913 2914 final String longMax = String.valueOf(Long.MAX_VALUE); 2916 final String cycleOption = ValuePool.getString("NO"); 2917 2918 Iterator it; 2920 Object [] row; 2921 String sequenceName; 2922 NumberSequence sequence; 2923 int dataType; 2924 2925 it = database.schemaManager.allSequencesIterator(); 2926 2927 while (it.hasNext()) { 2928 row = t.getEmptyRowData(); 2929 sequence = (NumberSequence) it.next(); 2930 dataType = sequence.getType(); 2931 sequenceName = sequence.getName().name; 2932 row[iseq_cat] = ns.getCatalogName(sequence); 2933 row[iseq_schem] = sequence.getSchemaName(); 2934 row[iseq_name] = sequenceName; 2935 row[iseq_dtdid] = Types.getTypeString(dataType); 2936 row[iseq_min] = min; 2937 row[iseq_incr] = String.valueOf(sequence.getIncrement()); 2938 row[iseq_cycopt] = cycleOption; 2939 row[iseq_start] = String.valueOf(sequence.peek()); 2940 2941 switch (dataType) { 2942 2943 case Types.INTEGER : { 2944 row[iseq_max] = intMax; 2945 2946 break; 2947 } 2948 case Types.BIGINT : 2949 default : { 2950 row[iseq_max] = longMax; 2951 2952 break; 2953 } 2954 } 2955 2956 t.insertSys(row); 2957 } 2958 2959 t.setDataReadOnly(true); 2960 2961 return t; 2962 } 2963} 2964 | Popular Tags |