Skip to content

Commit 9a32e44

Browse files
author
Chaithra Gopalareddy
committed
Bug#36593235: MySQL server 8.3.0 crashes at
Item_rollup_sum_switcher::current_arg Problem is seen when a subquery containing a aggregate function with rollup is part of a row value comparator and if there were no rows returned from the subquery. cmp_item_row::store_value() evaluates the subquery and goes ahead to store the values of the expressions in the comparator without checking if the result was assigned for the subquery. This leads to evaluation of a rollup expression when it is marked as not to be evaluated as aggregation was completed earlier. For the failing query, AggregateIterator() does evaluate the expressions. However HAVING clause does not qualify the rows. So the result of the aggregation is never cached. If a subquery returns empty result, bring_value() would set the "null_value" to true. cmp_item_row::store_value() now stores the value of the underlying comparator objects only when the result is not null. Else the result is set to null. Change-Id: Ia04ee852f4c8daa50741f7a217c3fc6f9b250ac8
1 parent 4e90b9d commit 9a32e44

File tree

2 files changed

+26
-10
lines changed

2 files changed

+26
-10
lines changed

sql/item_cmpfunc.cc

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4684,11 +4684,16 @@ bool cmp_item_row::allocate_template_comparators(THD *thd, Item *item) {
46844684
void cmp_item_row::store_value(Item *item) {
46854685
DBUG_TRACE;
46864686
assert(comparators != nullptr);
4687-
item->bring_value();
46884687
item->null_value = false;
4689-
for (uint i = 0; i < n; i++) {
4690-
comparators[i]->store_value(item->element_index(i));
4691-
item->null_value |= item->element_index(i)->null_value;
4688+
item->bring_value();
4689+
if (item->null_value) {
4690+
set_null_value(/*nv=*/true);
4691+
} else {
4692+
item->null_value = false;
4693+
for (uint i = 0; i < n; i++) {
4694+
comparators[i]->store_value(item->element_index(i));
4695+
item->null_value |= item->element_index(i)->null_value;
4696+
}
46924697
}
46934698
}
46944699

@@ -4714,12 +4719,17 @@ bool cmp_item_row::allocate_value_comparators(MEM_ROOT *mem_root,
47144719

47154720
void cmp_item_row::store_value_by_template(cmp_item *t, Item *item) {
47164721
cmp_item_row *tmpl = (cmp_item_row *)t;
4717-
item->bring_value();
47184722
item->null_value = false;
4719-
for (uint i = 0; i < n; i++) {
4720-
comparators[i]->store_value_by_template(tmpl->comparators[i],
4721-
item->element_index(i));
4722-
item->null_value |= item->element_index(i)->null_value;
4723+
item->bring_value();
4724+
if (item->null_value) {
4725+
set_null_value(/*nv=*/true);
4726+
} else {
4727+
item->null_value = false;
4728+
for (uint i = 0; i < n; i++) {
4729+
comparators[i]->store_value_by_template(tmpl->comparators[i],
4730+
item->element_index(i));
4731+
item->null_value |= item->element_index(i)->null_value;
4732+
}
47234733
}
47244734
}
47254735

sql/item_cmpfunc.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1828,13 +1828,14 @@ class cmp_item {
18281828
virtual void store_value_by_template(cmp_item *, Item *item) {
18291829
store_value(item);
18301830
}
1831+
virtual void set_null_value(bool nv) = 0;
18311832
};
18321833

18331834
/// cmp_item which stores a scalar (i.e. non-ROW).
18341835
class cmp_item_scalar : public cmp_item {
18351836
protected:
18361837
bool m_null_value; ///< If stored value is NULL
1837-
void set_null_value(bool nv) { m_null_value = nv; }
1838+
void set_null_value(bool nv) override { m_null_value = nv; }
18381839
};
18391840

18401841
class cmp_item_string final : public cmp_item_scalar {
@@ -2199,6 +2200,11 @@ class cmp_item_row : public cmp_item {
21992200
int compare(const cmp_item *arg) const override;
22002201
cmp_item *make_same() override;
22012202
void store_value_by_template(cmp_item *tmpl, Item *) override;
2203+
void set_null_value(bool nv) override {
2204+
for (uint i = 0; i < n; i++) {
2205+
comparators[i]->set_null_value(nv);
2206+
}
2207+
}
22022208

22032209
private:
22042210
/**

0 commit comments

Comments
 (0)