summaryrefslogtreecommitdiff
path: root/sql/item_func.cc
diff options
context:
space:
mode:
authorunknown <monty@mashka.mysql.fi>2003-02-12 21:55:37 +0200
committerunknown <monty@mashka.mysql.fi>2003-02-12 21:55:37 +0200
commitfcb61f5917ee69bba91bd6a926db2eab4ac3eeb5 (patch)
tree3ac37e452f15c8f05e9d1f338a6050281f838048 /sql/item_func.cc
parent363fd89b92de2fc58e7910f7a27684308656ebda (diff)
downloadmariadb-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.cc28
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())