This is an automated email from the ASF dual-hosted git repository.

terrymanu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new ccbe7e8870c Fix SQL Server metadata loading (#39837)
ccbe7e8870c is described below

commit ccbe7e8870c2e171dad9dd884c14639d9660a12f
Author: Liang Zhang <[email protected]>
AuthorDate: Sun Sep 13 23:13:08 2026 +0800

    Fix SQL Server metadata loading (#39837)
---
 .../data/loader/SQLServerMetaDataLoader.java       | 16 ++++++-----
 .../data/loader/SQLServerMetaDataLoaderTest.java   | 31 +++++++++++++---------
 2 files changed, 27 insertions(+), 20 deletions(-)

diff --git 
a/database/connector/dialect/sqlserver/src/main/java/org/apache/shardingsphere/database/connector/sql92/sqlserver/metadata/data/loader/SQLServerMetaDataLoader.java
 
b/database/connector/dialect/sqlserver/src/main/java/org/apache/shardingsphere/database/connector/sql92/sqlserver/metadata/data/loader/SQLServerMetaDataLoader.java
index 6099edc291a..2b072f0a3ac 100644
--- 
a/database/connector/dialect/sqlserver/src/main/java/org/apache/shardingsphere/database/connector/sql92/sqlserver/metadata/data/loader/SQLServerMetaDataLoader.java
+++ 
b/database/connector/dialect/sqlserver/src/main/java/org/apache/shardingsphere/database/connector/sql92/sqlserver/metadata/data/loader/SQLServerMetaDataLoader.java
@@ -48,21 +48,23 @@ public final class SQLServerMetaDataLoader implements 
DialectMetaDataLoader {
     
     private static final String TABLE_META_DATA_SQL_NO_ORDER = "SELECT 
obj.name AS TABLE_NAME, col.name AS COLUMN_NAME, t.name AS DATA_TYPE,"
             + " col.collation_name AS COLLATION_NAME, col.column_id, 
is_identity AS IS_IDENTITY, col.is_nullable AS IS_NULLABLE, %s"
-            + " (SELECT TOP 1 ind.is_primary_key FROM sys.index_columns ic 
LEFT JOIN sys.indexes ind ON ic.object_id = ind.object_id"
-            + " AND ic.index_id = ind.index_id AND ind.name LIKE 'PK_%%' WHERE 
ic.object_id = obj.object_id AND ic.column_id = col.column_id) AS 
IS_PRIMARY_KEY"
+            + " CASE WHEN EXISTS (SELECT 1 FROM sys.index_columns ic INNER 
JOIN sys.indexes ind ON ic.object_id = ind.object_id"
+            + " AND ic.index_id = ind.index_id WHERE ic.object_id = 
obj.object_id AND ic.column_id = col.column_id AND ind.is_primary_key = 1)"
+            + " THEN 1 ELSE 0 END AS IS_PRIMARY_KEY"
             + " FROM sys.objects obj INNER JOIN sys.columns col ON 
obj.object_id = col.object_id LEFT JOIN sys.types t ON t.user_type_id = 
col.user_type_id";
     
     private static final String ORDER_BY_COLUMN_ID = " ORDER BY col.column_id";
     
-    private static final String TABLE_META_DATA_SQL_IN_TABLES = 
TABLE_META_DATA_SQL_NO_ORDER + " WHERE obj.name IN (%s)" + ORDER_BY_COLUMN_ID;
+    private static final String TABLE_META_DATA_SQL_IN_TABLES = 
TABLE_META_DATA_SQL_NO_ORDER + " WHERE obj.schema_id = SCHEMA_ID() AND obj.name 
IN (%s)" + ORDER_BY_COLUMN_ID;
     
     private static final String INDEX_META_DATA_SQL = "SELECT idx.name AS 
INDEX_NAME, obj.name AS TABLE_NAME, col.name AS COLUMN_NAME,"
             + " idx.is_unique AS IS_UNIQUE FROM sys.indexes idx"
-            + " LEFT JOIN sys.objects obj ON idx.object_id = obj.object_id"
-            + " LEFT JOIN sys.columns col ON obj.object_id = col.object_id"
-            + " WHERE idx.index_id NOT IN (0, 255) AND obj.name IN (%s) ORDER 
BY idx.index_id";
+            + " INNER JOIN sys.objects obj ON idx.object_id = obj.object_id"
+            + " INNER JOIN sys.index_columns ic ON idx.object_id = 
ic.object_id AND idx.index_id = ic.index_id"
+            + " INNER JOIN sys.columns col ON ic.object_id = col.object_id AND 
ic.column_id = col.column_id"
+            + " WHERE idx.index_id NOT IN (0, 255) AND obj.schema_id = 
SCHEMA_ID() AND obj.name IN (%s) ORDER BY idx.index_id, ic.index_column_id";
     
-    private static final String VIEW_META_DATA_SQL = "SELECT name AS 
TABLE_NAME FROM sys.objects WHERE type = 'V' AND name IN (%s)";
+    private static final String VIEW_META_DATA_SQL = "SELECT obj.name AS 
TABLE_NAME FROM sys.objects obj WHERE obj.type = 'V' AND obj.schema_id = 
SCHEMA_ID() AND obj.name IN (%s)";
     
     private static final int HIDDEN_COLUMN_START_MAJOR_VERSION = 15;
     
diff --git 
a/database/connector/dialect/sqlserver/src/test/java/org/apache/shardingsphere/database/connector/sql92/sqlserver/metadata/data/loader/SQLServerMetaDataLoaderTest.java
 
b/database/connector/dialect/sqlserver/src/test/java/org/apache/shardingsphere/database/connector/sql92/sqlserver/metadata/data/loader/SQLServerMetaDataLoaderTest.java
index 0994de993f6..06f50b9da95 100644
--- 
a/database/connector/dialect/sqlserver/src/test/java/org/apache/shardingsphere/database/connector/sql92/sqlserver/metadata/data/loader/SQLServerMetaDataLoaderTest.java
+++ 
b/database/connector/dialect/sqlserver/src/test/java/org/apache/shardingsphere/database/connector/sql92/sqlserver/metadata/data/loader/SQLServerMetaDataLoaderTest.java
@@ -57,32 +57,37 @@ class SQLServerMetaDataLoaderTest {
     
     private static final String LOAD_COLUMN_META_DATA_WITH_TABLES_HIGH_VERSION 
= "SELECT obj.name AS TABLE_NAME, col.name AS COLUMN_NAME, t.name AS DATA_TYPE,"
             + " col.collation_name AS COLLATION_NAME, col.column_id, 
is_identity AS IS_IDENTITY, col.is_nullable AS IS_NULLABLE, is_hidden AS 
IS_HIDDEN,"
-            + " (SELECT TOP 1 ind.is_primary_key FROM sys.index_columns ic 
LEFT JOIN sys.indexes ind ON ic.object_id = ind.object_id"
-            + " AND ic.index_id = ind.index_id AND ind.name LIKE 'PK_%' WHERE 
ic.object_id = obj.object_id AND ic.column_id = col.column_id) AS 
IS_PRIMARY_KEY"
+            + " CASE WHEN EXISTS (SELECT 1 FROM sys.index_columns ic INNER 
JOIN sys.indexes ind ON ic.object_id = ind.object_id"
+            + " AND ic.index_id = ind.index_id WHERE ic.object_id = 
obj.object_id AND ic.column_id = col.column_id AND ind.is_primary_key = 1)"
+            + " THEN 1 ELSE 0 END AS IS_PRIMARY_KEY"
             + " FROM sys.objects obj INNER JOIN sys.columns col ON 
