This is an automated email from the ASF dual-hosted git repository.
tuichenchuxin 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 9cbfaea8ea9 Fix Object 'DUAL' not found exception when execute select
1 from dual with sql federation (#28804)
9cbfaea8ea9 is described below
commit 9cbfaea8ea918a6a949b97eb3cd3989000949caa
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Thu Oct 19 18:45:50 2023 +0800
Fix Object 'DUAL' not found exception when execute select 1 from dual with
sql federation (#28804)
---
.../sqlfederation/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 0538c2618e8..4c3c13aeb74 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.calcite.sql.SqlNode;
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 final class SQLNodeConverterEngine {
Optional<SqlNode> 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 @@ public final class SQLNodeConverterEngine {
if (sqlStatement instanceof DeleteStatement) {
return Optional.of(new
DeleteStatementConverter().convert((DeleteStatement) sqlStatement));
}
- return Optional.empty();
- }
-
- private static Optional<SqlNode> 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 0b8d7f242f3..cc04fc679c4 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<SqlNode> convert(final SimpleTableSegment segment) {
+ if
("DUAL".equalsIgnoreCase(segment.getTableName().getIdentifier().getValue())) {
+ return Optional.empty();
+ }
TableNameSegment tableName = segment.getTableName();
List<String> 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 250436f2392..3a7bd5a4712 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 lombok.NoArgsConstructor;
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.Projecti
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 @@ public final class ProjectionsConverter {
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 e16ff8d319e..437688b8969 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 @@
-->
<sql-node-converter-test-cases>
- <test-cases sql-case-id="select_string_constant_type_cast"
expected-sql="SELECT CAST('1' AS INTEGER), CAST('2' AS DECIMAL)"
dbtypes="openGauss,PostgreSQL" />
+ <test-cases sql-case-id="select_string_constant_type_cast"
expected-sql="SELECT CAST('1' AS INTEGER), CAST('2' AS DECIMAL)"
db-types="openGauss,PostgreSQL" />
<test-cases
sql-case-id="select_with_database_name_and_schema_name_in_table"
expected-sql="SELECT "order_id" FROM
"sharding_db"."public"."t_order" WHERE
"user_id" = ? AND "order_id" = ?"
db-types="PostgreSQL,openGauss" sql-case-types="PLACEHOLDER" />
<test-cases
sql-case-id="select_with_database_name_and_schema_name_in_table"
expected-sql="SELECT "order_id" FROM
"sharding_db"."public"."t_order" WHERE
"user_id" = 1 AND "order_id" = 1"
db-types="PostgreSQL,openGauss" sql-case-types="LITERAL" />
<test-cases sql-case-id="select_with_spatial_function"
expected-sql="SELECT * FROM `t_order` WHERE
`ST_DISTANCE_SPHERE`(`POINT`(113.358772, 23.1273723), `POINT`(`user_id`,
`order_id`)) <> 0" db-types="MySQL" />
@@ -33,4 +33,6 @@
<test-cases sql-case-id="select_with_assignment_operator"
expected-sql="SELECT `rn` := 1, `now_code` := '' FROM `t_order`"
db-types="MySQL" />
<test-cases sql-case-id="select_with_assignment_operator_and_keyword"
expected-sql="SELECT `KEY` := '', `num` := 123 FROM `t_order`" db-types="MySQL"
/>
<test-cases sql-case-id="select_with_json_value_return_type"
expected-sql="SELECT * FROM `t_order` WHERE JSON_VALUE(`items`, '''$.name'''
'RETURNING' VARCHAR(100)) = 'jack'" db-types="MySQL" />
+ <test-cases sql-case-id="select_projection_with_parameter"
expected-sql="SELECT 1 "id", ?, "SYSDATE"
"create_time", "TRUNC"("SYSDATE")
"create_date"" db-types="Oracle" sql-case-types="PLACEHOLDER" />
+ <test-cases sql-case-id="select_projection_with_parameter"
expected-sql="SELECT 1 "id", 'OK' "status",
"SYSDATE" "create_time",
"TRUNC"("SYSDATE") "create_date""
db-types="Oracle" sql-case-types="LITERAL" />
</sql-node-converter-test-cases>