summaryrefslogtreecommitdiff
path: root/sql/sql_prepare.cc
diff options
context:
space:
mode:
authorOleksandr Byelkin <sanja@mariadb.com>2018-04-18 19:34:12 +0200
committerOleksandr Byelkin <sanja@mariadb.com>2018-04-20 14:40:14 +0200
commit331034cb6e1552e1ab7c12b6f7341f557f76b807 (patch)
tree6d251e2db3b714c4021f8d99a7c96ebcafc7eb9b /sql/sql_prepare.cc
parentcff60be7fe159fdcb2517ce8441610ad512aa7d0 (diff)
downloadmariadb-git-bb-10.3-MDEV-11975.tar.gz
MDEV-11975: SQLCOM_PREPARE of EXPLAIN & ANALYZE statement do not return correct metadata infobb-10.3-MDEV-11975
Added metadate info after prepare EXPLAIN/ANALYZE.
Diffstat (limited to 'sql/sql_prepare.cc')
-rw-r--r--sql/sql_prepare.cc24
1 files changed, 22 insertions, 2 deletions
diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc
index 24f3cc66c6b..e37c2006cc6 100644
--- a/sql/sql_prepare.cc
+++ b/sql/sql_prepare.cc
@@ -2500,8 +2500,28 @@ static bool check_prepared_statement(Prepared_statement *stmt)
break;
}
if (res == 0)
- DBUG_RETURN(stmt->is_sql_prepare() ?
- FALSE : (send_prep_stmt(stmt, 0) || thd->protocol->flush()));
+ {
+ if (!stmt->is_sql_prepare())
+ {
+ if (lex->describe || lex->analyze_stmt)
+ {
+ if (!lex->result &&
+ !(lex->result= new (stmt->mem_root) select_send(thd)))
+ DBUG_RETURN(TRUE);
+ List<Item> field_list;
+ thd->prepare_explain_fields(lex->result, &field_list,
+ lex->describe, lex->analyze_stmt);
+ res= send_prep_stmt(stmt, lex->result->field_count(field_list)) ||
+ lex->result->send_result_set_metadata(field_list,
+ Protocol::SEND_EOF);
+ }
+ else
+ res= send_prep_stmt(stmt, 0);
+ if (!res)
+ thd->protocol->flush();
+ }
+ DBUG_RETURN(FALSE);
+ }
error:
DBUG_RETURN(TRUE);
}