You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2023/05/24 04:38:09 UTC

[shardingsphere] branch master updated: Improve MySQL insert syntax rules (#25841)

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 331740037df Improve MySQL insert syntax rules (#25841)
331740037df is described below

commit 331740037df5325f587abb3661bc84725667036b
Author: niu niu <zi...@aliyun.com>
AuthorDate: Wed May 24 12:37:52 2023 +0800

    Improve MySQL insert syntax rules (#25841)
    
    * Change UNDERSCORE_CHARSET lexer (#25535)
    
    * Change onDuplicateKeyClause rule support aliases (#25535)
    
    * Add insert sql test (#25535)
    
    * Add insert sql test with underscore charset (#25535)
---
 .../src/main/antlr4/imports/mysql/DMLStatement.g4  |  2 +-
 .../src/main/antlr4/imports/mysql/Literals.g4      |  2 +-
 .../parser/src/main/resources/case/dml/insert.xml  | 68 +++++++++++++++++++++-
 .../main/resources/sql/supported/dml/insert.xml    |  2 +
 4 files changed, 71 insertions(+), 3 deletions(-)

diff --git a/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/DMLStatement.g4 b/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/DMLStatement.g4
index 59353ae9998..79e30ba6f2c 100644
--- a/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/DMLStatement.g4
+++ b/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/DMLStatement.g4
@@ -48,7 +48,7 @@ insertSelectClause
     ;
 
 onDuplicateKeyClause
-    : ON DUPLICATE KEY UPDATE assignment (COMMA_ assignment)*
+    : (AS identifier)? ON DUPLICATE KEY UPDATE assignment (COMMA_ assignment)*
     ;
 
 valueReference
diff --git a/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/Literals.g4 b/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/Literals.g4
index b770b1a430f..fe0b64e9cc1 100644
--- a/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/Literals.g4
+++ b/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/Literals.g4
@@ -36,7 +36,7 @@ NCHAR_TEXT
     ;
 
 UNDERSCORE_CHARSET
-    : UL_ [a-z0-9]+
+    : UL_ [a-z0-9A-Z]+
     ;
 
 NUMBER_
diff --git a/test/it/parser/src/main/resources/case/dml/insert.xml b/test/it/parser/src/main/resources/case/dml/insert.xml
index 57cbc2ba76f..281da0ec2f9 100644
--- a/test/it/parser/src/main/resources/case/dml/insert.xml
+++ b/test/it/parser/src/main/resources/case/dml/insert.xml
@@ -332,7 +332,73 @@
             </assignment>
         </set>
     </insert>
-
+    <insert sql-case-id="insert_duplicate_key_update">
+        <table name="t_order" start-index="12" stop-index="18" />
+        <set start-index="20" stop-index="34" literal-stop-index="34">
+            <assignment>
+                <column name="b" start-index="24" stop-index="24" />
+                <assignment-value>
+                    <literal-expression value="11" literal-start-index="26" literal-stop-index="29" />
+                </assignment-value>
+            </assignment>
+            <assignment>
+                <column name="a" start-index="32" stop-index="32" />
+                <assignment-value>
+                    <literal-expression value="0" literal-start-index="34" literal-stop-index="34" />
+                </assignment-value>
+            </assignment>
+        </set>
+        <on-duplicate-key-columns start-index="43" stop-index="76" literal-start-index="36" literal-stop-index="76">
+            <assignment start-index="65" stop-index="69">
+                <column name="b" start-index="65" stop-index="65"  />
+                <assignment-value>
+                    <common-expression literal-text="n.a" start-index="67" stop-index="69" />
+                </assignment-value>
+            </assignment>
+            <assignment start-index="72" stop-index="76">
+                <column name="a" start-index="72" stop-index="72"  />
+                <assignment-value>
+                    <common-expression literal-text="n.b" start-index="74" stop-index="76" />
+                </assignment-value>
+            </assignment>
+        </on-duplicate-key-columns>
+    </insert>
+    <insert sql-case-id="insert_with_underscore_charset">
+        <table name="t_order" start-index="12" stop-index="18" />
+        <columns start-index="19" stop-index="19" />
+        <values>
+            <value>
+                <assignment-value>
+                    <common-expression literal-text="_utf160x1EC2" start-index="27" stop-index="39" />
+                </assignment-value>
+            </value>
+            <value>
+                <assignment-value>
+                    <common-expression literal-text="_utf160x1EC3" start-index="44" stop-index="56" />
+                </assignment-value>
+            </value>
+            <value>
+                <assignment-value>
+                    <common-expression literal-text="_utf160x1EC5" start-index="61" stop-index="73" />
+                </assignment-value>
+            </value>
+            <value>
+                <assignment-value>
+                    <common-expression literal-text="_utf160x1EC0" start-index="78" stop-index="90" />
+                </assignment-value>
+            </value>
+            <value>
+                <assignment-value>
+                    <common-expression literal-text="_utf160x1EC7" start-index="95" stop-index="107" />
+                </assignment-value>
+            </value>
+            <value>
+                <assignment-value>
+                    <common-expression literal-text="_Utf160x1EBF" start-index="112" stop-index="124" />
+                </assignment-value>
+            </value>
+        </values>
+    </insert>
     <insert sql-case-id="insert_with_partial_placeholders" parameters="1, 1">
         <table name="t_order" start-index="12" stop-index="18" />
         <columns start-index="20" stop-index="46">
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/insert.xml b/test/it/parser/src/main/resources/sql/supported/dml/insert.xml
index bc518507889..47b748cf8cc 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/insert.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/insert.xml
@@ -26,6 +26,8 @@
     <sql-case id="insert_with_all_placeholders_for_table_identifier" value="INSERT INTO t_order (t_order.order_id, t_order.user_id, t_order.status) VALUES (?, ?, ?)" />
     <sql-case id="insert_without_columns_with_all_placeholders" value="INSERT INTO t_order VALUES (?, ?, ?)" />
     <sql-case id="insert_set_with_all_placeholders" value="INSERT INTO t_order SET order_id = ?, user_id = ?, status = ?" db-types="MySQL" />
+    <sql-case id="insert_duplicate_key_update" value="INSERT INTO t_order SET b='11', a=0 AS n ON DUPLICATE KEY UPDATE b=n.a, a=n.b" db-types="MySQL" />
+    <sql-case id="insert_with_underscore_charset" value="INSERT INTO t_order VALUES(_utf16 0x1EC2), (_utf16 0x1EC3), (_utf16 0x1EC5), (_utf16 0x1EC0), (_utf16 0x1EC7), (_Utf16 0x1EBF)" db-types="MySQL" />
     <sql-case id="insert_set_with_all_placeholders_for_table_identifier" value="INSERT INTO t_order SET t_order.order_id = ?, t_order.user_id = ?, t_order.status = ?" db-types="MySQL" />
     <sql-case id="insert_with_partial_placeholders" value="INSERT INTO t_order (order_id, user_id, status) VALUES (?, ?, 'insert')" />
     <sql-case id="insert_set_with_partial_placeholders" value="INSERT INTO t_order SET order_id = ?, user_id = ?, status = 'insert'" db-types="MySQL" />