diff --git a/include/ma_errmsg.h b/include/ma_errmsg.h index f319b5ad..aefcc8d1 100644 --- a/include/ma_errmsg.h +++ b/include/ma_errmsg.h @@ -67,6 +67,7 @@ extern const char *mariadb_client_errors[]; /* Error messages */ #define CR_NO_PREPARE_STMT 2030 #define CR_PARAMS_NOT_BOUND 2031 #define CR_INVALID_PARAMETER_NO 2034 +#define CR_INVALID_BUFFER_USE 2035 #define CR_UNSUPPORTED_PARAM_TYPE 2036 #define CR_SHARED_MEMORY_CONNECTION 2037 diff --git a/include/mariadb_com.h b/include/mariadb_com.h index 6e532a17..770179f9 100644 --- a/include/mariadb_com.h +++ b/include/mariadb_com.h @@ -326,6 +326,7 @@ enum enum_field_types { MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY, MYSQL_TYPE_DATETIME2, MYSQL_TYPE_TIME2, /* --------------------------------------------- */ + MYSQL_TYPE_JSON=245, MYSQL_TYPE_NEWDECIMAL=246, MYSQL_TYPE_ENUM=247, MYSQL_TYPE_SET=248, diff --git a/include/mysql.h b/include/mysql.h index 49d8488f..d8de55b6 100644 --- a/include/mysql.h +++ b/include/mysql.h @@ -60,6 +60,7 @@ typedef int my_socket; #include "mariadb_version.h" #include "ma_list.h" #include "mariadb_ctype.h" +#include "ma_errmsg.h" #ifndef ST_MA_USED_MEM_DEFINED #define ST_MA_USED_MEM_DEFINED diff --git a/libmariadb/ma_errmsg.c b/libmariadb/ma_errmsg.c index 305fc0dc..4f415d95 100644 --- a/libmariadb/ma_errmsg.c +++ b/libmariadb/ma_errmsg.c @@ -112,10 +112,10 @@ const char *client_errors[]= /* 2029 */ "", /* 2030 */ "Statement is not prepared", /* 2031 */ "No data supplied for parameters in prepared statement", -/* 2032 */ "", +/* 2032 */ "Data truncated", /* 2033 */ "", -/* 2034 */ "", -/* 2035 */ "", +/* 2034 */ "Invalid parameter number", +/* 2035 */ "Invalid buffer type: %d (paraneter: %d)", /* 2036 */ "Buffer type is not supported", /* 2037 */ "Shared memory: %-.64s", /* 2038 */ "Shared memory connection failed during %s. (%lu)", diff --git a/libmariadb/ma_stmt_codec.c b/libmariadb/ma_stmt_codec.c index c6fe3ce8..72ea9653 100644 --- a/libmariadb/ma_stmt_codec.c +++ b/libmariadb/ma_stmt_codec.c @@ -939,7 +939,8 @@ void ps_fetch_bin(MYSQL_BIND *r_param, memcpy(r_param->buffer, current_pos, MIN(copylen, r_param->buffer_length)); } if (copylen < r_param->buffer_length && - r_param->buffer_type == MYSQL_TYPE_STRING) + (r_param->buffer_type == MYSQL_TYPE_STRING || + r_param->buffer_type == MYSQL_TYPE_JSON)) ((char *)r_param->buffer)[copylen]= 0; *r_param->error= copylen > r_param->buffer_length; (*row)+= field_length; @@ -1041,6 +1042,10 @@ void mysql_init_ps_subsystem(void) mysql_ps_fetch_functions[MYSQL_TYPE_STRING].pack_len = MYSQL_PS_SKIP_RESULT_STR; mysql_ps_fetch_functions[MYSQL_TYPE_STRING].max_len = -1; + mysql_ps_fetch_functions[MYSQL_TYPE_JSON].func = ps_fetch_string; + mysql_ps_fetch_functions[MYSQL_TYPE_JSON].pack_len = MYSQL_PS_SKIP_RESULT_STR; + mysql_ps_fetch_functions[MYSQL_TYPE_JSON].max_len = -1; + mysql_ps_fetch_functions[MYSQL_TYPE_DECIMAL].func = ps_fetch_string; mysql_ps_fetch_functions[MYSQL_TYPE_DECIMAL].pack_len = MYSQL_PS_SKIP_RESULT_STR; mysql_ps_fetch_functions[MYSQL_TYPE_DECIMAL].max_len = -1; diff --git a/libmariadb/mariadb_stmt.c b/libmariadb/mariadb_stmt.c index 22085359..2cb5ce06 100644 --- a/libmariadb/mariadb_stmt.c +++ b/libmariadb/mariadb_stmt.c @@ -118,6 +118,7 @@ my_bool mthd_supported_buffer_type(enum enum_field_types type) case MYSQL_TYPE_NULL: case MYSQL_TYPE_SHORT: case MYSQL_TYPE_STRING: + case MYSQL_TYPE_JSON: case MYSQL_TYPE_TIME: case MYSQL_TYPE_TIMESTAMP: case MYSQL_TYPE_TINY: @@ -551,6 +552,7 @@ int store_param(MYSQL_STMT *stmt, int column, unsigned char **p, unsigned long r case MYSQL_TYPE_VARCHAR: case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_STRING: + case MYSQL_TYPE_JSON: case MYSQL_TYPE_DECIMAL: case MYSQL_TYPE_NEWDECIMAL: { @@ -738,6 +740,7 @@ unsigned char* mysql_stmt_execute_generate_request(MYSQL_STMT *stmt, size_t *req case MYSQL_TYPE_VARCHAR: case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_STRING: + case MYSQL_TYPE_JSON: case MYSQL_TYPE_DECIMAL: case MYSQL_TYPE_NEWDECIMAL: case MYSQL_TYPE_GEOMETRY: @@ -968,6 +971,7 @@ my_bool STDCALL mysql_stmt_bind_param(MYSQL_STMT *stmt, MYSQL_BIND *bind) stmt->params[i].buffer_length= 5; break; case MYSQL_TYPE_STRING: + case MYSQL_TYPE_JSON: case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_BLOB: case MYSQL_TYPE_TINY_BLOB: