- Rename TSParserGetPrsid to get_ts_parser_oid.
- Rename TSDictionaryGetDictid to get_ts_dict_oid.
- Rename TSTemplateGetTmplid to get_ts_template_oid.
- Rename TSConfigGetCfgid to get_ts_config_oid.
- Rename FindConversionByName to get_conversion_oid.
- Rename GetConstraintName to get_constraint_oid.
- Add new functions get_opclass_oid, get_opfamily_oid, get_rewrite_oid,
get_rewrite_oid_without_relid, get_trigger_oid, and get_cast_oid.
The name of each function matches the corresponding catalog.
Thanks to KaiGai Kohei for the review.
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/contrib/tsearch2/tsearch2.c,v 1.12 2010/02/08 20:39:51 tgl Exp $
+ * $PostgreSQL: pgsql/contrib/tsearch2/tsearch2.c,v 1.13 2010/08/05 15:25:35 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
text *name = PG_GETARG_TEXT_PP(0);
Oid dict_oid;
- dict_oid = TSDictionaryGetDictid(stringToQualifiedNameList(text_to_cstring(name)), false);
+ dict_oid = get_ts_dict_oid(stringToQualifiedNameList(text_to_cstring(name)), false);
current_dictionary_oid = dict_oid;
text *name = PG_GETARG_TEXT_PP(0);
Oid parser_oid;
- parser_oid = TSParserGetPrsid(stringToQualifiedNameList(text_to_cstring(name)), false);
+ parser_oid = get_ts_parser_oid(stringToQualifiedNameList(text_to_cstring(name)), false);
current_parser_oid = parser_oid;
GetCurrentParser(void)
{
if (current_parser_oid == InvalidOid)
- current_parser_oid = TSParserGetPrsid(stringToQualifiedNameList("pg_catalog.default"), false);
+ current_parser_oid = get_ts_parser_oid(stringToQualifiedNameList("pg_catalog.default"), false);
return current_parser_oid;
}
* Copyright (c) 2009-2010, PostgreSQL Global Development Group
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/contrib/unaccent/unaccent.c,v 1.5 2010/02/26 02:00:32 momjian Exp $
+ * $PostgreSQL: pgsql/contrib/unaccent/unaccent.c,v 1.6 2010/08/05 15:25:35 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
if (PG_NARGS() == 1)
{
- dictOid = TSDictionaryGetDictid(stringToQualifiedNameList("unaccent"), false);
+ dictOid = get_ts_dict_oid(stringToQualifiedNameList("unaccent"), false);
strArg = 0;
}
else
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/catalog/namespace.c,v 1.126 2010/08/05 14:44:58 rhaas Exp $
+ * $PostgreSQL: pgsql/src/backend/catalog/namespace.c,v 1.127 2010/08/05 15:25:35 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
}
/*
- * TSParserGetPrsid - find a TS parser by possibly qualified name
+ * get_ts_parser_oid - find a TS parser by possibly qualified name
*
- * If not found, returns InvalidOid if failOK, else throws error
+ * If not found, returns InvalidOid if missing_ok, else throws error
*/
Oid
-TSParserGetPrsid(List *names, bool failOK)
+get_ts_parser_oid(List *names, bool missing_ok)
{
char *schemaname;
char *parser_name;
}
}
- if (!OidIsValid(prsoid) && !failOK)
+ if (!OidIsValid(prsoid) && !missing_ok)
ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_OBJECT),
errmsg("text search parser \"%s\" does not exist",
}
/*
- * TSDictionaryGetDictid - find a TS dictionary by possibly qualified name
+ * get_ts_dict_oid - find a TS dictionary by possibly qualified name
*
* If not found, returns InvalidOid if failOK, else throws error
*/
Oid
-TSDictionaryGetDictid(List *names, bool failOK)
+get_ts_dict_oid(List *names, bool missing_ok)
{
char *schemaname;
char *dict_name;
}
}
- if (!OidIsValid(dictoid) && !failOK)
+ if (!OidIsValid(dictoid) && !missing_ok)
ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_OBJECT),
errmsg("text search dictionary \"%s\" does not exist",
}
/*
- * TSTemplateGetTmplid - find a TS template by possibly qualified name
+ * get_ts_template_oid - find a TS template by possibly qualified name
*
- * If not found, returns InvalidOid if failOK, else throws error
+ * If not found, returns InvalidOid if missing_ok, else throws error
*/
Oid
-TSTemplateGetTmplid(List *names, bool failOK)
+get_ts_template_oid(List *names, bool missing_ok)
{
char *schemaname;
char *template_name;
}
}
- if (!OidIsValid(tmploid) && !failOK)
+ if (!OidIsValid(tmploid) && !missing_ok)
ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_OBJECT),
errmsg("text search template \"%s\" does not exist",
}
/*
- * TSConfigGetCfgid - find a TS config by possibly qualified name
+ * get_ts_config_oid - find a TS config by possibly qualified name
*
- * If not found, returns InvalidOid if failOK, else throws error
+ * If not found, returns InvalidOid if missing_ok, else throws error
*/
Oid
-TSConfigGetCfgid(List *names, bool failOK)
+get_ts_config_oid(List *names, bool missing_ok)
{
char *schemaname;
char *config_name;
}
}
- if (!OidIsValid(cfgoid) && !failOK)
+ if (!OidIsValid(cfgoid) && !missing_ok)
ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_OBJECT),
errmsg("text search configuration \"%s\" does not exist",
/*
- * FindConversionByName - find a conversion by possibly qualified name
+ * get_conversion_oid - find a conversion by possibly qualified name
*/
Oid
-FindConversionByName(List *name)
+get_conversion_oid(List *name, bool missing_ok)
{
char *schemaname;
char *conversion_name;
Oid namespaceId;
- Oid conoid;
+ Oid conoid = InvalidOid;
ListCell *l;
/* deconstruct the name list */
{
/* use exact schema given */
namespaceId = LookupExplicitNamespace(schemaname);
- return GetSysCacheOid2(CONNAMENSP,
- PointerGetDatum(conversion_name),
- ObjectIdGetDatum(namespaceId));
+ conoid = GetSysCacheOid2(CONNAMENSP,
+ PointerGetDatum(conversion_name),
+ ObjectIdGetDatum(namespaceId));
}
else
{
}
/* Not found in path */
- return InvalidOid;
+ if (!OidIsValid(conoid) && !missing_ok)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("conversion \"%s\" does not exist",
+ NameListToString(name))));
+ return conoid;
}
/*
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/catalog/pg_constraint.c,v 1.53 2010/02/26 02:00:37 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/catalog/pg_constraint.c,v 1.54 2010/08/05 15:25:35 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
}
/*
- * GetConstraintByName
+ * get_constraint_oid
* Find a constraint on the specified relation with the specified name.
* Returns constraint's OID.
*/
Oid
-GetConstraintByName(Oid relid, const char *conname)
+get_constraint_oid(Oid relid, const char *conname, bool missing_ok)
{
Relation pg_constraint;
HeapTuple tuple;
systable_endscan(scan);
/* If no such constraint exists, complain */
- if (!OidIsValid(conOid))
+ if (!OidIsValid(conOid) && !missing_ok)
ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_OBJECT),
errmsg("constraint \"%s\" for table \"%s\" does not exist",
* Copyright (c) 1996-2010, PostgreSQL Global Development Group
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/comment.c,v 1.116 2010/08/05 14:44:58 rhaas Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/comment.c,v 1.117 2010/08/05 15:25:35 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
#include "commands/defrem.h"
#include "commands/proclang.h"
#include "commands/tablespace.h"
+#include "commands/trigger.h"
#include "libpq/be-fsstubs.h"
#include "miscadmin.h"
#include "nodes/makefuncs.h"
#include "parser/parse_func.h"
#include "parser/parse_oper.h"
#include "parser/parse_type.h"
+#include "rewrite/rewriteSupport.h"
#include "utils/acl.h"
#include "utils/builtins.h"
#include "utils/fmgroids.h"
char *rulename;
RangeVar *rel;
Relation relation;
- HeapTuple tuple;
Oid reloid;
Oid ruleoid;
nnames = list_length(qualname);
if (nnames == 1)
{
- /* Old-style: only a rule name is given */
- Relation RewriteRelation;
- HeapScanDesc scanDesc;
- ScanKeyData scanKeyData;
-
rulename = strVal(linitial(qualname));
-
- /* Search pg_rewrite for such a rule */
- ScanKeyInit(&scanKeyData,
- Anum_pg_rewrite_rulename,
- BTEqualStrategyNumber, F_NAMEEQ,
- PointerGetDatum(rulename));
-
- RewriteRelation = heap_open(RewriteRelationId, AccessShareLock);
- scanDesc = heap_beginscan(RewriteRelation, SnapshotNow,
- 1, &scanKeyData);
-
- tuple = heap_getnext(scanDesc, ForwardScanDirection);
- if (HeapTupleIsValid(tuple))
- {
- reloid = ((Form_pg_rewrite) GETSTRUCT(tuple))->ev_class;
- ruleoid = HeapTupleGetOid(tuple);
- }
- else
- {
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("rule \"%s\" does not exist", rulename)));
- reloid = ruleoid = 0; /* keep compiler quiet */
- }
-
- if (HeapTupleIsValid(tuple = heap_getnext(scanDesc,
- ForwardScanDirection)))
- ereport(ERROR,
- (errcode(ERRCODE_DUPLICATE_OBJECT),
- errmsg("there are multiple rules named \"%s\"", rulename),
- errhint("Specify a relation name as well as a rule name.")));
-
- heap_endscan(scanDesc);
- heap_close(RewriteRelation, AccessShareLock);
+ ruleoid = get_rewrite_oid_without_relid(rulename, &reloid);
/* Open the owning relation to ensure it won't go away meanwhile */
relation = heap_open(reloid, AccessShareLock);
reloid = RelationGetRelid(relation);
/* Find the rule's pg_rewrite tuple, get its OID */
- tuple = SearchSysCache2(RULERELNAME,
- ObjectIdGetDatum(reloid),
- PointerGetDatum(rulename));
- if (!HeapTupleIsValid(tuple))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("rule \"%s\" for relation \"%s\" does not exist",
- rulename, RelationGetRelationName(relation))));
- Assert(reloid == ((Form_pg_rewrite) GETSTRUCT(tuple))->ev_class);
- ruleoid = HeapTupleGetOid(tuple);
- ReleaseSysCache(tuple);
+ ruleoid = get_rewrite_oid(reloid, rulename, false);
}
/* Check object security */
List *relname;
char *trigname;
RangeVar *rel;
- Relation pg_trigger,
- relation;
- HeapTuple triggertuple;
- SysScanDesc scan;
- ScanKeyData entry[2];
+ Relation relation;
Oid oid;
/* Separate relname and trig name */
relation = heap_openrv(rel, AccessShareLock);
/* Check object security */
-
if (!pg_class_ownercheck(RelationGetRelid(relation), GetUserId()))
aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_CLASS,
RelationGetRelationName(relation));
- /*
- * Fetch the trigger tuple from pg_trigger. There can be only one because
- * of the unique index.
- */
- pg_trigger = heap_open(TriggerRelationId, AccessShareLock);
- ScanKeyInit(&entry[0],
- Anum_pg_trigger_tgrelid,
- BTEqualStrategyNumber, F_OIDEQ,
- ObjectIdGetDatum(RelationGetRelid(relation)));
- ScanKeyInit(&entry[1],
- Anum_pg_trigger_tgname,
- BTEqualStrategyNumber, F_NAMEEQ,
- CStringGetDatum(trigname));
- scan = systable_beginscan(pg_trigger, TriggerRelidNameIndexId, true,
- SnapshotNow, 2, entry);
- triggertuple = systable_getnext(scan);
-
- /* If no trigger exists for the relation specified, notify user */
-
- if (!HeapTupleIsValid(triggertuple))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("trigger \"%s\" for table \"%s\" does not exist",
- trigname, RelationGetRelationName(relation))));
-
- oid = HeapTupleGetOid(triggertuple);
-
- systable_endscan(scan);
+ oid = get_trigger_oid(RelationGetRelid(relation), trigname, false);
/* Call CreateComments() to create/drop the comments */
CreateComments(oid, TriggerRelationId, 0, comment);
/* Done, but hold lock on relation */
-
- heap_close(pg_trigger, AccessShareLock);
heap_close(relation, NoLock);
}
aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_CLASS,
RelationGetRelationName(relation));
- conOid = GetConstraintByName(RelationGetRelid(relation), conName);
+ conOid = get_constraint_oid(RelationGetRelid(relation), conName, false);
/* Call CreateComments() to create/drop the comments */
CreateComments(conOid, ConstraintRelationId, 0, comment);
{
Oid conversionOid;
- conversionOid = FindConversionByName(qualname);
- if (!OidIsValid(conversionOid))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("conversion \"%s\" does not exist",
- NameListToString(qualname))));
+ conversionOid = get_conversion_oid(qualname, false);
/* Check object security */
if (!pg_conversion_ownercheck(conversionOid, GetUserId()))
CommentOpClass(List *qualname, List *arguments, char *comment)
{
char *amname;
- char *schemaname;
- char *opcname;
Oid amID;
Oid opcID;
- HeapTuple tuple;
Assert(list_length(arguments) == 1);
amname = strVal(linitial(arguments));
/*
- * Get the access method's OID.
+ * Get the operator class OID.
*/
amID = get_am_oid(amname, false);
-
- /*
- * Look up the opclass.
- */
-
- /* deconstruct the name list */
- DeconstructQualifiedName(qualname, &schemaname, &opcname);
-
- if (schemaname)
- {
- /* Look in specific schema only */
- Oid namespaceId;
-
- namespaceId = LookupExplicitNamespace(schemaname);
- tuple = SearchSysCache3(CLAAMNAMENSP,
- ObjectIdGetDatum(amID),
- PointerGetDatum(opcname),
- ObjectIdGetDatum(namespaceId));
- }
- else
- {
- /* Unqualified opclass name, so search the search path */
- opcID = OpclassnameGetOpcid(amID, opcname);
- if (!OidIsValid(opcID))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("operator class \"%s\" does not exist for access method \"%s\"",
- opcname, amname)));
- tuple = SearchSysCache1(CLAOID, ObjectIdGetDatum(opcID));
- }
-
- if (!HeapTupleIsValid(tuple))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("operator class \"%s\" does not exist for access method \"%s\"",
- NameListToString(qualname), amname)));
-
- opcID = HeapTupleGetOid(tuple);
+ opcID = get_opclass_oid(amID, qualname, false);
/* Permission check: must own opclass */
if (!pg_opclass_ownercheck(opcID, GetUserId()))
aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_OPCLASS,
NameListToString(qualname));
- ReleaseSysCache(tuple);
-
/* Call CreateComments() to create/drop the comments */
CreateComments(opcID, OperatorClassRelationId, 0, comment);
}
CommentOpFamily(List *qualname, List *arguments, char *comment)
{
char *amname;
- char *schemaname;
- char *opfname;
Oid amID;
Oid opfID;
- HeapTuple tuple;
Assert(list_length(arguments) == 1);
amname = strVal(linitial(arguments));
- /*
- * Get the access method's OID.
- */
+ /* Get the opfamily OID. */
amID = get_am_oid(amname, false);
-
- /*
- * Look up the opfamily.
- */
-
- /* deconstruct the name list */
- DeconstructQualifiedName(qualname, &schemaname, &opfname);
-
- if (schemaname)
- {
- /* Look in specific schema only */
- Oid namespaceId;
-
- namespaceId = LookupExplicitNamespace(schemaname);
- tuple = SearchSysCache3(OPFAMILYAMNAMENSP,
- ObjectIdGetDatum(amID),
- PointerGetDatum(opfname),
- ObjectIdGetDatum(namespaceId));
- }
- else
- {
- /* Unqualified opfamily name, so search the search path */
- opfID = OpfamilynameGetOpfid(amID, opfname);
- if (!OidIsValid(opfID))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("operator family \"%s\" does not exist for access method \"%s\"",
- opfname, amname)));
- tuple = SearchSysCache1(OPFAMILYOID, ObjectIdGetDatum(opfID));
- }
-
- if (!HeapTupleIsValid(tuple))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("operator family \"%s\" does not exist for access method \"%s\"",
- NameListToString(qualname), amname)));
-
- opfID = HeapTupleGetOid(tuple);
+ opfID = get_opfamily_oid(amID, qualname, false);
/* Permission check: must own opfamily */
if (!pg_opfamily_ownercheck(opfID, GetUserId()))
aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_OPFAMILY,
NameListToString(qualname));
- ReleaseSysCache(tuple);
-
/* Call CreateComments() to create/drop the comments */
CreateComments(opfID, OperatorFamilyRelationId, 0, comment);
}
TypeName *targettype;
Oid sourcetypeid;
Oid targettypeid;
- HeapTuple tuple;
Oid castOid;
Assert(list_length(qualname) == 1);
sourcetypeid = typenameTypeId(NULL, sourcetype, NULL);
targettypeid = typenameTypeId(NULL, targettype, NULL);
- tuple = SearchSysCache2(CASTSOURCETARGET,
- ObjectIdGetDatum(sourcetypeid),
- ObjectIdGetDatum(targettypeid));
- if (!HeapTupleIsValid(tuple))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("cast from type %s to type %s does not exist",
- format_type_be(sourcetypeid),
- format_type_be(targettypeid))));
-
/* Get the OID of the cast */
- castOid = HeapTupleGetOid(tuple);
+ castOid = get_cast_oid(sourcetypeid, targettypeid, false);
/* Permission check */
if (!pg_type_ownercheck(sourcetypeid, GetUserId())
format_type_be(sourcetypeid),
format_type_be(targettypeid))));
- ReleaseSysCache(tuple);
-
/* Call CreateComments() to create/drop the comments */
CreateComments(castOid, CastRelationId, 0, comment);
}
{
Oid prsId;
- prsId = TSParserGetPrsid(qualname, false);
+ prsId = get_ts_parser_oid(qualname, false);
if (!superuser())
ereport(ERROR,
{
Oid dictId;
- dictId = TSDictionaryGetDictid(qualname, false);
+ dictId = get_ts_dict_oid(qualname, false);
if (!pg_ts_dict_ownercheck(dictId, GetUserId()))
aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_TSDICTIONARY,
{
Oid tmplId;
- tmplId = TSTemplateGetTmplid(qualname, false);
+ tmplId = get_ts_template_oid(qualname, false);
if (!superuser())
ereport(ERROR,
{
Oid cfgId;
- cfgId = TSConfigGetCfgid(qualname, false);
+ cfgId = get_ts_config_oid(qualname, false);
if (!pg_ts_config_ownercheck(cfgId, GetUserId()))
aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_TSCONFIGURATION,
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/conversioncmds.c,v 1.41 2010/02/14 18:42:14 rhaas Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/conversioncmds.c,v 1.42 2010/08/05 15:25:35 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
Form_pg_conversion con;
ObjectAddress object;
- conversionOid = FindConversionByName(name);
+ conversionOid = get_conversion_oid(name, drop->missing_ok);
if (!OidIsValid(conversionOid))
{
- if (!drop->missing_ok)
- {
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("conversion \"%s\" does not exist",
- NameListToString(name))));
- }
- else
- {
- ereport(NOTICE,
- (errmsg("conversion \"%s\" does not exist, skipping",
- NameListToString(name))));
- }
+ ereport(NOTICE,
+ (errmsg("conversion \"%s\" does not exist, skipping",
+ NameListToString(name))));
continue;
}
rel = heap_open(ConversionRelationId, RowExclusiveLock);
- conversionOid = FindConversionByName(name);
- if (!OidIsValid(conversionOid))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("conversion \"%s\" does not exist",
- NameListToString(name))));
+ conversionOid = get_conversion_oid(name, false);
tup = SearchSysCacheCopy1(CONVOID, ObjectIdGetDatum(conversionOid));
if (!HeapTupleIsValid(tup)) /* should not happen */
rel = heap_open(ConversionRelationId, RowExclusiveLock);
- conversionOid = FindConversionByName(name);
- if (!OidIsValid(conversionOid))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("conversion \"%s\" does not exist",
- NameListToString(name))));
+ conversionOid = get_conversion_oid(name, false);
AlterConversionOwner_internal(rel, conversionOid, newOwnerId);
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/functioncmds.c,v 1.118 2010/02/26 02:00:39 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/functioncmds.c,v 1.119 2010/08/05 15:25:35 rhaas Exp $
*
* DESCRIPTION
* These routines take the parse tree and pick out the
{
Oid sourcetypeid;
Oid targettypeid;
- HeapTuple tuple;
ObjectAddress object;
/* when dropping a cast, the types must exist even if you use IF EXISTS */
sourcetypeid = typenameTypeId(NULL, stmt->sourcetype, NULL);
targettypeid = typenameTypeId(NULL, stmt->targettype, NULL);
- tuple = SearchSysCache2(CASTSOURCETARGET,
- ObjectIdGetDatum(sourcetypeid),
- ObjectIdGetDatum(targettypeid));
- if (!HeapTupleIsValid(tuple))
+ object.classId = CastRelationId;
+ object.objectId = get_cast_oid(sourcetypeid, targettypeid,
+ stmt->missing_ok);
+ object.objectSubId = 0;
+
+ if (!OidIsValid(object.objectId))
{
- if (!stmt->missing_ok)
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("cast from type %s to type %s does not exist",
- format_type_be(sourcetypeid),
- format_type_be(targettypeid))));
- else
- ereport(NOTICE,
+ ereport(NOTICE,
(errmsg("cast from type %s to type %s does not exist, skipping",
format_type_be(sourcetypeid),
format_type_be(targettypeid))));
-
return;
}
/*
* Do the deletion
*/
- object.classId = CastRelationId;
- object.objectId = HeapTupleGetOid(tuple);
- object.objectSubId = 0;
-
- ReleaseSysCache(tuple);
-
performDeletion(&object, stmt->behavior);
}
+/*
+ * get_cast_oid - given two type OIDs, look up a cast OID
+ *
+ * If missing_ok is false, throw an error if the cast is not found. If
+ * true, just return InvalidOid.
+ */
+Oid
+get_cast_oid(Oid sourcetypeid, Oid targettypeid, bool missing_ok)
+{
+ Oid oid;
+
+ oid = GetSysCacheOid2(CASTSOURCETARGET,
+ ObjectIdGetDatum(sourcetypeid),
+ ObjectIdGetDatum(targettypeid));
+ if (!OidIsValid(oid) && !missing_ok)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("cast from type %s to type %s does not exist",
+ format_type_be(sourcetypeid),
+ format_type_be(targettypeid))));
+ return oid;
+}
void
DropCastById(Oid castOid)
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/opclasscmds.c,v 1.70 2010/08/05 14:45:01 rhaas Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/opclasscmds.c,v 1.71 2010/08/05 15:25:35 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
* Returns a syscache tuple reference, or NULL if not found.
*/
static HeapTuple
-OpFamilyCacheLookup(Oid amID, List *opfamilyname)
+OpFamilyCacheLookup(Oid amID, List *opfamilyname, bool missing_ok)
{
char *schemaname;
char *opfname;
+ HeapTuple htup;
/* deconstruct the name list */
DeconstructQualifiedName(opfamilyname, &schemaname, &opfname);
Oid namespaceId;
namespaceId = LookupExplicitNamespace(schemaname);
- return SearchSysCache3(OPFAMILYAMNAMENSP,
+ htup = SearchSysCache3(OPFAMILYAMNAMENSP,
ObjectIdGetDatum(amID),
PointerGetDatum(opfname),
ObjectIdGetDatum(namespaceId));
Oid opfID = OpfamilynameGetOpfid(amID, opfname);
if (!OidIsValid(opfID))
- return NULL;
- return SearchSysCache1(OPFAMILYOID, ObjectIdGetDatum(opfID));
+ htup = NULL;
+ else
+ htup = SearchSysCache1(OPFAMILYOID, ObjectIdGetDatum(opfID));
+ }
+
+ if (!HeapTupleIsValid(htup) && !missing_ok)
+ {
+ HeapTuple amtup;
+
+ amtup = SearchSysCache1(AMOID, ObjectIdGetDatum(amID));
+ if (!HeapTupleIsValid(amtup))
+ elog(ERROR, "cache lookup failed for access method %u", amID);
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("operator family \"%s\" does not exist for access method \"%s\"",
+ NameListToString(opfamilyname),
+ NameStr(((Form_pg_am) GETSTRUCT(amtup))->amname))));
}
+
+ return htup;
+}
+
+/*
+ * get_opfamily_oid
+ * find an opfamily OID by possibly qualified name
+ *
+ * If not found, returns InvalidOid if missing_ok, else throws error.
+ */
+Oid
+get_opfamily_oid(Oid amID, List *opfamilyname, bool missing_ok)
+{
+ HeapTuple htup;
+ Oid opfID;
+
+ htup = OpFamilyCacheLookup(amID, opfamilyname, missing_ok);
+ if (!HeapTupleIsValid(htup))
+ return InvalidOid;
+ opfID = HeapTupleGetOid(htup);
+ ReleaseSysCache(htup);
+
+ return opfID;
}
/*
* Returns a syscache tuple reference, or NULL if not found.
*/
static HeapTuple
-OpClassCacheLookup(Oid amID, List *opclassname)
+OpClassCacheLookup(Oid amID, List *opclassname, bool missing_ok)
{
char *schemaname;
char *opcname;
+ HeapTuple htup;
/* deconstruct the name list */
DeconstructQualifiedName(opclassname, &schemaname, &opcname);
Oid namespaceId;
namespaceId = LookupExplicitNamespace(schemaname);
- return SearchSysCache3(CLAAMNAMENSP,
+ htup = SearchSysCache3(CLAAMNAMENSP,
ObjectIdGetDatum(amID),
PointerGetDatum(opcname),
ObjectIdGetDatum(namespaceId));
Oid opcID = OpclassnameGetOpcid(amID, opcname);
if (!OidIsValid(opcID))
- return NULL;
- return SearchSysCache1(CLAOID, ObjectIdGetDatum(opcID));
+ htup = NULL;
+ else
+ htup = SearchSysCache1(CLAOID, ObjectIdGetDatum(opcID));
+ }
+
+ if (!HeapTupleIsValid(htup) && !missing_ok)
+ {
+ HeapTuple amtup;
+
+ amtup = SearchSysCache1(AMOID, ObjectIdGetDatum(amID));
+ if (!HeapTupleIsValid(amtup))
+ elog(ERROR, "cache lookup failed for access method %u", amID);
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("operator class \"%s\" does not exist for access method \"%s\"",
+ NameListToString(opclassname),
+ NameStr(((Form_pg_am) GETSTRUCT(amtup))->amname))));
}
+
+ return htup;
+}
+
+/*
+ * get_opclass_oid
+ * find an opclass OID by possibly qualified name
+ *
+ * If not found, returns InvalidOid if missing_ok, else throws error.
+ */
+Oid
+get_opclass_oid(Oid amID, List *opclassname, bool missing_ok)
+{
+ HeapTuple htup;
+ Oid opcID;
+
+ htup = OpClassCacheLookup(amID, opclassname, missing_ok);
+ if (!HeapTupleIsValid(htup))
+ return InvalidOid;
+ opcID = HeapTupleGetOid(htup);
+ ReleaseSysCache(htup);
+
+ return opcID;
}
/*
*/
if (stmt->opfamilyname)
{
- tup = OpFamilyCacheLookup(amoid, stmt->opfamilyname);
- if (!HeapTupleIsValid(tup))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("operator family \"%s\" does not exist for access method \"%s\"",
- NameListToString(stmt->opfamilyname), stmt->amname)));
- opfamilyoid = HeapTupleGetOid(tup);
-
- /*
- * XXX given the superuser check above, there's no need for an
- * ownership check here
- */
- ReleaseSysCache(tup);
+ opfamilyoid = get_opfamily_oid(amoid, stmt->opfamilyname, false);
}
else
{
ReleaseSysCache(tup);
/* Look up the opfamily */
- tup = OpFamilyCacheLookup(amoid, stmt->opfamilyname);
- if (!HeapTupleIsValid(tup))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("operator family \"%s\" does not exist for access method \"%s\"",
- NameListToString(stmt->opfamilyname), stmt->amname)));
- opfamilyoid = HeapTupleGetOid(tup);
- ReleaseSysCache(tup);
+ opfamilyoid = get_opfamily_oid(amoid, stmt->opfamilyname, false);
/*
* Currently, we require superuser privileges to alter an opfamily.
HeapTuple tuple;
ObjectAddress object;
- /*
- * Get the access method's OID.
- */
+ /* Get the access method's OID. */
amID = get_am_oid(stmt->amname, false);
- /*
- * Look up the opclass.
- */
- tuple = OpClassCacheLookup(amID, stmt->opclassname);
+ /* Look up the opclass. */
+ tuple = OpClassCacheLookup(amID, stmt->opclassname, stmt->missing_ok);
if (!HeapTupleIsValid(tuple))
{
- if (!stmt->missing_ok)
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("operator class \"%s\" does not exist for access method \"%s\"",
- NameListToString(stmt->opclassname), stmt->amname)));
- else
- ereport(NOTICE,
- (errmsg("operator class \"%s\" does not exist for access method \"%s\"",
- NameListToString(stmt->opclassname), stmt->amname)));
+ ereport(NOTICE,
+ (errmsg("operator class \"%s\" does not exist for access method \"%s\"",
+ NameListToString(stmt->opclassname), stmt->amname)));
return;
}
/*
* Look up the opfamily.
*/
- tuple = OpFamilyCacheLookup(amID, stmt->opfamilyname);
+ tuple = OpFamilyCacheLookup(amID, stmt->opfamilyname, stmt->missing_ok);
if (!HeapTupleIsValid(tuple))
{
- if (!stmt->missing_ok)
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("operator family \"%s\" does not exist for access method \"%s\"",
- NameListToString(stmt->opfamilyname), stmt->amname)));
- else
- ereport(NOTICE,
- (errmsg("operator family \"%s\" does not exist for access method \"%s\"",
- NameListToString(stmt->opfamilyname), stmt->amname)));
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("operator family \"%s\" does not exist for access method \"%s\"",
+ NameListToString(stmt->opfamilyname), stmt->amname)));
return;
}
Oid opcOid;
Oid amOid;
Oid namespaceOid;
- char *schemaname;
- char *opcname;
+ HeapTuple origtup;
HeapTuple tup;
Relation rel;
AclResult aclresult;
rel = heap_open(OperatorClassRelationId, RowExclusiveLock);
- /*
- * Look up the opclass
- */
- DeconstructQualifiedName(name, &schemaname, &opcname);
-
- if (schemaname)
- {
- namespaceOid = LookupExplicitNamespace(schemaname);
-
- tup = SearchSysCacheCopy3(CLAAMNAMENSP,
- ObjectIdGetDatum(amOid),
- PointerGetDatum(opcname),
- ObjectIdGetDatum(namespaceOid));
- if (!HeapTupleIsValid(tup))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("operator class \"%s\" does not exist for access method \"%s\"",
- opcname, access_method)));
-
- opcOid = HeapTupleGetOid(tup);
- }
- else
- {
- opcOid = OpclassnameGetOpcid(amOid, opcname);
- if (!OidIsValid(opcOid))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("operator class \"%s\" does not exist for access method \"%s\"",
- opcname, access_method)));
-
- tup = SearchSysCacheCopy1(CLAOID, ObjectIdGetDatum(opcOid));
- if (!HeapTupleIsValid(tup)) /* should not happen */
- elog(ERROR, "cache lookup failed for opclass %u", opcOid);
-
- namespaceOid = ((Form_pg_opclass) GETSTRUCT(tup))->opcnamespace;
- }
+ /* Look up the opclass. */
+ origtup = OpClassCacheLookup(amOid, name, false);
+ tup = heap_copytuple(origtup);
+ ReleaseSysCache(origtup);
+ opcOid = HeapTupleGetOid(tup);
+ namespaceOid = ((Form_pg_opclass) GETSTRUCT(tup))->opcnamespace;
/* make sure the new name doesn't exist */
if (SearchSysCacheExists3(CLAAMNAMENSP,
Oid amOid;
Relation rel;
HeapTuple tup;
- char *opcname;
- char *schemaname;
+ HeapTuple origtup;
amOid = get_am_oid(access_method, false);
rel = heap_open(OperatorClassRelationId, RowExclusiveLock);
- /*
- * Look up the opclass
- */
- DeconstructQualifiedName(name, &schemaname, &opcname);
-
- if (schemaname)
- {
- Oid namespaceOid;
-
- namespaceOid = LookupExplicitNamespace(schemaname);
-
- tup = SearchSysCacheCopy3(CLAAMNAMENSP,
- ObjectIdGetDatum(amOid),
- PointerGetDatum(opcname),
- ObjectIdGetDatum(namespaceOid));
- if (!HeapTupleIsValid(tup))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("operator class \"%s\" does not exist for access method \"%s\"",
- opcname, access_method)));
- }
- else
- {
- Oid opcOid;
-
- opcOid = OpclassnameGetOpcid(amOid, opcname);
- if (!OidIsValid(opcOid))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("operator class \"%s\" does not exist for access method \"%s\"",
- opcname, access_method)));
-
- tup = SearchSysCacheCopy1(CLAOID, ObjectIdGetDatum(opcOid));
- if (!HeapTupleIsValid(tup)) /* should not happen */
- elog(ERROR, "cache lookup failed for opclass %u", opcOid);
- }
+ /* Look up the opclass. */
+ origtup = OpClassCacheLookup(amOid, name, false);
+ tup = heap_copytuple(origtup);
+ ReleaseSysCache(origtup);
AlterOpClassOwner_internal(rel, tup, newOwnerId);
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.263 2010/07/28 05:22:24 sriggs Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.264 2010/08/05 15:25:35 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
DropTrigger(Oid relid, const char *trigname, DropBehavior behavior,
bool missing_ok)
{
- Relation tgrel;
- ScanKeyData skey[2];
- SysScanDesc tgscan;
- HeapTuple tup;
ObjectAddress object;
- /*
- * Find the trigger, verify permissions, set up object address
- */
- tgrel = heap_open(TriggerRelationId, AccessShareLock);
-
- ScanKeyInit(&skey[0],
- Anum_pg_trigger_tgrelid,
- BTEqualStrategyNumber, F_OIDEQ,
- ObjectIdGetDatum(relid));
-
- ScanKeyInit(&skey[1],
- Anum_pg_trigger_tgname,
- BTEqualStrategyNumber, F_NAMEEQ,
- CStringGetDatum(trigname));
-
- tgscan = systable_beginscan(tgrel, TriggerRelidNameIndexId, true,
- SnapshotNow, 2, skey);
-
- tup = systable_getnext(tgscan);
+ object.classId = TriggerRelationId;
+ object.objectId = get_trigger_oid(relid, trigname, missing_ok);
+ object.objectSubId = 0;
- if (!HeapTupleIsValid(tup))
+ if (!OidIsValid(object.objectId))
{
- if (!missing_ok)
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("trigger \"%s\" for table \"%s\" does not exist",
- trigname, get_rel_name(relid))));
- else
- ereport(NOTICE,
- (errmsg("trigger \"%s\" for table \"%s\" does not exist, skipping",
- trigname, get_rel_name(relid))));
- /* cleanup */
- systable_endscan(tgscan);
- heap_close(tgrel, AccessShareLock);
+ ereport(NOTICE,
+ (errmsg("trigger \"%s\" for table \"%s\" does not exist, skipping",
+ trigname, get_rel_name(relid))));
return;
}
aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_CLASS,
get_rel_name(relid));
- object.classId = TriggerRelationId;
- object.objectId = HeapTupleGetOid(tup);
- object.objectSubId = 0;
-
- systable_endscan(tgscan);
- heap_close(tgrel, AccessShareLock);
-
/*
* Do the deletion
*/
heap_close(rel, NoLock);
}
+/*
+ * get_trigger_oid - Look up a trigger by name to find its OID.
+ *
+ * If missing_ok is false, throw an error if trigger not found. If
+ * true, just return InvalidOid.
+ */
+Oid
+get_trigger_oid(Oid relid, const char *trigname, bool missing_ok)
+{
+ Relation tgrel;
+ ScanKeyData skey[2];
+ SysScanDesc tgscan;
+ HeapTuple tup;
+ Oid oid;
+
+ /*
+ * Find the trigger, verify permissions, set up object address
+ */
+ tgrel = heap_open(TriggerRelationId, AccessShareLock);
+
+ ScanKeyInit(&skey[0],
+ Anum_pg_trigger_tgrelid,
+ BTEqualStrategyNumber, F_OIDEQ,
+ ObjectIdGetDatum(relid));
+ ScanKeyInit(&skey[1],
+ Anum_pg_trigger_tgname,
+ BTEqualStrategyNumber, F_NAMEEQ,
+ CStringGetDatum(trigname));
+
+ tgscan = systable_beginscan(tgrel, TriggerRelidNameIndexId, true,
+ SnapshotNow, 2, skey);
+
+ tup = systable_getnext(tgscan);
+
+ if (!HeapTupleIsValid(tup))
+ {
+ if (!missing_ok)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("trigger \"%s\" for table \"%s\" does not exist",
+ trigname, get_rel_name(relid))));
+ oid = InvalidOid;
+ }
+ else
+ {
+ oid = HeapTupleGetOid(tup);
+ }
+
+ systable_endscan(tgscan);
+ heap_close(tgrel, AccessShareLock);
+ return oid;
+}
+
/*
* renametrig - changes the name of a trigger on a relation
*
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/tsearchcmds.c,v 1.20 2010/02/14 18:42:14 rhaas Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/tsearchcmds.c,v 1.21 2010/08/05 15:25:35 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
Oid prsOid;
ObjectAddress object;
- prsOid = TSParserGetPrsid(names, true);
+ prsOid = get_ts_parser_oid(names, true);
if (!OidIsValid(prsOid))
{
rel = heap_open(TSParserRelationId, RowExclusiveLock);
- prsId = TSParserGetPrsid(oldname, false);
+ prsId = get_ts_parser_oid(oldname, false);
tup = SearchSysCacheCopy1(TSPARSEROID, ObjectIdGetDatum(prsId));
if (pg_strcasecmp(defel->defname, "template") == 0)
{
- templId = TSTemplateGetTmplid(defGetQualifiedName(defel), false);
+ templId = get_ts_template_oid(defGetQualifiedName(defel), false);
}
else
{
rel = heap_open(TSDictionaryRelationId, RowExclusiveLock);
- dictId = TSDictionaryGetDictid(oldname, false);
+ dictId = get_ts_dict_oid(oldname, false);
tup = SearchSysCacheCopy1(TSDICTOID, ObjectIdGetDatum(dictId));
HeapTuple tup;
Oid namespaceId;
- dictOid = TSDictionaryGetDictid(names, true);
+ dictOid = get_ts_dict_oid(names, true);
if (!OidIsValid(dictOid))
{
bool repl_null[Natts_pg_ts_dict];
bool repl_repl[Natts_pg_ts_dict];
- dictId = TSDictionaryGetDictid(stmt->dictname, false);
+ dictId = get_ts_dict_oid(stmt->dictname, false);
rel = heap_open(TSDictionaryRelationId, RowExclusiveLock);
rel = heap_open(TSDictionaryRelationId, RowExclusiveLock);
- dictId = TSDictionaryGetDictid(name, false);
+ dictId = get_ts_dict_oid(name, false);
tup = SearchSysCacheCopy1(TSDICTOID, ObjectIdGetDatum(dictId));
rel = heap_open(TSTemplateRelationId, RowExclusiveLock);
- tmplId = TSTemplateGetTmplid(oldname, false);
+ tmplId = get_ts_template_oid(oldname, false);
tup = SearchSysCacheCopy1(TSTEMPLATEOID, ObjectIdGetDatum(tmplId));
Oid tmplOid;
ObjectAddress object;
- tmplOid = TSTemplateGetTmplid(names, true);
+ tmplOid = get_ts_template_oid(names, true);
if (!OidIsValid(tmplOid))
{
HeapTuple tup;
Oid cfgId;
- cfgId = TSConfigGetCfgid(names, true);
+ cfgId = get_ts_config_oid(names, true);
if (!OidIsValid(cfgId))
return NULL;
DefElem *defel = (DefElem *) lfirst(pl);
if (pg_strcasecmp(defel->defname, "parser") == 0)
- prsOid = TSParserGetPrsid(defGetQualifiedName(defel), false);
+ prsOid = get_ts_parser_oid(defGetQualifiedName(defel), false);
else if (pg_strcasecmp(defel->defname, "copy") == 0)
- sourceOid = TSConfigGetCfgid(defGetQualifiedName(defel), false);
+ sourceOid = get_ts_config_oid(defGetQualifiedName(defel), false);
else
ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR),
rel = heap_open(TSConfigRelationId, RowExclusiveLock);
- cfgId = TSConfigGetCfgid(oldname, false);
+ cfgId = get_ts_config_oid(oldname, false);
tup = SearchSysCacheCopy1(TSCONFIGOID, ObjectIdGetDatum(cfgId));
rel = heap_open(TSConfigRelationId, RowExclusiveLock);
- cfgId = TSConfigGetCfgid(name, false);
+ cfgId = get_ts_config_oid(name, false);
tup = SearchSysCacheCopy1(TSCONFIGOID, ObjectIdGetDatum(cfgId));
{
List *names = (List *) lfirst(c);
- dictIds[i] = TSDictionaryGetDictid(names, false);
+ dictIds[i] = get_ts_dict_oid(names, false);
i++;
}
* Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/backend/parser/parse_utilcmd.c,v 2.41 2010/07/28 05:22:24 sriggs Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/parse_utilcmd.c,v 2.42 2010/08/05 15:25:35 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
/* Copy comment on constraint */
if ((inhRelation->options & CREATE_TABLE_LIKE_COMMENTS) &&
- (comment = GetComment(GetConstraintByName(RelationGetRelid(relation),
- n->conname),
+ (comment = GetComment(get_constraint_oid(RelationGetRelid(relation),
+ n->conname, false),
ConstraintRelationId,
0)) != NULL)
{
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/rewrite/rewriteSupport.c,v 1.69 2010/02/14 18:42:15 rhaas Exp $
+ * $PostgreSQL: pgsql/src/backend/rewrite/rewriteSupport.c,v 1.70 2010/08/05 15:25:35 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
#include "access/heapam.h"
#include "catalog/indexing.h"
#include "catalog/pg_class.h"
+#include "catalog/pg_rewrite.h"
#include "rewrite/rewriteSupport.h"
+#include "utils/fmgroids.h"
#include "utils/inval.h"
+#include "utils/lsyscache.h"
+#include "utils/rel.h"
#include "utils/syscache.h"
+#include "utils/tqual.h"
/*
heap_freetuple(tuple);
heap_close(relationRelation, RowExclusiveLock);
}
+
+/*
+ * Find rule oid.
+ *
+ * If missing_ok is false, throw an error if rule name not found. If
+ * true, just return InvalidOid.
+ */
+Oid
+get_rewrite_oid(Oid relid, const char *rulename, bool missing_ok)
+{
+ HeapTuple tuple;
+ Oid ruleoid;
+
+ /* Find the rule's pg_rewrite tuple, get its OID */
+ tuple = SearchSysCache2(RULERELNAME,
+ ObjectIdGetDatum(relid),
+ PointerGetDatum(rulename));
+ if (!HeapTupleIsValid(tuple))
+ {
+ if (missing_ok)
+ return InvalidOid;
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("rule \"%s\" for relation \"%s\" does not exist",
+ rulename, get_rel_name(relid))));
+ }
+ Assert(relid == ((Form_pg_rewrite) GETSTRUCT(tuple))->ev_class);
+ ruleoid = HeapTupleGetOid(tuple);
+ ReleaseSysCache(tuple);
+ return ruleoid;
+}
+
+/*
+ * Find rule oid, given only a rule name but no rel OID.
+ *
+ * If there's more than one, it's an error. If there aren't any, that's an
+ * error, too. In general, this should be avoided - it is provided to support
+ * syntax that is compatible with pre-7.3 versions of PG, where rule names
+ * were unique across the entire database.
+ */
+Oid
+get_rewrite_oid_without_relid(const char *rulename, Oid *reloid)
+{
+ Relation RewriteRelation;
+ HeapScanDesc scanDesc;
+ ScanKeyData scanKeyData;
+ HeapTuple htup;
+ Oid ruleoid;
+
+ /* Search pg_rewrite for such a rule */
+ ScanKeyInit(&scanKeyData,
+ Anum_pg_rewrite_rulename,
+ BTEqualStrategyNumber, F_NAMEEQ,
+ CStringGetDatum(rulename));
+
+ RewriteRelation = heap_open(RewriteRelationId, AccessShareLock);
+ scanDesc = heap_beginscan(RewriteRelation, SnapshotNow, 1, &scanKeyData);
+
+ htup = heap_getnext(scanDesc, ForwardScanDirection);
+ if (!HeapTupleIsValid(htup))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("rule \"%s\" does not exist", rulename)));
+
+ ruleoid = HeapTupleGetOid(htup);
+ if (reloid != NULL)
+ *reloid = ((Form_pg_rewrite) GETSTRUCT(htup))->ev_class;
+
+ if (HeapTupleIsValid(htup = heap_getnext(scanDesc, ForwardScanDirection)))
+ ereport(ERROR,
+ (errcode(ERRCODE_DUPLICATE_OBJECT),
+ errmsg("there are multiple rules named \"%s\"", rulename),
+ errhint("Specify a relation name as well as a rule name.")));
+
+ heap_endscan(scanDesc);
+ heap_close(RewriteRelation, AccessShareLock);
+
+ return ruleoid;
+}
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/tsearch/dict_thesaurus.c,v 1.16 2010/01/02 16:57:53 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/tsearch/dict_thesaurus.c,v 1.17 2010/08/05 15:25:35 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("missing Dictionary parameter")));
- d->subdictOid = TSDictionaryGetDictid(stringToQualifiedNameList(subdictname), false);
+ d->subdictOid = get_ts_dict_oid(stringToQualifiedNameList(subdictname), false);
d->subdict = lookup_ts_dictionary_cache(d->subdictOid);
compileTheLexeme(d);
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/tsearch/wparser.c,v 1.12 2010/01/02 16:57:53 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/tsearch/wparser.c,v 1.13 2010/08/05 15:25:35 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
Oid prsId;
funcctx = SRF_FIRSTCALL_INIT();
- prsId = TSParserGetPrsid(textToQualifiedNameList(prsname), false);
+ prsId = get_ts_parser_oid(textToQualifiedNameList(prsname), false);
tt_setup_firstcall(funcctx, prsId);
}
Oid prsId;
funcctx = SRF_FIRSTCALL_INIT();
- prsId = TSParserGetPrsid(textToQualifiedNameList(prsname), false);
+ prsId = get_ts_parser_oid(textToQualifiedNameList(prsname), false);
prs_setup_firstcall(funcctx, prsId, txt);
}
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/regproc.c,v 1.113 2010/02/14 18:42:16 rhaas Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/regproc.c,v 1.114 2010/08/05 15:25:35 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
*/
names = stringToQualifiedNameList(cfg_name_or_oid);
- result = TSConfigGetCfgid(names, false);
+ result = get_ts_config_oid(names, false);
PG_RETURN_OID(result);
}
*/
names = stringToQualifiedNameList(dict_name_or_oid);
- result = TSDictionaryGetDictid(names, false);
+ result = get_ts_dict_oid(names, false);
PG_RETURN_OID(result);
}
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/tsvector_op.c,v 1.26 2010/01/02 16:57:55 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/tsvector_op.c,v 1.27 2010/08/05 15:25:35 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("text search configuration name \"%s\" must be schema-qualified",
trigger->tgargs[1])));
- cfgId = TSConfigGetCfgid(names, false);
+ cfgId = get_ts_config_oid(names, false);
}
/* initialize parse state */
* Copyright (c) 2006-2010, PostgreSQL Global Development Group
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/cache/ts_cache.c,v 1.12 2010/02/14 18:42:17 rhaas Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/cache/ts_cache.c,v 1.13 2010/08/05 15:25:35 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
/* Look up the config */
TSCurrentConfigCache =
- TSConfigGetCfgid(stringToQualifiedNameList(TSCurrentConfig),
+ get_ts_config_oid(stringToQualifiedNameList(TSCurrentConfig),
!emitError);
return TSCurrentConfigCache;
Form_pg_ts_config cfg;
char *buf;
- cfgId = TSConfigGetCfgid(stringToQualifiedNameList(newval), true);
+ cfgId = get_ts_config_oid(stringToQualifiedNameList(newval), true);
if (!OidIsValid(cfgId))
return NULL;
* Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/include/catalog/namespace.h,v 1.63 2010/08/05 14:45:06 rhaas Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/namespace.h,v 1.64 2010/08/05 15:25:36 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
extern Oid ConversionGetConid(const char *conname);
extern bool ConversionIsVisible(Oid conid);
-extern Oid TSParserGetPrsid(List *names, bool failOK);
+extern Oid get_ts_parser_oid(List *names, bool missing_ok);
extern bool TSParserIsVisible(Oid prsId);
-extern Oid TSDictionaryGetDictid(List *names, bool failOK);
+extern Oid get_ts_dict_oid(List *names, bool missing_ok);
extern bool TSDictionaryIsVisible(Oid dictId);
-extern Oid TSTemplateGetTmplid(List *names, bool failOK);
+extern Oid get_ts_template_oid(List *names, bool missing_ok);
extern bool TSTemplateIsVisible(Oid tmplId);
-extern Oid TSConfigGetCfgid(List *names, bool failOK);
+extern Oid get_ts_config_oid(List *names, bool missing_ok);
extern bool TSConfigIsVisible(Oid cfgid);
extern void DeconstructQualifiedName(List *names,
extern void PushOverrideSearchPath(OverrideSearchPath *newpath);
extern void PopOverrideSearchPath(void);
-extern Oid FindConversionByName(List *conname);
+extern Oid get_conversion_oid(List *conname, bool missing_ok);
extern Oid FindDefaultConversionProc(int4 for_encoding, int4 to_encoding);
/* initialization & transaction cleanup code */
* Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/include/catalog/pg_constraint.h,v 1.39 2010/03/11 03:36:22 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_constraint.h,v 1.40 2010/08/05 15:25:36 rhaas Exp $
*
* NOTES
* the genbki.pl script reads this file and generates .bki
extern void AlterConstraintNamespaces(Oid ownerId, Oid oldNspId,
Oid newNspId, bool isType);
-extern Oid GetConstraintByName(Oid relid, const char *conname);
+extern Oid get_constraint_oid(Oid relid, const char *conname, bool missing_ok);
#endif /* PG_CONSTRAINT_H */
* Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/include/commands/defrem.h,v 1.103 2010/08/05 14:45:07 rhaas Exp $
+ * $PostgreSQL: pgsql/src/include/commands/defrem.h,v 1.104 2010/08/05 15:25:36 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
extern void AlterFunctionNamespace(List *name, List *argtypes, bool isagg,
const char *newschema);
extern void ExecuteDoStmt(DoStmt *stmt);
+extern Oid get_cast_oid(Oid sourcetypeid, Oid targettypeid, bool missing_ok);
/* commands/operatorcmds.c */
extern void DefineOperator(List *names, List *parameters);
extern void AlterOperatorOwner(List *name, TypeName *typeName1,
TypeName *typename2, Oid newOwnerId);
extern void AlterOperatorOwner_oid(Oid operOid, Oid newOwnerId);
+extern Oid get_opclass_oid(Oid amID, List *opclassname, bool missing_ok);
+extern Oid get_opfamily_oid(Oid amID, List *opfamilyname, bool missing_ok);
/* commands/aggregatecmds.c */
extern void DefineAggregate(List *name, List *args, bool oldstyle,
* Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/include/commands/trigger.h,v 1.80 2010/01/17 22:56:23 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/commands/trigger.h,v 1.81 2010/08/05 15:25:36 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
extern void DropTrigger(Oid relid, const char *trigname,
DropBehavior behavior, bool missing_ok);
extern void RemoveTriggerById(Oid trigOid);
+extern Oid get_trigger_oid(Oid relid, const char *name, bool missing_ok);
extern void renametrig(Oid relid, const char *oldname, const char *newname);
* Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/include/rewrite/rewriteSupport.h,v 1.32 2010/01/02 16:58:08 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/rewrite/rewriteSupport.h,v 1.33 2010/08/05 15:25:36 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
extern void SetRelationRuleStatus(Oid relationId, bool relHasRules,
bool relIsBecomingView);
+extern Oid get_rewrite_oid(Oid relid, const char *rulename, bool missing_ok);
+extern Oid get_rewrite_oid_without_relid(const char *rulename, Oid *relid);
+
#endif /* REWRITESUPPORT_H */