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

panjuan 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 8f096cd  fix sqlserver table metadata load exception (#10544)
8f096cd is described below

commit 8f096cd616a21bf3cc40f3d0d177e9506247ed5d
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Sat May 29 18:03:58 2021 +0800

    fix sqlserver table metadata load exception (#10544)
    
    * fix sqlserver table metadata load exception
    
    * fix test case
    
    * fix checkstyle
---
 .../dialect/SQLServerTableMetaDataLoader.java      | 19 ++++++++-------
 .../dialect/SQLServerTableMetaDataLoaderTest.java  | 28 ++++++++++++----------
 2 files changed, 25 insertions(+), 22 deletions(-)

diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/builder/loader/dialect/SQLServerTableMetaDataLoader.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/builder/loader/dialect/SQLServerTableMetaDataLoader.java
index 80a08a6..522d3ea 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/builder/loader/dialect/SQLServerTableMetaDataLoader.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/builder/loader/dialect/SQLServerTableMetaDataLoader.java
@@ -30,6 +30,7 @@ import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
@@ -42,16 +43,16 @@ import java.util.stream.Collectors;
  */
 public final class SQLServerTableMetaDataLoader implements 
DialectTableMetaDataLoader {
     
-    private static final String TABLE_META_DATA_SQL = "SELECT obj.name AS 
TABLE_NAME,col.name AS COLUMN_NAME,t.name AS DATA_TYPE,"
-            + "col.collation_name AS COLLATION_NAME, is_identity AS 
IS_IDENTITY, "
-            + "(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"
-            + "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 TABLE_META_DATA_SQL = "SELECT obj.name AS 
TABLE_NAME, col.name AS COLUMN_NAME, t.name AS DATA_TYPE,"
+            + " col.collation_name AS COLLATION_NAME, is_identity AS 
IS_IDENTITY,"
+            + " (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"
+            + " 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 TABLE_META_DATA_SQL_WITH_EXISTED_TABLES = " 
WHERE c.name NOT IN (%s)";
+    private static final String TABLE_META_DATA_SQL_WITH_EXISTED_TABLES = " 
WHERE obj.name NOT IN (%s)";
     
-    private static final String INDEX_META_DATA_SQL = "SELECT a.name AS 
INDEX_NAME, c.name AS TABLE_NAME FROM sysindexes a "
-            + "JOIN sysobjects c ON a.id=c.id WHERE a.indid NOT IN (0, 255) 
AND c.name IN (%s)";
+    private static final String INDEX_META_DATA_SQL = "SELECT a.name AS 
INDEX_NAME, c.name AS TABLE_NAME FROM sys.indexes a"
+            + " JOIN sys.objects c ON a.object_id = c.object_id WHERE 
a.index_id NOT IN (0, 255) AND c.name IN (%s)";
     
     @Override
     public Map<String, TableMetaData> load(final DataSource dataSource, final 
Collection<String> existedTables) throws SQLException {
@@ -64,7 +65,7 @@ public final class SQLServerTableMetaDataLoader implements 
DialectTableMetaDataL
         if (!columnMetaDataMap.isEmpty()) {
             Map<String, Collection<IndexMetaData>> indexMetaDataMap = 
loadIndexMetaData(dataSource, columnMetaDataMap.keySet());
             for (Entry<String, Collection<ColumnMetaData>> entry : 
columnMetaDataMap.entrySet()) {
-                result.put(entry.getKey(), new TableMetaData(entry.getValue(), 
indexMetaDataMap.get(entry.getKey())));
+                result.put(entry.getKey(), new TableMetaData(entry.getValue(), 
indexMetaDataMap.getOrDefault(entry.getKey(), Collections.emptyList())));
             }
         }
         return result;
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/schema/builder/loader/dialect/SQLServerTableMetaDataLoaderTest.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/schema/builder/loader/dialect/SQLServerTableMetaDataLoaderTest.java
index 4793e59..e8dbc57 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/schema/builder/loader/dialect/SQLServerTableMetaDataLoaderTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/schema/builder/loader/dialect/SQLServerTableMetaDataLoaderTest.java
@@ -49,15 +49,16 @@ public final class SQLServerTableMetaDataLoaderTest {
         DataSource dataSource = mockDataSource();
         ResultSet resultSet = mockTableMetaDataResultSet();
         when(dataSource.getConnection().prepareStatement(
-                "SELECT obj.name AS TABLE_NAME,col.name AS COLUMN_NAME,t.name 
AS DATA_TYPE,"
-                        + "col.collation_name AS COLLATION_NAME, is_identity 
AS IS_IDENTITY, "
-                        + "(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"
-                        + "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")
+                "SELECT obj.name AS TABLE_NAME, col.name AS COLUMN_NAME, 
t.name AS DATA_TYPE,"
+                        + " col.collation_name AS COLLATION_NAME, is_identity 
AS IS_IDENTITY,"
+                        + " (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"
+                        + " 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")
                 .executeQuery()).thenReturn(resultSet);
         ResultSet indexResultSet = mockIndexMetaDataResultSet();
         when(dataSource.getConnection().prepareStatement(
-                "SELECT a.name AS INDEX_NAME, c.name AS TABLE_NAME FROM 
sysindexes a JOIN sysobjects c ON a.id=c.id WHERE a.indid NOT IN (0, 255) AND 
c.name IN ('tbl')")
+                "SELECT a.name AS INDEX_NAME, c.name AS TABLE_NAME FROM 
sys.indexes a"
+                        + " JOIN sys.objects c ON a.object_id = c.object_id 
WHERE a.index_id NOT IN (0, 255) AND c.name IN ('tbl')")
                 .executeQuery()).thenReturn(indexResultSet);
         assertTableMetaDataMap(getTableMetaDataLoader().load(dataSource, 
Collections.emptyList()));
     }
@@ -67,16 +68,17 @@ public final class SQLServerTableMetaDataLoaderTest {
         DataSource dataSource = mockDataSource();
         ResultSet resultSet = mockTableMetaDataResultSet();
         when(dataSource.getConnection().prepareStatement(
-                "SELECT obj.name AS TABLE_NAME,col.name AS COLUMN_NAME,t.name 
AS DATA_TYPE,"
-                        + "col.collation_name AS COLLATION_NAME, is_identity 
AS IS_IDENTITY, "
-                        + "(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"
-                        + "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 c.name NOT IN ('existed_tbl')")
+                "SELECT obj.name AS TABLE_NAME, col.name AS COLUMN_NAME, 
t.name AS DATA_TYPE,"
+                        + " col.collation_name AS COLLATION_NAME, is_identity 
AS IS_IDENTITY,"
+                        + " (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"
+                        + " 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 NOT IN ('existed_tbl')")
                 .executeQuery()).thenReturn(resultSet);
         ResultSet indexResultSet = mockIndexMetaDataResultSet();
         when(dataSource.getConnection().prepareStatement(
-                "SELECT a.name AS INDEX_NAME, c.name AS TABLE_NAME FROM 
sysindexes a "
-                        + "JOIN sysobjects c ON a.id=c.id WHERE a.indid NOT IN 
(0, 255) AND c.name IN ('tbl')")
+                "SELECT a.name AS INDEX_NAME, c.name AS TABLE_NAME FROM 
sys.indexes a"
+                        + " JOIN sys.objects c ON a.object_id = c.object_id 
WHERE a.index_id NOT IN (0, 255) AND c.name IN ('tbl')")
                 .executeQuery()).thenReturn(indexResultSet);
         assertTableMetaDataMap(getTableMetaDataLoader().load(dataSource, 
Collections.singletonList("existed_tbl")));
     }

Reply via email to