Commit 73c626b8 authored by Bjorn Munch's avatar Bjorn Munch

Bug #12956584 MYSQLTEST: --ENABLE_X OR --DISABLE_X APPLYING ONLY TO NEXT COMMAND/STMT

  Added a keyword ONCE to add to those commands
  Some internal tables to keep track of which properties are
    temporarily overriden
  Added tests in mysqltest.test
  Updates to other tests will be done later
parent 875e8be2
......@@ -118,6 +118,41 @@ static char **default_argv;
static const char *load_default_groups[]= { "mysqltest", "client", 0 };
static char line_buffer[MAX_DELIMITER_LENGTH], *line_buffer_pos= line_buffer;
/* Info on properties that can be set with --enable_X and --disable_X */
struct property {
my_bool *var; /* Actual variable */
my_bool set; /* Has been set for ONE command */
my_bool old; /* If set, thus is the old value */
my_bool reverse; /* Varible is true if disabled */
const char *env_name; /* Env. variable name */
};
static struct property prop_list[] = {
{ &abort_on_error, 0, 1, 0, "$ENABLED_ABORT_ON_ERROR" },
{ &disable_connect_log, 0, 1, 1, "$ENABLED_CONNECT_LOG" },
{ &disable_info, 0, 1, 1, "$ENABLED_INFO" },
{ &display_metadata, 0, 0, 0, "$ENABLED_METADATA" },
{ &ps_protocol, 0, 0, 0, "$ENABLED_PS_PROTOCOL" },
{ &disable_query_log, 0, 0, 1, "$ENABLED_QUERY_LOG" },
{ &disable_result_log, 0, 0, 1, "$ENABLED_RESULT_LOG" },
{ &disable_warnings, 0, 0, 1, "$ENABLED_WARNINGS" }
};
static my_bool once_property= FALSE;
enum enum_prop {
P_ABORT= 0,
P_CONNECT,
P_INFO,
P_META,
P_PS,
P_QUERY,
P_RESULT,
P_WARN,
P_MAX
};
static uint start_lineno= 0; /* Start line of current command */
static uint my_end_arg= 0;
......@@ -712,6 +747,7 @@ void handle_error(struct st_command*,
unsigned int err_errno, const char *err_error,
const char *err_sqlstate, DYNAMIC_STRING *ds);
void handle_no_error(struct st_command*);
void revert_properties();
#ifdef EMBEDDED_LIBRARY
......@@ -1174,6 +1210,7 @@ void handle_command_error(struct st_command *command, uint error)
{
DBUG_PRINT("info", ("command \"%.*s\" failed with expected error: %d",
command->first_word_len, command->query, error));
revert_properties();
DBUG_VOID_RETURN;
}
if (command->expected_errors.count > 0)
......@@ -1188,6 +1225,7 @@ void handle_command_error(struct st_command *command, uint error)
command->first_word_len, command->query,
command->expected_errors.err[0].code.errnum);
}
revert_properties();
DBUG_VOID_RETURN;
}
......@@ -2267,6 +2305,50 @@ void var_set_errno(int sql_errno)
var_set_string("$mysql_errname", get_errname_from_code(sql_errno));
}
/* Functions to handle --disable and --enable properties */
void set_once_property(enum_prop prop, my_bool val)
{
property &pr= prop_list[prop];
pr.set= 1;
pr.old= *pr.var;
*pr.var= val;
var_set_int(pr.env_name, (val != pr.reverse));
once_property= TRUE;
}
void set_property(st_command *command, enum_prop prop, my_bool val)
{
char* p= command->first_argument;
if (p && !strcmp (p, "ONCE"))
{
command->last_argument= p + 4;
set_once_property(prop, val);
return;
}
property &pr= prop_list[prop];
*pr.var= val;
pr.set= 0;
var_set_int(pr.env_name, (val != pr.reverse));
}
void revert_properties()
{
if (! once_property)
return;
for (int i= 0; i < (int) P_MAX; i++)
{
property &pr= prop_list[i];
if (pr.set)
{
*pr.var= pr.old;
pr.set= 0;
var_set_int(pr.env_name, (pr.old != pr.reverse));
}
}
once_property=FALSE;
}
/*
Set variable from the result of a query
......@@ -4426,6 +4508,7 @@ void do_let(struct st_command *command)
var_set(var_name, var_name_end, let_rhs_expr.str,
(let_rhs_expr.str + let_rhs_expr.length));
dynstr_free(&let_rhs_expr);
revert_properties();
DBUG_VOID_RETURN;
}
......@@ -7354,6 +7437,7 @@ void handle_error(struct st_command *command,
dynstr_append(ds,"Got one of the listed errors\n");
}
/* OK */
revert_properties();
DBUG_VOID_RETURN;
}
......@@ -7381,6 +7465,7 @@ void handle_error(struct st_command *command,
command->expected_errors.err[0].code.sqlstate);
}
revert_properties();
DBUG_VOID_RETURN;
}
......@@ -7415,6 +7500,7 @@ void handle_no_error(struct st_command *command)
command->query, command->expected_errors.err[0].code.sqlstate);
}
revert_properties();
DBUG_VOID_RETURN;
}
......@@ -8475,60 +8561,46 @@ int main(int argc, char **argv)
case Q_DIRTY_CLOSE:
do_close_connection(command); break;
case Q_ENABLE_QUERY_LOG:
disable_query_log= 0;
var_set_int("$ENABLED_QUERY_LOG", 1);
set_property(command, P_QUERY, 0);
break;
case Q_DISABLE_QUERY_LOG:
disable_query_log= 1;
var_set_int("$ENABLED_QUERY_LOG", 0);
set_property(command, P_QUERY, 1);
break;
case Q_ENABLE_ABORT_ON_ERROR:
abort_on_error= 1;
var_set_int("$ENABLED_ABORT_ON_ERROR", 1);
set_property(command, P_ABORT, 1);
break;
case Q_DISABLE_ABORT_ON_ERROR:
abort_on_error= 0;
var_set_int("$ENABLED_ABORT_ON_ERROR", 0);
set_property(command, P_ABORT, 0);
break;
case Q_ENABLE_RESULT_LOG:
disable_result_log= 0;
var_set_int("$ENABLED_RESULT_LOG", 1);
set_property(command, P_RESULT, 0);
break;
case Q_DISABLE_RESULT_LOG:
disable_result_log=1;
var_set_int("$ENABLED_RESULT_LOG", 0);
set_property(command, P_RESULT, 1);
break;
case Q_ENABLE_CONNECT_LOG:
disable_connect_log=0;
var_set_int("$ENABLED_CONNECT_LOG", 1);
set_property(command, P_CONNECT, 0);
break;
case Q_DISABLE_CONNECT_LOG:
disable_connect_log=1;
var_set_int("$ENABLED_CONNECT_LOG", 0);
set_property(command, P_CONNECT, 1);
break;
case Q_ENABLE_WARNINGS:
disable_warnings= 0;
var_set_int("$ENABLED_WARNINGS", 1);
set_property(command, P_WARN, 0);
break;
case Q_DISABLE_WARNINGS:
disable_warnings= 1;
var_set_int("$ENABLED_WARNINGS", 0);
set_property(command, P_WARN, 1);
break;
case Q_ENABLE_INFO:
disable_info= 0;
var_set_int("$ENABLED_INFO", 1);
set_property(command, P_INFO, 0);
break;
case Q_DISABLE_INFO:
disable_info= 1;
var_set_int("$ENABLED_INFO", 0);
set_property(command, P_INFO, 1);
break;
case Q_ENABLE_METADATA:
display_metadata= 1;
var_set_int("$ENABLED_METADATA", 1);
set_property(command, P_META, 1);
break;
case Q_DISABLE_METADATA:
display_metadata= 0;
var_set_int("$ENABLED_METADATA", 0);
set_property(command, P_META, 0);
break;
case Q_SOURCE: do_source(command); break;
case Q_SLEEP: do_sleep(command, 0); break;
......@@ -8744,12 +8816,12 @@ int main(int argc, char **argv)
do_set_charset(command);
break;
case Q_DISABLE_PS_PROTOCOL:
ps_protocol_enabled= 0;
set_property(command, P_PS, 0);
/* Close any open statements */
close_statements();
break;
case Q_ENABLE_PS_PROTOCOL:
ps_protocol_enabled= ps_protocol;
set_property(command, P_PS, 1);
break;
case Q_DISABLE_RECONNECT:
set_reconnect(&cur_con->mysql, 0);
......
......@@ -160,6 +160,25 @@ after_--enable_abort_on_error
select 3 from t1 ;
ERROR 42S02: Table 'test.t1' doesn't exist
mysqltest: At line 1: query 'select 3 from t1' failed with wrong errno 1146: 'Table 'test.t1' doesn't exist', instead of 1064...
garbage;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'garbage' at line 1
select 2;
select 3;
3
3
select 5;
ERROR 42S02: Table 'test.t1' doesn't exist
select 7;
7
7
mysqltest: At line 1: End of line junk detected: "OCNE"
connect con1,localhost,root,,;
select 5 from t1;
lower
case
name
abc
xyz
hello
hello
;;;;;;;;
......
......@@ -383,6 +383,54 @@ select 3 from t1 ;
--error 1
--exec echo "disable_abort_on_error; enable_abort_on_error; error 1064; select 3 from t1; select 3 from t1;" | $MYSQL_TEST 2>&1
# ----------------------------------------------------------------------------
# Test --enable and --disable with ONCE
# ----------------------------------------------------------------------------
--disable_abort_on_error ONCE
garbage;
--disable_abort_on_error ONCE
--remove_file DoesNotExist
--disable_result_log
select 2;
--enable_result_log ONCE
select 3;
select 5;
--enable_result_log
# ----------------------------------------------------------------------------
# Test cumulative ONCE
# ----------------------------------------------------------------------------
--disable_abort_on_error ONCE
--disable_query_log ONCE
select 3 from t1;
select 7;
--error 1
--exec echo "--disable_info OCNE" | $MYSQL_TEST 2>&1
--enable_connect_log ONCE
connect (con1,localhost,root,,);
connection default;
disconnect con1;
# ----------------------------------------------------------------------------
# Test ONCE can be combined with --error or modifiers like lowercase
# ----------------------------------------------------------------------------
--disable_result_log ONCE
--error ER_NO_SUCH_TABLE
select 5 from t1;
--disable_query_log ONCE
--lowercase_result
select "CASE" as "LOWER";
--sorted_result
--disable_query_log ONCE
select "xyz" as name union select "abc" as name order by name desc;
# ----------------------------------------------------------------------------
# Test comments
......@@ -952,10 +1000,9 @@ while ($outer)
--source $MYSQLTEST_VARDIR/tmp/sourced.inc
--error ER_NO_SUCH_TABLE
SELECT * from nowhere;
--disable_abort_on_error
--disable_abort_on_error ONCE
# Statement giving a different error, to make sure we don't mask it
SELECT * FROM nowhere else;
--enable_abort_on_error
}
dec $outer;
inc $ifval;
......@@ -1104,9 +1151,8 @@ system echo "hej" > /dev/null;
--error 1
--exec echo "system $NONEXISTSINFVAREABLI;" | $MYSQL_TEST 2>&1
--disable_abort_on_error
--disable_abort_on_error ONCE
system NonExistsinfComamdn 2> /dev/null;
--enable_abort_on_error
# ----------------------------------------------------------------------------
......@@ -2517,10 +2563,9 @@ INSERT INTO t1 SELECT f1 - 64 FROM t1;
INSERT INTO t1 SELECT f1 - 128 FROM t1;
INSERT INTO t1 SELECT f1 - 256 FROM t1;
INSERT INTO t1 SELECT f1 - 512 FROM t1;
--disable_result_log
--disable_result_log ONCE
--sorted_result
SELECT * FROM t1;
--enable_result_log
DROP TABLE t1;
# ----------------------------------------------------------------------------
......@@ -2568,11 +2613,9 @@ SELECT 0 as "WILL NOT lower case
--exec $MYSQL_TEST --help 2>&1 > /dev/null
--exec $MYSQL_TEST --version 2>&1 > /dev/null
--enable_query_log
--disable_abort_on_error
--disable_abort_on_error ONCE
--error 1
--exec $MYSQL_TEST a b c 2>&1 > /dev/null
--enable_abort_on_error
--enable_query_log
# ----------------------------------------------------------------------------
# test for query_get_value
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment