Skip to content

Commit b40ffa9

Browse files
committed
Merge branch 'PHP-7.4'
* PHP-7.4: Fix #78179: mysqli/mysqlnd transaction extensions
2 parents 9962ad6 + f231645 commit b40ffa9

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
@@ -1110,45 +1110,43 @@ extern char * mysqli_escape_string_for_tx_name_in_comment(const char * const nam
11101110
static int mysqli_begin_transaction_libmysql(MYSQL * conn, const unsigned int mode, const char * const name)
11111111
{
11121112
int ret;
1113-
zend_bool err = FALSE;
11141113
smart_str tmp_str = {0};
1114+
char * name_esc;
1115+
char * query;
1116+
unsigned int query_len;
11151117
if (mode & TRANS_START_WITH_CONSISTENT_SNAPSHOT) {
11161118
if (tmp_str.s) {
11171119
smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1);
11181120
}
11191121
smart_str_appendl(&tmp_str, "WITH CONSISTENT SNAPSHOT", sizeof("WITH CONSISTENT SNAPSHOT") - 1);
11201122
}
1121-
if (mode & (TRANS_START_READ_WRITE | TRANS_START_READ_ONLY)) {
1122-
if (mysql_get_server_version(conn) < 50605L) {
1123-
php_error_docref(NULL, E_WARNING, "This server version doesn't support 'READ WRITE' and 'READ ONLY'. Minimum 5.6.5 is required");
1124-
err = TRUE;
1125-
} else if (mode & TRANS_START_READ_WRITE) {
1126-
if (tmp_str.s) {
1127-
smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1);
1128-
}
1129-
smart_str_appendl(&tmp_str, "READ WRITE", sizeof("READ WRITE") - 1);
1130-
} else if (mode & TRANS_START_READ_ONLY) {
1131-
if (tmp_str.s) {
1132-
smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1);
1133-
}
1134-
smart_str_appendl(&tmp_str, "READ ONLY", sizeof("READ ONLY") - 1);
1123+
if (mode & TRANS_START_READ_WRITE) {
1124+
if (tmp_str.s) {
1125+
smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1);
11351126
}
1127+
smart_str_appendl(&tmp_str, "READ WRITE", sizeof("READ WRITE") - 1);
1128+
} else if (mode & TRANS_START_READ_ONLY) {
1129+
if (tmp_str.s) {
1130+
smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1);
1131+
}
1132+
smart_str_appendl(&tmp_str, "READ ONLY", sizeof("READ ONLY") - 1);
11361133
}
11371134
smart_str_0(&tmp_str);
11381135

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

1145-
smart_str_free(&tmp_str);
1146-
if (name_esc) {
1147-
efree(name_esc);
1148-
}
1140+
smart_str_free(&tmp_str);
1141+
if (name_esc) {
1142+
efree(name_esc);
1143+
}
1144+
1145+
ret = mysql_real_query(conn, query, query_len);
1146+
efree(query);
11491147

1150-
ret = mysql_real_query(conn, query, query_len);
1151-
efree(query);
1148+
if (ret && mode & (TRANS_START_READ_WRITE | TRANS_START_READ_ONLY) && mysql_errno(conn) == 1064) {
1149+
php_error_docref(NULL, E_WARNING, "This server version doesn't support 'READ WRITE' and 'READ ONLY'. Minimum 5.6.5 is required");
11521150
}
11531151
return ret;
11541152
}

ext/mysqlnd/mysqlnd_connection.c

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2129,23 +2129,16 @@ MYSQLND_METHOD(mysqlnd_conn_data, tx_begin)(MYSQLND_CONN_DATA * conn, const unsi
21292129
}
21302130
smart_str_appendl(&tmp_str, "WITH CONSISTENT SNAPSHOT", sizeof("WITH CONSISTENT SNAPSHOT") - 1);
21312131
}
2132-
if (mode & (TRANS_START_READ_WRITE | TRANS_START_READ_ONLY)) {
2133-
zend_ulong server_version = conn->m->get_server_version(conn);
2134-
if (server_version < 50605L) {
2135-
php_error_docref(NULL, E_WARNING, "This server version doesn't support 'READ WRITE' and 'READ ONLY'. Minimum 5.6.5 is required");
2136-
smart_str_free(&tmp_str);
2137-
break;
2138-
} else if (mode & TRANS_START_READ_WRITE) {
2139-
if (tmp_str.s && ZSTR_LEN(tmp_str.s)) {
2140-
smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1);
2141-
}
2142-
smart_str_appendl(&tmp_str, "READ WRITE", sizeof("READ WRITE") - 1);
2143-
} else if (mode & TRANS_START_READ_ONLY) {
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 ONLY", sizeof("READ ONLY") - 1);
2132+
if (mode & TRANS_START_READ_WRITE) {
2133+
if (tmp_str.s && ZSTR_LEN(tmp_str.s)) {
2134+
smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1);
21482135
}
2136+
smart_str_appendl(&tmp_str, "READ WRITE", sizeof("READ WRITE") - 1);
2137+
} else if (mode & TRANS_START_READ_ONLY) {
2138+
if (tmp_str.s && ZSTR_LEN(tmp_str.s)) {
2139+
smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1);
2140+
}
2141+
smart_str_appendl(&tmp_str, "READ ONLY", sizeof("READ ONLY") - 1);
21492142
}
21502143
smart_str_0(&tmp_str);
21512144

@@ -2164,6 +2157,11 @@ MYSQLND_METHOD(mysqlnd_conn_data, tx_begin)(MYSQLND_CONN_DATA * conn, const unsi
21642157
}
21652158
ret = conn->m->query(conn, query, query_len);
21662159
mnd_sprintf_free(query);
2160+
if (ret && mode & (TRANS_START_READ_WRITE | TRANS_START_READ_ONLY) &&
2161+
mysqlnd_stmt_errno(conn) == 1064) {
2162+
php_error_docref(NULL, E_WARNING, "This server version doesn't support 'READ WRITE' and 'READ ONLY'. Minimum 5.6.5 is required");
2163+
break;
2164+
}
21672165
}
21682166
} while (0);
21692167
conn->m->local_tx_end(conn, this_func, ret);

0 commit comments

Comments
 (0)