summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <gkodinov/kgeorge@magare.gmz>2008-05-01 13:40:56 +0300
committerunknown <gkodinov/kgeorge@magare.gmz>2008-05-01 13:40:56 +0300
commitcf2b2cc506a8933ccaaf271e228bb9f6b70531ac (patch)
tree5c0e6812ec7cef44bb6c2aab09f99c464d88eb24 /sql
parentb9efbe48900eaa6faac245f59a62761f9eaed9cc (diff)
parentda7b9c58828ac3c2f76c79d288e49742067b11b2 (diff)
downloadmariadb-git-cf2b2cc506a8933ccaaf271e228bb9f6b70531ac.tar.gz
Merge bk-internal:/home/bk/mysql-5.0
into magare.gmz:/home/kgeorge/mysql/work/merge-5.0-bugteam
Diffstat (limited to 'sql')
-rw-r--r--sql/item.cc11
-rw-r--r--sql/my_decimal.h13
-rw-r--r--sql/sql_select.cc1
3 files changed, 20 insertions, 5 deletions
diff --git a/sql/item.cc b/sql/item.cc
index 553ba1b152c..9ff1f8c0084 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -4156,9 +4156,14 @@ static void convert_zerofill_number_to_string(Item **item, Field_num *field)
String tmp(buff,sizeof(buff), field->charset()), *res;
res= (*item)->val_str(&tmp);
- field->prepend_zeros(res);
- pos= (char *) sql_strmake (res->ptr(), res->length());
- *item= new Item_string(pos, res->length(), field->charset());
+ if ((*item)->is_null())
+ *item= new Item_null();
+ else
+ {
+ field->prepend_zeros(res);
+ pos= (char *) sql_strmake (res->ptr(), res->length());
+ *item= new Item_string(pos, res->length(), field->charset());
+ }
}
diff --git a/sql/my_decimal.h b/sql/my_decimal.h
index c661579ea66..6a0d05921ec 100644
--- a/sql/my_decimal.h
+++ b/sql/my_decimal.h
@@ -164,14 +164,23 @@ inline int check_result_and_overflow(uint mask, int result, my_decimal *val)
inline uint my_decimal_length_to_precision(uint length, uint scale,
bool unsigned_flag)
{
- return (uint) (length - (scale>0 ? 1:0) - (unsigned_flag ? 0:1));
+ /* Precision can't be negative thus ignore unsigned_flag when length is 0. */
+ DBUG_ASSERT(length || !scale);
+ return (uint) (length - (scale>0 ? 1:0) -
+ (unsigned_flag || !length ? 0:1));
}
inline uint32 my_decimal_precision_to_length(uint precision, uint8 scale,
bool unsigned_flag)
{
+ /*
+ When precision is 0 it means that original length was also 0. Thus
+ unsigned_flag is ignored in this case.
+ */
+ DBUG_ASSERT(precision || !scale);
set_if_smaller(precision, DECIMAL_MAX_PRECISION);
- return (uint32)(precision + (scale>0 ? 1:0) + (unsigned_flag ? 0:1));
+ return (uint32)(precision + (scale>0 ? 1:0) +
+ (unsigned_flag || !precision ? 0:1));
}
inline
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 976d7322f56..11062998e6a 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -832,6 +832,7 @@ JOIN::optimize()
"Impossible HAVING" : "Impossible WHERE"));
zero_result_cause= having_value == Item::COND_FALSE ?
"Impossible HAVING" : "Impossible WHERE";
+ tables= 0;
error= 0;
DBUG_RETURN(0);
}