diff options
author | unknown <monty@mashka.mysql.fi> | 2002-12-06 21:11:27 +0200 |
---|---|---|
committer | unknown <monty@mashka.mysql.fi> | 2002-12-06 21:11:27 +0200 |
commit | ae4323e0d9fcbbca12b65f811cadb993b816d636 (patch) | |
tree | 969377c9c94475e559670dfcc0a8c4f7ed16b388 /sql | |
parent | 6d33f73416b5576b4e48412fd3a7342385c1c747 (diff) | |
download | mariadb-git-ae4323e0d9fcbbca12b65f811cadb993b816d636.tar.gz |
After merge fixes
Added THD to add_to_xxx_list() functions for faster parsing.
heap/_check.c:
After merge fix
mysql-test/r/distinct.result:
After merge fix
mysql-test/r/multi_update.result:
Make timestamp test portable
mysql-test/t/multi_update.test:
Make timestamp test portable
sql/field.cc:
After merge fix
sql/item_sum.cc:
After merge fix
sql/log_event.cc:
Remove compiler warning
sql/mysql_priv.h:
Added THD to add_to_list (Faster parsing)
sql/sql_derived.cc:
Fixed parameters to create_tmp_table()
sql/sql_lex.cc:
Added THD to add_to_list (Faster parsing)
sql/sql_lex.h:
Added THD to add_to_list (Faster parsing)
sql/sql_parse.cc:
Added THD to add_to_list (Faster parsing)
sql/sql_select.cc:
After merge fixes
Fixed return values from JOIN::optimize()
Replaced test_function_query with '!tables_list'
Optimized arguments to create_tmp_table()
sql/sql_select.h:
Removed test_function_query variable
Updated prototypes
sql/sql_union.cc:
Updated argument lists.
sql/sql_update.cc:
After merge fixes
sql/sql_yacc.yy:
Added THD to all add_xxx_to_list() functions
sql/table.h:
After merge fix
Diffstat (limited to 'sql')
-rw-r--r-- | sql/field.cc | 9 | ||||
-rw-r--r-- | sql/item_sum.cc | 16 | ||||
-rw-r--r-- | sql/log_event.cc | 12 | ||||
-rw-r--r-- | sql/mysql_priv.h | 27 | ||||
-rw-r--r-- | sql/sql_derived.cc | 4 | ||||
-rw-r--r-- | sql/sql_lex.cc | 16 | ||||
-rw-r--r-- | sql/sql_lex.h | 14 | ||||
-rw-r--r-- | sql/sql_parse.cc | 17 | ||||
-rw-r--r-- | sql/sql_select.cc | 132 | ||||
-rw-r--r-- | sql/sql_select.h | 11 | ||||
-rw-r--r-- | sql/sql_union.cc | 10 | ||||
-rw-r--r-- | sql/sql_update.cc | 19 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 84 | ||||
-rw-r--r-- | sql/table.h | 3 |
14 files changed, 201 insertions, 173 deletions
diff --git a/sql/field.cc b/sql/field.cc index 7b3b88a69f1..77bd7392dd2 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -1577,12 +1577,12 @@ void Field_medium::sql_type(String &res) const int Field_long::store(const char *from,uint len,CHARSET_INFO *cs) { char *end; - while (len && my_isspace(system_charset_info,*from)) + while (len && my_isspace(cs,*from)) { len--; from++; } long tmp; - String tmp_str(from,len); + String tmp_str(from, len, cs); from= tmp_str.c_ptr(); // Add end null if needed int error= 0; errno=0; @@ -1602,6 +1602,7 @@ int Field_long::store(const char *from,uint len,CHARSET_INFO *cs) if (errno || (from+len != end && current_thd->count_cuted_fields && !test_if_int(from,len))) + { current_thd->cuted_fields++; error= 1; } @@ -1826,12 +1827,12 @@ void Field_long::sql_type(String &res) const int Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs) { char *end; - while (len && my_isspace(system_charset_info,*from)) + while (len && my_isspace(cs,*from)) { // For easy error check len--; from++; } longlong tmp; - String tmp_str(from,len); + String tmp_str(from, len, cs); from= tmp_str.c_ptr(); // Add end null if needed int error= 0; errno=0; diff --git a/sql/item_sum.cc b/sql/item_sum.cc index fe7523a5fc5..a1f772f4d46 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -43,7 +43,8 @@ Item_sum::Item_sum(List<Item> &list) void Item_sum::mark_as_sum_func() { - current_thd->lex.current_select->with_sum_func= with_sum_func= 1; + current_thd->lex.current_select->with_sum_func=1; + with_sum_func= 1; } void Item_sum::make_field(Send_field *tmp_field) @@ -991,9 +992,9 @@ bool Item_sum_count_distinct::setup(THD *thd) tmp_table_param->cleanup(); } if (!(table= create_tmp_table(thd, tmp_table_param, list, (ORDER*) 0, 1, - 0, 0, + 0, select_lex->options | thd->options, - select_lex->master_unit()))) + HA_POS_ERROR))) return 1; table->file->extra(HA_EXTRA_NO_ROWS); // Don't update rows table->no_rows=1; @@ -1091,7 +1092,7 @@ bool Item_sum_count_distinct::setup(THD *thd) int Item_sum_count_distinct::tree_to_myisam() { - if (create_myisam_from_heap(table, tmp_table_param, + if (create_myisam_from_heap(current_thd, table, tmp_table_param, HA_ERR_RECORD_FILE_FULL, 1) || tree_walk(&tree, (tree_walk_action)&dump_leaf, (void*)this, left_root_right)) @@ -1137,7 +1138,8 @@ bool Item_sum_count_distinct::add() if (tree_to_myisam()) return 1; } - else if (!tree_insert(&tree, table->record[0] + rec_offset, 0, tree.custom_arg)) + else if (!tree_insert(&tree, table->record[0] + rec_offset, 0, + tree.custom_arg)) return 1; } else if ((error=table->file->write_row(table->record[0]))) @@ -1145,13 +1147,15 @@ bool Item_sum_count_distinct::add() if (error != HA_ERR_FOUND_DUPP_KEY && error != HA_ERR_FOUND_DUPP_UNIQUE) { - if (create_myisam_from_heap(table, tmp_table_param, error,1)) + if (create_myisam_from_heap(current_thd, table, tmp_table_param, error, + 1)) return 1; // Not a table_is_full error } } return 0; } + longlong Item_sum_count_distinct::val_int() { if (!table) // Empty query diff --git a/sql/log_event.cc b/sql/log_event.cc index d9ee832f7d3..5050bba9965 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -1194,9 +1194,15 @@ Load_log_event::Load_log_event(THD *thd_arg, sql_exchange *ex, sql_ex.empty_flags = 0; switch (handle_dup) { - case DUP_IGNORE: sql_ex.opt_flags |= IGNORE_FLAG; break; - case DUP_REPLACE: sql_ex.opt_flags |= REPLACE_FLAG; break; - case DUP_ERROR: break; + case DUP_IGNORE: + sql_ex.opt_flags |= IGNORE_FLAG; + break; + case DUP_REPLACE: + sql_ex.opt_flags |= REPLACE_FLAG; + break; + case DUP_UPDATE: // Impossible here + case DUP_ERROR: + break; } if (!ex->field_term->length()) diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index cb9e3a362b4..9714c2bcdd7 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -460,7 +460,8 @@ int mysql_update(THD *thd,TABLE_LIST *tables,List<Item> &fields, int mysql_multi_update(THD *thd, TABLE_LIST *table_list, List<Item> *fields, List<Item> *values, COND *conds, ulong options, - enum enum_duplicates handle_duplicates); + enum enum_duplicates handle_duplicates, + SELECT_LEX_UNIT *unit, SELECT_LEX *select_lex); int mysql_insert(THD *thd,TABLE_LIST *table,List<Item> &fields, List<List_item> &values, List<Item> &update_fields, List<Item> &update_values, enum_duplicates flag); @@ -554,13 +555,13 @@ int mysql_ha_read(THD *, TABLE_LIST *,enum enum_ha_read_modes,char *, /* sql_base.cc */ void set_item_name(Item *item,char *pos,uint length); -bool add_field_to_list(char *field_name, enum enum_field_types type, +bool add_field_to_list(THD *thd, char *field_name, enum enum_field_types type, char *length, char *decimal, uint type_modifier, Item *default_value, Item *comment, char *change, TYPELIB *interval,CHARSET_INFO *cs); void store_position_for_column(const char *name); -bool add_to_list(SQL_LIST &list,Item *group,bool asc=0); +bool add_to_list(THD *thd, SQL_LIST &list,Item *group,bool asc=0); void add_join_on(TABLE_LIST *b,Item *expr); void add_join_natural(TABLE_LIST *a,TABLE_LIST *b); bool add_proc_to_list(THD *thd, Item *item); @@ -871,22 +872,26 @@ Item *get_system_var(enum_var_type var_type, const char *var_name, uint length, /* Some inline functions for more speed */ -inline bool add_item_to_list(Item *item) +inline bool add_item_to_list(THD *thd, Item *item) { - return current_lex->current_select->add_item_to_list(item); + return thd->lex.current_select->add_item_to_list(thd, item); } -inline bool add_value_to_list(Item *value) + +inline bool add_value_to_list(THD *thd, Item *value) { - return current_lex->value_list.push_back(value); + return thd->lex.value_list.push_back(value); } -inline bool add_order_to_list(Item *item, bool asc) + +inline bool add_order_to_list(THD *thd, Item *item, bool asc) { - return current_lex->current_select->add_order_to_list(item, asc); + return thd->lex.current_select->add_order_to_list(thd, item, asc); } -inline bool add_group_to_list(Item *item, bool asc) + +inline bool add_group_to_list(THD *thd, Item *item, bool asc) { - return current_lex->current_select->add_group_to_list(item, asc); + return thd->lex.current_select->add_group_to_list(thd, item, asc); } + inline void mark_as_null_row(TABLE *table) { table->null_row=1; diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index 76a97a2e4b8..f0df6811133 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -66,10 +66,10 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t) bzero((char*) &tmp_table_param,sizeof(tmp_table_param)); tmp_table_param.field_count=item_list.elements; if (!(table=create_tmp_table(thd, &tmp_table_param, item_list, - (ORDER*) 0, 0, 1, 0, + (ORDER*) 0, 0, 1, (sl->options | thd->options | TMP_TABLE_ALL_COLUMNS), - unit))) + HA_POS_ERROR))) { res=-1; goto exit; diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 54f28668644..833f36dbe9f 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -1098,19 +1098,19 @@ st_select_lex* st_select_lex_node::select_lex() DBUG_RETURN(0); } -bool st_select_lex_node::add_item_to_list(Item *item) +bool st_select_lex_node::add_item_to_list(THD *thd, Item *item) { return 1; } -bool st_select_lex_node::add_group_to_list(Item *item, bool asc) +bool st_select_lex_node::add_group_to_list(THD *thd, Item *item, bool asc) { return 1; } -bool st_select_lex_node::add_order_to_list(Item *item, bool asc) +bool st_select_lex_node::add_order_to_list(THD *thd, Item *item, bool asc) { - return add_to_list(order_list,item,asc); + return add_to_list(thd, order_list,item,asc); } bool st_select_lex_node::add_ftfunc_to_list(Item_func_match *func) @@ -1166,7 +1166,7 @@ TABLE_LIST* st_select_lex_node::get_table_list() { return 0; } List<Item>* st_select_lex_node::get_item_list() { return 0; } List<String>* st_select_lex_node::get_use_index() { return 0; } List<String>* st_select_lex_node::get_ignore_index() { return 0; } -TABLE_LIST *st_select_lex_node::add_table_to_list(Table_ident *table, +TABLE_LIST *st_select_lex_node::add_table_to_list(THD *thd, Table_ident *table, LEX_STRING *alias, bool updating, thr_lock_type flags, @@ -1269,14 +1269,14 @@ st_select_lex* st_select_lex::select_lex() return this; } -bool st_select_lex::add_item_to_list(Item *item) +bool st_select_lex::add_item_to_list(THD *thd, Item *item) { return item_list.push_back(item); } -bool st_select_lex::add_group_to_list(Item *item, bool asc) +bool st_select_lex::add_group_to_list(THD *thd, Item *item, bool asc) { - return add_to_list(group_list, item, asc); + return add_to_list(thd, group_list, item, asc); } bool st_select_lex::add_ftfunc_to_list(Item_func_match *func) diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 453728bfc0e..0c761baffa3 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -227,9 +227,9 @@ public: void exclude(); virtual st_select_lex* select_lex(); - virtual bool add_item_to_list(Item *item); - bool add_order_to_list(Item *item, bool asc); - virtual bool add_group_to_list(Item *item, bool asc); + virtual bool add_item_to_list(THD *thd, Item *item); + bool add_order_to_list(THD *thd, Item *item, bool asc); + virtual bool add_group_to_list(THD *thd, Item *item, bool asc); virtual bool add_ftfunc_to_list(Item_func_match *func); virtual st_select_lex_unit* master_unit()= 0; @@ -242,7 +242,7 @@ public: virtual List<Item>* get_item_list(); virtual List<String>* get_use_index(); virtual List<String>* get_ignore_index(); - virtual TABLE_LIST *add_table_to_list(Table_ident *table, + virtual TABLE_LIST *add_table_to_list(THD *thd, Table_ident *table, LEX_STRING *alias, bool updating, thr_lock_type flags= TL_UNLOCK, @@ -363,15 +363,15 @@ public: uint get_in_sum_expr(); st_select_lex* select_lex(); - bool add_item_to_list(Item *item); - bool add_group_to_list(Item *item, bool asc); + bool add_item_to_list(THD *thd, Item *item); + bool add_group_to_list(THD *thd, Item *item, bool asc); bool add_ftfunc_to_list(Item_func_match *func); TABLE_LIST* get_table_list(); List<Item>* get_item_list(); List<String>* get_use_index(); List<String>* get_ignore_index(); - TABLE_LIST* add_table_to_list(Table_ident *table, + TABLE_LIST* add_table_to_list(THD *thd, Table_ident *table, LEX_STRING *alias, bool updating, thr_lock_type flags= TL_UNLOCK, diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 8e8e2c44e01..af0a46e6919 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2070,7 +2070,7 @@ mysql_execute_command(THD *thd) walk->lock_type= auxi->lock_type; auxi->table_list= walk; // Remember corresponding table } - if (add_item_to_list(new Item_null())) + if (add_item_to_list(thd, new Item_null())) { res= -1; break; @@ -2927,7 +2927,7 @@ void create_select_for_variable(const char *var_name) lex->sql_command= SQLCOM_SELECT; tmp.str= (char*) var_name; tmp.length=strlen(var_name); - add_item_to_list(get_system_var(OPT_SESSION, tmp)); + add_item_to_list(lex->thd, get_system_var(OPT_SESSION, tmp)); DBUG_VOID_RETURN; } @@ -2992,14 +2992,13 @@ mysql_parse(THD *thd, char *inBuf, uint length) ** Return 0 if ok ******************************************************************************/ -bool add_field_to_list(char *field_name, enum_field_types type, +bool add_field_to_list(THD *thd, char *field_name, enum_field_types type, char *length, char *decimals, uint type_modifier, Item *default_value, Item *comment, char *change, TYPELIB *interval, CHARSET_INFO *cs) { register create_field *new_field; - THD *thd=current_thd; LEX *lex= &thd->lex; uint allowed_type_modifier=0; char warn_buff[MYSQL_ERRMSG_SIZE]; @@ -3304,7 +3303,7 @@ add_proc_to_list(THD* thd, Item *item) ORDER *order; Item **item_ptr; - if (!(order = (ORDER *) sql_alloc(sizeof(ORDER)+sizeof(Item*)))) + if (!(order = (ORDER *) thd->alloc(sizeof(ORDER)+sizeof(Item*)))) return 1; item_ptr = (Item**) (order+1); *item_ptr= item; @@ -3351,12 +3350,12 @@ static void remove_escape(char *name) ****************************************************************************/ -bool add_to_list(SQL_LIST &list,Item *item,bool asc) +bool add_to_list(THD *thd, SQL_LIST &list,Item *item,bool asc) { ORDER *order; Item **item_ptr; DBUG_ENTER("add_to_list"); - if (!(order = (ORDER *) sql_alloc(sizeof(ORDER)+sizeof(Item*)))) + if (!(order = (ORDER *) thd->alloc(sizeof(ORDER)+sizeof(Item*)))) DBUG_RETURN(1); item_ptr = (Item**) (order+1); *item_ptr=item; @@ -3369,7 +3368,8 @@ bool add_to_list(SQL_LIST &list,Item *item,bool asc) } -TABLE_LIST *st_select_lex::add_table_to_list(Table_ident *table, +TABLE_LIST *st_select_lex::add_table_to_list(THD *thd, + Table_ident *table, LEX_STRING *alias, bool updating, thr_lock_type flags, @@ -3377,7 +3377,6 @@ TABLE_LIST *st_select_lex::add_table_to_list(Table_ident *table, List<String> *ignore_index) { register TABLE_LIST *ptr; - THD *thd=current_thd; char *alias_str; DBUG_ENTER("add_table_to_list"); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index a5c69763863..3437ae875b9 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -377,7 +377,6 @@ JOIN::prepare(TABLE_LIST *tables_init, int JOIN::optimize() { - ha_rows select_limit; DBUG_ENTER("JOIN::optimize"); #ifdef HAVE_REF_TO_FIELDS // Not done yet @@ -400,19 +399,17 @@ JOIN::optimize() #endif conds= optimize_cond(conds,&cond_value); - if (thd->fatal_error) + if (thd->fatal_error || thd->net.report_error) { // quick abort delete procedure; - error= 0; - DBUG_RETURN(1); - } else if (thd->net.report_error) - // normal error processing & cleanup - DBUG_RETURN(-1); + error= thd->net.report_error ? -1 : 1; + DBUG_RETURN(-1); // Return without cleanup + } if (cond_value == Item::COND_FALSE || (!unit->select_limit_cnt && !(select_options & OPTION_FOUND_ROWS))) - { /* Impossible cond */ + { /* Impossible cond */ zero_result_cause= "Impossible WHERE"; DBUG_RETURN(0); } @@ -429,24 +426,21 @@ JOIN::optimize() DBUG_RETURN(0); } zero_result_cause= "Select tables optimized away"; - tables_list= 0; // All tables resolved + tables_list= 0; // All tables resolved } } if (!tables_list) - { - test_function_query= 1; DBUG_RETURN(0); - } - error= -1; + error= -1; // Error is sent to client sort_by_table= get_sort_by_table(order, group_list, tables_list); /* Calculate how to do the join */ thd->proc_info= "statistics"; if (make_join_statistics(this, tables_list, conds, &keyuse) || thd->fatal_error) - DBUG_RETURN(-1); + DBUG_RETURN(1); if (select_lex->dependent) { @@ -460,7 +454,9 @@ JOIN::optimize() } thd->proc_info= "preparing"; if (result->initialize_tables(this)) - DBUG_RETURN(-1); + { + DBUG_RETURN(1); // error = -1 + } if (const_table_map != found_const_table_map && !(select_options & SELECT_DESCRIBE)) { @@ -474,7 +470,7 @@ JOIN::optimize() { /* purecov: inspected */ my_message(ER_TOO_BIG_SELECT, ER(ER_TOO_BIG_SELECT), MYF(0)); error= 1; /* purecov: inspected */ - DBUG_RETURN(-1); + DBUG_RETURN(1); } if (const_tables && !thd->locked_tables && !(select_options & SELECT_NO_UNLOCK)) @@ -502,9 +498,9 @@ JOIN::optimize() select=make_select(*table, const_table_map, const_table_map, conds, &error); if (error) - { /* purecov: inspected */ - error= -1; /* purecov: inspected */ - DBUG_RETURN(-1); + { /* purecov: inspected */ + error= -1; /* purecov: inspected */ + DBUG_RETURN(1); } if (make_join_select(this, select, conds)) { @@ -543,11 +539,11 @@ JOIN::optimize() bool all_order_fields_used; if (order) skip_sort_order= test_if_skip_sort_order(tab, order, select_limit, 1); - if ((group=create_distinct_group(thd, order, fields_list, - &all_order_fields_used))) + if ((group_list=create_distinct_group(thd, order, fields_list, + &all_order_fields_used))) { bool skip_group= (skip_sort_order && - test_if_skip_sort_order(tab, group, select_limit, + test_if_skip_sort_order(tab, group_list, select_limit, 1) != 0); if ((skip_group && all_order_fields_used) || select_limit == HA_POS_ERROR || @@ -561,10 +557,10 @@ JOIN::optimize() group=1; // For end_write_group } else - group= 0; + group_list= 0; } else if (thd->fatal_error) // End of memory - DBUG_RETURN(-1); + DBUG_RETURN(1); } group_list= remove_const(this, group_list, conds, &simple_group); if (!group_list && group) @@ -648,7 +644,7 @@ JOIN::optimize() (order && simple_order || group_list && simple_group)) { if (add_ref_to_table_cond(thd,&join_tab[const_tables])) - DBUG_RETURN(-1); + DBUG_RETURN(1); } if (!(select_options & SELECT_BIG_RESULT) && @@ -712,7 +708,7 @@ JOIN::exec() DBUG_ENTER("JOIN::exec"); - if (test_function_query) + if (!tables_list) { // Only test of functions error=0; if (select_options & SELECT_DESCRIBE) @@ -790,9 +786,9 @@ JOIN::exec() group_list : (ORDER*) 0), group_list ? 0 : select_distinct, group_list && simple_group, - (order == 0 || skip_sort_order) && - select_limit != HA_POS_ERROR, - select_options, unit))) + select_options, + (order == 0 || skip_sort_order) ? select_limit : + HA_POS_ERROR))) DBUG_VOID_RETURN; if (having_list && @@ -917,9 +913,8 @@ JOIN::exec() if (!(tmp_table2 = create_tmp_table(thd, &tmp_table_param, all_fields, (ORDER*) 0, select_distinct && !group_list, - 1, 0, - select_options, unit))) - DBUG_VOID_RETURN; + 1, select_options, HA_POS_ERROR))) + DBUG_VOID_RETURN; if (group_list) { thd->proc_info="Creating sort index"; @@ -1122,9 +1117,10 @@ mysql_select(THD *thd, TABLE_LIST *tables, List<Item> &fields, COND *conds, SELECT_LEX_UNIT *unit, SELECT_LEX *select_lex, bool fake_select_lex) { + int err; + bool free_join= 1; DBUG_ENTER("mysql_select"); - bool free_join= 1; JOIN *join; if (!fake_select_lex && select_lex->join != 0) { @@ -1168,13 +1164,13 @@ mysql_select(THD *thd, TABLE_LIST *tables, List<Item> &fields, COND *conds, } } - switch (join->optimize()) + if ((err= join->optimize())) { - case 1: - DBUG_RETURN(join->error); - case -1: - goto err; - } + if (err == -1) + DBUG_RETURN(join->error); + DBUG_ASSERT(err == 1); + goto err; // 1 + } if (thd->net.report_error || (free_join && join->global_optimize())) goto err; @@ -1187,13 +1183,13 @@ err: thd->limit_found_rows = join->send_records; thd->examined_row_count = join->examined_rows; thd->proc_info="end"; - int error= (fake_select_lex?join->error:join->cleanup(thd)) || - thd->net.report_error; + err= (fake_select_lex ? join->error : join->cleanup(thd)); + if (thd->net.report_error) + err= -1; delete join; - DBUG_RETURN(error); + DBUG_RETURN(err); } - else - DBUG_RETURN(join->error); + DBUG_RETURN(join->error); } /***************************************************************************** @@ -3887,8 +3883,7 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, TABLE * create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields, ORDER *group, bool distinct, bool save_sum_fields, - bool allow_distinct_limit, ulong select_options, - SELECT_LEX_UNIT *unit) + ulong select_options, ha_rows rows_limit) { TABLE *table; uint i,field_count,reclength,null_count,null_pack_length, @@ -3908,9 +3903,9 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields, uint temp_pool_slot=MY_BIT_NONE; DBUG_ENTER("create_tmp_table"); - DBUG_PRINT("enter",("distinct: %d save_sum_fields: %d allow_distinct_limit: %d group: %d", + DBUG_PRINT("enter",("distinct: %d save_sum_fields: %d rows_limit: %lu group: %d", (int) distinct, (int) save_sum_fields, - (int) allow_distinct_limit,test(group))); + (ulong) rows_limit,test(group))); statistic_increment(created_tmp_tables, &LOCK_status); @@ -4286,13 +4281,8 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields, null_pack_length-=hidden_null_pack_length; keyinfo->key_parts= ((field_count-param->hidden_field_count)+ test(null_pack_length)); - if (allow_distinct_limit) - { - set_if_smaller(table->max_rows, unit->select_limit_cnt); - param->end_write_records= unit->select_limit_cnt; - } - else - param->end_write_records= HA_POS_ERROR; + set_if_smaller(table->max_rows, rows_limit); + param->end_write_records= rows_limit; table->distinct=1; table->keys=1; if (blob_count) @@ -5679,7 +5669,7 @@ end_write_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), { if ((error=table->file->write_row(table->record[0]))) { - if (create_myisam_from_heap(join.thd, table, + if (create_myisam_from_heap(join->thd, table, &join->tmp_table_param, error, 0)) DBUG_RETURN(-1); // Not a table_is_full error @@ -6060,12 +6050,32 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit, } -/***************************************************************************** +/* If not selecting by given key, create an index how records should be read - return: 0 ok - -1 some fatal error - 1 no records -*****************************************************************************/ + + SYNOPSIS + create_sort_index() + thd Thread handler + tab Table to sort (in join structure) + order How table should be sorted + filesort_limit Max number of rows that needs to be sorted + select_limit Max number of rows in final output + Used to decide if we should use index or not + + + IMPLEMENTATION + - If there is an index that can be used, 'tab' is modified to use + this index. + - If no index, create with filesort() an index file that can be used to + retrieve rows in order (should be done with 'read_record'). + The sorted data is stored in tab->table and will be freed when calling + free_io_cache(tab->table). + + RETURN VALUES + 0 ok + -1 Some fatal error + 1 No records +*/ static int create_sort_index(THD *thd, JOIN_TAB *tab, ORDER *order, diff --git a/sql/sql_select.h b/sql/sql_select.h index 31693628be5..1fbe2052831 100644 --- a/sql/sql_select.h +++ b/sql/sql_select.h @@ -160,7 +160,7 @@ class JOIN :public Sql_alloc bool sort_and_group,first_record,full_join,group, no_field_update; bool do_send_rows; table_map const_table_map,found_const_table_map,outer_join; - ha_rows send_records,found_records,examined_rows,row_limit; + ha_rows send_records,found_records,examined_rows,row_limit, select_limit; POSITION positions[MAX_TABLES+1],best_positions[MAX_TABLES+1]; double best_read; List<Item> *fields; @@ -196,7 +196,6 @@ class JOIN :public Sql_alloc SQL_SELECT *select; //created in optimisation phase TABLE *exec_tmp_table; //used in 'exec' to hold temporary - my_bool test_function_query; // need to return select items 1 row const char *zero_result_cause; // not 0 if exec must return zero result my_bool union_part; // this subselect is part of union @@ -228,7 +227,6 @@ class JOIN :public Sql_alloc error(0), select(0), exec_tmp_table(0), - test_function_query(0), zero_result_cause(0) { fields_list = fields; @@ -261,16 +259,15 @@ void TEST_join(JOIN *join); bool store_val_in_field(Field *field,Item *val); TABLE *create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields, ORDER *group, bool distinct, bool save_sum_fields, - bool allow_distinct_limit, ulong select_options, - SELECT_LEX_UNIT *unit); + ulong select_options, ha_rows rows_limit); void free_tmp_table(THD *thd, TABLE *entry); void count_field_types(TMP_TABLE_PARAM *param, List<Item> &fields, bool reset_with_sum_func); bool setup_copy_fields(THD *thd, TMP_TABLE_PARAM *param,List<Item> &fields); void copy_fields(TMP_TABLE_PARAM *param); void copy_funcs(Item_result_field **func_ptr); -bool create_myisam_from_heap(TABLE *table, TMP_TABLE_PARAM *param, int error, - bool ignore_last_dupp_error); +bool create_myisam_from_heap(THD *thd, TABLE *table, TMP_TABLE_PARAM *param, + int error, bool ignore_last_dupp_error); /* functions from opt_sum.cc */ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds); diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 705152ee9f2..6e8c2ebdb5c 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -81,7 +81,8 @@ bool select_union::send_data(List<Item> &values) if (thd->net.last_errno == ER_RECORD_FILE_FULL) { thd->clear_error(); // do not report user about table overflow - if (create_myisam_from_heap(table, tmp_table_param, info.last_errno, 0)) + if (create_myisam_from_heap(thd, table, tmp_table_param, + info.last_errno, 0)) return 1; } else @@ -150,10 +151,9 @@ int st_select_lex_unit::prepare(THD *thd, select_result *result) tmp_table_param.field_count=item_list.elements; if (!(table= create_tmp_table(thd, &tmp_table_param, item_list, (ORDER*) 0, !union_option, - 1, 0, - (first_select()->options | thd->options | - TMP_TABLE_ALL_COLUMNS), - this))) + 1, (first_select()->options | thd->options | + TMP_TABLE_ALL_COLUMNS), + HA_POS_ERROR))) goto err; table->file->extra(HA_EXTRA_WRITE_CACHE); table->file->extra(HA_EXTRA_IGNORE_DUP_KEY); diff --git a/sql/sql_update.cc b/sql/sql_update.cc index 3aab5cd30a9..614d3d5803b 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -437,7 +437,7 @@ multi_update::multi_update(THD *thd_arg, TABLE_LIST *table_list, Connect fields with tables and create list of tables that are updated */ -int multi_update::prepare(List<Item> ¬_used_values) +int multi_update::prepare(List<Item> ¬_used_values, SELECT_LEX_UNIT *unit) { TABLE_LIST *table_ref; SQL_LIST update; @@ -531,7 +531,6 @@ int multi_update::prepare(List<Item> ¬_used_values) for (i=0 ; i < table_count ; i++) set_if_bigger(max_fields, fields_for_table[i]->elements); copy_field= new Copy_field[max_fields]; - init_ftfuncs(thd,1); DBUG_RETURN(thd->fatal_error != 0); } @@ -575,7 +574,7 @@ multi_update::initialize_tables(JOIN *join) /* ok to be on stack as this is not referenced outside of this func */ Field_string offset(table->file->ref_length, 0, "offset", - table, 1); + table, my_charset_bin); if (temp_fields.push_front(new Item_field(((Field *) &offset)))) DBUG_RETURN(1); @@ -591,8 +590,9 @@ multi_update::initialize_tables(JOIN *join) if (!(tmp_tables[cnt]=create_tmp_table(thd, tmp_param, temp_fields, - (ORDER*) &group, 0, 0, 0, - TMP_TABLE_ALL_COLUMNS))) + (ORDER*) &group, 0, 0, + TMP_TABLE_ALL_COLUMNS, + HA_POS_ERROR))) DBUG_RETURN(1); tmp_tables[cnt]->file->extra(HA_EXTRA_WRITE_CACHE); } @@ -682,7 +682,8 @@ bool multi_update::send_data(List<Item> ¬_used_values) (error != HA_ERR_FOUND_DUPP_KEY && error != HA_ERR_FOUND_DUPP_UNIQUE)) { - if (create_myisam_from_heap(table, tmp_table_param + offset, error, 1)) + if (create_myisam_from_heap(thd, table, tmp_table_param + offset, + error, 1)) { do_update=0; DBUG_RETURN(1); // Not a table_is_full error @@ -697,7 +698,7 @@ bool multi_update::send_data(List<Item> ¬_used_values) void multi_update::send_error(uint errcode,const char *err) { /* First send error what ever it is ... */ - ::send_error(&thd->net,errcode,err); + ::send_error(thd,errcode,err); /* If nothing updated return */ if (!updated) @@ -869,7 +870,7 @@ bool multi_update::send_eof() /* Safety: If we haven't got an error before (should not happen) */ my_message(ER_UNKNOWN_ERROR, "An error occured in multi-table update", MYF(0)); - ::send_error(&thd->net); + ::send_error(thd); return 1; } @@ -880,7 +881,7 @@ bool multi_update::send_eof() { query_cache_invalidate3(thd, update_tables, 1); } - ::send_ok(&thd->net, + ::send_ok(thd, (thd->client_capabilities & CLIENT_FOUND_ROWS) ? found : updated, thd->insert_id_used ? thd->insert_id() : 0L,buff); return 0; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 3109aadca38..d23efaa2a6d 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -814,7 +814,7 @@ create: THD *thd= YYTHD; LEX *lex=Lex; lex->sql_command= SQLCOM_CREATE_TABLE; - if (!lex->select_lex.add_table_to_list($5, + if (!lex->select_lex.add_table_to_list(thd,$5, ($2 & HA_LEX_CREATE_TMP_TABLE ? &tmp_table_alias : @@ -838,7 +838,7 @@ create: { LEX *lex=Lex; lex->sql_command= SQLCOM_CREATE_INDEX; - if (!lex->current_select->add_table_to_list($7,NULL,1)) + if (!lex->current_select->add_table_to_list(lex->thd, $7,NULL,1)) YYABORT; lex->create_list.empty(); lex->key_list.empty(); @@ -1058,7 +1058,7 @@ field_spec: type opt_attribute { LEX *lex=Lex; - if (add_field_to_list($1.str, + if (add_field_to_list(lex->thd, $1.str, (enum enum_field_types) $3, lex->length,lex->dec,lex->type, lex->default_value, lex->comment, @@ -1368,7 +1368,7 @@ alter: LEX *lex=&thd->lex; lex->sql_command = SQLCOM_ALTER_TABLE; lex->name=0; - if (!lex->select_lex.add_table_to_list($4, NULL,1)) + if (!lex->select_lex.add_table_to_list(thd, $4, NULL,1)) YYABORT; lex->drop_primary=0; lex->create_list.empty(); @@ -1423,7 +1423,7 @@ alter_list_item: type opt_attribute { LEX *lex=Lex; - if (add_field_to_list($3.str, + if (add_field_to_list(lex->thd,$3.str, (enum enum_field_types) $5, lex->length,lex->dec,lex->type, lex->default_value, lex->comment, @@ -1634,9 +1634,10 @@ table_to_table_list: table_to_table: table_ident TO_SYM table_ident { - SELECT_LEX_NODE *sl= Lex->current_select; - if (!sl->add_table_to_list($1,NULL,1,TL_IGNORE) || - !sl->add_table_to_list($3,NULL,1,TL_IGNORE)) + LEX *lex=Lex; + SELECT_LEX_NODE *sl= lex->current_select; + if (!sl->add_table_to_list(lex->thd, $1,NULL,1,TL_IGNORE) || + !sl->add_table_to_list(lex->thd, $3,NULL,1,TL_IGNORE)) YYABORT; }; @@ -1760,7 +1761,7 @@ select_item_list: | select_item | '*' { - if (add_item_to_list(new Item_field(NULL,NULL,"*"))) + if (add_item_to_list(YYTHD, new Item_field(NULL,NULL,"*"))) YYABORT; }; @@ -1768,7 +1769,7 @@ select_item_list: select_item: remember_name select_item2 remember_end select_alias { - if (add_item_to_list($2)) + if (add_item_to_list(YYTHD, $2)) YYABORT; if ($4.str) $2->set_name($4.str); @@ -2475,7 +2476,8 @@ join_table: { LEX *lex= Lex; SELECT_LEX_NODE *sel= lex->current_select; - if (!($$= sel->add_table_to_list($2, $3, 0, lex->lock_option, + if (!($$= sel->add_table_to_list(lex->thd, $2, $3, 0, + lex->lock_option, sel->get_use_index(), sel->get_ignore_index()))) YYABORT; @@ -2488,7 +2490,7 @@ join_table: SELECT_LEX_UNIT *unit= lex->current_select->master_unit(); lex->current_select= unit->outer_select(); if (!($$= lex->current_select-> - add_table_to_list(new Table_ident(unit), $5, 0, + add_table_to_list(lex->thd, new Table_ident(unit), $5, 0, lex->lock_option))) YYABORT; }; @@ -2623,9 +2625,9 @@ group_clause: group_list: group_list ',' order_ident order_dir - { if (add_group_to_list($3,(bool) $4)) YYABORT; } + { if (add_group_to_list(YYTHD, $3,(bool) $4)) YYABORT; } | order_ident order_dir - { if (add_group_to_list($1,(bool) $2)) YYABORT; }; + { if (add_group_to_list(YYTHD, $1,(bool) $2)) YYABORT; }; olap_opt: /* empty */ {} @@ -2684,9 +2686,9 @@ order_clause: order_list: order_list ',' order_ident order_dir - { if (add_order_to_list($3,(bool) $4)) YYABORT; } + { if (add_order_to_list(YYTHD, $3,(bool) $4)) YYABORT; } | order_ident order_dir - { if (add_order_to_list($1,(bool) $2)) YYABORT; }; + { if (add_order_to_list(YYTHD, $1,(bool) $2)) YYABORT; }; order_dir: /* empty */ { $$ = 1; } @@ -2881,7 +2883,7 @@ drop: lex->drop_list.empty(); lex->drop_list.push_back(new Alter_drop(Alter_drop::KEY, $3.str)); - if (!lex->current_select->add_table_to_list($5,NULL, 1)) + if (!lex->current_select->add_table_to_list(lex->thd, $5,NULL, 1)) YYABORT; } | DROP DATABASE if_exists ident @@ -2905,7 +2907,7 @@ table_list: table_name: table_ident - { if (!Select->add_table_to_list($1, NULL, 1)) YYABORT; }; + { if (!Select->add_table_to_list(YYTHD, $1, NULL, 1)) YYABORT; }; if_exists: /* empty */ { $$= 0; } @@ -3109,12 +3111,12 @@ update: update_list: update_list ',' simple_ident equal expr { - if (add_item_to_list($3) || add_value_to_list($5)) + if (add_item_to_list(YYTHD, $3) || add_value_to_list(YYTHD, $5)) YYABORT; } | simple_ident equal expr { - if (add_item_to_list($1) || add_value_to_list($3)) + if (add_item_to_list(YYTHD, $1) || add_value_to_list(YYTHD, $3)) YYABORT; }; @@ -3139,7 +3141,7 @@ delete: single_multi: FROM table_ident { - if (!Select->add_table_to_list($2, NULL, 1, Lex->lock_option)) + if (!Select->add_table_to_list(YYTHD, $2, NULL, 1, Lex->lock_option)) YYABORT; } where_clause opt_order_clause @@ -3160,14 +3162,14 @@ table_wild_list: table_wild_one: ident opt_wild { - if (!Select->add_table_to_list(new Table_ident($1), NULL, 1, + if (!Select->add_table_to_list(YYTHD, new Table_ident($1), NULL, 1, Lex->lock_option)) YYABORT; } | ident '.' ident opt_wild { - if (!Select->add_table_to_list(new Table_ident($1, $3, 0), NULL, 1, - Lex->lock_option)) + if (!Select->add_table_to_list(YYTHD, new Table_ident($1, $3, 0), + NULL, 1, Lex->lock_option)) YYABORT; } ; @@ -3240,7 +3242,7 @@ show_param: Lex->sql_command= SQLCOM_SHOW_FIELDS; if ($5) $4->change_db($5); - if (!Select->add_table_to_list($4, NULL, 0)) + if (!Select->add_table_to_list(YYTHD, $4, NULL, 0)) YYABORT; } | NEW_SYM MASTER_SYM FOR_SYM SLAVE WITH MASTER_LOG_FILE_SYM EQ @@ -3273,7 +3275,7 @@ show_param: Lex->sql_command= SQLCOM_SHOW_KEYS; if ($4) $3->change_db($4); - if (!Select->add_table_to_list($3, NULL, 0)) + if (!Select->add_table_to_list(YYTHD, $3, NULL, 0)) YYABORT; } | COLUMN_SYM TYPES_SYM @@ -3331,7 +3333,7 @@ show_param: | CREATE TABLE_SYM table_ident { Lex->sql_command = SQLCOM_SHOW_CREATE; - if(!Select->add_table_to_list($3, NULL,0)) + if(!Select->add_table_to_list(YYTHD, $3, NULL,0)) YYABORT; } | MASTER_SYM STATUS_SYM @@ -3376,7 +3378,7 @@ describe: lex->wild=0; lex->verbose=0; lex->sql_command=SQLCOM_SHOW_FIELDS; - if (!Select->add_table_to_list($2, NULL,0)) + if (!Select->add_table_to_list(lex->thd, $2, NULL,0)) YYABORT; } opt_describe_column {} @@ -3500,14 +3502,14 @@ load: LOAD DATA_SYM load_data_lock opt_local INFILE TEXT_STRING opt_duplicate INTO TABLE_SYM table_ident opt_field_term opt_line_term opt_ignore_lines opt_field_spec { - if (!Select->add_table_to_list($11, NULL, 1)) + if (!Select->add_table_to_list(YYTHD, $11, NULL, 1)) YYABORT; } | LOAD TABLE_SYM table_ident FROM MASTER_SYM { Lex->sql_command = SQLCOM_LOAD_MASTER_TABLE; - if (!Select->add_table_to_list($3, NULL, 1)) + if (!Select->add_table_to_list(YYTHD, $3, NULL, 1)) YYABORT; } @@ -3683,13 +3685,15 @@ ident_or_text: user: ident_or_text { - if (!($$=(LEX_USER*) sql_alloc(sizeof(st_lex_user)))) + THD *thd= YYTHD; + if (!($$=(LEX_USER*) thd->alloc(sizeof(st_lex_user)))) YYABORT; $$->user = $1; $$->host.str=NullS; } | ident_or_text '@' ident_or_text { - if (!($$=(LEX_USER*) sql_alloc(sizeof(st_lex_user)))) + THD *thd= YYTHD; + if (!($$=(LEX_USER*) thd->alloc(sizeof(st_lex_user)))) YYABORT; $$->user = $1; $$->host=$3; }; @@ -3936,7 +3940,7 @@ option_value: { THD *thd=YYTHD; LEX_USER *user; - if (!(user=(LEX_USER*) sql_alloc(sizeof(LEX_USER)))) + if (!(user=(LEX_USER*) thd->alloc(sizeof(LEX_USER)))) YYABORT; user->host.str=0; user->user.str=thd->priv_user; @@ -3973,7 +3977,7 @@ text_or_password: $$=$3.str; else { - char *buff=(char*) sql_alloc(HASH_PASSWORD_LENGTH+1); + char *buff=(char*) YYTHD->alloc(HASH_PASSWORD_LENGTH+1); make_scrambled_password(buff,$3.str); $$=buff; } @@ -4011,7 +4015,7 @@ table_lock_list: table_lock: table_ident opt_table_alias lock_option { - if (!Select->add_table_to_list($1, $2, 0, (thr_lock_type) $3)) + if (!Select->add_table_to_list(YYTHD, $1, $2, 0, (thr_lock_type) $3)) YYABORT; } ; @@ -4037,14 +4041,14 @@ handler: { LEX *lex= Lex; lex->sql_command = SQLCOM_HA_OPEN; - if (!lex->current_select->add_table_to_list($2, $4, 0)) + if (!lex->current_select->add_table_to_list(lex->thd, $2, $4, 0)) YYABORT; } | HANDLER_SYM table_ident CLOSE_SYM { LEX *lex= Lex; lex->sql_command = SQLCOM_HA_CLOSE; - if (!lex->current_select->add_table_to_list($2, 0, 0)) + if (!lex->current_select->add_table_to_list(lex->thd, $2, 0, 0)) YYABORT; } | HANDLER_SYM table_ident READ_SYM @@ -4054,7 +4058,7 @@ handler: lex->ha_rkey_mode= HA_READ_KEY_EXACT; /* Avoid purify warnings */ lex->current_select->select_limit= 1; lex->current_select->offset_limit= 0L; - if (!lex->current_select->add_table_to_list($2, 0, 0)) + if (!lex->current_select->add_table_to_list(lex->thd, $2, 0, 0)) YYABORT; } handler_read_or_scan where_clause opt_limit_clause { } @@ -4249,7 +4253,7 @@ opt_table: | table_ident { LEX *lex=Lex; - if (!lex->current_select->add_table_to_list($1,NULL,0)) + if (!lex->current_select->add_table_to_list(lex->thd, $1,NULL,0)) YYABORT; if (lex->grant == GLOBAL_ACLS) lex->grant = TABLE_ACLS & ~GRANT_ACL; @@ -4273,7 +4277,7 @@ grant_user: $$=$1; $1->password=$4; if ($4.length) { - char *buff=(char*) sql_alloc(HASH_PASSWORD_LENGTH+1); + char *buff=(char*) YYTHD->alloc(HASH_PASSWORD_LENGTH+1); if (buff) { make_scrambled_password(buff,$4.str); diff --git a/sql/table.h b/sql/table.h index 149cc6bca13..d24e4e1e422 100644 --- a/sql/table.h +++ b/sql/table.h @@ -118,7 +118,8 @@ struct st_table { table_map map; /* ID bit of table (1,2,4,8,16...) */ ulong version,flush_version; uchar *null_flags; - IO_CACHE *io_cache; /* If sorted trough filebyte *record_pointers; /* If sorted in memory */ + IO_CACHE *io_cache; /* If sorted trough filebyte */ + byte *record_pointers; /* If sorted in memory */ ha_rows found_records; /* How many records in sort */ ORDER *group; ha_rows quick_rows[MAX_KEY]; |