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 3a1e2afc14c Support oracle interval literals parsing (#27333)
3a1e2afc14c is described below
commit 3a1e2afc14cde83e4952b31bdb53dec977e406d6
Author: ZhangCheng <[email protected]>
AuthorDate: Thu Jul 20 18:12:40 2023 +0800
Support oracle interval literals parsing (#27333)
* Support oracle interval literals parsing
* Support oracle interval literals parsing
* Support oracle interval literals parsing
---
.../src/main/antlr4/imports/oracle/BaseRule.g4 | 15 ++++++++++-
.../visitor/statement/OracleStatementVisitor.java | 5 +++-
.../parser/src/main/resources/case/dml/insert.xml | 30 ++++++++++++++++++++++
3 files changed, 48 insertions(+), 2 deletions(-)
diff --git
a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
index 9b38caf3088..38fd1bc02c1 100644
--- a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
+++ b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
@@ -31,6 +31,19 @@ literals
| bitValueLiterals
| booleanLiterals
| nullValueLiterals
+ | intervalLiterals
+ ;
+
+intervalLiterals
+ : INTERVAL stringLiterals intervalUnit (intervalPrecision)? (TO
intervalUnit (intervalPrecision)?)?
+ ;
+
+intervalPrecision
+ : LP_ INTEGER_ RP_
+ ;
+
+intervalUnit
+ : SECOND | MINUTE | HOUR | DAY | MONTH | YEAR
;
stringLiterals
@@ -100,7 +113,7 @@ unreservedWord1
| BECOME | CHANGE | NOTIFICATION | PRIVILEGE | PURGE | RESUMABLE
| SYSGUID | SYSBACKUP | SYSDBA | SYSDG | SYSKM | SYSOPER | DBA_RECYCLEBIN
|SCHEMA
| DO | DEFINER | CURRENT_USER | CASCADED | CLOSE | OPEN | NEXT | NAME |
NAMES
- | COLLATION | REAL | TYPE | FIRST | RANK | SAMPLE | SYSTIMESTAMP |
INTERVAL | MINUTE | ANY
+ | COLLATION | REAL | TYPE | FIRST | RANK | SAMPLE | SYSTIMESTAMP | MINUTE
| ANY
| LENGTH | SINGLE_C | capacityUnit | TARGET | PUBLIC | ID | STATE |
PRIORITY
| CONSTRAINT | PRIMARY | FOREIGN | KEY | POSITION | PRECISION | FUNCTION |
PROCEDURE | SPECIFICATION | CASE
| WHEN | CAST | TRIM | SUBSTRING | FULL | INNER | OUTER | LEFT | RIGHT |
CROSS
diff --git
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
index 9901ee5002f..d935cb56055 100644
---
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
+++
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
@@ -183,7 +183,10 @@ public abstract class OracleStatementVisitor extends
OracleStatementBaseVisitor<
if (null != ctx.dateTimeLiterals()) {
return visit(ctx.dateTimeLiterals());
}
- throw new IllegalStateException("Literals must have string, number,
dateTime, hex, bit, boolean or null.");
+ if (null != ctx.intervalLiterals()) {
+ return visit(ctx.intervalLiterals());
+ }
+ throw new IllegalStateException("Literals must have string, number,
dateTime, hex, bit, interval, boolean or null.");
}
@Override
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 62c2fa51835..f8d38ea214c 100644
--- a/test/it/parser/src/main/resources/case/dml/insert.xml
+++ b/test/it/parser/src/main/resources/case/dml/insert.xml
@@ -2340,4 +2340,34 @@
</where>
</select-subquery>
</insert>
+
+ <insert sql-case-id="insert_with_interval">
+ <table name="test" start-index="12" stop-index="15"
literal-start-index="12" literal-stop-index="15" />
+ <columns start-index="16" stop-index="16" literal-start-index="16"
literal-stop-index="16" />
+ <values>
+ <value>
+ <assignment-value>
+ <common-expression literal-text="INTERVAL '123-2' YEAR(3)
TO MONTH" text="INTERVAL '123-2' YEAR(3) TO MONTH" start-index="25"
stop-index="57" literal-start-index="25" literal-stop-index="57" />
+ </assignment-value>
+ <assignment-value>
+ <common-expression literal-text="INTERVAL '123' YEAR(3)"
text="INTERVAL '123' YEAR(3)" start-index="60" stop-index="81"
literal-start-index="60" literal-stop-index="81" />
+ </assignment-value>
+ <assignment-value>
+ <common-expression literal-text="INTERVAL '300' MONTH(3)"
text="INTERVAL '300' MONTH(3)" start-index="84" stop-index="106"
literal-start-index="84" literal-stop-index="106" />
+ </assignment-value>
+ <assignment-value>
+ <common-expression literal-text="INTERVAL '4' YEAR"
text="INTERVAL '4' YEAR" start-index="109" stop-index="125"
literal-start-index="109" literal-stop-index="125" />
+ </assignment-value>
+ <assignment-value>
+ <common-expression literal-text="INTERVAL '50' MONTH"
text="INTERVAL '50' MONTH" start-index="128" stop-index="146"
literal-start-index="128" literal-stop-index="146" />
+ </assignment-value>
+ <assignment-value>
+ <common-expression literal-text="INTERVAL '4 5:12:10.222'
DAY TO SECOND(3)" text="INTERVAL '4 5:12:10.222' DAY TO SECOND(3)"
start-index="149" stop-index="189" literal-start-index="149"
literal-stop-index="189" />
+ </assignment-value>
+ <assignment-value>
+ <common-expression literal-text="INTERVAL '4 5:12' DAY TO
MINUTE" text="INTERVAL '4 5:12' DAY TO MINUTE" start-index="192"
stop-index="222" literal-start-index="192" literal-stop-index="222" />
+ </assignment-value>
+ </value>
+ </values>
+ </insert>
</sql-parser-test-cases>