mirror of
https://github.com/postgres/postgres.git
synced 2025-07-27 12:41:57 +03:00
Change
typedef struct {} WordEntryPos; to typedef uint16 WordEntryPos according to http://www.pgsql.ru/db/mw/msg.html?mid=2035188 Require re-fill all tsvector fields and reindex tsvector indexes.
This commit is contained in:
@ -50,9 +50,9 @@ Datum tsvector_length(PG_FUNCTION_ARGS);
|
||||
static int
|
||||
comparePos(const void *a, const void *b)
|
||||
{
|
||||
if (((WordEntryPos *) a)->pos == ((WordEntryPos *) b)->pos)
|
||||
if (WEP_GETPOS(*(WordEntryPos *) a) == WEP_GETPOS(*(WordEntryPos *) b))
|
||||
return 1;
|
||||
return (((WordEntryPos *) a)->pos > ((WordEntryPos *) b)->pos) ? 1 : -1;
|
||||
return (WEP_GETPOS(*(WordEntryPos *) a)> WEP_GETPOS(*(WordEntryPos *) b)) ? 1 : -1;
|
||||
}
|
||||
|
||||
static int
|
||||
@ -70,16 +70,15 @@ uniquePos(WordEntryPos * a, int4 l)
|
||||
ptr = a + 1;
|
||||
while (ptr - a < l)
|
||||
{
|
||||
if (ptr->pos != res->pos)
|
||||
if (WEP_GETPOS(*ptr) != WEP_GETPOS(*res))
|
||||
{
|
||||
res++;
|
||||
res->pos = ptr->pos;
|
||||
res->weight = ptr->weight;
|
||||
if (res - a >= MAXNUMPOS - 1 || res->pos == MAXENTRYPOS - 1)
|
||||
*res = *ptr;
|
||||
if (res - a >= MAXNUMPOS - 1 || WEP_GETPOS(*res) == MAXENTRYPOS - 1)
|
||||
break;
|
||||
}
|
||||
else if (ptr->weight > res->weight)
|
||||
res->weight = ptr->weight;
|
||||
else if (WEP_GETWEIGHT(*ptr) > WEP_GETWEIGHT(*res))
|
||||
WEP_SETWEIGHT(*res, WEP_GETWEIGHT(*ptr));
|
||||
ptr++;
|
||||
}
|
||||
return res + 1 - a;
|
||||
@ -324,12 +323,12 @@ gettoken_tsvector(TI_IN_STATE * state)
|
||||
state->pos = (WordEntryPos *) repalloc(state->pos, sizeof(WordEntryPos) * state->alen);
|
||||
}
|
||||
(*(uint16 *) (state->pos))++;
|
||||
state->pos[*(uint16 *) (state->pos)].pos = LIMITPOS(atoi(state->prsbuf));
|
||||
if (state->pos[*(uint16 *) (state->pos)].pos == 0)
|
||||
WEP_SETPOS(state->pos[*(uint16 *) (state->pos)], LIMITPOS(atoi(state->prsbuf)));
|
||||
if (WEP_GETPOS(state->pos[*(uint16 *) (state->pos)]) == 0)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
errmsg("wrong position info")));
|
||||
state->pos[*(uint16 *) (state->pos)].weight = 0;
|
||||
WEP_SETWEIGHT( state->pos[*(uint16 *) (state->pos)], 0 );
|
||||
state->state = WAITPOSDELIM;
|
||||
}
|
||||
else
|
||||
@ -343,35 +342,35 @@ gettoken_tsvector(TI_IN_STATE * state)
|
||||
state->state = INPOSINFO;
|
||||
else if (tolower(*(state->prsbuf)) == 'a' || *(state->prsbuf) == '*')
|
||||
{
|
||||
if (state->pos[*(uint16 *) (state->pos)].weight)
|
||||
if ( WEP_GETWEIGHT(state->pos[*(uint16 *) (state->pos)]) )
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
errmsg("syntax error")));
|
||||
state->pos[*(uint16 *) (state->pos)].weight = 3;
|
||||
WEP_SETWEIGHT( state->pos[*(uint16 *) (state->pos)], 3 );
|
||||
}
|
||||
else if (tolower(*(state->prsbuf)) == 'b')
|
||||
{
|
||||
if (state->pos[*(uint16 *) (state->pos)].weight)
|
||||
if ( WEP_GETWEIGHT(state->pos[*(uint16 *) (state->pos)]) )
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
errmsg("syntax error")));
|
||||
state->pos[*(uint16 *) (state->pos)].weight = 2;
|
||||
WEP_SETWEIGHT( state->pos[*(uint16 *) (state->pos)], 2 );
|
||||
}
|
||||
else if (tolower(*(state->prsbuf)) == 'c')
|
||||
{
|
||||
if (state->pos[*(uint16 *) (state->pos)].weight)
|
||||
if ( WEP_GETWEIGHT(state->pos[*(uint16 *) (state->pos)]) )
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
errmsg("syntax error")));
|
||||
state->pos[*(uint16 *) (state->pos)].weight = 1;
|
||||
WEP_SETWEIGHT( state->pos[*(uint16 *) (state->pos)], 1 );
|
||||
}
|
||||
else if (tolower(*(state->prsbuf)) == 'd')
|
||||
{
|
||||
if (state->pos[*(uint16 *) (state->pos)].weight)
|
||||
if ( WEP_GETWEIGHT(state->pos[*(uint16 *) (state->pos)]) )
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
errmsg("syntax error")));
|
||||
state->pos[*(uint16 *) (state->pos)].weight = 0;
|
||||
WEP_SETWEIGHT( state->pos[*(uint16 *) (state->pos)], 0 );
|
||||
}
|
||||
else if (isspace((unsigned char) *(state->prsbuf)) ||
|
||||
*(state->prsbuf) == '\0')
|
||||
@ -540,9 +539,9 @@ tsvector_out(PG_FUNCTION_ARGS)
|
||||
wptr = POSDATAPTR(out, ptr);
|
||||
while (pp)
|
||||
{
|
||||
sprintf(curout, "%d", wptr->pos);
|
||||
sprintf(curout, "%d", WEP_GETPOS(*wptr));
|
||||
curout = strchr(curout, '\0');
|
||||
switch (wptr->weight)
|
||||
switch (WEP_GETWEIGHT(*wptr))
|
||||
{
|
||||
case 3:
|
||||
*curout++ = 'A';
|
||||
@ -704,8 +703,8 @@ makevalue(PRSTEXT * prs)
|
||||
wptr = POSDATAPTR(in, ptr);
|
||||
for (j = 0; j < *(uint16 *) cur; j++)
|
||||
{
|
||||
wptr[j].weight = 0;
|
||||
wptr[j].pos = prs->words[i].pos.apos[j + 1];
|
||||
WEP_SETWEIGHT(wptr[j], 0);
|
||||
WEP_SETPOS(wptr[j], prs->words[i].pos.apos[j + 1]);
|
||||
}
|
||||
cur += sizeof(uint16) + prs->words[i].pos.apos[0] * sizeof(WordEntryPos);
|
||||
pfree(prs->words[i].pos.apos);
|
||||
|
Reference in New Issue
Block a user