diff options
author | unknown <sasha@mysql.sashanet.com> | 2001-03-27 10:24:44 -0700 |
---|---|---|
committer | unknown <sasha@mysql.sashanet.com> | 2001-03-27 10:24:44 -0700 |
commit | 3a3e8e99d5ba9a4659617d40554677d34053a7e7 (patch) | |
tree | 2428391c6cac988056a0f1af64f9fb0f3469e543 | |
parent | fd2900ccfc5312f374590f8a0482f621d5cb2c00 (diff) | |
parent | 91e815b3334a46c4fd22494006e2d50ab4787d16 (diff) | |
download | mariadb-git-3a3e8e99d5ba9a4659617d40554677d34053a7e7.tar.gz |
Merge work:/home/bk/mysql
into mysql.sashanet.com:/home/sasha/src/bk/mysql
BitKeeper/etc/logging_ok:
Logging to logging@openlogging.org accepted
-rw-r--r-- | BitKeeper/etc/logging_ok | 1 | ||||
-rw-r--r-- | client/mysqltest.c | 98 | ||||
-rw-r--r-- | mysql-test/r/drop.result | 2 | ||||
-rw-r--r-- | mysql-test/r/rpl000016.result | 5 | ||||
-rw-r--r-- | mysql-test/t/drop.test | 12 | ||||
-rw-r--r-- | mysql-test/t/rpl000016.test | 5 |
6 files changed, 104 insertions, 19 deletions
diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index a98fd9b8950..a830f1a73f0 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -1,2 +1,3 @@ ccarkner@nslinuxw10.bedford.progress.com heikki@donna.mysql.fi +sasha@mysql.sashanet.com diff --git a/client/mysqltest.c b/client/mysqltest.c index 928f429ac12..019063b48a7 100644 --- a/client/mysqltest.c +++ b/client/mysqltest.c @@ -156,7 +156,7 @@ struct st_query Q_SYNC_WITH_MASTER, Q_ERROR, Q_SEND, Q_REAP, Q_DIRTY_CLOSE, Q_REPLACE, - Q_PING, + Q_PING, Q_EVAL, Q_UNKNOWN, /* Unknown command. */ Q_COMMENT, /* Comments, ignored. */ Q_COMMENT_WITH_COMMAND @@ -175,7 +175,7 @@ const char *command_names[] = { "sync_with_master", "error", "send", "reap", "dirty_close", "replace_result", - "ping", + "ping", "eval", 0 }; @@ -183,12 +183,14 @@ TYPELIB command_typelib= {array_elements(command_names),"", command_names}; DYNAMIC_STRING ds_res; +static void die(const char* fmt, ...); int dyn_string_cmp(DYNAMIC_STRING* ds, const char* fname); void reject_dump(const char* record_file, char* buf, int size); int close_connection(struct st_query* q); -VAR* var_get(char* var_name, char* var_name_end, int raw); +VAR* var_get(const char* var_name, const char** var_name_end, int raw); +int eval_expr(VAR* v, const char* p, const char** p_end); /* Definitions for replace */ @@ -208,11 +210,51 @@ static int insert_pointer_name(reg1 POINTER_ARRAY *pa,my_string name); void free_pointer_array(POINTER_ARRAY *pa); static int initialize_replace_buffer(void); static void free_replace_buffer(void); +static void do_eval(DYNAMIC_STRING* query_eval, const char* query); struct st_replace *glob_replace; static char *out_buff; static uint out_length; +static void do_eval(DYNAMIC_STRING* query_eval, const char* query) +{ + const char* p; + register char c; + register int escaped = 0; + VAR* v; + + for(p = query; (c = *p); ++p) + { + switch(c) + { + case '$': + if(escaped) + { + escaped = 0; + dynstr_append_mem(query_eval, p, 1); + } + else + { + if(!(v = var_get(p, &p, 0))) + die("Bad variabled in eval"); + dynstr_append(query_eval, v->str_val); + } + break; + case '\\': + if(escaped) + { + escaped = 0; + dynstr_append_mem(query_eval, p, 1); + } + else + escaped = 1; + break; + default: + dynstr_append_mem(query_eval, p, 1); + break; + } + } +} static void close_cons() { @@ -369,7 +411,7 @@ static int check_result(DYNAMIC_STRING* ds, const char* fname, return error; } -VAR* var_get(char* var_name, char* var_name_end, int raw) +VAR* var_get(const char* var_name, const char** var_name_end, int raw) { int digit; VAR* v; @@ -390,6 +432,8 @@ VAR* var_get(char* var_name, char* var_name_end, int raw) sprintf(v->str_val, "%d", v->int_val); v->int_dirty = 0; } + if(var_name_end) + *var_name_end = var_name ; return v; err: if (var_name_end) @@ -458,7 +502,7 @@ int do_source(struct st_query* q) } -int eval_expr(VAR* v, char* p, char* p_end) +int eval_expr(VAR* v, const char* p, const char** p_end) { VAR* vp; if (*p == '$') @@ -471,8 +515,8 @@ int eval_expr(VAR* v, char* p, char* p_end) } else { - v->str_val = p; - v->str_val_len = p_end ? p_end - p : strlen(p); + v->str_val = (char*)p; + v->str_val_len = (p_end && *p_end) ? *p_end - p : strlen(p); return 0; } @@ -514,6 +558,7 @@ int do_system(struct st_query* q) v.str_val_len = sizeof(expr_buf) - 1; memcpy(expr_buf, v.str_val, v.str_val_len); expr_buf[v.str_val_len] = 0; + DBUG_PRINT("info", ("running system command '%s'", expr_buf)); if (system(expr_buf) && q->abort_on_error) die("system command '%s' failed", expr_buf); } @@ -947,7 +992,7 @@ int do_done(struct st_query* q) int do_while(struct st_query* q) { char* p=q->first_argument; - char* expr_start, *expr_end; + const char* expr_start, *expr_end; VAR v; if (cur_block == block_stack_end) die("Nesting too deeply"); @@ -962,7 +1007,8 @@ int do_while(struct st_query* q) expr_end = strrchr(expr_start, ')'); if (!expr_end) die("missing ')' in while"); - eval_expr(&v, ++expr_start, --expr_end); + --expr_end; + eval_expr(&v, ++expr_start, &expr_end); *cur_block++ = parser.current_line++; if (!v.int_val) { @@ -1424,8 +1470,24 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags) int q_error = 0 ; DYNAMIC_STRING *ds; DYNAMIC_STRING ds_tmp; + DYNAMIC_STRING eval_query; + char* query; + int query_len; DBUG_ENTER("run_query"); + if(q->type != Q_EVAL) + { + query = q->query; + query_len = strlen(query); + } + else + { + init_dynamic_string(&eval_query, "", 16384, 65536); + do_eval(&eval_query, q->query); + query = eval_query.str; + query_len = eval_query.length; + } + if ( q->record_file[0]) { init_dynamic_string(&ds_tmp, "", 16384, 65536); @@ -1435,8 +1497,8 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags) ds= &ds_res; if ((flags & QUERY_SEND) && - (q_error = mysql_send_query(mysql, q->query, strlen(q->query)))) - die("At line %u: unable to send query '%s'", start_lineno, q->query); + (q_error = mysql_send_query(mysql, query, query_len))) + die("At line %u: unable to send query '%s'", start_lineno, query); if(!(flags & QUERY_REAP)) return 0; @@ -1445,7 +1507,7 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags) if (q->require_file) abort_not_supported_test(); if (q->abort_on_error) - die("At line %u: query '%s' failed: %d: %s", start_lineno, q->query, + die("At line %u: query '%s' failed: %d: %s", start_lineno, query, mysql_errno(mysql), mysql_error(mysql)); else { @@ -1484,10 +1546,10 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags) abort_not_supported_test(); if (q->abort_on_error) die("At line %u: Failed in mysql_store_result for query '%s' (%d)", - start_lineno, q->query, mysql_errno(mysql)); + start_lineno, query, mysql_errno(mysql)); else { - verbose_msg("failed in mysql_store_result for query '%s' (%d)", q->query, + verbose_msg("failed in mysql_store_result for query '%s' (%d)", query, mysql_errno(mysql)); error = 1; goto end; @@ -1555,6 +1617,8 @@ end: if (res) mysql_free_result(res); if (ds == &ds_tmp) dynstr_free(&ds_tmp); + if(q->type == Q_EVAL) + dynstr_free(&eval_query); DBUG_RETURN(error); } @@ -1643,13 +1707,17 @@ int main(int argc, char** argv) case Q_ECHO: do_echo(q); break; case Q_SYSTEM: do_system(q); break; case Q_LET: do_let(q); break; + case Q_EVAL: + if (q->query == q->query_buf) + q->query += q->first_word_len; + /* fall through */ case Q_QUERY: case Q_REAP: { int flags = QUERY_REAP; /* we read the result always regardless * of the mode for both full query and * read-result only ( reap) */ - if (q->type == Q_QUERY) /* for a full query, enable the send stage */ + if (q->type != Q_REAP) /* for a full query, enable the send stage */ flags |= QUERY_SEND; if (q_send_flag) { diff --git a/mysql-test/r/drop.result b/mysql-test/r/drop.result new file mode 100644 index 00000000000..67923fe903c --- /dev/null +++ b/mysql-test/r/drop.result @@ -0,0 +1,2 @@ +n +1 diff --git a/mysql-test/r/rpl000016.result b/mysql-test/r/rpl000016.result index 613a97d5b7e..da9dccae9f4 100644 --- a/mysql-test/r/rpl000016.result +++ b/mysql-test/r/rpl000016.result @@ -21,9 +21,10 @@ Log_name master-bin.003 master-bin.004 master-bin.005 +master-bin.006 File Position Binlog_do_db Binlog_ignore_db -master-bin.005 1504 +master-bin.006 131 Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter -127.0.0.1 root 9306 60 master-bin.005 1504 Yes 0 0 +127.0.0.1 root 9306 60 master-bin.006 131 Yes 0 0 count(*) 100 diff --git a/mysql-test/t/drop.test b/mysql-test/t/drop.test new file mode 100644 index 00000000000..1de387f6e4c --- /dev/null +++ b/mysql-test/t/drop.test @@ -0,0 +1,12 @@ +drop table if exists t1; +drop table if exists t1; +--error 1051; +drop table t1; +create table t1(n int); +insert into t1 values(1); +create temporary table t1( n int); +insert into t1 values(2); +--error 1050; +create table t1(n int); +drop table t1; +select * from t1; diff --git a/mysql-test/t/rpl000016.test b/mysql-test/t/rpl000016.test index be694b0e434..9161d2e4734 100644 --- a/mysql-test/t/rpl000016.test +++ b/mysql-test/t/rpl000016.test @@ -74,7 +74,8 @@ drop table if exists t3; create table t3 (n int); while ($1) { - insert into t3 values(4); +#eval means expand $ expressions + eval insert into t3 values($1 + 4); dec $1; } show master logs; @@ -88,7 +89,7 @@ show slave status; # because of concurrent insert, the table may not be up to date # if we do not lock lock tables t3 read; -select count(*) from t3 where n = 4; +select count(*) from t3 where n >= 4; unlock tables; #clean up connection master; |