[Commits] 1d90a8304bf: MDEV-12579: Incorrect arguments to mysqld_stmt_execute when using LOBs

Oleksandr Byelkin sanja at mariadb.com
Thu Jun 22 10:52:02 EEST 2017


revision-id: 1d90a8304bf0983a91044ca451129552388b026d (mariadb-10.2.6-54-g1d90a8304bf)
parent(s): 0992be927e1c686c39c39fe53fc2a7869d55143d
committer: Oleksandr Byelkin
timestamp: 2017-06-22 09:52:02 +0200
message:

MDEV-12579: Incorrect arguments to mysqld_stmt_execute when using LOBs

Parameters can be MYSQL_TYPE_VARCHAR for long data load.

---
 sql/sql_prepare.cc        |  6 ++++--
 tests/mysql_client_test.c | 35 +++++++++++++++++++++++++++++++++++
 2 files changed, 39 insertions(+), 2 deletions(-)

diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc
index 11274fbbaa2..92137b30f77 100644
--- a/sql/sql_prepare.cc
+++ b/sql/sql_prepare.cc
@@ -825,8 +825,10 @@ static void setup_one_conversion_function(THD *thd, Item_param *param,
 */
 inline bool is_param_long_data_type(Item_param *param)
 {
-  return ((param->field_type() >= MYSQL_TYPE_TINY_BLOB) &&
-          (param->field_type() <= MYSQL_TYPE_STRING));
+  enum_field_types field_type= param->field_type();
+  return (((field_type >= MYSQL_TYPE_TINY_BLOB) &&
+           (field_type <= MYSQL_TYPE_STRING)) ||
+          field_type == MYSQL_TYPE_VARCHAR);
 }
 
 
diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c
index fc3e5470ddd..383036ff092 100644
--- a/tests/mysql_client_test.c
+++ b/tests/mysql_client_test.c
@@ -19531,6 +19531,40 @@ static void test_prepare_analyze()
   check_execute(stmt, rc);
 }
 
+static void test_mdev12579()
+{
+  MYSQL_STMT *stmt= mysql_stmt_init(mysql);
+  MYSQL_BIND bind[2];
+  int rc;
+  long l=3;
+  const char *data = "123456";
+
+  rc= mysql_query(mysql, "CREATE TABLE mdev12579 (k integer,t LONGTEXT,b LONGBLOB,x integer)");
+  myquery(rc);
+
+  rc= mysql_stmt_prepare(stmt, "INSERT INTO mdev12579 VALUES (1,?,NULL,?)", -1);
+  myquery(rc);
+
+  rc= mysql_stmt_send_long_data(stmt, 0, data, 6);
+  rc= mysql_stmt_send_long_data(stmt, 0, data, 6);
+  rc= mysql_stmt_send_long_data(stmt, 0, data, 6);
+
+  memset(bind, 0, sizeof(MYSQL_BIND) * 2);
+  bind[0].buffer_type= MYSQL_TYPE_VAR_STRING;
+  bind[1].buffer_type= MYSQL_TYPE_LONG;
+  bind[1].buffer= &l;
+  mysql_stmt_bind_param(stmt, bind);
+
+  rc= mysql_stmt_execute(stmt);
+  check_execute(stmt, rc);
+
+  mysql_stmt_close(stmt);
+
+  rc= mysql_query(mysql, "DROP TABLE mdev12579");
+  myquery(rc);
+}
+
+
 static struct my_tests_st my_tests[]= {
   { "disable_query_logs", disable_query_logs },
   { "test_view_sp_list_fields", test_view_sp_list_fields },
@@ -19808,6 +19842,7 @@ static struct my_tests_st my_tests[]= {
   { "test_compressed_protocol", test_compressed_protocol },
   { "test_big_packet", test_big_packet },
   { "test_prepare_analyze", test_prepare_analyze },
+  { "test_mdev12579", test_mdev12579 },
   { 0, 0 }
 };
 


More information about the commits mailing list