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 61cd5522370 Support visible column for Oracle database. (#20225)
61cd5522370 is described below

commit 61cd5522370a5dc60612004934b5a5b8b2e41c03
Author: Zonglei Dong <dongzong...@apache.org>
AuthorDate: Wed Aug 17 11:44:09 2022 +0800

    Support visible column for Oracle database. (#20225)
---
 .../loader/dialect/OracleSchemaMetaDataLoader.java | 16 ++++++++++---
 .../dialect/OracleSchemaMetaDataLoaderTest.java    | 27 +++++++++++-----------
 2 files changed, 27 insertions(+), 16 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 8d01838fec5..2e5156168d5 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_COLUMNS 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 %s FROM 
ALL_TAB_COLS WHERE OWNER = ?";
     
     private static final String ORDER_BY_COLUMN_ID = " ORDER BY COLUMN_ID";
     
@@ -67,6 +67,8 @@ public final class OracleSchemaMetaDataLoader implements 
DialectSchemaMetaDataLo
     private static final int COLLATION_START_MINOR_VERSION = 2;
     
     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;
     
@@ -115,7 +117,8 @@ 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");
-        return new ColumnMetaData(columnName, dataTypeMap.get(dataType), 
primaryKey, generated, caseSensitive, true);
+        boolean isVisible = !(versionContainsHiddenColumn(databaseMetaData) && 
"YES".equals(resultSet.getString("HIDDEN_COLUMN")));
+        return new ColumnMetaData(columnName, dataTypeMap.get(dataType), 
primaryKey, generated, caseSensitive, isVisible);
     }
     
     private String getOriginalDataType(final String dataType) {
@@ -127,7 +130,10 @@ public final class OracleSchemaMetaDataLoader implements 
DialectSchemaMetaDataLo
     }
     
     private String getTableMetaDataSQL(final Collection<String> tables, final 
DatabaseMetaData databaseMetaData) throws SQLException {
-        StringBuilder stringBuilder = new StringBuilder(28);
+        StringBuilder stringBuilder = new StringBuilder(43);
+        if (versionContainsHiddenColumn(databaseMetaData)) {
+            stringBuilder.append(", HIDDEN_COLUMN");
+        }
         if (versionContainsIdentityColumn(databaseMetaData)) {
             stringBuilder.append(", IDENTITY_COLUMN");
         }
@@ -138,6 +144,10 @@ public final class OracleSchemaMetaDataLoader implements 
DialectSchemaMetaDataLo
         return tables.isEmpty() ? String.format(TABLE_META_DATA_SQL, collation)
                 : 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/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 d5c112758f1..b9c5aaba561 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 , 
IDENTITY_COLUMN, COLLATION"
-            + " FROM ALL_TAB_COLUMNS WHERE OWNER = ? AND TABLE_NAME IN ('tbl') 
ORDER BY COLUMN_ID";
+    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 , 
IDENTITY_COLUMN FROM ALL_TAB_COLUMNS 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"
+            + " 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_COLUMNS WHERE OWNER = ?"
+    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 = ?"
             + " 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 , 
IDENTITY_COLUMN, COLLATION FROM ALL_TAB_COLUMNS"
-            + " 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"
+            + " 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 , 
IDENTITY_COLUMN FROM ALL_TAB_COLUMNS"
+    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_COLUMNS"
+    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"
             + " WHERE OWNER = ? AND TABLE_NAME IN ('tbl') ORDER BY COLUMN_ID";
     
     @Test
@@ -85,7 +85,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, true, true, 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
@@ -104,7 +104,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, true, 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
@@ -142,7 +142,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, true, true, 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
@@ -161,7 +161,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, true, 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
@@ -204,6 +204,7 @@ public final class OracleSchemaMetaDataLoaderTest {
         when(result.getString("TABLE_NAME")).thenReturn("tbl");
         when(result.getString("COLUMN_NAME")).thenReturn("id", "name", 
"creation_time");
         when(result.getString("DATA_TYPE")).thenReturn("int", "varchar", 
"TIMESTAMP(6)");
+        when(result.getString("HIDDEN_COLUMN")).thenReturn("NO", "YES", "NO");
         when(result.getString("IDENTITY_COLUMN")).thenReturn("YES", "NO", 
"NO");
         when(result.getString("COLLATION")).thenReturn("BINARY_CS", 
"BINARY_CI", "BINARY_CI");
         return result;

Reply via email to