diff options
author | Sergei Petrunia <psergey@askmonty.org> | 2020-03-26 15:01:44 +0300 |
---|---|---|
committer | Sergei Petrunia <psergey@askmonty.org> | 2020-03-26 15:01:44 +0300 |
commit | af4b2ae8588bd51cc17e66cfc8210c3225992fbe (patch) | |
tree | 3e05f500883c00f15f111bcfa7c96c4f2cf0d300 /sql/select_handler.cc | |
parent | 1c8de231a3ea7ef2e08b1a5cfe17c37d733ea6ce (diff) | |
download | mariadb-git-af4b2ae8588bd51cc17e66cfc8210c3225992fbe.tar.gz |
MDEV-21887: federatedx crashes on SELECT ... INTO query in select_handler code
Backport to 10.4:
- Don't try to push down SELECTs that have a side effect
- In case the storage engine did support pushdown of SELECT with an INTO
clause, write the rows we've got from it into select->join->result,
and not thd->protocol. This way, SELECT ... INTO ... FROM
smart_engine_table will put the result into where instructed, and
NOT send it to the client.
Diffstat (limited to 'sql/select_handler.cc')
-rw-r--r-- | sql/select_handler.cc | 25 |
1 files changed, 4 insertions, 21 deletions
diff --git a/sql/select_handler.cc b/sql/select_handler.cc index b364cb12341..495b6d957b1 100644 --- a/sql/select_handler.cc +++ b/sql/select_handler.cc @@ -77,18 +77,17 @@ bool Pushdown_select::init() bool Pushdown_select::send_result_set_metadata() { - THD *thd= handler->thd; - Protocol *protocol= thd->protocol; DBUG_ENTER("Pushdown_select::send_result_set_metadata"); #ifdef WITH_WSREP + THD *thd= handler->thd; if (WSREP(thd) && thd->wsrep_retry_query) { WSREP_DEBUG("skipping select metadata"); DBUG_RETURN(false); } #endif /* WITH_WSREP */ - if (protocol->send_result_set_metadata(&result_columns, + if (select->join->result->send_result_set_metadata(result_columns, Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF)) DBUG_RETURN(true); @@ -100,23 +99,13 @@ bool Pushdown_select::send_result_set_metadata() bool Pushdown_select::send_data() { THD *thd= handler->thd; - Protocol *protocol= thd->protocol; DBUG_ENTER("Pushdown_select::send_data"); if (thd->killed == ABORT_QUERY) DBUG_RETURN(false); - protocol->prepare_for_resend(); - if (protocol->send_result_set_row(&result_columns)) - { - protocol->remove_last_row(); + if (select->join->result->send_data(result_columns)) DBUG_RETURN(true); - } - - thd->inc_sent_row_count(1); - - if (thd->vio_ok()) - DBUG_RETURN(protocol->write()); DBUG_RETURN(false); } @@ -124,16 +113,10 @@ bool Pushdown_select::send_data() bool Pushdown_select::send_eof() { - THD *thd= handler->thd; DBUG_ENTER("Pushdown_select::send_eof"); - /* - Don't send EOF if we're in error condition (which implies we've already - sent or are sending an error) - */ - if (thd->is_error()) + if (select->join->result->send_eof()) DBUG_RETURN(true); - ::my_eof(thd); DBUG_RETURN(false); } |