summaryrefslogtreecommitdiff
path: root/sql/sp_head.cc
diff options
context:
space:
mode:
authorSergey Petrunya <psergey@askmonty.org>2013-10-01 17:49:03 +0400
committerSergey Petrunya <psergey@askmonty.org>2013-10-01 17:49:03 +0400
commit6519ca51dd8815dc1f2d88708e540bd4032cb45e (patch)
treed032f4a1bf5596172cfedbc41ca6ec7afdbe330c /sql/sp_head.cc
parente8eeb2e7f90dfa7d54a0146322cfba32731e4b34 (diff)
downloadmariadb-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.cc21
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);