Skip to content

Commit ab791e8

Browse files
authored
Fix getIndexInfo() sp_statistics fallback for Synapse server (#2839)
1 parent f58f35a commit ab791e8

File tree

1 file changed

+32
-1
lines changed

1 file changed

+32
-1
lines changed

src/main/java/com/microsoft/sqlserver/jdbc/SQLServerDatabaseMetaData.java

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,27 @@ private void checkClosed() throws SQLServerException {
296296
"WHERE t.name = ? AND sch.name = ? AND ic.key_ordinal = 0 " +
297297
"ORDER BY NON_UNIQUE, TYPE, INDEX_NAME, ORDINAL_POSITION";
298298

299+
private static final String INDEX_INFO_QUERY_DW = "SELECT db_name() AS TABLE_CAT, " +
300+
"sch.name AS TABLE_SCHEM, " +
301+
"t.name AS TABLE_NAME, " +
302+
"CASE WHEN i.is_unique = 1 THEN 0 ELSE 1 END AS NON_UNIQUE, " +
303+
"t.name AS INDEX_QUALIFIER, " +
304+
"i.name AS INDEX_NAME, " +
305+
"i.type AS TYPE, " +
306+
"ic.key_ordinal AS ORDINAL_POSITION, " +
307+
"c.name AS COLUMN_NAME, " +
308+
"CASE WHEN ic.is_descending_key = 1 THEN 'D' ELSE 'A' END AS ASC_OR_DESC, " +
309+
"NULL AS CARDINALITY, " +
310+
"NULL AS PAGES, " +
311+
"NULL AS FILTER_CONDITION " +
312+
"FROM sys.indexes i " +
313+
"INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id " +
314+
"INNER JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id " +
315+
"INNER JOIN sys.tables t ON i.object_id = t.object_id " +
316+
"INNER JOIN sys.schemas sch ON t.schema_id = sch.schema_id " +
317+
"WHERE t.name = ? " +
318+
"AND sch.name = ? " +
319+
"ORDER BY NON_UNIQUE, TYPE, INDEX_NAME, ORDINAL_POSITION";
299320

300321
// Use LinkedHashMap to force retrieve elements in order they were inserted
301322
/** getColumns columns */
@@ -1408,7 +1429,17 @@ private java.sql.ResultSet getIndexInfoAzureDW(String[] arguments, String table,
14081429
}
14091430
}
14101431
}
1411-
throw e;
1432+
// If sp_statistics fails (e.g., "PROCEDURE 'sp_statistics' is not supported" in Synapse serverless),
1433+
// fall back to sys.indexes query
1434+
if (loggerExternal.isLoggable(Level.FINER)) {
1435+
loggerExternal.finer("sp_statistics failed, falling back to sys.indexes: " + e.getMessage());
1436+
}
1437+
1438+
PreparedStatement fallbackPstmt = (SQLServerPreparedStatement) this.connection.prepareStatement(INDEX_INFO_QUERY_DW);
1439+
fallbackPstmt.setString(1, table);
1440+
fallbackPstmt.setString(2, schema);
1441+
fallbackPstmt.closeOnCompletion();
1442+
return fallbackPstmt.executeQuery();
14121443
}
14131444
return userRs;
14141445
}

0 commit comments

Comments
 (0)