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" />