From 94284df7b23dcc8663828c269de23c28ca03fcae Mon Sep 17 00:00:00 2001 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com> Date: Sun, 12 Oct 2025 00:40:28 +0200 Subject: [PATCH] Fix GH-20122: getColumnMeta() for JSON-column in MySQL While at it, also add VECTOR. Closes GH-20143. --- NEWS | 1 + .../tests/mysqli_fetch_field_types.phpt | 1 + ext/pdo_mysql/mysql_statement.c | 6 ++++ ext/pdo_mysql/tests/gh20122.phpt | 33 +++++++++++++++++++ 4 files changed, 41 insertions(+) create mode 100644 ext/pdo_mysql/tests/gh20122.phpt diff --git a/NEWS b/NEWS index 265cbcea114..057d26c7d52 100644 --- a/NEWS +++ b/NEWS @@ -29,6 +29,7 @@ PHP NEWS - MySQLnd: . Fixed bug GH-8978 (SSL certificate verification fails (port doubled)). (nielsdos) + . Fixed bug GH-20122 (getColumnMeta() for JSON-column in MySQL). (nielsdos) - Opcache: . Fixed bug GH-20081 (access to uninitialized vars in preload_load()). diff --git a/ext/mysqli/tests/mysqli_fetch_field_types.phpt b/ext/mysqli/tests/mysqli_fetch_field_types.phpt index 041eb16694a..3f58987b3d9 100644 --- a/ext/mysqli/tests/mysqli_fetch_field_types.phpt +++ b/ext/mysqli/tests/mysqli_fetch_field_types.phpt @@ -94,6 +94,7 @@ require_once 'skipifconnectfailure.inc'; MYSQLI_TYPE_NEWDATE => 'MYSQLI_TYPE_NEWDATE - TODO add testing', MYSQLI_TYPE_INTERVAL => 'MYSQLI_TYPE_INTERVAL - TODO add testing', MYSQLI_TYPE_GEOMETRY => 'MYSQLI_TYPE_GEOMETRY - TODO add testing', + MYSQLI_TYPE_JSON => array('JSON', '[]'), ); $datatypes[MYSQLI_TYPE_NEWDECIMAL] = array('DECIMAL', '1.1'); diff --git a/ext/pdo_mysql/mysql_statement.c b/ext/pdo_mysql/mysql_statement.c index c4f86b0e7d3..b3dc527b109 100644 --- a/ext/pdo_mysql/mysql_statement.c +++ b/ext/pdo_mysql/mysql_statement.c @@ -748,6 +748,12 @@ static char *type_to_name_native(int type) /* {{{ */ PDO_MYSQL_NATIVE_TYPE_NAME(DATE) #ifdef FIELD_TYPE_NEWDATE PDO_MYSQL_NATIVE_TYPE_NAME(NEWDATE) +#endif +#ifdef FIELD_TYPE_VECTOR + PDO_MYSQL_NATIVE_TYPE_NAME(VECTOR) +#endif +#ifdef FIELD_TYPE_JSON + PDO_MYSQL_NATIVE_TYPE_NAME(JSON) #endif PDO_MYSQL_NATIVE_TYPE_NAME(TIME) PDO_MYSQL_NATIVE_TYPE_NAME(DATETIME) diff --git a/ext/pdo_mysql/tests/gh20122.phpt b/ext/pdo_mysql/tests/gh20122.phpt new file mode 100644 index 00000000000..28369fefaf6 --- /dev/null +++ b/ext/pdo_mysql/tests/gh20122.phpt @@ -0,0 +1,33 @@ +--TEST-- +GH-20122 (getColumnMeta() for JSON-column in MySQL) +--EXTENSIONS-- +pdo +pdo_mysql +--SKIPIF-- + +--FILE-- +exec('CREATE TABLE test (bar JSON)'); +$db->exec('INSERT INTO test VALUES("[]")'); + +$stmt = $db->query('SELECT * from test'); +$meta = $stmt->getColumnMeta(0); + +// Note: JSON is an alias for LONGTEXT on MariaDB! +echo $meta['native_type'], "\n"; +?> +--CLEAN-- + +--EXPECTF-- +%r(JSON|LONGTEXT)%r