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")));
}