From 2d4e44a91a753648cbe8732781412a11aeeff7c5 Mon Sep 17 00:00:00 2001 From: Sergei Petrunia Date: Wed, 4 Feb 2026 16:03:49 +0200 Subject: [PATCH 1/2] MDEV-38753: Debugging help: print which MEM_ROOT the object is on Add two functions intended for use from debugger: bool dbug_is_mem_on_mem_root(MEM_ROOT *mem_root, void *ptr); const char *dbug_which_mem_root(THD *thd, void *ptr); Also, collect declarations of all other functions intended for use from debugger in sql/sql_test.h --- sql/item.h | 6 ------ sql/sql_test.cc | 44 ++++++++++++++++++++++++++++++++++++++++++++ sql/sql_test.h | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 6 deletions(-) diff --git a/sql/item.h b/sql/item.h index c74097739d389..6caf2f0dd4b63 100644 --- a/sql/item.h +++ b/sql/item.h @@ -100,12 +100,6 @@ class ValueBuffer: public Value }; -#ifdef DBUG_OFF -static inline const char *dbug_print_item(Item *item) { return NULL; } -#else -const char *dbug_print_item(Item *item); -#endif - class Virtual_tmp_table; class sp_head; class Protocol; diff --git a/sql/sql_test.cc b/sql/sql_test.cc index 8afc6cad347c6..a5fc8a2c71a98 100644 --- a/sql/sql_test.cc +++ b/sql/sql_test.cc @@ -714,3 +714,47 @@ void print_keyuse_array_for_trace(THD *thd, DYNAMIC_ARRAY *keyuse_array) keyuse_elem.add("null_rejecting",keyuse->null_rejecting); } } + + +#ifndef DBUG_OFF + +/* Check if ptr points to memory on the mem_root */ + +bool dbug_is_mem_on_mem_root(const MEM_ROOT *mem_root, void *ptr) +{ + const USED_MEM *ptrs[]= {mem_root->free, mem_root->used}; + for (const USED_MEM **p= ptrs; p!=ptrs + 2; p++) + { + for (const USED_MEM *block= *p; block; block= block->next) + { + const char *start= (const char*)block; + const char *end= start + block->size - block->left; + DBUG_ASSERT(end >= start); + if (ptr >= start && ptr < end) + return true; + } + } + return false; +} + + +/* + Check whether ptr has been allocated on a statement mem_root + or transient mem_root or somewhere else. +*/ +const char *dbug_which_mem_root(THD *thd, void *ptr) +{ + if (dbug_is_mem_on_mem_root(thd->mem_root, ptr)) + { + if (thd->mem_root == thd->stmt_arena->mem_root) + return "thd->mem_root, same as stmt_arena->mem_root"; + return "thd->mem_root"; + } + + if (dbug_is_mem_on_mem_root(thd->stmt_arena->mem_root, ptr)) + return "thd->stmt_arena->mem_root"; + + return "Unknown"; +} + +#endif diff --git a/sql/sql_test.h b/sql/sql_test.h index 2ab305acd6686..ce154ed9954f7 100644 --- a/sql/sql_test.h +++ b/sql/sql_test.h @@ -23,9 +23,42 @@ class JOIN; struct TABLE_LIST; typedef class Item COND; typedef class st_select_lex SELECT_LEX; +typedef class st_select_lex_unit SELECT_LEX_UNIT; struct SORT_FIELD; +class SEL_ARG; + + +#ifndef DBUG_OFF +/* + Functions intended for manual use in debugger. NOT thread-safe. +*/ + +/* Print various data structures */ +const char *dbug_print_item(Item *item); +const char *dbug_print_select(SELECT_LEX *sl); +const char *dbug_print_unit(SELECT_LEX_UNIT *un); +const char *dbug_print_sel_arg(SEL_ARG *sel_arg); + +/* A single overloaded function (not inline so debugger sees them): */ +const char *dbug_print(Item *x); +const char *dbug_print(SELECT_LEX *x); +const char *dbug_print(SELECT_LEX_UNIT *x); + +/* Print current table row */ +const char* dbug_print_table_row(TABLE *table); +const char *dbug_print_row(TABLE *table, const uchar *rec); + +/* Check which MEM_ROOT the data is on */ +bool dbug_is_mem_on_mem_root(const MEM_ROOT *mem_root, void *ptr); +const char *dbug_which_mem_root(THD *thd, void *ptr); + +#else +// A dummy implementation is used in release builds +inline const char *dbug_print_item(Item *item) { return NULL; } +#endif #ifndef DBUG_OFF +/* Functions that print into DBUG_FILE (/tmp/mariadb.trace by default) */ void print_where(COND *cond,const char *info, enum_query_type query_type); void TEST_filesort(SORT_FIELD *sortorder,uint s_length); void TEST_join(JOIN *join); From 06322f5c3ed84a2a7bd67c8438614cc6204f63ac Mon Sep 17 00:00:00 2001 From: Sergei Petrunia Date: Thu, 5 Feb 2026 14:41:24 +0200 Subject: [PATCH 2/2] Add comment about Debug_key. --- sql/sql_debug.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sql/sql_debug.h b/sql/sql_debug.h index 003caec54544f..fe2b15ae8ccd7 100644 --- a/sql/sql_debug.h +++ b/sql/sql_debug.h @@ -19,6 +19,9 @@ */ +/* + Used in mtr tests to check index flags and key part flags and datatypes. +*/ class Debug_key: public String { public: