@@ -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