Loading client/mysqltest.c +38 −30 Original line number Diff line number Diff line Loading @@ -1443,38 +1443,40 @@ int do_system(struct st_query *q) /* Print the content between echo and <delimiter> to result file. If content is a variable, the variable value will be retrieved Evaluate all variables in the string before printing, allow for variable names to be escaped using \ SYNOPSIS do_echo() q called command DESCRIPTION Usage 1: echo text Print the text after echo until end of command to result file Usage 2: echo $<var_name> Print the content of the variable <var_name> to result file echo Some text $<var_name> Print "Some text" plus the content of the variable <var_name> to result file echo Some text \$<var_name> Print "Some text" plus $<var_name> to result file */ int do_echo(struct st_query *q) int do_echo(struct st_query *command) { char *p= q->first_argument; DYNAMIC_STRING *ds; VAR v; var_init(&v,0,0,0,0); DYNAMIC_STRING *ds, ds_echo; ds= &ds_res; eval_expr(&v, p, 0); /* NULL terminated */ if (v.str_val_len) dynstr_append_mem(ds, v.str_val, v.str_val_len); init_dynamic_string(&ds_echo, "", 256, 256); do_eval(&ds_echo, command->first_argument); dynstr_append_mem(ds, ds_echo.str, ds_echo.length); dynstr_append_mem(ds, "\n", 1); var_free(&v); q->last_argument= q->end; dynstr_free(&ds_echo); command->last_argument= command->end; return 0; } Loading Loading @@ -3733,7 +3735,7 @@ static void append_stmt_result(DYNAMIC_STRING *ds, MYSQL_STMT *stmt, if (mysql_stmt_fetch(stmt) != MYSQL_NO_DATA) die("fetch didn't end with MYSQL_NO_DATA from statement: %d %s", mysql_stmt_error(stmt), mysql_stmt_errno(stmt)); mysql_stmt_errno(stmt), mysql_stmt_error(stmt)); free_replace_column(); Loading Loading @@ -4215,18 +4217,16 @@ static void run_query_stmt(MYSQL *mysql, struct st_query *command, parameter markers. */ #ifdef BUG14013_FIXED if (cursor_protocol_enabled) { /* Use cursor when retrieving result */ if (cursor_protocol_enabled) { ulong type= CURSOR_TYPE_READ_ONLY; if (mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, (void*) &type)) die("mysql_stmt_attr_set(STMT_ATTR_CURSOR_TYPE) failed': %d %s", mysql_stmt_errno(stmt), mysql_stmt_error(stmt)); } #endif /* Execute the query Loading @@ -4238,6 +4238,13 @@ static void run_query_stmt(MYSQL *mysql, struct st_query *command, goto end; } /* When running in cursor_protocol get the warnings from execute here and keep them in a separate string for later. */ if (cursor_protocol_enabled && !disable_warnings) append_warnings(&ds_execute_warnings, mysql); /* We instruct that we want to update the "max_length" field in mysql_stmt_store_result(), this is our only way to know how much Loading Loading @@ -4303,6 +4310,7 @@ static void run_query_stmt(MYSQL *mysql, struct st_query *command, /* Append warnings to ds - if there are any */ if (append_warnings(&ds_execute_warnings, mysql) || ds_execute_warnings.length || ds_prepare_warnings.length || ds_warnings->length) { Loading libmysql/libmysql.c +34 −2 Original line number Diff line number Diff line Loading @@ -2002,6 +2002,7 @@ mysql_stmt_init(MYSQL *mysql) stmt->mysql= mysql; stmt->read_row_func= stmt_read_row_no_result_set; stmt->prefetch_rows= DEFAULT_PREFETCH_ROWS; strmov(stmt->sqlstate, not_error_sqlstate); /* The rest of statement members was bzeroed inside malloc */ DBUG_RETURN(stmt); Loading Loading @@ -4751,12 +4752,39 @@ int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt) if (!stmt->field_count) DBUG_RETURN(0); if ((int) stmt->state < (int) MYSQL_STMT_EXECUTE_DONE || mysql->status != MYSQL_STATUS_GET_RESULT) if ((int) stmt->state < (int) MYSQL_STMT_EXECUTE_DONE) { set_stmt_error(stmt, CR_COMMANDS_OUT_OF_SYNC, unknown_sqlstate); DBUG_RETURN(1); } if (mysql->status == MYSQL_STATUS_READY && stmt->server_status & SERVER_STATUS_CURSOR_EXISTS) { /* Server side cursor exist, tell server to start sending the rows */ NET *net= &mysql->net; char buff[4 /* statement id */ + 4 /* number of rows to fetch */]; /* Send row request to the server */ int4store(buff, stmt->stmt_id); int4store(buff + 4, (int)~0); /* number of rows to fetch */ if (cli_advanced_command(mysql, COM_STMT_FETCH, buff, sizeof(buff), NullS, 0, 1)) { set_stmt_errmsg(stmt, net->last_error, net->last_errno, net->sqlstate); DBUG_RETURN(1); } } else if (mysql->status != MYSQL_STATUS_GET_RESULT) { set_stmt_error(stmt, CR_COMMANDS_OUT_OF_SYNC, unknown_sqlstate); DBUG_RETURN(1); } if (result->data) { free_root(&result->alloc, MYF(MY_KEEP_PREALLOC)); Loading Loading @@ -4797,6 +4825,10 @@ int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt) DBUG_RETURN(1); } /* Assert that if there was a cursor, all rows have been fetched */ DBUG_ASSERT(mysql->status != MYSQL_STATUS_READY || (mysql->server_status & SERVER_STATUS_LAST_ROW_SENT)); if (stmt->update_max_length) { MYSQL_ROWS *cur= result->data; Loading mysql-test/r/events.result +35 −4 Original line number Diff line number Diff line create database if not exists events_test; use events_test; CREATE USER pauline@localhost; CREATE DATABASE db_x; GRANT EVENT ON db_x.* TO pauline@localhost; USE db_x; CREATE TABLE x_table(a int); CREATE EVENT e_x1 ON SCHEDULE EVERY 1 SECOND DO DROP DATABASE db_x; CREATE EVENT e_x2 ON SCHEDULE EVERY 1 SECOND DO DROP TABLE x_table; SHOW DATABASES LIKE 'db_x'; Database (db_x) db_x SET GLOBAL event_scheduler=1; SHOW DATABASES LIKE 'db_x'; Database (db_x) db_x SHOW TABLES FROM db_x; Tables_in_db_x x_table SET GLOBAL event_scheduler=0; DROP EVENT e_x1; DROP EVENT e_x2; DROP DATABASE db_x; DROP USER pauline@localhost; USE events_test; SET GLOBAL event_scheduler=0; drop event if exists event1; Warnings: Note 1305 Event event1 does not exist Loading @@ -20,6 +44,14 @@ select db, name, body, status, interval_field, interval_value from mysql.event; db name body status interval_field interval_value events_test e_43 set @a = 4 ENABLED SECOND 1 drop event e_43; "Let's check whether we can use non-qualified names" create table non_qualif(a int); create event non_qualif_ev on schedule every 10 minute do insert into non_qualif values (800219); select * from non_qualif; a 800219 drop event non_qualif_ev; drop table non_qualif; set global event_scheduler = 0; create table t_event3 (a int, b float); drop event if exists event3; Loading Loading @@ -331,8 +363,8 @@ create event закачка on schedule every 10 hour do select get_lock("test_l show processlist; Id User Host db Command Time State Info # root localhost events_test Query # NULL show processlist # event_scheduler NULL Connect # Sleeping NULL # root events_test Connect # User lock select get_lock("test_lock2", 20) # event_scheduler connecting host NULL Connect # Sleeping NULL # root localhost events_test Connect # User lock select get_lock("test_lock2", 20) "Release the mutex, the event worker should finish." select release_lock("test_lock2"); release_lock("test_lock2") Loading @@ -350,8 +382,7 @@ set global event_scheduler=0; show processlist; Id User Host db Command Time State Info # root localhost events_test Query # NULL show processlist # event_scheduler NULL Connect # Sleeping NULL # root events_test Connect # User lock select get_lock("test_lock2_1", 20) # event_scheduler connecting host NULL Connect # Sleeping NULL "Release the lock so the child process should finish. Hence the scheduler also" select release_lock("test_lock2_1"); release_lock("test_lock2_1") Loading mysql-test/r/events_stress.result 0 → 100644 +46 −0 Original line number Diff line number Diff line CREATE DATABASE IF NOT EXISTS events_test; CREATE DATABASE events_test2; USE events_test2; CREATE EVENT ev_drop1 ON SCHEDULE EVERY 10 MINUTE DISABLE DO SELECT 1; CREATE EVENT ev_drop2 ON SCHEDULE EVERY 10 MINUTE DISABLE DO SELECT 1; CREATE EVENT ev_drop3 ON SCHEDULE EVERY 10 MINUTE DISABLE DO SELECT 1; USE events_test; SELECT COUNT(*) FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_SCHEMA='events_test2'; COUNT(*) 3 DROP DATABASE events_test2; SELECT COUNT(*) FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_SCHEMA='events_test2'; COUNT(*) 0 "Now testing stability - dropping db -> events while they are running" CREATE DATABASE events_test2; USE events_test2; SELECT COUNT(*) FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_SCHEMA='events_test2'; COUNT(*) 1000 SET GLOBAL event_scheduler=1; DROP DATABASE events_test2; SET GLOBAL event_scheduler=0; SELECT COUNT(*) FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_SCHEMA='events_test2'; COUNT(*) 0 CREATE DATABASE events_test3; USE events_test3; SELECT COUNT(*) FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_SCHEMA='events_test3'; COUNT(*) 950 CREATE DATABASE events_test4; USE events_test4; CREATE DATABASE events_test2; USE events_test2; SELECT COUNT(*) FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_SCHEMA='events_test2'; COUNT(*) 1050 DROP DATABASE events_test2; SET GLOBAL event_scheduler=0; DROP DATABASE events_test3; SET GLOBAL event_scheduler=1; DROP DATABASE events_test4; SET GLOBAL event_scheduler=1; USE events_test; DROP DATABASE events_test; mysql-test/r/mysqltest.result +17 −2 Original line number Diff line number Diff line Loading @@ -201,8 +201,14 @@ source database - world''s most -- popular open # source database '$message' "$message" '# MySQL: The - world''s most -- popular open # source database' "# MySQL: The - world''s most -- popular open # source database" hej hej hej Loading @@ -221,6 +227,15 @@ mysqltest: At line 1: Missing arguments to let mysqltest: At line 1: Missing variable name in let mysqltest: At line 1: Missing variable name in let mysqltest: At line 1: Missing assignment operator in let # Execute: --echo # <whatever> success: $success # <whatever> success: 1 # Execute: echo # <whatever> success: $success ; # <whatever> success: 1 # The next two variants work fine and expand the content of $success # Execute: --echo $success 1 # Execute: echo $success ; 1 mysqltest: At line 1: Missing file name in source mysqltest: At line 1: Could not open file ./non_existingFile mysqltest: In included file "MYSQLTEST_VARDIR/tmp/recursive.sql": At line 1: Source directives are nesting too deep Loading Loading
client/mysqltest.c +38 −30 Original line number Diff line number Diff line Loading @@ -1443,38 +1443,40 @@ int do_system(struct st_query *q) /* Print the content between echo and <delimiter> to result file. If content is a variable, the variable value will be retrieved Evaluate all variables in the string before printing, allow for variable names to be escaped using \ SYNOPSIS do_echo() q called command DESCRIPTION Usage 1: echo text Print the text after echo until end of command to result file Usage 2: echo $<var_name> Print the content of the variable <var_name> to result file echo Some text $<var_name> Print "Some text" plus the content of the variable <var_name> to result file echo Some text \$<var_name> Print "Some text" plus $<var_name> to result file */ int do_echo(struct st_query *q) int do_echo(struct st_query *command) { char *p= q->first_argument; DYNAMIC_STRING *ds; VAR v; var_init(&v,0,0,0,0); DYNAMIC_STRING *ds, ds_echo; ds= &ds_res; eval_expr(&v, p, 0); /* NULL terminated */ if (v.str_val_len) dynstr_append_mem(ds, v.str_val, v.str_val_len); init_dynamic_string(&ds_echo, "", 256, 256); do_eval(&ds_echo, command->first_argument); dynstr_append_mem(ds, ds_echo.str, ds_echo.length); dynstr_append_mem(ds, "\n", 1); var_free(&v); q->last_argument= q->end; dynstr_free(&ds_echo); command->last_argument= command->end; return 0; } Loading Loading @@ -3733,7 +3735,7 @@ static void append_stmt_result(DYNAMIC_STRING *ds, MYSQL_STMT *stmt, if (mysql_stmt_fetch(stmt) != MYSQL_NO_DATA) die("fetch didn't end with MYSQL_NO_DATA from statement: %d %s", mysql_stmt_error(stmt), mysql_stmt_errno(stmt)); mysql_stmt_errno(stmt), mysql_stmt_error(stmt)); free_replace_column(); Loading Loading @@ -4215,18 +4217,16 @@ static void run_query_stmt(MYSQL *mysql, struct st_query *command, parameter markers. */ #ifdef BUG14013_FIXED if (cursor_protocol_enabled) { /* Use cursor when retrieving result */ if (cursor_protocol_enabled) { ulong type= CURSOR_TYPE_READ_ONLY; if (mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, (void*) &type)) die("mysql_stmt_attr_set(STMT_ATTR_CURSOR_TYPE) failed': %d %s", mysql_stmt_errno(stmt), mysql_stmt_error(stmt)); } #endif /* Execute the query Loading @@ -4238,6 +4238,13 @@ static void run_query_stmt(MYSQL *mysql, struct st_query *command, goto end; } /* When running in cursor_protocol get the warnings from execute here and keep them in a separate string for later. */ if (cursor_protocol_enabled && !disable_warnings) append_warnings(&ds_execute_warnings, mysql); /* We instruct that we want to update the "max_length" field in mysql_stmt_store_result(), this is our only way to know how much Loading Loading @@ -4303,6 +4310,7 @@ static void run_query_stmt(MYSQL *mysql, struct st_query *command, /* Append warnings to ds - if there are any */ if (append_warnings(&ds_execute_warnings, mysql) || ds_execute_warnings.length || ds_prepare_warnings.length || ds_warnings->length) { Loading
libmysql/libmysql.c +34 −2 Original line number Diff line number Diff line Loading @@ -2002,6 +2002,7 @@ mysql_stmt_init(MYSQL *mysql) stmt->mysql= mysql; stmt->read_row_func= stmt_read_row_no_result_set; stmt->prefetch_rows= DEFAULT_PREFETCH_ROWS; strmov(stmt->sqlstate, not_error_sqlstate); /* The rest of statement members was bzeroed inside malloc */ DBUG_RETURN(stmt); Loading Loading @@ -4751,12 +4752,39 @@ int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt) if (!stmt->field_count) DBUG_RETURN(0); if ((int) stmt->state < (int) MYSQL_STMT_EXECUTE_DONE || mysql->status != MYSQL_STATUS_GET_RESULT) if ((int) stmt->state < (int) MYSQL_STMT_EXECUTE_DONE) { set_stmt_error(stmt, CR_COMMANDS_OUT_OF_SYNC, unknown_sqlstate); DBUG_RETURN(1); } if (mysql->status == MYSQL_STATUS_READY && stmt->server_status & SERVER_STATUS_CURSOR_EXISTS) { /* Server side cursor exist, tell server to start sending the rows */ NET *net= &mysql->net; char buff[4 /* statement id */ + 4 /* number of rows to fetch */]; /* Send row request to the server */ int4store(buff, stmt->stmt_id); int4store(buff + 4, (int)~0); /* number of rows to fetch */ if (cli_advanced_command(mysql, COM_STMT_FETCH, buff, sizeof(buff), NullS, 0, 1)) { set_stmt_errmsg(stmt, net->last_error, net->last_errno, net->sqlstate); DBUG_RETURN(1); } } else if (mysql->status != MYSQL_STATUS_GET_RESULT) { set_stmt_error(stmt, CR_COMMANDS_OUT_OF_SYNC, unknown_sqlstate); DBUG_RETURN(1); } if (result->data) { free_root(&result->alloc, MYF(MY_KEEP_PREALLOC)); Loading Loading @@ -4797,6 +4825,10 @@ int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt) DBUG_RETURN(1); } /* Assert that if there was a cursor, all rows have been fetched */ DBUG_ASSERT(mysql->status != MYSQL_STATUS_READY || (mysql->server_status & SERVER_STATUS_LAST_ROW_SENT)); if (stmt->update_max_length) { MYSQL_ROWS *cur= result->data; Loading
mysql-test/r/events.result +35 −4 Original line number Diff line number Diff line create database if not exists events_test; use events_test; CREATE USER pauline@localhost; CREATE DATABASE db_x; GRANT EVENT ON db_x.* TO pauline@localhost; USE db_x; CREATE TABLE x_table(a int); CREATE EVENT e_x1 ON SCHEDULE EVERY 1 SECOND DO DROP DATABASE db_x; CREATE EVENT e_x2 ON SCHEDULE EVERY 1 SECOND DO DROP TABLE x_table; SHOW DATABASES LIKE 'db_x'; Database (db_x) db_x SET GLOBAL event_scheduler=1; SHOW DATABASES LIKE 'db_x'; Database (db_x) db_x SHOW TABLES FROM db_x; Tables_in_db_x x_table SET GLOBAL event_scheduler=0; DROP EVENT e_x1; DROP EVENT e_x2; DROP DATABASE db_x; DROP USER pauline@localhost; USE events_test; SET GLOBAL event_scheduler=0; drop event if exists event1; Warnings: Note 1305 Event event1 does not exist Loading @@ -20,6 +44,14 @@ select db, name, body, status, interval_field, interval_value from mysql.event; db name body status interval_field interval_value events_test e_43 set @a = 4 ENABLED SECOND 1 drop event e_43; "Let's check whether we can use non-qualified names" create table non_qualif(a int); create event non_qualif_ev on schedule every 10 minute do insert into non_qualif values (800219); select * from non_qualif; a 800219 drop event non_qualif_ev; drop table non_qualif; set global event_scheduler = 0; create table t_event3 (a int, b float); drop event if exists event3; Loading Loading @@ -331,8 +363,8 @@ create event закачка on schedule every 10 hour do select get_lock("test_l show processlist; Id User Host db Command Time State Info # root localhost events_test Query # NULL show processlist # event_scheduler NULL Connect # Sleeping NULL # root events_test Connect # User lock select get_lock("test_lock2", 20) # event_scheduler connecting host NULL Connect # Sleeping NULL # root localhost events_test Connect # User lock select get_lock("test_lock2", 20) "Release the mutex, the event worker should finish." select release_lock("test_lock2"); release_lock("test_lock2") Loading @@ -350,8 +382,7 @@ set global event_scheduler=0; show processlist; Id User Host db Command Time State Info # root localhost events_test Query # NULL show processlist # event_scheduler NULL Connect # Sleeping NULL # root events_test Connect # User lock select get_lock("test_lock2_1", 20) # event_scheduler connecting host NULL Connect # Sleeping NULL "Release the lock so the child process should finish. Hence the scheduler also" select release_lock("test_lock2_1"); release_lock("test_lock2_1") Loading
mysql-test/r/events_stress.result 0 → 100644 +46 −0 Original line number Diff line number Diff line CREATE DATABASE IF NOT EXISTS events_test; CREATE DATABASE events_test2; USE events_test2; CREATE EVENT ev_drop1 ON SCHEDULE EVERY 10 MINUTE DISABLE DO SELECT 1; CREATE EVENT ev_drop2 ON SCHEDULE EVERY 10 MINUTE DISABLE DO SELECT 1; CREATE EVENT ev_drop3 ON SCHEDULE EVERY 10 MINUTE DISABLE DO SELECT 1; USE events_test; SELECT COUNT(*) FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_SCHEMA='events_test2'; COUNT(*) 3 DROP DATABASE events_test2; SELECT COUNT(*) FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_SCHEMA='events_test2'; COUNT(*) 0 "Now testing stability - dropping db -> events while they are running" CREATE DATABASE events_test2; USE events_test2; SELECT COUNT(*) FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_SCHEMA='events_test2'; COUNT(*) 1000 SET GLOBAL event_scheduler=1; DROP DATABASE events_test2; SET GLOBAL event_scheduler=0; SELECT COUNT(*) FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_SCHEMA='events_test2'; COUNT(*) 0 CREATE DATABASE events_test3; USE events_test3; SELECT COUNT(*) FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_SCHEMA='events_test3'; COUNT(*) 950 CREATE DATABASE events_test4; USE events_test4; CREATE DATABASE events_test2; USE events_test2; SELECT COUNT(*) FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_SCHEMA='events_test2'; COUNT(*) 1050 DROP DATABASE events_test2; SET GLOBAL event_scheduler=0; DROP DATABASE events_test3; SET GLOBAL event_scheduler=1; DROP DATABASE events_test4; SET GLOBAL event_scheduler=1; USE events_test; DROP DATABASE events_test;
mysql-test/r/mysqltest.result +17 −2 Original line number Diff line number Diff line Loading @@ -201,8 +201,14 @@ source database - world''s most -- popular open # source database '$message' "$message" '# MySQL: The - world''s most -- popular open # source database' "# MySQL: The - world''s most -- popular open # source database" hej hej hej Loading @@ -221,6 +227,15 @@ mysqltest: At line 1: Missing arguments to let mysqltest: At line 1: Missing variable name in let mysqltest: At line 1: Missing variable name in let mysqltest: At line 1: Missing assignment operator in let # Execute: --echo # <whatever> success: $success # <whatever> success: 1 # Execute: echo # <whatever> success: $success ; # <whatever> success: 1 # The next two variants work fine and expand the content of $success # Execute: --echo $success 1 # Execute: echo $success ; 1 mysqltest: At line 1: Missing file name in source mysqltest: At line 1: Could not open file ./non_existingFile mysqltest: In included file "MYSQLTEST_VARDIR/tmp/recursive.sql": At line 1: Source directives are nesting too deep Loading