Skip to content

Commit 8b40d85

Browse files
author
Axyoan Marcelo
committed
Fix for Bug#113600 (Bug#36171575), Contribution: Fix join condition for retrieval of imported primary keys.
Change-Id: I94d36d86bb8cd6aa3992a03d99d76f0e0bbdbca3
1 parent e629456 commit 8b40d85

File tree

3 files changed

+84
-1
lines changed

3 files changed

+84
-1
lines changed

CHANGES

+3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33

44
Version 8.4.0
55

6+
- Fix for Bug#113600 (Bug#36171575), Contribution: Fix join condition for retrieval of imported primary keys.
7+
Thanks to Henning Pöttker for his contribution.
8+
69
- WL#16196, GPL License Exception Update.
710

811
- Fix for Bug#111031 (Bug#35392222), Contribution: Update SyntaxRegressionTest.java.

src/main/user-impl/java/com/mysql/cj/jdbc/DatabaseMetaDataUsingInfoSchema.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ public java.sql.ResultSet getImportedKeys(String catalog, String schema, String
447447
sqlBuf.append(" AS DELETE_RULE, A.CONSTRAINT_NAME AS FK_NAME, R.UNIQUE_CONSTRAINT_NAME AS PK_NAME,");
448448
sqlBuf.append(importedKeyNotDeferrable);
449449
sqlBuf.append(" AS DEFERRABILITY FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE A");
450-
sqlBuf.append(" JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS B USING (CONSTRAINT_NAME, TABLE_NAME) ");
450+
sqlBuf.append(" JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS B USING (CONSTRAINT_SCHEMA, CONSTRAINT_NAME, TABLE_NAME) ");
451451
sqlBuf.append(generateOptionalRefContraintsJoin());
452452
sqlBuf.append("WHERE B.CONSTRAINT_TYPE = 'FOREIGN KEY'");
453453
if (db != null) {

src/test/java/testsuite/regression/MetaDataRegressionTest.java

+80
Original file line numberDiff line numberDiff line change
@@ -5580,4 +5580,84 @@ void testBug91550() throws Exception {
55805580
assertEquals("$", md.getExtraNameCharacters());
55815581
}
55825582

5583+
/**
5584+
* Tests fix for Bug#113600 (Bug#36171575), Contribution: Fix join condition for retrieval of imported primary keys.
5585+
*
5586+
* @throws Exception
5587+
*/
5588+
@Test
5589+
public void testBug113600() throws Exception {
5590+
String databaseName1 = "dbBug113600_1";
5591+
String databaseName2 = "dbBug113600_2";
5592+
if (isServerRunningOnWindows()) {
5593+
databaseName1 = databaseName1.toLowerCase();
5594+
databaseName2 = databaseName2.toLowerCase();
5595+
}
5596+
String tableName1 = "table1";
5597+
String tableName2 = "table2";
5598+
String constraintName = "fk_table2_fk_id";
5599+
5600+
createDatabase(databaseName1);
5601+
createTable(databaseName1 + "." + tableName1, "(`ID` bigint unsigned AUTO_INCREMENT PRIMARY KEY)");
5602+
createTable(databaseName1 + "." + tableName2, "(`ID` bigint unsigned AUTO_INCREMENT PRIMARY KEY, `FK_ID` bigint unsigned NOT NULL," + "CONSTRAINT `"
5603+
+ constraintName + "` FOREIGN KEY (`FK_ID`) REFERENCES `" + databaseName1 + "`.`" + tableName1 + "` (`ID`) ON DELETE CASCADE)");
5604+
createDatabase(databaseName2);
5605+
createTable(databaseName2 + "." + tableName1, "(`ID` bigint unsigned AUTO_INCREMENT PRIMARY KEY)");
5606+
createTable(databaseName2 + "." + tableName2, "(`ID` bigint unsigned AUTO_INCREMENT PRIMARY KEY, `FK_ID` bigint unsigned NOT NULL," + "CONSTRAINT `"
5607+
+ constraintName + "` FOREIGN KEY (`FK_ID`) REFERENCES `" + databaseName2 + "`.`" + tableName1 + "` (`ID`) ON DELETE RESTRICT)");
5608+
5609+
Properties props = new Properties();
5610+
props.setProperty(PropertyKey.sslMode.getKeyName(), SslMode.DISABLED.name());
5611+
props.setProperty(PropertyKey.allowPublicKeyRetrieval.getKeyName(), "true");
5612+
boolean useIS = false;
5613+
boolean dbTermIsSchema = false;
5614+
do {
5615+
String databaseTerm = dbTermIsSchema ? "SCHEMA" : "CATALOG";
5616+
props.setProperty(PropertyKey.useInformationSchema.getKeyName(), "" + useIS);
5617+
props.setProperty(PropertyKey.databaseTerm.getKeyName(), databaseTerm);
5618+
Connection con = getConnectionWithProps(props);
5619+
DatabaseMetaData md = con.getMetaData();
5620+
5621+
final String testCase = String.format("Case [useIS: %s, databaseTerm: %s]", useIS ? "Y" : "N", databaseTerm);
5622+
5623+
this.rs = dbTermIsSchema ? md.getImportedKeys(null, databaseName1, tableName2) : md.getImportedKeys(databaseName1, null, tableName2);
5624+
assertTrue(this.rs.next(), testCase);
5625+
assertEquals(dbTermIsSchema ? "def" : databaseName1, this.rs.getString("PKTABLE_CAT"), testCase);
5626+
assertEquals(dbTermIsSchema ? databaseName1 : null, this.rs.getString("PKTABLE_SCHEM"), testCase);
5627+
assertEquals(dbTermIsSchema ? "def" : databaseName1, this.rs.getString("FKTABLE_CAT"), testCase);
5628+
assertEquals(dbTermIsSchema ? databaseName1 : null, this.rs.getString("FKTABLE_SCHEM"), testCase);
5629+
assertEquals(tableName1, this.rs.getString("PKTABLE_NAME"), testCase);
5630+
assertEquals("ID", this.rs.getString("PKCOLUMN_NAME"), testCase);
5631+
assertEquals(tableName2, this.rs.getString("FKTABLE_NAME"), testCase);
5632+
assertEquals("FK_ID", this.rs.getString("FKCOLUMN_NAME"), testCase);
5633+
assertEquals(1, this.rs.getInt("KEY_SEQ"), testCase);
5634+
assertEquals(1, this.rs.getInt("UPDATE_RULE"), testCase);
5635+
assertEquals(0, this.rs.getInt("DELETE_RULE"), testCase);
5636+
assertEquals(constraintName, this.rs.getString("FK_NAME"), testCase);
5637+
assertEquals(useIS ? "PRIMARY" : null, this.rs.getString("PK_NAME"), testCase);
5638+
assertEquals(7, this.rs.getInt("DEFERRABILITY"), testCase);
5639+
assertFalse(this.rs.next(), testCase);
5640+
5641+
this.rs = dbTermIsSchema ? md.getImportedKeys(null, databaseName2, tableName2) : md.getImportedKeys(databaseName2, null, tableName2);
5642+
assertTrue(this.rs.next(), testCase);
5643+
assertEquals(dbTermIsSchema ? "def" : databaseName2, this.rs.getString("PKTABLE_CAT"), testCase);
5644+
assertEquals(dbTermIsSchema ? databaseName2 : null, this.rs.getString("PKTABLE_SCHEM"), testCase);
5645+
assertEquals(dbTermIsSchema ? "def" : databaseName2, this.rs.getString("FKTABLE_CAT"), testCase);
5646+
assertEquals(dbTermIsSchema ? databaseName2 : null, this.rs.getString("FKTABLE_SCHEM"), testCase);
5647+
assertEquals(tableName1, this.rs.getString("PKTABLE_NAME"), testCase);
5648+
assertEquals("ID", this.rs.getString("PKCOLUMN_NAME"), testCase);
5649+
assertEquals(tableName2, this.rs.getString("FKTABLE_NAME"), testCase);
5650+
assertEquals("FK_ID", this.rs.getString("FKCOLUMN_NAME"), testCase);
5651+
assertEquals(1, this.rs.getInt("KEY_SEQ"), testCase);
5652+
assertEquals(1, this.rs.getInt("UPDATE_RULE"), testCase);
5653+
assertEquals(1, this.rs.getInt("DELETE_RULE"), testCase);
5654+
assertEquals(constraintName, this.rs.getString("FK_NAME"), testCase);
5655+
assertEquals(useIS ? "PRIMARY" : null, this.rs.getString("PK_NAME"), testCase);
5656+
assertEquals(7, this.rs.getInt("DEFERRABILITY"), testCase);
5657+
assertFalse(this.rs.next(), testCase);
5658+
5659+
con.close();
5660+
} while ((useIS = !useIS) || (dbTermIsSchema = !dbTermIsSchema));
5661+
}
5662+
55835663
}

0 commit comments

Comments
 (0)