v2-0001-Make-transformAExprIn-return-a-flattened-bool-exp.patch
application/octet-stream
Filename: v2-0001-Make-transformAExprIn-return-a-flattened-bool-exp.patch
Type: application/octet-stream
Part: 0
From 1245c0b8253ed0a1e2aa4b800a396a840b61eab3 Mon Sep 17 00:00:00 2001
From: "Zizhuan Liu(X-MAN)" <44973863@qq.com>
Date: Sun, 31 May 2026 18:29:30 +0800
Subject: [PATCH v2] Make transformAExprIn() return a flattened bool expression
directly
---
src/backend/parser/parse_expr.c | 22 ++++++++++++++++++++--
1 file changed, 20 insertions(+), 2 deletions(-)
diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c
index f1003e5..cc3e23a 100644
--- a/src/backend/parser/parse_expr.c
+++ b/src/backend/parser/parse_expr.c
@@ -1148,6 +1148,7 @@ transformAExprIn(ParseState *pstate, A_Expr *a)
bool useOr;
ListCell *l;
bool has_rvars = false;
+ bool build_bool_expr = false;
/*
* If the operator is <>, combine with AND not OR.
@@ -1295,12 +1296,29 @@ transformAExprIn(ParseState *pstate, A_Expr *a)
}
cmp = coerce_to_boolean(pstate, cmp, "IN");
- if (result == NULL)
+
+ /*
+ * Flatten boolean expressions generated in this loop by
+ * appending to args.
+ *
+ * If a->rexpr has a single argument, assign and break;
+ * otherwise, build a new boolean expression and set the
+ * flag.
+ */
+ if (build_bool_expr)
+ ((BoolExpr *) result)->args = lappend(((BoolExpr *) result)->args, cmp);
+ else if (result == NULL && list_length(rexprs) == 1)
+ {
result = cmp;
+ break;
+ }
else
+ {
result = (Node *) makeBoolExpr(useOr ? OR_EXPR : AND_EXPR,
- list_make2(result, cmp),
+ result ? list_make2(result, cmp) : list_make1(cmp),
a->location);
+ build_bool_expr = true;
+ }
}
return result;
--
2.43.0