Skip to content

Commit 15e7e57

Browse files
devnexencmb69
authored andcommitted
Fix #81658: MYSQL_OPT_LOAD_DATA_LOCAL_DIR not available in MariaDB
This also introduces the boolean userland constant `MYSQLI_IS_MARIADB`.
1 parent dab6226 commit 15e7e57

File tree

6 files changed

+18
-6
lines changed

6 files changed

+18
-6
lines changed

NEWS

+5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ PHP NEWS
1010
- MBString:
1111
. Fixed bug #81693 (mb_check_encoding(7bit) segfaults). (cmb)
1212

13+
- MySQLi:
14+
. Fixed bug #81658 (MYSQL_OPT_LOAD_DATA_LOCAL_DIR not available in MariaDB).
15+
(devnexen)
16+
. Introduced MYSQLI_IS_MARIADB. (devnexen)
17+
1318
- Reflection:
1419
. Fixed bug #81681 (ReflectionEnum throwing exceptions). (cmb)
1520

ext/mysqli/mysqli.c

+7-1
Original file line numberDiff line numberDiff line change
@@ -596,7 +596,7 @@ PHP_MINIT_FUNCTION(mysqli)
596596
REGISTER_LONG_CONSTANT("MYSQLI_READ_DEFAULT_FILE", MYSQL_READ_DEFAULT_FILE, CONST_CS | CONST_PERSISTENT);
597597
REGISTER_LONG_CONSTANT("MYSQLI_OPT_CONNECT_TIMEOUT", MYSQL_OPT_CONNECT_TIMEOUT, CONST_CS | CONST_PERSISTENT);
598598
REGISTER_LONG_CONSTANT("MYSQLI_OPT_LOCAL_INFILE", MYSQL_OPT_LOCAL_INFILE, CONST_CS | CONST_PERSISTENT);
599-
#if MYSQL_VERSION_ID >= 80021 || defined(MYSQLI_USE_MYSQLND)
599+
#if (MYSQL_VERSION_ID >= 80021 && !defined(MARIADB_BASE_VERSION)) || defined(MYSQLI_USE_MYSQLND)
600600
REGISTER_LONG_CONSTANT("MYSQLI_OPT_LOAD_DATA_LOCAL_DIR", MYSQL_OPT_LOAD_DATA_LOCAL_DIR, CONST_CS | CONST_PERSISTENT);
601601
#endif
602602
REGISTER_LONG_CONSTANT("MYSQLI_INIT_COMMAND", MYSQL_INIT_COMMAND, CONST_CS | CONST_PERSISTENT);
@@ -772,6 +772,12 @@ PHP_MINIT_FUNCTION(mysqli)
772772
REGISTER_LONG_CONSTANT("MYSQLI_TRANS_COR_RELEASE", TRANS_COR_RELEASE, CONST_CS | CONST_PERSISTENT);
773773
REGISTER_LONG_CONSTANT("MYSQLI_TRANS_COR_NO_RELEASE", TRANS_COR_NO_RELEASE, CONST_CS | CONST_PERSISTENT);
774774

775+
#ifdef MARIADB_BASE_VERSION
776+
REGISTER_BOOL_CONSTANT("MYSQLI_IS_MARIADB", 1, CONST_CS | CONST_PERSISTENT);
777+
#else
778+
REGISTER_BOOL_CONSTANT("MYSQLI_IS_MARIADB", 0, CONST_CS | CONST_PERSISTENT);
779+
#endif
780+
775781

776782
#ifdef MYSQLI_USE_MYSQLND
777783
mysqlnd_reverse_api_register_api(&mysqli_reverse_api);

