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));
+    }
 }

Reply via email to