Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-16244

sql_mode=ORACLE: Some keywords do not work in variable declarations

Details

    Description

      In Oracle, all these keywords can be used for SP variables (in declarations and as INTO targets):

      • DO
      • HANDLER
      • REPAIR
      • SHUTDOWN
      • TRUNCATE
      • CLOSE
      • COMMIT
      • OPEN
      • ROLLBACK
      • SAVEPOINT
      • CONTAINS
      • LANGUAGE
      • NO
      • CHARSET
      • FOLLOWS
      • PRECEDES

      In MariaDB this script:

      SET sql_mode=ORACLE;
      DELIMITER /
       
      DECLARE
        do INT;
      BEGIN
        SELECT do INTO do FROM DUAL;
      END;
      /
       
      DECLARE
        handler INT;
      BEGIN
        SELECT handler INTO handler FROM DUAL;
      END;
      /
       
      DECLARE
        repair INT;
      BEGIN
        SELECT repair INTO repair FROM DUAL;
      END;
      /
       
      DECLARE
        shutdown INT;
      BEGIN
        SELECT shutdown INTO shutdown FROM DUAL;
      END;
      /
       
      DECLARE
        truncate INT;
      BEGIN
        SELECT truncate INTO truncate FROM DUAL;
      END;
      /
       
      DECLARE
        close INT;
      BEGIN
        SELECT close INTO close FROM DUAL;
      END;
      /
       
      DECLARE
        commit INT;
      BEGIN
        SELECT commit INTO commit FROM DUAL;
      END;
      /
       
      DECLARE
        open INT;
      BEGIN
        SELECT open INTO open FROM DUAL;
      END;
      /
       
      DECLARE
        rollback INT;
      BEGIN
        SELECT rollback INTO rollback FROM DUAL;
      END;
      /
       
      DECLARE
        savepoint INT;
      BEGIN
        SELECT savepoint INTO savepoint FROM DUAL;
      END;
      /
       
      DECLARE
        contains INT;
      BEGIN
        SELECT contains INTO contains FROM DUAL;
      END;
      /
       
      DECLARE
        language INT;
      BEGIN
        SELECT language INTO language FROM DUAL;
      END;
      /
       
      DECLARE
        no INT;
      BEGIN
        SELECT no INTO no FROM DUAL;
      END;
      /
       
      DECLARE
        charset INT;
      BEGIN
        SELECT charset INTO charset FROM DUAL;
      END;
      /
      DECLARE
        follows INT;
      BEGIN
        SELECT follows INTO follows FROM DUAL;
      END;
      /
       
      DECLARE
        precedes INT;
      BEGIN
        SELECT precedes INTO precedes FROM DUAL;
      END;
      /
      

      returns an error:

      ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'do INT;
      BEGIN
        SELECT do INTO do FROM DUAL;
      END' at line 2
      

      In Oracle the same script (without SET sql_mode and DELIMITER commands) works without errors.

      Attachments

        Issue Links

          Activity

            bar Alexander Barkov created issue -
            bar Alexander Barkov made changes -
            Field Original Value New Value
            Description In Oracle, all these keywords can be used for SP variables (both declarations and assignments):
            - DO
            - HANDLER
            - REPAIR
            - SHUTDOWN
            - TRUNCATE

            {code:sql}
            DECLARE
              DO INT;
            BEGIN
              DO :=10;
            END;
            /
            {code}

            {code:sql}
            DECLARE
              HANDLER INT;
            BEGIN
              HANDLER :=10;
            END;
            /
            {code}

            {code:sql}
            DECLARE
              REPAIR INT;
            BEGIN
              REPAIR :=10;
            END;
            /
            {code}

            {code:sql}
            DECLARE
              SHUTDOWN INT;
            BEGIN
              SHUTDOWN :=10;
            END;
            /
            {code}

            {code:sql}
            DECLARE
              TRUNCATE INT;
            BEGIN
              TRUNCATE :=10;
            END;
            /
            {code}



            Additionally, these keywords are allowed non-quoted in declarations, not allowed non-quoted in assignments, allowed quoted in assignments:
            - CLOSE
            - COMMIT
            - OPEN
            - ROLLBACK
            - SAVEPOINT


            {code:sql}
            DECLARE
              CLOSE INT;
            BEGIN
              "CLOSE":=10;
            END;
            /
            {code}


            {code:sql}
            DECLARE
              COMMIT INT;
            BEGIN
              "COMMIT":=10;
            END;
            /
            {code}


            {code:sql}
            DECLARE
              OPEN INT;
            BEGIN
              "OPEN":=10;
            END;
            /
            {code}


            {code:sql}
            DECLARE
              ROLLBACK INT;
            BEGIN
              "ROLLBACK":=10;
            END;
            /
            {code}

            {code:sql}
            DECLARE
              SAVEPOINT INT;
            BEGIN
              "SAVEPOINT":=10;
            END;
            /
            {code}

            MariaDB does not allow to use these keywords in declarations/assignments when running in sql_mode=ORACLE. It should be fixed to be compatible.

            In Oracle, all these keywords can be used for SP variables (in declarations and as INTO targets):
            - DO
            - HANDLER
            - REPAIR
            - SHUTDOWN
            - TRUNCATE
            - CLOSE
            - COMMIT
            - OPEN
            - ROLLBACK
            - SAVEPOINT
            - CONTAINS
            - LANGUAGE
            - NO
            - CHARSET
            - FOLLOWS
            - PRECEDES

            In MariaDB this script:
            {code:sql}
            SET sql_mode=ORACLE;
            DELIMITER /

            DECLARE
              do INT;
            BEGIN
              SELECT do INTO do FROM DUAL;
            END;
            /

            DECLARE
              handler INT;
            BEGIN
              SELECT handler INTO handler FROM DUAL;
            END;
            /

            DECLARE
              repair INT;
            BEGIN
              SELECT repair INTO repair FROM DUAL;
            END;
            /

            DECLARE
              shutdown INT;
            BEGIN
              SELECT shutdown INTO shutdown FROM DUAL;
            END;
            /

            DECLARE
              truncate INT;
            BEGIN
              SELECT truncate INTO truncate FROM DUAL;
            END;
            /

            DECLARE
              close INT;
            BEGIN
              SELECT close INTO close FROM DUAL;
            END;
            /

            DECLARE
              commit INT;
            BEGIN
              SELECT commit INTO commit FROM DUAL;
            END;
            /

            DECLARE
              open INT;
            BEGIN
              SELECT open INTO open FROM DUAL;
            END;
            /

            DECLARE
              rollback INT;
            BEGIN
              SELECT rollback INTO rollback FROM DUAL;
            END;
            /

            DECLARE
              savepoint INT;
            BEGIN
              SELECT savepoint INTO savepoint FROM DUAL;
            END;
            /

            DECLARE
              contains INT;
            BEGIN
              SELECT contains INTO contains FROM DUAL;
            END;
            /

            DECLARE
              language INT;
            BEGIN
              SELECT language INTO language FROM DUAL;
            END;
            /

            DECLARE
              no INT;
            BEGIN
              SELECT no INTO no FROM DUAL;
            END;
            /

            DECLARE
              charset INT;
            BEGIN
              SELECT charset INTO charset FROM DUAL;
            END;
            /
            DECLARE
              follows INT;
            BEGIN
              SELECT follows INTO follows FROM DUAL;
            END;
            /

            DECLARE
              precedes INT;
            BEGIN
              SELECT precedes INTO precedes FROM DUAL;
            END;
            /
            {code}

            returns an error:
            {noformat}
            ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'do INT;
            BEGIN
              SELECT do INTO do FROM DUAL;
            END' at line 2
            {noformat}
            In Oracle the same script (without SET sql_mode and DELIMITER commands) works without errors.

            Also, In Oracle, these keywords can be used in SP assignments:
            - DO
            - HANDLER
            - REPAIR
            - SHUTDOWN
            - TRUNCATE

            {code:sql}
            DECLARE
              DO INT;
            BEGIN
              DO :=10;
            END;
            /
            {code}

            {code:sql}
            DECLARE
              HANDLER INT;
            BEGIN
              HANDLER :=10;
            END;
            /
            {code}

            {code:sql}
            DECLARE
              REPAIR INT;
            BEGIN
              REPAIR :=10;
            END;
            /
            {code}

            {code:sql}
            DECLARE
              SHUTDOWN INT;
            BEGIN
              SHUTDOWN :=10;
            END;
            /
            {code}

            {code:sql}
            DECLARE
              TRUNCATE INT;
            BEGIN
              TRUNCATE :=10;
            END;
            /
            {code}
            In MariaDB the same script returns a syntax error.

            MariaDB should be fixed to be more compatible.

            bar Alexander Barkov made changes -
            Description In Oracle, all these keywords can be used for SP variables (in declarations and as INTO targets):
            - DO
            - HANDLER
            - REPAIR
            - SHUTDOWN
            - TRUNCATE
            - CLOSE
            - COMMIT
            - OPEN
            - ROLLBACK
            - SAVEPOINT
            - CONTAINS
            - LANGUAGE
            - NO
            - CHARSET
            - FOLLOWS
            - PRECEDES

            In MariaDB this script:
            {code:sql}
            SET sql_mode=ORACLE;
            DELIMITER /

            DECLARE
              do INT;
            BEGIN
              SELECT do INTO do FROM DUAL;
            END;
            /

            DECLARE
              handler INT;
            BEGIN
              SELECT handler INTO handler FROM DUAL;
            END;
            /

            DECLARE
              repair INT;
            BEGIN
              SELECT repair INTO repair FROM DUAL;
            END;
            /

            DECLARE
              shutdown INT;
            BEGIN
              SELECT shutdown INTO shutdown FROM DUAL;
            END;
            /

            DECLARE
              truncate INT;
            BEGIN
              SELECT truncate INTO truncate FROM DUAL;
            END;
            /

            DECLARE
              close INT;
            BEGIN
              SELECT close INTO close FROM DUAL;
            END;
            /

            DECLARE
              commit INT;
            BEGIN
              SELECT commit INTO commit FROM DUAL;
            END;
            /

            DECLARE
              open INT;
            BEGIN
              SELECT open INTO open FROM DUAL;
            END;
            /

            DECLARE
              rollback INT;
            BEGIN
              SELECT rollback INTO rollback FROM DUAL;
            END;
            /

            DECLARE
              savepoint INT;
            BEGIN
              SELECT savepoint INTO savepoint FROM DUAL;
            END;
            /

            DECLARE
              contains INT;
            BEGIN
              SELECT contains INTO contains FROM DUAL;
            END;
            /

            DECLARE
              language INT;
            BEGIN
              SELECT language INTO language FROM DUAL;
            END;
            /

            DECLARE
              no INT;
            BEGIN
              SELECT no INTO no FROM DUAL;
            END;
            /

            DECLARE
              charset INT;
            BEGIN
              SELECT charset INTO charset FROM DUAL;
            END;
            /
            DECLARE
              follows INT;
            BEGIN
              SELECT follows INTO follows FROM DUAL;
            END;
            /

            DECLARE
              precedes INT;
            BEGIN
              SELECT precedes INTO precedes FROM DUAL;
            END;
            /
            {code}

            returns an error:
            {noformat}
            ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'do INT;
            BEGIN
              SELECT do INTO do FROM DUAL;
            END' at line 2
            {noformat}
            In Oracle the same script (without SET sql_mode and DELIMITER commands) works without errors.

            Also, In Oracle, these keywords can be used in SP assignments:
            - DO
            - HANDLER
            - REPAIR
            - SHUTDOWN
            - TRUNCATE

            {code:sql}
            DECLARE
              DO INT;
            BEGIN
              DO :=10;
            END;
            /
            {code}

            {code:sql}
            DECLARE
              HANDLER INT;
            BEGIN
              HANDLER :=10;
            END;
            /
            {code}

            {code:sql}
            DECLARE
              REPAIR INT;
            BEGIN
              REPAIR :=10;
            END;
            /
            {code}

            {code:sql}
            DECLARE
              SHUTDOWN INT;
            BEGIN
              SHUTDOWN :=10;
            END;
            /
            {code}

            {code:sql}
            DECLARE
              TRUNCATE INT;
            BEGIN
              TRUNCATE :=10;
            END;
            /
            {code}
            In MariaDB the same script returns a syntax error.

            MariaDB should be fixed to be more compatible.

            In Oracle, all these keywords can be used for SP variables (in declarations and as INTO targets):
            - DO
            - HANDLER
            - REPAIR
            - SHUTDOWN
            - TRUNCATE
            - CLOSE
            - COMMIT
            - OPEN
            - ROLLBACK
            - SAVEPOINT
            - CONTAINS
            - LANGUAGE
            - NO
            - CHARSET
            - FOLLOWS
            - PRECEDES

            In MariaDB this script:
            {code:sql}
            SET sql_mode=ORACLE;
            DELIMITER /

            DECLARE
              do INT;
            BEGIN
              SELECT do INTO do FROM DUAL;
            END;
            /

            DECLARE
              handler INT;
            BEGIN
              SELECT handler INTO handler FROM DUAL;
            END;
            /

            DECLARE
              repair INT;
            BEGIN
              SELECT repair INTO repair FROM DUAL;
            END;
            /

            DECLARE
              shutdown INT;
            BEGIN
              SELECT shutdown INTO shutdown FROM DUAL;
            END;
            /

            DECLARE
              truncate INT;
            BEGIN
              SELECT truncate INTO truncate FROM DUAL;
            END;
            /

            DECLARE
              close INT;
            BEGIN
              SELECT close INTO close FROM DUAL;
            END;
            /

            DECLARE
              commit INT;
            BEGIN
              SELECT commit INTO commit FROM DUAL;
            END;
            /

            DECLARE
              open INT;
            BEGIN
              SELECT open INTO open FROM DUAL;
            END;
            /

            DECLARE
              rollback INT;
            BEGIN
              SELECT rollback INTO rollback FROM DUAL;
            END;
            /

            DECLARE
              savepoint INT;
            BEGIN
              SELECT savepoint INTO savepoint FROM DUAL;
            END;
            /

            DECLARE
              contains INT;
            BEGIN
              SELECT contains INTO contains FROM DUAL;
            END;
            /

            DECLARE
              language INT;
            BEGIN
              SELECT language INTO language FROM DUAL;
            END;
            /

            DECLARE
              no INT;
            BEGIN
              SELECT no INTO no FROM DUAL;
            END;
            /

            DECLARE
              charset INT;
            BEGIN
              SELECT charset INTO charset FROM DUAL;
            END;
            /
            DECLARE
              follows INT;
            BEGIN
              SELECT follows INTO follows FROM DUAL;
            END;
            /

            DECLARE
              precedes INT;
            BEGIN
              SELECT precedes INTO precedes FROM DUAL;
            END;
            /
            {code}

            returns an error:
            {noformat}
            ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'do INT;
            BEGIN
              SELECT do INTO do FROM DUAL;
            END' at line 2
            {noformat}
            In Oracle the same script (without SET sql_mode and DELIMITER commands) works without errors.

            bar Alexander Barkov made changes -
            Comment [ Some more keywords that work in Oracle both in declarations and assignments:
            {code:sql}
            DECLARE
              CONTAINS INT;
            BEGIN
              CONTAINS:=10;
            END;
            /
            {code}

            {code:sql}
            DECLARE
              LANGUAGE INT;
            BEGIN
              LANGUAGE:=10;
            END;
            /
            {code}

            {code:sql}
            DECLARE
              NO INT;
            BEGIN
              NO:=10;
            END;
            /
            {code}

            {code:sql}
            DECLARE
              CHARSET INT;
            BEGIN
              CHARSET:=10;
            END;
            /
            {code}

            {code:sql}
            DECLARE
              FOLLOWS INT;
            BEGIN
              FOLLOWS:=10;
            END;
            /
            {code}

            {code:sql}
            DECLARE
              PRECEDES INT;
            BEGIN
              PRECEDES:=10;
            END;
            /
            {code}
            ]
            bar Alexander Barkov made changes -
            issue.field.resolutiondate 2018-05-23 08:19:54.0 2018-05-23 08:19:54.514
            bar Alexander Barkov made changes -
            Fix Version/s 10.3.7 [ 23005 ]
            Fix Version/s 10.3 [ 22126 ]
            Resolution Fixed [ 1 ]
            Status Open [ 1 ] Closed [ 6 ]
            bar Alexander Barkov made changes -
            bar Alexander Barkov made changes -
            bar Alexander Barkov made changes -
            serg Sergei Golubchik made changes -
            Fix Version/s 10.3.8 [ 23113 ]
            Fix Version/s 10.3.7 [ 23005 ]
            marko Marko Mäkelä made changes -
            serg Sergei Golubchik made changes -
            Workflow MariaDB v3 [ 87385 ] MariaDB v4 [ 154401 ]

            People

              bar Alexander Barkov
              bar Alexander Barkov
              Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Git Integration

                  Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.