@@ -5314,4 +5314,81 @@ public void testBug95280() throws Exception {
5314
5314
}
5315
5315
}
5316
5316
}
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
+ }
5317
5394
}
0 commit comments