On 10/11/2023 16:20, Alena Rybakina wrote:
I added log like that: ERROR:  unrecognized node type: 0.
I fixed this issue and added some cosmetic refactoring.
The changes are presented in the or_patch_changes.diff file.

Looking into the patch, I found some trivial improvements (see attachment).
Also, it is not obvious that using a string representation of the clause as a hash table key is needed here. Also, by making a copy of the node in the get_key_nconst_node(), you replace the location field, but in the case of complex expression, you don't do the same with other nodes. I propose to generate expression hash instead + prove the equality of two expressions by calling equal().

--
regards,
Andrei Lepikhov
Postgres Professional
diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c
index 25a4235dbd..de27d2646c 100644
--- a/src/backend/parser/parse_expr.c
+++ b/src/backend/parser/parse_expr.c
@@ -178,6 +178,10 @@ transformBoolExprOr(ParseState *pstate, BoolExpr 
*expr_orig)
        HTAB               *or_group_htab = NULL;
        int                     len_ors = list_length(expr_orig->args);
 
+       /* If this is not an 'OR' expression, skip the transformation */
+       if (!or_transform_limit || expr_orig->boolop != OR_EXPR || len_ors < 2)
+               return transformBoolExpr(pstate, (BoolExpr *) expr_orig);
+
        MemSet(&info, 0, sizeof(info));
        info.keysize = sizeof(char *);
        info.entrysize = sizeof(OrClauseGroupEntry);
@@ -188,10 +192,6 @@ transformBoolExprOr(ParseState *pstate, BoolExpr 
*expr_orig)
                                                                          &info,
                                                                          
HASH_ELEM | HASH_FUNCTION | HASH_COMPARE);
 
-       /* If this is not an 'OR' expression, skip the transformation */
-       if (expr_orig->boolop != OR_EXPR || !or_transform_limit || len_ors == 1 
|| !or_group_htab)
-               return transformBoolExpr(pstate, (BoolExpr *) expr_orig);
-
        foreach(lc, expr_orig->args)
        {
                Node                       *arg = lfirst(lc);

Reply via email to