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 &quot;product_descriptions&quot; WHERE &quot;language_id&quot; = 'AR'" 
db-types="Oracle" />
+    <test-cases sql-case-id="delete_with_remote_database_table" 
expected-sql="DELETE FROM 
&quot;hr&quot;.&quot;locations&quot;.&quot;@&quot;.&quot;remote&quot; WHERE 
&quot;location_id&quot; &gt; 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">

Reply via email to