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 44663fe43c2 Enhanced support for Oracle SQL parsing. (#30729)
44663fe43c2 is described below
commit 44663fe43c21225cbfeedd831d3f2535a8af3735
Author: 啊哈 <[email protected]>
AuthorDate: Tue Apr 2 13:59:25 2024 +0800
Enhanced support for Oracle SQL parsing. (#30729)
* Enhance support for some Oracle SQL parsing.
* Add some new Oracle SQL parsing test cases.
* Fixed some code formatting issues and errors.
---------
Co-authored-by: Desheng Zhang <[email protected]>
---
.../oracle/src/main/antlr4/imports/oracle/PLSQL.g4 | 7 +++-
.../src/main/resources/case/ddl/create-trigger.xml | 5 +++
.../resources/sql/supported/ddl/create-trigger.xml | 41 ++++++----------------
3 files changed, 21 insertions(+), 32 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 ed9b25989a6..f58dd3f23b4 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
@@ -94,6 +94,7 @@ statement
| forallStatement
| gotoStatement
| ifStatement
+ | modifyingStatement
| nullStatement
| openStatement
| openForStatement
@@ -216,6 +217,8 @@ iterationCtlSeq
: qualIterationCtl (COMMA_ qualIterationCtl)*
;
+modifyingExpression: INSERTING | DELETING | UPDATING;
+
qualIterationCtl
: REVERSE? iterationCcontrol predClauseSeq
;
@@ -314,6 +317,8 @@ ifStatement
END IF SEMI_
;
+modifyingStatement: IF modifyingExpression THEN statement+ (ELSIF
modifyingExpression THEN statement+)* (ELSE statement+)? END IF SEMI_;
+
nullStatement
: NULL SEMI_
;
@@ -582,7 +587,7 @@ dmlEventClause
;
dmlEventElement
- : (DELETE | INSERT | UPDATE) (OF LP_ columnName (COMMA_ columnName)* RP_)?
+ : (DELETE | INSERT | UPDATE) (OF LP_? columnName (COMMA_ columnName)*
RP_?)?
;
systemTrigger
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 5ca32c2a1c3..563d503f8ac 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
@@ -27,4 +27,9 @@
<create-trigger sql-case-id="create_trigger_with_body" />
<create-trigger
sql-case-id="create_trigger_with_execute_immediate_statement" />
<create-trigger sql-case-id="create_trigger_with_assignment_statement" />
+ <create-trigger sql-case-id="create_trigger_with_logon" />
+ <create-trigger sql-case-id="create_trigger_with_cascade_1" />
+ <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" />
</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 aafdd9e562a..58f6b4ccf8d 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
@@ -17,37 +17,16 @@
-->
<sql-cases>
- <sql-case id="create_trigger" value="CREATE TRIGGER reminder1
- ON Sales.Customer
- AFTER INSERT, UPDATE
- AS INSERT INTO SalesPersonQuotaHistory VALUES(t1, 100)"
db-types="SQLServer" />
- <sql-case id="create_trigger_with_database_scoped" value="CREATE TRIGGER
ddl_trig_database
- ON ALL SERVER
- AFTER INSERT
- AS
- SELECT EVENTDATA()" db-types="SQLServer" />
-
+ <sql-case id="create_trigger" value="CREATE TRIGGER reminder1 ON
Sales.Customer AFTER INSERT, UPDATE AS INSERT INTO SalesPersonQuotaHistory
VALUES(t1, 100)" db-types="SQLServer" />
+ <sql-case id="create_trigger_with_database_scoped" value="CREATE TRIGGER
ddl_trig_database ON ALL SERVER AFTER INSERT AS SELECT EVENTDATA()"
db-types="SQLServer" />
<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 BEGIN
IF (IS_SERVERERROR (1017)) THEN NULL; ELSE NULL; END IF; END;"
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-case id="create_trigger_with_execute_immediate_statement"
value="CREATE TRIGGER adg_logon_sync_trigger
- AFTER LOGON ON user.schema
- begin
- if (SYS_CONTEXT('USERENV', 'DATABASE_ROLE') IN ('PHYSICAL
STANDBY')) then
- execute immediate 'alter session sync with primary';
- end if;
- end;" db-types="Oracle" />
- <sql-case id="create_trigger_with_assignment_statement" value="CREATE
TRIGGER Contacts_BI
- BEFORE INSERT ON Contacts FOR EACH ROW
- BEGIN
- :NEW.ID := Contacts_Seq.NEXTVAL;
- END;" 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-case id="create_trigger_with_execute_immediate_statement"
value="CREATE TRIGGER adg_logon_sync_trigger AFTER LOGON ON user.schema begin
if (SYS_CONTEXT('USERENV', 'DATABASE_ROLE') IN ('PHYSICAL STANDBY')) then
execute immediate 'alter session sync with primary'; end if; end;"
db-types="Oracle" />
+ <sql-case id="create_trigger_with_assignment_statement" value="CREATE
TRIGGER Contacts_BI BEFORE INSERT ON Contacts FOR EACH ROW BEGIN :NEW.ID :=
Contacts_Seq.NEXTVAL; END;" db-types="Oracle" />
+ <sql-case id="create_trigger_with_logon" value="CREATE OR REPLACE TRIGGER
check_user AFTER LOGON ON DATABASE BEGIN check_user; EXCEPTION WHEN OTHERS THEN
RAISE_APPLICATION_ERROR (-20000, 'Unexpected error: '||
DBMS_Utility.Format_Error_Stack); END;" db-types="Oracle" />
+ <sql-case id="create_trigger_with_cascade_1" value="CREATE OR REPLACE
TRIGGER dept_cascade3 AFTER UPDATE OF Deptno ON dept BEGIN UPDATE emp SET
Update_id = NULL WHERE Update_id = Integritypackage.Updateseq; END;"
db-types="Oracle" />
+ <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-cases>