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 e061463  support openGauss insert on duplicate key (#13442)
e061463 is described below

commit e06146365eab601721078b8f49ca66171b03eceb
Author: tuichenchuxin <[email protected]>
AuthorDate: Thu Nov 4 09:29:08 2021 +0800

    support openGauss insert on duplicate key (#13442)
---
 .../main/antlr4/imports/opengauss/DMLStatement.g4  | 14 +++---
 .../antlr4/imports/opengauss/OpenGaussKeyword.g4   |  4 ++
 .../src/main/resources/case/dml/insert.xml         | 50 ++++++++++++++++++++++
 .../main/resources/sql/supported/dml/insert.xml    |  2 +
 4 files changed, 62 insertions(+), 8 deletions(-)

diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-opengauss/src/main/antlr4/imports/opengauss/DMLStatement.g4
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-opengauss/src/main/antlr4/imports/opengauss/DMLStatement.g4
index 8b2cb0a..2724e1c 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-opengauss/src/main/antlr4/imports/opengauss/DMLStatement.g4
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-opengauss/src/main/antlr4/imports/opengauss/DMLStatement.g4
@@ -20,7 +20,7 @@ grammar DMLStatement;
 import Symbol, Keyword, OpenGaussKeyword, Literals, BaseRule;
 
 insert
-    : withClause? INSERT INTO insertTarget insertRest optOnConflict? 
returningClause?
+    : withClause? INSERT INTO insertTarget insertRest optOnDuplicateKey? 
returningClause?
     ;
 
 insertTarget
@@ -48,15 +48,13 @@ insertColumnItem
     : colId optIndirection
     ;
 
-optOnConflict
-    : ON CONFLICT optConfExpr DO UPDATE SET setClauseList whereClause?
-    | ON CONFLICT optConfExpr DO NOTHING
+optOnDuplicateKey
+    : ON DUPLICATE KEY UPDATE assignment (COMMA_ assignment)*
+    | ON DUPLICATE KEY UPDATE NOTHING
     ;
 
-optConfExpr
-    : LP_ indexParams RP_ whereClause?
-    | ON CONSTRAINT name
-    |
+assignment
+    : setTarget EQ_ aExpr
     ;
 
 update
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-opengauss/src/main/antlr4/imports/opengauss/OpenGaussKeyword.g4
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-opengauss/src/main/antlr4/imports/opengauss/OpenGaussKeyword.g4
index 9b7adf2..bf9f7c0 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-opengauss/src/main/antlr4/imports/opengauss/OpenGaussKeyword.g4
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-opengauss/src/main/antlr4/imports/opengauss/OpenGaussKeyword.g4
@@ -1384,3 +1384,7 @@ OUT
 INOUT
     : I N O U T
     ;
+
+DUPLICATE
+    : D U P L I C A T E
+    ;
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/insert.xml
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/insert.xml
index 2f931ab..9fdfda0 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/insert.xml
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/insert.xml
@@ -1943,4 +1943,54 @@
             </value>
         </values>
     </insert>
+
+    <insert sql-case-id="insert_on_duplicate_key_update_nothing">
+        <table name="t_order" start-index="12" stop-index="18" />
+        <columns start-index="20" stop-index="46">
+            <column name="order_id" start-index="21" stop-index="28" />
+            <column name="user_id" start-index="31" stop-index="37" />
+            <column name="status" start-index="40" stop-index="45" />
+        </columns>
+        <values>
+            <value>
+                <assignment-value>
+                    <parameter-marker-expression value="0" />
+                    <literal-expression value="1" start-index="56" 
stop-index="56" />
+                </assignment-value>
+                <assignment-value>
+                    <parameter-marker-expression value="1" />
+                    <literal-expression value="1" start-index="59" 
stop-index="59" />
+                </assignment-value>
+                <assignment-value>
+                    <parameter-marker-expression value="2" />
+                    <literal-expression value="insert" start-index="62" 
stop-index="69" />
+                </assignment-value>
+            </value>
+        </values>
+    </insert>
+
+    <insert sql-case-id="insert_on_duplicate_key_update_multi_column">
+        <table name="t_order" start-index="12" stop-index="18" />
+        <columns start-index="20" stop-index="46">
+            <column name="order_id" start-index="21" stop-index="28" />
+            <column name="user_id" start-index="31" stop-index="37" />
+            <column name="status" start-index="40" stop-index="45" />
+        </columns>
+        <values>
+            <value>
+                <assignment-value>
+                    <parameter-marker-expression value="0" />
+                    <literal-expression value="1" start-index="56" 
stop-index="56" />
+                </assignment-value>
+                <assignment-value>
+                    <parameter-marker-expression value="1" />
+                    <literal-expression value="1" start-index="59" 
stop-index="59" />
+                </assignment-value>
+                <assignment-value>
+                    <parameter-marker-expression value="2" />
+                    <literal-expression value="insert" start-index="62" 
stop-index="69" />
+                </assignment-value>
+            </value>
+        </values>
+    </insert>
 </sql-parser-test-cases>
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dml/insert.xml
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dml/insert.xml
index da3c372..82669e2 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dml/insert.xml
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dml/insert.xml
@@ -83,4 +83,6 @@
     <sql-case 
id="insert_all_with_multitable_with_conditional_when_with_conditional_else" 
value="INSERT ALL WHEN order_total &lt;= 100000 THEN INTO small_orders WHEN 
order_total > 100000 AND order_total &lt;= 200000 THEN INTO medium_orders ELSE 
INTO large_orders SELECT order_id, order_total, sales_rep_id, customer_id FROM 
orders" db-types="Oracle" />
     <sql-case id="insert_with_rank_column" value="INSERT INTO sales (rank) 
VALUES (1)" db-types="Oracle" />
     <sql-case id="insert_with_schema" value="INSERT INTO db1.t_order VALUES 
(1,2,3)" />
+    <sql-case id="insert_on_duplicate_key_update_nothing" value="INSERT INTO 
t_order (order_id, user_id, status) VALUES (1, 1, 'insert') ON DUPLICATE KEY 
UPDATE NOTHING" db-types="openGauss"/>
+    <sql-case id="insert_on_duplicate_key_update_multi_column" value="INSERT 
INTO t_order (order_id, user_id, status) VALUES (1, 1, 'insert') ON DUPLICATE 
KEY UPDATE user_id = user_id + 1, status='update'" db-types="openGauss" />
 </sql-cases>

Reply via email to