diff options
author | unknown <monty@mashka.mysql.fi> | 2003-02-12 21:55:37 +0200 |
---|---|---|
committer | unknown <monty@mashka.mysql.fi> | 2003-02-12 21:55:37 +0200 |
commit | fcb61f5917ee69bba91bd6a926db2eab4ac3eeb5 (patch) | |
tree | 3ac37e452f15c8f05e9d1f338a6050281f838048 /sql/item_func.cc | |
parent | 363fd89b92de2fc58e7910f7a27684308656ebda (diff) | |
download | mariadb-git-fcb61f5917ee69bba91bd6a926db2eab4ac3eeb5.tar.gz |
Fixed a lot of wrong memory references as reported by valgrind
Portability fixes
Added new client function: mysql_get_server_version()
New server help code (From Victor Vagin)
Fixed wrong usage of binary()
Disabled RTREE usage for now.
BitKeeper/etc/ignore:
added scripts/fill_help_tables.sql
client/mysql.cc:
Some fixes when using 'help'
cmd-line-utils/libedit/compat.h:
Portability fix
cmd-line-utils/libedit/fgetln.c:
Portability fix
include/mysql.h:
Added new client function: mysql_get_server_version()
libmysql/libmysql.c:
Added new client function: mysql_get_server_version()
libmysqld/libmysqld.c:
Fixed prototype
mysql-test/install_test_db.sh:
Added creation of help tables
mysql-test/r/connect.result:
Added help tables
mysql-test/r/myisam.result:
Test of RTREE index
mysql-test/r/type_ranges.result:
updated results
mysql-test/t/myisam.test:
Test of RTREE index
mysql-test/t/type_ranges.test:
Updated test
mysys/charset.c:
Indentation change
mysys/my_symlink.c:
Removed compiler warning
scripts/fill_help_tables.sh:
Update for new help tables
sql/field.cc:
Indentation changes
sql/filesort.cc:
Optimized character set usage
sql/item_cmpfunc.cc:
Fix wrong usage of binary()
sql/item_cmpfunc.h:
Fix wrong usage of binary()
sql/item_func.cc:
Fix wrong usage of binary()
sql/item_func.h:
Fix wrong usage of binary()
sql/item_strfunc.cc:
Fix wrong usage of binary()
sql/item_sum.cc:
Fix wrong usage of binary()
sql/item_sum.h:
Fix wrong usage of binary()
sql/key.cc:
Indentation change
sql/lex.h:
HELP -> HELP_SYM
sql/mysql_priv.h:
Make get_field() more general
sql/password.c:
Indentation change + variable initialisation moved
sql/sql_acl.cc:
Make get_field() more general
sql/sql_base.cc:
Added comments + assertion for double call to mysql_lock_tables
sql/sql_cache.cc:
Indentation changes
sql/sql_class.h:
Added need_strxnfrm to SORT_FIELD to be able to optimise character set handling in filesort
sql/sql_derived.cc:
Renamed variables
sql/sql_help.cc:
New help functions (from Victor Vagin)
sql/sql_lex.cc:
Removed variables that doesn't have to be initialized for each query
sql/sql_lex.h:
Removed not used variable (olap)
sql/sql_parse.cc:
Fixed (not fatal) access of unitialized memory
Indentation / code cleanup
sql/sql_prepare.cc:
Indentaion cleanup
sql/sql_table.cc:
Disabled RTREE until 5.0
sql/sql_udf.cc:
Make get_field() more general
sql/sql_yacc.yy:
Removed access to uninitialized memory
Always set offset_limit and select_limit when using LIMIT (removed warnings)
Allow usage of 'help week'
sql/table.cc:
Make get_field() more general
More comments
sql/table.h:
Fixded type of TABLE_LIST->derived
sql/time.cc:
Stricter date / datetime handling (to be able to handle timestamps with days and microseconds)
strings/ctype-bin.c:
Added cha
Diffstat (limited to 'sql/item_func.cc')
-rw-r--r-- | sql/item_func.cc | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/sql/item_func.cc b/sql/item_func.cc index 788961a954d..2c8b9e97fb3 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -80,6 +80,7 @@ Item_func::Item_func(List<Item> &list): str_value.charset If this is a string function, set this to the character set for the first argument. + If any argument is binary, this is set to binary If for any item any of the defaults are wrong, then this can be fixed in the fix_length_and_dec() function that is called @@ -96,6 +97,7 @@ Item_func::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) { Item **arg,**arg_end; char buff[STACK_BUFF_ALLOC]; // Max argument in function + used_tables_cache=0; const_item_cache=1; @@ -103,6 +105,7 @@ Item_func::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) return 0; // Fatal error if flag is set! if (arg_count) { // Print purify happy + CHARSET_INFO *charset= 0; /* Set return character set to first argument if we are returning a string. @@ -115,15 +118,21 @@ Item_func::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) if ((*arg)->maybe_null) maybe_null=1; if ((*arg)->binary()) - set_charset(&my_charset_bin); + charset= &my_charset_bin; + else if (!charset && (*arg)->result_type() == STRING_RESULT) + charset= (*arg)->charset(); with_sum_func= with_sum_func || (*arg)->with_sum_func; used_tables_cache|=(*arg)->used_tables(); const_item_cache&= (*arg)->const_item(); } + /* + We must set charset here as fix_length_and_dec() may want to change + charset + */ + if (charset && result_type() == STRING_RESULT) + set_charset(charset); } fix_length_and_dec(); - if (result_type() == STRING_RESULT) - set_charset((*args)->charset()); fixed= 1; return 0; } @@ -847,6 +856,8 @@ void Item_func_min_max::fix_length_and_dec() if (args[i]->binary()) set_charset(&my_charset_bin); } + if (cmp_type == STRING_RESULT) + str_cmp_function= binary() ? stringcmp : sortcmp; } @@ -891,7 +902,7 @@ String *Item_func_min_max::val_str(String *str) res2= args[i]->val_str(res == str ? &tmp_value : str); if (res2) { - int cmp=binary() ? stringcmp(res,res2) : sortcmp(res,res2); + int cmp= (*str_cmp_function)(res,res2); if ((cmp_sign < 0 ? cmp : -cmp) < 0) res=res2; } @@ -994,7 +1005,6 @@ longlong Item_func_locate::val_int() { String *a=args[0]->val_str(&value1); String *b=args[1]->val_str(&value2); - bool binary_str = args[0]->binary() || args[1]->binary(); if (!a || !b) { null_value=1; @@ -1012,7 +1022,7 @@ longlong Item_func_locate::val_int() if (use_mb(a->charset())) { start0=start; - if (!binary_str) + if (!binary_cmp) start=a->charpos(start); } #endif @@ -1022,7 +1032,7 @@ longlong Item_func_locate::val_int() if (!b->length()) // Found empty string at start return (longlong) (start+1); #ifdef USE_MB - if (use_mb(a->charset()) && !binary_str) + if (use_mb(a->charset()) && !binary_cmp) { const char *ptr=a->ptr()+start; const char *search=b->ptr(); @@ -1049,7 +1059,7 @@ longlong Item_func_locate::val_int() return 0; } #endif /* USE_MB */ - return (longlong) (binary() ? a->strstr(*b,start) : + return (longlong) (binary_cmp ? a->strstr(*b,start) : (a->strstr_case(*b,start)))+1; } @@ -1662,7 +1672,7 @@ longlong Item_master_pos_wait::val_int() { THD* thd = current_thd; String *log_name = args[0]->val_str(&value); - int event_count; + int event_count= 0; null_value=0; if (thd->slave_thread || !log_name || !log_name->length()) |