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 f107611c237 Add 
DialectDatabaseMetaData.isJoinUsingColumnsByProjectionOrder() and 
isRightColumnsOrderFirstOnJoin() (#35177)
f107611c237 is described below

commit f107611c2378d9c011fcaf9f6007f982c6650137
Author: Liang Zhang <zhangli...@apache.org>
AuthorDate: Sun Apr 13 13:32:41 2025 +0800

    Add DialectDatabaseMetaData.isJoinUsingColumnsByProjectionOrder() and 
isRightColumnsOrderFirstOnJoin() (#35177)
    
    * Add DialectDatabaseMetaData.isJoinUsingColumnsByProjectionOrder() and 
isRightColumnsOrderFirstOnJoin()
    
    * Add DialectDatabaseMetaData.isJoinUsingColumnsByProjectionOrder() and 
isRightColumnsOrderFirstOnJoin()
---
 .../segment/dml/from/type/JoinTableSegmentBinder.java  | 12 +++++++-----
 .../metadata/database/DialectDatabaseMetaData.java     | 18 ++++++++++++++++++
 .../mysql/metadata/database/MySQLDatabaseMetaData.java | 10 ++++++++++
 3 files changed, 35 insertions(+), 5 deletions(-)

diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/JoinTableSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/JoinTableSegmentBinder.java
index 53424ab4f4e..538727bf122 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/JoinTableSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/JoinTableSegmentBinder.java
@@ -29,8 +29,9 @@ import 
org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type
 import 
org.apache.shardingsphere.infra.binder.engine.segment.dml.from.TableSegmentBinder;
 import 
org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext;
 import 
org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext;
+import 
org.apache.shardingsphere.infra.database.core.metadata.database.DialectDatabaseMetaData;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
-import org.apache.shardingsphere.infra.database.mysql.type.MySQLDatabaseType;
+import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
 import org.apache.shardingsphere.sql.parser.statement.core.enums.JoinType;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
@@ -113,13 +114,14 @@ public final class JoinTableSegmentBinder {
     private static Collection<ProjectionSegment> 
getDerivedJoinTableProjectionSegments(final JoinTableSegment segment, final 
DatabaseType databaseType,
                                                                                
        final Map<String, ProjectionSegment> usingColumnsByNaturalJoin,
                                                                                
        final Multimap<CaseInsensitiveString, TableSegmentBinderContext> 
tableBinderContexts) {
-        Collection<ProjectionSegment> projectionSegments = 
getProjectionSegments(segment, databaseType, tableBinderContexts);
+        DialectDatabaseMetaData dialectDatabaseMetaData = new 
DatabaseTypeRegistry(databaseType).getDialectDatabaseMetaData();
+        Collection<ProjectionSegment> projectionSegments = 
getProjectionSegments(segment, dialectDatabaseMetaData, tableBinderContexts);
         if (segment.getUsing().isEmpty() && !segment.isNatural()) {
             return projectionSegments;
         }
         Collection<ProjectionSegment> result = new LinkedList<>();
         Map<String, ProjectionSegment> originalUsingColumns = 
segment.getUsing().isEmpty() ? usingColumnsByNaturalJoin : 
getUsingColumns(projectionSegments, segment.getUsing(), segment.getJoinType());
-        Collection<ProjectionSegment> orderedUsingColumns = databaseType 
instanceof MySQLDatabaseType
+        Collection<ProjectionSegment> orderedUsingColumns = 
dialectDatabaseMetaData.isJoinUsingColumnsByProjectionOrder()
                 ? getJoinUsingColumnsByProjectionOrder(projectionSegments, 
originalUsingColumns)
                 : originalUsingColumns.values();
         result.addAll(orderedUsingColumns);
@@ -127,10 +129,10 @@ public final class JoinTableSegmentBinder {
         return result;
     }
     
-    private static Collection<ProjectionSegment> getProjectionSegments(final 
JoinTableSegment segment, final DatabaseType databaseType,
+    private static Collection<ProjectionSegment> getProjectionSegments(final 
JoinTableSegment segment, final DialectDatabaseMetaData dialectDatabaseMetaData,
                                                                        final 
Multimap<CaseInsensitiveString, TableSegmentBinderContext> tableBinderContexts) 
{
         Collection<ProjectionSegment> result = new LinkedList<>();
-        if (databaseType instanceof MySQLDatabaseType && 
JoinType.RIGHT.name().equalsIgnoreCase(segment.getJoinType()) && 
(!segment.getUsing().isEmpty() || segment.isNatural())) {
+        if (dialectDatabaseMetaData.isRightColumnsOrderFirstOnJoin() && 
JoinType.RIGHT.name().equalsIgnoreCase(segment.getJoinType()) && 
(!segment.getUsing().isEmpty() || segment.isNatural())) {
             result.addAll(getProjectionSegments(segment.getRight(), 
tableBinderContexts));
             result.addAll(getProjectionSegments(segment.getLeft(), 
tableBinderContexts));
         } else {
diff --git 
a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/DialectDatabaseMetaData.java
 
b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/DialectDatabaseMetaData.java
index feb1badea45..867f9815cdb 100644
--- 
a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/DialectDatabaseMetaData.java
+++ 
b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/DialectDatabaseMetaData.java
@@ -175,4 +175,22 @@ public interface DialectDatabaseMetaData extends 
DatabaseTypedSPI {
     default boolean isSupportMetaDataRefreshInTransaction() {
         return true;
     }
+    
+    /**
+     * Whether join using columns by projection order.
+     *
+     * @return by projection order or not
+     */
+    default boolean isJoinUsingColumnsByProjectionOrder() {
+        return false;
+    }
+    
+    /**
+     * Whether right columns order first on join.
+     *
+     * @return right columns order first or not
+     */
+    default boolean isRightColumnsOrderFirstOnJoin() {
+        return false;
+    }
 }
diff --git 
a/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/database/MySQLDatabaseMetaData.java
 
b/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/database/MySQLDatabaseMetaData.java
index 0aa22b7fb40..534d222bb45 100644
--- 
a/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/database/MySQLDatabaseMetaData.java
+++ 
b/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/database/MySQLDatabaseMetaData.java
@@ -87,6 +87,16 @@ public final class MySQLDatabaseMetaData implements 
DialectDatabaseMetaData {
         return true;
     }
     
+    @Override
+    public boolean isJoinUsingColumnsByProjectionOrder() {
+        return true;
+    }
+    
+    @Override
+    public boolean isRightColumnsOrderFirstOnJoin() {
+        return true;
+    }
+    
     @Override
     public String getDatabaseType() {
         return "MySQL";

Reply via email to