diff --git a/src/backend/utils/adt/regexp.c b/src/backend/utils/adt/regexp.c index 6a89fab..7245c79 100644 --- a/src/backend/utils/adt/regexp.c +++ b/src/backend/utils/adt/regexp.c @@ -962,9 +962,8 @@ setup_regexp_matches(text *orig_str, text *pattern, text *flags, * special case can occur if the pattern matches zero characters just * after the prior match or at the end of the string). */ - if (start_search < pmatch[0].rm_eo) - start_search = pmatch[0].rm_eo; - else + start_search = pmatch[0].rm_eo; + if (pmatch[0].rm_so == pmatch[0].rm_eo) start_search++; if (start_search > wide_len) break; diff --git a/src/test/regress/expected/strings.out b/src/test/regress/expected/strings.out index 281c695..7167bed 100644 --- a/src/test/regress/expected/strings.out +++ b/src/test/regress/expected/strings.out @@ -440,6 +440,25 @@ SELECT regexp_matches('foobarbequebaz', $re$barbeque$re$); {barbeque} (1 row) +-- Check with start (^) and end ($) anchors with multiline option +SELECT regexp_matches('foo' || chr(10) || 'bar' || chr(10) || 'bequq' || chr(10) || 'baz', '^', 'mg'); + regexp_matches +---------------- + {""} + {""} + {""} + {""} +(4 rows) + +SELECT regexp_matches('foo' || chr(10) || 'bar' || chr(10) || 'bequq' || chr(10) || 'baz', '$', 'mg'); + regexp_matches +---------------- + {""} + {""} + {""} + {""} +(4 rows) + -- give me errors SELECT regexp_matches('foobarbequebaz', $re$(bar)(beque)$re$, 'gz'); ERROR: invalid regexp option: "z" diff --git a/src/test/regress/sql/strings.sql b/src/test/regress/sql/strings.sql index e7841aa..0bdb4ac 100644 --- a/src/test/regress/sql/strings.sql +++ b/src/test/regress/sql/strings.sql @@ -158,6 +158,10 @@ SELECT regexp_matches('foobarbequebaz', $re$(bar)(.+)?(beque)$re$); -- no capture groups SELECT regexp_matches('foobarbequebaz', $re$barbeque$re$); +-- Check with start (^) and end ($) anchors with multiline option +SELECT regexp_matches('foo' || chr(10) || 'bar' || chr(10) || 'bequq' || chr(10) || 'baz', '^', 'mg'); +SELECT regexp_matches('foo' || chr(10) || 'bar' || chr(10) || 'bequq' || chr(10) || 'baz', '$', 'mg'); + -- give me errors SELECT regexp_matches('foobarbequebaz', $re$(bar)(beque)$re$, 'gz'); SELECT regexp_matches('foobarbequebaz', $re$(barbeque$re$);