summaryrefslogtreecommitdiff
path: root/sql/item_func.cc
diff options
context:
space:
mode:
authorunknown <sergefp@mysql.com>2004-12-17 12:14:45 +0300
committerunknown <sergefp@mysql.com>2004-12-17 12:14:45 +0300
commitf7193b925455ede2b97ccde36c96732446d1db7e (patch)
treef7ea785d5b5af300f8d4c9b2b40248bf85ae34cf /sql/item_func.cc
parentae6f147a4f65b0392e61c6d447523fa9b6db186f (diff)
downloadmariadb-git-f7193b925455ede2b97ccde36c96732446d1db7e.tar.gz
Fix for BUG#6825: When calculating Item_func_neg::max_length, add 1 for '-'.
For numeric constants we only need to add, since the parser doesn't produce negative numbers. For strings we only add (we actually could substract 1 if given string is a constant and it has '-number' form but we're not doing that because * we set max_length bigger then necessary in other cases as well. * the current solution is simpler and safer (bigger max_length is better then cutting out) mysql-test/r/func_concat.result: Test for BUG#6825 mysql-test/r/metadata.result: Ajusted results according to fix of bug BUG#6825:length(-1) = 2 , not 1 mysql-test/t/func_concat.test: Test for BUG#6825
Diffstat (limited to 'sql/item_func.cc')
-rw-r--r--sql/item_func.cc16
1 files changed, 16 insertions, 0 deletions
diff --git a/sql/item_func.cc b/sql/item_func.cc
index 2d939f47716..413000f9d1b 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -775,9 +775,25 @@ longlong Item_func_neg::val_int()
void Item_func_neg::fix_length_and_dec()
{
+ enum Item_result arg_result= args[0]->result_type();
+ enum Item::Type arg_type= args[0]->type();
decimals=args[0]->decimals;
max_length=args[0]->max_length;
hybrid_type= REAL_RESULT;
+
+ /*
+ We need to account for added '-' in the following cases:
+ A) argument is a real or integer positive constant - in this case
+ argument's max_length is set to actual number of bytes occupied, and not
+ maximum number of bytes real or integer may require. Note that all
+ constants are non negative so we don't need to account for removed '-'.
+ B) argument returns a string.
+ */
+ if (arg_result == STRING_RESULT ||
+ (arg_type == REAL_ITEM && ((Item_real*)args[0])->value >= 0) ||
+ (arg_type == INT_ITEM && ((Item_int*)args[0])->value > 0))
+ max_length++;
+
if (args[0]->result_type() == INT_RESULT)
{
/*