From 0de9e40f4b167dfb1d600b362f8cf469e992cec7 Mon Sep 17 00:00:00 2001 From: Monty Date: Mon, 21 Oct 2024 15:05:14 +0300 Subject: [PATCH] Added status variable "stack_usable" to be able to check stack usage --- mysql-test/main/stack.result | 46 +++++++++++++++++++++++++++ mysql-test/main/stack.test | 60 ++++++++++++++++++++++++++++++++++++ sql/mysqld.cc | 16 ++++++++++ 3 files changed, 122 insertions(+) create mode 100644 mysql-test/main/stack.result create mode 100644 mysql-test/main/stack.test diff --git a/mysql-test/main/stack.result b/mysql-test/main/stack.result new file mode 100644 index 00000000000..a1f82a66104 --- /dev/null +++ b/mysql-test/main/stack.result @@ -0,0 +1,46 @@ +# Checking stack usage +# +# basic tests +# +select variable_value > 0 from information_schema.session_status where variable_name="stack_usage"; +variable_value > 0 +1 +# +# Ensure stack usage is same for each iteration when using WITH recursive +# +create table t1 +WITH recursive Fibonacci(PrevN, N, Stack) AS +( +SELECT 0, 1, 0 +UNION ALL +SELECT N, PrevN + N, (select variable_value from information_schema.session_status where variable_name="stack_usage") +FROM Fibonacci +WHERE N < 100000 +) +SELECT PrevN as N, Stack FROM Fibonacci; +select (select stack from t1 where n=2) = (select stack from t1 where N=75025); +(select stack from t1 where n=2) = (select stack from t1 where N=75025) +1 +DROP table t1; +# +# Check stack with recursion +# +set @@max_sp_recursion_depth=20; +create or replace procedure recursion(x int, max int, OUT res int) +begin +select variable_value into res from information_schema.session_status where variable_name="stack_usage"; +if (x < max) then +call recursion(x+1, max, res); +end if; +end; +$$ +call recursion(0,2,@s1); +call recursion(0,3,@s2); +call recursion(0,4,@s3); +select @s1 > 0 && @s2 > 0 && @s3 > 0; +@s1 > 0 && @s2 > 0 && @s3 > 0 +1 +drop procedure recursion; +# +# End of 10.5 tests +# diff --git a/mysql-test/main/stack.test b/mysql-test/main/stack.test new file mode 100644 index 00000000000..d25d4620dec --- /dev/null +++ b/mysql-test/main/stack.test @@ -0,0 +1,60 @@ +--echo # Checking stack usage + +--echo # +--echo # basic tests +--echo # + +select variable_value > 0 from information_schema.session_status where variable_name="stack_usage"; + + +--echo # +--echo # Ensure stack usage is same for each iteration when using WITH recursive +--echo # + +create table t1 +WITH recursive Fibonacci(PrevN, N, Stack) AS +( + SELECT 0, 1, 0 + UNION ALL + SELECT N, PrevN + N, (select variable_value from information_schema.session_status where variable_name="stack_usage") + FROM Fibonacci + WHERE N < 100000 +) +SELECT PrevN as N, Stack FROM Fibonacci; + +select (select stack from t1 where n=2) = (select stack from t1 where N=75025); +DROP table t1; + +--echo # +--echo # Check stack with recursion +--echo # + +set @@max_sp_recursion_depth=20; +delimiter $$; +create or replace procedure recursion(x int, max int, OUT res int) +begin + select variable_value into res from information_schema.session_status where variable_name="stack_usage"; + if (x < max) then + call recursion(x+1, max, res); + end if; +end; +$$ + +delimiter ;$$ + +call recursion(0,2,@s1); +call recursion(0,3,@s2); +call recursion(0,4,@s3); + +select @s1 > 0 && @s2 > 0 && @s3 > 0; +if (`select @s2-@s1 <> @s3 - @s2`) +{ + echo "Wrong result"; + select @s1 ,@s2, @s3, @s2-@s1, @s3-@s2; +} + +drop procedure recursion; + +--echo # +--echo # End of 10.5 tests +--echo # diff --git a/sql/mysqld.cc b/sql/mysqld.cc index f82e8e111c2..7663069e034 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -7315,6 +7315,21 @@ static int show_memory_used(THD *thd, SHOW_VAR *var, void *buff, } +static int show_stack_usage(THD *thd, SHOW_VAR *var, void *buff, + system_status_var *, enum_var_type scope) +{ + var->type= SHOW_ULONGLONG; + var->value= buff; + // We cannot get stack usage for 'global' or for another thread + if (scope == OPT_GLOBAL || thd != current_thd) + *(ulonglong*) buff= 0; + else + *(ulonglong*) buff= (ulonglong) (available_stack_size((char*) thd->thread_stack, + my_get_stack_pointer(0))); + return 0; +} + + #ifndef DBUG_OFF static int debug_status_func(THD *thd, SHOW_VAR *var, void *buff, system_status_var *, enum_var_type) @@ -7581,6 +7596,7 @@ SHOW_VAR status_vars[]= { {"Ssl_version", (char*) &show_ssl_get_version, SHOW_SIMPLE_FUNC}, #endif #endif /* HAVE_OPENSSL */ + SHOW_FUNC_ENTRY("stack_usage", &show_stack_usage), {"Syncs", (char*) &my_sync_count, SHOW_LONG_NOFLUSH}, /* Expression cache used only for caching subqueries now, so its statistic