194#include "catalog/pg_collation_d.h"
221#define MAX_EXPANDED_STATES 128
222#define MAX_EXPANDED_ARCS 1024
223#define MAX_TRGM_COUNT 256
224#define WISH_TRGM_PENALTY 16
225#define COLOR_COUNT_LIMIT 256
288#define COLOR_UNKNOWN (-3)
289#define COLOR_BLANK (-4)
331#define TSTATE_INIT 0x01
332#define TSTATE_FIN 0x02
484 int cflags,
Oid collation);
506#ifdef TRGM_REGEXP_DEBUG
539 "createTrgmNFA temporary context",
578#ifdef TRGM_REGEXP_DEBUG
587#ifdef TRGM_REGEXP_DEBUG
613#ifdef TRGM_REGEXP_DEBUG
653 for (k =
j; k <
j + cnt; k++)
684 int cnt =
state->arcsCount;
687 for (
i = 0;
i < cnt;
i++)
751 errmsg(
"invalid regular expression: %s", errMsg)));
925 trgmNFA->initState = initstate;
1027 foreach(cell,
state->enterKeys)
1068 for (
i = 0;
i < arcsCount;
i++)
1102 else if (
arc->
co >= 0)
1139 destKey.prefix.colors[0] = key->prefix.colors[1];
1212 foreach(cell,
state->enterKeys)
1220 for (
i = 0;
i < arcsCount;
i++)
1251 destKey.prefix.colors[0] = key->prefix.colors[1];
1266 destKey.prefix.colors[0] = key->prefix.colors[1];
1303 foreach(cell,
state->enterKeys)
1315 arc->ctrgm.colors[0] = key->prefix.colors[0];
1316 arc->ctrgm.colors[1] = key->prefix.colors[1];
1317 arc->ctrgm.colors[2] = co;
1400 state->tentFlags = 0;
1460 int arcsCount =
trgmNFA->arcsCount,
1464 int64 totalTrgmCount;
1470 trgmNFA->colorTrgms = colorTrgms;
1478 foreach(cell,
state->arcs)
1507 for (
p1 = colorTrgms + 1;
p1 < colorTrgms + arcsCount;
p1++)
1519 trgmNFA->colorTrgmsCount = (
p2 - colorTrgms) + 1;
1523 trgmNFA->colorTrgmsCount = arcsCount;
1540 for (
i = 0;
i <
trgmNFA->colorTrgmsCount;
i++)
1547 for (
j = 0;
j < 3;
j++)
1555 count *=
trgmNFA->colorInfo[
c].wordCharsCount;
1558 totalTrgmCount += count;
1578 for (
i = 0;
i <
trgmNFA->colorTrgmsCount;
i++)
1588#ifdef TRGM_REGEXP_DEBUG
1589 fprintf(
stderr,
"considering ctrgm %d %d %d, penalty %f, %d arcs\n",
1609#ifdef TRGM_REGEXP_DEBUG
1610 fprintf(
stderr,
"examining arc to s%d (%x) from s%d (%x)\n",
1611 -target->snumber, target->flags,
1618 while (target->parent)
1619 target = target->parent;
1621#ifdef TRGM_REGEXP_DEBUG
1622 fprintf(
stderr,
" ... after completed merges: to s%d (%x) from s%d (%x)\n",
1623 -target->snumber, target->flags,
1629 while (
source->tentParent)
1635 while (target->tentParent)
1637 target = target->tentParent;
1641#ifdef TRGM_REGEXP_DEBUG
1642 fprintf(
stderr,
" ... after tentative merges: to s%d (%x) from s%d (%x)\n",
1658#ifdef TRGM_REGEXP_DEBUG
1660 -target->snumber, -
source->snumber);
1662 target->tentParent =
source;
1688 while (target->parent)
1689 target = target->parent;
1699 target->tentParent =
NULL;
1700 target->tentFlags = 0;
1708#ifdef TRGM_REGEXP_DEBUG
1723 while (target->parent)
1724 target = target->parent;
1727#ifdef TRGM_REGEXP_DEBUG
1729 -target->snumber, -
source->snumber);
1748 trgmNFA->totalTrgmCount = (
int) totalTrgmCount;
1757 for (
i = 0;
i <
trgmNFA->colorTrgmsCount;
i++)
1759 if (colorTrgms[
i].expanded)
1797 for (
i = 0;
i <
trgmNFA->colorTrgmsCount;
i++)
1812 for (
j = 0;
j < 3;
j++)
1821 for (i1 = 0; i1 <
c[0]->wordCharsCount; i1++)
1823 s[0] =
c[0]->wordChars[i1];
1824 for (i2 = 0; i2 <
c[1]->wordCharsCount; i2++)
1826 s[1] =
c[1]->wordChars[i2];
1827 for (
i3 = 0;
i3 <
c[2]->wordCharsCount;
i3++)
1829 s[2] =
c[2]->wordChars[
i3];
1854 for (
i = 0;
i < 3;
i++)
1856 if (s[
i].bytes[0] != 0)
1859 *p++ = s[
i].bytes[
j];
1948 while (
state->parent)
1951 if (
state->snumber < 0)
1959 state->snumber = snumber;
1977 foreach(cell,
state->arcs)
2024 arcsCount = (
p2 - arcs) + 1;
2035 for (
i = 0;
i <
trgmNFA->colorTrgmsCount;
i++)
2037 if (
trgmNFA->colorTrgms[
i].expanded)
2043 for (
i = 0;
i <
trgmNFA->colorTrgmsCount;
i++)
2045 if (
trgmNFA->colorTrgms[
i].expanded)
2059 for (
i = 0;
i < snumber;
i++)
2064 while (
j < arcsCount && arcs[
j].sourceState ==
i)
2096 if (
p1->sourceState <
p2->sourceState)
2098 if (
p1->sourceState >
p2->sourceState)
2100 if (
p1->colorTrgm <
p2->colorTrgm)
2102 if (
p1->colorTrgm >
p2->colorTrgm)
2104 if (
p1->targetState <
p2->targetState)
2106 if (
p1->targetState >
p2->targetState)
2119#ifdef TRGM_REGEXP_DEBUG
2151 for (
i = 0;
i < arcsCount;
i++)
2154 state, arcs[
i].to, arcs[
i].co);
2168 for (
i = 0;
i < ncolors;
i++)
2174 if (
color->expandable)
2176 for (
j = 0;
j <
color->wordCharsCount;
j++)
2196 FILE *fp =
fopen(
"/tmp/source.gv",
"w");
2233 foreach(cell,
state->arcs)
2238 -
state->snumber, -
arc->target->snumber);
2258 FILE *fp =
fopen(
"/tmp/transformed.gv",
"w");
2306 for (
j = 0;
j <
state->arcsCount;
j++)
2311 i,
arc->targetState,
arc->colorTrgm);
2330 for (
j = 0;
j < count;
j++)
2349 FILE *fp =
fopen(
"/tmp/packed.gv",
"w");
#define Assert(condition)
#define MemSet(start, val, len)
#define fprintf(file, fmt, msg)
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
HTAB * hash_create(const char *tabname, int64 nelem, const HASHCTL *info, int flags)
void * hash_seq_search(HASH_SEQ_STATUS *status)
int64 hash_get_num_entries(HTAB *hashp)
void hash_seq_init(HASH_SEQ_STATUS *status, HTAB *hashp)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
#define palloc_object(type)
#define palloc_array(type, count)
#define palloc0_array(type, count)
static const FormData_pg_attribute a1
static const FormData_pg_attribute a2
#define CALCGTSIZE(flag, siglen)
List * lappend(List *list, void *datum)
List * list_concat(List *list1, const List *list2)
void list_free(List *list)
int pg_wchar2mb_with_len(const pg_wchar *from, char *to, int len)
int pg_mb2wchar_with_len(const char *from, pg_wchar *to, int len)
void * MemoryContextAlloc(MemoryContext context, Size size)
void * MemoryContextAllocZero(MemoryContext context, Size size)
void pfree(void *pointer)
void * palloc0(Size size)
MemoryContext CurrentMemoryContext
void MemoryContextDelete(MemoryContext context)
#define AllocSetContextCreate
#define ALLOCSET_DEFAULT_SIZES
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
static int list_length(const List *l)
#define foreach_delete_current(lst, var_or_cell)
static rewind_source * source
static char buf[DEFAULT_XLOG_SEG_SIZE]
#define MAX_MULTIBYTE_CHAR_LEN
#define qsort(a, b, c, d)
int pg_regcomp(regex_t *re, const chr *string, size_t len, int flags, Oid collation)
size_t pg_regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)
int pg_reg_getnumoutarcs(const regex_t *regex, int st)
int pg_reg_getnumcolors(const regex_t *regex)
int pg_reg_getnumstates(const regex_t *regex)
int pg_reg_getfinalstate(const regex_t *regex)
int pg_reg_getinitialstate(const regex_t *regex)
void pg_reg_getoutarcs(const regex_t *regex, int st, regex_arc_t *arcs, int arcs_len)
int pg_reg_colorisend(const regex_t *regex, int co)
void pg_reg_getcharacters(const regex_t *regex, int co, pg_wchar *chars, int chars_len)
int pg_reg_getnumcharacters(const regex_t *regex, int co)
int pg_reg_colorisbegin(const regex_t *regex, int co)
void appendStringInfo(StringInfo str, const char *fmt,...)
void appendStringInfoString(StringInfo str, const char *s)
void appendStringInfoChar(StringInfo str, char ch)
void initStringInfo(StringInfo str)
ColorTrgmInfo * colorTrgms
TrgmColorInfo * colorInfo
bool * colorTrigramsActive
struct TrgmState * parent
struct TrgmState * tentParent
char bytes[MAX_MULTIBYTE_CHAR_LEN]
void compact_trigram(trgm *tptr, char *str, int bytelen)
static bool convertPgWchar(pg_wchar c, trgm_mb_char *result)
static bool validArcLabel(TrgmStateKey *key, TrgmColor co)
static TrgmState * getState(TrgmNFA *trgmNFA, TrgmStateKey *key)
static void getColorInfo(regex_t *regex, TrgmNFA *trgmNFA)
static TRGM * createTrgmNFAInternal(regex_t *regex, TrgmPackedGraph **graph, MemoryContext rcontext)
static void addArc(TrgmNFA *trgmNFA, TrgmState *state, TrgmStateKey *key, TrgmColor co, TrgmStateKey *destKey)
#define MAX_EXPANDED_STATES
static int colorTrgmInfoPenaltyCmp(const void *p1, const void *p2)
#define MAX_EXPANDED_ARCS
static bool selectColorTrigrams(TrgmNFA *trgmNFA)
static void fillTrgm(trgm *ptrgm, trgm_mb_char s[3])
static TRGM * expandColorTrigrams(TrgmNFA *trgmNFA, MemoryContext rcontext)
TRGM * createTrgmNFA(text *text_re, Oid collation, TrgmPackedGraph **graph, MemoryContext rcontext)
static void transformGraph(TrgmNFA *trgmNFA)
bool trigramsMatchGraph(TrgmPackedGraph *graph, bool *check)
static const float4 penalties[8]
static void addKeyToQueue(TrgmNFA *trgmNFA, TrgmStateKey *key)
static void addKey(TrgmNFA *trgmNFA, TrgmState *state, TrgmStateKey *key)
static TrgmPackedGraph * packGraph(TrgmNFA *trgmNFA, MemoryContext rcontext)
static int packArcInfoCmp(const void *a1, const void *a2)
static void processState(TrgmNFA *trgmNFA, TrgmState *state)
#define COLOR_COUNT_LIMIT
#define WISH_TRGM_PENALTY
static void mergeStates(TrgmState *state1, TrgmState *state2)
static int colorTrgmInfoCmp(const void *p1, const void *p2)
static void RE_compile(regex_t *regex, text *text_re, int cflags, Oid collation)
static void addArcs(TrgmNFA *trgmNFA, TrgmState *state)
static bool prefixContains(TrgmPrefix *prefix1, TrgmPrefix *prefix2)
static Size VARSIZE_ANY_EXHDR(const void *PTR)
static char * VARDATA_ANY(const void *PTR)
static void SET_VARSIZE(void *PTR, Size len)
static char chars[TZ_MAX_CHARS]