You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2021/06/29 06:46:46 UTC
[shardingsphere] branch master updated: Fix booting error with
oracle 11g (#10956)
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 3c03370 Fix booting error with oracle 11g (#10956)
3c03370 is described below
commit 3c033709ad6eb0fe3bda6998c77ce3bd2c1ecc84
Author: xueshiji <14...@qq.com>
AuthorDate: Tue Jun 29 14:46:19 2021 +0800
Fix booting error with oracle 11g (#10956)
* Fix booting error with oracle 11g
booting error with oracle 11g
* Fix booting error with oracle 11g
Fix booting error with oracle 11g
set correct START_MINOR_VERSION of IDENTITY_COLUMN
* change indent style
* Splitting over-long rows
Splitting over-long rows to fix ci error
* update test sql
* Increase unit test coverage
* change to pass checkStyle
* change indent
improve code readability
---
.../loader/dialect/OracleTableMetaDataLoader.java | 23 ++--
.../dialect/OracleTableMetaDataLoaderTest.java | 120 ++++++++++++++-------
2 files changed, 96 insertions(+), 47 deletions(-)
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/builder/loader/dialect/OracleTableMetaDataLoader.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/builder/loader/dialect/OracleTableMetaDataLoader.java
index 270671a..a08e222 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/builder/loader/dialect/OracleTableMetaDataLoader.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/builder/loader/dialect/OracleTableMetaDataLoader.java
@@ -44,7 +44,7 @@ import java.util.stream.Collectors;
*/
public final class OracleTableMetaDataLoader implements DialectTableMetaDataLoader {
- private static final String TABLE_META_DATA_SQL = "SELECT OWNER AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, IDENTITY_COLUMN %s FROM ALL_TAB_COLUMNS WHERE OWNER = ?";
+ private static final String TABLE_META_DATA_SQL = "SELECT OWNER AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE %s FROM ALL_TAB_COLUMNS WHERE OWNER = ?";
private static final String TABLE_META_DATA_SQL_WITH_EXISTED_TABLES = TABLE_META_DATA_SQL + " AND TABLE_NAME NOT IN (%s)";
@@ -59,6 +59,8 @@ public final class OracleTableMetaDataLoader implements DialectTableMetaDataLoad
private static final int COLLATION_START_MINOR_VERSION = 2;
+ private static final int IDENTITY_COLUMN_START_MINOR_VERSION = 1;
+
@Override
public Map<String, TableMetaData> load(final DataSource dataSource, final Collection<String> existedTables) throws SQLException {
return loadTableMetaDataMap(dataSource, existedTables);
@@ -103,9 +105,18 @@ public final class OracleTableMetaDataLoader implements DialectTableMetaDataLoad
boolean caseSensitive = null != collationName && collationName.endsWith("_CS");
return new ColumnMetaData(columnName, dataTypeMap.get(dataType), primaryKey, generated, caseSensitive);
}
-
+
private String getTableMetaDataSQL(final Collection<String> existedTables, final DatabaseMetaData metaData) throws SQLException {
- String collation = metaData.getDatabaseMajorVersion() >= COLLATION_START_MAJOR_VERSION && metaData.getDatabaseMinorVersion() >= COLLATION_START_MINOR_VERSION ? ", COLLATION" : "";
+ StringBuilder stringBuilder = new StringBuilder(28);
+ int majorVersion = metaData.getDatabaseMajorVersion();
+ int minorVersion = metaData.getDatabaseMinorVersion();
+ if (majorVersion >= COLLATION_START_MAJOR_VERSION && minorVersion >= IDENTITY_COLUMN_START_MINOR_VERSION) {
+ stringBuilder.append(", IDENTITY_COLUMN");
+ }
+ if (majorVersion >= COLLATION_START_MAJOR_VERSION && minorVersion >= COLLATION_START_MINOR_VERSION) {
+ stringBuilder.append(", COLLATION");
+ }
+ String collation = stringBuilder.toString();
return existedTables.isEmpty() ? String.format(TABLE_META_DATA_SQL, collation)
: String.format(TABLE_META_DATA_SQL_WITH_EXISTED_TABLES, collation, existedTables.stream().map(each -> String.format("'%s'", each)).collect(Collectors.joining(",")));
}
@@ -131,7 +142,7 @@ public final class OracleTableMetaDataLoader implements DialectTableMetaDataLoad
private String getIndexMetaDataSQL(final Collection<String> tableNames) {
return String.format(INDEX_META_DATA_SQL, tableNames.stream().map(each -> String.format("'%s'", each)).collect(Collectors.joining(",")));
}
-
+
private Map<String, Collection<String>> loadTablePrimaryKeys(final Connection connection, final Collection<String> tableNames) throws SQLException {
Map<String, Collection<String>> result = new HashMap<>();
try (PreparedStatement preparedStatement = connection.prepareStatement(getPrimaryKeyMetaDataSQL(tableNames))) {
@@ -146,12 +157,12 @@ public final class OracleTableMetaDataLoader implements DialectTableMetaDataLoad
}
return result;
}
-
+
private String getPrimaryKeyMetaDataSQL(final Collection<String> existedTables) {
return existedTables.isEmpty() ? PRIMARY_KEY_META_DATA_SQL
: String.format(PRIMARY_KEY_META_DATA_SQL_WITH_EXISTED_TABLES, existedTables.stream().map(each -> String.format("'%s'", each)).collect(Collectors.joining(",")));
}
-
+
@Override
public String getDatabaseType() {
return "Oracle";
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/schema/builder/loader/dialect/OracleTableMetaDataLoaderTest.java b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/schema/builder/loader/dialect/OracleTableMetaDataLoaderTest.java
index b01edaf..5539621 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/schema/builder/loader/dialect/OracleTableMetaDataLoaderTest.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/schema/builder/loader/dialect/OracleTableMetaDataLoaderTest.java
@@ -37,87 +37,125 @@ import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+/**
+ * Condition 1: Oracle version >= 12.2 WithoutExistedTables.
+ * Condition 2: 12.2>Oracle version >= 12.1 WithoutExistedTables.
+ * Condition 3: Oracle version < 12.1 WithoutExistedTables.
+ * Condition 4: Oracle version >= 12.2 WithExistedTables.
+ * Condition 5: 12.2>Oracle version >= 12.1 WithExistedTables.
+ * Condition 6: Oracle version < 12.1 WithExistedTables.
+ */
public final class OracleTableMetaDataLoaderTest {
+ private static final String ALL_CONSTRAINTS_SQL_WITHOUTEXISTEDTABLES = "SELECT A.OWNER AS TABLE_SCHEMA, A.TABLE_NAME AS TABLE_NAME, B.COLUMN_NAME AS COLUMN_NAME FROM ALL_CONSTRAINTS A"
+ + " INNER JOIN ALL_CONS_COLUMNS B ON A.CONSTRAINT_NAME = B.CONSTRAINT_NAME WHERE CONSTRAINT_TYPE = 'P' AND A.OWNER = ?";
+
+ private static final String ALL_CONSTRAINTS_SQL_WITHEXISTEDTABLES = "SELECT A.OWNER AS TABLE_SCHEMA, A.TABLE_NAME AS TABLE_NAME, B.COLUMN_NAME AS COLUMN_NAME FROM ALL_CONSTRAINTS A"
+ + " INNER JOIN ALL_CONS_COLUMNS B ON A.CONSTRAINT_NAME = B.CONSTRAINT_NAME WHERE CONSTRAINT_TYPE = 'P' AND A.OWNER = ? AND A.TABLE_NAME NOT IN ('existed_tbl')";
+
+ 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 , IDENTITY_COLUMN, COLLATION"
+ + " FROM ALL_TAB_COLUMNS WHERE OWNER = ?";
+
+ private static final String ALL_TAB_COLUMNS_SQL_CONDITION2 = "SELECT OWNER AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE , IDENTITY_COLUMN 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 FROM ALL_TAB_COLUMNS WHERE OWNER = ?";
+
+ private static final String ALL_TAB_COLUMNS_SQL_CONDITION4 = "SELECT OWNER AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE , IDENTITY_COLUMN, COLLATION FROM ALL_TAB_COLUMNS"
+ + " WHERE OWNER = ? AND TABLE_NAME NOT IN ('existed_tbl')";
+
+ private static final String ALL_TAB_COLUMNS_SQL_CONDITION5 = "SELECT OWNER AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE , IDENTITY_COLUMN FROM ALL_TAB_COLUMNS"
+ + " WHERE OWNER = ? AND TABLE_NAME NOT IN ('existed_tbl')";
+
+ private static final String ALL_TAB_COLUMNS_SQL_CONDITION6 = "SELECT OWNER AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE FROM ALL_TAB_COLUMNS"
+ + " WHERE OWNER = ? AND TABLE_NAME NOT IN ('existed_tbl')";
+
@BeforeClass
public static void setUp() {
ShardingSphereServiceLoader.register(DialectTableMetaDataLoader.class);
}
@Test
- public void assertLoadWithoutExistedTablesWithoutCollation() throws SQLException {
+ public void assertLoadCondition1() throws SQLException {
DataSource dataSource = mockDataSource();
ResultSet resultSet = mockTableMetaDataResultSet();
- when(dataSource.getConnection().prepareStatement(
- "SELECT OWNER AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, IDENTITY_COLUMN FROM ALL_TAB_COLUMNS WHERE OWNER = ?").executeQuery()).thenReturn(resultSet);
+ when(dataSource.getConnection().prepareStatement(ALL_TAB_COLUMNS_SQL_CONDITION1).executeQuery()).thenReturn(resultSet);
ResultSet indexResultSet = mockIndexMetaDataResultSet();
- when(dataSource.getConnection().prepareStatement(
- "SELECT OWNER AS TABLE_SCHEMA, TABLE_NAME, INDEX_NAME FROM ALL_INDEXES WHERE OWNER = ? AND TABLE_NAME IN ('tbl')").executeQuery()).thenReturn(indexResultSet);
+ when(dataSource.getConnection().prepareStatement(ALL_INDEXES_SQL).executeQuery()).thenReturn(indexResultSet);
ResultSet primaryKeys = mockPrimaryKeysMetaDataResultSet();
- when(dataSource.getConnection().prepareStatement(
- "SELECT A.OWNER AS TABLE_SCHEMA, A.TABLE_NAME AS TABLE_NAME, B.COLUMN_NAME AS COLUMN_NAME FROM ALL_CONSTRAINTS A INNER JOIN"
- + " ALL_CONS_COLUMNS B ON A.CONSTRAINT_NAME = B.CONSTRAINT_NAME WHERE CONSTRAINT_TYPE = 'P' AND A.OWNER = ?").executeQuery()).thenReturn(primaryKeys);
+ when(dataSource.getConnection().prepareStatement(ALL_CONSTRAINTS_SQL_WITHOUTEXISTEDTABLES).executeQuery()).thenReturn(primaryKeys);
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(12);
- when(dataSource.getConnection().getMetaData().getDatabaseMinorVersion()).thenReturn(1);
+ when(dataSource.getConnection().getMetaData().getDatabaseMinorVersion()).thenReturn(2);
assertTableMetaDataMap(getTableMetaDataLoader().load(dataSource, Collections.emptyList()));
}
@Test
- public void assertLoadWithoutExistedTablesWithCollation() throws SQLException {
+ public void assertLoadCondition2() throws SQLException {
DataSource dataSource = mockDataSource();
ResultSet resultSet = mockTableMetaDataResultSet();
- when(dataSource.getConnection().prepareStatement(
- "SELECT OWNER AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, IDENTITY_COLUMN , COLLATION FROM ALL_TAB_COLUMNS WHERE OWNER = ?").executeQuery()).thenReturn(resultSet);
+ when(dataSource.getConnection().prepareStatement(ALL_TAB_COLUMNS_SQL_CONDITION2).executeQuery()).thenReturn(resultSet);
ResultSet indexResultSet = mockIndexMetaDataResultSet();
- when(dataSource.getConnection().prepareStatement(
- "SELECT OWNER AS TABLE_SCHEMA, TABLE_NAME, INDEX_NAME FROM ALL_INDEXES WHERE OWNER = ? AND TABLE_NAME IN ('tbl')").executeQuery()).thenReturn(indexResultSet);
+ when(dataSource.getConnection().prepareStatement(ALL_INDEXES_SQL).executeQuery()).thenReturn(indexResultSet);
ResultSet primaryKeys = mockPrimaryKeysMetaDataResultSet();
- when(dataSource.getConnection().prepareStatement(
- "SELECT A.OWNER AS TABLE_SCHEMA, A.TABLE_NAME AS TABLE_NAME, B.COLUMN_NAME AS COLUMN_NAME FROM ALL_CONSTRAINTS A INNER JOIN"
- + " ALL_CONS_COLUMNS B ON A.CONSTRAINT_NAME = B.CONSTRAINT_NAME WHERE CONSTRAINT_TYPE = 'P' AND A.OWNER = ?").executeQuery()).thenReturn(primaryKeys);
+ when(dataSource.getConnection().prepareStatement(ALL_CONSTRAINTS_SQL_WITHOUTEXISTEDTABLES).executeQuery()).thenReturn(primaryKeys);
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(12);
+ when(dataSource.getConnection().getMetaData().getDatabaseMinorVersion()).thenReturn(1);
+ assertTableMetaDataMap(getTableMetaDataLoader().load(dataSource, Collections.emptyList()));
+ }
+
+ @Test
+ public void assertLoadCondition3() throws SQLException {
+ DataSource dataSource = mockDataSource();
+ ResultSet resultSet = mockTableMetaDataResultSet();
+ when(dataSource.getConnection().prepareStatement(ALL_TAB_COLUMNS_SQL_CONDITION3).executeQuery()).thenReturn(resultSet);
+ ResultSet indexResultSet = mockIndexMetaDataResultSet();
+ when(dataSource.getConnection().prepareStatement(ALL_INDEXES_SQL).executeQuery()).thenReturn(indexResultSet);
+ ResultSet primaryKeys = mockPrimaryKeysMetaDataResultSet();
+ when(dataSource.getConnection().prepareStatement(ALL_CONSTRAINTS_SQL_WITHOUTEXISTEDTABLES).executeQuery()).thenReturn(primaryKeys);
+ when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(11);
when(dataSource.getConnection().getMetaData().getDatabaseMinorVersion()).thenReturn(2);
assertTableMetaDataMap(getTableMetaDataLoader().load(dataSource, Collections.emptyList()));
}
@Test
- public void assertLoadWithExistedTablesWithoutCollation() throws SQLException {
+ public void assertLoadCondition4() throws SQLException {
DataSource dataSource = mockDataSource();
ResultSet resultSet = mockTableMetaDataResultSet();
- when(dataSource.getConnection().prepareStatement(
- "SELECT OWNER AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, IDENTITY_COLUMN FROM ALL_TAB_COLUMNS WHERE OWNER = ? AND TABLE_NAME NOT IN ('existed_tbl')")
- .executeQuery()).thenReturn(resultSet);
+ when(dataSource.getConnection().prepareStatement(ALL_TAB_COLUMNS_SQL_CONDITION4).executeQuery()).thenReturn(resultSet);
ResultSet indexResultSet = mockIndexMetaDataResultSet();
- when(dataSource.getConnection().prepareStatement(
- "SELECT OWNER AS TABLE_SCHEMA, TABLE_NAME, INDEX_NAME FROM ALL_INDEXES WHERE OWNER = ? AND TABLE_NAME IN ('tbl')")
- .executeQuery()).thenReturn(indexResultSet);
+ when(dataSource.getConnection().prepareStatement(ALL_INDEXES_SQL).executeQuery()).thenReturn(indexResultSet);
ResultSet primaryKeys = mockPrimaryKeysMetaDataResultSet();
- when(dataSource.getConnection().prepareStatement(
- "SELECT A.OWNER AS TABLE_SCHEMA, A.TABLE_NAME AS TABLE_NAME, B.COLUMN_NAME AS COLUMN_NAME FROM ALL_CONSTRAINTS A INNER JOIN"
- + " ALL_CONS_COLUMNS B ON A.CONSTRAINT_NAME = B.CONSTRAINT_NAME WHERE CONSTRAINT_TYPE = 'P' AND A.OWNER = ? AND A.TABLE_NAME NOT IN ('existed_tbl')")
- .executeQuery()).thenReturn(primaryKeys);
+ when(dataSource.getConnection().prepareStatement(ALL_CONSTRAINTS_SQL_WITHEXISTEDTABLES).executeQuery()).thenReturn(primaryKeys);
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(12);
- when(dataSource.getConnection().getMetaData().getDatabaseMinorVersion()).thenReturn(1);
+ when(dataSource.getConnection().getMetaData().getDatabaseMinorVersion()).thenReturn(2);
assertTableMetaDataMap(getTableMetaDataLoader().load(dataSource, Collections.singletonList("existed_tbl")));
}
@Test
- public void assertLoadWithExistedTablesWithCollation() throws SQLException {
+ public void assertLoadCondition5() throws SQLException {
DataSource dataSource = mockDataSource();
ResultSet resultSet = mockTableMetaDataResultSet();
- when(dataSource.getConnection().prepareStatement(
- "SELECT OWNER AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, IDENTITY_COLUMN , COLLATION FROM ALL_TAB_COLUMNS WHERE OWNER = ? AND TABLE_NAME NOT IN ('existed_tbl')")
- .executeQuery()).thenReturn(resultSet);
+ when(dataSource.getConnection().prepareStatement(ALL_TAB_COLUMNS_SQL_CONDITION5).executeQuery()).thenReturn(resultSet);
ResultSet indexResultSet = mockIndexMetaDataResultSet();
- when(dataSource.getConnection().prepareStatement(
- "SELECT OWNER AS TABLE_SCHEMA, TABLE_NAME, INDEX_NAME FROM ALL_INDEXES WHERE OWNER = ? AND TABLE_NAME IN ('tbl')")
- .executeQuery()).thenReturn(indexResultSet);
+ when(dataSource.getConnection().prepareStatement(ALL_INDEXES_SQL).executeQuery()).thenReturn(indexResultSet);
ResultSet primaryKeys = mockPrimaryKeysMetaDataResultSet();
- when(dataSource.getConnection().prepareStatement(
- "SELECT A.OWNER AS TABLE_SCHEMA, A.TABLE_NAME AS TABLE_NAME, B.COLUMN_NAME AS COLUMN_NAME FROM ALL_CONSTRAINTS A INNER JOIN"
- + " ALL_CONS_COLUMNS B ON A.CONSTRAINT_NAME = B.CONSTRAINT_NAME WHERE CONSTRAINT_TYPE = 'P' AND A.OWNER = ? AND A.TABLE_NAME NOT IN ('existed_tbl')")
- .executeQuery()).thenReturn(primaryKeys);
+ when(dataSource.getConnection().prepareStatement(ALL_CONSTRAINTS_SQL_WITHEXISTEDTABLES).executeQuery()).thenReturn(primaryKeys);
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(12);
+ when(dataSource.getConnection().getMetaData().getDatabaseMinorVersion()).thenReturn(1);
+ assertTableMetaDataMap(getTableMetaDataLoader().load(dataSource, Collections.singletonList("existed_tbl")));
+ }
+
+ @Test
+ public void assertLoadCondition6() throws SQLException {
+ DataSource dataSource = mockDataSource();
+ ResultSet resultSet = mockTableMetaDataResultSet();
+ when(dataSource.getConnection().prepareStatement(ALL_TAB_COLUMNS_SQL_CONDITION6).executeQuery()).thenReturn(resultSet);
+ ResultSet indexResultSet = mockIndexMetaDataResultSet();
+ when(dataSource.getConnection().prepareStatement(ALL_INDEXES_SQL).executeQuery()).thenReturn(indexResultSet);
+ ResultSet primaryKeys = mockPrimaryKeysMetaDataResultSet();
+ when(dataSource.getConnection().prepareStatement(ALL_CONSTRAINTS_SQL_WITHEXISTEDTABLES).executeQuery()).thenReturn(primaryKeys);
+ when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(11);
when(dataSource.getConnection().getMetaData().getDatabaseMinorVersion()).thenReturn(2);
assertTableMetaDataMap(getTableMetaDataLoader().load(dataSource, Collections.singletonList("existed_tbl")));
}
@@ -155,7 +193,7 @@ public final class OracleTableMetaDataLoaderTest {
when(result.getString("TABLE_NAME")).thenReturn("tbl");
return result;
}
-
+
private ResultSet mockPrimaryKeysMetaDataResultSet() throws SQLException {
ResultSet result = mock(ResultSet.class);
when(result.next()).thenReturn(true, false);