revision-id: a80a08e8e7523203170a26bdef8c4824a3dc9afc (mariadb-10.2.19-51-ga80a08e8e75) parent(s): ad3346dddf419aed3e5d16066471fd5022af1795 author: Oleksandr Byelkin committer: Oleksandr Byelkin timestamp: 2018-12-13 17:06:26 +0100 message: MDEV-16278: Missing DELETE operation in COM_STMT_BULK_STMT Allow array binding for DELETE, test it. --- sql/sql_parse.cc | 3 ++- tests/mysql_client_test.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index d4787135690..1b8799583c6 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -596,7 +596,8 @@ void init_update_queries(void) sql_command_flags[SQLCOM_DELETE]= CF_CHANGES_DATA | CF_REEXECUTION_FRAGILE | CF_CAN_GENERATE_ROW_EVENTS | CF_OPTIMIZER_TRACE | - CF_CAN_BE_EXPLAINED; + CF_CAN_BE_EXPLAINED | + CF_SP_BULK_SAFE; sql_command_flags[SQLCOM_DELETE_MULTI]= CF_CHANGES_DATA | CF_REEXECUTION_FRAGILE | CF_CAN_GENERATE_ROW_EVENTS | CF_OPTIMIZER_TRACE | diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c index bb72e8b575d..d12ca2ab96a 100644 --- a/tests/mysql_client_test.c +++ b/tests/mysql_client_test.c @@ -19683,6 +19683,67 @@ static void test_mdev12579() myquery(rc); } +#ifndef EMBEDDED_LIBRARY +static void test_bulk_delete() +{ + int rc; + MYSQL_STMT *stmt; + MYSQL_BIND bind[1]; + MYSQL_ROW row; + char indicator[]= {0, 0, 0}; + my_bool error[1]; + int i, id[]= {1, 2, 4}, count= sizeof(id)/sizeof(id[0]); + MYSQL_RES *result; + + rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1"); + myquery(rc); + rc= mysql_query(mysql, "CREATE TABLE t1 (id int not null primary key)"); + myquery(rc); + rc= mysql_query(mysql, "INSERT INTO t1 VALUES (1),(2),(3),(4)"); + myquery(rc); + verify_affected_rows(4); + + stmt= mysql_stmt_init(mysql); + rc= mysql_stmt_prepare(stmt, "DELETE FROM t1 where id=?", -1); + check_execute(stmt, rc); + + memset(bind, 0, sizeof(bind)); + bind[0].buffer_type = MYSQL_TYPE_LONG; + bind[0].buffer = (void *)id; + bind[0].buffer_length = 0; + bind[0].is_null = NULL; + bind[0].length = NULL; + bind[0].error = error; + bind[0].u.indicator= indicator; + + mysql_stmt_attr_set(stmt, STMT_ATTR_ARRAY_SIZE, (void*)&count); + rc= mysql_stmt_bind_param(stmt, bind); + check_execute(stmt, rc); + + rc= mysql_stmt_execute(stmt); + check_execute(stmt, rc); + verify_affected_rows(3); + + mysql_stmt_close(stmt); + + rc= mysql_query(mysql, "SELECT id FROM t1"); + myquery(rc); + + result= mysql_store_result(mysql); + mytest(result); + + i= 0; + while ((row= mysql_fetch_row(result))) + { + i++; + DIE_IF(atoi(row[0]) != 3); + } + DIE_IF(i != 1); + + rc= mysql_query(mysql, "DROP TABLE t1"); + myquery(rc); +} +#endif static struct my_tests_st my_tests[]= { { "disable_query_logs", disable_query_logs }, @@ -19963,6 +20024,9 @@ static struct my_tests_st my_tests[]= { { "test_big_packet", test_big_packet }, { "test_prepare_analyze", test_prepare_analyze }, { "test_mdev12579", test_mdev12579 }, +#ifndef EMBEDDED_LIBRARY + { "test_bulk_delete", test_bulk_delete }, +#endif { 0, 0 } };