Skip to content

Commit f649e06

Browse files
authored
chore: modify metadata queries to support named schemas (#1449)
Modify metadata queries so these are able to handle multiple named schemas in the same database, potentially with tables and indexes with the same names in different schemas.
1 parent 90fad38 commit f649e06

File tree

7 files changed

+73
-23
lines changed

7 files changed

+73
-23
lines changed

src/main/java/com/google/cloud/spanner/jdbc/JdbcConnection.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,7 @@ public String getSchema() throws SQLException {
492492

493493
@Nonnull
494494
String getDefaultSchema() {
495+
// TODO: Update to use getDialect()#getDefaultSchema() when available.
495496
switch (getDialect()) {
496497
case POSTGRESQL:
497498
return "public";

src/main/resources/com/google/cloud/spanner/jdbc/DatabaseMetaData_GetCrossReferences.sql

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,28 @@
1616

1717
SELECT *
1818
FROM (
19-
SELECT PARENT.TABLE_CATALOG AS PKTABLE_CAT, PARENT.TABLE_SCHEMA AS PKTABLE_SCHEM, PARENT.TABLE_NAME AS PKTABLE_NAME,
20-
PARENT.COLUMN_NAME AS PKCOLUMN_NAME, CHILD.TABLE_CATALOG AS FKTABLE_CAT, CHILD.TABLE_SCHEMA AS FKTABLE_SCHEM,
21-
CHILD.TABLE_NAME AS FKTABLE_NAME, CHILD.COLUMN_NAME AS FKCOLUMN_NAME, CHILD.ORDINAL_POSITION AS KEY_SEQ, 3 AS UPDATE_RULE,
22-
CASE WHEN TABLES.ON_DELETE_ACTION='CASCADE' THEN 0 ELSE 3 END AS DELETE_RULE, NULL AS FK_NAME, 'PRIMARY_KEY' AS PK_NAME,
19+
SELECT PARENT_TABLE.TABLE_CATALOG AS PKTABLE_CAT, PARENT_TABLE.TABLE_SCHEMA AS PKTABLE_SCHEM, PARENT_TABLE.TABLE_NAME AS PKTABLE_NAME,
20+
PARENT_INDEX_COLUMNS.COLUMN_NAME AS PKCOLUMN_NAME, CHILD_TABLE.TABLE_CATALOG AS FKTABLE_CAT, CHILD_TABLE.TABLE_SCHEMA AS FKTABLE_SCHEM,
21+
CHILD_TABLE.TABLE_NAME AS FKTABLE_NAME, PARENT_INDEX_COLUMNS.COLUMN_NAME AS FKCOLUMN_NAME, PARENT_INDEX_COLUMNS.ORDINAL_POSITION AS KEY_SEQ,
22+
3 AS UPDATE_RULE,
23+
CASE WHEN CHILD_TABLE.ON_DELETE_ACTION='CASCADE' THEN 0 ELSE 3 END AS DELETE_RULE,
24+
NULL AS FK_NAME, 'PRIMARY_KEY' AS PK_NAME,
2325
7 AS DEFERRABILITY
24-
FROM INFORMATION_SCHEMA.INDEX_COLUMNS PARENT
25-
INNER JOIN INFORMATION_SCHEMA.INDEXES PARENT_INDEX ON PARENT.INDEX_NAME=PARENT_INDEX.INDEX_NAME AND PARENT.TABLE_NAME=PARENT_INDEX.TABLE_NAME AND PARENT.TABLE_SCHEMA=PARENT_INDEX.TABLE_SCHEMA AND PARENT.TABLE_CATALOG=PARENT_INDEX.TABLE_CATALOG AND PARENT_INDEX.INDEX_TYPE='PRIMARY_KEY'
26-
INNER JOIN INFORMATION_SCHEMA.INDEX_COLUMNS CHILD ON NOT PARENT.TABLE_NAME=CHILD.TABLE_NAME AND PARENT.COLUMN_NAME=CHILD.COLUMN_NAME
27-
INNER JOIN INFORMATION_SCHEMA.INDEXES CHILD_INDEX ON CHILD.INDEX_NAME=CHILD_INDEX.INDEX_NAME AND CHILD.TABLE_NAME=CHILD_INDEX.TABLE_NAME AND CHILD.TABLE_SCHEMA=CHILD_INDEX.TABLE_SCHEMA AND CHILD.TABLE_CATALOG=CHILD_INDEX.TABLE_CATALOG AND CHILD_INDEX.INDEX_TYPE='PRIMARY_KEY'
28-
INNER JOIN INFORMATION_SCHEMA.TABLES ON CHILD.TABLE_CATALOG=TABLES.TABLE_CATALOG AND CHILD.TABLE_SCHEMA=TABLES.TABLE_SCHEMA AND CHILD.TABLE_NAME=TABLES.TABLE_NAME AND PARENT.TABLE_NAME=TABLES.PARENT_TABLE_NAME
29-
WHERE PARENT_INDEX.INDEX_TYPE='PRIMARY_KEY' AND CHILD.ORDINAL_POSITION IS NOT NULL
26+
FROM INFORMATION_SCHEMA.TABLES PARENT_TABLE
27+
INNER JOIN INFORMATION_SCHEMA.INDEXES PARENT_INDEX ON
28+
PARENT_INDEX.TABLE_NAME=PARENT_TABLE.TABLE_NAME
29+
AND PARENT_INDEX.TABLE_SCHEMA=PARENT_TABLE.TABLE_SCHEMA
30+
AND PARENT_INDEX.TABLE_CATALOG=PARENT_TABLE.TABLE_CATALOG
31+
AND PARENT_INDEX.INDEX_TYPE='PRIMARY_KEY'
32+
INNER JOIN INFORMATION_SCHEMA.INDEX_COLUMNS PARENT_INDEX_COLUMNS ON
33+
PARENT_INDEX_COLUMNS.TABLE_NAME=PARENT_INDEX.TABLE_NAME
34+
AND PARENT_INDEX_COLUMNS.TABLE_SCHEMA=PARENT_INDEX.TABLE_SCHEMA
35+
AND PARENT_INDEX_COLUMNS.TABLE_CATALOG=PARENT_INDEX.TABLE_CATALOG
36+
AND PARENT_INDEX_COLUMNS.INDEX_NAME=PARENT_INDEX.INDEX_NAME
37+
INNER JOIN INFORMATION_SCHEMA.TABLES CHILD_TABLE ON
38+
CHILD_TABLE.PARENT_TABLE_NAME=PARENT_TABLE.TABLE_NAME
39+
AND CHILD_TABLE.TABLE_SCHEMA=PARENT_TABLE.TABLE_SCHEMA
40+
AND CHILD_TABLE.TABLE_CATALOG=PARENT_TABLE.TABLE_CATALOG
3041

3142
UNION ALL
3243

@@ -36,8 +47,15 @@ FROM (
3647
3 AS DELETE_RULE, CONSTRAINTS.CONSTRAINT_NAME AS FK_NAME, CONSTRAINTS.UNIQUE_CONSTRAINT_NAME AS PK_NAME,
3748
7 AS DEFERRABILITY
3849
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS CONSTRAINTS
39-
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CHILD ON CONSTRAINTS.CONSTRAINT_CATALOG=CHILD.CONSTRAINT_CATALOG AND CONSTRAINTS.CONSTRAINT_SCHEMA= CHILD.CONSTRAINT_SCHEMA AND CONSTRAINTS.CONSTRAINT_NAME= CHILD.CONSTRAINT_NAME
40-
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE PARENT ON CONSTRAINTS.UNIQUE_CONSTRAINT_CATALOG=PARENT.CONSTRAINT_CATALOG AND CONSTRAINTS.UNIQUE_CONSTRAINT_SCHEMA=PARENT.CONSTRAINT_SCHEMA AND CONSTRAINTS.UNIQUE_CONSTRAINT_NAME=PARENT.CONSTRAINT_NAME AND PARENT.ORDINAL_POSITION=CHILD.POSITION_IN_UNIQUE_CONSTRAINT
50+
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CHILD ON
51+
CONSTRAINTS.CONSTRAINT_CATALOG=CHILD.CONSTRAINT_CATALOG
52+
AND CONSTRAINTS.CONSTRAINT_SCHEMA= CHILD.CONSTRAINT_SCHEMA
53+
AND CONSTRAINTS.CONSTRAINT_NAME= CHILD.CONSTRAINT_NAME
54+
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE PARENT ON
55+
CONSTRAINTS.UNIQUE_CONSTRAINT_CATALOG=PARENT.CONSTRAINT_CATALOG
56+
AND CONSTRAINTS.UNIQUE_CONSTRAINT_SCHEMA=PARENT.CONSTRAINT_SCHEMA
57+
AND CONSTRAINTS.UNIQUE_CONSTRAINT_NAME=PARENT.CONSTRAINT_NAME
58+
AND PARENT.ORDINAL_POSITION=CHILD.POSITION_IN_UNIQUE_CONSTRAINT
4159
) AS CROSS_REF
4260
WHERE UPPER(PKTABLE_CAT) LIKE ?
4361
AND UPPER(PKTABLE_SCHEM) LIKE ?

src/main/resources/com/google/cloud/spanner/jdbc/DatabaseMetaData_GetExportedKeys.sql

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,15 @@ FROM (
2626
NULL AS FK_NAME, 'PRIMARY_KEY' AS PK_NAME,
2727
7 AS DEFERRABILITY -- 7 = importedKeyNotDeferrable
2828
FROM INFORMATION_SCHEMA.TABLES PARENT
29-
INNER JOIN INFORMATION_SCHEMA.TABLES CHILD ON CHILD.PARENT_TABLE_NAME=PARENT.TABLE_NAME
29+
INNER JOIN INFORMATION_SCHEMA.TABLES CHILD ON
30+
CHILD.TABLE_CATALOG=PARENT.TABLE_CATALOG
31+
AND CHILD.TABLE_SCHEMA=PARENT.TABLE_SCHEMA
32+
AND CHILD.PARENT_TABLE_NAME=PARENT.TABLE_NAME
3033
INNER JOIN INFORMATION_SCHEMA.INDEX_COLUMNS PARENT_INDEX_COLUMNS ON
31-
PARENT_INDEX_COLUMNS.TABLE_NAME=PARENT.TABLE_NAME
32-
AND PARENT_INDEX_COLUMNS.INDEX_NAME='PRIMARY_KEY'
34+
PARENT_INDEX_COLUMNS.TABLE_CATALOG=PARENT.TABLE_CATALOG
35+
AND PARENT_INDEX_COLUMNS.TABLE_SCHEMA=PARENT.TABLE_SCHEMA
36+
AND PARENT_INDEX_COLUMNS.TABLE_NAME=PARENT.TABLE_NAME
37+
AND PARENT_INDEX_COLUMNS.INDEX_NAME='PRIMARY_KEY'
3338

3439
UNION ALL
3540

src/main/resources/com/google/cloud/spanner/jdbc/DatabaseMetaData_GetImportedKeys.sql

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,14 @@ FROM (
2626
NULL AS FK_NAME, 'PRIMARY_KEY' AS PK_NAME,
2727
7 AS DEFERRABILITY -- 7 = importedKeyNotDeferrable
2828
FROM INFORMATION_SCHEMA.TABLES PARENT
29-
INNER JOIN INFORMATION_SCHEMA.TABLES CHILD ON CHILD.PARENT_TABLE_NAME=PARENT.TABLE_NAME
29+
INNER JOIN INFORMATION_SCHEMA.TABLES CHILD ON
30+
CHILD.TABLE_CATALOG=PARENT.TABLE_CATALOG
31+
AND CHILD.TABLE_SCHEMA=PARENT.TABLE_SCHEMA
32+
AND CHILD.PARENT_TABLE_NAME=PARENT.TABLE_NAME
3033
INNER JOIN INFORMATION_SCHEMA.INDEX_COLUMNS PARENT_INDEX_COLUMNS ON
31-
PARENT_INDEX_COLUMNS.TABLE_NAME=PARENT.TABLE_NAME
34+
PARENT_INDEX_COLUMNS.TABLE_CATALOG=PARENT.TABLE_CATALOG
35+
AND PARENT_INDEX_COLUMNS.TABLE_SCHEMA=PARENT.TABLE_SCHEMA
36+
AND PARENT_INDEX_COLUMNS.TABLE_NAME=PARENT.TABLE_NAME
3237
AND PARENT_INDEX_COLUMNS.INDEX_NAME='PRIMARY_KEY'
3338

3439
UNION ALL

src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetCrossReferences.sql

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,15 @@ SELECT PARENT.TABLE_CATALOG AS "PKTABLE_CAT", PARENT.TABLE_SCHEMA AS "PKTABLE_SC
2020
3 AS "DELETE_RULE", CONSTRAINTS.CONSTRAINT_NAME AS "FK_NAME", CONSTRAINTS.UNIQUE_CONSTRAINT_NAME AS "PK_NAME",
2121
7 AS "DEFERRABILITY"
2222
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS CONSTRAINTS
23-
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CHILD ON COALESCE(CONSTRAINTS.CONSTRAINT_CATALOG, '')=COALESCE(CHILD.CONSTRAINT_CATALOG, '') AND CONSTRAINTS.CONSTRAINT_SCHEMA= CHILD.CONSTRAINT_SCHEMA AND CONSTRAINTS.CONSTRAINT_NAME= CHILD.CONSTRAINT_NAME
24-
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE PARENT ON COALESCE(CONSTRAINTS.UNIQUE_CONSTRAINT_CATALOG, '')=COALESCE(PARENT.CONSTRAINT_CATALOG, '') AND CONSTRAINTS.UNIQUE_CONSTRAINT_SCHEMA=PARENT.CONSTRAINT_SCHEMA AND CONSTRAINTS.UNIQUE_CONSTRAINT_NAME=PARENT.CONSTRAINT_NAME AND PARENT.ORDINAL_POSITION=CHILD.POSITION_IN_UNIQUE_CONSTRAINT
23+
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CHILD ON
24+
COALESCE(CONSTRAINTS.CONSTRAINT_CATALOG, '')=COALESCE(CHILD.CONSTRAINT_CATALOG, '')
25+
AND CONSTRAINTS.CONSTRAINT_SCHEMA= CHILD.CONSTRAINT_SCHEMA
26+
AND CONSTRAINTS.CONSTRAINT_NAME= CHILD.CONSTRAINT_NAME
27+
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE PARENT ON
28+
COALESCE(CONSTRAINTS.UNIQUE_CONSTRAINT_CATALOG, '')=COALESCE(PARENT.CONSTRAINT_CATALOG, '')
29+
AND CONSTRAINTS.UNIQUE_CONSTRAINT_SCHEMA=PARENT.CONSTRAINT_SCHEMA
30+
AND CONSTRAINTS.UNIQUE_CONSTRAINT_NAME=PARENT.CONSTRAINT_NAME
31+
AND PARENT.ORDINAL_POSITION=CHILD.POSITION_IN_UNIQUE_CONSTRAINT
2532
WHERE UPPER(COALESCE(PARENT.TABLE_CATALOG, '')) LIKE ?
2633
AND UPPER(PARENT.TABLE_SCHEMA) LIKE ?
2734
AND UPPER(PARENT.TABLE_NAME) LIKE ?

src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetExportedKeys.sql

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,15 @@ SELECT PARENT.TABLE_CATALOG AS "PKTABLE_CAT", PARENT.TABLE_SCHEMA AS "PKTABLE_SC
2323
CONSTRAINTS.CONSTRAINT_NAME AS "FK_NAME", CONSTRAINTS.UNIQUE_CONSTRAINT_NAME AS "PK_NAME",
2424
7 AS "DEFERRABILITY" -- 7 = importedKeyNotDeferrable
2525
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS CONSTRAINTS
26-
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CHILD ON COALESCE(CONSTRAINTS.CONSTRAINT_CATALOG, '')=COALESCE(CHILD.CONSTRAINT_CATALOG, '') AND CONSTRAINTS.CONSTRAINT_SCHEMA= CHILD.CONSTRAINT_SCHEMA AND CONSTRAINTS.CONSTRAINT_NAME= CHILD.CONSTRAINT_NAME
27-
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE PARENT ON COALESCE(CONSTRAINTS.UNIQUE_CONSTRAINT_CATALOG, '')=COALESCE(PARENT.CONSTRAINT_CATALOG, '') AND CONSTRAINTS.UNIQUE_CONSTRAINT_SCHEMA=PARENT.CONSTRAINT_SCHEMA AND CONSTRAINTS.UNIQUE_CONSTRAINT_NAME=PARENT.CONSTRAINT_NAME AND PARENT.ORDINAL_POSITION=CHILD.POSITION_IN_UNIQUE_CONSTRAINT
26+
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CHILD ON
27+
COALESCE(CONSTRAINTS.CONSTRAINT_CATALOG, '')=COALESCE(CHILD.CONSTRAINT_CATALOG, '')
28+
AND CONSTRAINTS.CONSTRAINT_SCHEMA= CHILD.CONSTRAINT_SCHEMA
29+
AND CONSTRAINTS.CONSTRAINT_NAME= CHILD.CONSTRAINT_NAME
30+
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE PARENT ON
31+
COALESCE(CONSTRAINTS.UNIQUE_CONSTRAINT_CATALOG, '')=COALESCE(PARENT.CONSTRAINT_CATALOG, '')
32+
AND CONSTRAINTS.UNIQUE_CONSTRAINT_SCHEMA=PARENT.CONSTRAINT_SCHEMA
33+
AND CONSTRAINTS.UNIQUE_CONSTRAINT_NAME=PARENT.CONSTRAINT_NAME
34+
AND PARENT.ORDINAL_POSITION=CHILD.POSITION_IN_UNIQUE_CONSTRAINT
2835
WHERE UPPER(COALESCE(PARENT.TABLE_CATALOG, '')) LIKE ?
2936
AND UPPER(PARENT.TABLE_SCHEMA) LIKE ?
3037
AND UPPER(PARENT.TABLE_NAME) LIKE ?

src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetImportedKeys.sql

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,15 @@ SELECT PARENT.TABLE_CATALOG AS "PKTABLE_CAT", PARENT.TABLE_SCHEMA AS "PKTABLE_SC
2323
CONSTRAINTS.CONSTRAINT_NAME AS "FK_NAME", CONSTRAINTS.UNIQUE_CONSTRAINT_NAME AS "PK_NAME",
2424
7 AS "DEFERRABILITY" -- 7 = importedKeyNotDeferrable
2525
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS CONSTRAINTS
26-
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CHILD ON COALESCE(CONSTRAINTS.CONSTRAINT_CATALOG, '')=COALESCE(CHILD.CONSTRAINT_CATALOG, '') AND CONSTRAINTS.CONSTRAINT_SCHEMA= CHILD.CONSTRAINT_SCHEMA AND CONSTRAINTS.CONSTRAINT_NAME= CHILD.CONSTRAINT_NAME
27-
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE PARENT ON COALESCE(CONSTRAINTS.UNIQUE_CONSTRAINT_CATALOG, '')=COALESCE(PARENT.CONSTRAINT_CATALOG, '') AND CONSTRAINTS.UNIQUE_CONSTRAINT_SCHEMA=PARENT.CONSTRAINT_SCHEMA AND CONSTRAINTS.UNIQUE_CONSTRAINT_NAME=PARENT.CONSTRAINT_NAME AND PARENT.ORDINAL_POSITION=CHILD.POSITION_IN_UNIQUE_CONSTRAINT
26+
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CHILD ON
27+
COALESCE(CONSTRAINTS.CONSTRAINT_CATALOG, '')=COALESCE(CHILD.CONSTRAINT_CATALOG, '')
28+
AND CONSTRAINTS.CONSTRAINT_SCHEMA= CHILD.CONSTRAINT_SCHEMA
29+
AND CONSTRAINTS.CONSTRAINT_NAME= CHILD.CONSTRAINT_NAME
30+
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE PARENT ON
31+
COALESCE(CONSTRAINTS.UNIQUE_CONSTRAINT_CATALOG, '')=COALESCE(PARENT.CONSTRAINT_CATALOG, '')
32+
AND CONSTRAINTS.UNIQUE_CONSTRAINT_SCHEMA=PARENT.CONSTRAINT_SCHEMA
33+
AND CONSTRAINTS.UNIQUE_CONSTRAINT_NAME=PARENT.CONSTRAINT_NAME
34+
AND PARENT.ORDINAL_POSITION=CHILD.POSITION_IN_UNIQUE_CONSTRAINT
2835
WHERE UPPER(COALESCE(CHILD.TABLE_CATALOG, '')) LIKE ?
2936
AND UPPER(CHILD.TABLE_SCHEMA) LIKE ?
3037
AND UPPER(CHILD.TABLE_NAME) LIKE ?

0 commit comments

Comments
 (0)