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

   # 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 resumable_default_timeout
   AFTER SUSPEND
   ON DATABASE
   BEGIN
      DBMS_RESUMABLE.SET_TIMEOUT(10800);
   END;
   ```
   
   ```sql
   CREATE OR REPLACE TRIGGER resumable_default
   AFTER SUSPEND
   ON DATABASE
   DECLARE
      /* declare transaction in this trigger is autonomous */
      /* this is not required because transactions within a trigger
         are always autonomous */
      PRAGMA AUTONOMOUS_TRANSACTION;
      cur_sid           NUMBER;
      cur_inst          NUMBER;
      errno             NUMBER;
      err_type          VARCHAR2;
      object_owner      VARCHAR2;
      object_type       VARCHAR2;
      table_space_name  VARCHAR2;
      object_name       VARCHAR2;
      sub_object_name   VARCHAR2;
      error_txt         VARCHAR2;
      msg_body          VARCHAR2;
      ret_value         BOOLEAN;
      mail_conn         UTL_SMTP.CONNECTION;
   BEGIN
      -- Get session ID
      SELECT DISTINCT(SID) INTO cur_SID FROM V$MYSTAT;
   
      -- Get instance number
      cur_inst := userenv('instance');
   
      -- Get space error information
      ret_value := 
      DBMS_RESUMABLE.SPACE_ERROR_INFO(err_type,object_type,object_owner,
           table_space_name,object_name, sub_object_name);
      /*
      -- If the error is related to undo segments, log error, send email
      -- to DBA, and abort the statement. Otherwise, set timeout to 8 hours.
      -- 
      -- sys.rbs_error is a table which is to be
      -- created by a DBA manually and defined as
      -- (sql_text VARCHAR2(1000), error_msg VARCHAR2(4000),
      -- suspend_time DATE)
      */
   
      IF OBJECT_TYPE = 'UNDO SEGMENT' THEN
          /* LOG ERROR */
          INSERT INTO sys.rbs_error (
              SELECT SQL_TEXT, ERROR_MSG, SUSPEND_TIME
              FROM DBMS_RESUMABLE
              WHERE SESSION_ID = cur_sid AND INSTANCE_ID = cur_inst
           );
          SELECT ERROR_MSG INTO error_txt FROM DBMS_RESUMABLE 
              WHERE SESSION_ID = cur_sid and INSTANCE_ID = cur_inst;
   
           -- Send email to receipient through UTL_SMTP package
           msg_body:='Subject: Space Error Occurred
   
                      Space limit reached for undo segment ' || object_name || 
                      on ' || TO_CHAR(SYSDATE, 'Month dd, YYYY, HH:MIam') ||
                      '. Error message was ' || error_txt;
   
           mail_conn := UTL_SMTP.OPEN_CONNECTION('localhost', 25);
           UTL_SMTP.HELO(mail_conn, 'localhost');
           UTL_SMTP.MAIL(mail_conn, 'sender@localhost');
           UTL_SMTP.RCPT(mail_conn, 'recipient@localhost');
           UTL_SMTP.DATA(mail_conn, msg_body);
           UTL_SMTP.QUIT(mail_conn);
   
           -- Abort the statement
           DBMS_RESUMABLE.ABORT(cur_sid);
       ELSE
           -- Set timeout to 8 hours
           DBMS_RESUMABLE.SET_TIMEOUT(28800);
       END IF;
   
       /* commit autonomous transaction */
       COMMIT;   
   END;
   ```
   
   ```sql
   CREATE OR REPLACE TRIGGER t
     BEFORE
       INSERT OR
       UPDATE OF salary, department_id OR
       DELETE
     ON employees
   BEGIN
     CASE
       WHEN INSERTING THEN
         DBMS_OUTPUT.PUT_LINE('Inserting');
       WHEN UPDATING('salary') THEN
         DBMS_OUTPUT.PUT_LINE('Updating salary');
       WHEN UPDATING('department_id') THEN
         DBMS_OUTPUT.PUT_LINE('Updating department ID');
       WHEN DELETING THEN
         DBMS_OUTPUT.PUT_LINE('Deleting');
     END CASE;
   END;
   ```
   
   ```sql
   CREATE OR REPLACE TRIGGER validate_purchaseorder
      BEFORE INSERT ON purchaseorder
      FOR EACH ROW
   BEGIN
     IF (:new.OBJECT_VALUE IS NOT NULL) THEN :new.OBJECT_VALUE.schemavalidate();
     END IF;
   END;
   ```
   
   ```sql
   CREATE OR REPLACE TRIGGER set_empno_ctx_trig AFTER LOGON ON DATABASE
    BEGIN
     sec_mgr.set_empno_ctx_proc;
    EXCEPTION
     WHEN OTHERS THEN
           v_code := SQLCODE;
           v_errm := SUBSTR(SQLERRM, 1 , 64);
          -- Invoke another procedure,
          -- declared with PRAGMA AUTONOMOUS_TRANSACTION,
          -- to insert information about errors.
     INSERT INTO sec_mgr.errors VALUES (v_code, v_errm, SYSTIMESTAMP);
    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