Skip to content

Commit a552757

Browse files
committed
Allow drivers to omit error code
And thus generate error messages that match what PDO emulation would generate. This fixes the error message regression from the previous commit.
1 parent 15b51a2 commit a552757

File tree

6 files changed

+14
-9
lines changed

6 files changed

+14
-9
lines changed

ext/pdo/pdo_dbh.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,8 @@ PDO_API void pdo_handle_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt) /* {{{ */
155155
if (dbh->methods->fetch_err(dbh, stmt, &info)) {
156156
zval *item;
157157

158-
if ((item = zend_hash_index_find(Z_ARRVAL(info), 1)) != NULL) {
158+
if ((item = zend_hash_index_find(Z_ARRVAL(info), 1)) != NULL
159+
&& Z_TYPE_P(item) == IS_LONG) {
159160
native_code = Z_LVAL_P(item);
160161
}
161162

@@ -165,8 +166,10 @@ PDO_API void pdo_handle_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt) /* {{{ */
165166
}
166167
}
167168

168-
if (supp) {
169+
if (native_code && supp) {
169170
message = strpprintf(0, "SQLSTATE[%s]: %s: " ZEND_LONG_FMT " %s", *pdo_err, msg, native_code, supp);
171+
} else if (supp) {
172+
message = strpprintf(0, "SQLSTATE[%s]: %s: %s", *pdo_err, msg, supp);
170173
} else {
171174
message = strpprintf(0, "SQLSTATE[%s]: %s", *pdo_err, msg);
172175
}

ext/pdo_pgsql/pgsql_driver.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,10 @@ static int pdo_pgsql_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *in
114114

115115
if (einfo->errcode) {
116116
add_next_index_long(info, einfo->errcode);
117+
} else {
118+
add_next_index_null(info);
119+
}
120+
if (einfo->errmsg) {
117121
add_next_index_string(info, einfo->errmsg);
118122
}
119123

ext/pdo_pgsql/pgsql_statement.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -282,8 +282,7 @@ static int pgsql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *
282282
ZEND_ATOL(param->paramno, namevar + 1);
283283
param->paramno--;
284284
} else {
285-
pdo_pgsql_error_stmt_msg(
286-
stmt, PGRES_FATAL_ERROR, "HY093", ZSTR_VAL(param->name));
285+
pdo_pgsql_error_stmt_msg(stmt, 0, "HY093", ZSTR_VAL(param->name));
287286
return 0;
288287
}
289288
}
@@ -295,8 +294,7 @@ static int pgsql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *
295294
return 1;
296295
}
297296
if (!zend_hash_index_exists(stmt->bound_param_map, param->paramno)) {
298-
pdo_pgsql_error_stmt_msg(
299-
stmt, PGRES_FATAL_ERROR, "HY093", "parameter was not defined");
297+
pdo_pgsql_error_stmt_msg(stmt, 0, "HY093", "parameter was not defined");
300298
return 0;
301299
}
302300
case PDO_PARAM_EVT_EXEC_POST:

ext/pdo_pgsql/tests/bug36727.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@ var_dump($stmt->bindValue(':test', 1, PDO::PARAM_INT));
1919
echo "Done\n";
2020
?>
2121
--EXPECTF--
22-
Warning: PDOStatement::bindValue(): SQLSTATE[HY093]: Invalid parameter number: 7 :test in %s on line %d
22+
Warning: PDOStatement::bindValue(): SQLSTATE[HY093]: Invalid parameter number: :test in %s on line %d
2323
bool(false)
2424
Done

ext/pdo_pgsql/tests/bug69344.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,5 @@ $test();
3939

4040
?>
4141
--EXPECT--
42-
SQLSTATE[HY093]: Invalid parameter number: 7 parameter was not defined
42+
SQLSTATE[HY093]: Invalid parameter number: parameter was not defined
4343
SQLSTATE[HY093]: Invalid parameter number: parameter was not defined

ext/pdo_pgsql/tests/bug71573.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,4 @@ $statement->execute([ 'test', 'test', 'test' ]);
1818

1919
?>
2020
--EXPECTF--
21-
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: 7 parameter was not defined in %s on line %d
21+
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in %s on line %d

0 commit comments

Comments
 (0)