提交 0ea0365c authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Add INFORMATION_SCHEMA.TABLE_CONSTRAINTS from the SQL standard

上级 65092a1d
...@@ -110,7 +110,8 @@ public class MetaTable extends Table { ...@@ -110,7 +110,8 @@ public class MetaTable extends Table {
private static final int SESSION_STATE = 27; private static final int SESSION_STATE = 27;
private static final int QUERY_STATISTICS = 28; private static final int QUERY_STATISTICS = 28;
private static final int SYNONYMS = 29; private static final int SYNONYMS = 29;
private static final int KEY_COLUMN_USAGE = 30; private static final int TABLE_CONSTRAINTS = 30;
private static final int KEY_COLUMN_USAGE = 31;
private static final int META_TABLE_TYPE_COUNT = KEY_COLUMN_USAGE + 1; private static final int META_TABLE_TYPE_COUNT = KEY_COLUMN_USAGE + 1;
private final int type; private final int type;
...@@ -558,6 +559,22 @@ public class MetaTable extends Table { ...@@ -558,6 +559,22 @@ public class MetaTable extends Table {
indexColumnName = "SYNONYM_NAME"; indexColumnName = "SYNONYM_NAME";
break; break;
} }
case TABLE_CONSTRAINTS: {
setObjectName("TABLE_CONSTRAINTS");
cols = createColumns(
"CONSTRAINT_CATALOG",
"CONSTRAINT_SCHEMA",
"CONSTRAINT_NAME",
"CONSTRAINT_TYPE",
"TABLE_CATALOG",
"TABLE_SCHEMA",
"TABLE_NAME",
"IS_DEFERRABLE",
"INITIALLY_DEFERRED"
);
indexColumnName = "TABLE_NAME";
break;
}
case KEY_COLUMN_USAGE: { case KEY_COLUMN_USAGE: {
setObjectName("KEY_COLUMN_USAGE"); setObjectName("KEY_COLUMN_USAGE");
cols = createColumns( cols = createColumns(
...@@ -1924,9 +1941,51 @@ public class MetaTable extends Table { ...@@ -1924,9 +1941,51 @@ public class MetaTable extends Table {
} }
break; break;
} }
case TABLE_CONSTRAINTS: {
for (SchemaObject obj : database.getAllSchemaObjects(DbObject.CONSTRAINT)) {
Constraint constraint = (Constraint) obj;
Constraint.Type constraintType = constraint.getConstraintType();
Table table = constraint.getTable();
if (hideTable(table, session)) {
continue;
}
String tableName = identifier(table.getName());
if (!checkIndex(session, tableName, indexFrom, indexTo)) {
continue;
}
String constraintTypeAsString;
if (constraintType == Constraint.Type.PRIMARY_KEY) {
constraintTypeAsString = "PRIMARY KEY";
} else if (constraintType == Constraint.Type.REFERENTIAL) {
constraintTypeAsString = "FOREIGN KEY";
} else {
constraintTypeAsString = constraintType.name();
}
add(rows,
// CONSTRAINT_CATALOG
catalog,
// CONSTRAINT_SCHEMA
identifier(constraint.getSchema().getName()),
// CONSTRAINT_NAME
identifier(constraint.getName()),
// CONSTRAINT_TYPE
constraintTypeAsString,
// TABLE_CATALOG
catalog,
// TABLE_SCHEMA
identifier(table.getSchema().getName()),
// TABLE_NAME
tableName,
// IS_DEFERRABLE
"NO",
// INITIALLY_DEFERRED
"NO"
);
}
break;
}
case KEY_COLUMN_USAGE: { case KEY_COLUMN_USAGE: {
for (SchemaObject obj : database.getAllSchemaObjects( for (SchemaObject obj : database.getAllSchemaObjects(DbObject.CONSTRAINT)) {
DbObject.CONSTRAINT)) {
Constraint constraint = (Constraint) obj; Constraint constraint = (Constraint) obj;
Constraint.Type constraintType = constraint.getConstraintType(); Constraint.Type constraintType = constraint.getConstraintType();
IndexColumn[] indexColumns = null; IndexColumn[] indexColumns = null;
...@@ -1969,7 +2028,7 @@ public class MetaTable extends Table { ...@@ -1969,7 +2028,7 @@ public class MetaTable extends Table {
ordinalPosition, ordinalPosition,
// POSITION_IN_UNIQUE_CONSTRAINT // POSITION_IN_UNIQUE_CONSTRAINT
(constraintType == Constraint.Type.REFERENTIAL ? ordinalPosition : null) (constraintType == Constraint.Type.REFERENTIAL ? ordinalPosition : null)
); );
} }
} }
break; break;
......
...@@ -1108,6 +1108,8 @@ public class TestMetaData extends TestBase { ...@@ -1108,6 +1108,8 @@ public class TestMetaData extends TestBase {
rs.next(); rs.next();
assertEquals("TABLES", rs.getString("TABLE_NAME")); assertEquals("TABLES", rs.getString("TABLE_NAME"));
rs.next(); rs.next();
assertEquals("TABLE_CONSTRAINTS", rs.getString("TABLE_NAME"));
rs.next();
assertEquals("TABLE_PRIVILEGES", rs.getString("TABLE_NAME")); assertEquals("TABLE_PRIVILEGES", rs.getString("TABLE_NAME"));
rs.next(); rs.next();
assertEquals("TABLE_TYPES", rs.getString("TABLE_NAME")); assertEquals("TABLE_TYPES", rs.getString("TABLE_NAME"));
......
...@@ -18,6 +18,25 @@ CREATE TABLE T2(C1 INT, C2 INT, C3 INT, C4 INT); ...@@ -18,6 +18,25 @@ CREATE TABLE T2(C1 INT, C2 INT, C3 INT, C4 INT);
ALTER TABLE T2 ADD CONSTRAINT FK_1 FOREIGN KEY (C3, C4) REFERENCES T1(C1, C3); ALTER TABLE T2 ADD CONSTRAINT FK_1 FOREIGN KEY (C3, C4) REFERENCES T1(C1, C3);
> ok > ok
ALTER TABLE T2 ADD CONSTRAINT CH_1 CHECK C4 > 0;
> ok
SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS LIMIT 0;
> CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME CONSTRAINT_TYPE TABLE_CATALOG TABLE_SCHEMA TABLE_NAME IS_DEFERRABLE INITIALLY_DEFERRED
> ------------------ ----------------- --------------- --------------- ------------- ------------ ---------- ------------- ------------------
> rows: 0
SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME, IS_DEFERRABLE, INITIALLY_DEFERRED FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_CATALOG = DATABASE() AND CONSTRAINT_SCHEMA = SCHEMA() AND TABLE_CATALOG = DATABASE() AND TABLE_SCHEMA = SCHEMA()
ORDER BY TABLE_NAME, CONSTRAINT_NAME;
> CONSTRAINT_NAME CONSTRAINT_TYPE TABLE_NAME IS_DEFERRABLE INITIALLY_DEFERRED
> --------------- --------------- ---------- ------------- ------------------
> PK_1 PRIMARY KEY T1 NO NO
> U_1 UNIQUE T1 NO NO
> CH_1 CHECK T2 NO NO
> FK_1 FOREIGN KEY T2 NO NO
> rows (ordered): 4
SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE LIMIT 0; SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE LIMIT 0;
> CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION POSITION_IN_UNIQUE_CONSTRAINT > CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION POSITION_IN_UNIQUE_CONSTRAINT
> ------------------ ----------------- --------------- ------------- ------------ ---------- ----------- ---------------- ----------------------------- > ------------------ ----------------- --------------- ------------- ------------ ---------- ----------- ---------------- -----------------------------
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论