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 547e91e7b93 Enhance MySQL do syntax rules (#26711)
547e91e7b93 is described below
commit 547e91e7b9329a4a456b5c1f56bacb6921e869e2
Author: niu niu <[email protected]>
AuthorDate: Sat Jul 1 11:14:33 2023 +0800
Enhance MySQL do syntax rules (#26711)
* Enhance MySQL do syntax rules
* Fix test case
---
.../src/main/antlr4/imports/mysql/DMLStatement.g4 | 2 +-
.../statement/dml/impl/DoStatementAssert.java | 3 +
.../impl/dostatement/ExpectedDoParameter.java | 4 ++
test/it/parser/src/main/resources/case/dml/do.xml | 76 ++++++++++++++++++++--
.../src/main/resources/sql/supported/dml/do.xml | 2 +
5 files changed, 80 insertions(+), 7 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 65013369dfa..d985983618e 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
@@ -166,7 +166,7 @@ call
;
doStatement
- : DO expr (COMMA_ expr)*
+ : DO expr (AS? alias)? (COMMA_ expr (AS? alias)?)*
;
handlerStatement
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/impl/DoStatementAssert.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/impl/DoStatementAssert.java
index 915ce22fb68..ddd8e5d9b78 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/impl/DoStatementAssert.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/impl/DoStatementAssert.java
@@ -20,6 +20,7 @@ package
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.FunctionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.complex.CommonExpressionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
@@ -67,6 +68,8 @@ public final class DoStatementAssert {
ExpressionAssert.assertLiteralExpression(assertContext,
(LiteralExpressionSegment) actual, expected.getLiteralExpression());
} else if (actual instanceof CommonExpressionSegment) {
ExpressionAssert.assertCommonExpression(assertContext,
(CommonExpressionSegment) actual, expected.getCommonExpression());
+ } else if (actual instanceof FunctionSegment) {
+ ExpressionAssert.assertFunction(assertContext, (FunctionSegment)
actual, expected.getFunction());
}
}
}
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/dostatement/ExpectedDoParameter.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/dostatement/ExpectedDoParameter.java
index d69e9965de0..fce484782ef 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/dostatement/ExpectedDoParameter.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/dostatement/ExpectedDoParameter.java
@@ -23,6 +23,7 @@ import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.s
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.complex.ExpectedCommonExpression;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.simple.ExpectedLiteralExpression;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.simple.ExpectedParameterMarkerExpression;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.function.ExpectedFunction;
import javax.xml.bind.annotation.XmlElement;
@@ -41,4 +42,7 @@ public final class ExpectedDoParameter extends
AbstractExpectedSQLSegment {
@XmlElement(name = "common-expression")
private ExpectedCommonExpression commonExpression;
+
+ @XmlElement
+ private ExpectedFunction function;
}
diff --git a/test/it/parser/src/main/resources/case/dml/do.xml
b/test/it/parser/src/main/resources/case/dml/do.xml
index 674e93246bf..3dfcb3a7a00 100644
--- a/test/it/parser/src/main/resources/case/dml/do.xml
+++ b/test/it/parser/src/main/resources/case/dml/do.xml
@@ -25,28 +25,57 @@
<do sql-case-id="do_sleep">
<parameter>
- <literal-expression value="SLEEP(1)" start-index="3"
stop-index="10" />
+ <function function-name="SLEEP" start-index="3" stop-index="10"
text="SLEEP(1)">
+ <parameter>
+ <literal-expression value="1" start-index="9"
stop-index="9" />
+ </parameter>
+ </function>
</parameter>
</do>
<do sql-case-id="do_multiple_sleep">
<parameter>
- <literal-expression value="SLEEP(1)" start-index="3"
stop-index="10" />
+ <function function-name="SLEEP" start-index="3" stop-index="10"
text="SLEEP(1)">
+ <parameter>
+ <literal-expression value="1" start-index="9"
stop-index="9" />
+ </parameter>
+ </function>
</parameter>
<parameter>
- <literal-expression value="SLEEP(2)" start-index="13"
stop-index="20" />
+ <function function-name="SLEEP" start-index="13" stop-index="20"
text="SLEEP(2)">
+ <parameter>
+ <literal-expression value="2" start-index="19"
stop-index="19" />
+ </parameter>
+ </function>
</parameter>
</do>
<do sql-case-id="do_with_function_1">
<parameter>
+ <function function-name="FROM_BASE64" start-index="3"
stop-index="54" text="FROM_BASE64(CAST((MID(UUID(),20,64)) AS BINARY(55)))">
+ <parameter>
+ <function function-name="CAST" start-index="15"
stop-index="53" text="CAST((MID(UUID(),20,64)) AS BINARY(55))">
+ <parameter>
+ <data-type start-index="43" stop-index="52"
value="BINARY" />
+ </parameter>
+ </function>
+ </parameter>
+ </function>
<literal-expression value="FROM_BASE64(CAST((MID(UUID(),20,64)) AS
BINARY(55)))" start-index="3" stop-index="54" />
</parameter>
</do>
<do sql-case-id="do_with_function_2">
<parameter>
- <literal-expression value="FROM_BASE64(CAST(RIGHT(11,1)AS
BINARY(24)))" start-index="3" stop-index="45" />
+ <function function-name="FROM_BASE64" start-index="3"
stop-index="45" text="FROM_BASE64(CAST(RIGHT(11,1)AS BINARY(24)))">
+ <parameter>
+ <function function-name="CAST" start-index="15"
stop-index="44" text="CAST(RIGHT(11,1)AS BINARY(24))">
+ <parameter>
+ <data-type start-index="34" stop-index="43"
value="BINARY" />
+ </parameter>
+ </function>
+ </parameter>
+ </function>
</parameter>
</do>
@@ -55,10 +84,45 @@
<literal-expression value="COUNT(DISTINCT ROUND(CAST(SLEEP(0) AS
DECIMAL), NULL))" start-index="3" stop-index="56" />
</parameter>
</do>
-
+
+ <do sql-case-id="do_with_function_4">
+ <parameter>
+ <function function-name="ST_AsText" start-index="3"
stop-index="28" text="ST_AsText(@centroid_point)">
+ <parameter>
+ <variable-segment start-index="13" stop-index="27"
variable="centroid_point" />
+ </parameter>
+ </function>
+ </parameter>
+ </do>
+
+ <do sql-case-id="do_with_function_5">
+ <parameter>
+ <function function-name="SLEEP" start-index="3" stop-index="10"
text="SLEEP(5)">
+ <parameter>
+ <literal-expression value="5" start-index="9"
stop-index="9" />
+ </parameter>
+ </function>
+ </parameter>
+ <parameter>
+ <function function-name="SLEEP" start-index="18" stop-index="25"
text="SLEEP(5)">
+ <parameter>
+ <literal-expression value="5" start-index="24"
stop-index="24" />
+ </parameter>
+ </function>
+ </parameter>
+ </do>
+
<do sql-case-id="do_with_crc32_function">
<parameter>
- <literal-expression value="CRC32(CHAR(1.134475E+308))"
start-index="3" stop-index="28" />
+ <function function-name="CRC32" start-index="3" stop-index="28"
text="CRC32(CHAR(1.134475E+308))">
+ <parameter>
+ <function function-name="CHAR" start-index="9"
stop-index="27" text="CHAR(1.134475E+308)">
+ <parameter>
+ <literal-expression value="1.134475E+308"
start-index="14" stop-index="26" />
+ </parameter>
+ </function>
+ </parameter>
+ </function>
</parameter>
</do>
</sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/do.xml
b/test/it/parser/src/main/resources/sql/supported/dml/do.xml
index a1148208e00..2e839dca9cf 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/do.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/do.xml
@@ -23,5 +23,7 @@
<sql-case id="do_with_function_1" value="DO
FROM_BASE64(CAST((MID(UUID(),20,64)) AS BINARY(55)))" db-types="MySQL" />
<sql-case id="do_with_function_2" value="DO FROM_BASE64(CAST(RIGHT(11,1)AS
BINARY(24)))" db-types="MySQL" />
<sql-case id="do_with_function_3" value="DO COUNT(DISTINCT
ROUND(CAST(SLEEP(0) AS DECIMAL), NULL))" db-types="MySQL" />
+ <sql-case id="do_with_function_4" value="DO ST_AsText(@centroid_point) as
centroid" db-types="MySQL" />
+ <sql-case id="do_with_function_5" value="DO SLEEP(5) as t, SLEEP(5) as t1"
db-types="MySQL" />
<sql-case id="do_with_crc32_function" value="DO
CRC32(CHAR(1.134475E+308))" db-types="MySQL" />
</sql-cases>