=== Applying patches on top of PostgreSQL commit ID 3c4d7557e03ba1ca988a2d1a2518a4ad93976f86 === /etc/rc.d/jail: WARNING: Per-jail configuration via jail_* variables is obsolete. Please consider migrating to /etc/jail.conf. Thu May 29 14:02:19 UTC 2025 On branch cf/5778 nothing to commit, working tree clean === using 'git am' to apply patch ./v3-0001-Fix-SIMILAR-TO-regex-translation-for-character-cl.patch === Applying: Fix SIMILAR TO regex translation for character classes Using index info to reconstruct a base tree... M src/backend/utils/adt/regexp.c M src/test/regress/expected/strings.out M src/test/regress/sql/strings.sql Falling back to patching base and 3-way merge... Auto-merging src/test/regress/sql/strings.sql CONFLICT (content): Merge conflict in src/test/regress/sql/strings.sql Auto-merging src/test/regress/expected/strings.out CONFLICT (content): Merge conflict in src/test/regress/expected/strings.out error: Failed to merge in the changes. hint: Use 'git am --show-current-patch=diff' to see the failed patch Patch failed at 0001 Fix SIMILAR TO regex translation for character classes When you have resolved this problem, run "git am --continue". If you prefer to skip this patch, run "git am --skip" instead. To restore the original branch and stop patching, run "git am --abort". Unstaged changes after reset: M src/test/regress/expected/strings.out M src/test/regress/sql/strings.sql === using patch(1) to apply patch ./v3-0001-Fix-SIMILAR-TO-regex-translation-for-character-cl.patch === patching file src/backend/utils/adt/regexp.c Hunk #1 FAILED at 773. Hunk #2 FAILED at 904. Hunk #3 FAILED at 953. 3 out of 3 hunks FAILED -- saving rejects to file src/backend/utils/adt/regexp.c.rej patching file src/test/regress/expected/strings.out Hunk #1 FAILED at 614. 1 out of 1 hunk FAILED -- saving rejects to file src/test/regress/expected/strings.out.rej patching file src/test/regress/sql/strings.sql Hunk #1 succeeded at 217 with fuzz 2 (offset 20 lines). Unstaged changes after reset: M src/test/regress/sql/strings.sql Removing src/backend/utils/adt/regexp.c.rej Removing src/test/regress/expected/strings.out.rej === using 'git apply' to apply patch ./v3-0001-Fix-SIMILAR-TO-regex-translation-for-character-cl.patch === Applied patch to 'src/backend/utils/adt/regexp.c' cleanly. Applied patch to 'src/test/regress/expected/strings.out' with conflicts. Applied patch to 'src/test/regress/sql/strings.sql' with conflicts. U src/test/regress/expected/strings.out U src/test/regress/sql/strings.sql diff --cc src/test/regress/expected/strings.out index 788844abd20,601bc7d2ec2..00000000000 --- a/src/test/regress/expected/strings.out +++ b/src/test/regress/expected/strings.out @@@ -617,69 -617,93 +617,159 @@@ HINT: Escape string must be empty or o -- Characters that should be left alone in character classes when a -- SIMILAR TO regexp pattern is converted to POSIX style. -- Underscore "_" ++<<<<<<< ours +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '_[_[:alpha:]_]_'; + QUERY PLAN +------------------------------------------------ + Seq Scan on text_tbl + Filter: (f1 ~ '^(?:.[_[:alpha:]_].)$'::text) +(2 rows) + +-- Percentage "%" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '%[%[:alnum:]%]%'; + QUERY PLAN +-------------------------------------------------- + Seq Scan on text_tbl + Filter: (f1 ~ '^(?:.*[%[:alnum:]%].*)$'::text) +(2 rows) + +-- Dot "." +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '.[.[:alnum:].].'; + QUERY PLAN +-------------------------------------------------- + Seq Scan on text_tbl + Filter: (f1 ~ '^(?:\.[.[:alnum:].]\.)$'::text) +(2 rows) + +-- Dollar "$" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '$[$[:alnum:]$]$'; + QUERY PLAN +-------------------------------------------------- + Seq Scan on text_tbl + Filter: (f1 ~ '^(?:\$[$[:alnum:]$]\$)$'::text) +(2 rows) + +-- Opening parenthesis "(" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '()[([:alnum:](]()'; + QUERY PLAN +------------------------------------------------------ + Seq Scan on text_tbl + Filter: (f1 ~ '^(?:(?:)[([:alnum:](](?:))$'::text) +(2 rows) + +-- Caret "^" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '^[^[:alnum:]^[^^][[^^]][\^][[\^]]\^]^'; + QUERY PLAN +------------------------------------------------------------------------ + Seq Scan on text_tbl + Filter: (f1 ~ '^(?:\^[^[:alnum:]^[^^][[^^]][\^][[\^]]\^]\^)$'::text) +(2 rows) + +-- Closing square bracket "]" at the beginning of character class +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '[]%][^]%][^%]%'; + QUERY PLAN +------------------------------------------------ + Seq Scan on text_tbl + Filter: (f1 ~ '^(?:[]%][^]%][^%].*)$'::text) +(2 rows) + +-- Closing square bracket effective after two carets at the beginning +-- of character class. +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '[^^]^'; + QUERY PLAN +--------------------------------------- + Seq Scan on text_tbl + Filter: (f1 ~ '^(?:[^^]\^)$'::text) +(2 rows) ++======= + EXPLAIN (VERBOSE, COSTS OFF) SELECT (SELECT '') SIMILAR TO '_[_[:alpha:]_]_'; + QUERY PLAN + --------------------------------------------------------------- + Result + Output: ((InitPlan 1).col1 ~ '^(?:.[_[:alpha:]_].)$'::text) + InitPlan 1 + -> Result + Output: ''::text + (5 rows) + + -- Percentage "%" + EXPLAIN (VERBOSE, COSTS OFF) SELECT (SELECT '') SIMILAR TO '%[%[:alnum:]%]%'; + QUERY PLAN + ----------------------------------------------------------------- + Result + Output: ((InitPlan 1).col1 ~ '^(?:.*[%[:alnum:]%].*)$'::text) + InitPlan 1 + -> Result + Output: ''::text + (5 rows) + + -- Dot "." + EXPLAIN (VERBOSE, COSTS OFF) SELECT (SELECT '') SIMILAR TO '.[.[:alnum:].].'; + QUERY PLAN + ----------------------------------------------------------------- + Result + Output: ((InitPlan 1).col1 ~ '^(?:\.[.[:alnum:].]\.)$'::text) + InitPlan 1 + -> Result + Output: ''::text + (5 rows) + + -- Dollar "$" + EXPLAIN (VERBOSE, COSTS OFF) SELECT (SELECT '') SIMILAR TO '$[$[:alnum:]$]$'; + QUERY PLAN + ----------------------------------------------------------------- + Result + Output: ((InitPlan 1).col1 ~ '^(?:\$[$[:alnum:]$]\$)$'::text) + InitPlan 1 + -> Result + Output: ''::text + (5 rows) + + -- Opening parenthesis "(" + EXPLAIN (VERBOSE, COSTS OFF) SELECT (SELECT '') SIMILAR TO '([([:alnum:](]('; + QUERY PLAN + ------------------------------------------------------------------- + Result + Output: ((InitPlan 1).col1 ~ '^(?:(?:[([:alnum:](](?:)$'::text) + InitPlan 1 + -> Result + Output: ''::text + (5 rows) + + -- Caret "^" + EXPLAIN (VERBOSE, COSTS OFF) SELECT (SELECT '') SIMILAR TO '^[^[:alnum:]^[^^][[^^]][\^][[\^]]\^]^'; + QUERY PLAN + --------------------------------------------------------------------------------------- + Result + Output: ((InitPlan 1).col1 ~ '^(?:\^[^[:alnum:]^[^^][[^^]][\^][[\^]]\^]\^)$'::text) + InitPlan 1 + -> Result + Output: ''::text + (5 rows) + + -- Closing square bracket "]" at the beginning of character class + EXPLAIN (VERBOSE, COSTS OFF) SELECT (SELECT '') SIMILAR TO '[]%][^]%][^%]%'; + QUERY PLAN + --------------------------------------------------------------- + Result + Output: ((InitPlan 1).col1 ~ '^(?:[]%][^]%][^%].*)$'::text) + InitPlan 1 + -> Result + Output: ''::text + (5 rows) + + -- Closing square bracket effective after two carets at the beginning + -- of character class. + EXPLAIN (VERBOSE, COSTS OFF) SELECT (SELECT '') SIMILAR TO '[^^]^'; + QUERY PLAN + ------------------------------------------------------ + Result + Output: ((InitPlan 1).col1 ~ '^(?:[^^]\^)$'::text) + InitPlan 1 + -> Result + Output: ''::text + (5 rows) ++>>>>>>> theirs -- Test backslash escapes in regexp_replace's replacement string SELECT regexp_replace('1112223333', E'(\\d{3})(\\d{3})(\\d{4})', E'(\\1) \\2-\\3'); diff --cc src/test/regress/sql/strings.sql index 2577a42987d,34c52b23604..00000000000 --- a/src/test/regress/sql/strings.sql +++ b/src/test/regress/sql/strings.sql @@@ -200,22 -200,22 +200,41 @@@ SELECT 'abcdefg' SIMILAR TO '_bcd#%' ES -- Characters that should be left alone in character classes when a -- SIMILAR TO regexp pattern is converted to POSIX style. -- Underscore "_" ++<<<<<<< ours +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '_[_[:alpha:]_]_'; +-- Percentage "%" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '%[%[:alnum:]%]%'; +-- Dot "." +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '.[.[:alnum:].].'; +-- Dollar "$" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '$[$[:alnum:]$]$'; +-- Opening parenthesis "(" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '()[([:alnum:](]()'; +-- Caret "^" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '^[^[:alnum:]^[^^][[^^]][\^][[\^]]\^]^'; +-- Closing square bracket "]" at the beginning of character class +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '[]%][^]%][^%]%'; +-- Closing square bracket effective after two carets at the beginning +-- of character class. +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '[^^]^'; ++======= + EXPLAIN (VERBOSE, COSTS OFF) SELECT (SELECT '') SIMILAR TO '_[_[:alpha:]_]_'; + -- Percentage "%" + EXPLAIN (VERBOSE, COSTS OFF) SELECT (SELECT '') SIMILAR TO '%[%[:alnum:]%]%'; + -- Dot "." + EXPLAIN (VERBOSE, COSTS OFF) SELECT (SELECT '') SIMILAR TO '.[.[:alnum:].].'; + -- Dollar "$" + EXPLAIN (VERBOSE, COSTS OFF) SELECT (SELECT '') SIMILAR TO '$[$[:alnum:]$]$'; + -- Opening parenthesis "(" + EXPLAIN (VERBOSE, COSTS OFF) SELECT (SELECT '') SIMILAR TO '([([:alnum:](]('; + -- Caret "^" + EXPLAIN (VERBOSE, COSTS OFF) SELECT (SELECT '') SIMILAR TO '^[^[:alnum:]^[^^][[^^]][\^][[\^]]\^]^'; + -- Closing square bracket "]" at the beginning of character class + EXPLAIN (VERBOSE, COSTS OFF) SELECT (SELECT '') SIMILAR TO '[]%][^]%][^%]%'; + -- Closing square bracket effective after two carets at the beginning + -- of character class. + EXPLAIN (VERBOSE, COSTS OFF) SELECT (SELECT '') SIMILAR TO '[^^]^'; ++>>>>>>> theirs -- Test backslash escapes in regexp_replace's replacement string SELECT regexp_replace('1112223333', E'(\\d{3})(\\d{3})(\\d{4})', E'(\\1) \\2-\\3');