This is an automated email from the ASF dual-hosted git repository.

jgemignani pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/age.git


The following commit(s) were added to refs/heads/master by this push:
     new 96bbf205 Added integer conversion in toBoolean functions (#1199)
96bbf205 is described below

commit 96bbf205d7c63153c82eb190be94d0b784d0a6df
Author: Wendel de Lana <[email protected]>
AuthorDate: Wed Apr 17 14:23:16 2024 -0300

    Added integer conversion in toBoolean functions (#1199)
    
    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      | 32 ++++++++++++++++++++++----------
 regress/sql/expr.sql           | 13 ++++++++-----
 src/backend/utils/adt/agtype.c | 39 +++++++++++++++++++++++++++++++--------
 3 files changed, 61 insertions(+), 23 deletions(-)

diff --git a/regress/expected/expr.out b/regress/expected/expr.out
index cc582ccc..36c08143 100644
--- a/regress/expected/expr.out
+++ b/regress/expected/expr.out
@@ -3094,11 +3094,23 @@ $$) AS (toBoolean agtype);
  
 (1 row)
 
--- should fail
 SELECT * FROM cypher('expr', $$
     RETURN toBoolean(1)
 $$) AS (toBoolean agtype);
-ERROR:  toBoolean() unsupported argument agtype 3
+ toboolean 
+-----------
+ true
+(1 row)
+
+SELECT * FROM cypher('expr', $$
+    RETURN toBoolean(0)
+$$) AS (toBoolean agtype);
+ toboolean 
+-----------
+ false
+(1 row)
+
+-- should fail
 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..11635fac 100644
--- a/regress/sql/expr.sql
+++ b/regress/sql/expr.sql
@@ -1356,10 +1356,13 @@ $$) AS (toBoolean agtype);
 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(0)
+$$) AS (toBoolean agtype);
+-- should fail
 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 9fd0bb86..7053ab13 100644
--- a/src/backend/utils/adt/agtype.c
+++ b/src/backend/utils/adt/agtype.c
@@ -5713,8 +5713,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];
@@ -5737,6 +5737,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",
@@ -5771,6 +5775,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",
@@ -5825,7 +5834,7 @@ Datum age_tobooleanlist(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 boolean 
if possible.
+        // check element's type, it's value, and convert it to boolean if 
possible.
         elem = get_ith_agtype_value_from_container(&agt_arg->root, i);
         bool_elem.type = AGTV_BOOL;
 
@@ -5838,17 +5847,20 @@ Datum age_tobooleanlist(PG_FUNCTION_ARGS)
             if (pg_strcasecmp(string, "true") == 0)
             {
                 bool_elem.val.boolean = true;
-                agis_result.res = push_agtype_value(&agis_result.parse_state, 
WAGT_ELEM, &bool_elem);
+                agis_result.res = push_agtype_value(&agis_result.parse_state,
+                                                    WAGT_ELEM, &bool_elem);
             }
             else if (pg_strcasecmp(string, "false") == 0)
             {
                 bool_elem.val.boolean = false;
-                agis_result.res = push_agtype_value(&agis_result.parse_state, 
WAGT_ELEM, &bool_elem);
+                agis_result.res = push_agtype_value(&agis_result.parse_state,
+                                                    WAGT_ELEM, &bool_elem);
             }
             else
             {
                 bool_elem.type = AGTV_NULL;
-                agis_result.res = push_agtype_value(&agis_result.parse_state, 
WAGT_ELEM, &bool_elem);
+                agis_result.res = push_agtype_value(&agis_result.parse_state,
+                                                    WAGT_ELEM, &bool_elem);
             }
             
             break;
@@ -5856,14 +5868,25 @@ Datum age_tobooleanlist(PG_FUNCTION_ARGS)
         case AGTV_BOOL:
             
             bool_elem.val.boolean = elem->val.boolean;
-            agis_result.res = push_agtype_value(&agis_result.parse_state, 
WAGT_ELEM, &bool_elem);
+            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;
-            agis_result.res = push_agtype_value(&agis_result.parse_state, 
WAGT_ELEM, &bool_elem);
+            agis_result.res = push_agtype_value(&agis_result.parse_state,
+                                                WAGT_ELEM, &bool_elem);
             
             break;
         }

Reply via email to