summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2020-06-02 09:36:39 +0200
committerChristoph M. Becker <cmbecker69@gmx.de>2020-06-02 10:45:47 +0200
commit63bd8f38f4b7e8ffbcbd0ea607e21041ebba2455 (patch)
treeb3cf4c1756182744627081fb0454db73a4ef1bc6
parent923c45bdcaebf317ce84a4bfb3fa39beae1bf952 (diff)
downloadphp-git-63bd8f38f4b7e8ffbcbd0ea607e21041ebba2455.tar.gz
Fix #79664: PDOStatement::getColumnMeta fails on empty result set
As its name suggests, `sqlite3_data_count` returns the number of columns in the current row of the result set; we are interested in the number of columns regardless of the current row, so we have to use `sqlite3_column_count` instead.
-rw-r--r--NEWS4
-rw-r--r--ext/pdo_sqlite/sqlite_statement.c2
-rw-r--r--ext/pdo_sqlite/tests/bug79664.phpt32
3 files changed, 37 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index e73dbc5867..e8bab176df 100644
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,10 @@ PHP NEWS
- Core:
. Fixed bug #79650 (php-win.exe 100% cpu lockup). (cmb)
+- PDO SQLite:
+ . Fixed bug #79664 (PDOStatement::getColumnMeta fails on empty result set).
+ (cmb)
+
?? ??? ????, PHP 7.3.19
- Core:
diff --git a/ext/pdo_sqlite/sqlite_statement.c b/ext/pdo_sqlite/sqlite_statement.c
index c51ab53956..5aae9a073b 100644
--- a/ext/pdo_sqlite/sqlite_statement.c
+++ b/ext/pdo_sqlite/sqlite_statement.c
@@ -337,7 +337,7 @@ static int pdo_sqlite_stmt_col_meta(pdo_stmt_t *stmt, zend_long colno, zval *ret
if (!S->stmt) {
return FAILURE;
}
- if(colno >= sqlite3_data_count(S->stmt)) {
+ if(colno >= sqlite3_column_count(S->stmt)) {
/* error invalid column */
pdo_sqlite_error_stmt(stmt);
return FAILURE;
diff --git a/ext/pdo_sqlite/tests/bug79664.phpt b/ext/pdo_sqlite/tests/bug79664.phpt
new file mode 100644
index 0000000000..072d107ba6
--- /dev/null
+++ b/ext/pdo_sqlite/tests/bug79664.phpt
@@ -0,0 +1,32 @@
+--TEST--
+Bug #79664 (PDOStatement::getColumnMeta fails on empty result set)
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo_sqlite')) print 'skip not loaded';
+?>
+--FILE--
+<?php
+$pdo = new PDO('sqlite::memory:', null, null, [
+ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
+]);
+$stmt = $pdo->query('select 1 where 0');
+if ($stmt->columnCount()) {
+ var_dump($stmt->getColumnMeta(0));
+}
+?>
+--EXPECT--
+array(6) {
+ ["native_type"]=>
+ string(4) "null"
+ ["flags"]=>
+ array(0) {
+ }
+ ["name"]=>
+ string(1) "1"
+ ["len"]=>
+ int(4294967295)
+ ["precision"]=>
+ int(0)
+ ["pdo_type"]=>
+ int(2)
+}