The crash happened because of a wrong reset_lex() .. restore_lex() sequence.
The Item in WHERE clause and the corresponding sp_instr_jump_if_not() were
erroneously created using different LEX.
This is a fix for "MDEV-10580 sql_mode=ORACLE: FOR loop statement"
The tokenizer now treats digits followed by two dots (e.g. '1..')
as an integer number '1' followed by DOT_DOT_SYM.
Previously this sequence was treated as a double number '1.' followed by '.'.
as this type of SHOW is only available in debug builds.
A bug in b7af3e704dd7800638ef677e9d921ad3e467a9a6.
All SHOW FUNCTION CODE queries should be in compat/oracle.sp-code.
Fixed that the ITERATE statement inside a FOR LOOP statement did not
increment the index variable before jumping to the beginning
of the loop, which caused the loop to repeat endlessly.
Adding methods:
- LEX::sp_while_loop_expression()
- LEX::sp_while_loop_finalize()
to reuse code between sql_yacc.yy and sql_yacc_ora.yy.
FOR loop will also reuse these methods.
Part 5: EXIT statement
Adding unconditional EXIT statement:
EXIT [ label ]
Conditional EXIT statements with WHERE clause
will be added in a separate patch.
Moving similar code from sql_yacc.yy and sql_yacc_ora.yy to methods:
LEX::maybe_start_compound_statement()
LEX::sp_push_loop_label()
LEX::sp_push_loop_empty_label()
LEX::sp_pop_loop_label()
LEX::sp_pop_loop_empty_label()
The EXIT statement will also reuse this code.
Moving the code from *.yy to methods:
LEX::sp_change_context()
LEX::sp_leave_statement()
LEX::sp_iterate_statement()
to reuse the same code between LEAVE and ITERATE statements.
EXIT statement will also reuse the same code.
When processing an SP body:
CREATE PROCEDURE p1 (parameters)
AS [ declarations ]
BEGIN statements
[ EXCEPTION exceptions ]
END;
the parser generates two "jump" instructions:
- from the end of "declarations" to the beginning of EXCEPTION
- from the end of EXCEPTION to "statements"
These jumps are useless if EXCEPTION does not exist.
This patch makes sure that these two "jump" instructions are
generated only if EXCEPTION really exists.
- Part 9: EXCEPTION handlers
The top-most stored routine blocks now support EXCEPTION clause
in its correct place:
AS [ declarations ]
BEGIN statements
[ EXCEPTION exceptions ]
END
Inner block will be done in a separate commit.
- Part 14: IN OUT instead of INOUT (in SP parameter declarations)
Part 13: RETURN vs RETURNS in function definition:
CREATE FUNCTION f1(a INT) RETURN INT ...
Part 12: No parentheses if no arguments:
CREATE FUNCTION f1 RETURN INT ...
Part 12: No parentheses if no arguments
Now "CREATE PROCEDURE p1 AS" is supported with no parentheses after the name.
Note, "CREATE FUNCTION f1 AS" is not supported yet, due to grammar conflict
with UDFs. Functions will be done in a separate patch.
Part 9: EXCEPTION handlers
- Adding exception handler syntax:
WHEN exception_name THEN statement
- Adding EXCEPTION section intoi the top BEGIN..END SP block.
Note, currently EXCEPTION goes in the beginning of the top BEGIN..END
SP block.
TODO:
- add EXCEPTION section into inner blocks
- move EXCEPTION to the end of the block
1. Adding const qualifiers into a few method parameters.
2. Adding methods:
- sp_label::block_label_declare()
- LEX::sp_block_init()
- LEX::sp_block_finalize()
to share more code between the files sql_yacc.yy and sql_yacc_ora.yy,
as well as between the rules sp_labeled_block, sp_unlabeled_block,
sp_unlabeled_block_not_atomic.
3. sql_yacc.yy, sql_yacc_ora.yy changes:
- Removing sp_block_content
- Reorganizing the grammar so the rules sp_labeled_block,
sp_unlabeled_block, sp_unlabeled_block_not_atomic now
contain both BEGIN_SYM and END keywords. Previously,
BEGIN_SYM and END resided in different rules.
This change makes the grammar easier to read,
as well as simplifies adding Oracle-style DECLARE section (coming soon):
DECLARE
..
BEGIN
..
END;
Good side effects:
- SP block related grammar does not use Lex->name any more.
- The "splabel" member was removed from %union
In the affected test chunk in sp.test, sql_mode is set to 0xFFFFFFFF,
which includes ORACLE, therefore an additional "AS" keyword is required:
CREATE PROCEDURE p1() AS BEGIN END;
- Adding a new grammar file sql_yacc_ora.yy, which is currently
almost a full copy of sql_yacc.yy.
Note, it's now assumed that sql_yacc.yy and sql_yacc_ora.yy
use the same set of %token directives and exactly the same
%union directive.
These declarations should eventually be moved into a shared
included file, to make sure that sql_yacc.h and sql_yacc_ora.h
are compatible.
- Removing the "-p MYSQL" flag from cmake/bison.cmake, using
the %name-prefix directive inside sql_yacc.yy and sql_yacc_ora.yy instead
- Adding other CMake related changes to build sql_yacc_ora.o
form sql_yacc_ora.yy
- Adding NUMBER(M,N) as a synonym to DECIMAL(M,N) as the first
Oracle compatibility syntax understood in sql_mode=ORACLE.
- Adding prototypes to functions add_virtual_expression()
and handle_sql2003_note184_exception(), so they can be used
in both sql_yacc.yy and sql_yacc_ora.yy.
- Adding a new test suite compat/oracle, with the first test "type_number".
Use this:
./mtr compat/oracle.type_number # to run a single test
./mtr --suite=compat/oracle # to run the entire new suite
- Adding compat/oracle into the list of default suites,
so BuildBot can run it automatically on pushes.
debug build with older cmake.
The constant is implicitely defined by VS when chosen C runtime is Debug
(/MTd, MDd).
CMake does not define it since https://public.kitware.com/Bug/view.php?id=15777
was fixed.
We remove it from compile flags, to be able to build Debug with /MT runtime
using older cmakes.