This is an automated email from the ASF dual-hosted git repository.
jgemignani pushed a commit to branch PG14
in repository https://gitbox.apache.org/repos/asf/age.git
The following commit(s) were added to refs/heads/PG14 by this push:
new edcd4650 Added integer conversion in toBoolean functions (#1769)
edcd4650 is described below
commit edcd465095b66986e003699dc2e27f26fbd56b3c
Author: Wendel de Lana <[email protected]>
AuthorDate: Mon Apr 22 12:13:37 2024 -0300
Added integer conversion in toBoolean functions (#1769)
Implemented integer conversion to boolean in both toBoolean and
toBooleanList functions. Also made corresponding changes to regression
tests and broke long lines to adhere to the 79-column line length limit
in the toBooleanList function.
---
regress/expected/expr.out | 36 ++++++++++++++++++++++++------------
regress/sql/expr.sql | 17 ++++++++++-------
src/backend/utils/adt/agtype.c | 37 +++++++++++++++++++++++++++++--------
3 files changed, 63 insertions(+), 27 deletions(-)
diff --git a/regress/expected/expr.out b/regress/expected/expr.out
index d8101506..633f8286 100644
--- a/regress/expected/expr.out
+++ b/regress/expected/expr.out
@@ -3077,6 +3077,22 @@ $$) AS (toBoolean agtype);
false
(1 row)
+SELECT * FROM cypher('expr', $$
+ RETURN toBoolean(1)
+$$) AS (toBoolean agtype);
+ toboolean
+-----------
+ true
+(1 row)
+
+SELECT * FROM cypher('expr', $$
+ RETURN toBoolean(0)
+$$) AS (toBoolean agtype);
+ toboolean
+-----------
+ false
+(1 row)
+
-- should return null
SELECT * FROM cypher('expr', $$
RETURN toBoolean("false_")
@@ -3095,10 +3111,6 @@ $$) AS (toBoolean agtype);
(1 row)
-- should fail
-SELECT * FROM cypher('expr', $$
- RETURN toBoolean(1)
-$$) AS (toBoolean agtype);
-ERROR: toBoolean() unsupported argument agtype 3
SELECT * FROM cypher('expr', $$
RETURN toBoolean()
$$) AS (toBoolean agtype);
@@ -3131,6 +3143,14 @@ $$) AS (toBooleanList agtype);
[true, false, true]
(1 row)
+SELECT * FROM cypher('expr', $$
+ RETURN toBooleanList([0,1,2,3,4])
+$$) AS (toBooleanList agtype);
+ tobooleanlist
+---------------------------------
+ [false, true, true, true, true]
+(1 row)
+
-- should return null
SELECT * FROM cypher('expr', $$
RETURN toBooleanList([])
@@ -3164,14 +3184,6 @@ $$) AS (toBooleanList agtype);
[null, null]
(1 row)
-SELECT * FROM cypher('expr', $$
- RETURN toBooleanList([0,1,2,3,4])
-$$) AS (toBooleanList agtype);
- tobooleanlist
---------------------------------
- [null, null, null, null, null]
-(1 row)
-
-- should fail
SELECT * FROM cypher('expr', $$
RETURN toBooleanList(fail)
diff --git a/regress/sql/expr.sql b/regress/sql/expr.sql
index d5802712..18714f79 100644
--- a/regress/sql/expr.sql
+++ b/regress/sql/expr.sql
@@ -1349,6 +1349,12 @@ $$) AS (toBoolean agtype);
SELECT * FROM cypher('expr', $$
RETURN toBoolean("false")
$$) AS (toBoolean agtype);
+SELECT * FROM cypher('expr', $$
+ RETURN toBoolean(1)
+$$) AS (toBoolean agtype);
+SELECT * FROM cypher('expr', $$
+ RETURN toBoolean(0)
+$$) AS (toBoolean agtype);
-- should return null
SELECT * FROM cypher('expr', $$
RETURN toBoolean("false_")
@@ -1357,9 +1363,6 @@ SELECT * FROM cypher('expr', $$
RETURN toBoolean(null)
$$) AS (toBoolean agtype);
-- should fail
-SELECT * FROM cypher('expr', $$
- RETURN toBoolean(1)
-$$) AS (toBoolean agtype);
SELECT * FROM cypher('expr', $$
RETURN toBoolean()
$$) AS (toBoolean agtype);
@@ -1377,6 +1380,10 @@ SELECT * FROM cypher('expr', $$
RETURN toBooleanList(["True", "False", "True"])
$$) AS (toBooleanList agtype);
+SELECT * FROM cypher('expr', $$
+ RETURN toBooleanList([0,1,2,3,4])
+$$) AS (toBooleanList agtype);
+
-- should return null
SELECT * FROM cypher('expr', $$
RETURN toBooleanList([])
@@ -1394,10 +1401,6 @@ SELECT * FROM cypher('expr', $$
RETURN toBooleanList([["A", "B"], ["C", "D"]])
$$) AS (toBooleanList agtype);
-SELECT * FROM cypher('expr', $$
- RETURN toBooleanList([0,1,2,3,4])
-$$) AS (toBooleanList agtype);
-
-- should fail
SELECT * FROM cypher('expr', $$
RETURN toBooleanList(fail)
diff --git a/src/backend/utils/adt/agtype.c b/src/backend/utils/adt/agtype.c
index ad515835..84dbca29 100644
--- a/src/backend/utils/adt/agtype.c
+++ b/src/backend/utils/adt/agtype.c
@@ -5696,8 +5696,8 @@ Datum age_toboolean(PG_FUNCTION_ARGS)
PG_RETURN_NULL();
/*
- * toBoolean() supports bool, text, cstring, or the agtype bool, and string
- * input.
+ * toBoolean() supports bool, text, cstring, integer or the agtype bool,
+ * string and integer input.
*/
arg = args[0];
type = types[0];
@@ -5720,6 +5720,10 @@ Datum age_toboolean(PG_FUNCTION_ARGS)
else
PG_RETURN_NULL();
}
+ else if (type == INT2OID || type == INT4OID || type == INT8OID)
+ {
+ result = DatumGetBool(DirectFunctionCall1(int4_bool, arg));
+ }
else
ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("toBoolean() unsupported argument type %d",
@@ -5754,6 +5758,11 @@ Datum age_toboolean(PG_FUNCTION_ARGS)
else
PG_RETURN_NULL();
}
+ else if (agtv_value->type == AGTV_INTEGER)
+ {
+ result = DatumGetBool(DirectFunctionCall1(int4_bool,
+
Int64GetDatum(agtv_value->val.int_value)));
+ }
else
ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("toBoolean() unsupported argument agtype
%d",
@@ -5838,6 +5847,13 @@ Datum age_tobooleanlist(PG_FUNCTION_ARGS)
agis_result.res = push_agtype_value(&agis_result.parse_state,
WAGT_ELEM, &bool_elem);
break;
+ case AGTV_INTEGER:
+
+ bool_elem.val.boolean =
DatumGetBool(DirectFunctionCall1(int4_bool,
+
Int64GetDatum(elem->val.int_value)));
+ agis_result.res = push_agtype_value(&agis_result.parse_state,
+ WAGT_ELEM, &bool_elem);
+ break;
default:
bool_elem.type = AGTV_NULL;
@@ -6031,7 +6047,7 @@ Datum age_tofloatlist(PG_FUNCTION_ARGS)
/* iterate through the list */
for (i = 0; i < count; i++)
{
- // TODO: check element's type, it's value, and convert it to float if
possible.
+ // check element's type, it's value, and convert it to float if
possible.
elem = get_ith_agtype_value_from_container(&agt_arg->root, i);
float_elem.type = AGTV_FLOAT;
@@ -6045,12 +6061,14 @@ Datum age_tofloatlist(PG_FUNCTION_ARGS)
float_elem.type = AGTV_FLOAT;
float_elem.val.float_value = float8in_internal_null(string,
NULL, "double precision",
string, &is_valid);
- agis_result.res = push_agtype_value(&agis_result.parse_state,
WAGT_ELEM, &float_elem);
+ agis_result.res = push_agtype_value(&agis_result.parse_state,
+ WAGT_ELEM, &float_elem);
}
else
{
float_elem.type = AGTV_NULL;
- agis_result.res = push_agtype_value(&agis_result.parse_state,
WAGT_ELEM, &float_elem);
+ agis_result.res = push_agtype_value(&agis_result.parse_state,
+ WAGT_ELEM, &float_elem);
}
break;
@@ -6062,19 +6080,22 @@ Datum age_tofloatlist(PG_FUNCTION_ARGS)
sprintf(buffer, "%f", float_num);
string = buffer;
float_elem.val.float_value = float8in_internal_null(string, NULL,
"double precision", string, &is_valid);
- agis_result.res = push_agtype_value(&agis_result.parse_state,
WAGT_ELEM, &float_elem);
+ agis_result.res = push_agtype_value(&agis_result.parse_state,
+ WAGT_ELEM, &float_elem);
break;
default:
float_elem.type = AGTV_NULL;
- agis_result.res = push_agtype_value(&agis_result.parse_state,
WAGT_ELEM, &float_elem);
+ agis_result.res = push_agtype_value(&agis_result.parse_state,
+ WAGT_ELEM, &float_elem);
break;
}
}
- agis_result.res = push_agtype_value(&agis_result.parse_state,
WAGT_END_ARRAY, NULL);
+ agis_result.res = push_agtype_value(&agis_result.parse_state,
+ WAGT_END_ARRAY, NULL);
PG_RETURN_POINTER(agtype_value_to_agtype(agis_result.res));
}