From f44e41db38c44b1d6f6238aa1e1b0936814c43fb Mon Sep 17 00:00:00 2001 From: Dmitry Shulga Date: Wed, 27 Mar 2024 22:55:15 +0700 Subject: [PATCH] MDEV-33767: Memory leaks found in some tests run with --ps-protocol against a server built with the option -DWITH_PROTECT_STATEMENT_MEMROOT Found memory leaks were introduced by the commit a896bebfa6d00b0bb7685956196a7977d9273652 MDEV-18844 Implement EXCEPT ALL and INTERSECT ALL operations and caused by using a statement arena instead a runtime arena for allocation of objects having temporary life span by their nature. Aforementioned memory leaks were produced by running queries that typically use select with intersect, union or table values constructors. To fix these memory leaks use the runtime arena for allocation of Item_field objects used by set operations. Additionally, OOM handling added on allocation of aforementioned Item_field objects. --- sql/sql_union.cc | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 96929a128ac..c3c4198439a 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -1263,26 +1263,21 @@ bool st_select_lex_unit::join_union_item_types(THD *thd_arg, } -bool init_item_int(THD* thd, Item_int* &item) +static bool init_item_int(THD* thd, Item_int* &item) { if (!item) { - Query_arena *arena, backup_arena; - arena= thd->activate_stmt_arena_if_needed(&backup_arena); - item= new (thd->mem_root) Item_int(thd, 0); - if (arena) - thd->restore_active_arena(arena, &backup_arena); - if (!item) - return false; + return true; } else { item->value= 0; } - return true; + + return false; } @@ -1762,8 +1757,12 @@ cont: for(uint i= 0; i< hidden; i++) { - init_item_int(thd, addon_fields[i]); - types.push_front(addon_fields[i]); + if (init_item_int(thd, addon_fields[i]) || + types.push_front(addon_fields[i])) + { + types.empty(); + goto err; + } addon_fields[i]->name.str= i ? "__CNT_1" : "__CNT_2"; addon_fields[i]->name.length= 7; }