Skip to content

Commit ebfaeea

Browse files
committed
pgsql ext: pg_query_params/pg_send_query_params false constant handling proposal.
1 parent 64fde17 commit ebfaeea

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
@@ -1120,7 +1120,17 @@ PHP_FUNCTION(pg_query_params)
11201120
if (Z_TYPE_P(tmp) == IS_NULL) {
11211121
params[i] = NULL;
11221122
} else {
1123-
zend_string *param_str = zval_try_get_string(tmp);
1123+
zend_string *param_str;
1124+
/**
1125+
* zval_try_get_string returns an empty zend_string
1126+
* for false which is correct in general
1127+
* but not adequate for bool values in the db
1128+
*/
1129+
if (Z_TYPE_P(tmp) == IS_FALSE) {
1130+
param_str = ZSTR_CHAR('0');
1131+
} else {
1132+
param_str = zval_try_get_string(tmp);
1133+
}
11241134
if (!param_str) {
11251135
_php_pgsql_free_params(params, num_params);
11261136
RETURN_THROWS();
@@ -3754,9 +3764,18 @@ PHP_FUNCTION(pg_send_query_params)
37543764
if (Z_TYPE_P(tmp) == IS_NULL) {
37553765
params[i] = NULL;
37563766
} else {
3757-
zend_string *tmp_str;
3758-
zend_string *str = zval_get_tmp_string(tmp, &tmp_str);
3759-
3767+
zend_string *str, *tmp_str;
3768+
/**
3769+
* zval_get_tmp_string returns an empty zend_string
3770+
* for false which is correct in general
3771+
* but not adequate for bool values in the db
3772+
*/
3773+
if (Z_TYPE_P(tmp) == IS_FALSE) {
3774+
tmp_str = ZSTR_CHAR('0');
3775+
str = tmp_str;
3776+
} else {
3777+
str = zval_get_tmp_string(tmp, &tmp_str);
3778+
}
37603779
params[i] = estrndup(ZSTR_VAL(str), ZSTR_LEN(str));
37613780
zend_tmp_string_release(tmp_str);
37623781
}
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)