Thread: BUG #15595: matchctx->npatterns is always 1 no matter pattern have 0or 1 subexpression
BUG #15595: matchctx->npatterns is always 1 no matter pattern have 0or 1 subexpression
From
PG Bug reporting form
Date:
The following bug has been logged on the website: Bug reference: 15595 Logged by: Damion Email address: zhq651@126.com PostgreSQL version: 11.1 Operating system: linux Description: Hi, when I use setup_regexp_matches, I found matchctx->npatterns is always 1 no matter pattern have not or one subexpr subexpression. so I can't tell whether there is a subexpression. see below: if orig_str is '221133' & pattern is '11' (gdb) p nth_subexpr $23 = 1 (gdb) p matchctx->npatterns $24 = 1 if orig_str is '221133' & pattern is '(11)' (gdb) p nth_subexpr $25 = 1 (gdb) p matchctx->npatterns $26 = 1 if pattern is '((1)1)' or '((11))' (2 subexpression or more), I can kwown how many subexpression by matchctx->npatterns . postgres=# SELECT regexp_substr('221133', '((1)1)', 1, 1, 'i', 1); (gdb) p matchctx->npatterns $27 = 2 (gdb) p nth_subexpr $28 = 1 Thanks.
Re: BUG #15595: matchctx->npatterns is always 1 no matter pattern have 0 or 1 subexpression
From
Tom Lane
Date:
=?utf-8?q?PG_Bug_reporting_form?= <noreply@postgresql.org> writes: > when I use setup_regexp_matches, I found matchctx->npatterns is always 1 no > matter pattern have not or one subexpr subexpression. It seems unlikely that this is a Postgres bug. Just looking at the code in setup_regexp_matches, I wonder whether you are passing use_subpatterns = true or not: /* do we want to remember subpatterns? */ if (use_subpatterns && cpattern->re_nsub > 0) { matchctx->npatterns = cpattern->re_nsub; pmatch_len = cpattern->re_nsub + 1; } else { use_subpatterns = false; matchctx->npatterns = 1; pmatch_len = 1; } regards, tom lane
Re: BUG #15595: matchctx->npatterns is always 1 no matter pattern have 0 or 1 subexpression
From
Andrew Gierth
Date:
>>>>> "PG" == PG Bug reporting form <noreply@postgresql.org> writes: PG> Hi, PG> when I use setup_regexp_matches, I found matchctx->npatterns is PG> always 1 no matter pattern have not or one subexpr subexpression. This isn't a bug. setup_regexp_matches is just an internal helper function for use by regexp_match, regexp_matches, regexp_split_to_table, and regexp_split_to_array, all of which treat the whole match as the result if there are no subexpression captures in the regexp. npatterns is therefore forced to be 1 in that case, so that nmatches * npatterns is the number of position pairs returned in the match_locs array. -- Andrew (irc:RhodiumToad)