]> granicus.if.org Git - php/commitdiff
Allow drivers to omit error code
authorNikita Popov <nikita.ppv@gmail.com>
Thu, 10 Dec 2020 15:03:22 +0000 (16:03 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Thu, 10 Dec 2020 15:04:33 +0000 (16:04 +0100)
And thus generate error messages that match what PDO emulation
would generate.

This fixes the error message regression from the previous commit.

ext/pdo/pdo_dbh.c
ext/pdo_pgsql/pgsql_driver.c
ext/pdo_pgsql/pgsql_statement.c
ext/pdo_pgsql/tests/bug36727.phpt
ext/pdo_pgsql/tests/bug69344.phpt
ext/pdo_pgsql/tests/bug71573.phpt

index 8917b9b0dc18565ddbaac3f339c08f2848e3e538..375100b3602985c9bb6fd07d8a3777f1ea572822 100644 (file)
@@ -155,7 +155,8 @@ PDO_API void pdo_handle_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt) /* {{{ */
                if (dbh->methods->fetch_err(dbh, stmt, &info)) {
                        zval *item;
 
-                       if ((item = zend_hash_index_find(Z_ARRVAL(info), 1)) != NULL) {
+                       if ((item = zend_hash_index_find(Z_ARRVAL(info), 1)) != NULL
+                                       && Z_TYPE_P(item) == IS_LONG) {
                                native_code = Z_LVAL_P(item);
                        }
 
@@ -165,8 +166,10 @@ PDO_API void pdo_handle_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt) /* {{{ */
                }
        }
 
-       if (supp) {
+       if (native_code && supp) {
                message = strpprintf(0, "SQLSTATE[%s]: %s: " ZEND_LONG_FMT " %s", *pdo_err, msg, native_code, supp);
+       } else if (supp) {
+               message = strpprintf(0, "SQLSTATE[%s]: %s: %s", *pdo_err, msg, supp);
        } else {
                message = strpprintf(0, "SQLSTATE[%s]: %s", *pdo_err, msg);
        }
index d800d65a2df0e9f38d2d09bb85fd0958da1bffaa..a5b0a22f2057b022b055049bc316bc6573e68b3f 100644 (file)
@@ -114,6 +114,10 @@ static int pdo_pgsql_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *in
 
        if (einfo->errcode) {
                add_next_index_long(info, einfo->errcode);
+       } else {
+               add_next_index_null(info);
+       }
+       if (einfo->errmsg) {
                add_next_index_string(info, einfo->errmsg);
        }
 
index 149e1e6b51e0b8c9fd962ac28e49911d0ef47cec..21f4c83807ea0d315dd81ee4c473e4d8e7b7feb9 100644 (file)
@@ -282,8 +282,7 @@ static int pgsql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *
                                                        ZEND_ATOL(param->paramno, namevar + 1);
                                                        param->paramno--;
                                                } else {
-                                                       pdo_pgsql_error_stmt_msg(
-                                                               stmt, PGRES_FATAL_ERROR, "HY093", ZSTR_VAL(param->name));
+                                                       pdo_pgsql_error_stmt_msg(stmt, 0, "HY093", ZSTR_VAL(param->name));
                                                        return 0;
                                                }
                                        }
@@ -295,8 +294,7 @@ static int pgsql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *
                                        return 1;
                                }
                                if (!zend_hash_index_exists(stmt->bound_param_map, param->paramno)) {
-                                       pdo_pgsql_error_stmt_msg(
-                                               stmt, PGRES_FATAL_ERROR, "HY093", "parameter was not defined");
+                                       pdo_pgsql_error_stmt_msg(stmt, 0, "HY093", "parameter was not defined");
                                        return 0;
                                }
                        case PDO_PARAM_EVT_EXEC_POST:
index 4c9716d14152b478eb714483e11182db5b25765b..79102ef8bb35a69cf9daf742f47aa9e965a5c83b 100644 (file)
@@ -19,6 +19,6 @@ var_dump($stmt->bindValue(':test', 1, PDO::PARAM_INT));
 echo "Done\n";
 ?>
 --EXPECTF--
-Warning: PDOStatement::bindValue(): SQLSTATE[HY093]: Invalid parameter number: :test in %s on line %d
+Warning: PDOStatement::bindValue(): SQLSTATE[HY093]: Invalid parameter number: :test in %s on line %d
 bool(false)
 Done
index e2522653f500dad8e8e680347569a3ce7e1960ef..f544518455f2f23e1f1e7e66d6abd4c923c565c8 100644 (file)
@@ -39,5 +39,5 @@ $test();
 
 ?>
 --EXPECT--
-SQLSTATE[HY093]: Invalid parameter number: parameter was not defined
+SQLSTATE[HY093]: Invalid parameter number: parameter was not defined
 SQLSTATE[HY093]: Invalid parameter number: parameter was not defined
index d9e4fe751436a6f48c2b2aa3241675a5925b0004..e8d13ca84e8dbb83f37d1a864246c57bb1e36992 100644 (file)
@@ -18,4 +18,4 @@ $statement->execute([ 'test', 'test', 'test' ]);
 
 ?>
 --EXPECTF--
-Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in %s on line %d
+Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in %s on line %d