FlyingZC opened a new issue, #27069:
URL: https://github.com/apache/shardingsphere/issues/27069

   # Background
   Hi community,
   This issue is for #26878.
   
   ShardingSphere parser engine helps users parse a SQL to get the AST 
(Abstract Syntax Tree) and visit this tree to get SQLStatement (Java Object). 
Currently, we are planning to enhance the support for Oracle SQL parsing in 
ShardingSphere.
   
   More details:
   
https://shardingsphere.apache.org/document/current/en/reference/sharding/parse/
   
   # Task
   This issue is to support more oracle sql parse, as follows:
   ```sql
   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;
   ```
   
   ```sql
   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;
   ```
   
   ```sql
   CREATE OR REPLACE TRIGGER dept_del_cascade
     AFTER DELETE ON dept
     FOR EACH ROW
   
     -- Before row is deleted from dept,
     -- delete all rows from emp table whose DEPTNO is same as
     -- DEPTNO being deleted from dept table:
   
   BEGIN
     DELETE FROM emp
     WHERE emp.Deptno = :OLD.Deptno;
   END;
   ```
   
   ```sql
   CREATE OR REPLACE TRIGGER dept_cascade2
     AFTER DELETE OR UPDATE OF Deptno ON dept
     FOR EACH ROW
   
     -- For each department number in dept that is updated,
     -- cascade update to dependent foreign keys in emp table.
     -- Cascade update only if child row was not updated by this trigger:
   BEGIN
     IF UPDATING THEN
       UPDATE emp
       SET Deptno = :NEW.Deptno,
           Update_id = Integritypackage.Updateseq   --from 1st
       WHERE emp.Deptno = :OLD.Deptno
       AND Update_id IS NULL;
   
       /* Only NULL if not updated by 3rd trigger
          fired by same triggering statement */
     END IF;
     IF DELETING THEN
       -- After row is deleted from dept,
       -- delete all rows from emp table whose DEPTNO is same as
       -- DEPTNO being deleted from dept table:
       DELETE FROM emp
       WHERE emp.Deptno = :OLD.Deptno;
     END IF;
   END;
   ```
   
   ```sql
   CREATE OR REPLACE TRIGGER dept_restrict
     BEFORE DELETE OR UPDATE OF Deptno ON dept
     FOR EACH ROW
   
     -- Before row is deleted from dept or primary key (DEPTNO) of dept is 
updated,
     -- check for dependent foreign key values in emp;
     -- if any are found, roll back.
   
   DECLARE
     Dummy                  INTEGER;  -- Use for cursor fetch
     Employees_present      EXCEPTION;
     employees_not_present  EXCEPTION;
   
     -- Cursor used to check for dependent foreign key values.
     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 dependent foreign key is found, raise user-specified
     -- error code and message. If not found, close cursor
     -- before allowing triggering statement to complete.
   
     IF Dummy_cursor%FOUND THEN
       RAISE Employees_present;     -- Dependent rows exist
     ELSE
       RAISE Employees_not_present; -- No dependent rows exist
     END IF;
     CLOSE Dummy_cursor;
   
   EXCEPTION
     WHEN Employees_present THEN
       CLOSE Dummy_cursor;
       Raise_application_error(-20001, 'Employees Present in'
         || ' Department ' || TO_CHAR(:OLD.DEPTNO));
     WHEN Employees_not_present THEN
       CLOSE Dummy_cursor;
   END;
   ```
   
   # Process
   1. First confirm that this is a correct oracle sql syntax, if not please 
ignore;
   2. Compare SQL definitions in Oficial SQL Doc and ShardingSphere SQL Doc;
   3. If there is any difference in ShardingSphere SQL Doc, please correct them 
by referring to the Official SQL Doc;
   4. Run mvn install the current_file_module;
   5. Check whether there are any exceptions. If indeed, please fix them. 
(Especially xxxVisitor.class);
   6. Add new corresponding SQL case in SQL Cases and expected parsed result in 
Expected Statment XML;
   7. Run SQLParserParameterizedTest to make sure no exceptions.
   
   # Relevant Skills
   1. Master JAVA language
   2. Have a basic understanding of Antlr `g4` file
   3. Be familiar with Oracle SQLs


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: 
[email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to