diff options
author | Sergey Petrunya <psergey@askmonty.org> | 2013-10-01 17:49:03 +0400 |
---|---|---|
committer | Sergey Petrunya <psergey@askmonty.org> | 2013-10-01 17:49:03 +0400 |
commit | 6519ca51dd8815dc1f2d88708e540bd4032cb45e (patch) | |
tree | d032f4a1bf5596172cfedbc41ca6ec7afdbe330c /sql/sp_head.cc | |
parent | e8eeb2e7f90dfa7d54a0146322cfba32731e4b34 (diff) | |
download | mariadb-git-6519ca51dd8815dc1f2d88708e540bd4032cb45e.tar.gz |
EXPLAIN UPDATE/DELETE
- Make EXPLAIN UPDATE/DELETE work inside SPs
- Return correct error code from mysql_delete()
- EXPLAIN <multi-DELETE> will create a multi_delete object (as it
affects the optimization). select_result will be only used for
producing EXPLAIN output.
Diffstat (limited to 'sql/sp_head.cc')
-rw-r--r-- | sql/sp_head.cc | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/sql/sp_head.cc b/sql/sp_head.cc index 0e69956e951..a3027763b8a 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -313,14 +313,26 @@ sp_get_flags_for_command(LEX *lex) flags= sp_head::HAS_COMMIT_OR_ROLLBACK; break; case SQLCOM_DELETE: + case SQLCOM_DELETE_MULTI: { - if (lex->select_lex.item_list.is_empty()) + /* + DELETE normally doesn't return resultset, but there are two exceptions: + - DELETE ... RETURNING + - EXPLAIN DELETE ... + */ + if (lex->select_lex.item_list.is_empty() && !lex->describe) + flags= 0; + else + flags= sp_head::MULTI_RESULTS; + break; + } + case SQLCOM_UPDATE: + case SQLCOM_UPDATE_MULTI: + { + if (!lex->describe) flags= 0; else - { - /* This is DELETE ... RETURNING ... */ flags= sp_head::MULTI_RESULTS; - } break; } default: @@ -2988,7 +3000,6 @@ sp_lex_keeper::reset_lex_and_exec_core(THD *thd, uint *nextp, } reinit_stmt_before_use(thd, m_lex); - // not here, but inside every instr: create_qpf_query(m_lex); if (open_tables) res= instr->exec_open_and_lock_tables(thd, m_lex->query_tables); |