1212import java .sql .DatabaseMetaData ;
1313import java .sql .ResultSet ;
1414import java .sql .SQLException ;
15+ import java .util .ArrayList ;
1516import java .util .Arrays ;
1617import java .util .EnumMap ;
1718import java .util .List ;
1819import java .util .Map ;
1920
2021import static java .util .Collections .unmodifiableMap ;
2122import static org .firebirdsql .common .FBTestProperties .getConnectionViaDriverManager ;
23+ import static org .firebirdsql .common .FBTestProperties .getDefaultSupportInfo ;
2224import static org .firebirdsql .common .FBTestProperties .ifSchemaElse ;
2325import static org .firebirdsql .common .assertions .ResultSetAssertions .assertNextRow ;
2426import static org .firebirdsql .common .assertions .ResultSetAssertions .assertNoNextRow ;
@@ -35,66 +37,86 @@ abstract class FBDatabaseMetaDataAbstractKeysTest {
3537 private static final String UNNAMED_PK_INDEX_PREFIX = "RDB$PRIMARY" ;
3638 private static final String UNNAMED_FK_INDEX_PREFIX = "RDB$FOREIGN" ;
3739
38- //@formatter:off
3940 @ RegisterExtension
4041 static final UsesDatabaseExtension .UsesDatabaseForAll usesDatabase = UsesDatabaseExtension .usesDatabaseForAll (
41- """
42- create table TABLE_1 (
43- ID integer constraint PK_TABLE_1 primary key
44- )""" ,
45- """
46- create table TABLE_2 (
47- ID1 integer not null,
48- ID2 integer not null,
49- TABLE_1_ID integer constraint FK_TABLE_2_TO_1 references TABLE_1 (ID),
50- constraint PK_TABLE_2 unique (ID1, ID2) using index ALT_INDEX_NAME_2
51- )""" ,
52- """
53- create table TABLE_3 (
54- ID integer constraint PK_TABLE_3 primary key using index ALT_INDEX_NAME_3,
55- TABLE_2_ID1 integer,
56- TABLE_2_ID2 integer,
57- constraint FK_TABLE_3_TO_2 foreign key (TABLE_2_ID1, TABLE_2_ID2) references TABLE_2 (ID1, ID2)
58- on delete cascade on update set default
59- )""" ,
60- """
61- create table TABLE_4 (
62- ID integer primary key using index ALT_INDEX_NAME_4,
63- TABLE_2_ID1 integer,
64- TABLE_2_ID2 integer,
65- constraint FK_TABLE_4_TO_2 foreign key (TABLE_2_ID1, TABLE_2_ID2) references TABLE_2 (ID1, ID2)
66- on delete set default on update set null
67- )""" ,
68- """
69- create table TABLE_5 (
70- ID integer primary key,
71- TABLE_2_ID1 integer,
72- TABLE_2_ID2 integer,
73- foreign key (TABLE_2_ID1, TABLE_2_ID2) references TABLE_2 (ID1, ID2)
74- on delete set null on update no action using index ALT_INDEX_NAME_5
75- )""" ,
76- """
77- create table TABLE_6 (
78- ID integer primary key,
79- TABLE_2_ID1 integer,
80- TABLE_2_ID2 integer,
81- foreign key (TABLE_2_ID1, TABLE_2_ID2) references TABLE_2 (ID1, ID2)
82- on delete no action on update cascade
83- )""" ,
84- """
85- create table TABLE_7 (
86- ID integer primary key,
87- TABLE_6_ID integer constraint FK_TABLE_7_TO_6 references TABLE_6 (ID) on update cascade
88- )"""
89- );
90- //@formatter:on
42+ dbInitStatements ());
9143
9244 protected static final MetadataResultSetDefinition keysDefinition =
9345 new MetadataResultSetDefinition (KeysMetaData .class );
9446
9547 protected static Connection con ;
9648 protected static DatabaseMetaData dbmd ;
9749
50+ private static List <String > dbInitStatements () {
51+ var statements = new ArrayList <>(Arrays .asList (
52+ """
53+ create table TABLE_1 (
54+ ID integer constraint PK_TABLE_1 primary key
55+ )""" ,
56+ """
57+ create table TABLE_2 (
58+ ID1 integer not null,
59+ ID2 integer not null,
60+ TABLE_1_ID integer constraint FK_TABLE_2_TO_1 references TABLE_1 (ID),
61+ constraint PK_TABLE_2 unique (ID1, ID2) using index ALT_INDEX_NAME_2
62+ )""" ,
63+ """
64+ create table TABLE_3 (
65+ ID integer constraint PK_TABLE_3 primary key using index ALT_INDEX_NAME_3,
66+ TABLE_2_ID1 integer,
67+ TABLE_2_ID2 integer,
68+ constraint FK_TABLE_3_TO_2 foreign key (TABLE_2_ID1, TABLE_2_ID2) references TABLE_2 (ID1, ID2)
69+ on delete cascade on update set default
70+ )""" ,
71+ """
72+ create table TABLE_4 (
73+ ID integer primary key using index ALT_INDEX_NAME_4,
74+ TABLE_2_ID1 integer,
75+ TABLE_2_ID2 integer,
76+ constraint FK_TABLE_4_TO_2 foreign key (TABLE_2_ID1, TABLE_2_ID2) references TABLE_2 (ID1, ID2)
77+ on delete set default on update set null
78+ )""" ,
79+ """
80+ create table TABLE_5 (
81+ ID integer primary key,
82+ TABLE_2_ID1 integer,
83+ TABLE_2_ID2 integer,
84+ foreign key (TABLE_2_ID1, TABLE_2_ID2) references TABLE_2 (ID1, ID2)
85+ on delete set null on update no action using index ALT_INDEX_NAME_5
86+ )""" ,
87+ """
88+ create table TABLE_6 (
89+ ID integer primary key,
90+ TABLE_2_ID1 integer,
91+ TABLE_2_ID2 integer,
92+ foreign key (TABLE_2_ID1, TABLE_2_ID2) references TABLE_2 (ID1, ID2)
93+ on delete no action on update cascade
94+ )"""
95+ ));
96+ if (!getDefaultSupportInfo ().supportsSchemas ()) {
97+ statements .add ("""
98+ create table TABLE_7 (
99+ ID integer primary key,
100+ TABLE_6_ID integer constraint FK_TABLE_7_TO_6 references TABLE_6 (ID) on update cascade
101+ )""" );
102+ } else {
103+ statements .add ("create schema OTHER_SCHEMA" );
104+ statements .add ("""
105+ create table OTHER_SCHEMA.TABLE_8 (
106+ ID integer primary key,
107+ TABLE_1_ID integer constraint FK_TABLE_8_TO_1 references PUBLIC.TABLE_1 (ID)
108+ )""" );
109+ statements .add ("""
110+ create table TABLE_7 (
111+ ID integer primary key,
112+ TABLE_6_ID integer constraint FK_TABLE_7_TO_6 references TABLE_6 (ID) on update cascade,
113+ TABLE_8_ID integer constraint FK_TABLE_7_TO_8 references OTHER_SCHEMA.TABLE_8 (ID) on delete cascade
114+ )""" );
115+ }
116+
117+ return statements ;
118+ }
119+
98120 @ BeforeAll
99121 static void setupAll () throws SQLException {
100122 con = getConnectionViaDriverManager ();
@@ -163,13 +185,26 @@ protected static List<Map<KeysMetaData, Object>> table6Fks() {
163185 UNNAMED_CONSTRAINT_PREFIX , "ALT_INDEX_NAME_2" , UNNAMED_FK_INDEX_PREFIX ));
164186 }
165187
166- protected static List <Map <KeysMetaData , Object >> table7Fks () {
188+ protected static List <Map <KeysMetaData , Object >> table7to6Fks () {
167189 return List .of (
168190 createKeysTestData ("TABLE_6" , "ID" , "TABLE_7" , "TABLE_6_ID" , 1 , DatabaseMetaData .importedKeyCascade ,
169191 DatabaseMetaData .importedKeyNoAction , UNNAMED_CONSTRAINT_PREFIX , "FK_TABLE_7_TO_6" ,
170192 UNNAMED_PK_INDEX_PREFIX , "FK_TABLE_7_TO_6" ));
171193 }
172194
195+ protected static List <Map <KeysMetaData , Object >> table7to8Fks () {
196+ return List .of (createKeysTestData ("OTHER_SCHEMA" , "TABLE_8" , "ID" , "PUBLIC" , "TABLE_7" , "TABLE_8_ID" , 1 ,
197+ DatabaseMetaData .importedKeyNoAction , DatabaseMetaData .importedKeyCascade ,
198+ UNNAMED_CONSTRAINT_PREFIX , "FK_TABLE_7_TO_8" , UNNAMED_PK_INDEX_PREFIX , "FK_TABLE_7_TO_8" ));
199+ }
200+
201+ protected static List <Map <KeysMetaData , Object >> table8Fks () {
202+ return List .of (
203+ createKeysTestData ("PUBLIC" , "TABLE_1" , "ID" , "OTHER_SCHEMA" , "TABLE_8" , "TABLE_1_ID" , 1 ,
204+ DatabaseMetaData .importedKeyNoAction , DatabaseMetaData .importedKeyNoAction ,
205+ "PK_TABLE_1" , "FK_TABLE_8_TO_1" , "PK_TABLE_1" , "FK_TABLE_8_TO_1" ));
206+ }
207+
173208 protected void validateExpectedKeys (ResultSet keys , List <Map <KeysMetaData , Object >> expectedKeys )
174209 throws Exception {
175210 for (Map <KeysMetaData , Object > expectedColumn : expectedKeys ) {
0 commit comments