obj.object_id = col.object_id LEFT JOIN sys.types t ON t.user_type_id = 
col.user_type_id"
-            + " WHERE obj.name IN ('tbl') ORDER BY col.column_id";
+            + " WHERE obj.schema_id = SCHEMA_ID() AND obj.name IN ('tbl') 
ORDER BY col.column_id";
     
     private static final String LOAD_COLUMN_META_DATA_WITH_TABLES_LOW_VERSION 
= "SELECT obj.name AS TABLE_NAME, col.name AS COLUMN_NAME, t.name AS DATA_TYPE,"
             + " col.collation_name AS COLLATION_NAME, col.column_id, 
is_identity AS IS_IDENTITY, col.is_nullable AS IS_NULLABLE,"
-            + "  (SELECT TOP 1 ind.is_primary_key FROM sys.index_columns ic 
LEFT JOIN sys.indexes ind ON ic.object_id = ind.object_id"
-            + " AND ic.index_id = ind.index_id AND ind.name LIKE 'PK_%' WHERE 
ic.object_id = obj.object_id AND ic.column_id = col.column_id) AS 
IS_PRIMARY_KEY"
+            + "  CASE WHEN EXISTS (SELECT 1 FROM sys.index_columns ic INNER 
JOIN sys.indexes ind ON ic.object_id = ind.object_id"
+            + " AND ic.index_id = ind.index_id WHERE ic.object_id = 
obj.object_id AND ic.column_id = col.column_id AND ind.is_primary_key = 1)"
+            + " THEN 1 ELSE 0 END AS IS_PRIMARY_KEY"
             + " FROM sys.objects obj INNER JOIN sys.columns col ON 
