Introduce filtering dictionary support to tsearch. Propagate --nolocale option

to CREATE DATABASE command in pg_regress to allow correct checking of
locale-sensitive contrib modules.
This commit is contained in:
Teodor Sigaev 2009-08-18 10:30:41 +00:00
parent 77dfb64df4
commit a88a48011c
3 changed files with 19 additions and 8 deletions

View File

@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/tsearch/ts_parse.c,v 1.13 2009/07/16 06:33:44 petere Exp $ * $PostgreSQL: pgsql/src/backend/tsearch/ts_parse.c,v 1.14 2009/08/18 10:30:41 teodor Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -29,7 +29,6 @@ typedef struct ParsedLex
int type; int type;
char *lemm; char *lemm;
int lenlemm; int lenlemm;
bool resfollow;
struct ParsedLex *next; struct ParsedLex *next;
} ParsedLex; } ParsedLex;
@ -189,6 +188,8 @@ LexizeExec(LexizeData *ld, ParsedLex **correspondLexem)
while (ld->towork.head) while (ld->towork.head)
{ {
ParsedLex *curVal = ld->towork.head; ParsedLex *curVal = ld->towork.head;
char *curValLemm = curVal->lemm;
int curValLenLemm = curVal->lenlemm;
map = ld->cfg->map + curVal->type; map = ld->cfg->map + curVal->type;
@ -208,8 +209,8 @@ LexizeExec(LexizeData *ld, ParsedLex **correspondLexem)
res = (TSLexeme *) DatumGetPointer(FunctionCall4( res = (TSLexeme *) DatumGetPointer(FunctionCall4(
&(dict->lexize), &(dict->lexize),
PointerGetDatum(dict->dictData), PointerGetDatum(dict->dictData),
PointerGetDatum(curVal->lemm), PointerGetDatum(curValLemm),
Int32GetDatum(curVal->lenlemm), Int32GetDatum(curValLenLemm),
PointerGetDatum(&ld->dictState) PointerGetDatum(&ld->dictState)
)); ));
@ -231,6 +232,13 @@ LexizeExec(LexizeData *ld, ParsedLex **correspondLexem)
if (!res) /* dictionary doesn't know this lexeme */ if (!res) /* dictionary doesn't know this lexeme */
continue; continue;
if ( res->flags & TSL_FILTER )
{
curValLemm = res->lexeme;
curValLenLemm = strlen(res->lexeme);
continue;
}
RemoveHead(ld); RemoveHead(ld);
setCorrLex(ld, correspondLexem); setCorrLex(ld, correspondLexem);
return res; return res;

View File

@ -6,7 +6,7 @@
* *
* Copyright (c) 1998-2009, PostgreSQL Global Development Group * Copyright (c) 1998-2009, PostgreSQL Global Development Group
* *
* $PostgreSQL: pgsql/src/include/tsearch/ts_public.h,v 1.15 2009/07/16 06:33:45 petere Exp $ * $PostgreSQL: pgsql/src/include/tsearch/ts_public.h,v 1.16 2009/08/18 10:30:41 teodor Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -101,6 +101,7 @@ typedef struct
#define TSL_ADDPOS 0x01 #define TSL_ADDPOS 0x01
#define TSL_PREFIX 0x02 #define TSL_PREFIX 0x02
#define TSL_FILTER 0x04
/* /*
* Struct for supporting complex dictionaries like thesaurus. * Struct for supporting complex dictionaries like thesaurus.

View File

@ -11,7 +11,7 @@
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/test/regress/pg_regress.c,v 1.63 2009/06/11 14:49:15 momjian Exp $ * $PostgreSQL: pgsql/src/test/regress/pg_regress.c,v 1.64 2009/08/18 10:30:41 teodor Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -1767,9 +1767,11 @@ create_database(const char *dbname)
*/ */
header(_("creating database \"%s\""), dbname); header(_("creating database \"%s\""), dbname);
if (encoding) if (encoding)
psql_command("postgres", "CREATE DATABASE \"%s\" TEMPLATE=template0 ENCODING='%s'", dbname, encoding); psql_command("postgres", "CREATE DATABASE \"%s\" TEMPLATE=template0 ENCODING='%s'%s", dbname, encoding,
(nolocale) ? " LC_COLLATE='C' LC_CTYPE='C'" : "");
else else
psql_command("postgres", "CREATE DATABASE \"%s\" TEMPLATE=template0", dbname); psql_command("postgres", "CREATE DATABASE \"%s\" TEMPLATE=template0%s", dbname,
(nolocale) ? " LC_COLLATE='C' LC_CTYPE='C'" : "");
psql_command(dbname, psql_command(dbname,
"ALTER DATABASE \"%s\" SET lc_messages TO 'C';" "ALTER DATABASE \"%s\" SET lc_messages TO 'C';"
"ALTER DATABASE \"%s\" SET lc_monetary TO 'C';" "ALTER DATABASE \"%s\" SET lc_monetary TO 'C';"