Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions ext/pdo/pdo_stmt.c
Original file line number Diff line number Diff line change
Expand Up @@ -1628,6 +1628,10 @@ bool pdo_stmt_setup_fetch_mode(pdo_stmt_t *stmt, zend_long mode, uint32_t mode_a

stmt->default_fetch_type = PDO_FETCH_BOTH;

if ((mode & ~PDO_FETCH_FLAGS) == PDO_FETCH_USE_DEFAULT) {
mode = stmt->dbh->default_fetch_type;
}

flags = mode & PDO_FETCH_FLAGS;

if (!pdo_verify_fetch_mode(stmt->default_fetch_type, mode, mode_arg_num, false)) {
Expand Down
7 changes: 7 additions & 0 deletions ext/pdo_sqlite/config.m4
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,13 @@ if test "$PHP_PDO_SQLITE" != "no"; then
[],
[$PDO_SQLITE_SHARED_LIBADD])

PHP_CHECK_LIBRARY([sqlite3], [sqlite3_expanded_sql],
[AC_DEFINE([HAVE_SQLITE3_EXPANDED_SQL], [1],
[Define to 1 if SQLite library has the 'sqlite3_expanded_sql'
function.])],
[],
[$PDO_SQLITE_SHARED_LIBADD])

PHP_CHECK_LIBRARY([sqlite3], [sqlite3_load_extension],
[],
[AC_DEFINE([PDO_SQLITE_OMIT_LOAD_EXTENSION], [1],
Expand Down
1 change: 1 addition & 0 deletions ext/pdo_sqlite/config.w32
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ if (PHP_PDO_SQLITE != "no") {

ADD_EXTENSION_DEP('pdo_sqlite', 'pdo');
AC_DEFINE("HAVE_SQLITE3_COLUMN_TABLE_NAME", 1, "Define to 1 if SQLite library was compiled with the SQLITE_ENABLE_COLUMN_METADATA and has the 'sqlite3_column_table_name' function.");
AC_DEFINE("HAVE_SQLITE3_EXPANDED_SQL", 1, "Define to 1 if SQLite library has the 'sqlite3_expanded_sql' function.");
ADD_MAKEFILE_FRAGMENT();
} else {
WARNING("pdo_sqlite not enabled; libraries and/or headers not found");
Expand Down
8 changes: 8 additions & 0 deletions ext/pdo_sqlite/pdo_sqlite.stub.php
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,14 @@ class Sqlite extends \PDO
/** @cvalue PDO_SQLITE_ATTR_TRANSACTION_MODE */
public const int ATTR_TRANSACTION_MODE = UNKNOWN;

/** @cvalue PDO_SQLITE_ATTR_SQL */
public const int ATTR_SQL = UNKNOWN;

#ifdef HAVE_SQLITE3_EXPANDED_SQL
/** @cvalue PDO_SQLITE_ATTR_EXPANDED_SQL */
public const int ATTR_EXPANDED_SQL = UNKNOWN;
#endif

public const int TRANSACTION_MODE_DEFERRED = 0;
public const int TRANSACTION_MODE_IMMEDIATE = 1;
public const int TRANSACTION_MODE_EXCLUSIVE = 2;
Expand Down
16 changes: 15 additions & 1 deletion ext/pdo_sqlite/pdo_sqlite_arginfo.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion ext/pdo_sqlite/php_pdo_sqlite_int.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,9 @@ enum {
PDO_SQLITE_ATTR_EXTENDED_RESULT_CODES,
PDO_SQLITE_ATTR_BUSY_STATEMENT,
PDO_SQLITE_ATTR_EXPLAIN_STATEMENT,
PDO_SQLITE_ATTR_TRANSACTION_MODE
PDO_SQLITE_ATTR_TRANSACTION_MODE,
PDO_SQLITE_ATTR_SQL,
PDO_SQLITE_ATTR_EXPANDED_SQL
};

typedef int pdo_sqlite_create_collation_callback(void*, int, const void*, int, const void*);
Expand Down
26 changes: 26 additions & 0 deletions ext/pdo_sqlite/sqlite_statement.c
Original file line number Diff line number Diff line change
Expand Up @@ -408,6 +408,32 @@ static int pdo_sqlite_stmt_get_attribute(pdo_stmt_t *stmt, zend_long attr, zval
zend_value_error("explain statement unsupported");
return 0;
#endif
case PDO_SQLITE_ATTR_SQL: {
const char *sql = sqlite3_sql(S->stmt);
if (sql) {
ZVAL_STRING(val, sql);
} else {
ZVAL_NULL(val);
}
return 1;
}

case PDO_SQLITE_ATTR_EXPANDED_SQL: {
#ifdef HAVE_SQLITE3_EXPANDED_SQL
char *sql = sqlite3_expanded_sql(S->stmt);
if (sql) {
ZVAL_STRING(val, sql);
sqlite3_free(sql);
} else {
ZVAL_NULL(val);
}
return 1;
#else
zend_value_error("expanded sql unsupported");
return -1;
#endif
}

default:
return 0;
}
Expand Down
38 changes: 38 additions & 0 deletions ext/pdo_sqlite/tests/gh20214.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
--TEST--
GH-20214 (PDO::FETCH_DEFAULT unexpected behavior with PDOStatement::setFetchMode)
--EXTENSIONS--
pdo_sqlite
--FILE--
<?php
$db = new PDO("sqlite::memory:");
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

// setFetchMode with FETCH_DEFAULT should use connection default (FETCH_OBJ)
$stmt = $db->query("SELECT 'v1' AS c1, 'v2' AS c2");
$stmt->setFetchMode(PDO::FETCH_DEFAULT);
$row = $stmt->fetch();
var_dump($row instanceof stdClass);
var_dump($row->c1);

// fetch with FETCH_DEFAULT should also use connection default
$stmt = $db->query("SELECT 'v1' AS c1, 'v2' AS c2");
$row = $stmt->fetch(PDO::FETCH_DEFAULT);
var_dump($row instanceof stdClass);

// fetchAll with FETCH_DEFAULT should also use connection default
$stmt = $db->query("SELECT 'v1' AS c1, 'v2' AS c2");
$rows = $stmt->fetchAll(PDO::FETCH_DEFAULT);
var_dump($rows[0] instanceof stdClass);

// setFetchMode then fetch without argument
$stmt = $db->query("SELECT 'v1' AS c1, 'v2' AS c2");
$stmt->setFetchMode(PDO::FETCH_DEFAULT);
$row = $stmt->fetch();
var_dump($row instanceof stdClass);
?>
--EXPECT--
bool(true)
string(2) "v1"
bool(true)
bool(true)
bool(true)
2 changes: 2 additions & 0 deletions ext/pdo_sqlite/tests/subclasses/pdo_sqlite_constants.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ var_dump(Pdo\Sqlite::OPEN_CREATE);
var_dump(Pdo\Sqlite::ATTR_READONLY_STATEMENT);
var_dump(Pdo\Sqlite::ATTR_EXTENDED_RESULT_CODES);
var_dump(Pdo\Sqlite::ATTR_BUSY_STATEMENT);
var_dump(Pdo\Sqlite::ATTR_SQL);

?>
--EXPECTF--
Expand All @@ -26,3 +27,4 @@ int(%d)
int(%d)
int(%d)
int(%d)
int(%d)
29 changes: 29 additions & 0 deletions ext/pdo_sqlite/tests/subclasses/pdo_sqlite_getattr_sql.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
--TEST--
Pdo\Sqlite::ATTR_SQL and Pdo\Sqlite::ATTR_EXPANDED_SQL usage
--EXTENSIONS--
pdo_sqlite
--SKIPIF--
<?php
if (!defined('Pdo\Sqlite::ATTR_EXPANDED_SQL')) die('skip sqlite3_expanded_sql not available');
?>
--FILE--
<?php

$db = new Pdo\Sqlite('sqlite::memory:');

$stmt = $db->prepare('SELECT :name AS greeting, :num AS number');
var_dump($stmt->getAttribute(Pdo\Sqlite::ATTR_SQL));
var_dump($stmt->getAttribute(Pdo\Sqlite::ATTR_EXPANDED_SQL));

$stmt->bindValue(':name', 'hello world');
$stmt->bindValue(':num', 42, PDO::PARAM_INT);
$stmt->execute();

var_dump($stmt->getAttribute(Pdo\Sqlite::ATTR_SQL));
var_dump($stmt->getAttribute(Pdo\Sqlite::ATTR_EXPANDED_SQL));
?>
--EXPECT--
string(40) "SELECT :name AS greeting, :num AS number"
string(39) "SELECT NULL AS greeting, NULL AS number"
string(40) "SELECT :name AS greeting, :num AS number"
string(46) "SELECT 'hello world' AS greeting, 42 AS number"
Loading