diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2020-09-18 15:30:13 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2020-09-18 15:30:13 +0200 |
commit | b40ffa9bfdc09d88a87fd4ccaca0879a48ae0086 (patch) | |
tree | 2c2e1cd75493544e33eda7662484c6e6670b8a59 | |
parent | 9962ad64445e845707f5e203b18b5de2d794b40c (diff) | |
parent | f23164584ec145895e3f086c8c23c5e443fb1472 (diff) | |
download | php-git-b40ffa9bfdc09d88a87fd4ccaca0879a48ae0086.tar.gz |
Merge branch 'PHP-7.4'
* PHP-7.4:
Fix #78179: mysqli/mysqlnd transaction extensions
-rw-r--r-- | ext/mysqli/mysqli_nonapi.c | 50 | ||||
-rw-r--r-- | ext/mysqlnd/mysqlnd_connection.c | 30 |
2 files changed, 38 insertions, 42 deletions
diff --git a/ext/mysqli/mysqli_nonapi.c b/ext/mysqli/mysqli_nonapi.c index b3aae572e9..85c08c5b2f 100644 --- a/ext/mysqli/mysqli_nonapi.c +++ b/ext/mysqli/mysqli_nonapi.c @@ -1110,45 +1110,43 @@ extern char * mysqli_escape_string_for_tx_name_in_comment(const char * const nam static int mysqli_begin_transaction_libmysql(MYSQL * conn, const unsigned int mode, const char * const name) { int ret; - zend_bool err = FALSE; smart_str tmp_str = {0}; + char * name_esc; + char * query; + unsigned int query_len; if (mode & TRANS_START_WITH_CONSISTENT_SNAPSHOT) { if (tmp_str.s) { smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1); } smart_str_appendl(&tmp_str, "WITH CONSISTENT SNAPSHOT", sizeof("WITH CONSISTENT SNAPSHOT") - 1); } - if (mode & (TRANS_START_READ_WRITE | TRANS_START_READ_ONLY)) { - if (mysql_get_server_version(conn) < 50605L) { - php_error_docref(NULL, E_WARNING, "This server version doesn't support 'READ WRITE' and 'READ ONLY'. Minimum 5.6.5 is required"); - err = TRUE; - } else if (mode & TRANS_START_READ_WRITE) { - if (tmp_str.s) { - smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1); - } - smart_str_appendl(&tmp_str, "READ WRITE", sizeof("READ WRITE") - 1); - } else if (mode & TRANS_START_READ_ONLY) { - if (tmp_str.s) { - smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1); - } - smart_str_appendl(&tmp_str, "READ ONLY", sizeof("READ ONLY") - 1); + if (mode & TRANS_START_READ_WRITE) { + if (tmp_str.s) { + smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1); } + smart_str_appendl(&tmp_str, "READ WRITE", sizeof("READ WRITE") - 1); + } else if (mode & TRANS_START_READ_ONLY) { + if (tmp_str.s) { + smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1); + } + smart_str_appendl(&tmp_str, "READ ONLY", sizeof("READ ONLY") - 1); } smart_str_0(&tmp_str); - if (err == FALSE){ - char * name_esc = mysqli_escape_string_for_tx_name_in_comment(name); - char * query; - unsigned int query_len = spprintf(&query, 0, "START TRANSACTION%s %s", - name_esc? name_esc:"", tmp_str.s? ZSTR_VAL(tmp_str.s):""); + name_esc = mysqli_escape_string_for_tx_name_in_comment(name); + query_len = spprintf(&query, 0, "START TRANSACTION%s %s", + name_esc? name_esc:"", tmp_str.s? ZSTR_VAL(tmp_str.s):""); - smart_str_free(&tmp_str); - if (name_esc) { - efree(name_esc); - } + smart_str_free(&tmp_str); + if (name_esc) { + efree(name_esc); + } + + ret = mysql_real_query(conn, query, query_len); + efree(query); - ret = mysql_real_query(conn, query, query_len); - efree(query); + if (ret && mode & (TRANS_START_READ_WRITE | TRANS_START_READ_ONLY) && mysql_errno(conn) == 1064) { + php_error_docref(NULL, E_WARNING, "This server version doesn't support 'READ WRITE' and 'READ ONLY'. Minimum 5.6.5 is required"); } return ret; } diff --git a/ext/mysqlnd/mysqlnd_connection.c b/ext/mysqlnd/mysqlnd_connection.c index 9f34c04070..5915e1266e 100644 --- a/ext/mysqlnd/mysqlnd_connection.c +++ b/ext/mysqlnd/mysqlnd_connection.c @@ -2129,23 +2129,16 @@ MYSQLND_METHOD(mysqlnd_conn_data, tx_begin)(MYSQLND_CONN_DATA * conn, const unsi } smart_str_appendl(&tmp_str, "WITH CONSISTENT SNAPSHOT", sizeof("WITH CONSISTENT SNAPSHOT") - 1); } - if (mode & (TRANS_START_READ_WRITE | TRANS_START_READ_ONLY)) { - zend_ulong server_version = conn->m->get_server_version(conn); - if (server_version < 50605L) { - php_error_docref(NULL, E_WARNING, "This server version doesn't support 'READ WRITE' and 'READ ONLY'. Minimum 5.6.5 is required"); - smart_str_free(&tmp_str); - break; - } else if (mode & TRANS_START_READ_WRITE) { - if (tmp_str.s && ZSTR_LEN(tmp_str.s)) { - smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1); - } - smart_str_appendl(&tmp_str, "READ WRITE", sizeof("READ WRITE") - 1); - } else if (mode & TRANS_START_READ_ONLY) { - if (tmp_str.s && ZSTR_LEN(tmp_str.s)) { - smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1); - } - smart_str_appendl(&tmp_str, "READ ONLY", sizeof("READ ONLY") - 1); + if (mode & TRANS_START_READ_WRITE) { + if (tmp_str.s && ZSTR_LEN(tmp_str.s)) { + smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1); } + smart_str_appendl(&tmp_str, "READ WRITE", sizeof("READ WRITE") - 1); + } else if (mode & TRANS_START_READ_ONLY) { + if (tmp_str.s && ZSTR_LEN(tmp_str.s)) { + smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1); + } + smart_str_appendl(&tmp_str, "READ ONLY", sizeof("READ ONLY") - 1); } smart_str_0(&tmp_str); @@ -2164,6 +2157,11 @@ MYSQLND_METHOD(mysqlnd_conn_data, tx_begin)(MYSQLND_CONN_DATA * conn, const unsi } ret = conn->m->query(conn, query, query_len); mnd_sprintf_free(query); + if (ret && mode & (TRANS_START_READ_WRITE | TRANS_START_READ_ONLY) && + mysqlnd_stmt_errno(conn) == 1064) { + php_error_docref(NULL, E_WARNING, "This server version doesn't support 'READ WRITE' and 'READ ONLY'. Minimum 5.6.5 is required"); + break; + } } } while (0); conn->m->local_tx_end(conn, this_func, ret); |