summaryrefslogtreecommitdiff
path: root/sql/item.h
diff options
context:
space:
mode:
authorunknown <timour@askmonty.org>2011-03-24 16:34:06 +0200
committerunknown <timour@askmonty.org>2011-03-24 16:34:06 +0200
commitec23949158b54e3c42bff4b4ec457f7cc2a1d182 (patch)
tree38272144d9b1cddb1065240e1c3b334a9e96fad7 /sql/item.h
parent8aaf9197d09ab3092bcacc23546d23fea93e4122 (diff)
downloadmariadb-git-ec23949158b54e3c42bff4b4ec457f7cc2a1d182.tar.gz
Fix LP BUG#715738
Analysis: A query with implicit grouping is one with aggregate functions and no GROUP BY clause. MariaDB inherits from MySQL an SQL extenstion that allows mixing aggregate functions with non-aggregate fields. If a query with such mixed select clause produces an empty result set, the meaning of aggregate functions is well defined - either NULL (MIN, MAX, etc.), or 0 (count(*)). However the non-aggregated fields must also have some value, and the only reasonable value in the case of empty result is NULL. The cause of the many wrong results was that if a field is declared as non-nullable (e.g. because it is a PK or NOT NULL), the semantic analysis and the optimization phases treat this field as non-nullable, and generate all related query plan elements based on this assumption. Later during execution, these incorrectly configured/generated query plan elements result in a wrong result because the selected fields are not null due to the not-null assumption during optimization. Solution: Detect before the context analysys phase that a query uses implicit grouping with mixed aggregates/non-aggregates, and set all fields as nullable. The parser already walks the SELECT clause, and already sets Item::with_sum_func for Items that reference aggreagate functions. The patch adds a symmetric Item::with_field so that all Items that reference an Item_field are marked during their construction at parse time in the same way as with aggregate function use.
Diffstat (limited to 'sql/item.h')
-rw-r--r--sql/item.h6
1 files changed, 5 insertions, 1 deletions
diff --git a/sql/item.h b/sql/item.h
index adbf7103de1..748a5258b1b 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -544,7 +544,11 @@ public:
of a query with ROLLUP */
bool null_value; /* if item is null */
bool unsigned_flag;
- bool with_sum_func;
+ bool with_sum_func; /* True if item contains a sum func */
+ /**
+ True if any item except Item_sum_func contains a field. Set during parsing.
+ */
+ bool with_field;
bool fixed; /* If item fixed with fix_fields */
bool is_autogenerated_name; /* indicate was name of this Item
autogenerated or set by user */