Commit 62902a3b authored by bell@sanja.is.com.ua's avatar bell@sanja.is.com.ua

after-review changes (577 SCRUM)

parent 291f8a22
...@@ -673,7 +673,7 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) ...@@ -673,7 +673,7 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
return 1; return 1;
if (r->fix_fields(thd, tables, ref) || r->check_cols(1)) if (r->fix_fields(thd, tables, ref) || r->check_cols(1))
return 1; return 1;
// store pointer on SELECT_LEX from wich item is dependent // store pointer on SELECT_LEX from which item is dependent
r->depended_from= last; r->depended_from= last;
cursel->mark_as_dependent(last); cursel->mark_as_dependent(last);
return 0; return 0;
......
...@@ -535,7 +535,7 @@ class Item_ref_on_list_position: public Item_ref_null_helper ...@@ -535,7 +535,7 @@ class Item_ref_on_list_position: public Item_ref_null_helper
/* /*
select_lex used for: select_lex used for:
1) receiving expanded variant of item list (to check max possible 1) receiving expanded variant of item list (to check max possible
nunber of elements); number of elements);
2) to have access to ref_pointer_array, via wich item will refered. 2) to have access to ref_pointer_array, via wich item will refered.
*/ */
st_select_lex *select_lex; st_select_lex *select_lex;
......
...@@ -1071,6 +1071,7 @@ in_string::~in_string() ...@@ -1071,6 +1071,7 @@ in_string::~in_string()
{ {
if (base) if (base)
{ {
// base was allocated with help of sql_alloc => following is OK
for (uint i=0 ; i < count ; i++) for (uint i=0 ; i < count ; i++)
((String*) base)[i].free(); ((String*) base)[i].free();
} }
......
...@@ -2213,7 +2213,7 @@ void Item_func_get_user_var::fix_length_and_dec() ...@@ -2213,7 +2213,7 @@ void Item_func_get_user_var::fix_length_and_dec()
} }
return; return;
err: err:
thd->fatal_error= 1; thd->fatal_error();
return; return;
} }
......
...@@ -150,7 +150,13 @@ void Item_singlerow_subselect::select_transformer(THD *thd, ...@@ -150,7 +150,13 @@ void Item_singlerow_subselect::select_transformer(THD *thd,
if (!select_lex->next_select() && !select_lex->table_list.elements && if (!select_lex->next_select() && !select_lex->table_list.elements &&
select_lex->item_list.elements == 1 && select_lex->item_list.elements == 1 &&
// TODO: mark subselect items from item list separately /*
We cant change name of Item_field or Item_ref, because it will
prevent it's correct resolving, but we should save name of
removed item => we do not make optimization if top item of
list is field or reference.
TODO: solve above problem
*/
!(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)
) )
......
...@@ -51,7 +51,7 @@ Item_sum::Item_sum(THD *thd, Item_sum &item): ...@@ -51,7 +51,7 @@ Item_sum::Item_sum(THD *thd, Item_sum &item):
else else
if (!(args=(Item**) sql_alloc(sizeof(Item*)*arg_count))) if (!(args=(Item**) sql_alloc(sizeof(Item*)*arg_count)))
return; return;
for(uint i= 0; i < arg_count; i++) for (uint i= 0; i < arg_count; i++)
args[i]= item.args[i]; args[i]= item.args[i];
} }
...@@ -999,6 +999,10 @@ int dump_leaf(byte* key, uint32 count __attribute__((unused)), ...@@ -999,6 +999,10 @@ int dump_leaf(byte* key, uint32 count __attribute__((unused)),
Item_sum_count_distinct::~Item_sum_count_distinct() Item_sum_count_distinct::~Item_sum_count_distinct()
{ {
/*
Free table and tree if they belong to this item (if item have not pointer
to original item from which was made copy => it own its objects )
*/
if (!original) if (!original)
{ {
if (table) if (table)
......
...@@ -404,8 +404,8 @@ int mysql_select(THD *thd, Item ***rref_pointer_array, ...@@ -404,8 +404,8 @@ int mysql_select(THD *thd, Item ***rref_pointer_array,
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); bool tables_and_fields_initied);
void free_ulderlayed_joins(THD *thd, SELECT_LEX *select); void free_underlaid_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);
int mysql_explain_union(THD *thd, SELECT_LEX_UNIT *unit, int mysql_explain_union(THD *thd, SELECT_LEX_UNIT *unit,
...@@ -413,7 +413,7 @@ int mysql_explain_union(THD *thd, SELECT_LEX_UNIT *unit, ...@@ -413,7 +413,7 @@ int mysql_explain_union(THD *thd, SELECT_LEX_UNIT *unit,
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, int mysql_union(THD *thd, LEX *lex, select_result *result,
SELECT_LEX_UNIT *unit, bool tables_OK); SELECT_LEX_UNIT *unit, bool tables_and_fields_initied);
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,
......
...@@ -1949,14 +1949,15 @@ int setup_fields(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables, ...@@ -1949,14 +1949,15 @@ int setup_fields(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables,
thd->allow_sum_func= allow_sum_func; thd->allow_sum_func= allow_sum_func;
thd->where="field list"; thd->where="field list";
for (uint i= 0; (item= it++); i++) Item **ref= ref_pointer_array;
while ((item= it++))
{ {
if (item->fix_fields(thd, tables, it.ref()) || if (item->fix_fields(thd, tables, it.ref()) ||
item->check_cols(1)) item->check_cols(1))
DBUG_RETURN(-1); /* purecov: inspected */ DBUG_RETURN(-1); /* purecov: inspected */
item= *(it.ref()); //Item can be chenged in fix fields item= *(it.ref()); //Item can be changed in fix fields
if (ref_pointer_array) if (ref)
ref_pointer_array[i]= item; *(ref++)= item;
if (item->with_sum_func && item->type() != Item::SUM_FUNC_ITEM && if (item->with_sum_func && item->type() != Item::SUM_FUNC_ITEM &&
sum_func_list) sum_func_list)
item->split_sum_func(ref_pointer_array, *sum_func_list); item->split_sum_func(ref_pointer_array, *sum_func_list);
......
...@@ -92,7 +92,7 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order, ...@@ -92,7 +92,7 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order,
if ((select && select->check_quick(safe_update, limit)) || !limit) if ((select && select->check_quick(safe_update, limit)) || !limit)
{ {
delete select; delete select;
free_ulderlayed_joins(thd, &thd->lex.select_lex); free_underlaid_joins(thd, &thd->lex.select_lex);
send_ok(thd,0L); send_ok(thd,0L);
DBUG_RETURN(0); // Nothing to delete DBUG_RETURN(0); // Nothing to delete
} }
...@@ -104,7 +104,7 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order, ...@@ -104,7 +104,7 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order,
if (safe_update && !using_limit) if (safe_update && !using_limit)
{ {
delete select; delete select;
free_ulderlayed_joins(thd, &thd->lex.select_lex); free_underlaid_joins(thd, &thd->lex.select_lex);
send_error(thd,ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE); send_error(thd,ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE);
DBUG_RETURN(1); DBUG_RETURN(1);
} }
...@@ -134,7 +134,7 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order, ...@@ -134,7 +134,7 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order,
== HA_POS_ERROR) == HA_POS_ERROR)
{ {
delete select; delete select;
free_ulderlayed_joins(thd, &thd->lex.select_lex); free_underlaid_joins(thd, &thd->lex.select_lex);
DBUG_RETURN(-1); // This will force out message DBUG_RETURN(-1); // This will force out message
} }
} }
...@@ -210,7 +210,7 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order, ...@@ -210,7 +210,7 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order,
thd->lock=0; thd->lock=0;
} }
delete select; delete select;
free_ulderlayed_joins(thd, &thd->lex.select_lex); free_underlaid_joins(thd, &thd->lex.select_lex);
if (error >= 0 || thd->net.report_error) if (error >= 0 || thd->net.report_error)
send_error(thd,thd->killed ? ER_SERVER_SHUTDOWN: 0); send_error(thd,thd->killed ? ER_SERVER_SHUTDOWN: 0);
else else
......
...@@ -376,13 +376,13 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, ...@@ -376,13 +376,13 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list,
thd->cuted_fields); thd->cuted_fields);
::send_ok(thd,info.copied+info.deleted,(ulonglong)id,buff); ::send_ok(thd,info.copied+info.deleted,(ulonglong)id,buff);
} }
free_ulderlayed_joins(thd, &thd->lex.select_lex); free_underlaid_joins(thd, &thd->lex.select_lex);
DBUG_RETURN(0); DBUG_RETURN(0);
abort: abort:
if (lock_type == TL_WRITE_DELAYED) if (lock_type == TL_WRITE_DELAYED)
end_delayed_insert(thd); end_delayed_insert(thd);
free_ulderlayed_joins(thd, &thd->lex.select_lex); free_underlaid_joins(thd, &thd->lex.select_lex);
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
......
...@@ -312,7 +312,7 @@ class st_select_lex_unit: public st_select_lex_node { ...@@ -312,7 +312,7 @@ class st_select_lex_unit: public st_select_lex_node {
void exclude_level(); void exclude_level();
/* UNION methods */ /* UNION methods */
int prepare(THD *thd, select_result *result, bool tables_OK); int prepare(THD *thd, select_result *result, bool tables_and_fields_initied);
int exec(); int exec();
int cleanup(); int cleanup();
......
...@@ -438,7 +438,6 @@ static bool setup_params_data(PREP_STMT *stmt) ...@@ -438,7 +438,6 @@ static bool setup_params_data(PREP_STMT *stmt)
} }
/* /*
Validate the following information for INSERT statement: Validate the following information for INSERT statement:
- field existance - field existance
- fields count - fields count
......
This diff is collapsed.
...@@ -256,7 +256,8 @@ class JOIN :public Sql_alloc ...@@ -256,7 +256,8 @@ 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, bool tables_OK); SELECT_LEX_UNIT *unit, bool fake_select_lex,
bool tables_and_fields_initied);
int optimize(); int optimize();
int reinit(); int reinit();
void exec(); void exec();
......
...@@ -25,11 +25,11 @@ ...@@ -25,11 +25,11 @@
#include "sql_select.h" #include "sql_select.h"
int mysql_union(THD *thd, LEX *lex, select_result *result, int mysql_union(THD *thd, LEX *lex, select_result *result,
SELECT_LEX_UNIT *unit, bool tables_OK) SELECT_LEX_UNIT *unit, bool tables_and_fields_initied)
{ {
DBUG_ENTER("mysql_union"); DBUG_ENTER("mysql_union");
int res= 0; int res= 0;
if (!(res= unit->prepare(thd, result, tables_OK))) if (!(res= unit->prepare(thd, result, tables_and_fields_initied)))
res= unit->exec(); res= unit->exec();
res|= unit->cleanup(); res|= unit->cleanup();
DBUG_RETURN(res); DBUG_RETURN(res);
...@@ -109,7 +109,7 @@ bool select_union::flush() ...@@ -109,7 +109,7 @@ bool select_union::flush()
} }
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) bool tables_and_fields_initied)
{ {
DBUG_ENTER("st_select_lex_unit::prepare"); DBUG_ENTER("st_select_lex_unit::prepare");
...@@ -132,8 +132,9 @@ int st_select_lex_unit::prepare(THD *thd, select_result *result, ...@@ -132,8 +132,9 @@ 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;
} }
if (tables_OK) if (tables_and_fields_initied)
{ {
// Item list and tables will be initialized by mysql_derived
item_list= sl->item_list; item_list= sl->item_list;
} }
else else
...@@ -153,7 +154,7 @@ int st_select_lex_unit::prepare(THD *thd, select_result *result, ...@@ -153,7 +154,7 @@ int st_select_lex_unit::prepare(THD *thd, select_result *result,
setup_fields(thd, sl->ref_pointer_array, first_table, item_list, setup_fields(thd, sl->ref_pointer_array, first_table, item_list,
0, 0, 1)) 0, 0, 1))
goto err; goto err;
tables_OK= 1; tables_and_fields_initied= 1;
} }
bzero((char*) &tmp_table_param,sizeof(tmp_table_param)); bzero((char*) &tmp_table_param,sizeof(tmp_table_param));
...@@ -201,8 +202,8 @@ int st_select_lex_unit::prepare(THD *thd, select_result *result, ...@@ -201,8 +202,8 @@ 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, tables_OK); sl, this, 0, tables_and_fields_initied);
tables_OK= 0; tables_and_fields_initied= 0;
if (res | thd->is_fatal_error) if (res | thd->is_fatal_error)
goto err; goto err;
} }
...@@ -231,7 +232,7 @@ int st_select_lex_unit::exec() ...@@ -231,7 +232,7 @@ int st_select_lex_unit::exec()
DBUG_ENTER("st_select_lex_unit::exec"); DBUG_ENTER("st_select_lex_unit::exec");
SELECT_LEX_NODE *lex_select_save= thd->lex.current_select; SELECT_LEX_NODE *lex_select_save= thd->lex.current_select;
if (executed && !(dependent||uncacheable)) if (executed && !(dependent || uncacheable))
DBUG_RETURN(0); DBUG_RETURN(0);
executed= 1; executed= 1;
......
...@@ -124,7 +124,7 @@ int mysql_update(THD *thd, ...@@ -124,7 +124,7 @@ int mysql_update(THD *thd,
table->grant.want_privilege=(SELECT_ACL & ~table->grant.privilege); table->grant.want_privilege=(SELECT_ACL & ~table->grant.privilege);
if (setup_fields(thd, 0, update_table_list, values, 0, 0, 0)) if (setup_fields(thd, 0, update_table_list, values, 0, 0, 0))
{ {
free_ulderlayed_joins(thd, &thd->lex.select_lex); free_underlaid_joins(thd, &thd->lex.select_lex);
DBUG_RETURN(-1); /* purecov: inspected */ DBUG_RETURN(-1); /* purecov: inspected */
} }
...@@ -135,7 +135,7 @@ int mysql_update(THD *thd, ...@@ -135,7 +135,7 @@ int mysql_update(THD *thd,
(select && select->check_quick(safe_update, limit)) || !limit) (select && select->check_quick(safe_update, limit)) || !limit)
{ {
delete select; delete select;
free_ulderlayed_joins(thd, &thd->lex.select_lex); free_underlaid_joins(thd, &thd->lex.select_lex);
if (error) if (error)
{ {
DBUG_RETURN(-1); // Error in where DBUG_RETURN(-1); // Error in where
...@@ -150,7 +150,7 @@ int mysql_update(THD *thd, ...@@ -150,7 +150,7 @@ int mysql_update(THD *thd,
if (safe_update && !using_limit) if (safe_update && !using_limit)
{ {
delete select; delete select;
free_ulderlayed_joins(thd, &thd->lex.select_lex); free_underlaid_joins(thd, &thd->lex.select_lex);
send_error(thd,ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE); send_error(thd,ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE);
DBUG_RETURN(1); DBUG_RETURN(1);
} }
...@@ -178,7 +178,7 @@ int mysql_update(THD *thd, ...@@ -178,7 +178,7 @@ int mysql_update(THD *thd,
DISK_BUFFER_SIZE, MYF(MY_WME))) DISK_BUFFER_SIZE, MYF(MY_WME)))
{ {
delete select; /* purecov: inspected */ delete select; /* purecov: inspected */
free_ulderlayed_joins(thd, &thd->lex.select_lex); free_underlaid_joins(thd, &thd->lex.select_lex);
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
if (old_used_keys & ((key_map) 1 << used_index)) if (old_used_keys & ((key_map) 1 << used_index))
...@@ -212,7 +212,7 @@ int mysql_update(THD *thd, ...@@ -212,7 +212,7 @@ int mysql_update(THD *thd,
== HA_POS_ERROR) == HA_POS_ERROR)
{ {
delete select; delete select;
free_ulderlayed_joins(thd, &thd->lex.select_lex); free_underlaid_joins(thd, &thd->lex.select_lex);
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
} }
...@@ -267,7 +267,7 @@ int mysql_update(THD *thd, ...@@ -267,7 +267,7 @@ int mysql_update(THD *thd,
if (error >= 0) if (error >= 0)
{ {
delete select; delete select;
free_ulderlayed_joins(thd, &thd->lex.select_lex); free_underlaid_joins(thd, &thd->lex.select_lex);
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
} }
...@@ -353,7 +353,7 @@ int mysql_update(THD *thd, ...@@ -353,7 +353,7 @@ int mysql_update(THD *thd,
} }
delete select; delete select;
free_ulderlayed_joins(thd, &thd->lex.select_lex); free_underlaid_joins(thd, &thd->lex.select_lex);
if (error >= 0) if (error >= 0)
send_error(thd,thd->killed ? ER_SERVER_SHUTDOWN : 0); /* purecov: inspected */ send_error(thd,thd->killed ? ER_SERVER_SHUTDOWN : 0); /* purecov: inspected */
else else
......
...@@ -1797,7 +1797,7 @@ select_option: ...@@ -1797,7 +1797,7 @@ select_option:
YYABORT; YYABORT;
Select->options|= OPTION_FOUND_ROWS; Select->options|= OPTION_FOUND_ROWS;
} }
| SQL_NO_CACHE_SYM { Lex->uncacheable();; } | SQL_NO_CACHE_SYM { Lex->uncacheable(); }
| SQL_CACHE_SYM { Select->options|= OPTION_TO_QUERY_CACHE; } | SQL_CACHE_SYM { Select->options|= OPTION_TO_QUERY_CACHE; }
| ALL {} | ALL {}
; ;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment