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

Reply via email to