From 2b185547447b507cc042e90289aa39b73de9a16f Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 8 Sep 2003 10:53:51 +0500 Subject: [PATCH 1/3] #1169: Add --exec command to mysqltest --- client/mysqltest.c | 65 ++++++++++++++++++++++++++++++++++++ mysql-test/mysql-test-run.sh | 8 +++++ 2 files changed, 73 insertions(+) diff --git a/client/mysqltest.c b/client/mysqltest.c index 3b814b27810..7b5aee49bd5 100644 --- a/client/mysqltest.c +++ b/client/mysqltest.c @@ -204,6 +204,7 @@ Q_WAIT_FOR_SLAVE_TO_STOP, Q_REQUIRE_VERSION, Q_ENABLE_WARNINGS, Q_DISABLE_WARNINGS, Q_ENABLE_INFO, Q_DISABLE_INFO, +Q_EXEC, Q_UNKNOWN, /* Unknown command. */ Q_COMMENT, /* Comments, ignored. */ Q_COMMENT_WITH_COMMAND @@ -267,6 +268,7 @@ const char *command_names[]= "disable_warnings", "enable_info", "disable_info", + "exec", 0 }; @@ -840,6 +842,66 @@ int do_source(struct st_query* q) return open_file(name); } +/* + Execute given command. + + SYNOPSIS + do_exec() + q called command + + DESCRIPTION + If one uses --exec command [args] command in .test file + we will execute the command and record its output. + + RETURN VALUES + 0 ok + 1 error +*/ + +int do_exec(struct st_query* q) +{ + int error= 0; + DYNAMIC_STRING *ds; + DYNAMIC_STRING ds_tmp; + char buf[1024]; + FILE *res_file; + char *cmd= q->first_argument; + + while (*cmd && my_isspace(charset_info, *cmd)) + cmd++; + if (!*cmd) + die("Missing argument in exec\n"); + + if (q->record_file[0]) + { + init_dynamic_string(&ds_tmp, "", 16384, 65536); + ds= &ds_tmp; + } + else + ds= &ds_res; + + if (!(res_file= popen(cmd, "r")) && q->abort_on_error) + die("popen() failed\n"); + while (fgets(buf, sizeof(buf), res_file)) + dynstr_append(ds, buf); + pclose(res_file); + if (record) + { + if (!q->record_file[0] && !result_file) + die("At line %u: Missing result file", start_lineno); + if (!result_file) + str_to_file(q->record_file, ds->str, ds->length); + } + else if (q->record_file[0]) + { + error= check_result(ds, q->record_file, q->require_file); + } + if (ds == &ds_tmp) + dynstr_free(&ds_tmp); + + return error; +} + int var_query_set(VAR* v, const char* p, const char** p_end) { char* end = (char*)((p_end && *p_end) ? *p_end : p + strlen(p)); @@ -2584,6 +2646,9 @@ int main(int argc, char **argv) case Q_PING: (void) mysql_ping(&cur_con->mysql); break; + case Q_EXEC: + (void) do_exec(q); + break; default: processed = 0; break; } } diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index f11cad4a13e..bfe6d2cebb8 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -431,6 +431,11 @@ if [ x$SOURCE_DIST = x1 ] ; then else MYSQL_TEST="$BASEDIR/client/mysqltest" fi + if [ -f "$BASEDIR/client/.libs/mysqldump" ] ; then + MYSQL_DUMP="$BASEDIR/client/.libs/mysqldump --no-defaults -uroot --socket=$MASTER_MYSOCK" + else + MYSQL_DUMP="$BASEDIR/client/mysqldump --no-defaults -uroot --socket=$MASTER_MYSOCK" + fi if [ -n "$STRACE_CLIENT" ]; then MYSQL_TEST="strace -o $MYSQL_TEST_DIR/var/log/mysqltest.strace $MYSQL_TEST" fi @@ -452,6 +457,7 @@ else MYSQLD="$VALGRIND $BASEDIR/bin/mysqld" fi MYSQL_TEST="$BASEDIR/bin/mysqltest" + MYSQL_DUMP="$BASEDIR/bin/mysqldump --no-defaults -uroot --socket=$MASTER_MYSOCK" MYSQLADMIN="$BASEDIR/bin/mysqladmin" WAIT_PID="$BASEDIR/bin/mysql_waitpid" MYSQL_MANAGER="$BASEDIR/bin/mysqlmanager" @@ -469,6 +475,8 @@ else fi fi +export MYSQL_DUMP + if [ -z "$MASTER_MYSQLD" ] then MASTER_MYSQLD=$MYSQLD From 1d3d64d69b9bf96a18768df031dc2cad29e84b15 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 8 Sep 2003 17:30:53 +0500 Subject: [PATCH 2/3] Fix for the bug #1209: SELECT DATABASE(). --- mysql-test/r/create.result | 13 +++++++++++++ mysql-test/t/create.test | 16 ++++++++++++++++ sql/item_strfunc.cc | 4 ++-- sql/sql_db.cc | 2 ++ 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/create.result b/mysql-test/r/create.result index 80ff8aef15b..06ddd5e2280 100644 --- a/mysql-test/r/create.result +++ b/mysql-test/r/create.result @@ -361,3 +361,16 @@ a b c d e f g h dd 1 -7 7 2000-01-01 b 2000-01-01 00:00:00 05:04:03 yet another binary data 02:00:00 2 -2 2 1825-12-14 a 2003-01-01 03:02:01 04:03:02 binary data 02:00:00 drop table t1, t2; +drop database if exists test_$1; +create database test_$1; +use test_$1; +select database(); +database() +test_$1 +drop database test_$1; +select database(); +database() +NULL +select database(); +database() +NULL diff --git a/mysql-test/t/create.test b/mysql-test/t/create.test index 2e21768dc0b..0b86b67fdbf 100644 --- a/mysql-test/t/create.test +++ b/mysql-test/t/create.test @@ -260,3 +260,19 @@ select * from t2; drop table t1, t2; +# +# Bug #1209 +# + +--disable_warnings +drop database if exists test_$1; +--enable_warnings +create database test_$1; +use test_$1; +select database(); +drop database test_$1; +select database(); + +# Connect without a database +connect (user4,localhost,mysqltest_1,,*NO-ONE*); +select database(); diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index f8cc602129f..c4ad7f1e1e2 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1454,8 +1454,8 @@ String *Item_func_database::val_str(String *str) THD *thd= current_thd; if (!thd->db) { - str->length(0); - str->set_charset(system_charset_info); + null_value= 1; + return 0; } else str->copy((const char*) thd->db,(uint) strlen(thd->db),system_charset_info); diff --git a/sql/sql_db.cc b/sql/sql_db.cc index 34e81402dd0..343eb6e42f2 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -391,6 +391,8 @@ int mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent) exit: start_waiting_global_read_lock(thd); + if (thd->db && !strcmp(thd->db, db)) + thd->db= 0; exit2: VOID(pthread_mutex_unlock(&LOCK_mysql_create_db)); From b7f06b9439a44ddc49980d3b93e9b317a555aa7d Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 10 Sep 2003 11:19:01 +0500 Subject: [PATCH 3/3] Fix for the fix for the bug #1209: SELECT DATABASE(). --- sql/sql_db.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sql/sql_db.cc b/sql/sql_db.cc index 343eb6e42f2..0d0d1d897d0 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -392,7 +392,10 @@ int mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent) exit: start_waiting_global_read_lock(thd); if (thd->db && !strcmp(thd->db, db)) + { + x_free(thd->db); thd->db= 0; + } exit2: VOID(pthread_mutex_unlock(&LOCK_mysql_create_db));