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

duanzhengqiang 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 f462c953efd Support SQLServer column visible. (#20260)
f462c953efd is described below

commit f462c953efd079a4c972ebb0b5069b0b0b39eb75
Author: Zonglei Dong <[email protected]>
AuthorDate: Thu Aug 18 18:45:46 2022 +0800

    Support SQLServer column visible. (#20260)
    
    * Optimize Oracle visible column code, remove version judgment.
    
    * Support visible column for SQLServer database.
    
    * Optimize SQLServer visible column code, add version judgment.
---
 .../loader/dialect/OracleSchemaMetaDataLoader.java |  15 +--
 .../dialect/SQLServerSchemaMetaDataLoader.java     |  33 ++++--
 .../dialect/OracleSchemaMetaDataLoaderTest.java    |  16 +--
 .../dialect/SQLServerSchemaMetaDataLoaderTest.java | 112 ++++++++++++++++-----
 4 files changed, 119 insertions(+), 57 deletions(-)

diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OracleSchemaMetaDataLoader.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OracleSchemaMetaDataLoader.java
index 904b4b647a5..e0aad44a6f2 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OracleSchemaMetaDataLoader.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OracleSchemaMetaDataLoader.java
@@ -47,7 +47,7 @@ import java.util.stream.Collectors;
  */
 public final class OracleSchemaMetaDataLoader implements 
DialectSchemaMetaDataLoader {
     
-    private static final String TABLE_META_DATA_SQL_NO_ORDER = "SELECT OWNER 
AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_ID %s FROM 
ALL_TAB_COLS WHERE OWNER = ?";
+    private static final String TABLE_META_DATA_SQL_NO_ORDER = "SELECT OWNER 
AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_ID, HIDDEN_COLUMN 
%s FROM ALL_TAB_COLS WHERE OWNER = ?";
     
     private static final String ORDER_BY_COLUMN_ID = " ORDER BY COLUMN_ID";
     
@@ -68,8 +68,6 @@ public final class OracleSchemaMetaDataLoader implements 
DialectSchemaMetaDataLo
     
     private static final int IDENTITY_COLUMN_START_MINOR_VERSION = 1;
     
-    private static final int HIDDEN_COLUMN_START_MINOR_VERSION = 1;
-    
     private static final int MAX_EXPRESSION_SIZE = 1000;
     
     @Override
@@ -117,7 +115,7 @@ public final class OracleSchemaMetaDataLoader implements 
DialectSchemaMetaDataLo
         boolean generated = versionContainsIdentityColumn(databaseMetaData) && 
"YES".equals(resultSet.getString("IDENTITY_COLUMN"));
         // TODO need to support caseSensitive when version < 12.2.
         boolean caseSensitive = versionContainsCollation(databaseMetaData) && 
resultSet.getString("COLLATION").endsWith("_CS");
-        boolean isVisible = !(versionContainsHiddenColumn(databaseMetaData) && 
"YES".equals(resultSet.getString("HIDDEN_COLUMN")));
+        boolean isVisible = "NO".equals(resultSet.getString("HIDDEN_COLUMN"));
         return new ColumnMetaData(columnName, dataTypeMap.get(dataType), 
primaryKey, generated, caseSensitive, isVisible);
     }
     
@@ -130,10 +128,7 @@ public final class OracleSchemaMetaDataLoader implements 
DialectSchemaMetaDataLo
     }
     
     private String getTableMetaDataSQL(final Collection<String> tables, final 
DatabaseMetaData databaseMetaData) throws SQLException {
-        StringBuilder stringBuilder = new StringBuilder(43);
-        if (versionContainsHiddenColumn(databaseMetaData)) {
-            stringBuilder.append(", HIDDEN_COLUMN");
-        }
+        StringBuilder stringBuilder = new StringBuilder(28);
         if (versionContainsIdentityColumn(databaseMetaData)) {
             stringBuilder.append(", IDENTITY_COLUMN");
         }
@@ -145,10 +140,6 @@ public final class OracleSchemaMetaDataLoader implements 
DialectSchemaMetaDataLo
                 : String.format(TABLE_META_DATA_SQL_IN_TABLES, collation, 
tables.stream().map(each -> String.format("'%s'", 
each)).collect(Collectors.joining(",")));
     }
     
-    private boolean versionContainsHiddenColumn(final DatabaseMetaData 
databaseMetaData) throws SQLException {
-        return databaseMetaData.getDatabaseMajorVersion() >= 
COLLATION_START_MAJOR_VERSION && databaseMetaData.getDatabaseMinorVersion() >= 
HIDDEN_COLUMN_START_MINOR_VERSION;
-    }
-    
     private boolean versionContainsCollation(final DatabaseMetaData 
databaseMetaData) throws SQLException {
         return databaseMetaData.getDatabaseMajorVersion() >= 
COLLATION_START_MAJOR_VERSION && databaseMetaData.getDatabaseMinorVersion() >= 
COLLATION_START_MINOR_VERSION;
     }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/SQLServerSchemaMetaDataLoader.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/SQLServerSchemaMetaDataLoader.java
index e82c5687144..bfe8db45afc 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/SQLServerSchemaMetaDataLoader.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/SQLServerSchemaMetaDataLoader.java
@@ -27,6 +27,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.Diale
 
 import javax.sql.DataSource;
 import java.sql.Connection;
+import java.sql.DatabaseMetaData;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -44,19 +45,21 @@ import java.util.stream.Collectors;
 public final class SQLServerSchemaMetaDataLoader implements 
DialectSchemaMetaDataLoader {
     
     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.collation_name AS COLLATION_NAME, col.column_id, 
is_identity AS IS_IDENTITY, %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"
+            + " 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 ORDER_BY_COLUMN_ID = " ORDER BY col.column_id";
     
     private static final String TABLE_META_DATA_SQL = 
TABLE_META_DATA_SQL_NO_ORDER + ORDER_BY_COLUMN_ID;
     
-    private static final String TABLE_META_DATA_SQL_IN_TABLES = " 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.name IN (%s)" + ORDER_BY_COLUMN_ID;
     
     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)";
+
+    private static final int HIDDEN_COLUMN_START_MAJOR_VERSION = 15;
     
     @Override
     public Collection<SchemaMetaData> load(final DataSource dataSource, final 
Collection<String> tables, final String defaultSchemaName) throws SQLException {
@@ -76,12 +79,12 @@ public final class SQLServerSchemaMetaDataLoader implements 
DialectSchemaMetaDat
         Map<String, Collection<ColumnMetaData>> result = new HashMap<>();
         try (
                 Connection connection = dataSource.getConnection();
-                PreparedStatement preparedStatement = 
connection.prepareStatement(getTableMetaDataSQL(tables))) {
+                PreparedStatement preparedStatement = 
connection.prepareStatement(getTableMetaDataSQL(tables, 
connection.getMetaData()))) {
             Map<String, Integer> dataTypes = 
DataTypeLoaderFactory.getInstance(DatabaseTypeFactory.getInstance("SQLServer")).load(connection.getMetaData());
             try (ResultSet resultSet = preparedStatement.executeQuery()) {
                 while (resultSet.next()) {
                     String tableName = resultSet.getString("TABLE_NAME");
-                    ColumnMetaData columnMetaData = 
loadColumnMetaData(dataTypes, resultSet);
+                    ColumnMetaData columnMetaData = 
loadColumnMetaData(dataTypes, resultSet, connection.getMetaData());
                     if (!result.containsKey(tableName)) {
                         result.put(tableName, new LinkedList<>());
                     }
@@ -92,19 +95,29 @@ public final class SQLServerSchemaMetaDataLoader implements 
DialectSchemaMetaDat
         return result;
     }
     
-    private ColumnMetaData loadColumnMetaData(final Map<String, Integer> 
dataTypeMap, final ResultSet resultSet) throws SQLException {
+    private ColumnMetaData loadColumnMetaData(final Map<String, Integer> 
dataTypeMap, final ResultSet resultSet, final DatabaseMetaData 
databaseMetaData) throws SQLException {
         String columnName = resultSet.getString("COLUMN_NAME");
         String dataType = resultSet.getString("DATA_TYPE");
         String collationName = resultSet.getString("COLLATION_NAME");
         boolean primaryKey = "1".equals(resultSet.getString("IS_PRIMARY_KEY"));
         boolean generated = "1".equals(resultSet.getString("IS_IDENTITY"));
         boolean caseSensitive = null != collationName && 
collationName.indexOf("_CS") > 0;
-        return new ColumnMetaData(columnName, dataTypeMap.get(dataType), 
primaryKey, generated, caseSensitive, true);
+        boolean isVisible = !(versionContainsHiddenColumn(databaseMetaData) && 
"1".equals(resultSet.getString("IS_HIDDEN")));
+        return new ColumnMetaData(columnName, dataTypeMap.get(dataType), 
primaryKey, generated, caseSensitive, isVisible);
     }
     
-    private String getTableMetaDataSQL(final Collection<String> tables) {
-        return tables.isEmpty() ? TABLE_META_DATA_SQL
-                : TABLE_META_DATA_SQL_NO_ORDER + 
String.format(TABLE_META_DATA_SQL_IN_TABLES, tables.stream().map(each -> 
String.format("'%s'", each)).collect(Collectors.joining(",")));
+    private String getTableMetaDataSQL(final Collection<String> tables, final 
DatabaseMetaData databaseMetaData) throws SQLException {
+        StringBuilder stringBuilder = new StringBuilder(24);
+        if (versionContainsHiddenColumn(databaseMetaData)) {
+            stringBuilder.append("is_hidden AS IS_HIDDEN,");
+        }
+        String isHidden = stringBuilder.toString();
+        return tables.isEmpty() ? String.format(TABLE_META_DATA_SQL, isHidden)
+                : String.format(TABLE_META_DATA_SQL_IN_TABLES, isHidden, 
tables.stream().map(each -> String.format("'%s'", 
each)).collect(Collectors.joining(",")));
+    }
+
+    private boolean versionContainsHiddenColumn(final DatabaseMetaData 
databaseMetaData) throws SQLException {
+        return databaseMetaData.getDatabaseMajorVersion() >= 
HIDDEN_COLUMN_START_MAJOR_VERSION;
     }
     
     private Map<String, Collection<IndexMetaData>> loadIndexMetaData(final 
DataSource dataSource, final Collection<String> tableNames) throws SQLException 
{
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OracleSchemaMetaDataLoaderTest.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OracleSchemaMetaDataLoaderTest.java
index b9c5aaba561..5db4573c9fb 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OracleSchemaMetaDataLoaderTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OracleSchemaMetaDataLoaderTest.java
@@ -51,22 +51,22 @@ public final class OracleSchemaMetaDataLoaderTest {
     
     private static final String ALL_INDEXES_SQL = "SELECT OWNER AS 
TABLE_SCHEMA, TABLE_NAME, INDEX_NAME FROM ALL_INDEXES WHERE OWNER = ? AND 
TABLE_NAME IN ('tbl')";
     
-    private static final String ALL_TAB_COLUMNS_SQL_CONDITION1 = "SELECT OWNER 
AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_ID , HIDDEN_COLUMN, 
IDENTITY_COLUMN, COLLATION"
+    private static final String ALL_TAB_COLUMNS_SQL_CONDITION1 = "SELECT OWNER 
AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_ID, HIDDEN_COLUMN , 
IDENTITY_COLUMN, COLLATION"
             + " FROM ALL_TAB_COLS WHERE OWNER = ? AND TABLE_NAME IN ('tbl') 
ORDER BY COLUMN_ID";
     
-    private static final String ALL_TAB_COLUMNS_SQL_CONDITION2 = "SELECT OWNER 
AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_ID , HIDDEN_COLUMN, 
IDENTITY_COLUMN"
+    private static final String ALL_TAB_COLUMNS_SQL_CONDITION2 = "SELECT OWNER 
AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_ID, HIDDEN_COLUMN , 
IDENTITY_COLUMN"
             + " FROM ALL_TAB_COLS WHERE OWNER = ? AND TABLE_NAME IN ('tbl') 
ORDER BY COLUMN_ID";
     
-    private static final String ALL_TAB_COLUMNS_SQL_CONDITION3 = "SELECT OWNER 
AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_ID  FROM 
ALL_TAB_COLS WHERE OWNER = ?"
+    private static final String ALL_TAB_COLUMNS_SQL_CONDITION3 = "SELECT OWNER 
AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_ID, HIDDEN_COLUMN  
FROM ALL_TAB_COLS WHERE OWNER = ?"
             + " AND TABLE_NAME IN ('tbl') ORDER BY COLUMN_ID";
     
-    private static final String ALL_TAB_COLUMNS_SQL_CONDITION4 = "SELECT OWNER 
AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_ID , HIDDEN_COLUMN, 
IDENTITY_COLUMN, COLLATION"
+    private static final String ALL_TAB_COLUMNS_SQL_CONDITION4 = "SELECT OWNER 
AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_ID, HIDDEN_COLUMN , 
IDENTITY_COLUMN, COLLATION"
             + " FROM ALL_TAB_COLS WHERE OWNER = ? AND TABLE_NAME IN ('tbl') 
ORDER BY COLUMN_ID";
     
-    private static final String ALL_TAB_COLUMNS_SQL_CONDITION5 = "SELECT OWNER 
AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_ID , HIDDEN_COLUMN, 
IDENTITY_COLUMN FROM ALL_TAB_COLS"
+    private static final String ALL_TAB_COLUMNS_SQL_CONDITION5 = "SELECT OWNER 
AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_ID, HIDDEN_COLUMN , 
IDENTITY_COLUMN FROM ALL_TAB_COLS"
             + " WHERE OWNER = ? AND TABLE_NAME IN ('tbl') ORDER BY COLUMN_ID";
     
-    private static final String ALL_TAB_COLUMNS_SQL_CONDITION6 = "SELECT OWNER 
AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_ID  FROM 
ALL_TAB_COLS"
+    private static final String ALL_TAB_COLUMNS_SQL_CONDITION6 = "SELECT OWNER 
AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_ID, HIDDEN_COLUMN  
FROM ALL_TAB_COLS"
             + " WHERE OWNER = ? AND TABLE_NAME IN ('tbl') ORDER BY COLUMN_ID";
     
     @Test
@@ -123,7 +123,7 @@ public final class OracleSchemaMetaDataLoaderTest {
         TableMetaData actualTableMetaData = 
actual.iterator().next().getTables().iterator().next();
         Iterator<ColumnMetaData> columnsIterator = 
actualTableMetaData.getColumns().iterator();
         assertThat(columnsIterator.next(), is(new ColumnMetaData("id", 4, 
false, false, false, true)));
-        assertThat(columnsIterator.next(), is(new ColumnMetaData("name", 12, 
false, false, false, true)));
+        assertThat(columnsIterator.next(), is(new ColumnMetaData("name", 12, 
false, false, false, false)));
     }
     
     @Test
@@ -180,7 +180,7 @@ public final class OracleSchemaMetaDataLoaderTest {
         TableMetaData actualTableMetaData = 
actual.iterator().next().getTables().iterator().next();
         Iterator<ColumnMetaData> columnsIterator = 
actualTableMetaData.getColumns().iterator();
         assertThat(columnsIterator.next(), is(new ColumnMetaData("id", 4, 
true, false, false, true)));
-        assertThat(columnsIterator.next(), is(new ColumnMetaData("name", 12, 
false, false, false, true)));
+        assertThat(columnsIterator.next(), is(new ColumnMetaData("name", 12, 
false, false, false, false)));
     }
     
     private DataSource mockDataSource() throws SQLException {
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/SQLServerSchemaMetaDataLoaderTest.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/SQLServerSchemaMetaDataLoaderTest.java
index 82dda8e3e3c..be75b6f47be 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/SQLServerSchemaMetaDataLoaderTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/SQLServerSchemaMetaDataLoaderTest.java
@@ -42,44 +42,104 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 public final class SQLServerSchemaMetaDataLoaderTest {
+
+    private static final String 
LOAD_COLUMN_META_DATA_WITHOUT_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, 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"
+            + " 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 ORDER BY col.column_id";
+
+    private static final String 
LOAD_COLUMN_META_DATA_WITHOUT_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,"
+            + "  (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 ORDER BY col.column_id";
+
+    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, 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"
+            + " 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";
+
+    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,"
+            + "  (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 IN ('tbl') ORDER BY col.column_id";
+
+    private static final String LOAD_INDEX_META_DATA = "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')";
     
     @Test
-    public void assertLoadWithoutTables() throws SQLException {
+    public void assertLoadWithoutTablesWithHighVersion() throws SQLException {
         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, 
col.column_id, 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 ORDER BY col.column_id")
+        
when(dataSource.getConnection().prepareStatement(LOAD_COLUMN_META_DATA_WITHOUT_TABLES_HIGH_VERSION)
                 .executeQuery()).thenReturn(resultSet);
         ResultSet indexResultSet = mockIndexMetaDataResultSet();
-        when(dataSource.getConnection().prepareStatement(
-                "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')")
+        when(dataSource.getConnection().prepareStatement(LOAD_INDEX_META_DATA)
                 .executeQuery()).thenReturn(indexResultSet);
-        
assertTableMetaDataMap(getDialectTableMetaDataLoader().load(dataSource, 
Collections.emptyList(), "sharding_db"));
+        
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(15);
+        Collection<SchemaMetaData> actual = 
getDialectTableMetaDataLoader().load(dataSource, Collections.emptyList(), 
"sharding_db");
+        assertTableMetaDataMap(actual);
+        TableMetaData actualTableMetaData = 
actual.iterator().next().getTables().iterator().next();
+        Iterator<ColumnMetaData> columnsIterator = 
actualTableMetaData.getColumns().iterator();
+        assertThat(columnsIterator.next(), is(new ColumnMetaData("id", 4, 
false, true, true, true)));
+        assertThat(columnsIterator.next(), is(new ColumnMetaData("name", 12, 
false, false, false, false)));
     }
-    
+
     @Test
-    public void assertLoadWithTables() throws SQLException {
+    public void assertLoadWithoutTablesWithLowVersion() throws SQLException {
         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, 
col.column_id, 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 IN ('tbl') ORDER BY col.column_id")
+        
when(dataSource.getConnection().prepareStatement(LOAD_COLUMN_META_DATA_WITHOUT_TABLES_LOW_VERSION)
                 .executeQuery()).thenReturn(resultSet);
         ResultSet indexResultSet = mockIndexMetaDataResultSet();
-        when(dataSource.getConnection().prepareStatement(
-                "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')")
+        when(dataSource.getConnection().prepareStatement(LOAD_INDEX_META_DATA)
+                .executeQuery()).thenReturn(indexResultSet);
+        
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(14);
+        Collection<SchemaMetaData> actual = 
getDialectTableMetaDataLoader().load(dataSource, Collections.emptyList(), 
"sharding_db");
+        assertTableMetaDataMap(actual);
+        TableMetaData actualTableMetaData = 
actual.iterator().next().getTables().iterator().next();
+        Iterator<ColumnMetaData> columnsIterator = 
actualTableMetaData.getColumns().iterator();
+        assertThat(columnsIterator.next(), is(new ColumnMetaData("id", 4, 
false, true, true, true)));
+        assertThat(columnsIterator.next(), is(new ColumnMetaData("name", 12, 
false, false, false, true)));
+    }
+    
+    @Test
+    public void assertLoadWithTablesWithHighVersion() throws SQLException {
+        DataSource dataSource = mockDataSource();
+        ResultSet resultSet = mockTableMetaDataResultSet();
+        
when(dataSource.getConnection().prepareStatement(LOAD_COLUMN_META_DATA_WITH_TABLES_HIGH_VERSION).executeQuery()).thenReturn(resultSet);
+        ResultSet indexResultSet = mockIndexMetaDataResultSet();
+        when(dataSource.getConnection().prepareStatement(LOAD_INDEX_META_DATA)
                 .executeQuery()).thenReturn(indexResultSet);
-        
assertTableMetaDataMap(getDialectTableMetaDataLoader().load(dataSource, 
Collections.singletonList("tbl"), "sharding_db"));
+        
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(15);
+        Collection<SchemaMetaData> actual = 
getDialectTableMetaDataLoader().load(dataSource, 
Collections.singletonList("tbl"), "sharding_db");
+        assertTableMetaDataMap(actual);
+        TableMetaData actualTableMetaData = 
actual.iterator().next().getTables().iterator().next();
+        Iterator<ColumnMetaData> columnsIterator = 
actualTableMetaData.getColumns().iterator();
+        assertThat(columnsIterator.next(), is(new ColumnMetaData("id", 4, 
false, true, true, true)));
+        assertThat(columnsIterator.next(), is(new ColumnMetaData("name", 12, 
false, false, false, false)));
+    }
+
+    @Test
+    public void assertLoadWithTablesWithLowVersion() throws SQLException {
+        DataSource dataSource = mockDataSource();
+        ResultSet resultSet = mockTableMetaDataResultSet();
+        
when(dataSource.getConnection().prepareStatement(LOAD_COLUMN_META_DATA_WITH_TABLES_LOW_VERSION).executeQuery()).thenReturn(resultSet);
+        ResultSet indexResultSet = mockIndexMetaDataResultSet();
+        when(dataSource.getConnection().prepareStatement(LOAD_INDEX_META_DATA)
+                .executeQuery()).thenReturn(indexResultSet);
+        
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(14);
+        Collection<SchemaMetaData> actual = 
getDialectTableMetaDataLoader().load(dataSource, 
Collections.singletonList("tbl"), "sharding_db");
+        assertTableMetaDataMap(actual);
+        TableMetaData actualTableMetaData = 
actual.iterator().next().getTables().iterator().next();
+        Iterator<ColumnMetaData> columnsIterator = 
actualTableMetaData.getColumns().iterator();
+        assertThat(columnsIterator.next(), is(new ColumnMetaData("id", 4, 
false, true, true, true)));
+        assertThat(columnsIterator.next(), is(new ColumnMetaData("name", 12, 
false, false, false, true)));
     }
     
     private DataSource mockDataSource() throws SQLException {
@@ -105,6 +165,7 @@ public final class SQLServerSchemaMetaDataLoaderTest {
         when(result.getString("DATA_TYPE")).thenReturn("int", "varchar");
         when(result.getString("COLUMN_KEY")).thenReturn("1", "");
         when(result.getString("IS_IDENTITY")).thenReturn("1", "");
+        when(result.getString("IS_HIDDEN")).thenReturn("0", "1");
         
when(result.getString("COLLATION_NAME")).thenReturn("SQL_Latin1_General_CP1_CS_AS",
 "utf8");
         return result;
     }
@@ -127,9 +188,6 @@ public final class SQLServerSchemaMetaDataLoaderTest {
         assertThat(schemaMetaDataList.size(), is(1));
         TableMetaData actualTableMetaData = 
schemaMetaDataList.iterator().next().getTables().iterator().next();
         assertThat(actualTableMetaData.getColumns().size(), is(2));
-        Iterator<ColumnMetaData> columnsIterator = 
actualTableMetaData.getColumns().iterator();
-        assertThat(columnsIterator.next(), is(new ColumnMetaData("id", 4, 
false, true, true, true)));
-        assertThat(columnsIterator.next(), is(new ColumnMetaData("name", 12, 
false, false, false, true)));
         assertThat(actualTableMetaData.getIndexes().size(), is(1));
         Iterator<IndexMetaData> indexesIterator = 
actualTableMetaData.getIndexes().iterator();
         assertThat(indexesIterator.next(), is(new IndexMetaData("id")));

Reply via email to