mirror of https://github.com/postgres/postgres
Remove option to change parser of an existing text search configuration.
This prevents needing to do complex and poorly-defined updates of the mapping table if the new parser has different token types than the old. Per discussion.
This commit is contained in:
parent
40c1d7c10e
commit
8a5592daf1
|
@ -1,5 +1,5 @@
|
|||
<!--
|
||||
$PostgreSQL: pgsql/doc/src/sgml/ref/alter_tsconfig.sgml,v 1.1 2007/08/21 21:08:47 tgl Exp $
|
||||
$PostgreSQL: pgsql/doc/src/sgml/ref/alter_tsconfig.sgml,v 1.2 2007/08/22 05:13:50 tgl Exp $
|
||||
PostgreSQL documentation
|
||||
-->
|
||||
|
||||
|
@ -20,9 +20,6 @@ PostgreSQL documentation
|
|||
|
||||
<refsynopsisdiv>
|
||||
<synopsis>
|
||||
ALTER TEXT SEARCH CONFIGURATION <replaceable>name</replaceable> (
|
||||
PARSER = <replaceable class="parameter">parser_name</replaceable>
|
||||
)
|
||||
ALTER TEXT SEARCH CONFIGURATION <replaceable>name</replaceable>
|
||||
ADD MAPPING FOR <replaceable class="parameter">token_type</replaceable> [, ... ] WITH <replaceable class="parameter">dictionary_name</replaceable> [, ... ]
|
||||
ALTER TEXT SEARCH CONFIGURATION <replaceable>name</replaceable>
|
||||
|
@ -43,8 +40,8 @@ ALTER TEXT SEARCH CONFIGURATION <replaceable>name</replaceable> OWNER TO <replac
|
|||
|
||||
<para>
|
||||
<command>ALTER TEXT SEARCH CONFIGURATION</command> changes the definition of
|
||||
a text search configuration. You can change which parser it uses, modify
|
||||
its mapping from token types to dictionaries,
|
||||
a text search configuration. You can modify
|
||||
its mappings from token types to dictionaries,
|
||||
or change the configuration's name or owner.
|
||||
</para>
|
||||
|
||||
|
@ -68,15 +65,6 @@ ALTER TEXT SEARCH CONFIGURATION <replaceable>name</replaceable> OWNER TO <replac
|
|||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><replaceable class="parameter">parser_name</replaceable></term>
|
||||
<listitem>
|
||||
<para>
|
||||
The name of a new text search parser to use for this configuration.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><replaceable class="parameter">token_type</replaceable></term>
|
||||
<listitem>
|
||||
|
@ -154,19 +142,7 @@ ALTER TEXT SEARCH CONFIGURATION <replaceable>name</replaceable> OWNER TO <replac
|
|||
</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Notes</title>
|
||||
|
||||
<para>
|
||||
While changing the text search parser used by a configuration is allowed,
|
||||
this will only work nicely if old and new parsers use the same set of
|
||||
token types. It is advisable to drop the mappings for any incompatible
|
||||
token types before changing parsers.
|
||||
</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Examples</title>
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<!--
|
||||
$PostgreSQL: pgsql/doc/src/sgml/ref/create_tsconfig.sgml,v 1.1 2007/08/21 21:08:47 tgl Exp $
|
||||
$PostgreSQL: pgsql/doc/src/sgml/ref/create_tsconfig.sgml,v 1.2 2007/08/22 05:13:50 tgl Exp $
|
||||
PostgreSQL documentation
|
||||
-->
|
||||
|
||||
|
@ -98,10 +98,9 @@ CREATE TEXT SEARCH CONFIGURATION <replaceable class="parameter">name</replaceabl
|
|||
<title>Notes</title>
|
||||
|
||||
<para>
|
||||
It is allowed to specify both <literal>PARSER</> and <literal>COPY</>,
|
||||
resulting in the specified parser being used with whatever mappings
|
||||
are in the source configuration. This is generally inadvisable,
|
||||
unless you know that both parsers involved use the same token type set.
|
||||
The <literal>PARSER</> and <literal>COPY</> options are mutually
|
||||
exclusive, because when an existing configuration is copied, its
|
||||
parser selection is copied too.
|
||||
</para>
|
||||
|
||||
</refsect1>
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/commands/tsearchcmds.c,v 1.3 2007/08/22 01:39:44 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/commands/tsearchcmds.c,v 1.4 2007/08/22 05:13:50 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -46,12 +46,10 @@
|
|||
#include "utils/syscache.h"
|
||||
|
||||
|
||||
static HeapTuple UpdateTSConfiguration(AlterTSConfigurationStmt *stmt,
|
||||
HeapTuple tup);
|
||||
static void MakeConfigurationMapping(AlterTSConfigurationStmt *stmt,
|
||||
HeapTuple tup);
|
||||
HeapTuple tup, Relation relMap);
|
||||
static void DropConfigurationMapping(AlterTSConfigurationStmt *stmt,
|
||||
HeapTuple tup);
|
||||
HeapTuple tup, Relation relMap);
|
||||
|
||||
|
||||
/* --------------------- TS Parser commands ------------------------ */
|
||||
|
@ -1265,7 +1263,6 @@ DefineTSConfiguration(List *names, List *parameters)
|
|||
Oid namespaceoid;
|
||||
char *cfgname;
|
||||
NameData cname;
|
||||
List *sourceName = NIL;
|
||||
Oid sourceOid = InvalidOid;
|
||||
Oid prsOid = InvalidOid;
|
||||
Oid cfgOid;
|
||||
|
@ -1290,7 +1287,7 @@ DefineTSConfiguration(List *names, List *parameters)
|
|||
if (pg_strcasecmp(defel->defname, "parser") == 0)
|
||||
prsOid = TSParserGetPrsid(defGetQualifiedName(defel), false);
|
||||
else if (pg_strcasecmp(defel->defname, "copy") == 0)
|
||||
sourceName = defGetQualifiedName(defel);
|
||||
sourceOid = TSConfigGetCfgid(defGetQualifiedName(defel), false);
|
||||
else
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
|
@ -1298,15 +1295,18 @@ DefineTSConfiguration(List *names, List *parameters)
|
|||
defel->defname)));
|
||||
}
|
||||
|
||||
if (OidIsValid(sourceOid) && OidIsValid(prsOid))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
errmsg("cannot specify both PARSER and COPY options")));
|
||||
|
||||
/*
|
||||
* Look up source config if given.
|
||||
*/
|
||||
if (sourceName)
|
||||
if (OidIsValid(sourceOid))
|
||||
{
|
||||
Form_pg_ts_config cfg;
|
||||
|
||||
sourceOid = TSConfigGetCfgid(sourceName, false);
|
||||
|
||||
tup = SearchSysCache(TSCONFIGOID,
|
||||
ObjectIdGetDatum(sourceOid),
|
||||
0, 0, 0);
|
||||
|
@ -1316,9 +1316,8 @@ DefineTSConfiguration(List *names, List *parameters)
|
|||
|
||||
cfg = (Form_pg_ts_config) GETSTRUCT(tup);
|
||||
|
||||
/* Use source's parser if no other was specified */
|
||||
if (!OidIsValid(prsOid))
|
||||
prsOid = cfg->cfgparser;
|
||||
/* use source's parser */
|
||||
prsOid = cfg->cfgparser;
|
||||
|
||||
ReleaseSysCache(tup);
|
||||
}
|
||||
|
@ -1626,8 +1625,7 @@ void
|
|||
AlterTSConfiguration(AlterTSConfigurationStmt *stmt)
|
||||
{
|
||||
HeapTuple tup;
|
||||
HeapTuple newtup;
|
||||
Relation mapRel;
|
||||
Relation relMap;
|
||||
|
||||
/* Find the configuration */
|
||||
tup = GetTSConfigTuple(stmt->cfgname);
|
||||
|
@ -1642,84 +1640,22 @@ AlterTSConfiguration(AlterTSConfigurationStmt *stmt)
|
|||
aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_TSCONFIGURATION,
|
||||
NameListToString(stmt->cfgname));
|
||||
|
||||
/* Update fields of config tuple? */
|
||||
if (stmt->options)
|
||||
newtup = UpdateTSConfiguration(stmt, tup);
|
||||
else
|
||||
newtup = tup;
|
||||
relMap = heap_open(TSConfigMapRelationId, RowExclusiveLock);
|
||||
|
||||
/* Add or drop mappings? */
|
||||
/* Add or drop mappings */
|
||||
if (stmt->dicts)
|
||||
MakeConfigurationMapping(stmt, newtup);
|
||||
MakeConfigurationMapping(stmt, tup, relMap);
|
||||
else if (stmt->tokentype)
|
||||
DropConfigurationMapping(stmt, newtup);
|
||||
|
||||
/*
|
||||
* Even if we aren't changing mappings, there could already be some,
|
||||
* so makeConfigurationDependencies always has to look.
|
||||
*/
|
||||
mapRel = heap_open(TSConfigMapRelationId, AccessShareLock);
|
||||
DropConfigurationMapping(stmt, tup, relMap);
|
||||
|
||||
/* Update dependencies */
|
||||
makeConfigurationDependencies(newtup, true, mapRel);
|
||||
makeConfigurationDependencies(tup, true, relMap);
|
||||
|
||||
heap_close(mapRel, AccessShareLock);
|
||||
heap_close(relMap, RowExclusiveLock);
|
||||
|
||||
ReleaseSysCache(tup);
|
||||
}
|
||||
|
||||
/*
|
||||
* ALTER TEXT SEARCH CONFIGURATION - update fields of pg_ts_config tuple
|
||||
*/
|
||||
static HeapTuple
|
||||
UpdateTSConfiguration(AlterTSConfigurationStmt *stmt, HeapTuple tup)
|
||||
{
|
||||
Relation cfgRel;
|
||||
ListCell *pl;
|
||||
Datum repl_val[Natts_pg_ts_config];
|
||||
char repl_null[Natts_pg_ts_config];
|
||||
char repl_repl[Natts_pg_ts_config];
|
||||
HeapTuple newtup;
|
||||
|
||||
memset(repl_val, 0, sizeof(repl_val));
|
||||
memset(repl_null, ' ', sizeof(repl_null));
|
||||
memset(repl_repl, ' ', sizeof(repl_repl));
|
||||
|
||||
cfgRel = heap_open(TSConfigRelationId, RowExclusiveLock);
|
||||
|
||||
foreach(pl, stmt->options)
|
||||
{
|
||||
DefElem *defel = (DefElem *) lfirst(pl);
|
||||
|
||||
if (pg_strcasecmp(defel->defname, "parser") == 0)
|
||||
{
|
||||
Oid newPrs;
|
||||
|
||||
newPrs = TSParserGetPrsid(defGetQualifiedName(defel), false);
|
||||
repl_val[Anum_pg_ts_config_cfgparser - 1] = ObjectIdGetDatum(newPrs);
|
||||
repl_repl[Anum_pg_ts_config_cfgparser - 1] = 'r';
|
||||
}
|
||||
else
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
errmsg("text search configuration parameter \"%s\" not recognized",
|
||||
defel->defname)));
|
||||
}
|
||||
|
||||
newtup = heap_modifytuple(tup, RelationGetDescr(cfgRel),
|
||||
repl_val, repl_null, repl_repl);
|
||||
|
||||
simple_heap_update(cfgRel, &newtup->t_self, newtup);
|
||||
|
||||
CatalogUpdateIndexes(cfgRel, newtup);
|
||||
|
||||
heap_close(cfgRel, RowExclusiveLock);
|
||||
|
||||
return newtup;
|
||||
}
|
||||
|
||||
/*------------------- TS Configuration mapping stuff ----------------*/
|
||||
|
||||
/*
|
||||
* Translate a list of token type names to an array of token type numbers
|
||||
*/
|
||||
|
@ -1780,10 +1716,10 @@ getTokenTypes(Oid prsId, List *tokennames)
|
|||
* ALTER TEXT SEARCH CONFIGURATION ADD/ALTER MAPPING
|
||||
*/
|
||||
static void
|
||||
MakeConfigurationMapping(AlterTSConfigurationStmt *stmt, HeapTuple tup)
|
||||
MakeConfigurationMapping(AlterTSConfigurationStmt *stmt,
|
||||
HeapTuple tup, Relation relMap)
|
||||
{
|
||||
Oid cfgId = HeapTupleGetOid(tup);
|
||||
Relation relMap;
|
||||
ScanKeyData skey[2];
|
||||
SysScanDesc scan;
|
||||
HeapTuple maptup;
|
||||
|
@ -1801,8 +1737,6 @@ MakeConfigurationMapping(AlterTSConfigurationStmt *stmt, HeapTuple tup)
|
|||
tokens = getTokenTypes(prsId, stmt->tokentype);
|
||||
ntoken = list_length(stmt->tokentype);
|
||||
|
||||
relMap = heap_open(TSConfigMapRelationId, RowExclusiveLock);
|
||||
|
||||
if (stmt->override)
|
||||
{
|
||||
/*
|
||||
|
@ -1938,18 +1872,16 @@ MakeConfigurationMapping(AlterTSConfigurationStmt *stmt, HeapTuple tup)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
heap_close(relMap, RowExclusiveLock);
|
||||
}
|
||||
|
||||
/*
|
||||
* ALTER TEXT SEARCH CONFIGURATION DROP MAPPING
|
||||
*/
|
||||
static void
|
||||
DropConfigurationMapping(AlterTSConfigurationStmt *stmt, HeapTuple tup)
|
||||
DropConfigurationMapping(AlterTSConfigurationStmt *stmt,
|
||||
HeapTuple tup, Relation relMap)
|
||||
{
|
||||
Oid cfgId = HeapTupleGetOid(tup);
|
||||
Relation relMap;
|
||||
ScanKeyData skey[2];
|
||||
SysScanDesc scan;
|
||||
HeapTuple maptup;
|
||||
|
@ -1964,8 +1896,6 @@ DropConfigurationMapping(AlterTSConfigurationStmt *stmt, HeapTuple tup)
|
|||
tokens = getTokenTypes(prsId, stmt->tokentype);
|
||||
ntoken = list_length(stmt->tokentype);
|
||||
|
||||
relMap = heap_open(TSConfigMapRelationId, RowExclusiveLock);
|
||||
|
||||
i = 0;
|
||||
foreach(c, stmt->tokentype)
|
||||
{
|
||||
|
@ -2011,8 +1941,6 @@ DropConfigurationMapping(AlterTSConfigurationStmt *stmt, HeapTuple tup)
|
|||
|
||||
i++;
|
||||
}
|
||||
|
||||
heap_close(relMap, RowExclusiveLock);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.599 2007/08/21 15:13:42 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.600 2007/08/22 05:13:50 tgl Exp $
|
||||
*
|
||||
* HISTORY
|
||||
* AUTHOR DATE MAJOR EVENT
|
||||
|
@ -5523,14 +5523,7 @@ AlterTSDictionaryStmt:
|
|||
;
|
||||
|
||||
AlterTSConfigurationStmt:
|
||||
ALTER TEXT_P SEARCH CONFIGURATION any_name definition
|
||||
{
|
||||
AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
|
||||
n->cfgname = $5;
|
||||
n->options = $6;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
| ALTER TEXT_P SEARCH CONFIGURATION any_name ADD_P MAPPING FOR name_list WITH any_name_list
|
||||
ALTER TEXT_P SEARCH CONFIGURATION any_name ADD_P MAPPING FOR name_list WITH any_name_list
|
||||
{
|
||||
AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
|
||||
n->cfgname = $5;
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
* Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.351 2007/08/21 01:11:28 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.352 2007/08/22 05:13:50 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -2054,10 +2054,8 @@ typedef struct AlterTSConfigurationStmt
|
|||
{
|
||||
NodeTag type;
|
||||
List *cfgname; /* qualified name (list of Value strings) */
|
||||
List *options; /* List of DefElem nodes */
|
||||
|
||||
/*
|
||||
* These fields are used for ADD/ALTER/DROP MAPPING variants.
|
||||
* dicts will be non-NIL if ADD/ALTER MAPPING was specified.
|
||||
* If dicts is NIL, but tokentype isn't, DROP MAPPING was specified.
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue