- 13 Mar, 2023 1 commit
-
-
Dmitry Shulga authored
Follow-up patch that fixes issue with missing set up of versioning condition for query involving a versioning partitioned table.
-
- 06 Mar, 2023 1 commit
-
-
Dmitry Shulga authored
Fixed an issue with wrong instantiation of sp_instr_stmt on re-parsing an assignment statement caused by changes in metadata of tables/routines that a user variable depends on. On re-parsing the statement 'SET @var=val' neither a new sp_instr_stmt instruction nor a new intance of sp_lex_set_var should be created but current instances be used. Fixed a typo in the comment at the implementation of the method sp_lex_instr::parse_expr
-
- 27 Feb, 2023 2 commits
-
-
Dmitry Shulga authored
Fixed the test compat/oracle.sp-package
-
Dmitry Shulga authored
This patch fixes the issue with missing warnings generated on re-parsing a failing SP instruction's statement. That is, any warning generated on re-parsing a statement was discarded after SP instruction's a statement has been successfully re-parsed. The reason for discarding warnings after re-parsing is that the method THD::set_query_id() called every time when a failing SP instruction re-parsed. In result, Warning_info::m_warn_id != thd->query_id and when the method Diagnostics_area::opt_clear_warning_info(thd->query_id) is invoked from sp_head::execute all warnings accumulated during execution of the current SP instruction is cleared. So, to fix the issue invokes the method THD::set_query_id() once per SP instruction, on its first execution. Re-parsing of failing SP instruction and following run of it don't invoke the method THD::set_query_id().
-
- 21 Feb, 2023 2 commits
-
-
Dmitry Shulga authored
This patch is the second part of implementation for cursor's statement re-parsing. The patch does the following changes: - implements placing of items in SP instruction's free_list when a statement of failing SP instruction is re-parsed. New items are allocated on mem_root of SP instruction - on re-parsing a failed SP instruction that does need to get access to LEX a new lex is instantiated for every SP instruction except cursor relating SP instructions. - items created on re-parsing a cursor relating statement are moved to the free_list of sp_lex_cursor.
-
Dmitry Shulga authored
Added re-parsing of a failing cursor body. Re-parsing of a failing SP statement is implemented by the method validate_lex_and_exec_core(), therefore invocation of the method reset_lex_and_exec_core() inside sp_lex_keeper::cursor_reset_lex_and_exec_core was replaced by the method validate_lex_and_exec_core(). Re-parsing of a failed SP statement is relied upon interface provided by the class sp_lex_instr (the methods used for this goal are is_invalid(), parse_expr(), invalidate(), get_query(), get_expr_query()). To provide access to these methods on opening a cursor, the signature of the method sp_lex_keeper::cursor_reset_lex_and_exec_core was changed to accept a pointer to the class sp_lex_instr instead of the class sp_instr, and the new method get_push_instr() was added into the class sp_cursor. This method is to get access to an instance of the class sp_instr_cpush on opening a cursor (on handling the statement OPEN cursors_name). Default implementation of this method just returns NULL pointer of the type sp_instr_cpush. This method is overridden in the class sp_instr_cpush with trivial implementation { return this; } On handling the statement DECLARE CURSOR FOR the new instruction of the type sp_instr_cpush is added into sp_head. The class sp_instr_cpush holds a text of SELECT query referencing by a cursor declaration. When a cursor is being opened (on handling the statement 'OPEN cur_name') a pointer to sp_instr_cpush is returned by the method sp_cursor::get_push_instr() and this pointer is passed to the method sp_lex_keeper::cursor_reset_lex_and_exec_core in order to open a cursor and provide access to an interface required for SP statement re-parsing in case metadata changes took place. Since real access to a lex object is required on handling instruction sp_instr_cpush (an instance of this class is created during parsing of cursor declaration statement), calling of the method sp_cursor::open is moved from the method sp_instr_copen::exec_core into the method sp_instr_cpush::exec_core. Additionally, updated the methods get_query/get_expr_query in the classes sp_instr_cpush, sp_instr_cursor_copy_struct in order to return correct text of cursor's body taking into account that lexer treated the clause CURSOR FOR/ CURSOR IS as two different tokens following one after another. So, to return a correct text of SELECT statement specified in CURSOR declaration statement, the token FOR/IS should be skipped and text following it should be returned as a text of cursors's query.
-
- 06 Feb, 2023 5 commits
-
-
Dmitry Shulga authored
Follow-up patch that fixes existing mtr tests.
-
Dmitry Shulga authored
Introduced the new data member new_query_arena_is_set of the class sp_head. This data member is used as a protection against double invocation of the method restore_thd_mem_root that is called for restoration of the current query arena. Previously, the data member sp_head::m_thd is used for this goal but after support for recompilation of failed stored routine statement has been added the data member sp_head::m_thd can't be used for this goal. The reason is that on statement recompilation after the method restore_thd_mem_root() is called the method sp_head::add_instr() invoked to add a new instruction for just recompiled statement. The method sp_head::add_instr() de-references m_thd to access the free_list data member. If m_thd was used as a guard against double invocation it would result in a crash on dereferncing null pointer.
-
Dmitry Shulga authored
Fixed memory leakage taken place on execution of the statement SHOW CREATE PACKAGE pkg_name The memory leak was caused by implementation of sp_compile() where a mempory root for stored routine was allocated but a pointer to the new memory root wasn't passed to sp_package::create for subsequent forwarding to the constructor of sp_package. Instead, another one mempory root was allocated and the pointer to the original memroot was missed.
-
Dmitry Shulga authored
Re-designed a way by that Item_trigger_field objects is arranged in memory. Item_trigger_field objects created on parsing a trigger's statement is now stored in a per statement list. All lists of Item_trigger_field objects created on parsing the whole trigger's body are organized in the structure "list of lists". So, to iterate every Item_trigger_field object created on parsing a trigger body, it required to use binary cycle. To organize the list of lists structure the new data member Item_trigger_field::next_trig_field_list is introduced that links lists in this hierarchy structure. This re-design is performed in order to avoid refences to already deleted items on re-compilation of failed trigger's statememt. Referencing to already deleted item could take place on re-parsing a trigger's statement since every Item created for a statement being re-parsed is deleted before the statement is re-parsed, but deleted items are still referenced from sp_head. So, to avoid access to dangling references a per statement list of Item_trigger_field objects is cleared right after the current SP statement is cleaned-up and before re-parsing is started.
-
Dmitry Shulga authored
Added re-parsing of failed statements inside a stored routine. General idea of the patch is to install an instance of the class Reprepare_observer before executing a next SP instruction and re-parse a statement of this SP instruction in case of its execution failure. To implement the described approach the class sp_lex_keeper has been extended with the method validate_lex_and_exec_core() that is just a wrapper around the method reset_lex_and_exec_core() with additional setting/resetting an instance of the class Reprepare_observer on each iteration of SP instruction execution. If reset_lex_and_exec_core() returns error and an instance of the class Reprepare_observer is installed before running a SP instruction then a number of attempts to re-run the SP instruction is checked against a max. limit and in case it doesn't reach the limit a statement for the failed SP instruction is re-parsed. Re-parsing of a statement for the failed SP instruction is implemented by the new method sp_le_inst::parse_expr() that prepends a SP instruction's statement with the clause 'SELECT' and parse it. Own SP instruction MEM_ROOT and a separate free_list is used for parsing of a SP statement. On successful re-parsing of SP instruction's statement the virtual methods adjust_sql_command() and on_after_expr_parsing() of the class sp_lex_instr is called to update the SP instruction state with a new data created on parsing the statement. Few words about reason for prepending a SP instruction's statement with the clause 'SELECT' - this is required step to produce a valid SQL statement, since for some SP instructions the instructions statement is not a valid SQL statement. Wrapping such text into 'SELECT ( )' produces a correct operator from SQL syntax point of view.
-
- 22 Dec, 2022 1 commit
-
-
Dmitry Shulga authored
For those SP instructions that need to get access to LEX object on execution, added storing of their original sql expressions inside classes derived from the class sp_lex_instr. Stored sql expression is returned by the abstract method sp_lex_instr::get_expr_query redefined in derived classes. Since an expression constituting a SP instruction could be non valid SQL statement in general case (not parseable statement), the virtual method sp_lex_instr::get_query() has been introduced to return a valid string for a statement that corresponds to the given instruction. Additionally, introduced the rule remember_start_opt in the grammar. The new rule intended to get correct position of a current token taking into attention the fact whether lookahead was done or not.
-
- 20 Dec, 2022 5 commits
-
-
Dmitry Shulga authored
This is the prerequisite patch introducing the class sp_lex_instr that encapsulates access to an instance of the class sp_lex_keeper. Every SP instruction that need to get access to a LEX object on its processing should inherit this class and implement two abstract methods: is_invalid(), invalidate(). These methods will be used in subsequent patches to implement recompilation of SP instructions on failure. Currently, the following instructions are derived from the class sp_lex_instr: sp_instr_stmt, sp_instr_set, sp_instr_set_trigger_field, sp_instr_jump_if_not, sp_instr_freturn, sp_instr_cpush, sp_instr_cursor_copy_struct, sp_instr_set_case_expr Additionally, this patch converts the class sp_instr_opt_meta to base abstract class (that is, not inherited from the class sp_instr). Since this class originally was designed to provide a way for opimizer to update a destination address for jump SP-instructions, the only useful method at the interface of this class is set_destination and therefore inheritance from the class sp_instr is meaningless. Every jump SP instruction now must be inherited directly from the class sp_instr_opt_meta and additionally from either the class sp_lex_instr or sp_instr depending on whether this SP instruction need to get access to a LEX object or not. Moreover, the class sp_cursor doesn't own a data member of the class sp_lex_keeper any more. Instead, the virtual method get_lex_keeper() has been added to the class sp_cursor() that returns nullptr and this method is overridden in the derived class sp_instr_cpush to provide a pointer to a real instance of the class sp_lex_keeper. Doing this way we exclude duplication of a data member of the type sp_lex_keeper at the class sp_instr_cpush since it is derived both from sp_lex_instr and sp_cursor, and sp_lex_instr already encapsulates a data member of the class sp_lex_keeper.
-
Dmitry Shulga authored
This is the prerequisite patch to change a signature of the virtual method opt_move() in the base class sp_instr and its derived classes. The parameterized type of the instuctions list returned in the second argument is changed from sp_instr to sp_instr_opt_meta since only jump instructions are placed in this list on returning from the method call.
-
Dmitry Shulga authored
This is the prerequisite patch to move the data member LEX::trg_table_fields to the class sp_head and rename it as m_trg_table_fields. This data member is used for handling OLD/NEW pseudo-rows inside a trigger body and in order to be able to reparse a trigger body the data member must be moved from the struct LEX to the class sp_head.
-
Dmitry Shulga authored
This is the prerequisite patch to remove the data member sp_head::m_trg_table_fields and the method is_fields_updated_in_trigger that used it but is not called anywhere in the source code. The commit 5f1f2fc0 introduced the data member sp_head::m_trg_table_fields and the method Table_triggers_list::is_fields_updated_in_trigger that used this data member. The method Table_triggers_list::is_fields_updated_in_trigger() was invoked by the method partition_info::can_prune_insert() also introduced by the same commit 5f1f2fc0 But the method partition_info::can_prune_insert() is not called anywhere in the code. Later, the aforementioned methods were removed from the source code but the data member sp_head::m_trg_table_fields wasn't. So, remove the data member sp_head::m_trg_table_fields and declaration of the method is_fields_updated_in_trigger() for purpose of code cleaning up.
-
Dmitry Shulga authored
This is the prerequisite patch to move the sp_instr class and classes derived from it into the files sp_instr.cc/sp_instr.h. The classes sp_lex_cursor and sp_lex_keeper have been also moved to the files files sp_instr.cc/sp_instr.h. Additionally, * all occurrences of macroses NULL, FALSE, TRUE have been replaced with the corresponding C++ keywords nullptr, false, true. * the keyword 'override' has been added in and the keyword 'virtual' removed from signatures of every virtual method implemented in classes derived from the base class sp_instr. * trivial destructors like virtual ~sp_instr_stmt() {} have been removed for every class derived from the base class sp_instr since they are meaningless. * added the keyword 'final' into declaration of the class sp_lex_keeper since this class shouldn't have a derived class by design. * made the function cmp_rqp_locations as static since it is not called outside the file sp_instr.cc. * moved the function subst_spvars() into the file sp_instr.cc since this function is used only by the class sp_instr_stmt that is located in the file sp_instr.cc.
-
- 19 Dec, 2022 1 commit
-
-
Dmitry Shulga authored
This is the prerequisite patch to make interface of the class Reprepare_observer more like the one used by MySQL. This patch adds the method can_retry() to the class Reprepare_observer that returns true in case max. number of attempts to re-run a failing statement is not yet reached. To control a number of re-run attempts already done the data member m_attempt has been introduced. Doing this way, we encapsulate activity with incrementing a counter on every statement run and checking whether it reaches a limit or not inside implementation of the class Reprepare_observer instead duplicating such boiler plate code in every place where controlling for reaching a limit of max. number attempts for re-running failed statement is required.
-
- 16 Dec, 2022 7 commits
-
-
Marko Mäkelä authored
-
Marko Mäkelä authored
-
Marko Mäkelä authored
-
Marko Mäkelä authored
-
Marko Mäkelä authored
-
Marko Mäkelä authored
-
Marko Mäkelä authored
-
- 15 Dec, 2022 6 commits
-
-
Marko Mäkelä authored
commit_try_rebuild(): Only invoke trx_t::drop_table_statistics() if both InnoDB statistics tables are accessible (and exclusively locked by the current transaction). This avoids a crash due to ut_a(sym_node->table != NULL) in pars_retrieve_table_def(). The crash was repeated on a partial copy of a MariaDB 10.3 data directory that lacked the *.ibd files for the statistics tables.
-
Marko Mäkelä authored
-
Marko Mäkelä authored
fil_space_t::flush<false>(): If the CLOSING flag is set, the file may already have been closed, resulting in EBADF being returned by fdatasync(). In any case, the thread that had set the flag should take care of invoking os_file_flush_func(). The crash occurred during the execution of FLUSH TABLES...FOR EXPORT. Tested by: Matthias Leich
-
Daniel Black authored
-
Daniel Black authored
-
Daniel Black authored
-
- 14 Dec, 2022 9 commits
-
-
Daniel Black authored
-
Daniel Black authored
-
Daniel Black authored
-
Daniel Black authored
-
Daniel Black authored
-
Daniel Black authored
-
Daniel Black authored
-
Daniel Black authored
-
Daniel Black authored
-