obj.object_id = col.object_id LEFT JOIN sys.types t ON t.user_type_id = 
col.user_type_id"
-            + " WHERE obj.name IN ('tbl') ORDER BY col.column_id";
+            + " WHERE obj.schema_id = SCHEMA_ID() AND obj.name IN ('tbl') 
ORDER BY col.column_id";
     
     private static final String LOAD_INDEX_META_DATA = "SELECT idx.name AS 
INDEX_NAME, obj.name AS TABLE_NAME, col.name AS COLUMN_NAME,"
             + " idx.is_unique AS IS_UNIQUE FROM sys.indexes idx"
-            + " LEFT JOIN sys.objects obj ON idx.object_id = obj.object_id"
-            + " LEFT JOIN sys.columns col ON obj.object_id = col.object_id"
-            + " WHERE idx.index_id NOT IN (0, 255) AND obj.name IN ('tbl') 
ORDER BY idx.index_id";
+            + " INNER JOIN sys.objects obj ON idx.object_id = obj.object_id"
+            + " INNER JOIN sys.index_columns ic ON idx.object_id = 
ic.object_id AND idx.index_id = ic.index_id"
+            + " INNER JOIN sys.columns col ON ic.object_id = col.object_id AND 
ic.column_id = col.column_id"
+            + " WHERE idx.index_id NOT IN (0, 255) AND obj.schema_id = 
SCHEMA_ID() AND obj.name IN ('tbl') ORDER BY idx.index_id, ic.index_column_id";
     
     private static final String LOAD_COLUMN_META_DATA_WITH_VIEW = "SELECT 
obj.name AS TABLE_NAME, col.name AS COLUMN_NAME, t.name AS DATA_TYPE,"
             + " col.collation_name AS COLLATION_NAME, col.column_id, 
is_identity AS IS_IDENTITY, col.is_nullable AS IS_NULLABLE,"
-            + "  (SELECT TOP 1 ind.is_primary_key FROM sys.index_columns ic 
LEFT JOIN sys.indexes ind ON ic.object_id = ind.object_id"
-            + " AND ic.index_id = ind.index_id AND ind.name LIKE 'PK_%' WHERE 
ic.object_id = obj.object_id AND ic.column_id = col.column_id) AS 
IS_PRIMARY_KEY"
+            + "  CASE WHEN EXISTS (SELECT 1 FROM sys.index_columns ic INNER 
JOIN sys.indexes ind ON ic.object_id = ind.object_id"
+            + " AND ic.index_id = ind.index_id WHERE ic.object_id = 
obj.object_id AND ic.column_id = col.column_id AND ind.is_primary_key = 1)"
+            + " THEN 1 ELSE 0 END AS IS_PRIMARY_KEY"
             + " FROM sys.objects obj INNER JOIN sys.columns col ON 
obj.object_id = col.object_id LEFT JOIN sys.types t ON t.user_type_id = 
col.user_type_id"
-            + " WHERE obj.name IN ('tbl','tbl_view') ORDER BY col.column_id";
+            + " WHERE obj.schema_id = SCHEMA_ID() AND obj.name IN 
('tbl','tbl_view') ORDER BY col.column_id";
     
-    private static final String LOAD_VIEW_META_DATA = "SELECT name AS 
TABLE_NAME FROM sys.objects WHERE type = 'V' AND name IN ('tbl_view','tbl')";
+    private static final String LOAD_VIEW_META_DATA =
+            "SELECT obj.name AS TABLE_NAME FROM sys.objects obj WHERE obj.type 
= 'V' AND obj.schema_id = SCHEMA_ID() AND obj.name IN ('tbl_view','tbl')";
     
     private final DatabaseType databaseType = 
TypedSPILoader.getService(DatabaseType.class, "SQLServer");
     

Reply via email to