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>