Changeset: ad3d61b9f227 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ad3d61b9f227
Modified Files:
sql/test/information-schema/Tests/check_constraints.test
sql/test/information-schema/Tests/table_constraints.test
Branch: Aug2024
Log Message:
Extending integrity checks for check_constraints and table_constraints view
data.
diffs (275 lines):
diff --git a/sql/test/information-schema/Tests/check_constraints.test
b/sql/test/information-schema/Tests/check_constraints.test
--- a/sql/test/information-schema/Tests/check_constraints.test
+++ b/sql/test/information-schema/Tests/check_constraints.test
@@ -8,6 +8,31 @@ FROM INFORMATION_SCHEMA.CHECK_CONSTRAINT
WHERE CONSTRAINT_SCHEMA = '' OR CONSTRAINT_NAME = ''
----
+query TTTTIITI rowsort
+SELECT
+ CONSTRAINT_CATALOG,
+ CONSTRAINT_SCHEMA,
+ CONSTRAINT_NAME,
+ CHECK_CLAUSE,
+ schema_id,
+ table_id,
+ table_name,
+ key_id
+FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS
+WHERE CONSTRAINT_SCHEMA IS NULL
+ OR CONSTRAINT_SCHEMA = ''
+ OR CONSTRAINT_NAME IS NULL
+ OR CONSTRAINT_NAME = ''
+ OR CHECK_CLAUSE IS NULL
+ OR CHECK_CLAUSE = ''
+ OR schema_id IS NULL
+ OR table_id IS NULL
+ OR table_name IS NULL
+ OR table_name = ''
+ OR key_id IS NULL
+----
+
+-- entity integrity checks
query ITTT rowsort
SELECT COUNT(*) AS duplicates, CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA,
CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS
@@ -15,3 +40,72 @@ SELECT COUNT(*) AS duplicates, CONSTRAIN
HAVING COUNT(*) > 1
----
+-- as CONSTRAINT_CATALOG is always NULL the CONSTRAINT_SCHEMA, CONSTRAINT_NAME
combo should be unique also
+query ITT rowsort
+SELECT COUNT(*) AS duplicates, CONSTRAINT_SCHEMA, CONSTRAINT_NAME
+ FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS
+ GROUP BY CONSTRAINT_SCHEMA, CONSTRAINT_NAME
+ HAVING COUNT(*) > 1
+----
+
+-- it should also be unique when using schema_id instead of CONSTRAINT_SCHEMA
+query IIT rowsort
+SELECT COUNT(*) AS duplicates, schema_id, CONSTRAINT_NAME
+ FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS
+ GROUP BY schema_id, CONSTRAINT_NAME
+ HAVING COUNT(*) > 1
+----
+
+-- key_id alone should be unique also
+query II rowsort
+SELECT COUNT(*) AS duplicates, key_id
+ FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS
+ GROUP BY key_id
+ HAVING COUNT(*) > 1
+----
+
+-- referential integrity checks
+query TTT rowsort
+SELECT CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME
+ FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS
+ WHERE (CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA)
+ NOT IN (SELECT CATALOG_NAME, SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA)
+----
+
+-- as CONSTRAINT_CATALOG is always NULL leave it out of the check
+query TT rowsort
+SELECT CONSTRAINT_SCHEMA, CONSTRAINT_NAME
+ FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS
+ WHERE (CONSTRAINT_SCHEMA)
+ NOT IN (SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA)
+----
+
+-- it should also be correct when using schema_id instead of CONSTRAINT_SCHEMA
+query ITT rowsort
+SELECT schema_id, CONSTRAINT_SCHEMA, CONSTRAINT_NAME
+ FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS
+ WHERE (schema_id)
+ NOT IN (SELECT schema_id FROM INFORMATION_SCHEMA.SCHEMATA)
+----
+
+-- check schema_id reference
+query TTI rowsort
+SELECT CONSTRAINT_SCHEMA, CONSTRAINT_NAME, schema_id
+ FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS
+ WHERE (schema_id) NOT IN (SELECT id FROM sys.schemas)
+----
+
+-- check table_id reference
+query TTI rowsort
+SELECT CONSTRAINT_SCHEMA, CONSTRAINT_NAME, table_id
+ FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS
+ WHERE (table_id) NOT IN (SELECT id FROM sys.tables)
+----
+
+-- check key_id reference
+query TTI rowsort
+SELECT CONSTRAINT_SCHEMA, CONSTRAINT_NAME, key_id
+ FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS
+ WHERE (key_id) NOT IN (SELECT id FROM sys.keys UNION ALL SELECT id FROM
tmp.keys)
+----
+
diff --git a/sql/test/information-schema/Tests/table_constraints.test
b/sql/test/information-schema/Tests/table_constraints.test
--- a/sql/test/information-schema/Tests/table_constraints.test
+++ b/sql/test/information-schema/Tests/table_constraints.test
@@ -32,9 +32,24 @@ SELECT
key_type,
is_system
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
-WHERE CONSTRAINT_SCHEMA = '' OR CONSTRAINT_NAME = ''
+WHERE CONSTRAINT_SCHEMA IS NULL
+ OR CONSTRAINT_SCHEMA = ''
+ OR CONSTRAINT_NAME IS NULL
+ OR CONSTRAINT_NAME = ''
+ OR TABLE_SCHEMA IS NULL
+ OR TABLE_SCHEMA = ''
+ OR TABLE_NAME IS NULL
+ OR TABLE_NAME = ''
+ OR CONSTRAINT_TYPE IS NULL
+ OR CONSTRAINT_TYPE = ''
+ OR schema_id IS NULL
+ OR table_id IS NULL
+ OR key_id IS NULL
+ OR key_type IS NULL
+ OR is_system IS NULL
----
+-- entity integrity checks
query ITTT rowsort
SELECT COUNT(*) AS duplicates, CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA,
CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
@@ -42,3 +57,137 @@ SELECT COUNT(*) AS duplicates, CONSTRAIN
HAVING COUNT(*) > 1
----
+-- as CONSTRAINT_CATALOG is always NULL the CONSTRAINT_SCHEMA, CONSTRAINT_NAME
combo should be unique also
+query ITT rowsort
+SELECT COUNT(*) AS duplicates, CONSTRAINT_SCHEMA, CONSTRAINT_NAME
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
+ GROUP BY CONSTRAINT_SCHEMA, CONSTRAINT_NAME
+ HAVING COUNT(*) > 1
+----
+
+-- it should also be unique when using schema_id instead of CONSTRAINT_SCHEMA
+query IIT rowsort
+SELECT COUNT(*) AS duplicates, schema_id, CONSTRAINT_NAME
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
+ GROUP BY schema_id, CONSTRAINT_NAME
+ HAVING COUNT(*) > 1
+----
+
+-- key_id alone should be unique also
+query II rowsort
+SELECT COUNT(*) AS duplicates, key_id
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
+ GROUP BY key_id
+ HAVING COUNT(*) > 1
+----
+
+-- referential integrity checks
+query TTT rowsort
+SELECT CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
+ WHERE (CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA)
+ NOT IN (SELECT CATALOG_NAME, SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA)
+----
+
+-- as CONSTRAINT_CATALOG is always NULL leave it out of the check
+query TT rowsort
+SELECT CONSTRAINT_SCHEMA, CONSTRAINT_NAME
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
+ WHERE (CONSTRAINT_SCHEMA)
+ NOT IN (SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA)
+----
+
+-- it should also be correct when using schema_id instead of CONSTRAINT_SCHEMA
+query ITT rowsort
+SELECT schema_id, CONSTRAINT_SCHEMA, CONSTRAINT_NAME
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
+ WHERE (schema_id)
+ NOT IN (SELECT schema_id FROM INFORMATION_SCHEMA.SCHEMATA)
+----
+
+query TTT rowsort
+SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
+ WHERE (TABLE_CATALOG, TABLE_SCHEMA)
+ NOT IN (SELECT CATALOG_NAME, SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA)
+----
+
+-- as TABLE_CATALOG is always NULL leave it out of the check
+query TT rowsort
+SELECT TABLE_SCHEMA, TABLE_NAME
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
+ WHERE (TABLE_SCHEMA)
+ NOT IN (SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA)
+----
+
+-- it should also be correct when using schema_id instead of TABLE_SCHEMA
+query ITT rowsort
+SELECT schema_id, TABLE_SCHEMA, TABLE_NAME
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
+ WHERE (schema_id)
+ NOT IN (SELECT schema_id FROM INFORMATION_SCHEMA.SCHEMATA)
+----
+
+-- check schema_id reference
+query TTI rowsort
+SELECT CONSTRAINT_SCHEMA, CONSTRAINT_NAME, schema_id
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
+ WHERE (schema_id) NOT IN (SELECT id FROM sys.schemas)
+----
+
+-- check table_id reference
+query TTI rowsort
+SELECT CONSTRAINT_SCHEMA, CONSTRAINT_NAME, table_id
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
+ WHERE (table_id) NOT IN (SELECT id FROM sys.tables)
+----
+
+-- check key_id reference
+query TTI rowsort
+SELECT CONSTRAINT_SCHEMA, CONSTRAINT_NAME, key_id
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
+ WHERE (key_id) NOT IN (SELECT id FROM sys.keys UNION ALL SELECT id FROM
tmp.keys)
+----
+
+-- check key_type reference
+query TTI rowsort
+SELECT CONSTRAINT_SCHEMA, CONSTRAINT_NAME, key_type
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
+ WHERE (key_type) NOT IN (SELECT key_type_id FROM sys.key_types)
+----
+
+-- check CONSTRAINT_TYPE allowed values
+query TTT rowsort
+SELECT CONSTRAINT_SCHEMA, CONSTRAINT_NAME, CONSTRAINT_TYPE
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
+ WHERE (CONSTRAINT_TYPE) NOT IN ('PRIMARY KEY', 'UNIQUE', 'FOREIGN KEY',
'UNIQUE NULLS NOT DISTINCT', 'CHECK')
+----
+
+-- check IS_DEFERRABLE allowed values
+query TTT rowsort
+SELECT CONSTRAINT_SCHEMA, CONSTRAINT_NAME, IS_DEFERRABLE
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
+ WHERE (IS_DEFERRABLE) NOT IN ('NO', 'YES')
+----
+
+-- check INITIALLY_DEFERRED allowed values
+query TTT rowsort
+SELECT CONSTRAINT_SCHEMA, CONSTRAINT_NAME, INITIALLY_DEFERRED
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
+ WHERE (INITIALLY_DEFERRED) NOT IN ('NO', 'YES')
+----
+
+-- check ENFORCED allowed values
+query TTT rowsort
+SELECT CONSTRAINT_SCHEMA, CONSTRAINT_NAME, ENFORCED
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
+ WHERE (ENFORCED) NOT IN ('NO', 'YES')
+----
+
+-- check is_system allowed boolean values
+query TTI rowsort
+SELECT CONSTRAINT_SCHEMA, CONSTRAINT_NAME, is_system
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
+ WHERE (is_system) NOT IN (FALSE, TRUE)
+----
+
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]