From 9ec5270ef2a83e3a2637f62e9616833631f7f0a1 Mon Sep 17 00:00:00 2001 From: Shihao Date: Sun, 4 Oct 2026 14:55:26 -0400 Subject: [PATCH v3] Add planner support function to two-argument regexp_like() With no flags, regexp_like() is the same test as the ~ operator, but it had no planner support function, so it got no index condition from a pattern with a fixed prefix. Point it at textregexeq_support(), which already handles a FuncExpr. The three-argument form is left alone, since some flags make prefix extraction unsound. Discussion: https://postgr.es/m/CAGRkXqQZA-LX2UGewj9jHEmUE94U49i8XJjauDiUxZ34Tv1S-g@mail.gmail.com --- src/include/catalog/pg_proc.dat | 3 ++- src/test/regress/expected/btree_index.out | 17 +++++++++++++++++ src/test/regress/sql/btree_index.sql | 11 +++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index f46427258e3..08d30bc7aba 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -3856,7 +3856,8 @@ proargnames => '{string, pattern, start, N, endoption, flags, subexpr}', prosrc => 'regexp_instr' }, { oid => '6263', descr => 'test for regexp match', - proname => 'regexp_like', prorettype => 'bool', proargtypes => 'text text', + proname => 'regexp_like', prosupport => 'textregexeq_support', + prorettype => 'bool', proargtypes => 'text text', proargnames => '{string, pattern}', prosrc => 'regexp_like_no_flags' }, { oid => '6264', descr => 'test for regexp match', proname => 'regexp_like', prorettype => 'bool', diff --git a/src/test/regress/expected/btree_index.out b/src/test/regress/expected/btree_index.out index 7c53d598649..2b4777bc869 100644 --- a/src/test/regress/expected/btree_index.out +++ b/src/test/regress/expected/btree_index.out @@ -765,6 +765,23 @@ select * from btree_bpchar where f1::bpchar like 'foo%'; fool (2 rows) +-- Check that the two-argument form of regexp_like() has a planner support +-- function attached, so it gets an index condition like the ~ operator. +create temp table btree_regexp_like (f1 text collate "C"); +create index on btree_regexp_like(f1); +set enable_seqscan to false; +set enable_bitmapscan to false; +explain (costs off) +select * from btree_regexp_like where regexp_like(f1, '^item999'); + QUERY PLAN +--------------------------------------------------------------------- + Index Only Scan using btree_regexp_like_f1_idx on btree_regexp_like + Index Cond: ((f1 >= 'item999'::text) AND (f1 < 'item99:'::text)) + Filter: regexp_like(f1, '^item999'::text) +(3 rows) + +reset enable_seqscan; +reset enable_bitmapscan; -- -- Perform unique checking, with and without the use of deduplication -- diff --git a/src/test/regress/sql/btree_index.sql b/src/test/regress/sql/btree_index.sql index 6990d7818da..a0164fb0a73 100644 --- a/src/test/regress/sql/btree_index.sql +++ b/src/test/regress/sql/btree_index.sql @@ -411,6 +411,17 @@ explain (costs off) select * from btree_bpchar where f1::bpchar like 'foo%'; select * from btree_bpchar where f1::bpchar like 'foo%'; +-- Check that the two-argument form of regexp_like() has a planner support +-- function attached, so it gets an index condition like the ~ operator. +create temp table btree_regexp_like (f1 text collate "C"); +create index on btree_regexp_like(f1); +set enable_seqscan to false; +set enable_bitmapscan to false; +explain (costs off) +select * from btree_regexp_like where regexp_like(f1, '^item999'); +reset enable_seqscan; +reset enable_bitmapscan; + -- -- Perform unique checking, with and without the use of deduplication -- -- 2.37.1 (Apple Git-137.1)