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";