@@ -299,23 +299,24 @@ public java.sql.ResultSet getCrossReference(String primaryCatalog, String primar
299
299
primaryDb = this .pedantic ? primaryDb : StringUtils .unQuoteIdentifier (primaryDb , this .quotedId );
300
300
foreignDb = this .pedantic ? foreignDb : StringUtils .unQuoteIdentifier (foreignDb , this .quotedId );
301
301
302
- StringBuilder sqlBuf = new StringBuilder (
303
- this . databaseTerm . getValue () == DatabaseTerm . SCHEMA ? "SELECT A.CONSTRAINT_CATALOG AS PKTABLE_CAT, A.REFERENCED_TABLE_SCHEMA AS PKTABLE_SCHEM,"
304
- : "SELECT A.REFERENCED_TABLE_SCHEMA AS PKTABLE_CAT,NULL AS PKTABLE_SCHEM," );
302
+ StringBuilder sqlBuf = new StringBuilder (this . databaseTerm . getValue () == DatabaseTerm . SCHEMA
303
+ ? "SELECT DISTINCT A.CONSTRAINT_CATALOG AS PKTABLE_CAT, A.REFERENCED_TABLE_SCHEMA AS PKTABLE_SCHEM,"
304
+ : "SELECT DISTINCT A.REFERENCED_TABLE_SCHEMA AS PKTABLE_CAT,NULL AS PKTABLE_SCHEM," );
305
305
sqlBuf .append (" A.REFERENCED_TABLE_NAME AS PKTABLE_NAME, A.REFERENCED_COLUMN_NAME AS PKCOLUMN_NAME," );
306
306
sqlBuf .append (this .databaseTerm .getValue () == DatabaseTerm .SCHEMA ? " A.TABLE_CATALOG AS FKTABLE_CAT, A.TABLE_SCHEMA AS FKTABLE_SCHEM,"
307
307
: " A.TABLE_SCHEMA AS FKTABLE_CAT, NULL AS FKTABLE_SCHEM," );
308
308
sqlBuf .append (" A.TABLE_NAME AS FKTABLE_NAME, A.COLUMN_NAME AS FKCOLUMN_NAME, A.ORDINAL_POSITION AS KEY_SEQ," );
309
309
sqlBuf .append (generateUpdateRuleClause ());
310
310
sqlBuf .append (" AS UPDATE_RULE," );
311
311
sqlBuf .append (generateDeleteRuleClause ());
312
- sqlBuf .append (" AS DELETE_RULE, A.CONSTRAINT_NAME AS FK_NAME," );
313
- sqlBuf .append (" (SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA = A.REFERENCED_TABLE_SCHEMA" );
314
- sqlBuf .append (" AND TABLE_NAME = A.REFERENCED_TABLE_NAME AND CONSTRAINT_TYPE IN ('UNIQUE','PRIMARY KEY') LIMIT 1) AS PK_NAME, " );
312
+ sqlBuf .append (" AS DELETE_RULE, A.CONSTRAINT_NAME AS FK_NAME, TC.CONSTRAINT_NAME AS PK_NAME," );
315
313
sqlBuf .append (importedKeyNotDeferrable );
316
314
sqlBuf .append (" AS DEFERRABILITY FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE A" );
317
315
sqlBuf .append (" JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS B USING (TABLE_SCHEMA, TABLE_NAME, CONSTRAINT_NAME) " );
318
316
sqlBuf .append (generateOptionalRefContraintsJoin ());
317
+ sqlBuf .append (" LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC ON (A.REFERENCED_TABLE_SCHEMA = TC.TABLE_SCHEMA" );
318
+ sqlBuf .append (" AND A.REFERENCED_TABLE_NAME = TC.TABLE_NAME" );
319
+ sqlBuf .append (" AND TC.CONSTRAINT_TYPE IN ('UNIQUE', 'PRIMARY KEY'))" );
319
320
sqlBuf .append ("WHERE B.CONSTRAINT_TYPE = 'FOREIGN KEY'" );
320
321
if (primaryDb != null ) {
321
322
sqlBuf .append (" AND A.REFERENCED_TABLE_SCHEMA=?" );
@@ -363,23 +364,24 @@ public java.sql.ResultSet getExportedKeys(String catalog, String schema, String
363
364
364
365
db = this .pedantic ? db : StringUtils .unQuoteIdentifier (db , this .quotedId );
365
366
366
- StringBuilder sqlBuf = new StringBuilder (
367
- this . databaseTerm . getValue () == DatabaseTerm . SCHEMA ? "SELECT A.CONSTRAINT_CATALOG AS PKTABLE_CAT, A.REFERENCED_TABLE_SCHEMA AS PKTABLE_SCHEM,"
368
- : "SELECT A.REFERENCED_TABLE_SCHEMA AS PKTABLE_CAT,NULL AS PKTABLE_SCHEM," );
367
+ StringBuilder sqlBuf = new StringBuilder (this . databaseTerm . getValue () == DatabaseTerm . SCHEMA
368
+ ? "SELECT DISTINCT A.CONSTRAINT_CATALOG AS PKTABLE_CAT, A.REFERENCED_TABLE_SCHEMA AS PKTABLE_SCHEM,"
369
+ : "SELECT DISTINCT A.REFERENCED_TABLE_SCHEMA AS PKTABLE_CAT,NULL AS PKTABLE_SCHEM," );
369
370
sqlBuf .append (" A.REFERENCED_TABLE_NAME AS PKTABLE_NAME, A.REFERENCED_COLUMN_NAME AS PKCOLUMN_NAME," );
370
371
sqlBuf .append (this .databaseTerm .getValue () == DatabaseTerm .SCHEMA ? " A.TABLE_CATALOG AS FKTABLE_CAT, A.TABLE_SCHEMA AS FKTABLE_SCHEM,"
371
372
: " A.TABLE_SCHEMA AS FKTABLE_CAT, NULL AS FKTABLE_SCHEM," );
372
373
sqlBuf .append (" A.TABLE_NAME AS FKTABLE_NAME, A.COLUMN_NAME AS FKCOLUMN_NAME, A.ORDINAL_POSITION AS KEY_SEQ," );
373
374
sqlBuf .append (generateUpdateRuleClause ());
374
375
sqlBuf .append (" AS UPDATE_RULE," );
375
376
sqlBuf .append (generateDeleteRuleClause ());
376
- sqlBuf .append (" AS DELETE_RULE, A.CONSTRAINT_NAME AS FK_NAME, (SELECT CONSTRAINT_NAME FROM" );
377
- sqlBuf .append (" INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA = A.REFERENCED_TABLE_SCHEMA AND" );
378
- sqlBuf .append (" TABLE_NAME = A.REFERENCED_TABLE_NAME AND CONSTRAINT_TYPE IN ('UNIQUE','PRIMARY KEY') LIMIT 1) AS PK_NAME," );
377
+ sqlBuf .append (" AS DELETE_RULE, A.CONSTRAINT_NAME AS FK_NAME, TC.CONSTRAINT_NAME AS PK_NAME," );
379
378
sqlBuf .append (importedKeyNotDeferrable );
380
379
sqlBuf .append (" AS DEFERRABILITY FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE A" );
381
380
sqlBuf .append (" JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS B USING (TABLE_SCHEMA, TABLE_NAME, CONSTRAINT_NAME) " );
382
381
sqlBuf .append (generateOptionalRefContraintsJoin ());
382
+ sqlBuf .append (" LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC ON (A.REFERENCED_TABLE_SCHEMA = TC.TABLE_SCHEMA" );
383
+ sqlBuf .append (" AND A.REFERENCED_TABLE_NAME = TC.TABLE_NAME" );
384
+ sqlBuf .append (" AND TC.CONSTRAINT_TYPE IN ('UNIQUE', 'PRIMARY KEY'))" );
383
385
sqlBuf .append (" WHERE B.CONSTRAINT_TYPE = 'FOREIGN KEY'" );
384
386
if (db != null ) {
385
387
sqlBuf .append (" AND A.REFERENCED_TABLE_SCHEMA = ?" );
@@ -441,23 +443,24 @@ public java.sql.ResultSet getImportedKeys(String catalog, String schema, String
441
443
442
444
db = this .pedantic ? db : StringUtils .unQuoteIdentifier (db , this .quotedId );
443
445
444
- StringBuilder sqlBuf = new StringBuilder (
445
- this . databaseTerm . getValue () == DatabaseTerm . SCHEMA ? "SELECT A.CONSTRAINT_CATALOG AS PKTABLE_CAT, A.REFERENCED_TABLE_SCHEMA AS PKTABLE_SCHEM,"
446
- : "SELECT A.REFERENCED_TABLE_SCHEMA AS PKTABLE_CAT,NULL AS PKTABLE_SCHEM," );
446
+ StringBuilder sqlBuf = new StringBuilder (this . databaseTerm . getValue () == DatabaseTerm . SCHEMA
447
+ ? "SELECT DISTINCT A.CONSTRAINT_CATALOG AS PKTABLE_CAT, A.REFERENCED_TABLE_SCHEMA AS PKTABLE_SCHEM,"
448
+ : "SELECT DISTINCT A.REFERENCED_TABLE_SCHEMA AS PKTABLE_CAT,NULL AS PKTABLE_SCHEM," );
447
449
sqlBuf .append (" A.REFERENCED_TABLE_NAME AS PKTABLE_NAME, A.REFERENCED_COLUMN_NAME AS PKCOLUMN_NAME," );
448
450
sqlBuf .append (this .databaseTerm .getValue () == DatabaseTerm .SCHEMA ? " A.TABLE_CATALOG AS FKTABLE_CAT, A.TABLE_SCHEMA AS FKTABLE_SCHEM,"
449
451
: " A.TABLE_SCHEMA AS FKTABLE_CAT, NULL AS FKTABLE_SCHEM," );
450
452
sqlBuf .append (" A.TABLE_NAME AS FKTABLE_NAME, A.COLUMN_NAME AS FKCOLUMN_NAME, A.ORDINAL_POSITION AS KEY_SEQ," );
451
453
sqlBuf .append (generateUpdateRuleClause ());
452
454
sqlBuf .append (" AS UPDATE_RULE," );
453
455
sqlBuf .append (generateDeleteRuleClause ());
454
- sqlBuf .append (" AS DELETE_RULE, A.CONSTRAINT_NAME AS FK_NAME, (SELECT CONSTRAINT_NAME FROM" );
455
- sqlBuf .append (" INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA = A.REFERENCED_TABLE_SCHEMA AND" );
456
- sqlBuf .append (" TABLE_NAME = A.REFERENCED_TABLE_NAME AND CONSTRAINT_TYPE IN ('UNIQUE','PRIMARY KEY') LIMIT 1) AS PK_NAME," );
456
+ sqlBuf .append (" AS DELETE_RULE, A.CONSTRAINT_NAME AS FK_NAME, TC.CONSTRAINT_NAME AS PK_NAME," );
457
457
sqlBuf .append (importedKeyNotDeferrable );
458
458
sqlBuf .append (" AS DEFERRABILITY FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE A" );
459
459
sqlBuf .append (" JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS B USING (CONSTRAINT_NAME, TABLE_NAME) " );
460
460
sqlBuf .append (generateOptionalRefContraintsJoin ());
461
+ sqlBuf .append (" LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC ON (A.REFERENCED_TABLE_SCHEMA = TC.TABLE_SCHEMA" );
462
+ sqlBuf .append (" AND A.REFERENCED_TABLE_NAME = TC.TABLE_NAME" );
463
+ sqlBuf .append (" AND TC.CONSTRAINT_TYPE IN ('UNIQUE', 'PRIMARY KEY'))" );
461
464
sqlBuf .append ("WHERE B.CONSTRAINT_TYPE = 'FOREIGN KEY'" );
462
465
if (db != null ) {
463
466
sqlBuf .append (" AND A.TABLE_SCHEMA = ?" );
0 commit comments