aboutsummaryrefslogtreecommitdiff
path: root/src/include/regex/regguts.h
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2012-02-24 14:56:35 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2012-02-24 18:40:30 -0500
commit587359479acbbdc95c8e37da40707e37097423f5 (patch)
treeff30bd279670beaf90cc78d1076f9f08b4211465 /src/include/regex/regguts.h
parent3cbfe485e44d055b9e6a27e47069729375059f8c (diff)
downloadpostgresql-587359479acbbdc95c8e37da40707e37097423f5.tar.gz
postgresql-587359479acbbdc95c8e37da40707e37097423f5.zip
Avoid repeated creation/freeing of per-subre DFAs during regex search.
In nested sub-regex trees, lower-level nodes created DFAs and then destroyed them again before exiting, which is a bit dumb considering that the recursive search is likely to call those nodes again later. Instead cache each created DFA until the end of pg_regexec(). This is basically a space for time tradeoff, in that it might increase the maximum memory usage. However, in most regex patterns there are not all that many subre nodes, so not that many DFAs --- and in any case, the peak usage occurs when reaching the bottom recursion level, and except for alternation cases that's going to be the same anyway.
Diffstat (limited to 'src/include/regex/regguts.h')
-rw-r--r--src/include/regex/regguts.h4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/include/regex/regguts.h b/src/include/regex/regguts.h
index bc5419d98e7..65b8d178da8 100644
--- a/src/include/regex/regguts.h
+++ b/src/include/regex/regguts.h
@@ -409,7 +409,7 @@ struct subre
#define PREF(f) ((f)&LOCAL)
#define PREF2(f1, f2) ((PREF(f1) != 0) ? PREF(f1) : PREF(f2))
#define COMBINE(f1, f2) (UP((f1)|(f2)) | PREF2(f1, f2))
- short id; /* ID of subre (1..ntree) */
+ short id; /* ID of subre (1..ntree-1) */
int subno; /* subexpression number (for 'b' and '(') */
short min; /* min repetitions for iteration or backref */
short max; /* max repetitions for iteration or backref */
@@ -446,7 +446,7 @@ struct guts
size_t nsub; /* copy of re_nsub */
struct subre *tree;
struct cnfa search; /* for fast preliminary search */
- int ntree;
+ int ntree; /* number of subre's, less one */
struct colormap cmap;
int FUNCPTR(compare, (const chr *, const chr *, size_t));
struct subre *lacons; /* lookahead-constraint vector */