From 6cd24d124ff1fdc484abc60932fedc1e2d3adac1 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Sat, 17 Sep 2016 08:14:07 +0400 Subject: [PATCH] MDEV-10411 Providing compatibility for basic PL/SQL constructs Part 15: ELSIF vs ELSEIF Also, moving tests for Oracle keywords in sql_mode=DEFAULT from "parser.test" to a better place "keywords.test". --- mysql-test/r/keywords.result | 15 +++++++++++++++ mysql-test/suite/compat/oracle/r/sp.result | 14 ++++++++++++++ mysql-test/suite/compat/oracle/t/sp.test | 16 ++++++++++++++++ mysql-test/t/keywords.test | 21 +++++++++++++++++++++ sql/lex.h | 1 + sql/sql_yacc.yy | 2 ++ sql/sql_yacc_ora.yy | 3 ++- 7 files changed, 71 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/keywords.result b/mysql-test/r/keywords.result index 8c510b712ceab..7031adcca8f5a 100644 --- a/mysql-test/r/keywords.result +++ b/mysql-test/r/keywords.result @@ -331,3 +331,18 @@ DROP TABLE OTHERS; # CREATE TABLE immediate (immediate int); DROP TABLE immediate; +# +# MDEV-10142 Pluggable parser +# Testing keywords that were added into lex.h for Oracle compatibility +# that are not reserved keywords in MariaDB +# +CREATE TABLE clob (clob int); +DROP TABLE clob; +CREATE TABLE elsif (elsif INT); +DROP TABLE elsif; +CREATE TABLE exception (exception INT); +DROP TABLE exception; +CREATE TABLE raw (raw int); +DROP TABLE raw; +CREATE TABLE varchar2 (varchar2 int); +DROP TABLE varchar2; diff --git a/mysql-test/suite/compat/oracle/r/sp.result b/mysql-test/suite/compat/oracle/r/sp.result index 0d3c21eee77c9..b003693659512 100644 --- a/mysql-test/suite/compat/oracle/r/sp.result +++ b/mysql-test/suite/compat/oracle/r/sp.result @@ -326,6 +326,20 @@ CREATE TABLE begin (begin INT); DROP TABLE begin; CREATE TABLE end (end INT); DROP TABLE end; +# Testing ELSIF +CREATE FUNCTION f1(a INT) RETURN CLOB +AS +BEGIN +IF a=1 THEN RETURN 'a is 1'; +ELSIF a=2 THEN RETURN 'a is 2'; +ELSE RETURN 'a is unknown'; +END IF; +END; +/ +SELECT f1(2) FROM DUAL; +f1(2) +a is 2 +DROP FUNCTION f1; # Testing top-level declarations CREATE PROCEDURE p1 (p1 OUT VARCHAR2(10)) AS diff --git a/mysql-test/suite/compat/oracle/t/sp.test b/mysql-test/suite/compat/oracle/t/sp.test index 4c4f2d4fe3bec..403cecdebd590 100644 --- a/mysql-test/suite/compat/oracle/t/sp.test +++ b/mysql-test/suite/compat/oracle/t/sp.test @@ -342,6 +342,22 @@ DROP TABLE begin; CREATE TABLE end (end INT); DROP TABLE end; +--echo # Testing ELSIF +DELIMITER /; +CREATE FUNCTION f1(a INT) RETURN CLOB +AS +BEGIN + IF a=1 THEN RETURN 'a is 1'; + ELSIF a=2 THEN RETURN 'a is 2'; + ELSE RETURN 'a is unknown'; + END IF; +END; +/ +DELIMITER ;/ +SELECT f1(2) FROM DUAL; +DROP FUNCTION f1; + + --echo # Testing top-level declarations DELIMITER /; diff --git a/mysql-test/t/keywords.test b/mysql-test/t/keywords.test index 5c4c813ab399d..b0b85539ee76b 100644 --- a/mysql-test/t/keywords.test +++ b/mysql-test/t/keywords.test @@ -220,3 +220,24 @@ DROP TABLE OTHERS; CREATE TABLE immediate (immediate int); DROP TABLE immediate; + +--echo # +--echo # MDEV-10142 Pluggable parser +--echo # Testing keywords that were added into lex.h for Oracle compatibility +--echo # that are not reserved keywords in MariaDB +--echo # + +CREATE TABLE clob (clob int); +DROP TABLE clob; + +CREATE TABLE elsif (elsif INT); +DROP TABLE elsif; + +CREATE TABLE exception (exception INT); +DROP TABLE exception; + +CREATE TABLE raw (raw int); +DROP TABLE raw; + +CREATE TABLE varchar2 (varchar2 int); +DROP TABLE varchar2; diff --git a/sql/lex.h b/sql/lex.h index b1259eab42bdb..d258c9bac5b24 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -203,6 +203,7 @@ static SYMBOL symbols[] = { { "EACH", SYM(EACH_SYM)}, { "ELSE", SYM(ELSE)}, { "ELSEIF", SYM(ELSEIF_SYM)}, + { "ELSIF", SYM(ELSIF_SYM)}, { "ENABLE", SYM(ENABLE_SYM)}, { "ENCLOSED", SYM(ENCLOSED)}, { "END", SYM(END)}, diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 2ded66ac33ad9..35b713c32e7cb 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1068,6 +1068,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); %token EACH_SYM /* SQL-2003-R */ %token ELSE /* SQL-2003-R */ %token ELSEIF_SYM +%token ELSIF_SYM /* Oracle, reserved in PL/SQL*/ %token ENABLE_SYM %token ENCLOSED %token END /* SQL-2003-R */ @@ -14340,6 +14341,7 @@ keyword_sp: | DUMPFILE {} | DUPLICATE_SYM {} | DYNAMIC_SYM {} + | ELSIF_SYM {} | ENDS_SYM {} | ENUM {} | ENGINE_SYM {} diff --git a/sql/sql_yacc_ora.yy b/sql/sql_yacc_ora.yy index a863db6ae383d..6345b5c657315 100644 --- a/sql/sql_yacc_ora.yy +++ b/sql/sql_yacc_ora.yy @@ -442,6 +442,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); %token EACH_SYM /* SQL-2003-R */ %token ELSE /* SQL-2003-R */ %token ELSEIF_SYM +%token ELSIF_SYM /* Oracle, reserved in PL/SQL*/ %token ENABLE_SYM %token ENCLOSED %token END /* SQL-2003-R */ @@ -3131,7 +3132,7 @@ sp_if: sp_elseifs: /* Empty */ - | ELSEIF_SYM sp_if + | ELSIF_SYM sp_if | ELSE sp_proc_stmts1 ;