summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleksandr Byelkin <sanja@mariadb.com>2018-12-13 17:06:26 +0100
committerOleksandr Byelkin <sanja@mariadb.com>2018-12-14 10:47:10 +0100
commitc1caada886270567bfc9d4f57f5ea40d31dd56ea (patch)
tree5a8be774afe0d50260911c854bdda054978070da
parente3dda3d95ee4c09c2ed45ce886ecd25d1fc1ae92 (diff)
downloadmariadb-git-c1caada886270567bfc9d4f57f5ea40d31dd56ea.tar.gz
MDEV-16278: Missing DELETE operation in COM_STMT_BULK_STMT
Allow array binding for DELETE, test it.
-rw-r--r--sql/sql_parse.cc3
-rw-r--r--tests/mysql_client_test.c64
2 files changed, 66 insertions, 1 deletions
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 }
};