diff options
author | Oleksandr Byelkin <sanja@mariadb.com> | 2018-04-18 19:34:12 +0200 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2019-03-12 13:10:48 +0100 |
commit | 83123412f00d9b69f1c5ea39b160d1d27be701a9 (patch) | |
tree | d9192c723230a21c504930504ebcb15bf78670a7 /sql/sql_prepare.cc | |
parent | 01c49e66b559d311725ff4c0d86592c3c9eaa58d (diff) | |
download | mariadb-git-83123412f00d9b69f1c5ea39b160d1d27be701a9.tar.gz |
MDEV-11975: SQLCOM_PREPARE of EXPLAIN & ANALYZE statement do not return correct metadata info
Added metadate info after prepare EXPLAIN/ANALYZE.
Diffstat (limited to 'sql/sql_prepare.cc')
-rw-r--r-- | sql/sql_prepare.cc | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 455d6b3cb86..89b7e490cb9 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -2475,8 +2475,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); } |