This is an automated email from the ASF dual-hosted git repository.
zhangliang 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 7dd367306e4 Add more test cases on OracleMetaDataLoaderTest (#38134)
7dd367306e4 is described below
commit 7dd367306e4cfa116d313d965e2ca951bf873d4b
Author: Liang Zhang <[email protected]>
AuthorDate: Sun Feb 22 14:08:45 2026 +0800
Add more test cases on OracleMetaDataLoaderTest (#38134)
---
.../data/loader/OracleMetaDataLoaderTest.java | 308 ++++++++-------------
1 file changed, 111 insertions(+), 197 deletions(-)
diff --git
a/database/connector/dialect/oracle/src/test/java/org/apache/shardingsphere/database/connector/oracle/metadata/data/loader/OracleMetaDataLoaderTest.java
b/database/connector/dialect/oracle/src/test/java/org/apache/shardingsphere/database/connector/oracle/metadata/data/loader/OracleMetaDataLoaderTest.java
index 4fcb6adc933..487e669a00e 100644
---
a/database/connector/dialect/oracle/src/test/java/org/apache/shardingsphere/database/connector/oracle/metadata/data/loader/OracleMetaDataLoaderTest.java
+++
b/database/connector/dialect/oracle/src/test/java/org/apache/shardingsphere/database/connector/oracle/metadata/data/loader/OracleMetaDataLoaderTest.java
@@ -28,18 +28,22 @@ import
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoa
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
-import java.util.Iterator;
-import java.util.Optional;
+import java.util.List;
+import java.util.stream.Stream;
-import static org.hamcrest.Matchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
@@ -47,25 +51,14 @@ import static org.mockito.Mockito.when;
class OracleMetaDataLoaderTest {
- private static final String ALL_CONSTRAINTS_SQL_WITHOUT_TABLES = "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 = 'TEST'";
-
private static final String ALL_CONSTRAINTS_SQL_WITH_TABLES = "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 = 'TEST' AND
A.TABLE_NAME IN ('tbl')";
private static final String ALL_INDEXES_SQL = "SELECT OWNER AS
TABLE_SCHEMA, TABLE_NAME, INDEX_NAME, UNIQUENESS FROM ALL_INDEXES WHERE OWNER =
? AND TABLE_NAME IN ('tbl')";
- private static final String ALL_INDEX_COLUMNS_SQL = "SELECT INDEX_NAME,
COLUMN_NAME FROM ALL_IND_COLUMNS WHERE INDEX_OWNER = ? AND INDEX_NAME IN
('id')";
-
- private static final String ALL_TAB_COLUMNS_SQL_CONDITION1 = "SELECT OWNER
AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, NULLABLE, 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, NULLABLE, 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_INDEX_COLUMNS_SQL_WITH_MULTIPLE_INDEXES =
"SELECT INDEX_NAME, COLUMN_NAME FROM ALL_IND_COLUMNS WHERE INDEX_OWNER = ? AND
INDEX_NAME IN ('id','id_2')";
- private static final String ALL_TAB_COLUMNS_SQL_CONDITION3 =
- "SELECT OWNER AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, NULLABLE,
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_VIEWS_SQL = "SELECT VIEW_NAME FROM
ALL_VIEWS WHERE OWNER = ? AND VIEW_NAME IN ('tbl')";
private static final String ALL_TAB_COLUMNS_SQL_CONDITION4 = "SELECT OWNER
AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, NULLABLE, DATA_TYPE, COLUMN_ID,
HIDDEN_COLUMN , IDENTITY_COLUMN, COLLATION"
+ " FROM ALL_TAB_COLS WHERE OWNER = ? AND TABLE_NAME IN ('tbl')
ORDER BY COLUMN_ID";
@@ -76,190 +69,70 @@ class OracleMetaDataLoaderTest {
private static final String ALL_TAB_COLUMNS_SQL_CONDITION6 = "SELECT OWNER
AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, NULLABLE, 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_CONDITION7 = "SELECT OWNER
AS TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, NULLABLE, 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 final DatabaseType databaseType =
TypedSPILoader.getService(DatabaseType.class, "Oracle");
- @SuppressWarnings("JDBCResourceOpenedButNotSafelyClosed")
- @Test
- void assertLoadCondition1() throws SQLException {
- DataSource dataSource = mockDataSource();
- ResultSet resultSet = mockTableMetaDataResultSet();
-
when(dataSource.getConnection().prepareStatement(ALL_TAB_COLUMNS_SQL_CONDITION1).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_WITHOUT_TABLES).executeQuery()).thenReturn(primaryKeys);
-
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(12);
-
when(dataSource.getConnection().getMetaData().getDatabaseMinorVersion()).thenReturn(2);
- DataTypeRegistry.load(dataSource, "Oracle");
- Collection<SchemaMetaData> actual =
getDialectTableMetaDataLoader().load(
- new MetaDataLoaderMaterial(Collections.singleton("tbl"),
"foo_ds", dataSource, databaseType, "sharding_db"));
- assertTableMetaDataMap(actual);
- TableMetaData actualTableMetaData =
actual.iterator().next().getTables().iterator().next();
- Iterator<ColumnMetaData> columnsIterator =
actualTableMetaData.getColumns().iterator();
- assertColumnMetaData(columnsIterator.next(), new ColumnMetaData("id",
Types.INTEGER, false, true, true, true, false, false));
- assertColumnMetaData(columnsIterator.next(), new
ColumnMetaData("name", Types.VARCHAR, false, false, false, false, false, true));
- }
+ private final DialectMetaDataLoader dialectMetaDataLoader =
DatabaseTypedSPILoader.getService(DialectMetaDataLoader.class, databaseType);
- @SuppressWarnings("JDBCResourceOpenedButNotSafelyClosed")
- @Test
- void assertLoadCondition2() throws SQLException {
+ @SuppressWarnings({"JDBCResourceOpenedButNotSafelyClosed", "resource"})
+ @ParameterizedTest(name = "{0}")
+ @MethodSource("assertLoadArguments")
+ void assertLoad(final String name, final int majorVersion, final int
minorVersion, final boolean withPrimaryKey, final boolean withNullValue) throws
SQLException {
DataSource dataSource = mockDataSource();
- ResultSet resultSet = mockTableMetaDataResultSet();
-
when(dataSource.getConnection().prepareStatement(ALL_TAB_COLUMNS_SQL_CONDITION2).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_WITHOUT_TABLES).executeQuery()).thenReturn(primaryKeys);
-
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(12);
-
when(dataSource.getConnection().getMetaData().getDatabaseMinorVersion()).thenReturn(1);
- DataTypeRegistry.load(dataSource, "Oracle");
- Collection<SchemaMetaData> actual =
getDialectTableMetaDataLoader().load(
- new MetaDataLoaderMaterial(Collections.singleton("tbl"),
"foo_ds", dataSource, databaseType, "sharding_db"));
- assertTableMetaDataMap(actual);
- TableMetaData actualTableMetaData =
actual.iterator().next().getTables().iterator().next();
- Iterator<ColumnMetaData> columnsIterator =
actualTableMetaData.getColumns().iterator();
- assertColumnMetaData(columnsIterator.next(), new ColumnMetaData("id",
Types.INTEGER, false, true, false, true, false, false));
- assertColumnMetaData(columnsIterator.next(), new
ColumnMetaData("name", Types.VARCHAR, false, false, false, false, false, true));
- }
-
- @SuppressWarnings("JDBCResourceOpenedButNotSafelyClosed")
- @Test
- 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_WITHOUT_TABLES).executeQuery()).thenReturn(primaryKeys);
-
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(11);
-
when(dataSource.getConnection().getMetaData().getDatabaseMinorVersion()).thenReturn(2);
- DataTypeRegistry.load(dataSource, "Oracle");
- Collection<SchemaMetaData> actual =
getDialectTableMetaDataLoader().load(
- new MetaDataLoaderMaterial(Collections.singleton("tbl"),
"foo_ds", dataSource, databaseType, "sharding_db"));
- assertTableMetaDataMap(actual);
- TableMetaData actualTableMetaData =
actual.iterator().next().getTables().iterator().next();
- Iterator<ColumnMetaData> columnsIterator =
actualTableMetaData.getColumns().iterator();
- assertColumnMetaData(columnsIterator.next(), new ColumnMetaData("id",
Types.INTEGER, false, false, false, true, false, false));
- assertColumnMetaData(columnsIterator.next(), new
ColumnMetaData("name", Types.VARCHAR, false, false, false, false, false, true));
- }
-
- @SuppressWarnings("JDBCResourceOpenedButNotSafelyClosed")
- @Test
- void assertLoadCondition4() throws SQLException {
- DataSource dataSource = mockDataSource();
- ResultSet resultSet = mockTableMetaDataResultSet();
-
when(dataSource.getConnection().prepareStatement(ALL_TAB_COLUMNS_SQL_CONDITION4).executeQuery()).thenReturn(resultSet);
- ResultSet indexResultSet = mockIndexMetaDataResultSet();
-
when(dataSource.getConnection().prepareStatement(ALL_INDEXES_SQL).executeQuery()).thenReturn(indexResultSet);
+ ResultSet tableMetaDataResultSet = withNullValue ?
mockTableMetaDataResultSetWithNullValue() : mockTableMetaDataResultSet();
+ ResultSet indexMetaDataResultSet = mockIndexMetaDataResultSet();
+ ResultSet primaryKeysResultSet = withPrimaryKey ?
mockPrimaryKeysMetaDataResultSet() : mock(ResultSet.class);
+
when(dataSource.getConnection().prepareStatement(getTableMetaDataSQL(majorVersion,
minorVersion)).executeQuery()).thenReturn(tableMetaDataResultSet);
+
when(dataSource.getConnection().prepareStatement(ALL_INDEXES_SQL).executeQuery()).thenReturn(indexMetaDataResultSet);
+
when(dataSource.getConnection().prepareStatement(ALL_CONSTRAINTS_SQL_WITH_TABLES).executeQuery()).thenReturn(primaryKeysResultSet);
when(dataSource.getConnection().getMetaData().getUserName()).thenReturn("TEST");
- ResultSet primaryKeys = mockPrimaryKeysMetaDataResultSet();
-
when(dataSource.getConnection().prepareStatement(ALL_CONSTRAINTS_SQL_WITH_TABLES).executeQuery()).thenReturn(primaryKeys);
-
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(12);
-
when(dataSource.getConnection().getMetaData().getDatabaseMinorVersion()).thenReturn(2);
- DataTypeRegistry.load(dataSource, "Oracle");
- Collection<SchemaMetaData> actual =
getDialectTableMetaDataLoader().load(
- new MetaDataLoaderMaterial(Collections.singleton("tbl"),
"foo_ds", dataSource, databaseType, "sharding_db"));
- assertTableMetaDataMap(actual);
- TableMetaData actualTableMetaData =
actual.iterator().next().getTables().iterator().next();
- Iterator<ColumnMetaData> columnsIterator =
actualTableMetaData.getColumns().iterator();
- assertColumnMetaData(columnsIterator.next(), new ColumnMetaData("id",
Types.INTEGER, true, true, true, true, false, false));
- assertColumnMetaData(columnsIterator.next(), new
ColumnMetaData("name", Types.VARCHAR, false, false, false, false, false, true));
- }
-
- @SuppressWarnings("JDBCResourceOpenedButNotSafelyClosed")
- @Test
- void assertLoadCondition5() throws SQLException {
- DataSource dataSource = mockDataSource();
- ResultSet resultSet = mockTableMetaDataResultSet();
-
when(dataSource.getConnection().prepareStatement(ALL_TAB_COLUMNS_SQL_CONDITION5).executeQuery()).thenReturn(resultSet);
- ResultSet indexResultSet = mockIndexMetaDataResultSet();
-
when(dataSource.getConnection().prepareStatement(ALL_INDEXES_SQL).executeQuery()).thenReturn(indexResultSet);
-
when(dataSource.getConnection().getMetaData().getUserName()).thenReturn("TEST");
- ResultSet primaryKeys = mockPrimaryKeysMetaDataResultSet();
-
when(dataSource.getConnection().prepareStatement(ALL_CONSTRAINTS_SQL_WITH_TABLES).executeQuery()).thenReturn(primaryKeys);
-
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(12);
-
when(dataSource.getConnection().getMetaData().getDatabaseMinorVersion()).thenReturn(1);
- DataTypeRegistry.load(dataSource, "Oracle");
- Collection<SchemaMetaData> actual =
getDialectTableMetaDataLoader().load(
- new MetaDataLoaderMaterial(Collections.singleton("tbl"),
"foo_ds", dataSource, databaseType, "sharding_db"));
- assertTableMetaDataMap(actual);
- TableMetaData actualTableMetaData =
actual.iterator().next().getTables().iterator().next();
- Iterator<ColumnMetaData> columnsIterator =
actualTableMetaData.getColumns().iterator();
- assertColumnMetaData(columnsIterator.next(), new ColumnMetaData("id",
Types.INTEGER, true, true, false, true, false, false));
- assertColumnMetaData(columnsIterator.next(), new
ColumnMetaData("name", Types.VARCHAR, false, false, false, false, false, true));
- }
-
- @Test
- 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);
-
when(dataSource.getConnection().getMetaData().getUserName()).thenReturn("TEST");
- ResultSet primaryKeys = mockPrimaryKeysMetaDataResultSet();
-
when(dataSource.getConnection().prepareStatement(ALL_CONSTRAINTS_SQL_WITH_TABLES).executeQuery()).thenReturn(primaryKeys);
-
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(11);
-
when(dataSource.getConnection().getMetaData().getDatabaseMinorVersion()).thenReturn(2);
- DataTypeRegistry.load(dataSource, "Oracle");
- Collection<SchemaMetaData> actual =
getDialectTableMetaDataLoader().load(
- new MetaDataLoaderMaterial(Collections.singleton("tbl"),
"foo_ds", dataSource, databaseType, "sharding_db"));
- assertTableMetaDataMap(actual);
- TableMetaData actualTableMetaData =
actual.iterator().next().getTables().iterator().next();
- Iterator<ColumnMetaData> columnsIterator =
actualTableMetaData.getColumns().iterator();
- assertColumnMetaData(columnsIterator.next(), new ColumnMetaData("id",
Types.INTEGER, true, false, false, true, false, false));
- assertColumnMetaData(columnsIterator.next(), new
ColumnMetaData("name", Types.VARCHAR, false, false, false, false, false, true));
+
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(majorVersion);
+
when(dataSource.getConnection().getMetaData().getDatabaseMinorVersion()).thenReturn(minorVersion);
+ TableMetaData actualTableMetaData =
assertAndGetSingleTableMetaData(loadMetaData(dataSource));
+ assertThat(actualTableMetaData.getIndexes().size(), is(1));
+ List<ColumnMetaData> columnMetaDataList = new
ArrayList<>(actualTableMetaData.getColumns());
+ assertColumnMetaData(columnMetaDataList.get(0),
getExpectedFirstColumnMetaData(majorVersion, minorVersion, withPrimaryKey));
+ assertColumnMetaData(columnMetaDataList.get(1), new
ColumnMetaData("name", Types.VARCHAR, false, false, false, false, false, true));
+ assertColumnMetaData(columnMetaDataList.get(2), withNullValue
+ ? new ColumnMetaData("address", Types.VARCHAR, false, false,
false, false, false, true)
+ : new ColumnMetaData("creation_time", Types.TIMESTAMP, false,
false, false, true, false, true));
}
- @SuppressWarnings("JDBCResourceOpenedButNotSafelyClosed")
+ @SuppressWarnings({"JDBCResourceOpenedButNotSafelyClosed", "resource"})
@Test
- void assertLoadCondition7() throws SQLException {
+ void assertLoadWithViewAndMultipleIndexes() throws SQLException {
DataSource dataSource = mockDataSource();
- ResultSet resultSet = mockTableMetaDataResultSetWithNullValue();
-
when(dataSource.getConnection().prepareStatement(ALL_TAB_COLUMNS_SQL_CONDITION7).executeQuery()).thenReturn(resultSet);
- ResultSet indexResultSet = mockIndexMetaDataResultSet();
-
when(dataSource.getConnection().prepareStatement(ALL_INDEXES_SQL).executeQuery()).thenReturn(indexResultSet);
+ ResultSet tableMetaDataResultSet = mockTableMetaDataResultSet();
+ ResultSet indexMetaDataResultSet =
mockIndexMetaDataResultSetWithMultipleIndexes();
+ ResultSet indexColumnMetaDataResultSet =
mockIndexColumnMetaDataResultSetWithMultipleIndexes();
+ ResultSet viewMetaDataResultSet = mockViewMetaDataResultSet();
+ ResultSet primaryKeysResultSet = mockPrimaryKeysMetaDataResultSet();
+
when(dataSource.getConnection().prepareStatement(ALL_TAB_COLUMNS_SQL_CONDITION4).executeQuery()).thenReturn(tableMetaDataResultSet);
+
when(dataSource.getConnection().prepareStatement(ALL_INDEXES_SQL).executeQuery()).thenReturn(indexMetaDataResultSet);
+
when(dataSource.getConnection().prepareStatement(ALL_INDEX_COLUMNS_SQL_WITH_MULTIPLE_INDEXES).executeQuery()).thenReturn(indexColumnMetaDataResultSet);
+
when(dataSource.getConnection().prepareStatement(ALL_VIEWS_SQL).executeQuery()).thenReturn(viewMetaDataResultSet);
+
when(dataSource.getConnection().prepareStatement(ALL_CONSTRAINTS_SQL_WITH_TABLES).executeQuery()).thenReturn(primaryKeysResultSet);
when(dataSource.getConnection().getMetaData().getUserName()).thenReturn("TEST");
- ResultSet primaryKeys = mockPrimaryKeysMetaDataResultSet();
-
when(dataSource.getConnection().prepareStatement(ALL_CONSTRAINTS_SQL_WITH_TABLES).executeQuery()).thenReturn(primaryKeys);
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(12);
when(dataSource.getConnection().getMetaData().getDatabaseMinorVersion()).thenReturn(2);
- DataTypeRegistry.load(dataSource, "Oracle");
- Collection<SchemaMetaData> actual =
getDialectTableMetaDataLoader().load(
- new MetaDataLoaderMaterial(Collections.singleton("tbl"),
"foo_ds", dataSource, databaseType, "sharding_db"));
- assertTableMetaDataMap(actual);
- TableMetaData actualTableMetaData =
actual.iterator().next().getTables().iterator().next();
- Iterator<ColumnMetaData> columnsIterator =
actualTableMetaData.getColumns().iterator();
- assertColumnMetaData(columnsIterator.next(), new ColumnMetaData("id",
Types.INTEGER, true, true, true, true, false, false));
- assertColumnMetaData(columnsIterator.next(), new
ColumnMetaData("name", Types.VARCHAR, false, false, false, false, false, true));
- assertColumnMetaData(columnsIterator.next(), new
ColumnMetaData("address", Types.VARCHAR, false, false, false, false, false,
true));
+ TableMetaData actualTableMetaData =
assertAndGetSingleTableMetaData(loadMetaData(dataSource));
+ assertThat(actualTableMetaData.getIndexes().size(), is(2));
+ List<IndexMetaData> actualIndexes = new
ArrayList<>(actualTableMetaData.getIndexes());
+ assertIndexMetaData(actualIndexes.get(0), new IndexMetaData("id"),
true, Collections.singletonList("id"));
+ assertIndexMetaData(actualIndexes.get(1), new IndexMetaData("id_2"),
false, Collections.singletonList("name"));
}
- @SuppressWarnings("JDBCResourceOpenedButNotSafelyClosed")
+ @SuppressWarnings({"JDBCResourceOpenedButNotSafelyClosed", "resource"})
@Test
- void assertLoadIndexColumns() throws SQLException {
+ void assertLoadWithoutIndexes() throws SQLException {
DataSource dataSource = mockDataSource();
- ResultSet resultSet = mockTableMetaDataResultSet();
-
when(dataSource.getConnection().prepareStatement(ALL_TAB_COLUMNS_SQL_CONDITION4).executeQuery()).thenReturn(resultSet);
- ResultSet indexResultSet = mockIndexMetaDataResultSet();
-
when(dataSource.getConnection().prepareStatement(ALL_INDEXES_SQL).executeQuery()).thenReturn(indexResultSet);
+ ResultSet tableMetaDataResultSet = mockTableMetaDataResultSet();
+ ResultSet primaryKeysResultSet = mockPrimaryKeysMetaDataResultSet();
+
when(dataSource.getConnection().prepareStatement(ALL_TAB_COLUMNS_SQL_CONDITION4).executeQuery()).thenReturn(tableMetaDataResultSet);
+
when(dataSource.getConnection().prepareStatement(ALL_CONSTRAINTS_SQL_WITH_TABLES).executeQuery()).thenReturn(primaryKeysResultSet);
when(dataSource.getConnection().getMetaData().getUserName()).thenReturn("TEST");
- ResultSet primaryKeys = mockPrimaryKeysMetaDataResultSet();
-
when(dataSource.getConnection().prepareStatement(ALL_CONSTRAINTS_SQL_WITH_TABLES).executeQuery()).thenReturn(primaryKeys);
- ResultSet indexColumnResultSet = mockIndexColumnMetaDataResultSet();
-
when(dataSource.getConnection().prepareStatement(ALL_INDEX_COLUMNS_SQL).executeQuery()).thenReturn(indexColumnResultSet);
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(12);
when(dataSource.getConnection().getMetaData().getDatabaseMinorVersion()).thenReturn(2);
- DataTypeRegistry.load(dataSource, "Oracle");
- Collection<SchemaMetaData> actual =
getDialectTableMetaDataLoader().load(
- new MetaDataLoaderMaterial(Collections.singleton("tbl"),
"foo_ds", dataSource, databaseType, "sharding_db"));
- TableMetaData actualTableMetaData =
actual.iterator().next().getTables().iterator().next();
- IndexMetaData actualIndexMetaData =
actualTableMetaData.getIndexes().iterator().next();
- assertThat(actualIndexMetaData.getColumns(),
is(Collections.singletonList("id")));
+
assertTrue(assertAndGetSingleTableMetaData(loadMetaData(dataSource)).getIndexes().isEmpty());
}
@SuppressWarnings("JDBCResourceOpenedButNotSafelyClosed")
@@ -313,11 +186,27 @@ class OracleMetaDataLoaderTest {
return result;
}
- private ResultSet mockIndexColumnMetaDataResultSet() throws SQLException {
+ private ResultSet mockIndexMetaDataResultSetWithMultipleIndexes() throws
SQLException {
+ ResultSet result = mock(ResultSet.class);
+ when(result.next()).thenReturn(true, true, false);
+ when(result.getString("INDEX_NAME")).thenReturn("id", "id_2");
+ when(result.getString("TABLE_NAME")).thenReturn("tbl", "tbl");
+ when(result.getString("UNIQUENESS")).thenReturn("UNIQUE", "NONUNIQUE");
+ return result;
+ }
+
+ private ResultSet mockIndexColumnMetaDataResultSetWithMultipleIndexes()
throws SQLException {
+ ResultSet result = mock(ResultSet.class);
+ when(result.next()).thenReturn(true, true, false);
+ when(result.getString("INDEX_NAME")).thenReturn("id", "id_2");
+ when(result.getString("COLUMN_NAME")).thenReturn("id", "name");
+ return result;
+ }
+
+ private ResultSet mockViewMetaDataResultSet() throws SQLException {
ResultSet result = mock(ResultSet.class);
when(result.next()).thenReturn(true, false);
- when(result.getString("INDEX_NAME")).thenReturn("id");
- when(result.getString("COLUMN_NAME")).thenReturn("id");
+ when(result.getString(1)).thenReturn("tbl");
return result;
}
@@ -329,21 +218,32 @@ class OracleMetaDataLoaderTest {
return result;
}
- private DialectMetaDataLoader getDialectTableMetaDataLoader() {
- Optional<DialectMetaDataLoader> result =
DatabaseTypedSPILoader.findService(DialectMetaDataLoader.class,
TypedSPILoader.getService(DatabaseType.class, "Oracle"));
- assertTrue(result.isPresent());
- return result.get();
+ private String getTableMetaDataSQL(final int majorVersion, final int
minorVersion) {
+ if (majorVersion >= 12 && minorVersion >= 2) {
+ return ALL_TAB_COLUMNS_SQL_CONDITION4;
+ }
+ if (majorVersion >= 12 && minorVersion == 1) {
+ return ALL_TAB_COLUMNS_SQL_CONDITION5;
+ }
+ return ALL_TAB_COLUMNS_SQL_CONDITION6;
+ }
+
+ private ColumnMetaData getExpectedFirstColumnMetaData(final int
majorVersion, final int minorVersion, final boolean withPrimaryKey) {
+ boolean generated = majorVersion >= 12 && minorVersion >= 1;
+ boolean caseSensitive = majorVersion >= 12 && minorVersion >= 2;
+ return new ColumnMetaData("id", Types.INTEGER, withPrimaryKey,
generated, caseSensitive, true, false, false);
}
- private void assertTableMetaDataMap(final Collection<SchemaMetaData>
schemaMetaDataList) {
+ private Collection<SchemaMetaData> loadMetaData(final DataSource
dataSource) throws SQLException {
+ DataTypeRegistry.load(dataSource, "Oracle");
+ return dialectMetaDataLoader.load(new
MetaDataLoaderMaterial(Collections.singleton("tbl"), "foo_ds", dataSource,
databaseType, "sharding_db"));
+ }
+
+ private TableMetaData assertAndGetSingleTableMetaData(final
Collection<SchemaMetaData> schemaMetaDataList) {
assertThat(schemaMetaDataList.size(), is(1));
- TableMetaData actualTableMetaData =
schemaMetaDataList.iterator().next().getTables().iterator().next();
- assertThat(actualTableMetaData.getColumns().size(), is(3));
- assertThat(actualTableMetaData.getIndexes().size(), is(1));
- Iterator<IndexMetaData> indexesIterator =
actualTableMetaData.getIndexes().iterator();
- IndexMetaData indexMetaData = new IndexMetaData("id");
- indexMetaData.setUnique(true);
- assertIndexMetaData(indexesIterator.next(), indexMetaData);
+ SchemaMetaData actualSchemaMetaData =
schemaMetaDataList.iterator().next();
+ assertThat(actualSchemaMetaData.getTables().size(), is(1));
+ return actualSchemaMetaData.getTables().iterator().next();
}
private void assertColumnMetaData(final ColumnMetaData actual, final
ColumnMetaData expected) {
@@ -357,9 +257,23 @@ class OracleMetaDataLoaderTest {
assertThat(actual.isNullable(), is(expected.isNullable()));
}
- private void assertIndexMetaData(final IndexMetaData actual, final
IndexMetaData expected) {
+ private void assertIndexMetaData(final IndexMetaData actual, final
IndexMetaData expected, final boolean expectedUnique, final Collection<String>
expectedColumns) {
+ expected.setUnique(expectedUnique);
+ expected.setColumns(expectedColumns);
assertThat(actual.getName(), is(expected.getName()));
assertThat(actual.getColumns(), is(expected.getColumns()));
assertThat(actual.isUnique(), is(expected.isUnique()));
}
+
+ private static Stream<Arguments> assertLoadArguments() {
+ return Stream.of(
+ Arguments.of("major12Minor2WithoutPrimaryKey", 12, 2, false,
false),
+ Arguments.of("major12Minor1WithoutPrimaryKey", 12, 1, false,
false),
+ Arguments.of("major11Minor2WithoutPrimaryKey", 11, 2, false,
false),
+ Arguments.of("major12Minor0WithoutPrimaryKey", 12, 0, false,
false),
+ Arguments.of("major12Minor2WithPrimaryKey", 12, 2, true,
false),
+ Arguments.of("major12Minor1WithPrimaryKey", 12, 1, true,
false),
+ Arguments.of("major11Minor2WithPrimaryKey", 11, 2, true,
false),
+ Arguments.of("major12Minor2WithPrimaryKeyAndNullCollation",
12, 2, true, true));
+ }
}