summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2020-09-18 15:30:13 +0200
committerNikita Popov <nikita.ppv@gmail.com>2020-09-18 15:30:13 +0200
commitb40ffa9bfdc09d88a87fd4ccaca0879a48ae0086 (patch)
tree2c2e1cd75493544e33eda7662484c6e6670b8a59
parent9962ad64445e845707f5e203b18b5de2d794b40c (diff)
parentf23164584ec145895e3f086c8c23c5e443fb1472 (diff)
downloadphp-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.c50
-rw-r--r--ext/mysqlnd/mysqlnd_connection.c30
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);