From 9ae8da2dcfb88fbd31a4cfeb6ab925bf3739b554 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sun, 14 Nov 2021 15:01:58 +0000 Subject: [PATCH 1/2] pgsql ext: pg_query_params/pg_send_query_params false constant handling proposal. --- ext/pgsql/pgsql.c | 27 +++++++++++++++++++---- ext/pgsql/tests/33query_params_bool.phpt | 28 ++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 ext/pgsql/tests/33query_params_bool.phpt diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c index 4d23ee9e7319..4ad46a75c77e 100644 --- a/ext/pgsql/pgsql.c +++ b/ext/pgsql/pgsql.c @@ -1199,7 +1199,17 @@ PHP_FUNCTION(pg_query_params) if (Z_TYPE_P(tmp) == IS_NULL) { params[i] = NULL; } else { - zend_string *param_str = zval_try_get_string(tmp); + zend_string *param_str; + /** + * zval_try_get_string returns an empty zend_string + * for false which is correct in general + * but not adequate for bool values in the db + */ + if (Z_TYPE_P(tmp) == IS_FALSE) { + param_str = ZSTR_CHAR('0'); + } else { + param_str = zval_try_get_string(tmp); + } if (!param_str) { _php_pgsql_free_params(params, num_params); RETURN_THROWS(); @@ -3750,9 +3760,18 @@ PHP_FUNCTION(pg_send_query_params) if (Z_TYPE_P(tmp) == IS_NULL) { params[i] = NULL; } else { - zend_string *tmp_str; - zend_string *str = zval_get_tmp_string(tmp, &tmp_str); - + zend_string *str, *tmp_str; + /** + * zval_get_tmp_string returns an empty zend_string + * for false which is correct in general + * but not adequate for bool values in the db + */ + if (Z_TYPE_P(tmp) == IS_FALSE) { + tmp_str = ZSTR_CHAR('0'); + str = tmp_str; + } else { + str = zval_get_tmp_string(tmp, &tmp_str); + } params[i] = estrndup(ZSTR_VAL(str), ZSTR_LEN(str)); zend_tmp_string_release(tmp_str); } diff --git a/ext/pgsql/tests/33query_params_bool.phpt b/ext/pgsql/tests/33query_params_bool.phpt new file mode 100644 index 000000000000..e8f99bb518b9 --- /dev/null +++ b/ext/pgsql/tests/33query_params_bool.phpt @@ -0,0 +1,28 @@ +--TEST-- +PostgreSQL prepared queries with bool constants +--SKIPIF-- + +--FILE-- += 3) { + $result = pg_query_params($db, "SELECT * FROM ".$table_name." WHERE num >= $1;", array(true)); + // bug occurs with false as it turns out as empty. + $result = pg_query_params($db, "SELECT * FROM ".$table_name." WHERE num <> $1;", array(false)); + pg_free_result($result); +} +pg_close($db); + +echo "OK"; +?> +--EXPECT-- +OK + From d17bd4ad6539cb7ab68e65beff11d43720b5e5df Mon Sep 17 00:00:00 2001 From: David Carlier Date: Fri, 1 Apr 2022 18:51:21 +0100 Subject: [PATCH 2/2] pdo update --- ext/pdo/pdo_stmt.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index 61e88ff84ac0..614a3d3f5993 100644 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -276,9 +276,14 @@ static bool really_register_bound_param(struct pdo_bound_param_data *param, pdo_ } if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_STR && param->max_value_len <= 0 && !Z_ISNULL_P(parameter)) { + zend_bool is_false = (Z_TYPE_P(parameter) == IS_FALSE); if (!try_convert_to_string(parameter)) { return 0; } + /* the pgsql's driver does not handle empty string for false bound parameters */ + if (is_false) { + ZVAL_STR(parameter, ZSTR_CHAR('0')); + } } else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_INT && (Z_TYPE_P(parameter) == IS_FALSE || Z_TYPE_P(parameter) == IS_TRUE)) { convert_to_long(parameter); } else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_BOOL && Z_TYPE_P(parameter) == IS_LONG) {