There is support for COMMENT ON RULE <name> without specifying a table name, for upgrading from pre-7.3 instances. I think it might be time for that workaround to go.
Patch attached. -- Peter Eisentraut http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
From d15411c389659ac789199e46edaa2de43768e600 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut <pete...@gmx.net> Date: Wed, 22 Feb 2017 08:45:14 -0500 Subject: [PATCH] Remove deprecated COMMENT ON RULE syntax This was only used for allowing upgrades from pre-7.3 instances, which was a long time ago. --- src/backend/catalog/objectaddress.c | 126 ++++++++------------- src/backend/parser/gram.y | 10 -- src/backend/rewrite/rewriteSupport.c | 55 --------- src/include/rewrite/rewriteSupport.h | 2 - .../test_ddl_deparse/expected/comment_on.out | 2 +- .../modules/test_ddl_deparse/sql/comment_on.sql | 2 +- src/test/regress/expected/object_address.out | 4 +- 7 files changed, 53 insertions(+), 148 deletions(-) diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c index 9029477d68..cc636e2e3e 100644 --- a/src/backend/catalog/objectaddress.c +++ b/src/backend/catalog/objectaddress.c @@ -1325,6 +1325,8 @@ get_object_address_relobject(ObjectType objtype, List *objname, Relation relation = NULL; int nnames; const char *depname; + List *relname; + Oid reloid; /* Extract name of dependent object. */ depname = strVal(llast(objname)); @@ -1332,88 +1334,58 @@ get_object_address_relobject(ObjectType objtype, List *objname, /* Separate relation name from dependent object name. */ nnames = list_length(objname); if (nnames < 2) - { - Oid reloid; - - /* - * For compatibility with very old releases, we sometimes allow users - * to attempt to specify a rule without mentioning the relation name. - * If there's only rule by that name in the entire database, this will - * work. But objects other than rules don't get this special - * treatment. - */ - if (objtype != OBJECT_RULE) - elog(ERROR, "must specify relation and object name"); - address.classId = RewriteRelationId; - address.objectId = - get_rewrite_oid_without_relid(depname, &reloid, missing_ok); - address.objectSubId = 0; - - /* - * Caller is expecting to get back the relation, even though we didn't - * end up using it to find the rule. - */ - if (OidIsValid(address.objectId)) - relation = heap_open(reloid, AccessShareLock); - } - else - { - List *relname; - Oid reloid; + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("must specify relation and object name"))); - /* Extract relation name and open relation. */ - relname = list_truncate(list_copy(objname), nnames - 1); - relation = heap_openrv_extended(makeRangeVarFromNameList(relname), - AccessShareLock, - missing_ok); + /* Extract relation name and open relation. */ + relname = list_truncate(list_copy(objname), nnames - 1); + relation = heap_openrv_extended(makeRangeVarFromNameList(relname), + AccessShareLock, + missing_ok); - reloid = relation ? RelationGetRelid(relation) : InvalidOid; + reloid = relation ? RelationGetRelid(relation) : InvalidOid; - switch (objtype) - { - case OBJECT_RULE: - address.classId = RewriteRelationId; - address.objectId = relation ? - get_rewrite_oid(reloid, depname, missing_ok) : InvalidOid; - address.objectSubId = 0; - break; - case OBJECT_TRIGGER: - address.classId = TriggerRelationId; - address.objectId = relation ? - get_trigger_oid(reloid, depname, missing_ok) : InvalidOid; - address.objectSubId = 0; - break; - case OBJECT_TABCONSTRAINT: - address.classId = ConstraintRelationId; - address.objectId = relation ? - get_relation_constraint_oid(reloid, depname, missing_ok) : - InvalidOid; - address.objectSubId = 0; - break; - case OBJECT_POLICY: - address.classId = PolicyRelationId; - address.objectId = relation ? - get_relation_policy_oid(reloid, depname, missing_ok) : - InvalidOid; - address.objectSubId = 0; - break; - default: - elog(ERROR, "unrecognized objtype: %d", (int) objtype); - /* placate compiler, which doesn't know elog won't return */ - address.classId = InvalidOid; - address.objectId = InvalidOid; - address.objectSubId = 0; - } + switch (objtype) + { + case OBJECT_RULE: + address.classId = RewriteRelationId; + address.objectId = relation ? + get_rewrite_oid(reloid, depname, missing_ok) : InvalidOid; + address.objectSubId = 0; + break; + case OBJECT_TRIGGER: + address.classId = TriggerRelationId; + address.objectId = relation ? + get_trigger_oid(reloid, depname, missing_ok) : InvalidOid; + address.objectSubId = 0; + break; + case OBJECT_TABCONSTRAINT: + address.classId = ConstraintRelationId; + address.objectId = relation ? + get_relation_constraint_oid(reloid, depname, missing_ok) : + InvalidOid; + address.objectSubId = 0; + break; + case OBJECT_POLICY: + address.classId = PolicyRelationId; + address.objectId = relation ? + get_relation_policy_oid(reloid, depname, missing_ok) : + InvalidOid; + address.objectSubId = 0; + break; + default: + elog(ERROR, "unrecognized objtype: %d", (int) objtype); + } - /* Avoid relcache leak when object not found. */ - if (!OidIsValid(address.objectId)) - { - if (relation != NULL) - heap_close(relation, AccessShareLock); + /* Avoid relcache leak when object not found. */ + if (!OidIsValid(address.objectId)) + { + if (relation != NULL) + heap_close(relation, AccessShareLock); - relation = NULL; /* department of accident prevention */ - return address; - } + relation = NULL; /* department of accident prevention */ + return address; } /* Done. */ diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 6c6d21b588..e833b2eba5 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -6283,16 +6283,6 @@ CommentStmt: n->comment = $8; $$ = (Node *) n; } - | COMMENT ON RULE name IS comment_text - { - /* Obsolete syntax supported for awhile for compatibility */ - CommentStmt *n = makeNode(CommentStmt); - n->objtype = OBJECT_RULE; - n->objname = list_make1(makeString($4)); - n->objargs = NIL; - n->comment = $6; - $$ = (Node *) n; - } | COMMENT ON TRANSFORM FOR Typename LANGUAGE name IS comment_text { CommentStmt *n = makeNode(CommentStmt); diff --git a/src/backend/rewrite/rewriteSupport.c b/src/backend/rewrite/rewriteSupport.c index c4d05d26d4..ce9c8e3793 100644 --- a/src/backend/rewrite/rewriteSupport.c +++ b/src/backend/rewrite/rewriteSupport.c @@ -114,58 +114,3 @@ get_rewrite_oid(Oid relid, const char *rulename, bool missing_ok) 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, bool missing_ok) -{ - 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_catalog(RewriteRelation, 1, &scanKeyData); - - htup = heap_getnext(scanDesc, ForwardScanDirection); - if (!HeapTupleIsValid(htup)) - { - if (!missing_ok) - ereport(ERROR, - (errcode(ERRCODE_UNDEFINED_OBJECT), - errmsg("rule \"%s\" does not exist", rulename))); - ruleoid = InvalidOid; - } - else - { - ruleoid = HeapTupleGetOid(htup); - if (reloid != NULL) - *reloid = ((Form_pg_rewrite) GETSTRUCT(htup))->ev_class; - - htup = heap_getnext(scanDesc, ForwardScanDirection); - if (HeapTupleIsValid(htup)) - 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; -} diff --git a/src/include/rewrite/rewriteSupport.h b/src/include/rewrite/rewriteSupport.h index 36e5296295..d287bbda78 100644 --- a/src/include/rewrite/rewriteSupport.h +++ b/src/include/rewrite/rewriteSupport.h @@ -22,7 +22,5 @@ extern bool IsDefinedRewriteRule(Oid owningRel, const char *ruleName); extern void SetRelationRuleStatus(Oid relationId, bool relHasRules); 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, bool missing_ok); #endif /* REWRITESUPPORT_H */ diff --git a/src/test/modules/test_ddl_deparse/expected/comment_on.out b/src/test/modules/test_ddl_deparse/expected/comment_on.out index 8ce01e0f74..129eff99c5 100644 --- a/src/test/modules/test_ddl_deparse/expected/comment_on.out +++ b/src/test/modules/test_ddl_deparse/expected/comment_on.out @@ -19,5 +19,5 @@ COMMENT ON FUNCTION c_function_test() IS 'FUNCTION test'; ERROR: function c_function_test() does not exist COMMENT ON TRIGGER trigger_1 ON datatype_table IS 'TRIGGER test'; NOTICE: DDL test: type simple, tag COMMENT -COMMENT ON RULE rule_1 IS 'RULE test'; +COMMENT ON RULE rule_1 ON datatype_table IS 'RULE test'; NOTICE: DDL test: type simple, tag COMMENT diff --git a/src/test/modules/test_ddl_deparse/sql/comment_on.sql b/src/test/modules/test_ddl_deparse/sql/comment_on.sql index 734d493d5a..fc29a73615 100644 --- a/src/test/modules/test_ddl_deparse/sql/comment_on.sql +++ b/src/test/modules/test_ddl_deparse/sql/comment_on.sql @@ -11,4 +11,4 @@ COMMENT ON VIEW datatype_view IS 'This is a view'; COMMENT ON FUNCTION c_function_test() IS 'FUNCTION test'; COMMENT ON TRIGGER trigger_1 ON datatype_table IS 'TRIGGER test'; -COMMENT ON RULE rule_1 IS 'RULE test'; +COMMENT ON RULE rule_1 ON datatype_table IS 'RULE test'; diff --git a/src/test/regress/expected/object_address.out b/src/test/regress/expected/object_address.out index ec5ada97ad..4766975746 100644 --- a/src/test/regress/expected/object_address.out +++ b/src/test/regress/expected/object_address.out @@ -214,8 +214,8 @@ WARNING: error for operator family,{addr_nsp,zwei},{}: access method "addr_nsp" WARNING: error for operator family,{addr_nsp,zwei},{integer}: access method "addr_nsp" does not exist WARNING: error for operator family,{eins,zwei,drei},{}: access method "eins" does not exist WARNING: error for operator family,{eins,zwei,drei},{integer}: access method "eins" does not exist -WARNING: error for rule,{eins},{}: rule "eins" does not exist -WARNING: error for rule,{eins},{integer}: rule "eins" does not exist +WARNING: error for rule,{eins},{}: must specify relation and object name +WARNING: error for rule,{eins},{integer}: must specify relation and object name WARNING: error for rule,{addr_nsp,zwei},{}: relation "addr_nsp" does not exist WARNING: error for rule,{addr_nsp,zwei},{integer}: relation "addr_nsp" does not exist WARNING: error for rule,{eins,zwei,drei},{}: schema "eins" does not exist -- 2.11.1
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers