diff options
author | unknown <sergefp@mysql.com> | 2004-12-21 02:32:30 +0300 |
---|---|---|
committer | unknown <sergefp@mysql.com> | 2004-12-21 02:32:30 +0300 |
commit | b4f4c5bd1c8642796e3b7e7a62142ce3a3070fee (patch) | |
tree | df61d2989f9bca8e0700cd0a12b763973c7bc18d /sql | |
parent | 05862273cb44524a70d3abda686a311ad6b553b1 (diff) | |
parent | f7193b925455ede2b97ccde36c96732446d1db7e (diff) | |
download | mariadb-git-b4f4c5bd1c8642796e3b7e7a62142ce3a3070fee.tar.gz |
Merge spetrunia@bk-internal.mysql.com:/home/bk/mysql-4.1
into mysql.com:/dbdata/psergey/mysql-4.1-bug6825
Diffstat (limited to 'sql')
-rw-r--r-- | sql/item_func.cc | 16 |
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) { /* |