summaryrefslogtreecommitdiff
path: root/sql/sql_derived.cc
diff options
context:
space:
mode:
authorIgor Babaev <igor@askmonty.org>2019-02-09 22:54:26 -0800
committerIgor Babaev <igor@askmonty.org>2019-02-09 22:54:26 -0800
commitd11be23933def394585fae83a6f1ab561e3736f2 (patch)
tree867a809df45931d5c6ad00424c327cd47aae9392 /sql/sql_derived.cc
parent3f9040085a0de4976f55bc7e4a2fa5fa8d923100 (diff)
downloadmariadb-git-d11be23933def394585fae83a6f1ab561e3736f2.tar.gz
MDEV-17096 Pushdown of simple derived tables to storage engines
Resolved the problem of forming a proper query string for FEDERATEDX. Added test cases. Cleanup of extra spaces.
Diffstat (limited to 'sql/sql_derived.cc')
-rw-r--r--sql/sql_derived.cc34
1 files changed, 25 insertions, 9 deletions
diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc
index 9ad22dde9c6..564049e59e1 100644
--- a/sql/sql_derived.cc
+++ b/sql/sql_derived.cc
@@ -385,7 +385,7 @@ bool mysql_derived_merge(THD *thd, LEX *lex, TABLE_LIST *derived)
DBUG_RETURN(FALSE);
}
- if ((derived->dt_handler= derived->find_derived_handler(thd)))
+ if (derived->dt_handler)
{
derived->change_refs_to_fields();
derived->set_materialized_derived();
@@ -820,6 +820,24 @@ bool mysql_derived_prepare(THD *thd, LEX *lex, TABLE_LIST *derived)
if (derived->is_derived() && derived->is_merged_derived())
first_select->mark_as_belong_to_derived(derived);
+ derived->dt_handler= derived->find_derived_handler(thd);
+ if (derived->dt_handler)
+ {
+ char query_buff[4096];
+ String derived_query(query_buff, sizeof(query_buff), thd->charset());
+ derived_query.length(0);
+ derived->derived->print(&derived_query,
+ enum_query_type(QT_VIEW_INTERNAL |
+ QT_ITEM_ORIGINAL_FUNC_NULLIF |
+ QT_PARSABLE));
+ if (!thd->make_lex_string(&derived->derived_spec,
+ derived_query.ptr(), derived_query.length()))
+ {
+ delete derived->dt_handler;
+ derived->dt_handler= NULL;
+ }
+ }
+
exit:
/* Hide "Unknown column" or "Unknown function" error */
if (derived->view)
@@ -912,19 +930,17 @@ bool mysql_derived_optimize(THD *thd, LEX *lex, TABLE_LIST *derived)
DBUG_RETURN(FALSE);
}
- if (derived->is_materialized_derived() && !derived->dt_handler)
- derived->dt_handler= derived->find_derived_handler(thd);
- if (derived->dt_handler)
+ if (derived->is_materialized_derived() && derived->dt_handler)
{
if (!(derived->pushdown_derived=
new (thd->mem_root) Pushdown_derived(derived, derived->dt_handler)))
{
delete derived->dt_handler;
- derived->dt_handler= NULL;
- DBUG_RETURN(1);
+ derived->dt_handler= NULL;
+ DBUG_RETURN(TRUE);
}
- }
-
+ }
+
lex->current_select= first_select;
if (unit->is_unit_op())
@@ -1136,7 +1152,7 @@ bool mysql_derived_fill(THD *thd, LEX *lex, TABLE_LIST *derived)
if (unit->executed)
DBUG_RETURN(FALSE);
res= derived->pushdown_derived->execute();
- unit->executed= true;
+ unit->executed= true;
delete derived->pushdown_derived;
DBUG_RETURN(res);
}