Skip to content

Commit 740f0f6

Browse files
grooverdannikic
authored andcommitted
Fix #78179: mysqli/mysqlnd transaction extensions
MariaDB versioning created a mess with regarding testing features based on version. We sidestep the problem here by assuming the extensions are present, and if a syntax error occurs with a SQL mode TRANS_START_READ_WRITE | TRANS_START_READ_ONLY enabled, then output the same warning as before.
1 parent 70cba36 commit 740f0f6

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
@@ -1086,45 +1086,43 @@ extern char * mysqli_escape_string_for_tx_name_in_comment(const char * const nam
10861086
static int mysqli_begin_transaction_libmysql(MYSQL * conn, const unsigned int mode, const char * const name)
10871087
{
10881088
int ret;
1089-
zend_bool err = FALSE;
10901089
smart_str tmp_str = {0};
1090+
char * name_esc;
1091+
char * query;
1092+
unsigned int query_len;
10911093
if (mode & TRANS_START_WITH_CONSISTENT_SNAPSHOT) {
10921094
if (tmp_str.s) {
10931095
smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1);
10941096
}
10951097
smart_str_appendl(&tmp_str, "WITH CONSISTENT SNAPSHOT", sizeof("WITH CONSISTENT SNAPSHOT") - 1);
10961098
}
1097-
if (mode & (TRANS_START_READ_WRITE | TRANS_START_READ_ONLY)) {
1098-
if (mysql_get_server_version(conn) < 50605L) {
1099-
php_error_docref(NULL, E_WARNING, "This server version doesn't support 'READ WRITE' and 'READ ONLY'. Minimum 5.6.5 is required");
1100-
err = TRUE;
1101-
} else if (mode & TRANS_START_READ_WRITE) {
1102-
if (tmp_str.s) {
1103-
smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1);
1104-
}
1105-
smart_str_appendl(&tmp_str, "READ WRITE", sizeof("READ WRITE") - 1);
1106-
} else if (mode & TRANS_START_READ_ONLY) {
1107-
if (tmp_str.s) {
1108-
smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1);
1109-
}
1110-
smart_str_appendl(&tmp_str, "READ ONLY", sizeof("READ ONLY") - 1);
1099+
if (mode & TRANS_START_READ_WRITE) {
1100+
if (tmp_str.s) {
1101+
smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1);
11111102
}
1103+
smart_str_appendl(&tmp_str, "READ WRITE", sizeof("READ WRITE") - 1);
1104+
} else if (mode & TRANS_START_READ_ONLY) {
1105+
if (tmp_str.s) {
1106+
smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1);
1107+
}
1108+
smart_str_appendl(&tmp_str, "READ ONLY", sizeof("READ ONLY") - 1);
11121109
}
11131110
smart_str_0(&tmp_str);
11141111

1115-
if (err == FALSE){
1116-
char * name_esc = mysqli_escape_string_for_tx_name_in_comment(name);
1117-
char * query;
1118-
unsigned int query_len = spprintf(&query, 0, "START TRANSACTION%s %s",
1119-
name_esc? name_esc:"", tmp_str.s? ZSTR_VAL(tmp_str.s):"");
1112+
name_esc = mysqli_escape_string_for_tx_name_in_comment(name);
1113+
query_len = spprintf(&query, 0, "START TRANSACTION%s %s",
1114+
name_esc? name_esc:"", tmp_str.s? ZSTR_VAL(tmp_str.s):"");
11201115

1121-
smart_str_free(&tmp_str);
1122-
if (name_esc) {
1123-
efree(name_esc);
1124-
}
1116+
smart_str_free(&tmp_str);
1117+
if (name_esc) {
1118+
efree(name_esc);
1119+
}
1120+
1121+
ret = mysql_real_query(conn, query, query_len);
1122+
efree(query);
11251123

1126-
ret = mysql_real_query(conn, query, query_len);
1127-
efree(query);
1124+
if (ret && mode & (TRANS_START_READ_WRITE | TRANS_START_READ_ONLY) && mysql_errno(conn) == 1064) {
1125+
php_error_docref(NULL, E_WARNING, "This server version doesn't support 'READ WRITE' and 'READ ONLY'. Minimum 5.6.5 is required");
11281126
}
11291127
return ret;
11301128
}

ext/mysqlnd/mysqlnd_connection.c

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

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

0 commit comments

Comments
 (0)