diff options
author | Sergei Golubchik <serg@mariadb.org> | 2017-11-21 19:47:46 +0100 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2017-11-21 19:47:46 +0100 |
commit | 7f1900705b28a432a91595726f7d58e6d968cbd5 (patch) | |
tree | a24724ebc45941490e2970d87c495bc5f5cbb64b /sql/sp_head.cc | |
parent | 375caf99c494a4add7d48d5db3a3ec4b409a256e (diff) | |
parent | b54aeeb080aba2385204cdd09cba3eedbbf1b891 (diff) | |
download | mariadb-git-7f1900705b28a432a91595726f7d58e6d968cbd5.tar.gz |
Merge branch '10.1' into 10.2
Diffstat (limited to 'sql/sp_head.cc')
-rw-r--r-- | sql/sp_head.cc | 42 |
1 files changed, 23 insertions, 19 deletions
diff --git a/sql/sp_head.cc b/sql/sp_head.cc index 20c02fce752..7816af398c2 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -1144,6 +1144,19 @@ sp_head::execute(THD *thd, bool merge_da_on_success) if (check_stack_overrun(thd, 7 * STACK_MIN_SIZE, (uchar*)&old_packet)) DBUG_RETURN(TRUE); + /* + Normally the counter is not reset between parsing and first execution, + but it is possible in case of error to have parsing on one CALL and + first execution (where VIEW will be parsed and added). So we store the + counter after parsing and restore it before execution just to avoid + repeating SELECT numbers. + + Other problem is that it can be more SELECTs parsed in case of fixing + error causes previous interruption of the SP. So it is save not just + assign old value but add it. + */ + thd->select_number+= m_select_number; + /* init per-instruction memroot */ init_sql_alloc(&execute_mem_root, MEM_ROOT_BLOCK_SIZE, 0, MYF(0)); @@ -1477,6 +1490,16 @@ sp_head::execute(THD *thd, bool merge_da_on_success) m_recursion_level + 1)); m_first_instance->m_first_free_instance= this; + /* + This execution of the SP was aborted with an error (e.g. "Table not + found"). However it might still have consumed some numbers from the + thd->select_number counter. The next sp->exec() call must not use the + consumed numbers, so we remember the first free number (We know that + nobody will use it as this execution has stopped with an error). + */ + if (err_status) + set_select_number(thd->select_number); + DBUG_RETURN(err_status); } @@ -2109,26 +2132,7 @@ sp_head::execute_procedure(THD *thd, List<Item> *args) if (!err_status) { - /* - Normally the counter is not reset between parsing and first execution, - but it is possible in case of error to have parsing on one CALL and - first execution (where VIEW will be parsed and added). So we store the - counter after parsing and restore it before execution just to avoid - repeating SELECT numbers. - */ - thd->select_number= m_select_number; - err_status= execute(thd, TRUE); - DBUG_PRINT("info", ("execute returned %d", (int) err_status)); - /* - This execution of the SP was aborted with an error (e.g. "Table not - found"). However it might still have consumed some numbers from the - thd->select_number counter. The next sp->exec() call must not use the - consumed numbers, so we remember the first free number (We know that - nobody will use it as this execution has stopped with an error). - */ - if (err_status) - set_select_number(thd->select_number); } if (save_log_general) |