From 63026287720e744c0f237e3ea32e7bebcc5ded5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Wed, 13 Dec 2017 21:21:07 +0100 Subject: [PATCH] Data sent with STMT_SEND_LONG_DATA was lost #1283 Values were incorrectly set to NULL --- include/MySQL_PreparedStatement.h | 3 ++- lib/MySQL_PreparedStatement.cpp | 4 +++- lib/MySQL_Session.cpp | 4 +++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/include/MySQL_PreparedStatement.h b/include/MySQL_PreparedStatement.h index 98dacd529..00499d786 100644 --- a/include/MySQL_PreparedStatement.h +++ b/include/MySQL_PreparedStatement.h @@ -114,6 +114,7 @@ typedef struct _stmt_long_data_t { uint16_t param_id; void *data; unsigned long size; + my_bool is_null; } stmt_long_data_t; @@ -125,7 +126,7 @@ class StmtLongDataHandler { ~StmtLongDataHandler(); unsigned int reset(uint32_t _stmt_id); bool add(uint32_t _stmt_id, uint16_t _param_id, void *_data, unsigned long _size); - void *get(uint32_t _stmt_id, uint16_t _param_id, unsigned long **_size); + void *get(uint32_t _stmt_id, uint16_t _param_id, unsigned long **_size, my_bool **_is_null); }; // server side, metadata related to STMT_EXECUTE are stored in MYSQL_STMT itself diff --git a/lib/MySQL_PreparedStatement.cpp b/lib/MySQL_PreparedStatement.cpp index d0932bb6b..b0119a913 100644 --- a/lib/MySQL_PreparedStatement.cpp +++ b/lib/MySQL_PreparedStatement.cpp @@ -93,6 +93,7 @@ bool StmtLongDataHandler::add(uint32_t _stmt_id, uint16_t _param_id, sld->param_id = _param_id; sld->size = _size; sld->data = malloc(_size); + sld->is_null = 0; // because the client is sending data, the field cannot be NULL memcpy(sld->data, _data, _size); long_datas->add(sld); return false; // a new entry was created @@ -117,7 +118,7 @@ unsigned int StmtLongDataHandler::reset(uint32_t _stmt_id) { } void *StmtLongDataHandler::get(uint32_t _stmt_id, uint16_t _param_id, - unsigned long **_size) { + unsigned long **_size, my_bool **_is_null) { stmt_long_data_t *sld = NULL; unsigned int i; for (i = 0; i < long_datas->len; i++) { @@ -125,6 +126,7 @@ void *StmtLongDataHandler::get(uint32_t _stmt_id, uint16_t _param_id, if (sld->stmt_id == _stmt_id && sld->param_id == _param_id) { // we found it! *_size = &sld->size; + *_is_null = &sld->is_null; return sld->data; } } diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index dfb4bc389..60eb12f1a 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -2318,10 +2318,12 @@ __get_pkts_from_client: for (uint16_t ii=0; iinum_params; ii++) { void *_data=NULL; unsigned long *_l=0; - _data=SLDH->get(stmt_global_id,ii,&_l); + my_bool * _is_null; + _data=SLDH->get(stmt_global_id,ii,&_l, &_is_null); if (_data) { // data was sent via STMT_SEND_LONG_DATA stmt_meta->binds[ii].length=_l; stmt_meta->binds[ii].buffer=_data; + stmt_meta->binds[ii].is_null = _is_null; } } if (stmt_meta_found==false) {