1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-08 11:42:09 +03:00

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:
Tom Lane
2007-08-22 05:13:50 +00:00
parent 40c1d7c10e
commit 8a5592daf1
5 changed files with 33 additions and 139 deletions

View File

@ -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);
}