Skip to content

Commit da9d22a

Browse files
committed
Updated test cases to address failures in AzureDW
1 parent d3823a5 commit da9d22a

File tree

1 file changed

+155
-161
lines changed

1 file changed

+155
-161
lines changed

src/test/java/com/microsoft/sqlserver/jdbc/databasemetadata/DatabaseMetaDataTest.java

Lines changed: 155 additions & 161 deletions
Original file line numberDiff line numberDiff line change
@@ -1197,117 +1197,175 @@ public void testJSONMetaData() throws SQLException {
11971197
}
11981198
}
11991199

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+
12001253
/**
1201-
* Test to verify getFunctions() metadata structure and FUNCTION_TYPE values
1254+
* Test to verify getProcedures() metadata structure and PROCEDURE_TYPE values
12021255
*
12031256
* @throws SQLException
12041257
*/
12051258
@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+
12071268
try (Connection conn = getConnection()) {
12081269
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"
12141273
};
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));
12271281
}
1228-
1229-
// Verify data and FUNCTION_TYPE values
1230-
boolean foundFunction = false;
1282+
1283+
boolean foundProcedure = false;
12311284
int rowCount = 0;
12321285
while (rs.next() && rowCount < 5) {
1233-
foundFunction = true;
1286+
foundProcedure = true;
12341287
rowCount++;
1235-
1288+
12361289
// 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+
12451298
// Verify parameter counts are -1 (unknown) as per JDBC spec
12461299
assertEquals(-1, rs.getInt("NUM_INPUT_PARAMS"));
12471300
assertEquals(-1, rs.getInt("NUM_OUTPUT_PARAMS"));
12481301
assertEquals(-1, rs.getInt("NUM_RESULT_SETS"));
12491302
}
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+
12531307
}
1308+
} finally {
1309+
dropObjects(schemaName, "PROCEDURE", proc1, proc2);
12541310
}
12551311
}
12561312

12571313
/**
1258-
* Test to verify getProcedures() metadata structure and PROCEDURE_TYPE values
1314+
* Test to verify getFunctions() metadata structure and FUNCTION_TYPE values
12591315
*
12601316
* @throws SQLException
12611317
*/
12621318
@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+
12641328
try (Connection conn = getConnection()) {
12651329
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"
12711333
};
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));
12841340
}
1285-
1286-
// Verify data and PROCEDURE_TYPE values
1287-
boolean foundProcedure = false;
1341+
1342+
boolean foundFunction = false;
12881343
int rowCount = 0;
12891344
while (rs.next() && rowCount < 5) {
1290-
foundProcedure = true;
1345+
foundFunction = true;
12911346
rowCount++;
1292-
1347+
12931348
// 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+
13021357
// Verify parameter counts are -1 (unknown) as per JDBC spec
13031358
assertEquals(-1, rs.getInt("NUM_INPUT_PARAMS"));
13041359
assertEquals(-1, rs.getInt("NUM_OUTPUT_PARAMS"));
13051360
assertEquals(-1, rs.getInt("NUM_RESULT_SETS"));
13061361
}
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+
13101366
}
1367+
} finally {
1368+
dropObjects(schemaName, "FUNCTION", func1, func2);
13111369
}
13121370
}
13131371

@@ -1318,120 +1376,56 @@ public void testGetProceduresMetadataValidation() throws SQLException {
13181376
*/
13191377
@Test
13201378
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()) {
13311388
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%")) {
13511390
Set<String> foundProcedures = new HashSet<>();
1352-
13531391
while (rs.next()) {
1354-
procedureCount++;
1355-
String procedureName = rs.getString("PROCEDURE_NAME");
1356-
foundProcedures.add(procedureName);
1357-
1392+
foundProcedures.add(rs.getString("PROCEDURE_NAME"));
13581393
assertEquals(1, rs.getInt("PROCEDURE_TYPE"));
1359-
assertEquals("dbo", rs.getString("PROCEDURE_SCHEM"));
13601394
}
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);
13661396
}
1367-
13681397
} 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);
13741399
}
13751400
}
13761401

13771402
/**
1378-
* Test to verify getFunctions() with controlled data using specific functions
1403+
* Test to verify getFunctions() with controlled data using specific functions
13791404
*
13801405
* @throws SQLException
13811406
*/
13821407
@Test
13831408
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()) {
13941418
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%")) {
14141420
Set<String> foundFunctions = new HashSet<>();
1415-
14161421
while (rs.next()) {
1417-
functionCount++;
1418-
String functionName = rs.getString("FUNCTION_NAME");
1419-
foundFunctions.add(functionName);
1420-
1422+
foundFunctions.add(rs.getString("FUNCTION_NAME"));
14211423
assertEquals(2, rs.getInt("FUNCTION_TYPE"));
1422-
assertEquals("dbo", rs.getString("FUNCTION_SCHEM"));
14231424
}
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);
14271426
}
1428-
14291427
} 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);
14351429
}
14361430
}
14371431

0 commit comments

Comments
 (0)