Skip to content

Commit 2905415

Browse files
committed
Fix for Bug#104641 (33237255), DatabaseMetaData.getImportedKeys can
return duplicated foreign keys.
1 parent 5f142a6 commit 2905415

File tree

3 files changed

+80
-4
lines changed

3 files changed

+80
-4
lines changed

CHANGES

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
Version 8.0.27
55

6+
- Fix for Bug#104641 (33237255), DatabaseMetaData.getImportedKeys can return duplicated foreign keys.
7+
68
- Fix for Bug#33185116, Have method ResultSet.getBoolean() supporting conversion of 'T' and 'F' in a VARCHAR to True/False (boolean).
79

810
- Fix for Bug#31117686, PROTOCOL ALLOWLIST NOT COMPATIBLE WITH IBM JAVA.

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -453,14 +453,11 @@ public java.sql.ResultSet getImportedKeys(String catalog, String schema, String
453453
sqlBuf.append(generateUpdateRuleClause());
454454
sqlBuf.append(" AS UPDATE_RULE,");
455455
sqlBuf.append(generateDeleteRuleClause());
456-
sqlBuf.append(" AS DELETE_RULE, A.CONSTRAINT_NAME AS FK_NAME, TC.CONSTRAINT_NAME AS PK_NAME,");
456+
sqlBuf.append(" AS DELETE_RULE, A.CONSTRAINT_NAME AS FK_NAME, R.UNIQUE_CONSTRAINT_NAME AS PK_NAME,");
457457
sqlBuf.append(importedKeyNotDeferrable);
458458
sqlBuf.append(" AS DEFERRABILITY FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE A");
459459
sqlBuf.append(" JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS B USING (CONSTRAINT_NAME, TABLE_NAME) ");
460460
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'))");
464461
sqlBuf.append("WHERE B.CONSTRAINT_TYPE = 'FOREIGN KEY'");
465462
if (db != null) {
466463
sqlBuf.append(" AND A.TABLE_SCHEMA = ?");

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

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5314,4 +5314,81 @@ public void testBug95280() throws Exception {
53145314
}
53155315
}
53165316
}
5317+
5318+
/**
5319+
* Tests fix for Bug#104641 (33237255), DatabaseMetaData.getImportedKeys can return duplicated foreign keys.
5320+
*
5321+
* @throws Exception
5322+
*/
5323+
@Test
5324+
public void testBug104641() throws Exception {
5325+
String databaseName1 = "dbBug104641";
5326+
createDatabase(databaseName1);
5327+
createTable(databaseName1 + ".table1",
5328+
"(`CREATED` datetime DEFAULT NULL,`ID` bigint NOT NULL AUTO_INCREMENT,`LRN_ID` bigint DEFAULT '0',`USERNAME` varchar(50) NOT NULL,"
5329+
+ "PRIMARY KEY (`ID`),UNIQUE KEY `U_table1_LRN_ID` (`LRN_ID`),UNIQUE KEY `U_table1_USERNAME` (`USERNAME`) )");
5330+
createTable(databaseName1 + ".table2",
5331+
"(`AL_ID` varchar(50) DEFAULT NULL,`CREATED` datetime DEFAULT NULL,`ID` bigint NOT NULL AUTO_INCREMENT,`USER_ID` bigint DEFAULT NULL,"
5332+
+ "PRIMARY KEY (`ID`),KEY `fk_table2_user_id` (`USER_ID`),KEY `index_al_id1` (`AL_ID`),"
5333+
+ "CONSTRAINT `fk_table2_user_id` FOREIGN KEY (`USER_ID`) REFERENCES `table1` (`ID`) )");
5334+
createTable(databaseName1 + ".table3",
5335+
"(`AL_ID` varchar(50) DEFAULT NULL,`ID` bigint NOT NULL AUTO_INCREMENT,`USER_ID` bigint DEFAULT NULL,`LRN_ID` bigint DEFAULT '0',"
5336+
+ "PRIMARY KEY (`ID`),KEY `fk_table3_LRN_ID` (`LRN_ID`),KEY `index_al_id2` (`AL_ID`),"
5337+
+ "CONSTRAINT `fk_table3_LRN_ID` FOREIGN KEY `U_table1_LRN_ID` (`LRN_ID`) REFERENCES `table1` (`LRN_ID`) )");
5338+
5339+
Properties props = new Properties();
5340+
props.setProperty(PropertyKey.useSSL.getKeyName(), "false");
5341+
props.setProperty(PropertyKey.allowPublicKeyRetrieval.getKeyName(), "true");
5342+
for (boolean useIS : new boolean[] { false, true }) {
5343+
for (String databaseTerm : new String[] { "CATALOG", "SCHEMA" }) {
5344+
props.setProperty(PropertyKey.useInformationSchema.getKeyName(), "" + useIS);
5345+
props.setProperty(PropertyKey.databaseTerm.getKeyName(), databaseTerm);
5346+
5347+
boolean dbTermIsSchema = databaseTerm.contentEquals("SCHEMA");
5348+
5349+
String err = "useInformationSchema=" + useIS + ", databaseTerm=" + databaseTerm;
5350+
Connection con = getConnectionWithProps(props);
5351+
DatabaseMetaData meta = con.getMetaData();
5352+
5353+
this.rs = dbTermIsSchema ? meta.getImportedKeys(null, databaseName1, "table2") : meta.getImportedKeys(databaseName1, null, "table2");
5354+
assertTrue(this.rs.next(), err);
5355+
assertEquals(dbTermIsSchema ? "def" : databaseName1, this.rs.getString("PKTABLE_CAT"), err);
5356+
assertEquals(dbTermIsSchema ? databaseName1 : null, this.rs.getString("PKTABLE_SCHEM"), err);
5357+
assertEquals(dbTermIsSchema ? "def" : databaseName1, this.rs.getString("FKTABLE_CAT"), err);
5358+
assertEquals(dbTermIsSchema ? databaseName1 : null, this.rs.getString("FKTABLE_SCHEM"), err);
5359+
assertEquals("table1", this.rs.getString("PKTABLE_NAME"), err);
5360+
assertEquals("ID", this.rs.getString("PKCOLUMN_NAME"), err);
5361+
assertEquals("table2", this.rs.getString("FKTABLE_NAME"), err);
5362+
assertEquals("USER_ID", this.rs.getString("FKCOLUMN_NAME"), err);
5363+
assertEquals(1, this.rs.getInt("KEY_SEQ"), err);
5364+
assertEquals(1, this.rs.getInt("UPDATE_RULE"), err);
5365+
assertEquals(1, this.rs.getInt("DELETE_RULE"), err);
5366+
assertEquals("fk_table2_user_id", this.rs.getString("FK_NAME"), err);
5367+
assertEquals(useIS ? "PRIMARY" : null, this.rs.getString("PK_NAME"), err);
5368+
assertEquals(7, this.rs.getInt("DEFERRABILITY"), err);
5369+
assertFalse(this.rs.next(), err);
5370+
5371+
this.rs = dbTermIsSchema ? meta.getImportedKeys(null, databaseName1, "table3") : meta.getImportedKeys(databaseName1, null, "table3");
5372+
assertTrue(this.rs.next(), err);
5373+
assertEquals(dbTermIsSchema ? "def" : databaseName1, this.rs.getString("PKTABLE_CAT"), err);
5374+
assertEquals(dbTermIsSchema ? databaseName1 : null, this.rs.getString("PKTABLE_SCHEM"), err);
5375+
assertEquals(dbTermIsSchema ? "def" : databaseName1, this.rs.getString("FKTABLE_CAT"), err);
5376+
assertEquals(dbTermIsSchema ? databaseName1 : null, this.rs.getString("FKTABLE_SCHEM"), err);
5377+
assertEquals("table1", this.rs.getString("PKTABLE_NAME"), err);
5378+
assertEquals("LRN_ID", this.rs.getString("PKCOLUMN_NAME"), err);
5379+
assertEquals("table3", this.rs.getString("FKTABLE_NAME"), err);
5380+
assertEquals("LRN_ID", this.rs.getString("FKCOLUMN_NAME"), err);
5381+
assertEquals(1, this.rs.getInt("KEY_SEQ"), err);
5382+
assertEquals(1, this.rs.getInt("UPDATE_RULE"), err);
5383+
assertEquals(1, this.rs.getInt("DELETE_RULE"), err);
5384+
assertEquals("fk_table3_LRN_ID", this.rs.getString("FK_NAME"), err);
5385+
assertEquals(useIS ? "U_table1_LRN_ID" : null, this.rs.getString("PK_NAME"), err);
5386+
assertEquals(7, this.rs.getInt("DEFERRABILITY"), err);
5387+
assertFalse(this.rs.next(), err);
5388+
5389+
con.close();
5390+
}
5391+
}
5392+
5393+
}
53175394
}

0 commit comments

Comments
 (0)