mirror of
https://github.com/MariaDB/server.git
synced 2025-11-09 11:41:36 +03:00
Anonymous block is represented internally by the class sp_head, so every statement inside an anonymous block is a SP instruction. On the other hand, the anonymous block specified in the FROM clause of the PREPARE statement is treated as a single statement. In result, all parameter markers (represented by the character ?) are parts of the anonymous block specified in the prepared statement and at the same time parameter are markers, internally represented by instances of the class Item_param and distributed among SP instructions representing SQL statements (every SQL statement is represented by an instance of the class sp_instr_stmt) In case table metadata changed on running an anonymous block in prepared statement mode, only SP instruction's statement is re-parsed. Before re-parsing a SP's statement, all items are cleaned up including instances of the class Item_param that represent positional parameters. Unfortunately, this leads to presence of a dangling pointer in Prepared_statement::param_array that references to the deleted Item_param while invoking reset_stmt_params happening on every execution of a prepared statement. To fix the issue, no instances of Item_param created on re-parsings a statement for failed SP instruction, rather instances of Item_param left from first time parsing are re-used. As a consequence, all pointers to instances of the class Item_param stored in the array Prepared_statememt::param_array and possibly spread along the code base (e.g. select_lex->limit_params.select_limit) still point to valid Items.
40 KiB
40 KiB