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

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

commit b4783d585b9b88c9361b5790cd44d9834e1bdb2a
Author: John Gemignani <[email protected]>
AuthorDate: Tue Dec 9 10:51:01 2025 -0800

    Fix Issue 2256: segmentation fault when calling coalesce function (#2259)
    
    Fixed issue 2256: A segmentation fault occurs when calling the coalesce
    function in PostgreSQL version 17. This likely predates 17 and includes
    other similar types of "functions".
    
    See issues 1124 (PR 1125) and 1303 (PR 1317) for more details.
    
    This issue is due to coalesce() being processed differently from other
    functions. Additionally, greatest() was found to exhibit the same
    behavior. They were added to the list of types to ignore during the
    cypher analyze phase.
    
    A few others were added: CaseExpr, XmlExpr, ArrayExpr, & RowExpr.
    Although, I wasn't able to find cases where these caused crashes.
    
    Added regression tests.
    
    modified:   regress/expected/cypher.out
    modified:   regress/sql/cypher.sql
    modified:   src/backend/parser/cypher_analyze.c
---
 regress/expected/cypher.out         | 16 ++++++++++++++++
 regress/sql/cypher.sql              |  7 +++++++
 src/backend/parser/cypher_analyze.c | 26 +++++++++++++++++++-------
 3 files changed, 42 insertions(+), 7 deletions(-)

diff --git a/regress/expected/cypher.out b/regress/expected/cypher.out
index 31bafc6c..53ea9f0c 100644
--- a/regress/expected/cypher.out
+++ b/regress/expected/cypher.out
@@ -169,6 +169,22 @@ CREATE TABLE my_edges AS
 -- create a table of 4 columns, u, e, v, p. should be 5 rows
 CREATE TABLE my_detailed_paths AS
     (SELECT * FROM cypher('issue_1767', $$ MATCH p=(u)-[e]->(v) RETURN u,e,v,p 
$$) as (u agtype, e agtype, v agtype, p agtype));
+--
+-- Issue 2256: A segmentation fault occurs when calling the coalesce function
+--             This also occurs with the greatest function too.
+--
+SELECT * FROM coalesce(1, 0);
+ coalesce 
+----------
+        1
+(1 row)
+
+SELECT * FROM greatest(1, 0);
+ greatest 
+----------
+        1
+(1 row)
+
 -- dump out the tables
 SELECT * FROM my_vertices;
                                u                                
diff --git a/regress/sql/cypher.sql b/regress/sql/cypher.sql
index 7ded61ee..090c7e70 100644
--- a/regress/sql/cypher.sql
+++ b/regress/sql/cypher.sql
@@ -94,6 +94,13 @@ CREATE TABLE my_edges AS
 CREATE TABLE my_detailed_paths AS
     (SELECT * FROM cypher('issue_1767', $$ MATCH p=(u)-[e]->(v) RETURN u,e,v,p 
$$) as (u agtype, e agtype, v agtype, p agtype));
 
+--
+-- Issue 2256: A segmentation fault occurs when calling the coalesce function
+--             This also occurs with the greatest function too.
+--
+SELECT * FROM coalesce(1, 0);
+SELECT * FROM greatest(1, 0);
+
 -- dump out the tables
 SELECT * FROM my_vertices;
 SELECT * FROM my_edges;
diff --git a/src/backend/parser/cypher_analyze.c 
b/src/backend/parser/cypher_analyze.c
index af3e83c8..a408eea6 100644
--- a/src/backend/parser/cypher_analyze.c
+++ b/src/backend/parser/cypher_analyze.c
@@ -171,14 +171,20 @@ static bool convert_cypher_walker(Node *node, ParseState 
*pstate)
          * JsonConstructorExpr - wrapper over FuncExpr/Aggref/WindowFunc for
          *                       SQL/JSON constructors
          *
-         * These are a special case that needs to be ignored.
+         * Added the following, although only the first 2 caused crashes in 
tests -
+         * CoalesceExpr, MinMaxExpr, CaseExpr, XmlExpr, ArrayExpr, RowExpr
+         *
+         * These are all special case that needs to be ignored.
          *
          */
         if (IsA(funcexpr, SQLValueFunction)
-                || IsA(funcexpr, CoerceViaIO)
-                || IsA(funcexpr, Var)   || IsA(funcexpr, OpExpr)
-                || IsA(funcexpr, Const) || IsA(funcexpr, BoolExpr)
-                || IsA(funcexpr, JsonConstructorExpr))
+            || IsA(funcexpr, CoerceViaIO)
+            || IsA(funcexpr, Var)   || IsA(funcexpr, OpExpr)
+            || IsA(funcexpr, Const) || IsA(funcexpr, BoolExpr)
+            || IsA(funcexpr, JsonConstructorExpr)
+            || IsA(funcexpr, CoalesceExpr) || IsA(funcexpr, MinMaxExpr)
+            || IsA(funcexpr, CaseExpr) || IsA(funcexpr, XmlExpr)
+            || IsA(funcexpr, ArrayExpr) || IsA(funcexpr, RowExpr))
         {
             return false;
         }
@@ -346,14 +352,20 @@ static bool is_func_cypher(FuncExpr *funcexpr)
      * JsonConstructorExpr - wrapper over FuncExpr/Aggref/WindowFunc for
      *                       SQL/JSON constructors
      *
-     * These are a special case that needs to be ignored.
+     * Added the following, although only the first 2 caused crashes in tests -
+     * CoalesceExpr, MinMaxExpr, CaseExpr, XmlExpr, ArrayExpr, RowExpr
+     *
+     * These are all special case that needs to be ignored.
      *
      */
     if (IsA(funcexpr, SQLValueFunction)
             || IsA(funcexpr, CoerceViaIO)
             || IsA(funcexpr, Var)   || IsA(funcexpr, OpExpr)
             || IsA(funcexpr, Const) || IsA(funcexpr, BoolExpr)
-            || IsA(funcexpr, JsonConstructorExpr))
+            || IsA(funcexpr, JsonConstructorExpr)
+            || IsA(funcexpr, CoalesceExpr) || IsA(funcexpr, MinMaxExpr)
+            || IsA(funcexpr, CaseExpr) || IsA(funcexpr, XmlExpr)
+            || IsA(funcexpr, ArrayExpr) || IsA(funcexpr, RowExpr))
     {
         return false;
     }

Reply via email to