This is an automated email from the ASF dual-hosted git repository.

terrymanu 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 e20fbb6cd43 Fix Oracle pre-12.2 column case sensitivity (#39298)
e20fbb6cd43 is described below

commit e20fbb6cd431a77cd42d8d3bc3e9bd652068d68a
Author: Liang Zhang <[email protected]>
AuthorDate: Sat Aug 1 02:36:32 2026 +0800

    Fix Oracle pre-12.2 column case sensitivity (#39298)
    
    * Fix Oracle pre-12.2 column case sensitivity
    
    Use Oracle's default case-sensitive behavior for character columns
    when COLLATION metadata is unavailable before version 12.2.
    
    Reuse the Oracle data type classification for non-character columns
    and preserve the existing 12.2+ collation handling.
    
    * Fix Oracle pre-12.2 column case sensitivity
    
    Use Oracle's default case-sensitive behavior for character columns
    when COLLATION metadata is unavailable before version 12.2.
    
    Reuse the Oracle data type classification for non-character columns
    and preserve the existing 12.2+ collation handling.
---
 .../metadata/data/loader/OracleMetaDataLoader.java   | 20 +++++++++++++++-----
 .../data/loader/OracleMetaDataLoaderTest.java        | 10 +++++-----
 2 files changed, 20 insertions(+), 10 deletions(-)

diff --git 
a/database/connector/dialect/oracle/src/main/java/org/apache/shardingsphere/database/connector/oracle/metadata/data/loader/OracleMetaDataLoader.java
 
b/database/connector/dialect/oracle/src/main/java/org/apache/shardingsphere/database/connector/oracle/metadata/data/loader/OracleMetaDataLoader.java
index 19e3b46b176..a964c514fcc 100644
--- 
a/database/connector/dialect/oracle/src/main/java/org/apache/shardingsphere/database/connector/oracle/metadata/data/loader/OracleMetaDataLoader.java
+++ 
b/database/connector/dialect/oracle/src/main/java/org/apache/shardingsphere/database/connector/oracle/metadata/data/loader/OracleMetaDataLoader.java
@@ -29,7 +29,9 @@ import 
org.apache.shardingsphere.database.connector.core.metadata.data.model.Tab
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.datatype.DataTypeRegistry;
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.enums.QuoteCharacter;
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.enums.TableType;
+import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.datatype.DialectDataTypeOption;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
+import 
org.apache.shardingsphere.database.connector.oracle.metadata.database.option.OracleDataTypeOption;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 
 import java.sql.Connection;
@@ -81,6 +83,8 @@ public final class OracleMetaDataLoader implements 
DialectMetaDataLoader {
     
     private static final int MAX_EXPRESSION_SIZE = 1000;
     
+    private final DialectDataTypeOption dataTypeOption = new 
OracleDataTypeOption();
+    
     @Override
     public Collection<SchemaMetaData> load(final MetaDataLoaderMaterial 
material) throws SQLException {
         Collection<TableMetaData> tableMetaDataList = new LinkedList<>();
@@ -146,18 +150,24 @@ public final class OracleMetaDataLoader implements 
DialectMetaDataLoader {
     
     private ColumnMetaData loadColumnMetaData(final ResultSet resultSet, final 
Collection<String> primaryKeys, final DatabaseMetaData databaseMetaData) throws 
SQLException {
         String columnName = resultSet.getString("COLUMN_NAME");
-        String dataType = 
getOriginalDataType(resultSet.getString("DATA_TYPE"));
+        String dataTypeName = 
getOriginalDataType(resultSet.getString("DATA_TYPE"));
+        int dataType = DataTypeRegistry.getDataType(getDatabaseType(), 
dataTypeName).orElse(Types.OTHER);
         boolean primaryKey = primaryKeys.contains(columnName);
         boolean generated = versionContainsIdentityColumn(databaseMetaData) && 
"YES".equals(resultSet.getString("IDENTITY_COLUMN"));
-        String collation = versionContainsCollation(databaseMetaData) ? 
resultSet.getString("COLLATION") : null;
-        boolean caseSensitive = null != collation && 
isCaseSensitive(collation);
+        boolean collationSupported = 
versionContainsCollation(databaseMetaData);
+        String collation = collationSupported ? 
resultSet.getString("COLLATION") : null;
+        boolean caseSensitive = isCaseSensitive(dataType, collation, 
collationSupported);
         boolean isVisible = "NO".equals(resultSet.getString("HIDDEN_COLUMN"));
         boolean nullable = "Y".equals(resultSet.getString("NULLABLE"));
-        return new ColumnMetaData(columnName, 
DataTypeRegistry.getDataType(getDatabaseType(), dataType).orElse(Types.OTHER), 
primaryKey, generated, caseSensitive, isVisible, false, nullable);
+        return new ColumnMetaData(columnName, dataType, primaryKey, generated, 
caseSensitive, isVisible, false, nullable);
+    }
+    
+    private boolean isCaseSensitive(final int dataType, final String 
collation, final boolean collationSupported) {
+        // TODO Resolve case sensitivity from session parameters for Oracle 
versions earlier than 12.2 and session-dependent collations.
+        return collationSupported ? null != collation && 
isCaseSensitive(collation) : dataTypeOption.isStringDataType(dataType);
     }
     
     private boolean isCaseSensitive(final String collation) {
-        // TODO Support case sensitivity resolved from session parameters for 
Oracle versions earlier than 12.2 and session-dependent collations.
         if ("USING_NLS_COMP".equals(collation) || 
"USING_NLS_SORT".equals(collation)) {
             return false;
         }
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 63dfcb2d6d9..eb9b10a7612 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
@@ -257,12 +257,12 @@ class OracleMetaDataLoaderTest {
     private static Stream<Arguments> assertLoadArguments() {
         return Stream.of(
                 Arguments.of("major12Minor2WithoutPrimaryKey", 12, 2, false, 
"BINARY", true),
-                Arguments.of("major12Minor1WithoutPrimaryKey", 12, 1, false, 
NO_COLLATION, false),
-                Arguments.of("major11Minor2WithoutPrimaryKey", 11, 2, false, 
NO_COLLATION, false),
-                Arguments.of("major12Minor0WithoutPrimaryKey", 12, 0, false, 
NO_COLLATION, false),
+                Arguments.of("major12Minor1WithoutPrimaryKey", 12, 1, false, 
NO_COLLATION, true),
+                Arguments.of("major11Minor2WithoutPrimaryKey", 11, 2, false, 
NO_COLLATION, true),
+                Arguments.of("major12Minor0WithoutPrimaryKey", 12, 0, false, 
NO_COLLATION, true),
                 Arguments.of("major12Minor2WithPrimaryKey", 12, 2, true, 
"BINARY", true),
-                Arguments.of("major12Minor1WithPrimaryKey", 12, 1, true, 
NO_COLLATION, false),
-                Arguments.of("major11Minor2WithPrimaryKey", 11, 2, true, 
NO_COLLATION, false),
+                Arguments.of("major12Minor1WithPrimaryKey", 12, 1, true, 
NO_COLLATION, true),
+                Arguments.of("major11Minor2WithPrimaryKey", 11, 2, true, 
NO_COLLATION, true),
                 Arguments.of("major19Minor0WithPrimaryKey", 19, 0, true, 
"BINARY", true),
                 Arguments.of("major12Minor2WithNullCollation", 12, 2, true, 
NO_COLLATION, false),
                 Arguments.of("major12Minor2WithNamedCollation", 12, 2, true, 
"FRENCH", true),

Reply via email to