From 9cbfaea8ea918a6a949b97eb3cd3989000949caa Mon Sep 17 00:00:00 2001 From: Zhengqiang Duan Date: Thu, 19 Oct 2023 18:45:50 +0800 Subject: [PATCH] Fix Object 'DUAL' not found exception when execute select 1 from dual with sql federation (#28804) --- .../optimizer/converter/SQLNodeConverterEngine.java | 7 ------- .../converter/segment/from/impl/SimpleTableConverter.java | 3 +++ .../converter/segment/projection/ProjectionsConverter.java | 5 +++++ test/it/optimizer/src/test/resources/converter/select.xml | 4 +++- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/SQLNodeConverterEngine.java b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/SQLNodeConverterEngine.java index 0538c2618e8ad..4c3c13aeb7426 100644 --- a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/SQLNodeConverterEngine.java +++ b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/SQLNodeConverterEngine.java @@ -23,7 +23,6 @@ import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement; import org.apache.shardingsphere.sql.parser.sql.common.statement.dal.DALStatement; import org.apache.shardingsphere.sql.parser.sql.common.statement.dal.ExplainStatement; -import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DDLStatement; import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.DMLStatement; import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.DeleteStatement; import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement; @@ -57,8 +56,6 @@ public static SqlNode convert(final SQLStatement sqlStatement) { Optional result = Optional.empty(); if (sqlStatement instanceof DMLStatement) { result = convert((DMLStatement) sqlStatement); - } else if (sqlStatement instanceof DDLStatement) { - result = convert((DDLStatement) sqlStatement); } else if (sqlStatement instanceof DALStatement) { result = convert((DALStatement) sqlStatement); } @@ -72,10 +69,6 @@ private static Optional convert(final DMLStatement sqlStatement) { if (sqlStatement instanceof DeleteStatement) { return Optional.of(new DeleteStatementConverter().convert((DeleteStatement) sqlStatement)); } - return Optional.empty(); - } - - private static Optional convert(final DDLStatement sqlStatement) { if (sqlStatement instanceof UpdateStatement) { return Optional.of(new UpdateStatementConverter().convert((UpdateStatement) sqlStatement)); } diff --git a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/from/impl/SimpleTableConverter.java b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/from/impl/SimpleTableConverter.java index 0b8d7f242f307..cc04fc679c43c 100644 --- a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/from/impl/SimpleTableConverter.java +++ b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/from/impl/SimpleTableConverter.java @@ -46,6 +46,9 @@ public final class SimpleTableConverter { * @return sql node */ public static Optional convert(final SimpleTableSegment segment) { + if ("DUAL".equalsIgnoreCase(segment.getTableName().getIdentifier().getValue())) { + return Optional.empty(); + } TableNameSegment tableName = segment.getTableName(); List names = new ArrayList<>(); if (segment.getOwner().isPresent()) { diff --git a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/projection/ProjectionsConverter.java b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/projection/ProjectionsConverter.java index 250436f23924b..3a7bd5a47127b 100644 --- a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/projection/ProjectionsConverter.java +++ b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/projection/ProjectionsConverter.java @@ -22,6 +22,7 @@ import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; import org.apache.calcite.sql.parser.SqlParserPos; +import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment; import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.AggregationProjectionSegment; import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ColumnProjectionSegment; import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ExpressionProjectionSegment; @@ -29,6 +30,7 @@ import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionsSegment; import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ShorthandProjectionSegment; import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.SubqueryProjectionSegment; +import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.ParameterMarkerExpressionConverter; import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.projection.impl.AggregationProjectionConverter; import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.projection.impl.ColumnProjectionConverter; import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.projection.impl.ExpressionProjectionConverter; @@ -75,6 +77,9 @@ private static Optional getProjectionSQLNode(final ProjectionSegment se if (segment instanceof AggregationProjectionSegment) { return AggregationProjectionConverter.convert((AggregationProjectionSegment) segment); } + if (segment instanceof ParameterMarkerExpressionSegment) { + return ParameterMarkerExpressionConverter.convert((ParameterMarkerExpressionSegment) segment); + } // TODO process other projection return Optional.empty(); } diff --git a/test/it/optimizer/src/test/resources/converter/select.xml b/test/it/optimizer/src/test/resources/converter/select.xml index e16ff8d319e80..437688b8969b6 100644 --- a/test/it/optimizer/src/test/resources/converter/select.xml +++ b/test/it/optimizer/src/test/resources/converter/select.xml @@ -17,7 +17,7 @@ --> - + @@ -33,4 +33,6 @@ + +