@@ -1197,117 +1197,175 @@ public void testJSONMetaData() throws SQLException {
1197
1197
}
1198
1198
}
1199
1199
1200
+ private void setupProcedures (String schemaName , String proc1 , String proc1Body ,
1201
+ String proc2 , String proc2Body ) throws SQLException {
1202
+ String escapedSchema = AbstractSQLGenerator .escapeIdentifier (schemaName );
1203
+ String escapedProc1 = AbstractSQLGenerator .escapeIdentifier (proc1 );
1204
+ String escapedProc2 = AbstractSQLGenerator .escapeIdentifier (proc2 );
1205
+
1206
+ try (Connection conn = getConnection (); Statement stmt = conn .createStatement ()) {
1207
+ stmt .executeUpdate (
1208
+ "IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = '" + schemaName + "') " +
1209
+ "EXEC('CREATE SCHEMA " + escapedSchema + "')" );
1210
+
1211
+ stmt .executeUpdate ("IF OBJECT_ID('" + schemaName + "." + proc1 + "', 'P') IS NOT NULL " +
1212
+ "DROP PROCEDURE " + escapedSchema + "." + escapedProc1 );
1213
+ stmt .executeUpdate ("CREATE PROCEDURE " + escapedSchema + "." + escapedProc1 + " " + proc1Body );
1214
+
1215
+ stmt .executeUpdate ("IF OBJECT_ID('" + schemaName + "." + proc2 + "', 'P') IS NOT NULL " +
1216
+ "DROP PROCEDURE " + escapedSchema + "." + escapedProc2 );
1217
+ stmt .executeUpdate ("CREATE PROCEDURE " + escapedSchema + "." + escapedProc2 + " " + proc2Body );
1218
+ }
1219
+ }
1220
+
1221
+ private void setupFunctions (String schemaName , String func1 , String func1Body ,
1222
+ String func2 , String func2Body ) throws SQLException {
1223
+ String escapedSchema = AbstractSQLGenerator .escapeIdentifier (schemaName );
1224
+ String escapedFunc1 = AbstractSQLGenerator .escapeIdentifier (func1 );
1225
+ String escapedFunc2 = AbstractSQLGenerator .escapeIdentifier (func2 );
1226
+
1227
+ try (Connection conn = getConnection (); Statement stmt = conn .createStatement ()) {
1228
+ stmt .executeUpdate (
1229
+ "IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = '" + schemaName + "') " +
1230
+ "EXEC('CREATE SCHEMA " + escapedSchema + "')" );
1231
+
1232
+ stmt .executeUpdate ("IF OBJECT_ID('" + schemaName + "." + func1 + "', 'FN') IS NOT NULL " +
1233
+ "DROP FUNCTION " + escapedSchema + "." + escapedFunc1 );
1234
+ stmt .executeUpdate ("CREATE FUNCTION " + escapedSchema + "." + escapedFunc1 + " " + func1Body );
1235
+
1236
+ stmt .executeUpdate ("IF OBJECT_ID('" + schemaName + "." + func2 + "', 'FN') IS NOT NULL " +
1237
+ "DROP FUNCTION " + escapedSchema + "." + escapedFunc2 );
1238
+ stmt .executeUpdate ("CREATE FUNCTION " + escapedSchema + "." + escapedFunc2 + " " + func2Body );
1239
+ }
1240
+ }
1241
+
1242
+ private void dropObjects (String schemaName , String objectType , String ... objectNames ) throws SQLException {
1243
+ String escapedSchema = AbstractSQLGenerator .escapeIdentifier (schemaName );
1244
+
1245
+ try (Connection conn = getConnection (); Statement stmt = conn .createStatement ()) {
1246
+ for (String name : objectNames ) {
1247
+ String escapedName = AbstractSQLGenerator .escapeIdentifier (name );
1248
+ stmt .executeUpdate ("DROP " + objectType + " " + escapedSchema + "." + escapedName );
1249
+ }
1250
+ }
1251
+ }
1252
+
1200
1253
/**
1201
- * Test to verify getFunctions () metadata structure and FUNCTION_TYPE values
1254
+ * Test to verify getProcedures () metadata structure and PROCEDURE_TYPE values
1202
1255
*
1203
1256
* @throws SQLException
1204
1257
*/
1205
1258
@ Test
1206
- public void testGetFunctionsMetadataValidation () throws SQLException {
1259
+ public void testGetProceduresMetadataValidation () throws SQLException {
1260
+ String schemaName = "test_schema" ;
1261
+ String proc1 = "sp_test1" ;
1262
+ String proc2 = "sp_test2" ;
1263
+
1264
+ setupProcedures (schemaName ,
1265
+ proc1 , "AS BEGIN SELECT 1; END" ,
1266
+ proc2 , "@val INT AS BEGIN SELECT @val * 2; END" );
1267
+
1207
1268
try (Connection conn = getConnection ()) {
1208
1269
DatabaseMetaData metaData = conn .getMetaData ();
1209
-
1210
- // Expected column names based on JDBC specification
1211
- String [] expectedColumnNames = {
1212
- "FUNCTION_CAT" , "FUNCTION_SCHEM" , "FUNCTION_NAME" , "NUM_INPUT_PARAMS" ,
1213
- "NUM_OUTPUT_PARAMS" , "NUM_RESULT_SETS" , "REMARKS" , "FUNCTION_TYPE"
1270
+ String [] expectedCols = {
1271
+ "PROCEDURE_CAT" , "PROCEDURE_SCHEM" , "PROCEDURE_NAME" , "NUM_INPUT_PARAMS" ,
1272
+ "NUM_OUTPUT_PARAMS" , "NUM_RESULT_SETS" , "REMARKS" , "PROCEDURE_TYPE"
1214
1273
};
1215
-
1216
- try (ResultSet rs = metaData .getFunctions (null , "sys" , "fn_%" )) {
1217
- ResultSetMetaData rsMetaData = rs .getMetaData ();
1218
-
1219
- // Verify column count
1220
- assertEquals (expectedColumnNames .length , rsMetaData .getColumnCount (),
1221
- "getFunctions() should return " + expectedColumnNames .length + " columns" );
1222
-
1223
- // Verify column names
1224
- for (int i = 1 ; i <= rsMetaData .getColumnCount (); i ++) {
1225
- assertEquals (expectedColumnNames [i -1 ], rsMetaData .getColumnName (i ),
1226
- "Column " + i + " name should match expected" );
1274
+
1275
+ try (ResultSet rs = metaData .getProcedures (null , schemaName , "sp_test%" )) {
1276
+ ResultSetMetaData rsMeta = rs .getMetaData ();
1277
+ assertEquals (expectedCols .length , rsMeta .getColumnCount ());
1278
+
1279
+ for (int i = 1 ; i <= rsMeta .getColumnCount (); i ++) {
1280
+ assertEquals (expectedCols [i - 1 ], rsMeta .getColumnName (i ));
1227
1281
}
1228
-
1229
- // Verify data and FUNCTION_TYPE values
1230
- boolean foundFunction = false ;
1282
+
1283
+ boolean foundProcedure = false ;
1231
1284
int rowCount = 0 ;
1232
1285
while (rs .next () && rowCount < 5 ) {
1233
- foundFunction = true ;
1286
+ foundProcedure = true ;
1234
1287
rowCount ++;
1235
-
1288
+
1236
1289
// Verify required fields are not null/empty
1237
- assertNotNull (rs .getString ("FUNCTION_CAT " ));
1238
- assertNotNull (rs .getString ("FUNCTION_SCHEM " ));
1239
- assertNotNull (rs .getString ("FUNCTION_NAME " ));
1240
-
1241
- // Verify FUNCTION_TYPE - should be 2 for SQL functions
1242
- int functionType = rs .getInt ("FUNCTION_TYPE " );
1243
- assertEquals (2 , functionType );
1244
-
1290
+ assertNotNull (rs .getString ("PROCEDURE_CAT " ));
1291
+ assertNotNull (rs .getString ("PROCEDURE_SCHEM " ));
1292
+ assertNotNull (rs .getString ("PROCEDURE_NAME " ));
1293
+
1294
+ // Verify PROCEDURE_TYPE - should be 1 for procedures that don't return result
1295
+ int procedureType = rs .getInt ("PROCEDURE_TYPE " );
1296
+ assertEquals (1 , procedureType );
1297
+
1245
1298
// Verify parameter counts are -1 (unknown) as per JDBC spec
1246
1299
assertEquals (-1 , rs .getInt ("NUM_INPUT_PARAMS" ));
1247
1300
assertEquals (-1 , rs .getInt ("NUM_OUTPUT_PARAMS" ));
1248
1301
assertEquals (-1 , rs .getInt ("NUM_RESULT_SETS" ));
1249
1302
}
1250
-
1251
- assertTrue (foundFunction , "At least one function should be found in sys schema" );
1252
- System .out .println ("Verified " + rowCount + " functions with FUNCTION_TYPE = 2" );
1303
+
1304
+ assertTrue (foundProcedure , "At least one procedure should be found in schema" );
1305
+ System .out .println ("Verified " + rowCount + " procedures with PROCEDURE_TYPE = 1" );
1306
+
1253
1307
}
1308
+ } finally {
1309
+ dropObjects (schemaName , "PROCEDURE" , proc1 , proc2 );
1254
1310
}
1255
1311
}
1256
1312
1257
1313
/**
1258
- * Test to verify getProcedures () metadata structure and PROCEDURE_TYPE values
1314
+ * Test to verify getFunctions () metadata structure and FUNCTION_TYPE values
1259
1315
*
1260
1316
* @throws SQLException
1261
1317
*/
1262
1318
@ Test
1263
- public void testGetProceduresMetadataValidation () throws SQLException {
1319
+ public void testGetFunctionsMetadataValidation () throws SQLException {
1320
+ String schemaName = "test_schema" ;
1321
+ String func1 = "fn_test1" ;
1322
+ String func2 = "fn_test2" ;
1323
+
1324
+ setupFunctions (schemaName ,
1325
+ func1 , "() RETURNS INT AS BEGIN RETURN 42; END" ,
1326
+ func2 , "(@val INT) RETURNS INT AS BEGIN RETURN @val * 2; END" );
1327
+
1264
1328
try (Connection conn = getConnection ()) {
1265
1329
DatabaseMetaData metaData = conn .getMetaData ();
1266
-
1267
- // Expected column names based on JDBC specification
1268
- String [] expectedColumnNames = {
1269
- "PROCEDURE_CAT" , "PROCEDURE_SCHEM" , "PROCEDURE_NAME" , "NUM_INPUT_PARAMS" ,
1270
- "NUM_OUTPUT_PARAMS" , "NUM_RESULT_SETS" , "REMARKS" , "PROCEDURE_TYPE"
1330
+ String [] expectedCols = {
1331
+ "FUNCTION_CAT" , "FUNCTION_SCHEM" , "FUNCTION_NAME" , "NUM_INPUT_PARAMS" ,
1332
+ "NUM_OUTPUT_PARAMS" , "NUM_RESULT_SETS" , "REMARKS" , "FUNCTION_TYPE"
1271
1333
};
1272
-
1273
- try (ResultSet rs = metaData .getProcedures (null , "sys" , "sp_%" )) {
1274
- ResultSetMetaData rsMetaData = rs .getMetaData ();
1275
-
1276
- // Verify column count
1277
- assertEquals (expectedColumnNames .length , rsMetaData .getColumnCount (),
1278
- "getProcedures() should return " + expectedColumnNames .length + " columns" );
1279
-
1280
- // Verify column names
1281
- for (int i = 1 ; i <= rsMetaData .getColumnCount (); i ++) {
1282
- assertEquals (expectedColumnNames [i -1 ], rsMetaData .getColumnName (i ),
1283
- "Column " + i + " name should match expected" );
1334
+
1335
+ try (ResultSet rs = metaData .getFunctions (null , schemaName , "fn_test%" )) {
1336
+ ResultSetMetaData rsMeta = rs .getMetaData ();
1337
+ assertEquals (expectedCols .length , rsMeta .getColumnCount ());
1338
+ for (int i = 1 ; i <= rsMeta .getColumnCount (); i ++) {
1339
+ assertEquals (expectedCols [i - 1 ], rsMeta .getColumnName (i ));
1284
1340
}
1285
-
1286
- // Verify data and PROCEDURE_TYPE values
1287
- boolean foundProcedure = false ;
1341
+
1342
+ boolean foundFunction = false ;
1288
1343
int rowCount = 0 ;
1289
1344
while (rs .next () && rowCount < 5 ) {
1290
- foundProcedure = true ;
1345
+ foundFunction = true ;
1291
1346
rowCount ++;
1292
-
1347
+
1293
1348
// Verify required fields are not null/empty
1294
- assertNotNull (rs .getString ("PROCEDURE_CAT " ));
1295
- assertNotNull (rs .getString ("PROCEDURE_SCHEM " ));
1296
- assertNotNull (rs .getString ("PROCEDURE_NAME " ));
1297
-
1298
- // Verify PROCEDURE_TYPE - should be 1 for procedures that don't return result
1299
- int procedureType = rs .getInt ("PROCEDURE_TYPE " );
1300
- assertEquals (1 , procedureType );
1301
-
1349
+ assertNotNull (rs .getString ("FUNCTION_CAT " ));
1350
+ assertNotNull (rs .getString ("FUNCTION_SCHEM " ));
1351
+ assertNotNull (rs .getString ("FUNCTION_NAME " ));
1352
+
1353
+ // Verify FUNCTION_TYPE - should be 2 for SQL functions
1354
+ int functionType = rs .getInt ("FUNCTION_TYPE " );
1355
+ assertEquals (2 , functionType );
1356
+
1302
1357
// Verify parameter counts are -1 (unknown) as per JDBC spec
1303
1358
assertEquals (-1 , rs .getInt ("NUM_INPUT_PARAMS" ));
1304
1359
assertEquals (-1 , rs .getInt ("NUM_OUTPUT_PARAMS" ));
1305
1360
assertEquals (-1 , rs .getInt ("NUM_RESULT_SETS" ));
1306
1361
}
1307
-
1308
- assertTrue (foundProcedure , "At least one procedure should be found in sys schema" );
1309
- System .out .println ("Verified " + rowCount + " procedures with PROCEDURE_TYPE = 1" );
1362
+
1363
+ assertTrue (foundFunction , "At least one function should be found in schema" );
1364
+ System .out .println ("Verified " + rowCount + " functions with FUNCTION_TYPE = 2" );
1365
+
1310
1366
}
1367
+ } finally {
1368
+ dropObjects (schemaName , "FUNCTION" , func1 , func2 );
1311
1369
}
1312
1370
}
1313
1371
@@ -1318,120 +1376,56 @@ public void testGetProceduresMetadataValidation() throws SQLException {
1318
1376
*/
1319
1377
@ Test
1320
1378
public void testGetProceduresWithData () throws SQLException {
1321
- String testProcedure1 = RandomUtil .getIdentifier ("TestProc1" );
1322
- String testProcedure2 = RandomUtil .getIdentifier ("TestProc2" );
1323
-
1324
- try (Connection conn = getConnection (); Statement stmt = conn .createStatement ()) {
1325
- // Create two test procedures
1326
- stmt .execute ("CREATE PROCEDURE " + AbstractSQLGenerator .escapeIdentifier (testProcedure1 ) +
1327
- " AS BEGIN SELECT 'Test1' as Result END" );
1328
- stmt .execute ("CREATE PROCEDURE " + AbstractSQLGenerator .escapeIdentifier (testProcedure2 ) +
1329
- " (@param1 INT, @param2 VARCHAR(50)) AS BEGIN SELECT @param1, @param2 END" );
1330
-
1379
+ String schemaName = "test_schema" ;
1380
+ String proc1 = "sp_test1" ;
1381
+ String proc2 = "sp_test2" ;
1382
+
1383
+ setupProcedures (schemaName ,
1384
+ proc1 , "AS BEGIN SELECT 1; END" ,
1385
+ proc2 , "@val INT AS BEGIN SELECT @val * 2; END" );
1386
+
1387
+ try (Connection conn = getConnection ()) {
1331
1388
DatabaseMetaData metaData = conn .getMetaData ();
1332
-
1333
- // Get procedures with pattern matching our test procedures
1334
- try (ResultSet rs = metaData .getProcedures (null , "dbo" , "TestProc%" )) {
1335
- ResultSetMetaData rsMetaData = rs .getMetaData ();
1336
-
1337
- // Verify column count and names
1338
- assertEquals (8 , rsMetaData .getColumnCount (), "Should have 8 columns" );
1339
-
1340
- String [] expectedColumns = {
1341
- "PROCEDURE_CAT" , "PROCEDURE_SCHEM" , "PROCEDURE_NAME" , "NUM_INPUT_PARAMS" ,
1342
- "NUM_OUTPUT_PARAMS" , "NUM_RESULT_SETS" , "REMARKS" , "PROCEDURE_TYPE"
1343
- };
1344
-
1345
- for (int i = 1 ; i <= rsMetaData .getColumnCount (); i ++) {
1346
- assertEquals (expectedColumns [i -1 ], rsMetaData .getColumnName (i ));
1347
- }
1348
-
1349
- // Collect and verify procedures
1350
- int procedureCount = 0 ;
1389
+ try (ResultSet rs = metaData .getProcedures (null , schemaName , "sp_test%" )) {
1351
1390
Set <String > foundProcedures = new HashSet <>();
1352
-
1353
1391
while (rs .next ()) {
1354
- procedureCount ++;
1355
- String procedureName = rs .getString ("PROCEDURE_NAME" );
1356
- foundProcedures .add (procedureName );
1357
-
1392
+ foundProcedures .add (rs .getString ("PROCEDURE_NAME" ));
1358
1393
assertEquals (1 , rs .getInt ("PROCEDURE_TYPE" ));
1359
- assertEquals ("dbo" , rs .getString ("PROCEDURE_SCHEM" ));
1360
1394
}
1361
-
1362
- // Verify we found exactly our 2 test procedures
1363
- assertEquals (2 , procedureCount , "Should find exactly 2 test procedures" );
1364
- assertTrue (foundProcedures .contains (testProcedure1 ));
1365
- assertTrue (foundProcedures .contains (testProcedure2 ));
1395
+ assertEquals (Set .of (proc1 , proc2 ), foundProcedures );
1366
1396
}
1367
-
1368
1397
} finally {
1369
- // Cleanup
1370
- try (Connection conn = getConnection (); Statement stmt = conn .createStatement ()) {
1371
- stmt .execute ("DROP PROCEDURE IF EXISTS " + AbstractSQLGenerator .escapeIdentifier (testProcedure1 ));
1372
- stmt .execute ("DROP PROCEDURE IF EXISTS " + AbstractSQLGenerator .escapeIdentifier (testProcedure2 ));
1373
- }
1398
+ dropObjects (schemaName , "PROCEDURE" , proc1 , proc2 );
1374
1399
}
1375
1400
}
1376
1401
1377
1402
/**
1378
- * Test to verify getFunctions() with controlled data using specific functions
1403
+ * Test to verify getFunctions() with controlled data using specific functions
1379
1404
*
1380
1405
* @throws SQLException
1381
1406
*/
1382
1407
@ Test
1383
1408
public void testGetFunctionsWithData () throws SQLException {
1384
- String testFunction1 = RandomUtil .getIdentifier ("TestFunc1" );
1385
- String testFunction2 = RandomUtil .getIdentifier ("TestFunc2" );
1386
-
1387
- try (Connection conn = getConnection (); Statement stmt = conn .createStatement ()) {
1388
- // Create two test functions
1389
- stmt .execute ("CREATE FUNCTION " + AbstractSQLGenerator .escapeIdentifier (testFunction1 ) +
1390
- " () RETURNS INT AS BEGIN RETURN 100 END" );
1391
- stmt .execute ("CREATE FUNCTION " + AbstractSQLGenerator .escapeIdentifier (testFunction2 ) +
1392
- " (@param1 INT, @param2 VARCHAR(50)) RETURNS TABLE AS RETURN (SELECT @param1 as col1, @param2 as col2)" );
1393
-
1409
+ String schemaName = "test_schema" ;
1410
+ String func1 = "fn_test1" ;
1411
+ String func2 = "fn_test2" ;
1412
+
1413
+ setupFunctions (schemaName ,
1414
+ func1 , "() RETURNS INT AS BEGIN RETURN 42; END" ,
1415
+ func2 , "(@val INT) RETURNS INT AS BEGIN RETURN @val * 2; END" );
1416
+
1417
+ try (Connection conn = getConnection ()) {
1394
1418
DatabaseMetaData metaData = conn .getMetaData ();
1395
-
1396
- // Get functions with pattern matching our test functions
1397
- try (ResultSet rs = metaData .getFunctions (null , "dbo" , "TestFunc%" )) {
1398
- ResultSetMetaData rsMetaData = rs .getMetaData ();
1399
-
1400
- // Verify column count and names
1401
- assertEquals (8 , rsMetaData .getColumnCount (), "Should have 8 columns" );
1402
-
1403
- String [] expectedColumns = {
1404
- "FUNCTION_CAT" , "FUNCTION_SCHEM" , "FUNCTION_NAME" , "NUM_INPUT_PARAMS" ,
1405
- "NUM_OUTPUT_PARAMS" , "NUM_RESULT_SETS" , "REMARKS" , "FUNCTION_TYPE"
1406
- };
1407
-
1408
- for (int i = 1 ; i <= rsMetaData .getColumnCount (); i ++) {
1409
- assertEquals (expectedColumns [i -1 ], rsMetaData .getColumnName (i ));
1410
- }
1411
-
1412
- // Collect and verify functions
1413
- int functionCount = 0 ;
1419
+ try (ResultSet rs = metaData .getFunctions (null , schemaName , "fn_test%" )) {
1414
1420
Set <String > foundFunctions = new HashSet <>();
1415
-
1416
1421
while (rs .next ()) {
1417
- functionCount ++;
1418
- String functionName = rs .getString ("FUNCTION_NAME" );
1419
- foundFunctions .add (functionName );
1420
-
1422
+ foundFunctions .add (rs .getString ("FUNCTION_NAME" ));
1421
1423
assertEquals (2 , rs .getInt ("FUNCTION_TYPE" ));
1422
- assertEquals ("dbo" , rs .getString ("FUNCTION_SCHEM" ));
1423
1424
}
1424
-
1425
- // Verify we found exactly our 2 test functions
1426
- assertEquals (2 , functionCount , "Should find exactly 2 test functions" );
1425
+ assertEquals (Set .of (func1 , func2 ), foundFunctions );
1427
1426
}
1428
-
1429
1427
} finally {
1430
- // Cleanup
1431
- try (Connection conn = getConnection (); Statement stmt = conn .createStatement ()) {
1432
- stmt .execute ("DROP FUNCTION IF EXISTS " + AbstractSQLGenerator .escapeIdentifier (testFunction1 ));
1433
- stmt .execute ("DROP FUNCTION IF EXISTS " + AbstractSQLGenerator .escapeIdentifier (testFunction2 ));
1434
- }
1428
+ dropObjects (schemaName , "FUNCTION" , func1 , func2 );
1435
1429
}
1436
1430
}
1437
1431
0 commit comments