Обсуждение: 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
От
PG Bug reporting form
Дата:
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.
=?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
От
Andrew Gierth
Дата:
>>>>> "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)