summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Eisentraut2017-02-22 13:45:14 +0000
committerPeter Eisentraut2017-02-23 13:19:52 +0000
commite8d016d81940e75c126aa52971b7903b7301002e (patch)
tree549e818e8125c1a75ed616bd8d7363aaa3c1e408
parent9e43e8714c9e976e41b7429fa7c426c9a6e5e8e6 (diff)
Remove deprecated COMMENT ON RULE syntax
This was only used for allowing upgrades from pre-7.3 instances, which was a long time ago.
-rw-r--r--src/backend/catalog/objectaddress.c126
-rw-r--r--src/backend/parser/gram.y10
-rw-r--r--src/backend/rewrite/rewriteSupport.c55
-rw-r--r--src/include/rewrite/rewriteSupport.h2
-rw-r--r--src/test/modules/test_ddl_deparse/expected/comment_on.out2
-rw-r--r--src/test/modules/test_ddl_deparse/sql/comment_on.sql2
-rw-r--r--src/test/regress/expected/object_address.out4
7 files changed, 53 insertions, 148 deletions
diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c
index 9029477d68c..cc636e2e3ed 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 6c6d21b5885..e833b2eba5a 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 c4d05d26d46..ce9c8e37938 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 36e52962957..d287bbda789 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 8ce01e0f748..129eff99c50 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 734d493d5ad..fc29a736150 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 TABLE datatype_table IS 'This table should contain all native datatyp
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 ec5ada97ad7..4766975746d 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