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;