This is an automated email from the ASF dual-hosted git repository.

niuzihao 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 26e1fe1289c Support Create Trigger with System Trigger in Oracle 
(#29610)
26e1fe1289c is described below

commit 26e1fe1289c0b169f34cea56f4c66939fbf90eb8
Author: ilyas ahsan <[email protected]>
AuthorDate: Wed Jan 3 11:11:02 2024 +0700

    Support Create Trigger with System Trigger in Oracle (#29610)
    
    * Support Create Trigger with Body
    
    * Refactor Function to Create Trigger in Oracle
    
    * Keep the branch for dmlEventTrigger in one line
---
 .../oracle/src/main/antlr4/imports/oracle/PLSQL.g4 | 53 ++++++++++++++++++++--
 .../src/main/resources/case/ddl/create-trigger.xml |  1 +
 .../resources/sql/supported/ddl/create-trigger.xml |  9 ++++
 3 files changed, 58 insertions(+), 5 deletions(-)

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 0e3cfbcdffd..637ab4ee0e9 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
@@ -57,7 +57,7 @@ createFunction
     ;
 
 createTrigger
-    : CREATE (OR REPLACE)? TRIGGER triggerName (BEFORE | AFTER | INSTEAD OF) 
dmlEventClause
+    : CREATE (OR REPLACE)? (EDITIONABLE | NONEDITIONABLE)? TRIGGER 
plsqlTriggerSource
     ;
 
 plsqlFunctionSource
@@ -92,6 +92,7 @@ statement
         | fetchStatement
         | ifStatment
         | returnStatement
+        | nullStatement
         ) SEMI_
     ;
 
@@ -119,6 +120,9 @@ returnStatement
     : RETURN expr
     ;
 
+nullStatement
+    : NULL
+    ;
 
 exceptionHandler
     : WHEN ((typeName (OR typeName)*)| OTHERS) THEN statement+
@@ -279,10 +283,49 @@ autonomousTransPragma
     : PRAGMA AUTONOMOUS_TRANSACTION SEMI_
     ;
 
-dmlEventClause
-    : dmlEventElement (OR dmlEventElement)* ON viewName
+plsqlTriggerSource
+    : (schemaName DOT_)? triggerName sharingClause? defaultCollationClause? 
(simpleDmlTrigger | systemTrigger)
     ;
 
-dmlEventElement
-    : (DELETE | INSERT | UPDATE) (OF LP_ columnName (COMMA_ columnName)* RP_)?
+simpleDmlTrigger
+    : (BEFORE | AFTER) dmlEventClause
+    ;
+
+dmlEventClause
+    : dmlEventTrigger (OR dmlEventTrigger)* ON viewName
+    ;
+
+dmlEventTrigger
+    : DELETE | INSERT | UPDATE (OF columnName (COMMA_ columnName)*)?
+    ;
+
+systemTrigger
+    : (BEFORE | AFTER | INSTEAD OF) (ddlEventTrigger (OR ddlEventTrigger)*) ON 
(PLUGGABLE? DATABASE) body
+    ;
+
+ddlEventTrigger
+    : ALTER
+    | ANALYZE
+    | ASSOCIATE STATISTICS
+    | AUDIT
+    | COMMENT
+    | CREATE
+    | DISASSOCIATE STATISTICS
+    | DROP
+    | GRANT
+    | NOAUDIT
+    | RENAME
+    | REVOKE
+    | TRUNCATE
+    | DDL
+    | STARTUP
+    | SHUTDOWN
+    | DB_ROLE_CHANGE
+    | LOGON
+    | LOGOFF
+    | SERVERERROR
+    | SUSPEND
+    | DATABASE
+    | SCHEMA
+    | FOLLOWS
     ;
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 9687772269b..3975106e08f 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
@@ -24,4 +24,5 @@
 <!--    <create-trigger sql-case-id="create_trigger_after_update" />-->
     <create-trigger sql-case-id="create_trigger_with_create_view" />
     <create-trigger sql-case-id="create_trigger_with_dml_event_clause" />
+    <create-trigger sql-case-id="create_trigger_with_body" />
 </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 2d174843570..44de7b32d33 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,13 @@
 
     <sql-case id="create_trigger_with_create_view" value="CREATE TRIGGER tr1 
BEFORE INSERT ON t1 FOR EACH ROW BEGIN create view v1 as select 1; END" 
db-types="MySQL" />
     <sql-case id="create_trigger_with_dml_event_clause" value="CREATE TRIGGER 
scott.emp_permit_changes BEFORE DELETE OR INSERT OR UPDATE ON scott.emp" 
db-types="Oracle" />
+    <sql-case id="create_trigger_with_body" value="CREATE TRIGGER log_errors
+        AFTER SERVERERROR ON DATABASE
+        BEGIN
+        IF (IS_SERVERERROR (1017)) THEN
+          NULL;
+        ELSE
+          NULL;
+        END IF;
+        END;" db-types="Oracle" />
 </sql-cases>

Reply via email to