Skip to content

Commit f231645

Browse files
committed
Merge branch 'PHP-7.3' into PHP-7.4
* PHP-7.3: Fix #78179: mysqli/mysqlnd transaction extensions
2 parents e6dc9ab + 740f0f6 commit f231645

File tree

2 files changed

+38
-42
lines changed

2 files changed

+38
-42
lines changed

ext/mysqli/mysqli_nonapi.c

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,45 +1113,43 @@ extern char * mysqli_escape_string_for_tx_name_in_comment(const char * const nam
11131113
static int mysqli_begin_transaction_libmysql(MYSQL * conn, const unsigned int mode, const char * const name)
11141114
{
11151115
int ret;
1116-
zend_bool err = FALSE;
11171116
smart_str tmp_str = {0};
1117+
char * name_esc;
1118+
char * query;
1119+
unsigned int query_len;
11181120
if (mode & TRANS_START_WITH_CONSISTENT_SNAPSHOT) {
11191121
if (tmp_str.s) {
11201122
smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1);
11211123
}
11221124
smart_str_appendl(&tmp_str, "WITH CONSISTENT SNAPSHOT", sizeof("WITH CONSISTENT SNAPSHOT") - 1);
11231125
}
1124-
if (mode & (TRANS_START_READ_WRITE | TRANS_START_READ_ONLY)) {
1125-
if (mysql_get_server_version(conn) < 50605L) {
1126-
php_error_docref(NULL, E_WARNING, "This server version doesn't support 'READ WRITE' and 'READ ONLY'. Minimum 5.6.5 is required");
1127-
err = TRUE;
1128-
} else if (mode & TRANS_START_READ_WRITE) {
1129-
if (tmp_str.s) {
1130-
smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1);
1131-
}
1132-
smart_str_appendl(&tmp_str, "READ WRITE", sizeof("READ WRITE") - 1);
1133-
} else if (mode & TRANS_START_READ_ONLY) {
1134-
if (tmp_str.s) {
1135-
smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1);
1136-
}
1137-
smart_str_appendl(&tmp_str, "READ ONLY", sizeof("READ ONLY") - 1);
1126+
if (mode & TRANS_START_READ_WRITE) {
1127+
if (tmp_str.s) {
1128+
smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1);
11381129
}
1130+
smart_str_appendl(&tmp_str, "READ WRITE", sizeof("READ WRITE") - 1);
1131+
} else if (mode & TRANS_START_READ_ONLY) {
1132+
if (tmp_str.s) {
1133+
smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1);
1134+
}
1135+
smart_str_appendl(&tmp_str, "READ ONLY", sizeof("READ ONLY") - 1);
11391136
}
11401137
smart_str_0(&tmp_str);
11411138

1142-
if (err == FALSE){
1143-
char * name_esc = mysqli_escape_string_for_tx_name_in_comment(name);
1144-
char * query;
1145-
unsigned int query_len = spprintf(&query, 0, "START TRANSACTION%s %s",
1146-
name_esc? name_esc:"", tmp_str.s? ZSTR_VAL(tmp_str.s):"");
1139+
name_esc = mysqli_escape_string_for_tx_name_in_comment(name);
1140+
query_len = spprintf(&query, 0, "START TRANSACTION%s %s",
1141+
name_esc? name_esc:"", tmp_str.s? ZSTR_VAL(tmp_str.s):"");
11471142

1148-
smart_str_free(&tmp_str);
1149-
if (name_esc) {
1150-
efree(name_esc);
1151-
}
1143+
smart_str_free(&tmp_str);
1144+
if (name_esc) {
1145+
efree(name_esc);
1146+
}
1147+
1148+
ret = mysql_real_query(conn, query, query_len);
1149+
efree(query);
11521150

1153-
ret = mysql_real_query(conn, query, query_len);
1154-
efree(query);
1151+
if (ret && mode & (TRANS_START_READ_WRITE | TRANS_START_READ_ONLY) && mysql_errno(conn) == 1064) {
1152+
php_error_docref(NULL, E_WARNING, "This server version doesn't support 'READ WRITE' and 'READ ONLY'. Minimum 5.6.5 is required");
11551153
}
11561154
return ret;
11571155
}

ext/mysqlnd/mysqlnd_connection.c

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2134,23 +2134,16 @@ MYSQLND_METHOD(mysqlnd_conn_data, tx_begin)(MYSQLND_CONN_DATA * conn, const unsi
21342134
}
21352135
smart_str_appendl(&tmp_str, "WITH CONSISTENT SNAPSHOT", sizeof("WITH CONSISTENT SNAPSHOT") - 1);
21362136
}
2137-
if (mode & (TRANS_START_READ_WRITE | TRANS_START_READ_ONLY)) {
2138-
zend_ulong server_version = conn->m->get_server_version(conn);
2139-
if (server_version < 50605L) {
2140-
php_error_docref(NULL, E_WARNING, "This server version doesn't support 'READ WRITE' and 'READ ONLY'. Minimum 5.6.5 is required");
2141-
smart_str_free(&tmp_str);
2142-
break;
2143-
} else if (mode & TRANS_START_READ_WRITE) {
2144-
if (tmp_str.s && ZSTR_LEN(tmp_str.s)) {
2145-
smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1);
2146-
}
2147-
smart_str_appendl(&tmp_str, "READ WRITE", sizeof("READ WRITE") - 1);
2148-
} else if (mode & TRANS_START_READ_ONLY) {
2149-
if (tmp_str.s && ZSTR_LEN(tmp_str.s)) {
2150-
smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1);
2151-
}
2152-
smart_str_appendl(&tmp_str, "READ ONLY", sizeof("READ ONLY") - 1);
2137+
if (mode & TRANS_START_READ_WRITE) {
2138+
if (tmp_str.s && ZSTR_LEN(tmp_str.s)) {
2139+
smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1);
21532140
}
2141+
smart_str_appendl(&tmp_str, "READ WRITE", sizeof("READ WRITE") - 1);
2142+
} else if (mode & TRANS_START_READ_ONLY) {
2143+
if (tmp_str.s && ZSTR_LEN(tmp_str.s)) {
2144+
smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1);
2145+
}
2146+
smart_str_appendl(&tmp_str, "READ ONLY", sizeof("READ ONLY") - 1);
21542147
}
21552148
smart_str_0(&tmp_str);
21562149

@@ -2169,6 +2162,11 @@ MYSQLND_METHOD(mysqlnd_conn_data, tx_begin)(MYSQLND_CONN_DATA * conn, const unsi
21692162
}
21702163
ret = conn->m->query(conn, query, query_len);
21712164
mnd_sprintf_free(query);
2165+
if (ret && mode & (TRANS_START_READ_WRITE | TRANS_START_READ_ONLY) &&
2166+
mysqlnd_stmt_errno(conn) == 1064) {
2167+
php_error_docref(NULL, E_WARNING, "This server version doesn't support 'READ WRITE' and 'READ ONLY'. Minimum 5.6.5 is required");
2168+
break;
2169+
}
21722170
}
21732171
} while (0);
21742172
conn->m->local_tx_end(conn, this_func, ret);

0 commit comments

Comments
 (0)