diff options
author | monty@narttu.mysql.fi <> | 2003-09-24 10:24:55 +0300 |
---|---|---|
committer | monty@narttu.mysql.fi <> | 2003-09-24 10:24:55 +0300 |
commit | efd94f5ba972bb10d2d10fe46fc9153536941e92 (patch) | |
tree | 7a953ea10b82122bdf37cf7efc4cfd3fd9a20b17 /sql | |
parent | 0e5d07f4e245839f55b5dfe26e346195c5384590 (diff) | |
parent | 5ce5a68b4e520bad314e76645cc2718a5e5af92b (diff) | |
download | mariadb-git-efd94f5ba972bb10d2d10fe46fc9153536941e92.tar.gz |
Merge bk-internal.mysql.com:/home/bk/mysql-4.1
into narttu.mysql.fi:/my/mysql-4.1
Diffstat (limited to 'sql')
56 files changed, 245 insertions, 135 deletions
diff --git a/sql/client_settings.h b/sql/client_settings.h index e31a75bdddd..b357e52ec9d 100644 --- a/sql/client_settings.h +++ b/sql/client_settings.h @@ -32,5 +32,3 @@ #undef HAVE_SMEM #undef _CUSTOMCONFIG_ -#define cli_list_fields NULL - diff --git a/sql/derror.cc b/sql/derror.cc index 7ebe6e4b3c5..78efdcc33f3 100644 --- a/sql/derror.cc +++ b/sql/derror.cc @@ -49,6 +49,7 @@ static void read_texts(const char *file_name,const char ***point, char name[FN_REFLEN]; const char *buff; uchar head[32],*pos; + CHARSET_INFO *cset; DBUG_ENTER("read_texts"); *point=0; // If something goes wrong @@ -65,6 +66,21 @@ static void read_texts(const char *file_name,const char ***point, head[2] != 2 || head[3] != 1) goto err; /* purecov: inspected */ textcount=head[4]; + + if (!head[30]) + { + sql_print_error("Character set information not found in '%s'. \ +Please install the latest version of this file.",name); + goto err1; + } + + if (!(cset= get_charset(head[30],MYF(MY_WME)))) + { + sql_print_error("Character set #%d is not supported for messagefile '%s'", + (int)head[30],name); + goto err1; + } + length=uint2korr(head+6); count=uint2korr(head+8); if (count < error_messages) @@ -114,9 +130,10 @@ err: buff="Can't find messagefile '%s'"; break; } + sql_print_error(buff,name); +err1: if (file != FERR) VOID(my_close(file,MYF(MY_WME))); - sql_print_error(buff,name); unireg_abort(1); } /* read_texts */ diff --git a/sql/filesort.cc b/sql/filesort.cc index 13989bdae8f..1b481924690 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -1,4 +1,3 @@ - /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB This program is free software; you can redistribute it and/or modify diff --git a/sql/gen_lex_hash.cc b/sql/gen_lex_hash.cc index dc4f23db3b2..7126b7ee577 100644 --- a/sql/gen_lex_hash.cc +++ b/sql/gen_lex_hash.cc @@ -430,18 +430,9 @@ int main(int argc,char **argv) exit(1); printf("/* Copyright (C) 2001 MySQL AB\n\ - This program is free software; you can redistribute it and/or modify\n\ - it under the terms of the GNU General Public License as published by\n\ - the Free Software Foundation; either version 2 of the License, or\n\ - (at your option) any later version.\n\n\ - This program is distributed in the hope that it will be useful,\n\ - but WITHOUT ANY WARRANTY; without even the implied warranty of\n\ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\ - GNU General Public License for more details.\n\n\ - You should have received a copy of the GNU General Public License\n\ - along with this program; if not, write to the Free Software\n\ - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307\ - USA */\n\n"); + This software comes with ABSOLUTELY NO WARRANTY. This is free software,\n\ + and you are welcome to modify and redistribute it under the GPL license\n\ + \n*/\n\n"); printf("/* This code is generated by gen_lex_hash.cc that seeks for\ a perfect\nhash function */\n\n"); diff --git a/sql/ha_berkeley.cc b/sql/ha_berkeley.cc index ee1b54e5745..34915a6020c 100644 --- a/sql/ha_berkeley.cc +++ b/sql/ha_berkeley.cc @@ -2266,7 +2266,7 @@ static BDB_SHARE *get_share(const char *table_name, TABLE *table) strmov(share->table_name,table_name); share->key_file = key_file; share->key_type = key_type; - if (hash_insert(&bdb_open_tables, (byte*) share)) + if (my_hash_insert(&bdb_open_tables, (byte*) share)) { pthread_mutex_unlock(&bdb_mutex); /* purecov: inspected */ my_free((gptr) share,0); /* purecov: inspected */ diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index bc014c621fd..4ff5aba4a32 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -4583,7 +4583,7 @@ static INNOBASE_SHARE *get_share(const char *table_name) share->table_name_length=length; share->table_name=(char*) (share+1); strmov(share->table_name,table_name); - if (hash_insert(&innobase_open_tables, (mysql_byte*) share)) + if (my_hash_insert(&innobase_open_tables, (mysql_byte*) share)) { pthread_mutex_unlock(&innobase_mutex); my_free((gptr) share,0); diff --git a/sql/hash_filo.h b/sql/hash_filo.h index 92cd2658967..d1672e1a60c 100644 --- a/sql/hash_filo.h +++ b/sql/hash_filo.h @@ -116,7 +116,7 @@ public: last_link=last_link->prev_used; hash_delete(&cache,(byte*) tmp); } - if (hash_insert(&cache,(byte*) entry)) + if (my_hash_insert(&cache,(byte*) entry)) { if (free_element) (*free_element)(entry); // This should never happen diff --git a/sql/item.h b/sql/item.h index 9f767d502ba..b2d67a661a6 100644 --- a/sql/item.h +++ b/sql/item.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2003 +/* Copyright (C) 2000-2003 MySQL AB & MySQL Finland AB & TCX DataKonsult AB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 2179ef1188e..e7dc3933c10 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2003 +/* Copyright (C) 2000-2003 MySQL AB & MySQL Finland AB & TCX DataKonsult AB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/sql/item_func.cc b/sql/item_func.cc index fe419745b60..125f87aecec 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -1153,7 +1153,6 @@ longlong Item_func_locate::val_int() { String *a=args[0]->val_str(&value1); String *b=args[1]->val_str(&value2); - bool binary_cmp= (cmp_collation.collation->state & MY_CS_BINSORT) ? 1 : 0; if (!a || !b) { null_value=1; @@ -1161,55 +1160,26 @@ longlong Item_func_locate::val_int() } null_value=0; uint start=0; -#ifdef USE_MB uint start0=0; -#endif + int ind; + if (arg_count == 3) { - start=(uint) args[2]->val_int()-1; -#ifdef USE_MB - if (use_mb(cmp_collation.collation)) - { - start0=start; - if (!binary_cmp) - start=a->charpos(start); - } -#endif + start0= start =(uint) args[2]->val_int()-1; + start=a->charpos(start); + if (start > a->length() || start+b->length() > a->length()) return 0; } + if (!b->length()) // Found empty string at start return (longlong) (start+1); -#ifdef USE_MB - if (use_mb(cmp_collation.collation) && !binary_cmp) - { - const char *ptr=a->ptr()+start; - const char *search=b->ptr(); - const char *strend = ptr+a->length(); - const char *end=strend-b->length()+1; - const char *search_end=search+b->length(); - register uint32 l; - while (ptr < end) - { - if (*ptr == *search) - { - register char *i,*j; - i=(char*) ptr+1; j=(char*) search+1; - while (j != search_end) - if (*i++ != *j++) goto skipp; - return (longlong) start0+1; - } - skipp: - if ((l=my_ismbchar(cmp_collation.collation,ptr,strend))) - ptr+=l; - else ++ptr; - ++start0; - } - return 0; - } -#endif /* USE_MB */ - return (longlong) (binary_cmp ? a->strstr(*b,start) : - (a->strstr_case(*b,start)))+1; + + ind= cmp_collation.collation->coll->instr(cmp_collation.collation, + a->ptr()+start, a->length()-start, + b->ptr(), b->length()); + + return (longlong) (ind >= 0 ? ind + start0 + 1 : ind + 1); } @@ -1742,7 +1712,7 @@ public: pthread_cond_init(&cond,NULL); if (key) { - if (hash_insert(&hash_user_locks,(byte*) this)) + if (my_hash_insert(&hash_user_locks,(byte*) this)) { my_free((gptr) key,MYF(0)); key=0; @@ -2103,7 +2073,7 @@ static user_var_entry *get_variable(HASH *hash, LEX_STRING &name, entry->used_query_id=current_thd->query_id; entry->type=STRING_RESULT; memcpy(entry->name.str, name.str, name.length+1); - if (hash_insert(hash,(byte*) entry)) + if (my_hash_insert(hash,(byte*) entry)) { my_free((char*) entry,MYF(0)); return 0; diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index c4ad7f1e1e2..98e8ee3914e 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -34,7 +34,7 @@ #include "sha1.h" #include "my_aes.h" -String empty_string("",default_charset_info); +String my_empty_string("",default_charset_info); static void my_coll_agg_error(DTCollation &c1, DTCollation &c2, const char *fname) { @@ -359,7 +359,7 @@ String *Item_func_des_encrypt::val_str(String *str) if ((null_value=args[0]->null_value)) return 0; if ((res_length=res->length()) == 0) - return &empty_string; + return &my_empty_string; if (arg_count == 1) { @@ -520,7 +520,7 @@ String *Item_func_concat_ws::val_str(String *str) if ((res= args[i]->val_str(str))) break; if (i == arg_count) - return &empty_string; + return &my_empty_string; for (i++; i < arg_count ; i++) { @@ -661,7 +661,7 @@ String *Item_func_reverse::val_str(String *str) return 0; /* An empty string is a special case as the string pointer may be null */ if (!res->length()) - return &empty_string; + return &my_empty_string; res=copy_if_not_alloced(str,res,res->length()); ptr = (char *) res->ptr(); end=ptr+res->length(); @@ -914,7 +914,7 @@ String *Item_func_left::val_str(String *str) if ((null_value=args[0]->null_value)) return 0; if (length <= 0) - return &empty_string; + return &my_empty_string; length= res->charpos(length); if (res->length() > (ulong) length) { // Safe even if const arg @@ -958,7 +958,7 @@ String *Item_func_right::val_str(String *str) if ((null_value=args[0]->null_value)) return 0; /* purecov: inspected */ if (length <= 0) - return &empty_string; /* purecov: inspected */ + return &my_empty_string; /* purecov: inspected */ if (res->length() <= (uint) length) return res; /* purecov: inspected */ @@ -991,7 +991,7 @@ String *Item_func_substr::val_str(String *str) start=res->charpos(start); length=res->charpos(length,start); if (start < 0 || (uint) start+1 > res->length() || length <= 0) - return &empty_string; + return &my_empty_string; tmp_length=(int32) res->length()-start; length=min(length,tmp_length); @@ -1051,7 +1051,7 @@ String *Item_func_substr_index::val_str(String *str) null_value=0; uint delimeter_length=delimeter->length(); if (!res->length() || !delimeter_length || !count) - return &empty_string; // Wrong parameters + return &my_empty_string; // Wrong parameters res->set_charset(collation.collation); @@ -1335,7 +1335,7 @@ String *Item_func_password::val_str(String *str) if ((null_value=args[0]->null_value)) return 0; if (res->length() == 0) - return &empty_string; + return &my_empty_string; make_scrambled_password(tmp_value, res->c_ptr()); str->set(tmp_value, SCRAMBLED_PASSWORD_CHAR_LENGTH, res->charset()); return str; @@ -1357,7 +1357,7 @@ String *Item_func_old_password::val_str(String *str) if ((null_value=args[0]->null_value)) return 0; if (res->length() == 0) - return &empty_string; + return &my_empty_string; make_scrambled_password_323(tmp_value, res->c_ptr()); str->set(tmp_value, SCRAMBLED_PASSWORD_CHAR_LENGTH_323, res->charset()); return str; @@ -1383,7 +1383,7 @@ String *Item_func_encrypt::val_str(String *str) if ((null_value=args[0]->null_value)) return 0; if (res->length() == 0) - return &empty_string; + return &my_empty_string; if (arg_count == 1) { // generate random salt @@ -1473,7 +1473,7 @@ String *Item_func_user::val_str(String *str) // For system threads (e.g. replication SQL thread) user may be empty if (!thd->user) - return &empty_string; + return &my_empty_string; res_length= (strlen(thd->user)+strlen(host)+2) * cs->mbmaxlen; if (str->alloc(res_length)) @@ -1536,7 +1536,7 @@ String *Item_func_soundex::val_str(String *str) while (from != end && my_isspace(cs,*from)) // Skip pre-space from++; /* purecov: inspected */ if (from == end) - return &empty_string; // No alpha characters. + return &my_empty_string; // No alpha characters. *to++ = my_toupper(cs,*from); // Copy first letter last_ch = get_scode(cs,from); // code of the first letter // for the first 'double-letter check. @@ -1718,7 +1718,7 @@ String *Item_func_make_set::val_str(String *str) ulonglong bits; bool first_found=0; Item **ptr=args; - String *result=&empty_string; + String *result=&my_empty_string; bits=item->val_int(); if ((null_value=item->null_value)) @@ -1742,7 +1742,7 @@ String *Item_func_make_set::val_str(String *str) else { if (tmp_str.copy(*res)) // Don't use 'str' - return &empty_string; + return &my_empty_string; result= &tmp_str; } } @@ -1752,11 +1752,11 @@ String *Item_func_make_set::val_str(String *str) { // Copy data to tmp_str if (tmp_str.alloc(result->length()+res->length()+1) || tmp_str.copy(*result)) - return &empty_string; + return &my_empty_string; result= &tmp_str; } if (tmp_str.append(',') || tmp_str.append(*res)) - return &empty_string; + return &my_empty_string; } } } @@ -1853,7 +1853,7 @@ String *Item_func_repeat::val_str(String *str) goto err; // string and/or delim are null null_value=0; if (count <= 0) // For nicer SQL code - return &empty_string; + return &my_empty_string; if (count == 1) // To avoid reallocs return res; length=res->length(); @@ -2050,7 +2050,7 @@ String *Item_func_conv::val_str(String *str) dec= (longlong) my_strntoull(res->charset(),res->ptr(),res->length(),from_base,&endptr,&err); ptr= longlong2str(dec,ans,to_base); if (str->copy(ans,(uint32) (ptr-ans), default_charset())) - return &empty_string; + return &my_empty_string; return str; } @@ -2240,7 +2240,7 @@ String *Item_func_hex::val_str(String *str) return 0; ptr= longlong2str(dec,ans,16); if (str->copy(ans,(uint32) (ptr-ans),default_charset())) - return &empty_string; // End of memory + return &my_empty_string; // End of memory return str; } @@ -2539,6 +2539,11 @@ longlong Item_func_crc32::val_int() String *Item_func_compress::val_str(String *str) { String *res= args[0]->val_str(str); + if (!res) + { + null_value= 1; + return 0; + } if (res->is_empty()) return res; int err= Z_OK; @@ -2589,6 +2594,11 @@ String *Item_func_compress::val_str(String *str) String *Item_func_uncompress::val_str(String *str) { String *res= args[0]->val_str(str); + if (!res) + { + null_value= 1; + return 0; + } if (res->is_empty()) return res; ulong new_size= uint4korr(res->c_ptr()) & 0x3FFFFFFF; diff --git a/sql/lock.cc b/sql/lock.cc index 82004298453..ea5e60b558f 100644 --- a/sql/lock.cc +++ b/sql/lock.cc @@ -526,7 +526,7 @@ int lock_table_name(THD *thd, TABLE_LIST *table_list) table->locked_by_name=1; table_list->table=table; - if (hash_insert(&open_cache, (byte*) table)) + if (my_hash_insert(&open_cache, (byte*) table)) { my_free((gptr) table,MYF(0)); DBUG_RETURN(-1); diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index d4bacb57a38..1d7dd3aa5bb 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -577,6 +577,7 @@ void mysql_stmt_reset(THD *thd, char *packet); void mysql_stmt_get_longdata(THD *thd, char *pos, ulong packet_length); int check_insert_fields(THD *thd,TABLE *table,List<Item> &fields, List<Item> &values, ulong counter); +void setup_param_functions(Item_param *param, uchar param_type); /* sql_error.cc */ MYSQL_ERROR *push_warning(THD *thd, MYSQL_ERROR::enum_warning_level level, uint code, @@ -794,7 +795,7 @@ extern I_List<THD> threads; extern I_List<NAMED_LIST> key_caches; extern MY_BITMAP temp_pool; extern DATE_FORMAT dayord; -extern String empty_string; +extern String my_empty_string; extern SHOW_VAR init_vars[],status_vars[], internal_vars[]; extern struct show_table_type_st table_type_vars[]; extern SHOW_COMP_OPTION have_isam; @@ -803,6 +804,7 @@ extern SHOW_COMP_OPTION have_berkeley_db; extern struct system_variables global_system_variables; extern struct system_variables max_system_variables; extern struct rand_struct sql_rand; +extern String null_string; /* optional things, have_* variables */ diff --git a/sql/net_serv.cc b/sql/net_serv.cc index d39fca595ac..eac197e530b 100644 --- a/sql/net_serv.cc +++ b/sql/net_serv.cc @@ -460,7 +460,7 @@ net_real_write(NET *net,const char *packet,ulong len) #ifdef MYSQL_SERVER net->last_errno= ER_OUT_OF_RESOURCES; net->error= 2; - //TODO is it needed to set this variable if we have no socket + /* TODO is it needed to set this variable if we have no socket */ net->report_error= 1; #endif net->reading_or_writing= 0; @@ -889,7 +889,7 @@ my_net_read(NET *net) if (net->remain_in_buf) { - buf_length= net->buf_length; // Data left in old packet + buf_length= net->buf_length; /* Data left in old packet */ first_packet_offset= start_of_packet= (net->buf_length - net->remain_in_buf); /* Restore the character that was overwritten by the end 0 */ diff --git a/sql/protocol.cc b/sql/protocol.cc index d1eb3460fc8..79420fb71d5 100644 --- a/sql/protocol.cc +++ b/sql/protocol.cc @@ -28,6 +28,9 @@ #ifndef EMBEDDED_LIBRARY bool Protocol::net_store_data(const char *from, uint length) +#else +bool Protocol_prep::net_store_data(const char *from, uint length) +#endif { ulong packet_length=packet->length(); /* @@ -43,7 +46,6 @@ bool Protocol::net_store_data(const char *from, uint length) packet->length((uint) (to+length-packet->ptr())); return 0; } -#endif /* Send a error string to client */ @@ -1130,3 +1132,12 @@ bool Protocol_prep::store_time(TIME *tm) buff[0]=(char) length; // Length is stored first return packet->append(buff, length+1, PACKET_BUFFET_EXTRA_ALLOC); } + +#ifdef EMBEDDED_LIBRARY +/* Should be removed when we define the Protocol_cursor's future */ +bool Protocol_cursor::write() +{ + return Protocol_simple::write(); +} +#endif + diff --git a/sql/protocol.h b/sql/protocol.h index f32c135ab3c..94fd303e259 100644 --- a/sql/protocol.h +++ b/sql/protocol.h @@ -53,7 +53,11 @@ public: bool store(const char *from, CHARSET_INFO *cs); String *storage_packet() { return packet; } inline void free() { packet->free(); } +#ifndef EMBEDDED_LIBRARY bool write(); +#else + virtual bool write(); +#endif inline bool store(uint32 from) { return store_long((longlong) from); } inline bool store(longlong from) @@ -121,6 +125,10 @@ public: Protocol_prep(THD *thd) :Protocol(thd) {} virtual bool prepare_for_send(List<Item> *item_list); virtual void prepare_for_resend(); +#ifdef EMBEDDED_LIBRARY + virtual bool write(); + bool net_store_data(const char *from, uint length); +#endif virtual bool store_null(); virtual bool store_tiny(longlong from); virtual bool store_short(longlong from); @@ -170,3 +178,9 @@ char *net_store_length(char *packet,uint length); char *net_store_data(char *to,const char *from, uint length); char *net_store_data(char *to,int32 from); char *net_store_data(char *to,longlong from); + +#ifdef EMBEDDED_LIBRARY +bool setup_params_data(struct st_prep_stmt *stmt); +bool setup_params_data_withlog(struct st_prep_stmt *stmt); +#endif + diff --git a/sql/records.cc b/sql/records.cc index 72a6d480356..7ba9ff0f42f 100644 --- a/sql/records.cc +++ b/sql/records.cc @@ -1,4 +1,3 @@ - /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB This program is free software; you can redistribute it and/or modify diff --git a/sql/repl_failsafe.cc b/sql/repl_failsafe.cc index 5e040d26dc3..b931ce0ba8c 100644 --- a/sql/repl_failsafe.cc +++ b/sql/repl_failsafe.cc @@ -177,7 +177,7 @@ int register_slave(THD* thd, uchar* packet, uint packet_length) pthread_mutex_lock(&LOCK_slave_list); unregister_slave(thd,0,0); - res= hash_insert(&slave_list, (byte*) si); + res= my_hash_insert(&slave_list, (byte*) si); pthread_mutex_unlock(&LOCK_slave_list); return res; @@ -540,7 +540,7 @@ HOSTS"; goto err; } si->server_id = server_id; - hash_insert(&slave_list, (byte*)si); + my_hash_insert(&slave_list, (byte*)si); } strmake(si->host, row[1], sizeof(si->host)-1); si->port = atoi(row[port_ind]); diff --git a/sql/set_var.cc b/sql/set_var.cc index 199a398b497..147033be660 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -1302,7 +1302,7 @@ bool sys_var_collation::check(THD *thd, set_var *var) String str(buff,sizeof(buff), system_charset_info), *res; if (!(res=var->value->val_str(&str))) - res= &empty_string; + res= &my_empty_string; if (!(tmp=get_charset_by_name(res->c_ptr(),MYF(0)))) { @@ -1343,6 +1343,7 @@ bool sys_var_character_set::check(THD *thd, set_var *var) bool sys_var_character_set::update(THD *thd, set_var *var) { ci_ptr(thd,var->type)[0]= var->save_result.charset; + thd->update_charset(); return 0; } @@ -1924,7 +1925,7 @@ void set_var_init() { (*var)->name_length= strlen((*var)->name); (*var)->option_limits= find_option(my_long_options, (*var)->name); - hash_insert(&system_variable_hash, (byte*) *var); + my_hash_insert(&system_variable_hash, (byte*) *var); } /* Special cases diff --git a/sql/share/Makefile.am b/sql/share/Makefile.am index 35202ff4722..662159a9c63 100644 --- a/sql/share/Makefile.am +++ b/sql/share/Makefile.am @@ -30,7 +30,7 @@ install-data-local: fix_errors: for lang in @AVAILABLE_LANGUAGES@; \ do \ - ../../extra/comp_err $(srcdir)/$$lang/errmsg.txt $(srcdir)/$$lang/errmsg.sys; \ + ../../extra/comp_err -C$(srcdir)/charsets/ $(srcdir)/$$lang/errmsg.txt $(srcdir)/$$lang/errmsg.sys; \ done # Don't update the files from bitkeeper diff --git a/sql/share/czech/errmsg.txt b/sql/share/czech/errmsg.txt index e920a2139db..de7f1b43d26 100644 --- a/sql/share/czech/errmsg.txt +++ b/sql/share/czech/errmsg.txt @@ -10,6 +10,8 @@ Thu Nov 30 14:02:52 MET 2000 podle 3.23.28 */ +character-set=latin2 + "hashchk", "isamchk", "NE", diff --git a/sql/share/danish/errmsg.txt b/sql/share/danish/errmsg.txt index beea26d5f51..68a383df01e 100644 --- a/sql/share/danish/errmsg.txt +++ b/sql/share/danish/errmsg.txt @@ -4,6 +4,8 @@ /* Knud Riishøjgård knudriis@post.tele.dk 99 && Carsten H. Pedersen, carsten.pedersen@bitbybit.dk oct. 1999 / aug. 2001. */ +character-set=latin1 + "hashchk", "isamchk", "NEJ", diff --git a/sql/share/dutch/errmsg.txt b/sql/share/dutch/errmsg.txt index 6eca86deba2..1ccfd0d3cd6 100644 --- a/sql/share/dutch/errmsg.txt +++ b/sql/share/dutch/errmsg.txt @@ -12,6 +12,8 @@ Translated new error messages. */ +character-set=latin1 + "hashchk", "isamchk", "NEE", diff --git a/sql/share/english/errmsg.txt b/sql/share/english/errmsg.txt index 8b9ed103cbb..a8ed1f95ff7 100644 --- a/sql/share/english/errmsg.txt +++ b/sql/share/english/errmsg.txt @@ -1,6 +1,8 @@ /* Copyright Abandoned 1997 TCX DataKonsult AB & Monty Program KB & Detron HB This file is public domain and comes with NO WARRANTY of any kind */ +character-set=latin1 + "hashchk", "isamchk", "NO", diff --git a/sql/share/estonian/errmsg.txt b/sql/share/estonian/errmsg.txt index b4c17303ef0..5fcd5c830e8 100644 --- a/sql/share/estonian/errmsg.txt +++ b/sql/share/estonian/errmsg.txt @@ -6,6 +6,8 @@ */ +character-set=latin7 + "hashchk", "isamchk", "EI", diff --git a/sql/share/french/errmsg.txt b/sql/share/french/errmsg.txt index 9f321a908b6..cf8f38ec774 100644 --- a/sql/share/french/errmsg.txt +++ b/sql/share/french/errmsg.txt @@ -1,6 +1,8 @@ /* Copyright Abandoned 1997 TCX DataKonsult AB & Monty Program KB & Detron HB This file is public domain and comes with NO WARRANTY of any kind */ +character-set=latin1 + "hashchk", "isamchk", "NON", diff --git a/sql/share/german/errmsg.txt b/sql/share/german/errmsg.txt index b5b47091035..20edc56f4c8 100644 --- a/sql/share/german/errmsg.txt +++ b/sql/share/german/errmsg.txt @@ -10,6 +10,8 @@ 2002-12-11 */ +character-set=latin1 + "hashchk", "isamchk", "Nein", diff --git a/sql/share/greek/errmsg.txt b/sql/share/greek/errmsg.txt index cf6f45eea84..39429a9b0a3 100644 --- a/sql/share/greek/errmsg.txt +++ b/sql/share/greek/errmsg.txt @@ -1,6 +1,8 @@ /* Copyright Abandoned 1997 TCX DataKonsult AB & Monty Program KB & Detron HB This file is public domain and comes with NO WARRANTY of any kind */ +character-set=greek + "hashchk", "isamchk", "Ï×É", diff --git a/sql/share/hungarian/errmsg.txt b/sql/share/hungarian/errmsg.txt index 43dcfcd16d3..511f1e21743 100644 --- a/sql/share/hungarian/errmsg.txt +++ b/sql/share/hungarian/errmsg.txt @@ -3,6 +3,8 @@ Updated May, 2000 This file is public domain and comes with NO WARRANTY of any kind */ +character-set=latin2 + "hashchk", "isamchk", "NEM", diff --git a/sql/share/italian/errmsg.txt b/sql/share/italian/errmsg.txt index 125dca5310e..04011bc252e 100644 --- a/sql/share/italian/errmsg.txt +++ b/sql/share/italian/errmsg.txt @@ -1,6 +1,8 @@ /* Copyright Abandoned 1997 TCX DataKonsult AB & Monty Program KB & Detron HB This file is public domain and comes with NO WARRANTY of any kind */ +character-set=latin1 + "hashchk", "isamchk", "NO", diff --git a/sql/share/japanese/errmsg.txt b/sql/share/japanese/errmsg.txt index 1b73380df1c..944932e0d94 100644 --- a/sql/share/japanese/errmsg.txt +++ b/sql/share/japanese/errmsg.txt @@ -3,6 +3,8 @@ 3.22.10-beta euc-japanese (ujis) text */ +character-set=ujis + "hashchk", "isamchk", "NO", diff --git a/sql/share/korean/errmsg.txt b/sql/share/korean/errmsg.txt index a32a8f1033e..642d78887ed 100644 --- a/sql/share/korean/errmsg.txt +++ b/sql/share/korean/errmsg.txt @@ -1,6 +1,8 @@ /* Copyright Abandoned 1997 TCX DataKonsult AB & Monty Program KB & Detron HB This ÈÀÏ is public domain and comes with NO WARRANTY of any kind */ +character-set=euckr + "hashchk", "isamchk", "¾Æ´Ï¿À", diff --git a/sql/share/norwegian-ny/errmsg.txt b/sql/share/norwegian-ny/errmsg.txt index 83da00a5955..94992e2ef04 100644 --- a/sql/share/norwegian-ny/errmsg.txt +++ b/sql/share/norwegian-ny/errmsg.txt @@ -3,6 +3,8 @@ /* Roy-Magne Mo rmo@www.hivolda.no 97 */ +character-set=latin1 + "hashchk", "isamchk", "NEI", diff --git a/sql/share/norwegian/errmsg.txt b/sql/share/norwegian/errmsg.txt index 81cfad7e494..7da21c399eb 100644 --- a/sql/share/norwegian/errmsg.txt +++ b/sql/share/norwegian/errmsg.txt @@ -3,6 +3,8 @@ /* Roy-Magne Mo rmo@www.hivolda.no 97 */ +character-set=latin1 + "hashchk", "isamchk", "NEI", diff --git a/sql/share/polish/errmsg.txt b/sql/share/polish/errmsg.txt index 69b9c898ae7..adcdb536780 100644 --- a/sql/share/polish/errmsg.txt +++ b/sql/share/polish/errmsg.txt @@ -5,6 +5,8 @@ Charset ISO-8859-2 */ +character-set=latin2 + "hashchk", "isamchk", "NIE", diff --git a/sql/share/portuguese/errmsg.txt b/sql/share/portuguese/errmsg.txt index 2862e8036dc..af4e210a5b7 100644 --- a/sql/share/portuguese/errmsg.txt +++ b/sql/share/portuguese/errmsg.txt @@ -1,6 +1,9 @@ /* Copyright Abandoned 1997 TCX DataKonsult AB & Monty Program KB & Detron HB This file is public domain and comes with NO WARRANTY of any kind */ /* Updated by Thiago Delgado Pinto - thiagodp@ieg.com.br - 06.07.2002 */ + +character-set=latin1 + "hashchk", "isamchk", "NÃO", diff --git a/sql/share/romanian/errmsg.txt b/sql/share/romanian/errmsg.txt index 0591a082490..5b6fb9e4911 100644 --- a/sql/share/romanian/errmsg.txt +++ b/sql/share/romanian/errmsg.txt @@ -5,6 +5,8 @@ e-mail: tzoompy@cs.washington.edu */ +character-set=latin2 + "hashchk", "isamchk", "NU", diff --git a/sql/share/russian/errmsg.txt b/sql/share/russian/errmsg.txt index fe276396d92..ea9b8265b77 100644 --- a/sql/share/russian/errmsg.txt +++ b/sql/share/russian/errmsg.txt @@ -3,6 +3,8 @@ This file is public domain and comes with NO WARRANTY of any kind */ /* charset: KOI8-R */ +character-set=koi8r + "hashchk", "isamchk", "îåô", diff --git a/sql/share/serbian/errmsg.txt b/sql/share/serbian/errmsg.txt index 5869fa62c04..bb18a14c946 100644 --- a/sql/share/serbian/errmsg.txt +++ b/sql/share/serbian/errmsg.txt @@ -7,6 +7,8 @@ Charset: cp1250 */ +character-set=cp1250 + "hashchk", "isamchk", "NE", diff --git a/sql/share/slovak/errmsg.txt b/sql/share/slovak/errmsg.txt index 9cf4d874339..09f0517fd15 100644 --- a/sql/share/slovak/errmsg.txt +++ b/sql/share/slovak/errmsg.txt @@ -9,6 +9,8 @@ Date: Streda 11. November 1998 20:58:15 */ +character-set=latin2 + "hashchk", "isamchk", "NIE", diff --git a/sql/share/spanish/errmsg.txt b/sql/share/spanish/errmsg.txt index 72f4249b4c9..7a4dea69e0b 100644 --- a/sql/share/spanish/errmsg.txt +++ b/sql/share/spanish/errmsg.txt @@ -2,6 +2,9 @@ This file is public domain and comes with NO WARRANTY of any kind Traduccion por Miguel Angel Fernandez Roiz -- LoboCom Sistemas, s.l. From June 28, 2001 translated by Miguel Solorzano miguel@mysql.com */ + +character-set=latin1 + "hashchk", "isamchk", "NO", diff --git a/sql/share/swedish/errmsg.txt b/sql/share/swedish/errmsg.txt index cf7859712ee..d1c14bf7e4e 100644 --- a/sql/share/swedish/errmsg.txt +++ b/sql/share/swedish/errmsg.txt @@ -1,6 +1,8 @@ /* Copyright Abandoned 1997 TCX DataKonsult AB & Monty Program KB & Detron HB This file is public domain and comes with NO WARRANTY of any kind */ +character-set=latin1 + "hashchk", "isamchk", "NO", diff --git a/sql/share/ukrainian/errmsg.txt b/sql/share/ukrainian/errmsg.txt index 2e7a01d9573..8bd060781bb 100644 --- a/sql/share/ukrainian/errmsg.txt +++ b/sql/share/ukrainian/errmsg.txt @@ -6,6 +6,8 @@ * Version: 13/09/2001 mysql-3.23.41 */ +character-set=koi8u + "hashchk", "isamchk", "î¶", diff --git a/sql/slave.cc b/sql/slave.cc index 8490881f5dc..641707aab2f 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -790,7 +790,7 @@ int add_table_rule(HASH* h, const char* table_spec) e->tbl_name = e->db + (dot - table_spec) + 1; e->key_len = len; memcpy(e->db, table_spec, len); - (void)hash_insert(h, (byte*)e); + (void)my_hash_insert(h, (byte*)e); return 0; } diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index 7889a583fde..508ff88a0cf 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -1069,7 +1069,7 @@ static void init_check_host(void) else if (!hash_search(&acl_check_hosts,(byte*) &acl_user->host, (uint) strlen(acl_user->host.hostname))) { - if (hash_insert(&acl_check_hosts,(byte*) acl_user)) + if (my_hash_insert(&acl_check_hosts,(byte*) acl_user)) { // End of memory allow_all_hosts=1; // Should never happen DBUG_VOID_RETURN; @@ -1782,7 +1782,7 @@ public: privs = cols = 0; /* purecov: deadcode */ return; /* purecov: deadcode */ } - hash_insert(&hash_columns, (byte *) mem_check); + my_hash_insert(&hash_columns, (byte *) mem_check); } while (!col_privs->file->index_next(col_privs->record[0]) && !key_cmp(col_privs,key,0,key_len)); } @@ -1944,7 +1944,7 @@ static int replace_column_table(GRANT_TABLE *g_t, goto end; /* purecov: inspected */ } GRANT_COLUMN *grant_column = new GRANT_COLUMN(xx->column,privileges); - hash_insert(&g_t->hash_columns,(byte*) grant_column); + my_hash_insert(&g_t->hash_columns,(byte*) grant_column); } } table->file->index_end(); @@ -2295,7 +2295,7 @@ int mysql_table_grant(THD *thd, TABLE_LIST *table_list, result= -1; /* purecov: deadcode */ continue; /* purecov: deadcode */ } - hash_insert(&column_priv_hash,(byte*) grant_table); + my_hash_insert(&column_priv_hash,(byte*) grant_table); } /* If revoke_grant, calculate the new column privilege for tables_priv */ @@ -2538,7 +2538,7 @@ my_bool grant_init(THD *org_thd) { GRANT_TABLE *mem_check; if (!(mem_check=new GRANT_TABLE(t_table,c_table)) || - mem_check->ok() && hash_insert(&column_priv_hash,(byte*) mem_check)) + mem_check->ok() && my_hash_insert(&column_priv_hash,(byte*) mem_check)) { /* This could only happen if we are out memory */ grant_option= FALSE; /* purecov: deadcode */ diff --git a/sql/sql_base.cc b/sql/sql_base.cc index fa4f08b5f14..1e44aa6e46d 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -873,7 +873,7 @@ TABLE *open_table(THD *thd,const char *db,const char *table_name, table->version=refresh_version; table->flush_version=flush_version; DBUG_PRINT("info", ("inserting table %p into the cache", table)); - VOID(hash_insert(&open_cache,(byte*) table)); + VOID(my_hash_insert(&open_cache,(byte*) table)); } table->in_use=thd; diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc index f7742c6b7a7..fb86f52ab6e 100644 --- a/sql/sql_cache.cc +++ b/sql/sql_cache.cc @@ -823,7 +823,7 @@ void Query_cache::store_query(THD *thd, TABLE_LIST *tables_used) Query_cache_query *header = query_block->query(); header->init_n_lock(); - if (hash_insert(&queries, (byte*) query_block)) + if (my_hash_insert(&queries, (byte*) query_block)) { refused++; DBUG_PRINT("qcache", ("insertion in query hash")); @@ -2044,7 +2044,7 @@ Query_cache::insert_table(uint key_len, char *key, Query_cache_block_table *list_root = table_block->table(0); list_root->n = 0; list_root->next = list_root->prev = list_root; - if (hash_insert(&tables, (const byte *) table_block)) + if (my_hash_insert(&tables, (const byte *) table_block)) { DBUG_PRINT("qcache", ("Can't insert table to hash")); // write_block_data return locked block diff --git a/sql/sql_class.cc b/sql/sql_class.cc index d954d4dc22d..88e338d953b 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -583,7 +583,7 @@ sql_exchange::sql_exchange(char *name,bool flag) :file_name(name), opt_enclosed(0), dumpfile(flag), skip_lines(0) { field_term= &default_field_term; - enclosed= line_start= &empty_string; + enclosed= line_start= &my_empty_string; line_term= &default_line_term; escaped= &default_escaped; } diff --git a/sql/sql_class.h b/sql/sql_class.h index e0358fc25e9..da6aab8d266 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -341,7 +341,11 @@ typedef struct st_prep_stmt char last_error[MYSQL_ERRMSG_SIZE]; bool error_in_prepare, long_data_used; bool log_full_query; +#ifndef EMBEDDED_LIBRARY bool (*setup_params)(st_prep_stmt *stmt, uchar *pos, uchar *read_pos); +#else + bool (*setup_params_data)(st_prep_stmt *stmt); +#endif } PREP_STMT; @@ -422,6 +426,10 @@ class THD :public ilink public: #ifdef EMBEDDED_LIBRARY struct st_mysql *mysql; + struct st_mysql_data *data; + unsigned long client_stmt_id; + unsigned long client_param_count; + struct st_mysql_bind *client_params; #endif NET net; // client connection descriptor LEX lex; // parse tree descriptor diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 370ccd3c38b..de76fef85a9 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -161,7 +161,7 @@ static int get_or_create_user_conn(THD *thd, const char *user, if (max_user_connections && mqh->connections > max_user_connections) uc->user_resources.connections = max_user_connections; uc->intime=thd->thr_create_time; - if (hash_insert(&hash_user_connections, (byte*) uc)) + if (my_hash_insert(&hash_user_connections, (byte*) uc)) { my_free((char*) uc,0); send_error(thd, 0, NullS); // Out of memory @@ -1723,6 +1723,10 @@ mysql_execute_command(THD *thd) break; // Error message is given } + /* + In case of single SELECT unit->global_parameters points on first SELECT + TODO: move counters to SELECT_LEX + */ unit->offset_limit_cnt= (ha_rows) unit->global_parameters->offset_limit; unit->select_limit_cnt= (ha_rows) (unit->global_parameters->select_limit+ unit->global_parameters->offset_limit); diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 4abbbcaff1f..0ea3132eabc 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -77,7 +77,7 @@ Long data handling: #define STMT_QUERY_LOG_LENGTH 8192 extern int yyparse(void *thd); -static String null_string("NULL", 4, default_charset_info); +String null_string("NULL", 4, default_charset_info); /* Find prepared statement in thd @@ -142,6 +142,7 @@ void free_prep_stmt(PREP_STMT *stmt, TREE_FREE mode, void *not_used) Send prepared stmt info to client after prepare */ +#ifndef EMBEDDED_LIBRARY static bool send_prep_stmt(PREP_STMT *stmt, uint columns) { NET *net=&stmt->thd->net; @@ -150,14 +151,21 @@ static bool send_prep_stmt(PREP_STMT *stmt, uint columns) int4store(buff+1, stmt->stmt_id); int2store(buff+5, columns); int2store(buff+7, stmt->param_count); -#ifndef EMBEDDED_LIBRARY /* This should be fixed to work with prepared statements */ return (my_net_write(net, buff, sizeof(buff)) || net_flush(net)); +} #else - return true; -#endif +static bool send_prep_stmt(PREP_STMT *stmt, uint columns __attribute__((unused))) +{ + THD *thd= stmt->thd; + + thd->client_stmt_id= stmt->stmt_id; + thd->client_param_count= stmt->param_count; + + return 0; } +#endif /*!EMBEDDED_LIBRAYR*/ /* Send information about all item parameters @@ -345,7 +353,7 @@ static void setup_param_str(Item_param *param, uchar **pos) *pos+= len; } -static void setup_param_functions(Item_param *param, uchar param_type) +void setup_param_functions(Item_param *param, uchar param_type) { switch (param_type) { case FIELD_TYPE_TINY: @@ -391,6 +399,7 @@ static void setup_param_functions(Item_param *param, uchar param_type) } } +#ifndef EMBEDDED_LIBRARY /* Update the parameter markers by reading data from client packet and if binary/update log is set, generate the valid query. @@ -476,11 +485,7 @@ static bool setup_params_data(PREP_STMT *stmt) Item_param *param; DBUG_ENTER("setup_params_data"); -#ifndef EMBEDDED_LIBRARY uchar *pos=(uchar*) thd->net.read_pos+1+MYSQL_STMT_HEADER; //skip header -#else - uchar *pos= 0; //just to compile TODO code for embedded case -#endif uchar *read_pos= pos+(stmt->param_count+7) / 8; //skip null bits if (*read_pos++) //types supplied / first execute @@ -500,6 +505,8 @@ static bool setup_params_data(PREP_STMT *stmt) DBUG_RETURN(0); } +#endif /*!EMBEDDED_LIBRARY*/ + /* Validate the following information for INSERT statement: - field existance @@ -659,13 +666,13 @@ static bool mysql_test_select_fields(PREP_STMT *stmt, TABLE_LIST *tables, wild_num, conds, og_num, order, group, having, proc, select_lex, unit, 0)) DBUG_RETURN(1); -#ifndef EMBEDDED_LIBRARY if (send_prep_stmt(stmt, fields.elements) || thd->protocol_simple.send_fields(&fields, 0) || +#ifndef EMBEDDED_LIBRARY net_flush(&thd->net) || +#endif send_item_params(stmt)) DBUG_RETURN(1); -#endif join->cleanup(); } DBUG_RETURN(0); @@ -784,10 +791,18 @@ static bool init_param_items(PREP_STMT *stmt) if (mysql_bin_log.is_open() || mysql_update_log.is_open()) { stmt->log_full_query= 1; +#ifndef EMBEDDED_LIBRARY stmt->setup_params= insert_params_withlog; +#else + stmt->setup_params_data= setup_params_data_withlog; +#endif } else +#ifndef EMBEDDED_LIBRARY stmt->setup_params= insert_params; // not fully qualified query +#else + stmt->setup_params_data= setup_params_data; +#endif if (!stmt->param_count) stmt->param= (Item_param **)0; @@ -941,8 +956,13 @@ void mysql_stmt_execute(THD *thd, char *packet) } init_stmt_execute(stmt); +#ifndef EMBEDDED_LIBRARY if (stmt->param_count && setup_params_data(stmt)) DBUG_VOID_RETURN; +#else + if (stmt->param_count && (*stmt->setup_params_data)(stmt)) + DBUG_VOID_RETURN; +#endif if (!(specialflag & SPECIAL_NO_PRIOR)) my_pthread_setprio(pthread_self(),QUERY_PRIOR); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index ab985ffbc6d..ff41e9fd067 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -7196,7 +7196,7 @@ static int remove_dup_with_hash_index(THD *thd, TABLE *table, goto err; } else - (void) hash_insert(&hash, key_pos-key_length); + (void) my_hash_insert(&hash, key_pos-key_length); key_pos+=extra_length; } my_free((char*) key_buffer,MYF(0)); diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 8ea78e702e5..8ed4d6d7324 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1497,11 +1497,15 @@ int mysqld_show_collations(THD *thd, const char *wild) for ( cs= all_charsets ; cs < all_charsets+255 ; cs++ ) { CHARSET_INFO **cl; + if (!cs[0] || !(cs[0]->state & MY_CS_AVAILABLE) || + !(cs[0]->state & MY_CS_PRIMARY)) + continue; for ( cl= all_charsets; cl < all_charsets+255 ;cl ++) { - if (!cs[0] || !cl[0] || !my_charset_same(cs[0],cl[0]) || !(cs[0]->state & MY_CS_PRIMARY)) + if (!cl[0] || !(cl[0]->state & MY_CS_AVAILABLE) || + !my_charset_same(cs[0],cl[0])) continue; - if (cs[0] && !(wild && wild[0] && + if (!(wild && wild[0] && wild_case_compare(system_charset_info,cl[0]->name,wild))) { if (write_collation(protocol, cl[0])) @@ -1545,8 +1549,10 @@ int mysqld_show_charsets(THD *thd, const char *wild) for ( cs= all_charsets ; cs < all_charsets+255 ; cs++ ) { - if (cs[0] && (cs[0]->state & MY_CS_PRIMARY) && !(wild && wild[0] && - wild_case_compare(system_charset_info,cs[0]->name,wild))) + if (cs[0] && (cs[0]->state & MY_CS_PRIMARY) && + (cs[0]->state & MY_CS_AVAILABLE) && + !(wild && wild[0] && + wild_case_compare(system_charset_info,cs[0]->csname,wild))) { if (write_charset(protocol, cs[0])) goto err; diff --git a/sql/sql_udf.cc b/sql/sql_udf.cc index 99410bb34ac..c237b023e7b 100644 --- a/sql/sql_udf.cc +++ b/sql/sql_udf.cc @@ -345,7 +345,7 @@ static udf_func *add_udf(LEX_STRING *name, Item_result ret, char *dl, tmp->returns = ret; tmp->type = type; tmp->usage_count=1; - if (hash_insert(&udf_hash,(byte*) tmp)) + if (my_hash_insert(&udf_hash,(byte*) tmp)) return 0; using_udf_functions=1; return tmp; diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 2d7bee54da8..ae596625bf7 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -262,8 +262,23 @@ int st_select_lex_unit::exec() res= sl->join->reinit(); else { - offset_limit_cnt= sl->offset_limit; - select_limit_cnt= sl->select_limit+sl->offset_limit; + if (sl != global_parameters) + { + offset_limit_cnt= sl->offset_limit; + select_limit_cnt= sl->select_limit+sl->offset_limit; + } + else + { + offset_limit_cnt= 0; + /* + We can't use LIMIT at this stage if we are using ORDER BY for the + whole query + */ + if (sl->order_list.first) + select_limit_cnt= HA_POS_ERROR; + else + select_limit_cnt= sl->select_limit+sl->offset_limit; + } if (select_limit_cnt < sl->select_limit) select_limit_cnt= HA_POS_ERROR; // no limit @@ -352,14 +367,11 @@ int st_select_lex_unit::exec() { ulong options= thd->options; thd->lex.current_select= fake_select_lex; - if (select_cursor->braces) - { - offset_limit_cnt= global_parameters->offset_limit; - select_limit_cnt= global_parameters->select_limit + - global_parameters->offset_limit; - if (select_limit_cnt < global_parameters->select_limit) - select_limit_cnt= HA_POS_ERROR; // no limit - } + offset_limit_cnt= global_parameters->offset_limit; + select_limit_cnt= global_parameters->select_limit + + global_parameters->offset_limit; + if (select_limit_cnt < global_parameters->select_limit) + select_limit_cnt= HA_POS_ERROR; // no limit if (select_limit_cnt == HA_POS_ERROR) options&= ~OPTION_FOUND_ROWS; else if (found_rows_for_union && !describe) diff --git a/sql/table.cc b/sql/table.cc index a980e086d60..5e7991436a1 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -459,7 +459,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, if (outparam->timestamp_field == reg_field) outparam->timestamp_field_offset=i; if (use_hash) - (void) hash_insert(&outparam->name_hash,(byte*) *field_ptr); // Will never fail + (void) my_hash_insert(&outparam->name_hash,(byte*) *field_ptr); // Will never fail } *field_ptr=0; // End marker |