summaryrefslogtreecommitdiff
path: root/sql/item.cc
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2021-03-18 12:34:48 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2021-03-18 12:34:48 +0200
commit19052b6debc1aeb4ef6ccbc36cdc92c10cf968b6 (patch)
tree9eec011f81a7c4868283ed02b823771798fe45d4 /sql/item.cc
parenteb7c5530eccb7d6782077e5562f5a471d2ccbc01 (diff)
parentc557e9540ab6058713a7c78dfa3df366ea92dd92 (diff)
downloadmariadb-git-19052b6debc1aeb4ef6ccbc36cdc92c10cf968b6.tar.gz
Merge 10.2 into 10.3
Diffstat (limited to 'sql/item.cc')
-rw-r--r--sql/item.cc31
1 files changed, 22 insertions, 9 deletions
diff --git a/sql/item.cc b/sql/item.cc
index 7b15c7ddb43..a46d516ff29 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -1,6 +1,6 @@
/*
Copyright (c) 2000, 2018, Oracle and/or its affiliates.
- Copyright (c) 2010, 2020, MariaDB Corporation.
+ Copyright (c) 2010, 2021, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -9941,7 +9941,7 @@ bool Item_cache_int::cache_value()
return FALSE;
value_cached= TRUE;
value= example->val_int_result();
- null_value= example->null_value;
+ null_value_inside= null_value= example->null_value;
unsigned_flag= example->unsigned_flag;
return TRUE;
}
@@ -10098,7 +10098,7 @@ bool Item_cache_temporal::cache_value()
return false;
value_cached= true;
value= example->val_datetime_packed_result();
- null_value= example->null_value;
+ null_value_inside= null_value= example->null_value;
return true;
}
@@ -10109,7 +10109,7 @@ bool Item_cache_time::cache_value()
return false;
value_cached= true;
value= example->val_time_packed_result();
- null_value= example->null_value;
+ null_value_inside= null_value= example->null_value;
return true;
}
@@ -10199,7 +10199,7 @@ bool Item_cache_real::cache_value()
return FALSE;
value_cached= TRUE;
value= example->val_result();
- null_value= example->null_value;
+ null_value_inside= null_value= example->null_value;
return TRUE;
}
@@ -10271,7 +10271,8 @@ bool Item_cache_decimal::cache_value()
return FALSE;
value_cached= TRUE;
my_decimal *val= example->val_decimal_result(&decimal_value);
- if (!(null_value= example->null_value) && val != &decimal_value)
+ if (!(null_value_inside= null_value= example->null_value) &&
+ val != &decimal_value)
my_decimal2decimal(val, &decimal_value);
return TRUE;
}
@@ -10337,11 +10338,14 @@ Item *Item_cache_decimal::convert_to_basic_const_item(THD *thd)
bool Item_cache_str::cache_value()
{
if (!example)
+ {
+ DBUG_ASSERT(value_cached == FALSE);
return FALSE;
+ }
value_cached= TRUE;
value_buff.set(buffer, sizeof(buffer), example->collation.collation);
value= example->str_result(&value_buff);
- if ((null_value= example->null_value))
+ if ((null_value= null_value_inside= example->null_value))
value= 0;
else if (value != &value_buff)
{
@@ -10440,6 +10444,8 @@ Item *Item_cache_str::convert_to_basic_const_item(THD *thd)
bool Item_cache_row::setup(THD *thd, Item *item)
{
example= item;
+ null_value= true;
+
if (!values && allocate(thd, item->cols()))
return 1;
for (uint i= 0; i < item_count; i++)
@@ -10472,12 +10478,19 @@ bool Item_cache_row::cache_value()
if (!example)
return FALSE;
value_cached= TRUE;
- null_value= 0;
+ null_value= TRUE;
+ null_value_inside= false;
example->bring_value();
+
+ /*
+ For Item_cache_row null_value is set to TRUE only when ALL the values
+ inside the cache are NULL
+ */
for (uint i= 0; i < item_count; i++)
{
values[i]->cache_value();
- null_value|= values[i]->null_value;
+ null_value&= values[i]->null_value;
+ null_value_inside|= values[i]->null_value;
}
return TRUE;
}