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 a7756fd3172  Enhance the support for Oracle SQL parsing (#30742)
a7756fd3172 is described below

commit a7756fd317256778e4ab13c75bcf8ff79c9bd3aa
Author: zhuruixuan <[email protected]>
AuthorDate: Wed Apr 3 13:46:47 2024 +0800

     Enhance the support for Oracle SQL parsing (#30742)
    
    * Change1 SQL
    
    * Change1 SQL
    
    * Change1 Cases
    
    * Change1 Keyword
    
    * Change1 PLSQL
    
    * Change1 Baserule
    
    * Change2 case
    
    * Change2 keyword
    
    * Change2 BaseRule
    
    * Change3 cases
    
    * Increase the indentation
    
    * Increase1 the indentation
    
    * Increase2 the indentation
    
    * 解决冲突
    
    * solve conflct
---
 .../src/main/antlr4/imports/oracle/BaseRule.g4     |  5 +++
 .../main/antlr4/imports/oracle/OracleKeyword.g4    |  4 +++
 .../oracle/src/main/antlr4/imports/oracle/PLSQL.g4 | 26 +++++++++++---
 .../src/main/resources/case/ddl/create-trigger.xml |  2 ++
 .../resources/sql/supported/ddl/create-trigger.xml | 40 ++++++++++++++++++++++
 5 files changed, 72 insertions(+), 5 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 f3e11698035..09fe2704bb3 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
@@ -663,6 +663,11 @@ expr
     | expr datetimeExpr
     | multisetExpr
     | builtinFunctionsExpr
+    | dataManipulationLanguageExpr
+    ;
+
+dataManipulationLanguageExpr
+    : UPDATING | INSERTING | DELETING
     ;
 
 andOperator
diff --git 
a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/OracleKeyword.g4 
b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/OracleKeyword.g4
index 8b6d011f79e..05cf60f028c 100644
--- a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/OracleKeyword.g4
+++ b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/OracleKeyword.g4
@@ -7971,3 +7971,7 @@ REP
 APP
     : A P P
     ;
+
+EXCEPTION_INIT
+    : E X C E P T I O N UL_ I N I T
+    ;
diff --git a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/PLSQL.g4 
b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/PLSQL.g4
index f58dd3f23b4..da97943a084 100644
--- a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/PLSQL.g4
+++ b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/PLSQL.g4
@@ -311,10 +311,10 @@ gotoStatement
     ;
 
 ifStatement
-    : IF booleanExpression THEN statement+
+    : (IF booleanExpression THEN statement+)*
     (ELSIF booleanExpression THEN statement+)*
     (ELSE statement+)?
-    END IF SEMI_
+    (END IF SEMI_)+
     ;
 
 modifyingStatement: IF modifyingExpression THEN statement+ (ELSIF 
modifyingExpression THEN statement+)* (ELSE statement+)? END IF SEMI_;
@@ -424,7 +424,15 @@ declareSection
     ;
     
 declareItem
-    : typeDefinition | cursorDeclaration | itemDeclaration | 
functionDeclaration | procedureDeclaration | cursorDefinition | 
functionDefinition | procedureDefinition | pragma
+    : typeDefinition
+    | cursorDeclaration
+    | itemDeclaration
+    | functionDeclaration
+    | procedureDeclaration
+    | cursorDefinition
+    | functionDefinition
+    | procedureDefinition
+    | pragma
     ;
 
 cursorDefinition
@@ -507,7 +515,7 @@ cursorVariableDeclaration
     ;
 
 exceptionDeclaration
-    : variableName EXCEPTION SEMI_
+    : variableName (EXCEPTION SEMI_)?
     ;
 
 recordVariableDeclaration
@@ -566,10 +574,18 @@ rowtypeAttribute
     ;
 
 pragma
-    : autonomousTransPragma | restrictReferencesPragma
+    : autonomousTransPragma | restrictReferencesPragma | exceptionInitPragma
     // TODO Support more pragma
     ;
 
+exceptionInitPragma
+    : (PRAGMA EXCEPTION_INIT LP_ exceptionDeclaration COMMA_ errorCode RP_ 
SEMI_)+
+    ;
+
+errorCode
+    : MINUS_ INTEGER_
+    ;
+
 autonomousTransPragma
     : PRAGMA AUTONOMOUS_TRANSACTION SEMI_
     ;
diff --git a/test/it/parser/src/main/resources/case/ddl/create-trigger.xml 
b/test/it/parser/src/main/resources/case/ddl/create-trigger.xml
index 563d503f8ac..008f55af83b 100644
--- a/test/it/parser/src/main/resources/case/ddl/create-trigger.xml
+++ b/test/it/parser/src/main/resources/case/ddl/create-trigger.xml
@@ -32,4 +32,6 @@
     <create-trigger sql-case-id="create_trigger_with_cascade_2" />
     <create-trigger sql-case-id="create_trigger_with_cascade_3" />
     <create-trigger sql-case-id="create_trigger_with_cascade_4" />
+    <create-trigger 
sql-case-id="create_trigger_with_dataManipulationLanguage_statement" />
+    <create-trigger sql-case-id="create_trigger_with_exceptionInit_pragma" />
 </sql-parser-test-cases>
diff --git 
a/test/it/parser/src/main/resources/sql/supported/ddl/create-trigger.xml 
b/test/it/parser/src/main/resources/sql/supported/ddl/create-trigger.xml
index 58f6b4ccf8d..ad9f328d328 100644
--- a/test/it/parser/src/main/resources/sql/supported/ddl/create-trigger.xml
+++ b/test/it/parser/src/main/resources/sql/supported/ddl/create-trigger.xml
@@ -29,4 +29,44 @@
     <sql-case id="create_trigger_with_cascade_2" value="CREATE OR REPLACE 
TRIGGER dept_del_cascade AFTER DELETE ON dept FOR EACH ROW BEGIN DELETE FROM 
emp WHERE emp.Deptno = :OLD.Deptno; END;" db-types="Oracle" />
     <sql-case id="create_trigger_with_cascade_3" value="CREATE OR REPLACE 
TRIGGER dept_cascade2 AFTER DELETE OR UPDATE OF Deptno ON dept FOR EACH ROW 
BEGIN IF UPDATING THEN UPDATE emp SET Deptno = :NEW.Deptno, Update_id = 
Integritypackage.Updateseq WHERE emp.Deptno = :OLD.Deptno AND Update_id IS 
NULL; END IF; IF DELETING THEN DELETE FROM emp WHERE emp.Deptno = :OLD.Deptno; 
END IF; END;" db-types="Oracle" />
     <sql-case id="create_trigger_with_cascade_4" value="CREATE OR REPLACE 
TRIGGER dept_restrict BEFORE DELETE OR UPDATE OF Deptno ON dept FOR EACH ROW 
DECLARE Dummy INTEGER; Employees_present EXCEPTION; employees_not_present  
EXCEPTION; CURSOR Dummy_cursor (Dn NUMBER) IS SELECT Deptno FROM emp WHERE 
Deptno = Dn; BEGIN OPEN Dummy_cursor (:OLD.Deptno); FETCH Dummy_cursor INTO 
Dummy; IF Dummy_cursor%FOUND THEN RAISE Employees_present; ELSE RAISE 
Employees_not_present; END IF; CLOSE Dummy_cu [...]
+    <sql-case id="create_trigger_with_dataManipulationLanguage_statement" 
value="CREATE OR REPLACE TRIGGER lineitems_trigger
+        AFTER INSERT OR UPDATE OR DELETE ON lineitems
+        FOR EACH ROW
+      BEGIN
+        IF (INSERTING OR UPDATING)
+        THEN
+          UPDATE orders SET line_items_count = NVL(line_items_count,0)+1
+          WHERE order_id = :new.order_id;
+        END IF;
+        IF (DELETING OR UPDATING)
+        THEN
+          UPDATE orders SET line_items_count = NVL(line_items_count,0)-1
+          WHERE order_id = :old.order_id;
+        END IF;
+      END;" db-types="Oracle"/>
+    <sql-case id="create_trigger_with_exceptionInit_pragma" value="CREATE OR 
REPLACE TRIGGER Employee_permit_changes
+            BEFORE INSERT OR DELETE OR UPDATE ON employees
+          DECLARE
+            Dummy             INTEGER;
+            Not_on_weekends   EXCEPTION;
+            Nonworking_hours  EXCEPTION;
+            PRAGMA EXCEPTION_INIT (Not_on_weekends, -4097);
+            PRAGMA EXCEPTION_INIT (Nonworking_hours, -4099);
+          BEGIN
+             IF (TO_CHAR(Sysdate, 'DAY') = 'SAT' OR
+               TO_CHAR(Sysdate, 'DAY') = 'SUN') THEN
+                 RAISE Not_on_weekends;
+             END IF;
+            IF (TO_CHAR(Sysdate, 'HH24') &lt; 8 OR
+              TO_CHAR(Sysdate, 'HH24') &gt; 18) THEN
+                RAISE Nonworking_hours;
+            END IF;
+          EXCEPTION
+            WHEN Not_on_weekends THEN
+              Raise_application_error(-20324,'Might not change '
+                ||'employee table during the weekend');
+            WHEN Nonworking_hours THEN
+              Raise_application_error(-20326,'Might not change '
+               ||'emp table during Nonworking hours');
+          END;" db-types="Oracle"/>
 </sql-cases>

Reply via email to