From 8f5ec7de19a81921a50981e066e71c42a5d61ff8 Mon Sep 17 00:00:00 2001 From: Georg Richter Date: Sun, 2 Aug 2015 14:05:36 +0200 Subject: [PATCH 01/12] Fixed libs in mariadb_config --- CMakeLists.txt | 29 +++++++++++++++++------------ cmake/FindIconv.cmake | 12 ++++++++++-- mariadb_config/CMakeLists.txt | 8 +++----- mariadb_config/mariadb_config.c.in | 6 +++--- unittest/libmariadb/CMakeLists.txt | 1 - 5 files changed, 33 insertions(+), 23 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 23235840..923d0b0d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -79,7 +79,7 @@ ENDIF() SET(PROTOCOL_VERSION 10) # we adapted new password option from PHP's mysqlnd ! SET(MYSQL_CLIENT_VERSION_MAJOR "5") SET(MYSQL_CLIENT_VERSION_MINOR "5") -SET(MYSQL_CLIENT_VERSION_PATCH "0") +SET(MYSQL_CLIENT_VERSION_PATCH "1") SET(MYSQL_CLIENT_VERSION "${MYSQL_CLIENT_VERSION_MAJOR}.${MYSQL_CLIENT_VERSION_MINOR}.${MYSQL_CLIENT_VERSION_PATCH}") MATH(EXPR MYSQL_VERSION_ID "${MYSQL_CLIENT_VERSION_MAJOR} * 10000 + ${MYSQL_CLIENT_VERSION_MINOR} * 100 + @@ -93,8 +93,6 @@ ENDIF() INCLUDE("${CMAKE_SOURCE_DIR}/cmake/install.cmake") -# todo: we don't character sets in share - all is compiled in -SET(SHAREDIR "share") SET(DEFAULT_CHARSET_HOME "${CMAKE_INSTALL_PREFIX}") SET(PLUGINDIR "${CMAKE_INSTALL_PREFIX}/lib/plugin") @@ -109,22 +107,29 @@ ENDIF() IF(UNIX) - SEARCH_LIBRARY(LIBNSL inet_ntoa "nsl_r;nsl") - SEARCH_LIBRARY(LIBBIND bind "bind;socket") - SEARCH_LIBRARY(LIBSOCKET setsockopt "socket") + SEARCH_LIBRARY(DEFAULT_LIB inet_ntoa "c") + IF(NOT DEFAULT_LIB) + SEARCH_LIBRARY(LIBNSL inet_ntoa "nsl_r;nsl") + ENDIF() + SEARCH_LIBRARY(DEFAULT_LIB bind "c") + IF(NOT DEFAULT_LIB) + SEARCH_LIBRARY(LIBBIND bind "bind;socket") + ENDIF() + SEARCH_LIBRARY(DEFAULT_LIB setsockopt "c") + IF(NOT DEFAULT_LIB) + SEARCH_LIBRARY(LIBSOCKET setsockopt "socket") + ENDIF() SEARCH_LIBRARY(LIBDL dlopen "dl") SEARCH_LIBRARY(LIBM floor m) - SEARCH_LIBRARY(LIBICONV iconv iconv) SEARCH_LIBRARY(LIBPTHREAD pthread_getspecific "pthread;pthreads") - SET(EXTRA_LIBS "${LIBNSL}" "${LIBBIND}" "${LIBSOCKET}") + SET(EXTRA_LIBS "${LIBNSL}" "${LIBBIND}" "${LIBSOCKET}" "${LIBDL}" "${LIBM}" "${LIBPTHREAD}") FIND_PACKAGE(Threads) - SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${LIBNSL} ${LIBBIND} ${LIBICONV} - ${LIBSOCKET} ${LIBDL} ${LIBM} ${LIBPTHREAD}) #remove possible dups from required libraries - LIST(LENGTH CMAKE_REQUIRED_LIBRARIES rllength) + LIST(LENGTH SYS_LIBS rllength) IF(${rllength} GREATER 0) - LIST(REMOVE_DUPLICATES CMAKE_REQUIRED_LIBRARIES) + LIST(REMOVE_DUPLICATES SYS_LIBS) ENDIF() + SET(CMAKE_REQUIRED_LIBRARIES ${SYS_LIBS}) ENDIF() diff --git a/cmake/FindIconv.cmake b/cmake/FindIconv.cmake index 41538cc6..8f344d3d 100644 --- a/cmake/FindIconv.cmake +++ b/cmake/FindIconv.cmake @@ -20,7 +20,12 @@ IF(APPLE) /usr/lib/ NO_CMAKE_SYSTEM_PATH) ELSE() - find_library(ICONV_LIBRARIES NAMES iconv libiconv libiconv-2 c) + find_library(ICONV_LIBRARIES NAMES iconv libiconv libiconv-2) + IF(ICONV_LIBRARIES) + SET(ICONV_EXTERNAL TRUE) + ELSE() + find_library(ICONV_LIBRARIES NAMES c) + ENDIF() ENDIF() if (ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) @@ -28,7 +33,9 @@ if (ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) endif (ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) set(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR}) -set(CMAKE_REQUIRED_LIBRARIES ${ICONV_LIBRARIES}) +IF(ICONV_EXTERNAL) + set(CMAKE_REQUIRED_LIBRARIES ${ICONV_LIBRARIES}) +ENDIF() if (ICONV_FOUND) include(CheckCSourceCompiles) @@ -62,5 +69,6 @@ endif (ICONV_FOUND) MARK_AS_ADVANCED( ICONV_INCLUDE_DIR ICONV_LIBRARIES + ICONV_EXTERNAL ICONV_SECOND_ARGUMENT_IS_CONST ) diff --git a/mariadb_config/CMakeLists.txt b/mariadb_config/CMakeLists.txt index f10a37de..69d7c3ac 100644 --- a/mariadb_config/CMakeLists.txt +++ b/mariadb_config/CMakeLists.txt @@ -13,11 +13,9 @@ IF(UNIX) IF(OPENSSL_LIBRARIES) SET(extra_dynamic_LDFLAGS "${extra_dynamic_LDFLAGS} -lssl") ENDIF() - SEARCH_LIBRARY(LIBNSL getaddrinfo "nsl_r;nsl") - SEARCH_LIBRARY(LIBBIND bind "bind;socket") - SEARCH_LIBRARY(LIBSOCKET setsockopt "socket") - SEARCH_LIBRARY(LIBDL dlopen "dl") - SEARCH_LIBRARY(LIBM floor m) + IF(ICONV_EXTERNAL) + SET(extra_dynamic_LDFLAGS "${extra_dynamic_LDFLAGS} ${ICONV_LIBRARIES}") + ENDIF() FOREACH(lib ${EXTRA_LIBS}) SET(extra_dynamic_LDFLAGS "${extra_dynamic_LDFLAGS} -l${lib}") ENDFOREACH() diff --git a/mariadb_config/mariadb_config.c.in b/mariadb_config/mariadb_config.c.in index 793a313b..b4aa74c6 100644 --- a/mariadb_config/mariadb_config.c.in +++ b/mariadb_config/mariadb_config.c.in @@ -8,7 +8,7 @@ "@extra_dynamic_LDFLAGS@" #define CFLAGS INCLUDE " @CMAKE_C_FLAGS@" #define VERSION "@MYSQL_CLIENT_VERSION@" -#define PLUGIN_DIR "@PREFIX_INSTALL_DIR@/@PLUGIN_INSTALL_DIR@" +#define PLUGIN_DIR "@PREFIX_INSTALL_DIR@/@SUFFIX_INSTALL_DIR@/@PLUGIN_INSTALL_DIR@" #define SOCKET "@MYSQL_UNIX_ADDR@" #define PORT "@MYSQL_PORT@" @@ -42,8 +42,8 @@ static char *values[]= void usage(void) { int i=0; - puts("Copyright 2011 Monty Program AB"); - puts("Get compiler flags for using the MariaDB client library."); + puts("Copyright 2011-2015 MariaDB Corporation AB"); + puts("Get compiler flags for using the MariaDB Connector/C."); printf("Usage: %s [OPTIONS]\n", my_progname); while (long_options[i].name) { diff --git a/unittest/libmariadb/CMakeLists.txt b/unittest/libmariadb/CMakeLists.txt index fe7fc8e3..97fbd06f 100644 --- a/unittest/libmariadb/CMakeLists.txt +++ b/unittest/libmariadb/CMakeLists.txt @@ -52,7 +52,6 @@ IF(WITH_OPENSSL) STRING(REPLACE "SHA1 Fingerprint=" "" FINGER_PRINT "${FINGER_PRINT}") STRING(REPLACE "\n" "" FINGER_PRINT "${FINGER_PRINT}") STRING(REPLACE ":" "" SSL_CERT_FINGER_PRINT "${FINGER_PRINT}") - MESSAGE(STATUS "FINGER_PRINT ${SSL_CERT_FINGER_PRINT}") CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/unittest/libmariadb/ssl.c.in ${CMAKE_SOURCE_DIR}/unittest/libmariadb/ssl.c) From 1466fec18d1d504f0991abc0ddfd5198f6a067ac Mon Sep 17 00:00:00 2001 From: Georg Richter Date: Thu, 13 Aug 2015 10:05:02 +0200 Subject: [PATCH 02/12] Fix memory overrun: When reallocating net->buffer we need to allocate extra space for header and compressed header --- libmariadb/my_auth.c | 2 +- libmariadb/net.c | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/libmariadb/my_auth.c b/libmariadb/my_auth.c index 08300ce2..bc36d02b 100644 --- a/libmariadb/my_auth.c +++ b/libmariadb/my_auth.c @@ -278,7 +278,7 @@ static int send_client_reply_packet(MCPVIO_EXT *mpvio, mysql->client_flag|= CLIENT_SSL; /* if server doesn't support SSL and verification of server certificate - was set to mandator, we need to return an error */ + was set to mandatory, we need to return an error */ if (mysql->options.use_ssl && !(mysql->server_capabilities & CLIENT_SSL)) { if ((mysql->client_flag & CLIENT_SSL_VERIFY_SERVER_CERT) || diff --git a/libmariadb/net.c b/libmariadb/net.c index ddf97321..0bba0b52 100644 --- a/libmariadb/net.c +++ b/libmariadb/net.c @@ -164,7 +164,11 @@ static my_bool net_realloc(NET *net, size_t length) DBUG_RETURN(1); } pkt_length = (length+IO_SIZE-1) & ~(IO_SIZE-1); - if (!(buff=(uchar*) my_realloc((char*) net->buff, pkt_length + 1, MYF(MY_WME)))) + /* reallocate buffer: + size= pkt_length + NET_HEADER_SIZE + COMP_HEADER_SIZE */ + if (!(buff=(uchar*) my_realloc((char*) net->buff, + pkt_length + NET_HEADER_SIZE + COMP_HEADER_SIZE, + MYF(MY_WME)))) { DBUG_PRINT("info", ("Out of memory")); net->error=1; From a6f40f2b97b35a15b75c3a419fcfe3a894628675 Mon Sep 17 00:00:00 2001 From: Georg Richter Date: Sun, 16 Aug 2015 11:33:31 +0200 Subject: [PATCH 03/12] Fix for CONC-137: Error code not set in mysql_stmt_send_long_data --- libmariadb/my_stmt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libmariadb/my_stmt.c b/libmariadb/my_stmt.c index 414be03f..1f1c5b11 100644 --- a/libmariadb/my_stmt.c +++ b/libmariadb/my_stmt.c @@ -1811,7 +1811,7 @@ my_bool STDCALL mysql_stmt_send_long_data(MYSQL_STMT *stmt, uint param_number, DBUG_RETURN(1); } - if (stmt->mysql->status== MYSQL_STATUS_READY && (length || !stmt->params[param_number].long_data_used)) + if (length || !stmt->params[param_number].long_data_used) { int ret; size_t packet_len; @@ -1824,7 +1824,7 @@ my_bool STDCALL mysql_stmt_send_long_data(MYSQL_STMT *stmt, uint param_number, my_free(cmd_buff); DBUG_RETURN(ret); } - DBUG_RETURN(1); + DBUG_RETURN(0); } my_ulonglong STDCALL mysql_stmt_insert_id(MYSQL_STMT *stmt) From 752636192f5932e7ab29ff8697ff37f67cb5bea6 Mon Sep 17 00:00:00 2001 From: Georg Richter Date: Sat, 5 Sep 2015 17:17:14 +0200 Subject: [PATCH 04/12] Fix for CONC-138: When mysql_ssl_set will be called twice, memory from first call will not be freed. We call now mysql_optionsv in mysql_ssl_set so values will be freed and new ones will be assigned. my_strdup now checks flag MY_ALLOW_ZERO_PTR --- libmariadb/libmariadb.c | 25 ++++++++++++++----------- libmariadb/my_malloc.c | 7 ++++++- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/libmariadb/libmariadb.c b/libmariadb/libmariadb.c index 9afe1400..d277584f 100644 --- a/libmariadb/libmariadb.c +++ b/libmariadb/libmariadb.c @@ -1375,13 +1375,16 @@ int STDCALL mysql_ssl_set(MYSQL *mysql, const char *key, const char *cert, const char *ca, const char *capath, const char *cipher) { - mysql->options.ssl_key = key==0 ? 0 : my_strdup(key,MYF(0)); - mysql->options.ssl_cert = cert==0 ? 0 : my_strdup(cert,MYF(0)); - mysql->options.ssl_ca = ca==0 ? 0 : my_strdup(ca,MYF(0)); - mysql->options.ssl_capath = capath==0 ? 0 : my_strdup(capath,MYF(0)); - mysql->options.ssl_cipher = cipher==0 ? 0 : my_strdup(cipher,MYF(0)); -/* todo: add crl stuff */ + #ifdef HAVE_SSL + return (mysql_optionsv(mysql, MYSQL_OPT_SSL_KEY, key) | + mysql_optionsv(mysql, MYSQL_OPT_SSL_CERT, cert) | + mysql_optionsv(mysql, MYSQL_OPT_SSL_CA, ca) | + mysql_optionsv(mysql, MYSQL_OPT_SSL_CAPATH, capath) | + mysql_optionsv(mysql, MYSQL_OPT_SSL_CIPHER, cipher)) ? 1 : 0; +#else return 0; +#endif + } /************************************************************************** @@ -3030,23 +3033,23 @@ mysql_optionsv(MYSQL *mysql,enum mysql_option option, ...) break; case MYSQL_OPT_SSL_KEY: my_free(mysql->options.ssl_key); - mysql->options.ssl_key=my_strdup((char *)arg1,MYF(MY_WME)); + mysql->options.ssl_key=my_strdup((char *)arg1,MYF(MY_WME | MY_ALLOW_ZERO_PTR)); break; case MYSQL_OPT_SSL_CERT: my_free(mysql->options.ssl_cert); - mysql->options.ssl_cert=my_strdup((char *)arg1,MYF(MY_WME)); + mysql->options.ssl_cert=my_strdup((char *)arg1,MYF(MY_WME | MY_ALLOW_ZERO_PTR)); break; case MYSQL_OPT_SSL_CA: my_free(mysql->options.ssl_ca); - mysql->options.ssl_ca=my_strdup((char *)arg1,MYF(MY_WME)); + mysql->options.ssl_ca=my_strdup((char *)arg1,MYF(MY_WME | MY_ALLOW_ZERO_PTR)); break; case MYSQL_OPT_SSL_CAPATH: my_free(mysql->options.ssl_capath); - mysql->options.ssl_capath=my_strdup((char *)arg1,MYF(MY_WME)); + mysql->options.ssl_capath=my_strdup((char *)arg1,MYF(MY_WME | MY_ALLOW_ZERO_PTR)); break; case MYSQL_OPT_SSL_CIPHER: my_free(mysql->options.ssl_cipher); - mysql->options.ssl_cipher=my_strdup((char *)arg1,MYF(MY_WME)); + mysql->options.ssl_cipher=my_strdup((char *)arg1,MYF(MY_WME | MY_ALLOW_ZERO_PTR)); break; case MYSQL_OPT_SSL_CRL: OPT_SET_EXTENDED_VALUE(&mysql->options, ssl_crl, (char *)arg1, 1); diff --git a/libmariadb/my_malloc.c b/libmariadb/my_malloc.c index 0e681cae..665d767c 100644 --- a/libmariadb/my_malloc.c +++ b/libmariadb/my_malloc.c @@ -77,7 +77,12 @@ gptr my_memdup(const unsigned char *from, size_t length, myf MyFlags) my_string my_strdup(const char *from, myf MyFlags) { gptr ptr; - uint length=(uint) strlen(from)+1; + uint length; + + if ((MyFlags & MY_ALLOW_ZERO_PTR) && !from) + return NULL; + + length=(uint) strlen(from)+1; if ((ptr=my_malloc(length,MyFlags)) != 0) memcpy((unsigned char*) ptr, (unsigned char*) from,(size_t) length); return((my_string) ptr); From abf0080bfa0a4255713034eb60245f2d890652da Mon Sep 17 00:00:00 2001 From: Georg Richter Date: Tue, 8 Sep 2015 07:33:30 +0200 Subject: [PATCH 05/12] Fix for CONC-129 (asynchronous api): Check if connection is still alive in mysql_close_start --- libmariadb/mysql_async.c | 2 +- unittest/libmariadb/async.c | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/libmariadb/mysql_async.c b/libmariadb/mysql_async.c index e1424509..7d5ae3b7 100644 --- a/libmariadb/mysql_async.c +++ b/libmariadb/mysql_async.c @@ -805,7 +805,7 @@ mysql_close_start(MYSQL *sock) int res; /* It is legitimate to have NULL sock argument, which will do nothing. */ - if (sock) + if (sock && sock->net.vio) { res= mysql_close_slow_part_start(sock); /* If we need to block, return now and do the rest in mysql_close_cont(). */ diff --git a/unittest/libmariadb/async.c b/unittest/libmariadb/async.c index 4a947ab9..e54fb74d 100644 --- a/unittest/libmariadb/async.c +++ b/unittest/libmariadb/async.c @@ -200,10 +200,17 @@ static int test_conc131(MYSQL *my) return OK; } +static int test_conc129(MYSQL *my) +{ + MYSQL *mysql= mysql_init(NULL); + FAIL_IF(mysql_close_start(mysql), "No error expected"); +} + struct my_tests_st my_tests[] = { {"async1", async1, TEST_CONNECTION_DEFAULT, 0, NULL, NULL}, {"test_conc131", test_conc131, TEST_CONNECTION_NONE, 0, NULL, NULL}, + {"test_conc129", test_conc129, TEST_CONNECTION_NONE, 0, NULL, NULL}, {NULL, NULL, 0, 0, NULL, NULL} }; From 7b59e09cf5eecda2029295db10fdc98dfb5dacc3 Mon Sep 17 00:00:00 2001 From: Georg Richter Date: Tue, 8 Sep 2015 10:25:20 +0200 Subject: [PATCH 06/12] Fix for CONC-130: Initial wait on connect is wrong direction We need to wait for read instead of write if connect_timeout was specified --- libmariadb/libmariadb.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/libmariadb/libmariadb.c b/libmariadb/libmariadb.c index d277584f..9996587a 100644 --- a/libmariadb/libmariadb.c +++ b/libmariadb/libmariadb.c @@ -1713,10 +1713,10 @@ MYSQL *mthd_my_real_connect(MYSQL *mysql, const char *host, const char *user, if (mysql->options.extension && mysql->options.extension->async_context && mysql->options.extension->async_context->active) break; - else if (socket_block(sock, 1) == SOCKET_ERROR) + else if (socket_block(sock, 0) == SOCKET_ERROR) { - closesocket(sock); - continue; + closesocket(sock); + continue; } break; /* success! */ } @@ -1741,7 +1741,6 @@ MYSQL *mthd_my_real_connect(MYSQL *mysql, const char *host, const char *user, goto error; } } - /* set timeouts */ net->vio->read_timeout= mysql->options.read_timeout; net->vio->write_timeout= mysql->options.write_timeout; @@ -1769,8 +1768,8 @@ MYSQL *mthd_my_real_connect(MYSQL *mysql, const char *host, const char *user, vio_write_timeout(net->vio, mysql->options.read_timeout); /* Get version info */ mysql->protocol_version= PROTOCOL_VERSION; /* Assume this */ - if (mysql->options.connect_timeout >= 0 && - vio_wait_or_timeout(net->vio, FALSE, mysql->options.connect_timeout * 1000) < 1) + if (mysql->options.connect_timeout && + vio_wait_or_timeout(net->vio, TRUE, mysql->options.connect_timeout * 1000) < 1) { my_set_error(mysql, CR_SERVER_LOST, SQLSTATE_UNKNOWN, ER(CR_SERVER_LOST_EXTENDED), From bc4a8284d12e650505ca22b0f72e13e4c56773d7 Mon Sep 17 00:00:00 2001 From: Georg Richter Date: Fri, 11 Sep 2015 17:06:43 +0200 Subject: [PATCH 07/12] Fixed bug in OpenSSL: instead of ca and ca_list we need to store crl and crl_list for CRL_CHECK --- libmariadb/ma_secure.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/libmariadb/ma_secure.c b/libmariadb/ma_secure.c index cda76f38..a1d11aa3 100644 --- a/libmariadb/ma_secure.c +++ b/libmariadb/ma_secure.c @@ -283,10 +283,9 @@ static int my_ssl_set_certs(MYSQL *mysql) if ((certstore= SSL_CTX_get_cert_store(SSL_context))) { - if (X509_STORE_load_locations(certstore, mysql->options.ssl_ca, - mysql->options.ssl_capath) == 0 || - X509_STORE_set_flags(certstore, X509_V_FLAG_CRL_CHECK | - X509_V_FLAG_CRL_CHECK_ALL) == 0) + if (X509_STORE_load_locations(certstore, mysql->options.extension->ssl_crl, + mysql->options.extension->ssl_crlpath) == 0 || + X509_STORE_set_flags(certstore, X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL) == 0) goto error; } } From b950d2cf4882fb3424df8dee452efe42891e6530 Mon Sep 17 00:00:00 2001 From: Georg Richter Date: Thu, 17 Sep 2015 08:14:13 +0200 Subject: [PATCH 08/12] CONC-141: set stmt->state to MYSQL_STMT_FETCH_DONE if no more resultsets are available --- libmariadb/my_stmt.c | 1 + unittest/libmariadb/ps_bugs.c | 39 +++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/libmariadb/my_stmt.c b/libmariadb/my_stmt.c index 1f1c5b11..47a066f7 100644 --- a/libmariadb/my_stmt.c +++ b/libmariadb/my_stmt.c @@ -1887,6 +1887,7 @@ int STDCALL mysql_stmt_next_result(MYSQL_STMT *stmt) if (mysql_next_result(stmt->mysql)) { + stmt->state= MYSQL_STMT_FETCH_DONE; SET_CLIENT_STMT_ERROR(stmt, stmt->mysql->net.last_errno, stmt->mysql->net.sqlstate, stmt->mysql->net.last_error); DBUG_RETURN(1); diff --git a/unittest/libmariadb/ps_bugs.c b/unittest/libmariadb/ps_bugs.c index a55dc00c..a03c8174 100644 --- a/unittest/libmariadb/ps_bugs.c +++ b/unittest/libmariadb/ps_bugs.c @@ -3868,7 +3868,46 @@ static int test_conc_5(MYSQL *mysql) return OK; } +static int test_conc141(MYSQL *mysql) +{ + int rc; + MYSQL_RES *res; + char *query= "CALL p_conc141"; + MYSQL_STMT *stmt= mysql_stmt_init(mysql); + + rc= mysql_query(mysql, "DROP TABLE IF EXISTS conc141"); + check_mysql_rc(rc, mysql); + rc= mysql_query(mysql, "CREATE TABLE conc141 (KeyVal int not null primary key)"); + check_mysql_rc(rc, mysql); + rc= mysql_query(mysql, "INSERT INTO conc141 VALUES(1)"); + check_mysql_rc(rc, mysql); + rc= mysql_query(mysql, "DROP PROCEDURE IF EXISTS p_conc141"); + check_mysql_rc(rc, mysql); + rc= mysql_query(mysql, "CREATE PROCEDURE p_conc141()\n" + "BEGIN\n" + "select * from conc141;\n" + "insert into conc141(KeyVal) VALUES(1);\n" + "END"); + check_mysql_rc(rc, mysql); + + rc= mysql_stmt_prepare(stmt, query, strlen(query)); + check_stmt_rc(rc, stmt); + + rc= mysql_stmt_execute(stmt); + check_stmt_rc(rc, stmt); + /* skip first result */ + rc= mysql_stmt_next_result(stmt); + FAIL_IF(rc==-1, "No more results and error expected"); + mysql_stmt_free_result(stmt); + FAIL_IF(mysql_stmt_errno(stmt), "No Error expected"); + rc= mysql_stmt_execute(stmt); + check_stmt_rc(rc, stmt); + mysql_stmt_close(stmt); + return OK; +} + struct my_tests_st my_tests[] = { + {"test_conc141", test_conc141, TEST_CONNECTION_NEW, 0, NULL , NULL}, {"test_conc67", test_conc67, TEST_CONNECTION_DEFAULT, 0, NULL , NULL}, {"test_conc_5", test_conc_5, TEST_CONNECTION_DEFAULT, 0, NULL , NULL}, {"test_bug1115", test_bug1115, TEST_CONNECTION_DEFAULT, 0, NULL , NULL}, From 8f645282798d6e2499728a86b4d1c71bd525355f Mon Sep 17 00:00:00 2001 From: Georg Richter Date: Thu, 17 Sep 2015 11:11:38 +0200 Subject: [PATCH 09/12] Fix for CONC-140: Prevent redefinition of ssize_t for MinGW build --- include/my_global.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/my_global.h b/include/my_global.h index 1925e4b3..14216bdc 100644 --- a/include/my_global.h +++ b/include/my_global.h @@ -454,7 +454,7 @@ typedef SOCKET_SIZE_TYPE size_socket; #ifdef _WIN32 #define NO_DIR_LIBRARY /* Not standar dir-library */ #define USE_MY_STAT_STRUCT /* For my_lib */ -#ifdef _SIZE_T_DEFINED +#ifdef (_MSVC) typedef SSIZE_T ssize_t; #endif #endif From b0444f573fa39e83a947b36b421e278a4ab9ab08 Mon Sep 17 00:00:00 2001 From: Georg Richter Date: Thu, 17 Sep 2015 14:15:38 +0200 Subject: [PATCH 10/12] Fix for CONC-140: MinGW error due to ssize_t redefinition --- include/my_global.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/my_global.h b/include/my_global.h index 14216bdc..138627d2 100644 --- a/include/my_global.h +++ b/include/my_global.h @@ -454,7 +454,7 @@ typedef SOCKET_SIZE_TYPE size_socket; #ifdef _WIN32 #define NO_DIR_LIBRARY /* Not standar dir-library */ #define USE_MY_STAT_STRUCT /* For my_lib */ -#ifdef (_MSVC) +#ifdef _MSVC typedef SSIZE_T ssize_t; #endif #endif From 07c0170df3f22f70754141dd80e6e90f6de2b562 Mon Sep 17 00:00:00 2001 From: Georg Richter Date: Thu, 17 Sep 2015 19:17:53 +0200 Subject: [PATCH 11/12] Fixed build when using external iconv on MacOS --- CMakeLists.txt | 5 ++++- cmake/FindIconv.cmake | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 923d0b0d..daedf11b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -192,7 +192,10 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/include) IF(WIN32) SET(SYSTEM_LIBS ws2_32 advapi32 kernel32) ELSE() - SET(SYSTEM_LIBS ${LIBPTHREAD} ${LIBDL} ${LIBM} ${LIBICONV}) + SET(SYSTEM_LIBS ${LIBPTHREAD} ${LIBDL} ${LIBM}) + IF(ICONV_EXTERNAL) + SET(SYSTEM_LIBS ${SYSTEM_LIBS} ${ICONV_LIBRARIES}) + ENDIF() ENDIF() IF(OPENSSL_FOUND) SET(SYSTEM_LIBS ${SYSTEM_LIBS} ${SSL_LIBRARIES}) diff --git a/cmake/FindIconv.cmake b/cmake/FindIconv.cmake index 8f344d3d..338258a1 100644 --- a/cmake/FindIconv.cmake +++ b/cmake/FindIconv.cmake @@ -19,6 +19,7 @@ IF(APPLE) /opt/local/lib/ /usr/lib/ NO_CMAKE_SYSTEM_PATH) + SET(ICONV_EXTERNAL TRUE) ELSE() find_library(ICONV_LIBRARIES NAMES iconv libiconv libiconv-2) IF(ICONV_LIBRARIES) @@ -33,7 +34,7 @@ if (ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) endif (ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) set(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR}) -IF(ICONV_EXTERNAL) +IF($ICONV_EXTERNAL) set(CMAKE_REQUIRED_LIBRARIES ${ICONV_LIBRARIES}) ENDIF() From 1f71590c05703751bc39aa4157bb895637b1a85c Mon Sep 17 00:00:00 2001 From: Georg Richter Date: Fri, 18 Sep 2015 14:35:43 +0200 Subject: [PATCH 12/12] Fix for CONC-139: Build with XCode generator fails Both shared and static library are built from object library. XCode doesn't like targets which have only object files, so we just add an empty file. --- CMakeLists.txt | 2 +- cmake/symlink.cmake | 30 ++++++++++++++++++++++++ libmariadb/CMakeLists.txt | 48 +++++++++++++-------------------------- 3 files changed, 47 insertions(+), 33 deletions(-) create mode 100644 cmake/symlink.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index daedf11b..e5978f22 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -202,8 +202,8 @@ IF(OPENSSL_FOUND) ENDIF() ADD_SUBDIRECTORY(include) -ADD_SUBDIRECTORY(plugins) ADD_SUBDIRECTORY(libmariadb) +ADD_SUBDIRECTORY(plugins) IF(NOT WIN32) ADD_SUBDIRECTORY(mariadb_config) ENDIF() diff --git a/cmake/symlink.cmake b/cmake/symlink.cmake new file mode 100644 index 00000000..559f3e81 --- /dev/null +++ b/cmake/symlink.cmake @@ -0,0 +1,30 @@ +MACRO(create_symlink symlink_name target install_path) +# According to cmake documentation symlinks work on unix systems only +IF(UNIX) + # Get target components + GET_TARGET_PROPERTY(target_location ${target} LOCATION) + GET_FILENAME_COMPONENT(target_path ${target_location} PATH) + GET_FILENAME_COMPONENT(target_name ${target_location} NAME) + + ADD_CUSTOM_COMMAND( + OUTPUT ${target_path}/${symlink_name} + COMMAND ${CMAKE_COMMAND} ARGS -E remove -f ${target_path}/${symlink_name} + COMMAND ${CMAKE_COMMAND} ARGS -E create_symlink ${target_name} ${symlink_name} + WORKING_DIRECTORY ${target_path} + DEPENDS ${target} + ) + + ADD_CUSTOM_TARGET(SYM_${symlink_name} + ALL + DEPENDS ${target_path}/${symlink_name}) + SET_TARGET_PROPERTIES(SYM_${symlink_name} PROPERTIES CLEAN_DIRECT_OUTPUT 1) + + IF(CMAKE_GENERATOR MATCHES "Xcode") + # For Xcode, replace project config with install config + STRING(REPLACE "${CMAKE_CFG_INTDIR}" + "\${CMAKE_INSTALL_CONFIG_NAME}" output ${target_path}/${symlink_name}) + ENDIF() + + INSTALL(FILES ${target_path}/${symlink_name} DESTINATION ${install_path}) +ENDIF() +ENDMACRO() diff --git a/libmariadb/CMakeLists.txt b/libmariadb/CMakeLists.txt index 1f07d901..1fd76440 100644 --- a/libmariadb/CMakeLists.txt +++ b/libmariadb/CMakeLists.txt @@ -361,10 +361,17 @@ IF(UNIX) SET_TARGET_PROPERTIES(mariadb_obj PROPERTIES COMPILE_FLAGS "${CMAKE_SHARED_LIBRARY_C_FLAGS}") ENDIF() -ADD_LIBRARY(mariadbclient STATIC $ ${EXPORT_LINK}) +# Xcode doesn't support targets that have only object files, +# so let's add an empty file to keep Xcode happy +IF(CMAKE_GENERATOR MATCHES Xcode) + FILE(WRITE ${CMAKE_SOURCE_DIR}/libmariadb/empty.c "") + SET(EMPTY_FILE ${CMAKE_SOURCE_DIR}/libmariadb/empty.c) +ENDIF() + +ADD_LIBRARY(mariadbclient STATIC $ ${EMPTY_FILE} ${EXPORT_LINK}) TARGET_LINK_LIBRARIES(mariadbclient ${SYSTEM_LIBS}) -ADD_LIBRARY(libmariadb SHARED $ ${EXPORT_LINK}) +ADD_LIBRARY(libmariadb SHARED $ ${EMPTY_FILE} ${EXPORT_LINK}) TARGET_LINK_LIBRARIES(libmariadb ${SYSTEM_LIBS}) IF(UNIX) SET_TARGET_PROPERTIES(libmariadb PROPERTIES COMPILE_FLAGS "${CMAKE_SHARED_LIBRARY_C_FLAGS}") @@ -386,33 +393,18 @@ SET_TARGET_PROPERTIES(libmariadb PROPERTIES VERSION # # Installation # +INCLUDE(${CMAKE_SOURCE_DIR}/cmake/symlink.cmake) + # There are still several projects which don't make use # of the config program. To make sure these programs can # use mariadb client library we provide libmysql symlinks IF(NOT WIN32 AND WITH_MYSQLCOMPAT) - ADD_CUSTOM_COMMAND(OUTPUT "libmysql${CMAKE_SHARED_LIBRARY_SUFFIX}" - "libmysqlclient${CMAKE_SHARED_LIBRARY_SUFFIX}" - "libmysqlclient_r${CMAKE_SHARED_LIBRARY_SUFFIX}" - "libmysqlclient${CMAKE_STATIC_LIBRARY_SUFFIX}" - COMMAND ${CMAKE_COMMAND} ARGS -E remove -f libmysql${CMAKE_SHARED_LIBRARY_SUFFIX} - COMMAND ${CMAKE_COMMAND} ARGS -E create_symlink libmariadb${CMAKE_SHARED_LIBRARY_SUFFIX} libmysql${CMAKE_SHARED_LIBRARY_SUFFIX} - COMMAND ${CMAKE_COMMAND} ARGS -E remove -f libmysqlclient_r${CMAKE_SHARED_LIBRARY_SUFFIX} - COMMAND ${CMAKE_COMMAND} ARGS -E create_symlink libmariadb${CMAKE_SHARED_LIBRARY_SUFFIX} libmysqlclient_r${CMAKE_SHARED_LIBRARY_SUFFIX} - COMMAND ${CMAKE_COMMAND} ARGS -E remove -f libmysqlclient${CMAKE_SHARED_LIBRARY_SUFFIX} - COMMAND ${CMAKE_COMMAND} ARGS -E create_symlink libmariadb${CMAKE_SHARED_LIBRARY_SUFFIX} libmysqlclient${CMAKE_SHARED_LIBRARY_SUFFIX} - COMMAND ${CMAKE_COMMAND} ARGS -E remove -f libmysqlclient${CMAKE_STATIC_LIBRARY_SUFFIX} - COMMAND ${CMAKE_COMMAND} ARGS -E create_symlink libmariadbclient${CMAKE_STATIC_LIBRARY_SUFFIX} libmysqlclient${CMAKE_STATIC_LIBRARY_SUFFIX} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/libmariadb - DEPENDS libmariadb mariadbclient) - -ADD_CUSTOM_TARGET(LIBMYSQL_SYMLINKS - ALL - DEPENDS "libmysql${CMAKE_SHARED_LIBRARY_SUFFIX}" - "libmysqlclient_r${CMAKE_SHARED_LIBRARY_SUFFIX}" - "libmysqlclient${CMAKE_SHARED_LIBRARY_SUFFIX}" - "libmysqlclient${CMAKE_STATIC_LIBRARY_SUFFIX}" - VERBATIM) + SET(INSTALL_PATH ${LIB_INSTALL_DIR}/${SUFFIX_INSTALL_DIR}) + create_symlink(libmysqlclient${CMAKE_SHARED_LIBRARY_SUFFIX} libmariadb ${INSTALL_PATH}) + create_symlink(libmysqlclient_r${CMAKE_SHARED_LIBRARY_SUFFIX} libmariadb ${INSTALL_PATH}) + create_symlink(libmysqlclient${CMAKE_STATIC_LIBRARY_SUFFIX} mariadbclient ${INSTALL_PATH}) + create_symlink(libmysqlclient_r${CMAKE_STATIC_LIBRARY_SUFFIX} mariadbclient ${INSTALL_PATH}) ENDIF() @@ -422,14 +414,6 @@ INSTALL(TARGETS LIBRARY DESTINATION "${LIB_INSTALL_DIR}/${SUFFIX_INSTALL_DIR}" ARCHIVE DESTINATION "${LIB_INSTALL_DIR}/${SUFFIX_INSTALL_DIR}") -IF(NOT WIN32 AND WITH_MYSQLCOMPAT) - INSTALL(FILES "${CMAKE_BINARY_DIR}/libmariadb/libmysql${CMAKE_SHARED_LIBRARY_SUFFIX}" - "${CMAKE_BINARY_DIR}/libmariadb/libmysqlclient${CMAKE_SHARED_LIBRARY_SUFFIX}" - "${CMAKE_BINARY_DIR}/libmariadb/libmysqlclient_r${CMAKE_SHARED_LIBRARY_SUFFIX}" - "${CMAKE_BINARY_DIR}/libmariadb/libmysqlclient${CMAKE_STATIC_LIBRARY_SUFFIX}" - DESTINATION ${LIB_INSTALL_DIR}/mariadb) -ENDIF() - INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/include/ DESTINATION ${INCLUDE_INSTALL_DIR}/${SUFFIX_INSTALL_DIR}) INSTALL(FILES