From 0c4f4ff015f7c4a06b9d4c9e8f22f44a57e2a318 Mon Sep 17 00:00:00 2001 From: Ashish Agarwal Date: Sun, 19 May 2013 23:38:06 +0530 Subject: Bug#16194302: SUPPORT FOR FLOATING-POINT SYSTEM VARIABLES USING THE PLUGIN INTERFACE. ISSUE: No support for floating-point plugin system variables. SOLUTION: Allowing plugins to define and expose floating-point system variables of type double. MYSQL_SYSVAR_DOUBLE and MYSQL_THDVAR_DOUBLE are added. ISSUE: Fractional part of the def, min, max values of system variables are ignored. SOLUTION: Adding functions that are used to store the raw representation of a double in the raw bits of unsigned longlong in a way that the binary representation remains the same. --- mysys/my_getopt.c | 43 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 5 deletions(-) (limited to 'mysys') diff --git a/mysys/my_getopt.c b/mysys/my_getopt.c index adee17ba3d1..8575fde0ca9 100644 --- a/mysys/my_getopt.c +++ b/mysys/my_getopt.c @@ -90,6 +90,35 @@ void my_getopt_register_get_addr(my_getopt_value func_addr) getopt_get_addr= func_addr; } +union ull_dbl +{ + ulonglong ull; + double dbl; +}; + +/** + Returns an ulonglong value containing a raw + representation of the given double value. +*/ +ulonglong getopt_double2ulonglong(double v) +{ + union ull_dbl u; + u.dbl= v; + compile_time_assert(sizeof(ulonglong) >= sizeof(double)); + return u.ull; +} + +/** + Returns the double value which corresponds to + the given raw representation. +*/ +double getopt_ulonglong2double(ulonglong v) +{ + union ull_dbl u; + u.ull= v; + return u.dbl; +} + /** Handle command line options. Sort options. @@ -1044,14 +1073,18 @@ double getopt_double_limit_value(double num, const struct my_option *optp, { my_bool adjusted= FALSE; double old= num; - if (optp->max_value && num > (double) optp->max_value) + double min, max; + + max= getopt_ulonglong2double(optp->max_value); + min= getopt_ulonglong2double(optp->min_value); + if (max && num > max) { - num= (double) optp->max_value; + num= max; adjusted= TRUE; } - if (num < (double) optp->min_value) + if (num < min) { - num= (double) optp->min_value; + num= min; adjusted= TRUE; } if (fix) @@ -1134,7 +1167,7 @@ static void init_one_value(const struct my_option *option, void *variable, *((ulonglong*) variable)= (ulonglong) value; break; case GET_DOUBLE: - *((double*) variable)= ulonglong2double(value); + *((double*) variable)= getopt_ulonglong2double(value); break; case GET_STR: /* -- cgit v1.2.1 From c94ccb237e5f8b0f72c742746aa49f8ff8440f98 Mon Sep 17 00:00:00 2001 From: Tor Didriksen Date: Fri, 14 Jun 2013 10:52:23 +0200 Subject: Bug#16729109: FIX COMPILATION WARNINGS WITH GCC 4.8 Backport to 5.5 (external Bug#69407 Build warnings with mysql) support-files/build-tags: Run etags on sql_yacc.yy, ignore other .yy files unittest/mysys/explain_filename-t.cc: NO_PLAN seems to fail on some platforms, use the actual number instead. --- mysys/CMakeLists.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'mysys') diff --git a/mysys/CMakeLists.txt b/mysys/CMakeLists.txt index 814f093c2d6..95d3e568be7 100644 --- a/mysys/CMakeLists.txt +++ b/mysys/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -69,6 +69,11 @@ TARGET_LINK_LIBRARIES(mysys dbug strings ${ZLIB_LIBRARY} ${LIBNSL} ${LIBM} ${LIBRT}) DTRACE_INSTRUMENT(mysys) +# Need explicit pthread for gcc -fsanitize=address +IF(CMAKE_USE_PTHREADS_INIT AND CMAKE_C_FLAGS MATCHES "-fsanitize=") + TARGET_LINK_LIBRARIES(mysys pthread) +ENDIF() + ADD_EXECUTABLE(thr_lock thr_lock.c) TARGET_LINK_LIBRARIES(thr_lock mysys) SET_TARGET_PROPERTIES(thr_lock PROPERTIES COMPILE_FLAGS "-DMAIN") -- cgit v1.2.1 From 1827eb8a2a8afd73603dabb442e7375774578da0 Mon Sep 17 00:00:00 2001 From: Georgi Kodinov Date: Wed, 26 Jun 2013 12:19:02 +0300 Subject: Bug #16996656: UNIQUE OPTION PREFIXES NOT DEPRECATED IN 5.5+ Backported the deprecation warnings from WL#6978 to 5.5 --- mysys/my_getopt.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'mysys') diff --git a/mysys/my_getopt.c b/mysys/my_getopt.c index 8575fde0ca9..8d1da06af8c 100644 --- a/mysys/my_getopt.c +++ b/mysys/my_getopt.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -829,6 +829,7 @@ static int findopt(char *optpat, uint length, { uint count; const struct my_option *opt= *opt_res; + my_bool is_prefix= FALSE; for (count= 0; opt->name; opt++) { @@ -837,11 +838,14 @@ static int findopt(char *optpat, uint length, (*opt_res)= opt; if (!opt->name[length]) /* Exact match */ return 1; + if (!count) { /* We only need to know one prev */ count= 1; *ffname= opt->name; + if (opt->name[length]) + is_prefix= TRUE; } else if (strcmp(*ffname, opt->name)) { @@ -853,6 +857,12 @@ static int findopt(char *optpat, uint length, } } } + if (is_prefix && count == 1) + my_getopt_error_reporter(WARNING_LEVEL, + "Using unique option prefix %.*s instead of %s " + "is deprecated and will be removed in a future " + "release. Please use the full name instead.", + length, optpat, *ffname); return count; } -- cgit v1.2.1 From 3ef0157daa3593d2003e14fac3a7a8a249e9c048 Mon Sep 17 00:00:00 2001 From: Vladislav Vaintroub Date: Mon, 29 Jul 2013 16:03:41 +0200 Subject: MDEV-4815 - allow multiple mysql_server_init() / mysql_server_end() in the same process, for embedded library. - Reset static variables that are used to signal "init done" for DBUG, in dbug_end() - Set string server variables to NULL after memory for the value is freed - avoids double free() - fix DBUG_ASSERTs that happened during reinitialization. --- mysys/waiting_threads.c | 1 + 1 file changed, 1 insertion(+) (limited to 'mysys') diff --git a/mysys/waiting_threads.c b/mysys/waiting_threads.c index 0a9474e68b4..c861dcc738c 100644 --- a/mysys/waiting_threads.c +++ b/mysys/waiting_threads.c @@ -475,6 +475,7 @@ void wt_end() my_atomic_rwlock_destroy(&cycle_stats_lock); my_atomic_rwlock_destroy(&success_stats_lock); my_atomic_rwlock_destroy(&wait_stats_lock); + reshash.alloc.constructor= NULL; wt_init_done= 0; DBUG_VOID_RETURN; } -- cgit v1.2.1 From 04fd2f18cb9de58d62ec6c860f586b9f81a95300 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 1 Aug 2013 11:46:11 +0300 Subject: MDEV-4811 Assertion `offset < 0x1f' fails in type_and_offset_store on COLUMN_ADD MDEV-4812 Valgrind warnings (Invalid write) in dynamic_column_update_many on COLUMN_ADD Fixed problem of working on wrong data (do not allow offset to out of string length). --- mysys/ma_dyncol.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) (limited to 'mysys') diff --git a/mysys/ma_dyncol.c b/mysys/ma_dyncol.c index 03d9007c7cb..f01d69f0b25 100644 --- a/mysys/ma_dyncol.c +++ b/mysys/ma_dyncol.c @@ -1228,13 +1228,14 @@ dynamic_column_create(DYNAMIC_COLUMN *str, uint column_nr, @param header_end Pointer to the header end @param offset_size Size of offset field in bytes @param last_offset Size of the data segment + @param error Set in case of error @return number of bytes */ static size_t get_length_interval(uchar *entry, uchar *entry_next, uchar *header_end, size_t offset_size, - size_t last_offset) + size_t last_offset, my_bool *error) { size_t offset, offset_next; DYNAMIC_COLUMN_TYPE type, type_next; @@ -1242,8 +1243,12 @@ static size_t get_length_interval(uchar *entry, uchar *entry_next, type_and_offset_read(&type, &offset, entry, offset_size); if (entry_next >= header_end) + { + *error= 0; return (last_offset - offset); + } type_and_offset_read(&type_next, &offset_next, entry_next, offset_size); + *error= (offset_next > last_offset); return (offset_next - offset); } @@ -1255,17 +1260,18 @@ static size_t get_length_interval(uchar *entry, uchar *entry_next, @param header_end Pointer to the header end @param offset_size Size of offset field in bytes @param last_offset Size of the data segment + @param error Set in case of error @return number of bytes */ static size_t get_length(uchar *entry, uchar *header_end, size_t offset_size, - size_t last_offset) + size_t last_offset, my_bool *error) { return get_length_interval(entry, entry + offset_size + COLUMN_NUMBER_SIZE, - header_end, offset_size, last_offset); + header_end, offset_size, last_offset, error); } @@ -1304,6 +1310,7 @@ find_column(DYNAMIC_COLUMN_TYPE *type, uchar **data, size_t *length, uchar *entry; size_t offset, total_data, header_size, entry_size; uchar key[2+4]; + my_bool error; if (!entry_pos) entry_pos= &entry; @@ -1329,12 +1336,12 @@ find_column(DYNAMIC_COLUMN_TYPE *type, uchar **data, size_t *length, return 1; *data= header + header_size + offset; *length= get_length(entry, header + header_size, offset_size, - total_data); + total_data, &error); /* Check that the found data is withing the ranges. This can happen if we get data with wrong offsets. */ - if ((long) *length < 0 || offset + *length > total_data) + if (error || (long) *length < 0 || offset + *length > total_data) return 1; *entry_pos= entry; @@ -1837,12 +1844,13 @@ dynamic_column_update_many(DYNAMIC_COLUMN *str, entry_size, column_count, &entry)) { size_t entry_data_size; + my_bool error; /* Data existed; We have to replace or delete it */ entry_data_size= get_length(entry, header_end, - offset_size, max_offset); - if ((long) entry_data_size < 0) + offset_size, max_offset, &error); + if (error || (long) entry_data_size < 0) { rc= ER_DYNCOL_FORMAT; goto end; @@ -2038,12 +2046,13 @@ dynamic_column_update_many(DYNAMIC_COLUMN *str, /* copy first the data that was not replaced in original packed data */ if (start < end) { + my_bool error; /* Add old data last in 'tmp' */ size_t data_size= get_length_interval(header_base + start * entry_size, header_base + end * entry_size, - header_end, offset_size, max_offset); - if ((long) data_size < 0 || + header_end, offset_size, max_offset, &error); + if (error || (long) data_size < 0 || data_size > max_offset - first_offset) { dynamic_column_column_free(&tmp); -- cgit v1.2.1 From 758b012ff23597faa099a2f9562a54f1bae2cca6 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Wed, 14 Aug 2013 11:12:57 +0200 Subject: fix a comment --- mysys/my_getsystime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'mysys') diff --git a/mysys/my_getsystime.c b/mysys/my_getsystime.c index 74289556262..1cedeb21d6e 100644 --- a/mysys/my_getsystime.c +++ b/mysys/my_getsystime.c @@ -113,7 +113,7 @@ void my_time_init() /* - Return cpu time in milliseconds * 10 + Return cpu time in 1/10th on a microsecond (1e-7 s) */ ulonglong my_getcputime() -- cgit v1.2.1 From c06eaf21b78093524e1a39c55415d4eab3d2cd78 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Sat, 17 Aug 2013 17:20:09 +0400 Subject: MDEV-4165 [PATCH] RFE: make tmpdir a build-time configurable option support -DTMPDIR=/path in CMakeLists.txt Patch by Honza Horak. --- mysys/mf_tempdir.c | 2 +- mysys/mf_tempfile.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'mysys') diff --git a/mysys/mf_tempdir.c b/mysys/mf_tempdir.c index eceb90bb619..e6b56f7d1d0 100644 --- a/mysys/mf_tempdir.c +++ b/mysys/mf_tempdir.c @@ -43,7 +43,7 @@ my_bool init_tmpdir(MY_TMPDIR *tmpdir, const char *pathlist) pathlist=getenv("TMP"); #endif if (!pathlist || !pathlist[0]) - pathlist=(char*) P_tmpdir; + pathlist=(char*) DEFAULT_TMPDIR; } do { diff --git a/mysys/mf_tempfile.c b/mysys/mf_tempfile.c index 15482075c39..5ff139bc92a 100644 --- a/mysys/mf_tempfile.c +++ b/mysys/mf_tempfile.c @@ -111,7 +111,7 @@ File create_temp_file(char *to, const char *dir, const char *prefix, sizeof(prefix_buff)-7),"XXXXXX") - prefix_buff); if (!dir && ! (dir =getenv("TMPDIR"))) - dir=P_tmpdir; + dir=DEFAULT_TMPDIR; if (strlen(dir)+ pfx_len > FN_REFLEN-2) { errno=my_errno= ENAMETOOLONG; -- cgit v1.2.1 From 92265da9d77bc750eb234cfac9d6239675078983 Mon Sep 17 00:00:00 2001 From: Alexey Botchkov Date: Mon, 9 Sep 2013 16:56:35 +0500 Subject: MDEV-4472 Audit-plugin. Server-related part of the task. file_logger became the service. Data like query_id now are sent to the audit plugin. Fix for MDEV-4770 ported from 10.0. Fix added for the read_maria_plugin_info(). Log rotation can be disabled with 'set rotations=0'. --- mysys/CMakeLists.txt | 2 +- mysys/file_logger.c | 223 +++++++++++++++++++++++++++++++++++++++++++++++++++ mysys/my_static.c | 1 + 3 files changed, 225 insertions(+), 1 deletion(-) create mode 100644 mysys/file_logger.c (limited to 'mysys') diff --git a/mysys/CMakeLists.txt b/mysys/CMakeLists.txt index 37961a78fb6..f90ad0e7aaf 100644 --- a/mysys/CMakeLists.txt +++ b/mysys/CMakeLists.txt @@ -37,7 +37,7 @@ SET(MYSYS_SOURCES array.c charset-def.c charset.c checksum.c default.c safemalloc.c my_new.cc my_atomic.c my_getncpus.c my_safehash.c my_chmod.c my_rnd.c my_uuid.c wqueue.c waiting_threads.c ma_dyncol.c - my_rdtsc.c my_context.c) + my_rdtsc.c my_context.c file_logger.c) IF (WIN32) SET (MYSYS_SOURCES ${MYSYS_SOURCES} my_winthread.c my_wincond.c my_winerr.c my_winfile.c my_windac.c my_conio.c) diff --git a/mysys/file_logger.c b/mysys/file_logger.c new file mode 100644 index 00000000000..4c07b8c7854 --- /dev/null +++ b/mysys/file_logger.c @@ -0,0 +1,223 @@ +/* Copyright (C) 2012 Monty Program Ab + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + + +#include "my_global.h" +#include +#include +#include + +#ifdef HAVE_PSI_INTERFACE +/* These belong to the service initialization */ +static PSI_mutex_key key_LOCK_logger_service; +static PSI_mutex_info mutex_list[]= +{{ &key_LOCK_logger_service, "logger_service_file_st::lock", PSI_FLAG_GLOBAL}}; +#endif + +typedef struct logger_handle_st { + File file; + char path[FN_REFLEN]; + unsigned long long size_limit; + unsigned int rotations; + size_t path_len; + mysql_mutex_t lock; +} LSFS; + + +#define LOG_FLAGS (O_APPEND | O_CREAT | O_WRONLY) + +static unsigned int n_dig(unsigned int i) +{ + return (i == 0) ? 0 : ((i < 10) ? 1 : ((i < 100) ? 2 : 3)); +} + + +LOGGER_HANDLE *logger_open(const char *path, + unsigned long long size_limit, + unsigned int rotations) +{ + LOGGER_HANDLE new_log, *l_perm; + /* + I don't think we ever need more rotations, + but if it's so, the rotation procedure should be adapted to it. + */ + if (rotations > 999) + return 0; + + new_log.rotations= rotations; + new_log.size_limit= size_limit; + new_log.path_len= strlen(fn_format(new_log.path, path, + mysql_data_home, "", MY_UNPACK_FILENAME)); + + if (new_log.path_len+n_dig(rotations)+1 > FN_REFLEN) + { + errno= ENAMETOOLONG; + /* File path too long */ + return 0; + } + if ((new_log.file= my_open(new_log.path, LOG_FLAGS, MYF(0))) < 0) + { + errno= my_errno; + /* Check errno for the cause */ + return 0; + } + + if (!(l_perm= (LOGGER_HANDLE *) my_malloc(sizeof(LOGGER_HANDLE), MYF(0)))) + { + my_close(new_log.file, MYF(0)); + new_log.file= -1; + return 0; /* End of memory */ + } + *l_perm= new_log; + mysql_mutex_init(key_LOCK_logger_service, &l_perm->lock, MY_MUTEX_INIT_FAST); + return l_perm; +} + +int logger_close(LOGGER_HANDLE *log) +{ + int result; + File file= log->file; + mysql_mutex_destroy(&log->lock); + my_free(log); + if ((result= my_close(file, MYF(0)))) + errno= my_errno; + return result; +} + + +static char *logname(LOGGER_HANDLE *log, char *buf, unsigned int n_log) +{ + sprintf(buf+log->path_len, ".%0*u", n_dig(log->rotations), n_log); + return buf; +} + + +static int do_rotate(LOGGER_HANDLE *log) +{ + char namebuf[FN_REFLEN]; + int result; + unsigned int i; + char *buf_old, *buf_new, *tmp; + + if (log->rotations == 0) + return 0; + + memcpy(namebuf, log->path, log->path_len); + + buf_new= logname(log, namebuf, log->rotations); + buf_old= log->path; + for (i=log->rotations-1; i>0; i--) + { + logname(log, buf_old, i); + if (!access(buf_old, F_OK) && + (result= my_rename(buf_old, buf_new, MYF(0)))) + goto exit; + tmp= buf_old; + buf_old= buf_new; + buf_new= tmp; + } + if ((result= my_close(log->file, MYF(0)))) + goto exit; + namebuf[log->path_len]= 0; + result= my_rename(namebuf, logname(log, log->path, 1), MYF(0)); + log->file= my_open(namebuf, LOG_FLAGS, MYF(0)); +exit: + errno= my_errno; + return log->file < 0 || result; +} + + +int logger_vprintf(LOGGER_HANDLE *log, const char* fmt, va_list ap) +{ + int result; + my_off_t filesize; + char cvtbuf[1024]; + size_t n_bytes; + + mysql_mutex_lock(&log->lock); + if (log->rotations > 0) + if ((filesize= my_tell(log->file, MYF(0))) == (my_off_t) -1 || + ((unsigned long long)filesize >= log->size_limit && + do_rotate(log))) + { + result= -1; + errno= my_errno; + goto exit; /* Log rotation needed but failed */ + } + + n_bytes= my_vsnprintf(cvtbuf, sizeof(cvtbuf), fmt, ap); + if (n_bytes >= sizeof(cvtbuf)) + n_bytes= sizeof(cvtbuf) - 1; + + result= my_write(log->file, (uchar *) cvtbuf, n_bytes, MYF(0)); + +exit: + mysql_mutex_unlock(&log->lock); + return result; +} + + +int logger_write(LOGGER_HANDLE *log, const char *buffer, size_t size) +{ + int result; + my_off_t filesize; + + mysql_mutex_lock(&log->lock); + if (log->rotations > 0) + if ((filesize= my_tell(log->file, MYF(0))) == (my_off_t) -1 || + ((unsigned long long)filesize >= log->size_limit && + do_rotate(log))) + { + result= -1; + errno= my_errno; + goto exit; /* Log rotation needed but failed */ + } + + result= my_write(log->file, (uchar *) buffer, size, MYF(0)); + +exit: + mysql_mutex_unlock(&log->lock); + return result; +} + + +int logger_rotate(LOGGER_HANDLE *log) +{ + int result; + mysql_mutex_lock(&log->lock); + result= do_rotate(log); + mysql_mutex_unlock(&log->lock); + return result; +} + + +int logger_printf(LOGGER_HANDLE *log, const char *fmt, ...) +{ + int result; + va_list args; + va_start(args,fmt); + result= logger_vprintf(log, fmt, args); + va_end(args); + return result; +} + +void logger_init_mutexes() +{ +#ifdef HAVE_PSI_INTERFACE + if (PSI_server) + PSI_server->register_mutex("sql_logger", mutex_list, 1); +#endif +} + diff --git a/mysys/my_static.c b/mysys/my_static.c index bc2d8beac83..fdc01b1248b 100644 --- a/mysys/my_static.c +++ b/mysys/my_static.c @@ -28,6 +28,7 @@ my_bool timed_mutexes= 0; /* from my_init */ char * home_dir=0; +char *mysql_data_home= (char*) "."; const char *my_progname= NULL, *my_progname_short= NULL; char curr_dir[FN_REFLEN]= {0}, home_dir_buff[FN_REFLEN]= {0}; -- cgit v1.2.1 From 42f56557f59705aeec83a54f02399b04d52e9eea Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Mon, 9 Sep 2013 19:31:29 +0200 Subject: MDEV-4941 make: AIX fails with 'Identifier not allowed in cast'; syntax error in include/my_global.h C++ comments in C files, and a typo in my_global.h --- mysys/ma_dyncol.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'mysys') diff --git a/mysys/ma_dyncol.c b/mysys/ma_dyncol.c index 88730f9dc4f..62227ab6834 100644 --- a/mysys/ma_dyncol.c +++ b/mysys/ma_dyncol.c @@ -1385,7 +1385,8 @@ static inline my_bool read_fixed_header(DYNAMIC_COLUMN *str, @return ER_DYNCOL_* return code */ -int dynamic_column_get(DYNAMIC_COLUMN *str, uint column_nr, +enum enum_dyncol_func_result +dynamic_column_get(DYNAMIC_COLUMN *str, uint column_nr, DYNAMIC_COLUMN_VALUE *store_it_here) { uchar *data; @@ -1457,7 +1458,8 @@ err: @return ER_DYNCOL_* return code */ -int dynamic_column_delete(DYNAMIC_COLUMN *str, uint column_nr) +enum enum_dyncol_func_result +dynamic_column_delete(DYNAMIC_COLUMN *str, uint column_nr) { uchar *data, *header_entry, *read, *write; size_t offset_size, new_offset_size, length, entry_size, new_entry_size, @@ -2111,7 +2113,8 @@ create_new_string: */ -int dynamic_column_update(DYNAMIC_COLUMN *str, uint column_nr, +enum enum_dyncol_func_result +dynamic_column_update(DYNAMIC_COLUMN *str, uint column_nr, DYNAMIC_COLUMN_VALUE *value) { return dynamic_column_update_many(str, 1, &column_nr, value); -- cgit v1.2.1