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>

Reply via email to