mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
improving of fields list creation in derived tables and unions
fixed length of fields created in fubselect fixed resolving fields of reduced in derived table subselect mysql-test/r/subselect.result: test of created with subselect fields mysql-test/t/subselect.test: test of created with subselect fields sql/item.cc: fixed length of fields created in fubselect fixed resolving fields of reduced in derived table subselect sql/item_subselect.cc: improving of fields list creation in derived tables and unions sql/mysql_priv.h: improving of fields list creation in derived tables and unions sql/sql_derived.cc: improving of fields list creation in derived tables and unions sql/sql_lex.h: improving of fields list creation in derived tables and unions sql/sql_parse.cc: improving of fields list creation in derived tables and unions sql/sql_prepare.cc: improving of fields list creation in derived tables and unions sql/sql_select.cc: improving of fields list creation in derived tables and unions sql/sql_select.h: improving of fields list creation in derived tables and unions sql/sql_union.cc: improving of fields list creation in derived tables and unions sql/sql_update.cc: improving of fields list creation in derived tables and unions
This commit is contained in:
@@ -951,3 +951,37 @@ select * from t1;
|
|||||||
mot topic date pseudo
|
mot topic date pseudo
|
||||||
joce 1 0000-00-00 joce
|
joce 1 0000-00-00 joce
|
||||||
drop table t1, t2, t3;
|
drop table t1, t2, t3;
|
||||||
|
SELECT * FROM (SELECT 1 as a,(SELECT a)) a;
|
||||||
|
a (SELECT a)
|
||||||
|
1 1
|
||||||
|
CREATE TABLE t1 SELECT * FROM (SELECT 1 as a,(SELECT 1)) a;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` bigint(1) NOT NULL default '0',
|
||||||
|
`(SELECT 1)` bigint(1) NOT NULL default '0'
|
||||||
|
) TYPE=MyISAM CHARSET=latin1
|
||||||
|
drop table t1;
|
||||||
|
CREATE TABLE t1 SELECT * FROM (SELECT 1 as a,(SELECT a)) a;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` bigint(1) NOT NULL default '0',
|
||||||
|
`(SELECT a)` bigint(1) NOT NULL default '0'
|
||||||
|
) TYPE=MyISAM CHARSET=latin1
|
||||||
|
drop table t1;
|
||||||
|
CREATE TABLE t1 SELECT * FROM (SELECT 1 as a,(SELECT a+0)) a;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` bigint(1) NOT NULL default '0',
|
||||||
|
`(SELECT a+0)` bigint(17) NOT NULL default '0'
|
||||||
|
) TYPE=MyISAM CHARSET=latin1
|
||||||
|
drop table t1;
|
||||||
|
CREATE TABLE t1 SELECT (SELECT 1 as a UNION SELECT 1+1 limit 1,1) as a;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` bigint(17) NOT NULL default '0'
|
||||||
|
) TYPE=MyISAM CHARSET=latin1
|
||||||
|
drop table t1;
|
||||||
|
@@ -558,4 +558,18 @@ DELETE FROM t1 WHERE topic IN (SELECT DISTINCT topic FROM t2 WHERE NOT
|
|||||||
EXISTS(SELECT * FROM t3 WHERE numeropost=topic));
|
EXISTS(SELECT * FROM t3 WHERE numeropost=topic));
|
||||||
select * from t1;
|
select * from t1;
|
||||||
|
|
||||||
drop table t1, t2, t3;
|
drop table t1, t2, t3;
|
||||||
|
|
||||||
|
SELECT * FROM (SELECT 1 as a,(SELECT a)) a;
|
||||||
|
CREATE TABLE t1 SELECT * FROM (SELECT 1 as a,(SELECT 1)) a;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
drop table t1;
|
||||||
|
CREATE TABLE t1 SELECT * FROM (SELECT 1 as a,(SELECT a)) a;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
drop table t1;
|
||||||
|
CREATE TABLE t1 SELECT * FROM (SELECT 1 as a,(SELECT a+0)) a;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
drop table t1;
|
||||||
|
CREATE TABLE t1 SELECT (SELECT 1 as a UNION SELECT 1+1 limit 1,1) as a;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
drop table t1;
|
||||||
|
10
sql/item.cc
10
sql/item.cc
@@ -633,7 +633,8 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
|
|||||||
uint counter= 0;
|
uint counter= 0;
|
||||||
// Prevent using outer fields in subselects, that is not supported now
|
// Prevent using outer fields in subselects, that is not supported now
|
||||||
SELECT_LEX *cursel=(SELECT_LEX *) thd->lex.current_select;
|
SELECT_LEX *cursel=(SELECT_LEX *) thd->lex.current_select;
|
||||||
if (cursel->master_unit()->first_select()->linkage != DERIVED_TABLE_TYPE)
|
if (outer_resolving ||
|
||||||
|
cursel->master_unit()->first_select()->linkage != DERIVED_TABLE_TYPE)
|
||||||
for (SELECT_LEX *sl=(outer_resolving?cursel:cursel->outer_select());
|
for (SELECT_LEX *sl=(outer_resolving?cursel:cursel->outer_select());
|
||||||
sl;
|
sl;
|
||||||
sl= sl->outer_select())
|
sl= sl->outer_select())
|
||||||
@@ -1184,10 +1185,6 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference)
|
|||||||
}
|
}
|
||||||
ref= thd->lex.current_select->ref_pointer_array + counter-1;
|
ref= thd->lex.current_select->ref_pointer_array + counter-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
max_length= (*ref)->max_length;
|
|
||||||
maybe_null= (*ref)->maybe_null;
|
|
||||||
decimals= (*ref)->decimals;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((*ref)->with_sum_func &&
|
if (((*ref)->with_sum_func &&
|
||||||
@@ -1202,6 +1199,9 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference)
|
|||||||
"forward reference in item list"));
|
"forward reference in item list"));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
max_length= (*ref)->max_length;
|
||||||
|
maybe_null= (*ref)->maybe_null;
|
||||||
|
decimals= (*ref)->decimals;
|
||||||
fixed= 1;
|
fixed= 1;
|
||||||
if (ref && (*ref)->check_cols(1))
|
if (ref && (*ref)->check_cols(1))
|
||||||
return 1;
|
return 1;
|
||||||
|
@@ -161,7 +161,7 @@ void Item_singlerow_subselect::select_transformer(THD *thd,
|
|||||||
select_lex->item_list.elements == 1 &&
|
select_lex->item_list.elements == 1 &&
|
||||||
// TODO: mark subselect items from item list separately
|
// TODO: mark subselect items from item list separately
|
||||||
!(select_lex->item_list.head()->type() == FIELD_ITEM ||
|
!(select_lex->item_list.head()->type() == FIELD_ITEM ||
|
||||||
select_lex->item_list.head()->type() == REF_ITEM)
|
select_lex->item_list.head()->type() == REF_ITEM)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -693,7 +693,7 @@ int subselect_single_select_engine::prepare()
|
|||||||
(ORDER*) select_lex->group_list.first,
|
(ORDER*) select_lex->group_list.first,
|
||||||
select_lex->having,
|
select_lex->having,
|
||||||
(ORDER*) 0, select_lex,
|
(ORDER*) 0, select_lex,
|
||||||
select_lex->master_unit(), 0))
|
select_lex->master_unit(), 0, 0))
|
||||||
return 1;
|
return 1;
|
||||||
thd->lex.current_select= save_select;
|
thd->lex.current_select= save_select;
|
||||||
return 0;
|
return 0;
|
||||||
@@ -701,7 +701,7 @@ int subselect_single_select_engine::prepare()
|
|||||||
|
|
||||||
int subselect_union_engine::prepare()
|
int subselect_union_engine::prepare()
|
||||||
{
|
{
|
||||||
return unit->prepare(thd, result);
|
return unit->prepare(thd, result, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Item_result set_row(SELECT_LEX *select_lex, Item * item,
|
static Item_result set_row(SELECT_LEX *select_lex, Item * item,
|
||||||
|
@@ -403,7 +403,8 @@ int mysql_select(THD *thd, Item ***rref_pointer_array,
|
|||||||
COND *conds, uint og_num, ORDER *order, ORDER *group,
|
COND *conds, uint og_num, ORDER *order, ORDER *group,
|
||||||
Item *having, ORDER *proc_param, ulong select_type,
|
Item *having, ORDER *proc_param, ulong select_type,
|
||||||
select_result *result, SELECT_LEX_UNIT *unit,
|
select_result *result, SELECT_LEX_UNIT *unit,
|
||||||
SELECT_LEX *select_lex, bool fake_select_lex);
|
SELECT_LEX *select_lex, bool fake_select_lex,
|
||||||
|
bool tables_OK);
|
||||||
void free_ulderlayed_joins(THD *thd, SELECT_LEX *select);
|
void free_ulderlayed_joins(THD *thd, SELECT_LEX *select);
|
||||||
void fix_tables_pointers(SELECT_LEX *select_lex);
|
void fix_tables_pointers(SELECT_LEX *select_lex);
|
||||||
void fix_tables_pointers(SELECT_LEX_UNIT *select_lex);
|
void fix_tables_pointers(SELECT_LEX_UNIT *select_lex);
|
||||||
@@ -411,7 +412,8 @@ int mysql_explain_union(THD *thd, SELECT_LEX_UNIT *unit,
|
|||||||
select_result *result);
|
select_result *result);
|
||||||
int mysql_explain_select(THD *thd, SELECT_LEX *sl, char const *type,
|
int mysql_explain_select(THD *thd, SELECT_LEX *sl, char const *type,
|
||||||
select_result *result);
|
select_result *result);
|
||||||
int mysql_union(THD *thd, LEX *lex,select_result *result,SELECT_LEX_UNIT *unit);
|
int mysql_union(THD *thd, LEX *lex, select_result *result,
|
||||||
|
SELECT_LEX_UNIT *unit, bool tables_OK);
|
||||||
int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *s, TABLE_LIST *t);
|
int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *s, TABLE_LIST *t);
|
||||||
Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
|
Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
|
||||||
Item_result_field ***copy_func, Field **from_field,
|
Item_result_field ***copy_func, Field **from_field,
|
||||||
|
@@ -106,17 +106,22 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t)
|
|||||||
fix_tables_pointers(unit);
|
fix_tables_pointers(unit);
|
||||||
}
|
}
|
||||||
|
|
||||||
Item *item;
|
|
||||||
List_iterator<Item> it(sl->item_list);
|
|
||||||
|
|
||||||
while ((item= it++))
|
|
||||||
item_list.push_back(item);
|
|
||||||
|
|
||||||
|
|
||||||
lex->current_select= sl;
|
lex->current_select= sl;
|
||||||
TABLE_LIST *first_table= (TABLE_LIST*) sl->table_list.first;
|
TABLE_LIST *first_table= (TABLE_LIST*) sl->table_list.first;
|
||||||
if (setup_wild(thd, first_table, item_list, 0, sl->with_wild) ||
|
if (setup_tables(first_table) ||
|
||||||
setup_fields(thd, 0, first_table, item_list, 0, 0, 1))
|
setup_wild(thd, first_table, sl->item_list, 0, sl->with_wild))
|
||||||
|
{
|
||||||
|
res= -1;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
item_list= sl->item_list;
|
||||||
|
sl->with_wild= 0;
|
||||||
|
if (setup_ref_array(thd, &sl->ref_pointer_array,
|
||||||
|
(item_list.elements + sl->with_sum_func +
|
||||||
|
sl->order_list.elements + sl->group_list.elements)) ||
|
||||||
|
setup_fields(thd, sl->ref_pointer_array, first_table, item_list,
|
||||||
|
0, 0, 1))
|
||||||
{
|
{
|
||||||
res= -1;
|
res= -1;
|
||||||
goto exit;
|
goto exit;
|
||||||
@@ -145,7 +150,7 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t)
|
|||||||
sl->options&= ~OPTION_FOUND_ROWS;
|
sl->options&= ~OPTION_FOUND_ROWS;
|
||||||
|
|
||||||
if (is_union)
|
if (is_union)
|
||||||
res= mysql_union(thd, lex, derived_result, unit);
|
res= mysql_union(thd, lex, derived_result, unit, 1);
|
||||||
else
|
else
|
||||||
res= mysql_select(thd, &sl->ref_pointer_array,
|
res= mysql_select(thd, &sl->ref_pointer_array,
|
||||||
(TABLE_LIST*) sl->table_list.first,
|
(TABLE_LIST*) sl->table_list.first,
|
||||||
@@ -156,7 +161,7 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t)
|
|||||||
(ORDER *) sl->group_list.first,
|
(ORDER *) sl->group_list.first,
|
||||||
sl->having, (ORDER*) NULL,
|
sl->having, (ORDER*) NULL,
|
||||||
sl->options | thd->options | SELECT_NO_UNLOCK,
|
sl->options | thd->options | SELECT_NO_UNLOCK,
|
||||||
derived_result, unit, sl, 0);
|
derived_result, unit, sl, 0, 1);
|
||||||
|
|
||||||
if (!res)
|
if (!res)
|
||||||
{
|
{
|
||||||
|
@@ -312,7 +312,7 @@ public:
|
|||||||
void exclude_level();
|
void exclude_level();
|
||||||
|
|
||||||
/* UNION methods */
|
/* UNION methods */
|
||||||
int prepare(THD *thd, select_result *result);
|
int prepare(THD *thd, select_result *result, bool tables_OK);
|
||||||
int exec();
|
int exec();
|
||||||
int cleanup();
|
int cleanup();
|
||||||
|
|
||||||
|
@@ -2387,7 +2387,7 @@ mysql_execute_command(THD *thd)
|
|||||||
(ORDER *)NULL,
|
(ORDER *)NULL,
|
||||||
select_lex->options | thd->options |
|
select_lex->options | thd->options |
|
||||||
SELECT_NO_JOIN_CACHE,
|
SELECT_NO_JOIN_CACHE,
|
||||||
result, unit, select_lex, 0);
|
result, unit, select_lex, 0, 0);
|
||||||
if (thd->net.report_error)
|
if (thd->net.report_error)
|
||||||
res= -1;
|
res= -1;
|
||||||
delete result;
|
delete result;
|
||||||
|
@@ -568,7 +568,7 @@ static bool mysql_test_select_fields(PREP_STMT *stmt, TABLE_LIST *tables,
|
|||||||
|
|
||||||
if (join->prepare(&select_lex->ref_pointer_array, tables,
|
if (join->prepare(&select_lex->ref_pointer_array, tables,
|
||||||
wild_num, conds, og_num, order, group, having, proc,
|
wild_num, conds, og_num, order, group, having, proc,
|
||||||
select_lex, unit, 0))
|
select_lex, unit, 0, 0))
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -169,7 +169,7 @@ int handle_select(THD *thd, LEX *lex, select_result *result)
|
|||||||
register SELECT_LEX *select_lex = &lex->select_lex;
|
register SELECT_LEX *select_lex = &lex->select_lex;
|
||||||
fix_tables_pointers(lex->all_selects_list);
|
fix_tables_pointers(lex->all_selects_list);
|
||||||
if (select_lex->next_select())
|
if (select_lex->next_select())
|
||||||
res=mysql_union(thd,lex,result,&lex->unit);
|
res=mysql_union(thd, lex, result, &lex->unit, 0);
|
||||||
else
|
else
|
||||||
res= mysql_select(thd, &select_lex->ref_pointer_array,
|
res= mysql_select(thd, &select_lex->ref_pointer_array,
|
||||||
(TABLE_LIST*) select_lex->table_list.first,
|
(TABLE_LIST*) select_lex->table_list.first,
|
||||||
@@ -182,7 +182,7 @@ int handle_select(THD *thd, LEX *lex, select_result *result)
|
|||||||
select_lex->having,
|
select_lex->having,
|
||||||
(ORDER*) lex->proc_list.first,
|
(ORDER*) lex->proc_list.first,
|
||||||
select_lex->options | thd->options,
|
select_lex->options | thd->options,
|
||||||
result, &(lex->unit), &(lex->select_lex), 0);
|
result, &(lex->unit), &(lex->select_lex), 0, 0);
|
||||||
if (res && result)
|
if (res && result)
|
||||||
result->abort();
|
result->abort();
|
||||||
|
|
||||||
@@ -267,7 +267,8 @@ JOIN::prepare(Item ***rref_pointer_array,
|
|||||||
ORDER *order_init, ORDER *group_init,
|
ORDER *order_init, ORDER *group_init,
|
||||||
Item *having_init,
|
Item *having_init,
|
||||||
ORDER *proc_param_init, SELECT_LEX *select,
|
ORDER *proc_param_init, SELECT_LEX *select,
|
||||||
SELECT_LEX_UNIT *unit, bool fake_select_lex)
|
SELECT_LEX_UNIT *unit,
|
||||||
|
bool fake_select_lex, bool tables_OK)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("JOIN::prepare");
|
DBUG_ENTER("JOIN::prepare");
|
||||||
|
|
||||||
@@ -284,8 +285,9 @@ JOIN::prepare(Item ***rref_pointer_array,
|
|||||||
|
|
||||||
/* Check that all tables, fields, conds and order are ok */
|
/* Check that all tables, fields, conds and order are ok */
|
||||||
|
|
||||||
if (setup_tables(tables_list) ||
|
if ((tables_OK?0:(setup_tables(tables_list) ||
|
||||||
setup_wild(thd, tables_list, fields_list, &all_fields, wild_num) ||
|
setup_wild(thd, tables_list, fields_list,
|
||||||
|
&all_fields, wild_num))) ||
|
||||||
setup_ref_array(thd, rref_pointer_array, (fields_list.elements +
|
setup_ref_array(thd, rref_pointer_array, (fields_list.elements +
|
||||||
select_lex->with_sum_func +
|
select_lex->with_sum_func +
|
||||||
og_num)) ||
|
og_num)) ||
|
||||||
@@ -1296,7 +1298,7 @@ mysql_select(THD *thd, Item ***rref_pointer_array,
|
|||||||
COND *conds, uint og_num, ORDER *order, ORDER *group,
|
COND *conds, uint og_num, ORDER *order, ORDER *group,
|
||||||
Item *having, ORDER *proc_param, ulong select_options,
|
Item *having, ORDER *proc_param, ulong select_options,
|
||||||
select_result *result, SELECT_LEX_UNIT *unit,
|
select_result *result, SELECT_LEX_UNIT *unit,
|
||||||
SELECT_LEX *select_lex, bool fake_select_lex)
|
SELECT_LEX *select_lex, bool fake_select_lex, bool tables_OK)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
bool free_join= 1;
|
bool free_join= 1;
|
||||||
@@ -1323,7 +1325,7 @@ mysql_select(THD *thd, Item ***rref_pointer_array,
|
|||||||
|
|
||||||
if (join->prepare(rref_pointer_array, tables, wild_num,
|
if (join->prepare(rref_pointer_array, tables, wild_num,
|
||||||
conds, og_num, order, group, having, proc_param,
|
conds, og_num, order, group, having, proc_param,
|
||||||
select_lex, unit, fake_select_lex))
|
select_lex, unit, fake_select_lex, tables_OK))
|
||||||
{
|
{
|
||||||
DBUG_RETURN(-1);
|
DBUG_RETURN(-1);
|
||||||
}
|
}
|
||||||
@@ -8065,7 +8067,7 @@ int mysql_explain_select(THD *thd, SELECT_LEX *select_lex, char const *type,
|
|||||||
select_lex->having,
|
select_lex->having,
|
||||||
(ORDER*) thd->lex.proc_list.first,
|
(ORDER*) thd->lex.proc_list.first,
|
||||||
select_lex->options | thd->options | SELECT_DESCRIBE,
|
select_lex->options | thd->options | SELECT_DESCRIBE,
|
||||||
result, unit, select_lex, 0);
|
result, unit, select_lex, 0, 0);
|
||||||
DBUG_RETURN(res);
|
DBUG_RETURN(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -256,7 +256,7 @@ class JOIN :public Sql_alloc
|
|||||||
int prepare(Item ***rref_pointer_array, TABLE_LIST *tables, uint wind_num,
|
int prepare(Item ***rref_pointer_array, TABLE_LIST *tables, uint wind_num,
|
||||||
COND *conds, uint og_num, ORDER *order, ORDER *group,
|
COND *conds, uint og_num, ORDER *order, ORDER *group,
|
||||||
Item *having, ORDER *proc_param, SELECT_LEX *select,
|
Item *having, ORDER *proc_param, SELECT_LEX *select,
|
||||||
SELECT_LEX_UNIT *unit, bool fake_select_lex);
|
SELECT_LEX_UNIT *unit, bool fake_select_lex, bool tables_OK);
|
||||||
int optimize();
|
int optimize();
|
||||||
int reinit();
|
int reinit();
|
||||||
void exec();
|
void exec();
|
||||||
|
@@ -24,11 +24,12 @@
|
|||||||
#include "mysql_priv.h"
|
#include "mysql_priv.h"
|
||||||
#include "sql_select.h"
|
#include "sql_select.h"
|
||||||
|
|
||||||
int mysql_union(THD *thd, LEX *lex, select_result *result,SELECT_LEX_UNIT *unit)
|
int mysql_union(THD *thd, LEX *lex, select_result *result,
|
||||||
|
SELECT_LEX_UNIT *unit, bool tables_OK)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("mysql_union");
|
DBUG_ENTER("mysql_union");
|
||||||
int res= 0;
|
int res= 0;
|
||||||
if (!(res= unit->prepare(thd, result)))
|
if (!(res= unit->prepare(thd, result, tables_OK)))
|
||||||
res= unit->exec();
|
res= unit->exec();
|
||||||
res|= unit->cleanup();
|
res|= unit->cleanup();
|
||||||
DBUG_RETURN(res);
|
DBUG_RETURN(res);
|
||||||
@@ -107,7 +108,8 @@ bool select_union::flush()
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int st_select_lex_unit::prepare(THD *thd, select_result *result)
|
int st_select_lex_unit::prepare(THD *thd, select_result *result,
|
||||||
|
bool tables_OK)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("st_select_lex_unit::prepare");
|
DBUG_ENTER("st_select_lex_unit::prepare");
|
||||||
|
|
||||||
@@ -121,7 +123,7 @@ int st_select_lex_unit::prepare(THD *thd, select_result *result)
|
|||||||
SELECT_LEX_NODE *lex_select_save= thd->lex.current_select;
|
SELECT_LEX_NODE *lex_select_save= thd->lex.current_select;
|
||||||
SELECT_LEX *sl;
|
SELECT_LEX *sl;
|
||||||
|
|
||||||
thd->lex.current_select=first_select();
|
thd->lex.current_select= sl= first_select();
|
||||||
/* Global option */
|
/* Global option */
|
||||||
if (((void*)(global_parameters)) == ((void*)this))
|
if (((void*)(global_parameters)) == ((void*)this))
|
||||||
{
|
{
|
||||||
@@ -130,20 +132,28 @@ int st_select_lex_unit::prepare(THD *thd, select_result *result)
|
|||||||
if (found_rows_for_union)
|
if (found_rows_for_union)
|
||||||
first_select()->options ^= OPTION_FOUND_ROWS;
|
first_select()->options ^= OPTION_FOUND_ROWS;
|
||||||
}
|
}
|
||||||
item_list.empty();
|
if (tables_OK)
|
||||||
{
|
{
|
||||||
Item *item;
|
item_list= sl->item_list;
|
||||||
List_iterator<Item> it(first_select()->item_list);
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
item_list.empty();
|
||||||
TABLE_LIST *first_table= (TABLE_LIST*) first_select()->table_list.first;
|
TABLE_LIST *first_table= (TABLE_LIST*) first_select()->table_list.first;
|
||||||
|
|
||||||
/* Create a list of items that will be in the result set */
|
if (setup_tables(first_table) ||
|
||||||
while ((item= it++))
|
setup_wild(thd, first_table, sl->item_list, 0, sl->with_wild))
|
||||||
if (item_list.push_back(item))
|
|
||||||
goto err;
|
|
||||||
if (setup_wild(thd, first_table, item_list, 0,
|
|
||||||
first_select()->with_wild) ||
|
|
||||||
setup_fields(thd, 0, first_table, item_list, 0, 0, 1))
|
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
item_list= sl->item_list;
|
||||||
|
sl->with_wild= 0;
|
||||||
|
if (setup_ref_array(thd, &sl->ref_pointer_array,
|
||||||
|
(item_list.elements + sl->with_sum_func +
|
||||||
|
sl->order_list.elements + sl->group_list.elements)) ||
|
||||||
|
setup_fields(thd, sl->ref_pointer_array, first_table, item_list,
|
||||||
|
0, 0, 1))
|
||||||
|
goto err;
|
||||||
|
tables_OK= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bzero((char*) &tmp_table_param,sizeof(tmp_table_param));
|
bzero((char*) &tmp_table_param,sizeof(tmp_table_param));
|
||||||
@@ -191,11 +201,25 @@ int st_select_lex_unit::prepare(THD *thd, select_result *result)
|
|||||||
(ORDER*) sl->group_list.first,
|
(ORDER*) sl->group_list.first,
|
||||||
sl->having,
|
sl->having,
|
||||||
(ORDER*) NULL,
|
(ORDER*) NULL,
|
||||||
sl, this, 0);
|
sl, this, 0, tables_OK);
|
||||||
|
tables_OK= 0;
|
||||||
if (res | thd->fatal_error)
|
if (res | thd->fatal_error)
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
item_list.empty();
|
||||||
thd->lex.current_select= lex_select_save;
|
thd->lex.current_select= lex_select_save;
|
||||||
|
{
|
||||||
|
List_iterator<Item> it(first_select()->item_list);
|
||||||
|
Field **field;
|
||||||
|
|
||||||
|
for (field= table->field; *field; field++)
|
||||||
|
{
|
||||||
|
(void) it++;
|
||||||
|
if (item_list.push_back(new Item_field(*field)))
|
||||||
|
DBUG_RETURN(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
DBUG_RETURN(res | thd->fatal_error);
|
DBUG_RETURN(res | thd->fatal_error);
|
||||||
err:
|
err:
|
||||||
thd->lex.current_select= lex_select_save;
|
thd->lex.current_select= lex_select_save;
|
||||||
@@ -260,9 +284,6 @@ int st_select_lex_unit::exec()
|
|||||||
thd->lex.current_select = first_select();
|
thd->lex.current_select = first_select();
|
||||||
res =-1;
|
res =-1;
|
||||||
{
|
{
|
||||||
/* Create a list of fields in the temporary table */
|
|
||||||
List_iterator<Item> it(item_list);
|
|
||||||
Field **field;
|
|
||||||
#if 0
|
#if 0
|
||||||
List<Item_func_match> ftfunc_list;
|
List<Item_func_match> ftfunc_list;
|
||||||
ftfunc_list.empty();
|
ftfunc_list.empty();
|
||||||
@@ -272,11 +293,6 @@ int st_select_lex_unit::exec()
|
|||||||
thd->lex.select_lex.ftfunc_list= &empty_list;
|
thd->lex.select_lex.ftfunc_list= &empty_list;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (field=table->field ; *field ; field++)
|
|
||||||
{
|
|
||||||
(void) it++;
|
|
||||||
(void) it.replace(new Item_field(*field));
|
|
||||||
}
|
|
||||||
if (!thd->fatal_error) // Check if EOM
|
if (!thd->fatal_error) // Check if EOM
|
||||||
{
|
{
|
||||||
SELECT_LEX *sl=thd->lex.current_select->master_unit()->first_select();
|
SELECT_LEX *sl=thd->lex.current_select->master_unit()->first_select();
|
||||||
@@ -292,7 +308,7 @@ int st_select_lex_unit::exec()
|
|||||||
global_parameters->order_list.elements,
|
global_parameters->order_list.elements,
|
||||||
(ORDER*)global_parameters->order_list.first,
|
(ORDER*)global_parameters->order_list.first,
|
||||||
(ORDER*) NULL, NULL, (ORDER*) NULL,
|
(ORDER*) NULL, NULL, (ORDER*) NULL,
|
||||||
thd->options, result, this, first_select(), 1);
|
thd->options, result, this, first_select(), 1, 0);
|
||||||
if (found_rows_for_union && !res)
|
if (found_rows_for_union && !res)
|
||||||
thd->limit_found_rows = (ulonglong)table->file->records;
|
thd->limit_found_rows = (ulonglong)table->file->records;
|
||||||
}
|
}
|
||||||
|
@@ -428,7 +428,7 @@ int mysql_multi_update(THD *thd,
|
|||||||
conds, 0, (ORDER *) NULL, (ORDER *)NULL, (Item *) NULL,
|
conds, 0, (ORDER *) NULL, (ORDER *)NULL, (Item *) NULL,
|
||||||
(ORDER *)NULL,
|
(ORDER *)NULL,
|
||||||
options | SELECT_NO_JOIN_CACHE,
|
options | SELECT_NO_JOIN_CACHE,
|
||||||
result, unit, select_lex, 0);
|
result, unit, select_lex, 0, 0);
|
||||||
delete result;
|
delete result;
|
||||||
DBUG_RETURN(res);
|
DBUG_RETURN(res);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user