Skip to content

Commit 9ae8da2

Browse files
committed
pgsql ext: pg_query_params/pg_send_query_params false constant handling proposal.
1 parent 53c6619 commit 9ae8da2

File tree

2 files changed

+51
-4
lines changed

2 files changed

+51
-4
lines changed

ext/pgsql/pgsql.c

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,7 +1199,17 @@ PHP_FUNCTION(pg_query_params)
11991199
if (Z_TYPE_P(tmp) == IS_NULL) {
12001200
params[i] = NULL;
12011201
} else {
1202-
zend_string *param_str = zval_try_get_string(tmp);
1202+
zend_string *param_str;
1203+
/**
1204+
* zval_try_get_string returns an empty zend_string
1205+
* for false which is correct in general
1206+
* but not adequate for bool values in the db
1207+
*/
1208+
if (Z_TYPE_P(tmp) == IS_FALSE) {
1209+
param_str = ZSTR_CHAR('0');
1210+
} else {
1211+
param_str = zval_try_get_string(tmp);
1212+
}
12031213
if (!param_str) {
12041214
_php_pgsql_free_params(params, num_params);
12051215
RETURN_THROWS();
@@ -3750,9 +3760,18 @@ PHP_FUNCTION(pg_send_query_params)
37503760
if (Z_TYPE_P(tmp) == IS_NULL) {
37513761
params[i] = NULL;
37523762
} else {
3753-
zend_string *tmp_str;
3754-
zend_string *str = zval_get_tmp_string(tmp, &tmp_str);
3755-
3763+
zend_string *str, *tmp_str;
3764+
/**
3765+
* zval_get_tmp_string returns an empty zend_string
3766+
* for false which is correct in general
3767+
* but not adequate for bool values in the db
3768+
*/
3769+
if (Z_TYPE_P(tmp) == IS_FALSE) {
3770+
tmp_str = ZSTR_CHAR('0');
3771+
str = tmp_str;
3772+
} else {
3773+
str = zval_get_tmp_string(tmp, &tmp_str);
3774+
}
37563775
params[i] = estrndup(ZSTR_VAL(str), ZSTR_LEN(str));
37573776
zend_tmp_string_release(tmp_str);
37583777
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
--TEST--
2+
PostgreSQL prepared queries with bool constants
3+
--SKIPIF--
4+
<?php
5+
include("skipif.inc");
6+
if (!function_exists('pg_prepare')) die('skip function pg_prepare() does not exist');
7+
?>
8+
--FILE--
9+
<?php
10+
11+
include('config.inc');
12+
13+
$db = pg_connect($conn_str);
14+
15+
$version = pg_version($db);
16+
if ($version['protocol'] >= 3) {
17+
$result = pg_query_params($db, "SELECT * FROM ".$table_name." WHERE num >= $1;", array(true));
18+
// bug occurs with false as it turns out as empty.
19+
$result = pg_query_params($db, "SELECT * FROM ".$table_name." WHERE num <> $1;", array(false));
20+
pg_free_result($result);
21+
}
22+
pg_close($db);
23+
24+
echo "OK";
25+
?>
26+
--EXPECT--
27+
OK
28+

0 commit comments

Comments
 (0)