reuse-strings-in-tparser-recursion.patch
text/x-patch
Filename: reuse-strings-in-tparser-recursion.patch
Type: text/x-patch
Part: 0
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/backend/tsearch/wparser_def.c | 0 | 0 |
diff --git a/src/backend/tsearch/wparser_def.c b/src/backend/tsearch/wparser_def.c
index 301c1eb..14757d9 100644
*** a/src/backend/tsearch/wparser_def.c
--- b/src/backend/tsearch/wparser_def.c
***************
*** 24,29 ****
--- 24,30 ----
/* Define me to enable tracing of parser behavior */
/* #define WPARSER_TRACE */
+ #define WPARSER_REUSE
/* Output token categories */
*************** TParserInit(char *str, int len)
*** 328,333 ****
--- 329,358 ----
return prs;
}
+ static TParser *
+ TParserCopyInit(const TParser const* orig, size_t offset, int len)
+ {
+ TParser *prs = (TParser *) palloc0(sizeof(TParser));
+
+ prs->charmaxlen = orig->charmaxlen;
+ prs->usewide = orig->usewide;
+ prs->lenstr = len;
+
+ prs->str = orig->str + offset;
+ prs->pgwstr = orig->pgwstr + offset;
+ prs->wstr = orig->wstr + offset;
+
+
+ prs->state = newTParserPosition(NULL);
+ prs->state->state = TPS_Base;
+
+ #ifdef WPARSER_TRACE
+ fprintf(stderr, "parsing \"%.*s\"\n", len, orig->str + offset);
+ #endif
+
+ return prs;
+ }
+
static void
TParserClose(TParser *prs)
{
*************** TParserClose(TParser *prs)
*** 345,351 ****
--- 370,388 ----
if (prs->pgwstr)
pfree(prs->pgwstr);
#endif
+ pfree(prs);
+ }
+ static void
+ TParserCopyClose(TParser *prs)
+ {
+ while (prs->state)
+ {
+ TParserPosition *ptr = prs->state->prev;
+
+ pfree(prs->state);
+ prs->state = ptr;
+ }
pfree(prs);
}
*************** p_isignore(TParser *prs)
*** 617,623 ****
static int
p_ishost(TParser *prs)
{
! TParser *tmpprs = TParserInit(prs->str + prs->state->posbyte, prs->lenstr - prs->state->posbyte);
int res = 0;
tmpprs->wanthost = true;
--- 654,664 ----
static int
p_ishost(TParser *prs)
{
! #ifdef WPARSER_REUSE
! TParser *tmpprs = TParserCopyInit(prs, prs->state->posbyte, prs->lenstr - prs->state->posbyte);
! #else
! TParser *tmpprs = TParserInit(prs->str + prs->state->posbyte, prs->lenstr - prs->state->posbyte);
! #endif
int res = 0;
tmpprs->wanthost = true;
*************** p_ishost(TParser *prs)
*** 631,637 ****
--- 672,682 ----
prs->state->charlen = tmpprs->state->charlen;
res = 1;
}
+ #ifdef WPARSER_REUSE
+ TParserCopyClose(tmpprs);
+ #else
TParserClose(tmpprs);
+ #endif
return res;
}
*************** p_ishost(TParser *prs)
*** 639,645 ****
static int
p_isURLPath(TParser *prs)
{
! TParser *tmpprs = TParserInit(prs->str + prs->state->posbyte, prs->lenstr - prs->state->posbyte);
int res = 0;
tmpprs->state = newTParserPosition(tmpprs->state);
--- 684,694 ----
static int
p_isURLPath(TParser *prs)
{
! #ifdef WPARSER_REUSE
! TParser *tmpprs = TParserCopyInit(prs, prs->state->posbyte, prs->lenstr - prs->state->posbyte);
! #else
! TParser *tmpprs = TParserInit(prs->str + prs->state->posbyte, prs->lenstr - prs->state->posbyte);
! #endif
int res = 0;
tmpprs->state = newTParserPosition(tmpprs->state);
*************** p_isURLPath(TParser *prs)
*** 654,660 ****
--- 703,713 ----
prs->state->charlen = tmpprs->state->charlen;
res = 1;
}
+ #ifdef WPARSER_REUSE
+ TParserCopyClose(tmpprs);
+ #else
TParserClose(tmpprs);
+ #endif
return res;
}