ext/mysqli/mysqli_api.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -1720,7 +1720,7 @@ static int mysqli_options_get_option_zval_type(int option)
17201720
#if MYSQL_VERSION_ID > 50605 || defined(MYSQLI_USE_MYSQLND)
17211721
case MYSQL_SERVER_PUBLIC_KEY:
17221722
#endif
1723-
#if MYSQL_VERSION_ID >= 80021 || defined(MYSQLI_USE_MYSQLND)
1723+
#if (MYSQL_VERSION_ID >= 80021 && !defined(MARIADB_BASE_VERSION)) || defined(MYSQLI_USE_MYSQLND)
17241724
case MYSQL_OPT_LOAD_DATA_LOCAL_DIR:
17251725
#endif
17261726
return IS_STRING;

ext/mysqli/mysqli_nonapi.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, bool is_real_connect, b
333333
unsigned int allow_local_infile = MyG(allow_local_infile);
334334
mysql_options(mysql->mysql, MYSQL_OPT_LOCAL_INFILE, (char *)&allow_local_infile);
335335

336-
#if MYSQL_VERSION_ID >= 80021 || defined(MYSQLI_USE_MYSQLND)
336+
#if (MYSQL_VERSION_ID >= 80021 && !defined(MARIADB_BASE_VERSION)) || defined(MYSQLI_USE_MYSQLND)
337337
if (MyG(local_infile_directory) && !php_check_open_basedir(MyG(local_infile_directory))) {
338338
mysql_options(mysql->mysql, MYSQL_OPT_LOAD_DATA_LOCAL_DIR, MyG(local_infile_directory));
339339
}

ext/mysqli/tests/mysqli_constants.phpt

+2-1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ $expected_constants = array(
4747
"MYSQLI_GROUP_FLAG" => true,
4848
"MYSQLI_SERVER_QUERY_NO_GOOD_INDEX_USED"=> true,
4949
"MYSQLI_SERVER_QUERY_NO_INDEX_USED" => true,
50+
"MYSQLI_IS_MARIADB" => true,
5051

5152
"MYSQLI_TYPE_DECIMAL" => true,
5253
"MYSQLI_TYPE_TINY" => true,
@@ -180,7 +181,7 @@ if ($IS_MYSQLND) {
180181
$expected_constants["MYSQLI_TYPE_JSON"] = true;
181182
}
182183

183-
if ($version > 80021 || $IS_MYSQLND) {
184+
if (($version > 80021 && $constants['mysqli']['MYSQLI_IS_MARIADB']) || $IS_MYSQLND) {
184185
$expected_constants['MYSQLI_OPT_LOAD_DATA_LOCAL_DIR'] = true;
185186
}
186187

ext/pdo_mysql/mysql_driver.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,7 @@ static int pdo_mysql_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *return_
544544
ZVAL_BOOL(return_value, H->local_infile);
545545
break;
546546

547-
#if MYSQL_VERSION_ID >= 80021 || defined(PDO_USE_MYSQLND)
547+
#if (MYSQL_VERSION_ID >= 80021 && !defined(MARIADB_BASE_VERSION)) || defined(PDO_USE_MYSQLND)
548548
case PDO_MYSQL_ATTR_LOCAL_INFILE_DIRECTORY:
549549
{
550550
const char* local_infile_directory = NULL;
@@ -765,7 +765,7 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options)
765765
#endif
766766
}
767767

768-
#if MYSQL_VERSION_ID >= 80021 || defined(PDO_USE_MYSQLND)
768+
#if (MYSQL_VERSION_ID >= 80021 && !defined(MARIADB_BASE_VERSION)) || defined(PDO_USE_MYSQLND)
769769
zend_string *local_infile_directory = pdo_attr_strval(driver_options, PDO_MYSQL_ATTR_LOCAL_INFILE_DIRECTORY, NULL);
770770
if (local_infile_directory && !php_check_open_basedir(ZSTR_VAL(local_infile_directory))) {
771771
if (mysql_options(H->server, MYSQL_OPT_LOAD_DATA_LOCAL_DIR, (const char *)ZSTR_VAL(local_infile_directory))) {

0 commit comments

Comments
 (0)