diff --git a/include/mariadb_python.h b/include/mariadb_python.h index 91bd06d..1448092 100755 --- a/include/mariadb_python.h +++ b/include/mariadb_python.h @@ -424,9 +424,6 @@ MrdbParser_parse(MrdbParser *p, uint8_t is_batch, char *errmsg, size_t errmsg_le #define MrdbIndicator_Check(a)\ (Py_TYPE((a)) == &MrdbIndicator_Type) -#define MARIADB_FEATURE_SUPPORTED(mysql,version)\ - (mysql_get_server_version((mysql)) >= (version)) - #define MARIADB_CHECK_CONNECTION(connection, ret)\ if (!(connection) || !(connection)->mysql)\ {\ diff --git a/src/mariadb_codecs.c b/src/mariadb_codecs.c index f5da74b..fb99b8b 100644 --- a/src/mariadb_codecs.c +++ b/src/mariadb_codecs.c @@ -837,8 +837,11 @@ mariadb_get_parameter(MrdbCursor *self, { PyObject *row= NULL, *column= NULL; + ulong extended_server_capabilities= 0; - + mariadb_get_infov(self->stmt->mysql, + MARIADB_CONNECTION_EXTENDED_SERVER_CAPABILITIES, + &extended_server_capabilities); if (is_bulk) { /* check if row_nr and column_nr are in the range from @@ -889,7 +892,7 @@ mariadb_get_parameter(MrdbCursor *self, /* check if an indicator was passed */ if (MrdbIndicator_Check(column)) { - if (!MARIADB_FEATURE_SUPPORTED(self->stmt->mysql, 100206)) + if (!(extended_server_capabilities & (MARIADB_CLIENT_STMT_BULK_OPERATIONS >> 32))) { mariadb_throw_exception(NULL, Mariadb_DataError, 0, "MariaDB %s doesn't support indicator variables. "\ @@ -900,7 +903,7 @@ mariadb_get_parameter(MrdbCursor *self, param->indicator= (char)MrdbIndicator_AsLong(column); param->value= NULL; /* you can't have both indicator and value */ } else if (column == Py_None) { - if (MARIADB_FEATURE_SUPPORTED(self->stmt->mysql, 100206)) + if (extended_server_capabilities & (MARIADB_CLIENT_STMT_BULK_OPERATIONS >> 32)) { param->indicator= STMT_INDICATOR_NULL; param->value= NULL; diff --git a/src/mariadb_cursor.c b/src/mariadb_cursor.c index 62bd1b3..f1115a9 100644 --- a/src/mariadb_cursor.c +++ b/src/mariadb_cursor.c @@ -723,12 +723,21 @@ PyObject *MrdbCursor_execute(MrdbCursor *self, } if (do_prepare) { + ulong extended_server_capabilities= 0; + mysql_stmt_attr_set(self->stmt, STMT_ATTR_PREBIND_PARAMS, &self->param_count); mysql_stmt_attr_set(self->stmt, STMT_ATTR_CB_USER_DATA, (void *)self); mysql_stmt_bind_param(self->stmt, self->params); + mariadb_get_infov(self->stmt->mysql, + MARIADB_CONNECTION_EXTENDED_SERVER_CAPABILITIES, + &extended_server_capabilities); + Py_BEGIN_ALLOW_THREADS; - if (!MARIADB_FEATURE_SUPPORTED(self->stmt->mysql, 100206)) + /* execute_direct was implemented together with bulk operations, so we need + to check if MARIADB_CLIENT_STMT_BULK_OPERATIONS is set in extended server + capabilities */ + if (!(extended_server_capabilities & (MARIADB_CLIENT_STMT_BULK_OPERATIONS >> 32))) { rc= mysql_stmt_prepare(self->stmt, self->parser->statement.str, (unsigned long)self->parser->statement.length); @@ -1252,6 +1261,7 @@ MrdbCursor_executemany(MrdbCursor *self, uint8_t do_prepare= 1; char errmsg[128]; MARIADB_CHECK_STMT(self); + unsigned long extended_server_capabilities= 0; if (PyErr_Occurred()) { @@ -1305,7 +1315,10 @@ MrdbCursor_executemany(MrdbCursor *self, /* If the server doesn't support bulk execution (< 10.2.6), we need to call a fallback routine */ - if (!MARIADB_FEATURE_SUPPORTED(self->stmt->mysql, 100206)) + mariadb_get_infov(self->stmt->mysql, + MARIADB_CONNECTION_EXTENDED_SERVER_CAPABILITIES, + &extended_server_capabilities); + if (!(extended_server_capabilities & (MARIADB_CLIENT_STMT_BULK_OPERATIONS >> 32))) { if (MrdbCursor_executemany_fallback(self, self->parser->statement.str, self->parser->statement.length))