This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang 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 94a9e1c4ccf Increase Support for dmlTableClause for Oracle (#28934)
94a9e1c4ccf is described below
commit 94a9e1c4ccfb68f99019364013fe36606b8d99a3
Author: kanha gupta <[email protected]>
AuthorDate: Mon Nov 13 06:32:51 2023 +0530
Increase Support for dmlTableClause for Oracle (#28934)
* Increase Support for dmlTableClause for Oracle
* optimise logic
---
.../converter/segment/from/impl/SimpleTableConverter.java | 4 ++++
.../visitor/statement/type/OracleDMLStatementVisitor.java | 11 +++++++++++
.../common/segment/generic/table/SimpleTableSegment.java | 14 ++++++++++++++
test/it/optimizer/src/test/resources/converter/delete.xml | 2 ++
test/it/parser/src/main/resources/case/dml/delete.xml | 2 +-
5 files changed, 32 insertions(+), 1 deletion(-)
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 cc04fc679c4..b79481c0e80 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
@@ -55,6 +55,10 @@ public final class SimpleTableConverter {
addOwnerNames(names, segment.getOwner().get());
}
names.add(tableName.getIdentifier().getValue());
+ if (segment.getDbLink().isPresent() && segment.getAt().isPresent()) {
+ names.add(segment.getAt().get().getValue());
+ names.add(segment.getDbLink().get().getValue());
+ }
SqlNode tableNameSQLNode = new SqlIdentifier(names, SqlParserPos.ZERO);
if (segment.getAliasName().isPresent()) {
SqlNode aliasSQLNode = new
SqlIdentifier(segment.getAliasName().get(), SqlParserPos.ZERO);
diff --git
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
index 00d19ef9aff..3765bbcb0c1 100644
---
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
+++
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
@@ -123,6 +123,7 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BetweenE
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.CaseWhenExpression;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.CollateExpression;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
import
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.datetime.DatetimeExpression;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionWithParamsSegment;
@@ -460,6 +461,16 @@ public final class OracleDMLStatementVisitor extends
OracleStatementVisitor impl
@Override
public ASTNode visitDmlTableClause(final DmlTableClauseContext ctx) {
+ if (null != ctx.AT_() && null != ctx.dbLink()) {
+ SimpleTableSegment result = new SimpleTableSegment(new
TableNameSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), new
IdentifierValue(ctx.tableName().name().getText())));
+ if (null != ctx.tableName().owner()) {
+ result.setOwner(
+ new
OwnerSegment(ctx.tableName().owner().start.getStartIndex(),
ctx.tableName().owner().stop.getStopIndex(), (IdentifierValue)
visit(ctx.tableName().owner().identifier())));
+ }
+ result.setAt(new IdentifierValue(ctx.AT_().getText()));
+ result.setDbLink(new
IdentifierValue(ctx.dbLink().identifier(0).getText()));
+ return result;
+ }
return visit(ctx.tableName());
}
diff --git
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/SimpleTableSegment.java
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/SimpleTableSegment.java
index 88358eaeae0..fa16925e53e 100644
---
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/SimpleTableSegment.java
+++
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/SimpleTableSegment.java
@@ -46,6 +46,12 @@ public final class SimpleTableSegment implements
TableSegment, OwnerAvailable {
@Setter
private PivotSegment pivot;
+ @Setter
+ private IdentifierValue dbLink;
+
+ @Setter
+ private IdentifierValue at;
+
@Override
public int getStartIndex() {
if (null == owner) {
@@ -64,6 +70,14 @@ public final class SimpleTableSegment implements
TableSegment, OwnerAvailable {
return Optional.ofNullable(owner);
}
+ public Optional<IdentifierValue> getDbLink() {
+ return Optional.ofNullable(dbLink);
+ }
+
+ public Optional<IdentifierValue> getAt() {
+ return Optional.ofNullable(at);
+ }
+
@Override
public Optional<String> getAliasName() {
return null == alias ? Optional.empty() :
Optional.ofNullable(alias.getIdentifier().getValue());
diff --git a/test/it/optimizer/src/test/resources/converter/delete.xml
b/test/it/optimizer/src/test/resources/converter/delete.xml
index 331174393e6..f37d2046aac 100644
--- a/test/it/optimizer/src/test/resources/converter/delete.xml
+++ b/test/it/optimizer/src/test/resources/converter/delete.xml
@@ -42,4 +42,6 @@
<test-cases sql-case-id="delete_with_alias" expected-sql="DELETE FROM
[t_order] AS [o] AS [o] WHERE [status] = ?" db-types="SQLServer"
sql-case-types="PLACEHOLDER" />
<test-cases sql-case-id="delete_with_with_clause" expected-sql="WITH [cte]
([order_id], [user_id]) AS (SELECT [order_id], [user_id] FROM [t_order]) DELETE
FROM ([cte], [t_order]) WHERE [t_order].[order_id] = [cte].[order_id]"
db-types="SQLServer" />
<test-cases sql-case-id="delete_without_columns_with_with_clause"
expected-sql="WITH [cte] AS (SELECT [order_id], [user_id] FROM [t_order])
DELETE FROM ([cte], [t_order]) WHERE [t_order].[order_id] = [cte].[order_id]"
db-types="SQLServer" />
+ <test-cases sql-case-id="delete_with_simple_table" expected-sql="DELETE
FROM "product_descriptions" WHERE "language_id" = 'AR'"
db-types="Oracle" />
+ <test-cases sql-case-id="delete_with_remote_database_table"
expected-sql="DELETE FROM
"hr"."locations"."@"."remote" WHERE
"location_id" > 3000" db-types="Oracle" />
</sql-node-converter-test-cases>
diff --git a/test/it/parser/src/main/resources/case/dml/delete.xml
b/test/it/parser/src/main/resources/case/dml/delete.xml
index a717a5067bf..b1d9da93158 100644
--- a/test/it/parser/src/main/resources/case/dml/delete.xml
+++ b/test/it/parser/src/main/resources/case/dml/delete.xml
@@ -611,7 +611,7 @@
</delete>
<delete sql-case-id="delete_with_remote_database_table">
- <table name="locations" start-index="12" stop-index="23">
+ <table name="locations" start-index="12" stop-index="30">
<owner name="hr" start-index="12" stop-index="13" />
</table>
<where start-index="32" stop-index="55">