Fix GH-15893: Pdo\Pgsql backport fixes from GH-16124 (#16158)

This commit is contained in:
David CARLIER 2024-10-03 19:25:39 +01:00 committed by GitHub
parent 8a6de2ca14
commit dbcc77d0c2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 23 additions and 11 deletions

View file

@ -657,16 +657,14 @@ void pgsqlCopyFromArray_internal(INTERNAL_FUNCTION_PARAMETERS)
PGresult *pgsql_result; PGresult *pgsql_result;
ExecStatusType status; ExecStatusType status;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "sA|sss!", ZEND_PARSE_PARAMETERS_START(2, 5)
&table_name, &table_name_len, &pg_rows, Z_PARAM_STRING(table_name, table_name_len)
&pg_delim, &pg_delim_len, &pg_null_as, &pg_null_as_len, &pg_fields, &pg_fields_len) == FAILURE) { Z_PARAM_ITERABLE(pg_rows)
RETURN_THROWS(); Z_PARAM_OPTIONAL
} Z_PARAM_STRING(pg_delim, pg_delim_len)
Z_PARAM_STRING(pg_null_as, pg_null_as_len)
if ((Z_TYPE_P(pg_rows) != IS_ARRAY && !instanceof_function(Z_OBJCE_P(pg_rows), zend_ce_traversable))) { Z_PARAM_STRING_OR_NULL(pg_fields, pg_fields_len)
zend_argument_type_error(2, "must be of type array or Traversable"); ZEND_PARSE_PARAMETERS_END();
RETURN_THROWS();
}
dbh = Z_PDO_DBH_P(ZEND_THIS); dbh = Z_PDO_DBH_P(ZEND_THIS);
PDO_CONSTRUCT_CHECK; PDO_CONSTRUCT_CHECK;
@ -712,11 +710,18 @@ void pgsqlCopyFromArray_internal(INTERNAL_FUNCTION_PARAMETERS)
} }
} ZEND_HASH_FOREACH_END(); } ZEND_HASH_FOREACH_END();
} else { } else {
iter = Z_OBJ_P(pg_rows)->ce->get_iterator(Z_OBJCE_P(pg_rows), pg_rows, 0); iter = Z_OBJCE_P(pg_rows)->get_iterator(Z_OBJCE_P(pg_rows), pg_rows, 0);
if (iter == NULL || EG(exception)) { if (iter == NULL || EG(exception)) {
RETURN_THROWS(); RETURN_THROWS();
} }
if (iter->funcs->rewind) {
iter->funcs->rewind(iter);
if (EG(exception)) {
RETURN_THROWS();
}
}
for (; iter->funcs->valid(iter) == SUCCESS && EG(exception) == NULL; iter->funcs->move_forward(iter)) { for (; iter->funcs->valid(iter) == SUCCESS && EG(exception) == NULL; iter->funcs->move_forward(iter)) {
tmp = iter->funcs->get_current_data(iter); tmp = iter->funcs->get_current_data(iter);
if (!_pdo_pgsql_send_copy_data(H, tmp)) { if (!_pdo_pgsql_send_copy_data(H, tmp)) {

View file

@ -42,6 +42,12 @@ $iterator = new class implements Iterator{
} }
}; };
try {
$db->pgsqlCopyFromArray('test_copy_from_traversable',new stdClass());
} catch (\TypeError $e) {
echo $e->getMessage() . PHP_EOL;
}
$db->pgsqlCopyFromArray('test_copy_from_traversable',$iterator); $db->pgsqlCopyFromArray('test_copy_from_traversable',$iterator);
$stmt = $db->query("select * from test_copy_from_traversable order by 1"); $stmt = $db->query("select * from test_copy_from_traversable order by 1");
@ -56,6 +62,7 @@ $db = PDOTest::test_factory(__DIR__ . '/common.phpt');
$db->query('DROP TABLE IF EXISTS test_copy_from_traversable CASCADE'); $db->query('DROP TABLE IF EXISTS test_copy_from_traversable CASCADE');
?> ?>
--EXPECT-- --EXPECT--
PDO::pgsqlCopyFromArray(): Argument #2 ($rows) must be of type Traversable|array, stdClass given
array ( array (
0 => 1, 0 => 1,
1 => 1, 1 => 1,