aboutsummaryrefslogtreecommitdiff
path: root/src/backend/regex
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/regex')
-rw-r--r--src/backend/regex/regc_nfa.c18
-rw-r--r--src/backend/regex/regcomp.c7
-rw-r--r--src/backend/regex/rege_dfa.c8
3 files changed, 23 insertions, 10 deletions
diff --git a/src/backend/regex/regc_nfa.c b/src/backend/regex/regc_nfa.c
index 059cf64df07..60fb0bec5d7 100644
--- a/src/backend/regex/regc_nfa.c
+++ b/src/backend/regex/regc_nfa.c
@@ -3660,8 +3660,13 @@ dumpnfa(struct nfa *nfa,
if (nfa->flags & HASLACONS)
fprintf(f, ", haslacons");
if (nfa->flags & MATCHALL)
- fprintf(f, ", minmatchall %d, maxmatchall %d",
- nfa->minmatchall, nfa->maxmatchall);
+ {
+ fprintf(f, ", minmatchall %d", nfa->minmatchall);
+ if (nfa->maxmatchall == DUPINF)
+ fprintf(f, ", maxmatchall inf");
+ else
+ fprintf(f, ", maxmatchall %d", nfa->maxmatchall);
+ }
fprintf(f, "\n");
for (s = nfa->states; s != NULL; s = s->next)
{
@@ -3824,8 +3829,13 @@ dumpcnfa(struct cnfa *cnfa,
if (cnfa->flags & HASLACONS)
fprintf(f, ", haslacons");
if (cnfa->flags & MATCHALL)
- fprintf(f, ", minmatchall %d, maxmatchall %d",
- cnfa->minmatchall, cnfa->maxmatchall);
+ {
+ fprintf(f, ", minmatchall %d", cnfa->minmatchall);
+ if (cnfa->maxmatchall == DUPINF)
+ fprintf(f, ", maxmatchall inf");
+ else
+ fprintf(f, ", maxmatchall %d", cnfa->maxmatchall);
+ }
fprintf(f, "\n");
for (st = 0; st < cnfa->nstates; st++)
dumpcstate(st, cnfa, f);
diff --git a/src/backend/regex/regcomp.c b/src/backend/regex/regcomp.c
index d9840171a33..473738040bb 100644
--- a/src/backend/regex/regcomp.c
+++ b/src/backend/regex/regcomp.c
@@ -599,6 +599,13 @@ makesearch(struct vars *v,
/* and ^* and \A* too -- not always necessary, but harmless */
newarc(nfa, PLAIN, nfa->bos[0], pre, pre);
newarc(nfa, PLAIN, nfa->bos[1], pre, pre);
+
+ /*
+ * The pattern is still MATCHALL if it was before, but the max match
+ * length is now infinity.
+ */
+ if (nfa->flags & MATCHALL)
+ nfa->maxmatchall = DUPINF;
}
/*
diff --git a/src/backend/regex/rege_dfa.c b/src/backend/regex/rege_dfa.c
index 1d79d734468..ba1289c64a9 100644
--- a/src/backend/regex/rege_dfa.c
+++ b/src/backend/regex/rege_dfa.c
@@ -385,14 +385,10 @@ matchuntil(struct vars *v,
{
size_t nchr = probe - v->start;
- /*
- * It might seem that we should check maxmatchall too, but the .* at
- * the front of the pattern absorbs any extra characters (and it was
- * tacked on *after* computing minmatchall/maxmatchall). Thus, we
- * should match if there are at least minmatchall characters.
- */
if (nchr < d->cnfa->minmatchall)
return 0;
+ /* maxmatchall will always be infinity, cf. makesearch() */
+ assert(d->cnfa->maxmatchall == DUPINF);
return 1;
}