diff.diff

text/x-patch

Filename: diff.diff
Type: text/x-patch
Part: 2
Message: Re: POC, WIP: OR-clause support for indexes

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: unified
File+
src/backend/parser/parse_expr.c 2 2
src/test/regress/expected/join.out 17 0
src/test/regress/sql/join.sql 9 0
diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c
index 1490aa07246..56e7503445a 100644
--- a/src/backend/parser/parse_expr.c
+++ b/src/backend/parser/parse_expr.c
@@ -149,12 +149,12 @@ transformBoolExprOr(ParseState *pstate, BoolExpr *expr_orig)
 		 * an OpExpr.
 		 * Get pointers to constant and expression sides of the qual.
 		 */
-		if (IsA(get_leftop(orqual), Const))
+		if (IsA(get_leftop(orqual), Const) || IsA(get_leftop(orqual), Param))
 		{
 			nconst_expr = get_rightop(orqual);
 			const_expr = get_leftop(orqual);
 		}
-		else if (IsA(get_rightop(orqual), Const))
+		else if (IsA(get_rightop(orqual), Const) || IsA(get_rightop(orqual), Param))
 		{
 			const_expr = get_rightop(orqual);
 			nconst_expr = get_leftop(orqual);
diff --git a/src/test/regress/expected/join.out b/src/test/regress/expected/join.out
index 2314d92a6d4..b492ef1654f 100644
--- a/src/test/regress/expected/join.out
+++ b/src/test/regress/expected/join.out
@@ -4256,6 +4256,23 @@ select * from tenk1 a join tenk1 b on
                            Index Cond: (unique1 = 3)
 (15 rows)
 
+SELECT FORMAT('prepare prep1 %s AS SELECT * FROM tenk1 t WHERE %s',
+ '(' || string_agg('int', ',') || ')',
+ string_agg(FORMAT('t.unique1 = $%s', g.id), ' or ')
+ ) AS cmd
+ FROM generate_series(1, 10) AS g(id) \gexec
+prepare prep1 (int,int,int,int,int,int,int,int,int,int) AS SELECT * FROM tenk1 t WHERE t.unique1 = $1 or t.unique1 = $2 or t.unique1 = $3 or t.unique1 = $4 or t.unique1 = $5 or t.unique1 = $6 or t.unique1 = $7 or t.unique1 = $8 or t.unique1 = $9 or t.unique1 = $10
+SELECT FORMAT('explain (costs off) execute prep1 %s;', '(' || string_agg(g.id::text, ',') || ')') AS cmd
+ FROM generate_series(1, 10) AS g(id) \gexec
+explain (costs off) execute prep1 (1,2,3,4,5,6,7,8,9,10);
+                                QUERY PLAN                                 
+---------------------------------------------------------------------------
+ Bitmap Heap Scan on tenk1 t
+   Recheck Cond: (unique1 = ANY ('{1,2,3,4,5,6,7,8,9,10}'::integer[]))
+   ->  Bitmap Index Scan on tenk1_unique1
+         Index Cond: (unique1 = ANY ('{1,2,3,4,5,6,7,8,9,10}'::integer[]))
+(4 rows)
+
 RESET or_transform_limit;
 --
 -- test placement of movable quals in a parameterized join tree
diff --git a/src/test/regress/sql/join.sql b/src/test/regress/sql/join.sql
index d4d7d853a4a..b6cc4644518 100644
--- a/src/test/regress/sql/join.sql
+++ b/src/test/regress/sql/join.sql
@@ -1405,6 +1405,15 @@ explain (costs off)
 select * from tenk1 a join tenk1 b on
   (a.unique1 < 20 or a.unique1 = 3 or a.unique1 = 1 and b.unique1 = 2) or
   ((a.unique2 = 3 or a.unique2 = 7) and b.hundred = 4);
+
+SELECT FORMAT('prepare prep1 %s AS SELECT * FROM tenk1 t WHERE %s',
+ '(' || string_agg('int', ',') || ')',
+ string_agg(FORMAT('t.unique1 = $%s', g.id), ' or ')
+ ) AS cmd
+ FROM generate_series(1, 10) AS g(id) \gexec
+SELECT FORMAT('explain (costs off) execute prep1 %s;', '(' || string_agg(g.id::text, ',') || ')') AS cmd
+ FROM generate_series(1, 10) AS g(id) \gexec
+
 RESET or_transform_limit;
 
 --