summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dbug/dbug.c45
-rw-r--r--dbug/user.r5
-rw-r--r--mysql-test/r/variables_debug.result12
-rw-r--r--mysql-test/t/disabled.def1
-rw-r--r--mysql-test/t/variables_debug.test12
-rw-r--r--mysys/my_thr_init.c1
-rw-r--r--sql/set_var.cc6
7 files changed, 65 insertions, 17 deletions
diff --git a/dbug/dbug.c b/dbug/dbug.c
index 7f4292d18b1..666ab2b3e3c 100644
--- a/dbug/dbug.c
+++ b/dbug/dbug.c
@@ -412,15 +412,11 @@ void _db_process_(const char *name)
cs->process= name;
}
+
/*
* FUNCTION
*
- * _db_set_ set current debugger settings
- *
- * SYNOPSIS
- *
- * VOID _db_set_(control)
- * char *control;
+ * DbugParse parse control string and set current debugger setting
*
* DESCRIPTION
*
@@ -444,7 +440,7 @@ void _db_process_(const char *name)
*
*/
-void _db_set_(CODE_STATE *cs, const char *control)
+static void DbugParse(CODE_STATE *cs, const char *control)
{
const char *end;
int rel=0;
@@ -674,6 +670,35 @@ void _db_set_(CODE_STATE *cs, const char *control)
/*
* FUNCTION
*
+ * _db_set_ set current debugger settings
+ *
+ * SYNOPSIS
+ *
+ * VOID _db_set_(control)
+ * char *control;
+ *
+ * DESCRIPTION
+ *
+ * Given pointer to a debug control string in "control",
+ * parses the control string, and sets up a current debug
+ * settings. Pushes a new debug settings if the current is
+ * set to the initial debugger settings.
+ */
+
+void _db_set_(CODE_STATE *cs, const char *control)
+{
+ get_code_state_or_return;
+
+ if (cs->stack == &init_settings)
+ PushState(cs);
+
+ DbugParse(cs, control);
+}
+
+
+/*
+ * FUNCTION
+ *
* _db_push_ push current debugger settings and set up new one
*
* SYNOPSIS
@@ -685,7 +710,7 @@ void _db_set_(CODE_STATE *cs, const char *control)
*
* Given pointer to a debug control string in "control", pushes
* the current debug settings, parses the control string, and sets
- * up a new debug settings with _db_set_()
+ * up a new debug settings with DbugParse()
*
*/
@@ -694,7 +719,7 @@ void _db_push_(const char *control)
CODE_STATE *cs=0;
get_code_state_or_return;
PushState(cs);
- _db_set_(cs, control);
+ DbugParse(cs, control);
}
/*
@@ -717,7 +742,7 @@ void _db_set_init_(const char *control)
CODE_STATE tmp_cs;
bzero((uchar*) &tmp_cs, sizeof(tmp_cs));
tmp_cs.stack= &init_settings;
- _db_set_(&tmp_cs, control);
+ DbugParse(&tmp_cs, control);
}
/*
diff --git a/dbug/user.r b/dbug/user.r
index e41367de321..19de840d0ad 100644
--- a/dbug/user.r
+++ b/dbug/user.r
@@ -730,8 +730,9 @@ warning will be given. The DBUG_POP macro has no arguments.
EX:\ \fCDBUG_POP\ ();\fR
.SP 1
.LI DBUG_SET\
-Modifies the current debugger state on top of the stack using the
-debug control string passed as the macro argument. Unless
+Modifies the current debugger state on top of the stack or pushes
+a new state if the current is set to the initial settings, using
+the debug control string passed as the macro argument. Unless
.I incremental
control string is used (see below), it's equivalent to a combination of
DBUG_POP and DBUG_PUSH.
diff --git a/mysql-test/r/variables_debug.result b/mysql-test/r/variables_debug.result
new file mode 100644
index 00000000000..9cd133dddb1
--- /dev/null
+++ b/mysql-test/r/variables_debug.result
@@ -0,0 +1,12 @@
+set debug= 'T';
+select @@debug;
+@@debug
+T
+set debug= '+P';
+select @@debug;
+@@debug
+P:T
+set debug= '-P';
+select @@debug;
+@@debug
+T
diff --git a/mysql-test/t/disabled.def b/mysql-test/t/disabled.def
index 670a9c6a755..9309d668a15 100644
--- a/mysql-test/t/disabled.def
+++ b/mysql-test/t/disabled.def
@@ -22,4 +22,3 @@ wait_timeout : Bug#32801 wait_timeout.test fails randomly
ctype_create : Bug#32965 main.ctype_create fails
status : Bug#32966 main.status fails
ps_ddl : Bug#12093 2007-12-14 pending WL#4165 / WL#4166
-query_cache_debug : Bug#34424: query_cache_debug.test leads to valgrind warnings
diff --git a/mysql-test/t/variables_debug.test b/mysql-test/t/variables_debug.test
new file mode 100644
index 00000000000..7dcaf246803
--- /dev/null
+++ b/mysql-test/t/variables_debug.test
@@ -0,0 +1,12 @@
+--source include/have_debug.inc
+
+#
+# Bug#34678 @@debug variable's incremental mode
+#
+
+set debug= 'T';
+select @@debug;
+set debug= '+P';
+select @@debug;
+set debug= '-P';
+select @@debug;
diff --git a/mysys/my_thr_init.c b/mysys/my_thr_init.c
index 1ba6e5ac92d..933674fa007 100644
--- a/mysys/my_thr_init.c
+++ b/mysys/my_thr_init.c
@@ -332,6 +332,7 @@ void my_thread_end(void)
/* tmp->dbug is allocated inside DBUG library */
if (tmp->dbug)
{
+ DBUG_POP();
free(tmp->dbug);
tmp->dbug=0;
}
diff --git a/sql/set_var.cc b/sql/set_var.cc
index 4c77cbfff82..64c79ed3bb3 100644
--- a/sql/set_var.cc
+++ b/sql/set_var.cc
@@ -3926,10 +3926,8 @@ bool sys_var_thd_dbug::update(THD *thd, set_var *var)
if (var->type == OPT_GLOBAL)
DBUG_SET_INITIAL(var ? var->value->str_value.c_ptr() : "");
else
- {
- DBUG_POP();
- DBUG_PUSH(var ? var->value->str_value.c_ptr() : "");
- }
+ DBUG_SET(var ? var->value->str_value.c_ptr() : "");
+
return 0;
}