]> granicus.if.org Git - php/commitdiff
Avoid UNKNOWN default in PDO::query()
authorNikita Popov <nikita.ppv@gmail.com>
Fri, 24 Jul 2020 09:43:27 +0000 (11:43 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Fri, 24 Jul 2020 09:44:47 +0000 (11:44 +0200)
UPGRADING
ext/pdo/pdo_dbh.c
ext/pdo/pdo_dbh.stub.php
ext/pdo/pdo_dbh_arginfo.h
ext/pdo/tests/bug_44173.phpt

index bf4584bb8ece06b8c44fda8a4a8bf11708f48b07..a98aeab045b126979939f8324cc202c46dea7004 100644 (file)
--- a/UPGRADING
+++ b/UPGRADING
@@ -350,9 +350,11 @@ PHP 8.0 UPGRADE NOTES
     "exceptions". See https://www.php.net/manual/en/pdo.error-handling.php
     for details of behavior changes and how to explicitly set this attribute.
     RFC: https://wiki.php.net/rfc/pdo_default_errmode
-  . The method PDOStatement::setFetchMode() now accepts the following signature:
+  . The signatures of some PDO methods have changed:
 
-        PDOStatement::setFetchMode($mode, $classname, $params)
+        PDO::query(
+            string $statement, ?int $fetch_mode = null, ...$fetch_mode_args)
+        PDOStatement::setFetchMode(int $mode, ...$params)
 
 - PDO_ODBC:
   . The php.ini directive pdo_odbc.db2_instance_name has been removed
index 330a7532c51cdfe8e1088efe2897bf2f0f0192c2..583374240c7a3cdac0150eb6be1b262c4f0f1ed9 100644 (file)
@@ -1026,12 +1026,13 @@ PHP_METHOD(PDO, query)
        char *statement;
        size_t statement_len;
        zend_long fetch_mode;
+       zend_bool fetch_mode_is_null = 1;
        zval *args = NULL;
        uint32_t num_args = 0;
        pdo_dbh_object_t *dbh_obj = Z_PDO_OBJECT_P(ZEND_THIS);
        pdo_dbh_t *dbh = dbh_obj->inner;
 
-       if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS(), "s|l*", &statement, &statement_len, &fetch_mode, &args, &num_args)) {
+       if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS(), "s|l!*", &statement, &statement_len, &fetch_mode, &fetch_mode_is_null, &args, &num_args)) {
                RETURN_THROWS();
        }
 
@@ -1061,7 +1062,7 @@ PHP_METHOD(PDO, query)
 
        if (dbh->methods->preparer(dbh, statement, statement_len, stmt, NULL)) {
                PDO_STMT_CLEAR_ERR();
-               if (ZEND_NUM_ARGS() == 1 || SUCCESS == pdo_stmt_setup_fetch_mode(stmt, fetch_mode, args, num_args)) {
+               if (fetch_mode_is_null || SUCCESS == pdo_stmt_setup_fetch_mode(stmt, fetch_mode, args, num_args)) {
 
                        /* now execute the statement */
                        PDO_STMT_CLEAR_ERR();
index 2fe9572344a731fb1f042850fb0bfcd97f84beec..bde46dd712e2f2f0bad04d2b21548d12ff48f98b 100644 (file)
@@ -37,7 +37,7 @@ class PDO
     public function prepare(string $statement, array $driver_options = []) {}
 
     /** @return PDOStatement|false */
-    public function query(string $statement, int $fetch_mode = UNKNOWN, ...$fetch_mode_args) {}
+    public function query(string $statement, ?int $fetch_mode = null, ...$fetch_mode_args) {}
 
     /** @return string|false */
     public function quote(string $string, int $parameter_type = PDO::PARAM_STR) {}
index 5962544c0288687c606fcf74ca57e14929d8d55d..1057c54665274a9c76e687bebbc7d3d9dd0df164 100644 (file)
@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: c329bfda55244467a2cd62f9d5c5120ec3f24eef */
+ * Stub hash: 36270d1418fc4ddd8f79018372b0ef00fb6f5889 */
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_class_PDO___construct, 0, 0, 1)
        ZEND_ARG_TYPE_INFO(0, dsn, IS_STRING, 0)
@@ -40,7 +40,7 @@ ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_class_PDO_query, 0, 0, 1)
        ZEND_ARG_TYPE_INFO(0, statement, IS_STRING, 0)
-       ZEND_ARG_TYPE_INFO(0, fetch_mode, IS_LONG, 0)
+       ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, fetch_mode, IS_LONG, 1, "null")
        ZEND_ARG_VARIADIC_INFO(0, fetch_mode_args)
 ZEND_END_ARG_INFO()
 
index 1c1d14068cc1725c3ea7132c531c7ca7cf58e6d0..df98f332fe1882dcd18f1b73bbec6228ee49c778 100644 (file)
@@ -54,7 +54,7 @@ var_dump($stmt);
 --EXPECTF--
 Warning: PDO::query(): SQLSTATE[HY000]: General error: fetch mode doesn't allow any extra arguments in %s
 bool(false)
-PDO::query(): Argument #2 ($fetch_mode) must be of type int, string given
+PDO::query(): Argument #2 ($fetch_mode) must be of type ?int, string given
 
 Warning: PDO::query(): SQLSTATE[HY000]: General error: too many arguments in %s
 bool(false)