From 277607d600fb71e25082b94302ca1716403cd0bc Mon Sep 17 00:00:00 2001
From: Kevin Grittner <kgrittn@postgresql.org>
Date: Thu, 5 Sep 2013 14:03:43 -0500
Subject: [PATCH] Eliminate pg_rewrite.ev_attr column and related dead code.

Commit 95ef6a344821655ce4d0a74999ac49dd6af6d342 removed the
ability to create rules on an individual column as of 7.3, but
left some residual code which has since been useless.  This cleans
up that dead code without any change in behavior other than
dropping the useless column from the catalog.
---
 doc/src/sgml/catalogs.sgml           |  8 ----
 src/backend/rewrite/rewriteDefine.c  |  6 ---
 src/backend/rewrite/rewriteHandler.c | 17 +-------
 src/backend/rewrite/rewriteManip.c   | 64 ----------------------------
 src/backend/utils/adt/ruleutils.c    | 16 +------
 src/backend/utils/cache/relcache.c   |  3 --
 src/include/catalog/catversion.h     |  2 +-
 src/include/catalog/pg_rewrite.h     | 14 +++---
 src/include/rewrite/prs2lock.h       |  1 -
 src/include/rewrite/rewriteManip.h   |  2 -
 src/tools/pgindent/typedefs.list     |  1 -
 11 files changed, 9 insertions(+), 125 deletions(-)

diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 67157829fdf..9af4697a47b 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -5038,14 +5038,6 @@
       <entry>The table this rule is for</entry>
      </row>
 
-     <row>
-      <entry><structfield>ev_attr</structfield></entry>
-      <entry><type>int2</type></entry>
-      <entry></entry>
-      <entry>The column this rule is for (currently, always -1 to
-      indicate the whole table)</entry>
-     </row>
-
      <row>
       <entry><structfield>ev_type</structfield></entry>
       <entry><type>char</type></entry>
diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c
index 0e9f515a09c..9c4a5d47e28 100644
--- a/src/backend/rewrite/rewriteDefine.c
+++ b/src/backend/rewrite/rewriteDefine.c
@@ -58,7 +58,6 @@ static Oid
 InsertRule(char *rulname,
 		   int evtype,
 		   Oid eventrel_oid,
-		   AttrNumber evslot_index,
 		   bool evinstead,
 		   Node *event_qual,
 		   List *action,
@@ -86,7 +85,6 @@ InsertRule(char *rulname,
 	namestrcpy(&rname, rulname);
 	values[Anum_pg_rewrite_rulename - 1] = NameGetDatum(&rname);
 	values[Anum_pg_rewrite_ev_class - 1] = ObjectIdGetDatum(eventrel_oid);
-	values[Anum_pg_rewrite_ev_attr - 1] = Int16GetDatum(evslot_index);
 	values[Anum_pg_rewrite_ev_type - 1] = CharGetDatum(evtype + '0');
 	values[Anum_pg_rewrite_ev_enabled - 1] = CharGetDatum(RULE_FIRES_ON_ORIGIN);
 	values[Anum_pg_rewrite_is_instead - 1] = BoolGetDatum(evinstead);
@@ -117,7 +115,6 @@ InsertRule(char *rulname,
 		 * When replacing, we don't need to replace every attribute
 		 */
 		MemSet(replaces, false, sizeof(replaces));
-		replaces[Anum_pg_rewrite_ev_attr - 1] = true;
 		replaces[Anum_pg_rewrite_ev_type - 1] = true;
 		replaces[Anum_pg_rewrite_is_instead - 1] = true;
 		replaces[Anum_pg_rewrite_ev_qual - 1] = true;
@@ -238,7 +235,6 @@ DefineQueryRewrite(char *rulename,
 				   List *action)
 {
 	Relation	event_relation;
-	int			event_attno;
 	ListCell   *l;
 	Query	   *query;
 	bool		RelisBecomingView = false;
@@ -495,7 +491,6 @@ DefineQueryRewrite(char *rulename,
 	/*
 	 * This rule is allowed - prepare to install it.
 	 */
-	event_attno = -1;
 
 	/* discard rule if it's null action and not INSTEAD; it's a no-op */
 	if (action != NIL || is_instead)
@@ -503,7 +498,6 @@ DefineQueryRewrite(char *rulename,
 		ruleId = InsertRule(rulename,
 							event_type,
 							event_relid,
-							event_attno,
 							is_instead,
 							event_qual,
 							action,
diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c
index c55fb14e081..8a9a703c129 100644
--- a/src/backend/rewrite/rewriteHandler.c
+++ b/src/backend/rewrite/rewriteHandler.c
@@ -1276,10 +1276,7 @@ matchLocks(CmdType event,
 		if (oneLock->event == event)
 		{
 			if (parsetree->commandType != CMD_SELECT ||
-				(oneLock->attrno == -1 ?
-				 rangeTableEntry_used((Node *) parsetree, varno, 0) :
-				 attribute_used((Node *) parsetree,
-								varno, oneLock->attrno, 0)))
+				rangeTableEntry_used((Node *) parsetree, varno, 0))
 				matching_locks = lappend(matching_locks, oneLock);
 		}
 	}
@@ -1295,7 +1292,6 @@ static Query *
 ApplyRetrieveRule(Query *parsetree,
 				  RewriteRule *rule,
 				  int rt_index,
-				  bool relation_level,
 				  Relation relation,
 				  List *activeRIRs,
 				  bool forUpdatePushedDown)
@@ -1309,8 +1305,6 @@ ApplyRetrieveRule(Query *parsetree,
 		elog(ERROR, "expected just one rule action");
 	if (rule->qual != NULL)
 		elog(ERROR, "cannot handle qualified ON SELECT rule");
-	if (!relation_level)
-		elog(ERROR, "cannot handle per-attribute ON SELECT rule");
 
 	if (rt_index == parsetree->resultRelation)
 	{
@@ -1632,14 +1626,6 @@ fireRIRrules(Query *parsetree, List *activeRIRs, bool forUpdatePushedDown)
 			if (rule->event != CMD_SELECT)
 				continue;
 
-			if (rule->attrno > 0)
-			{
-				/* per-attr rule; do we need it? */
-				if (!attribute_used((Node *) parsetree, rt_index,
-									rule->attrno, 0))
-					continue;
-			}
-
 			locks = lappend(locks, rule);
 		}
 
@@ -1664,7 +1650,6 @@ fireRIRrules(Query *parsetree, List *activeRIRs, bool forUpdatePushedDown)
 				parsetree = ApplyRetrieveRule(parsetree,
 											  rule,
 											  rt_index,
-											  rule->attrno == -1,
 											  rel,
 											  activeRIRs,
 											  forUpdatePushedDown);
diff --git a/src/backend/rewrite/rewriteManip.c b/src/backend/rewrite/rewriteManip.c
index 6ea91f5b211..b2626f1f44f 100644
--- a/src/backend/rewrite/rewriteManip.c
+++ b/src/backend/rewrite/rewriteManip.c
@@ -857,70 +857,6 @@ rangeTableEntry_used(Node *node, int rt_index, int sublevels_up)
 }
 
 
-/*
- * attribute_used -
- *	Check if a specific attribute number of a RTE is used
- *	somewhere in the query or expression.
- */
-
-typedef struct
-{
-	int			rt_index;
-	int			attno;
-	int			sublevels_up;
-} attribute_used_context;
-
-static bool
-attribute_used_walker(Node *node,
-					  attribute_used_context *context)
-{
-	if (node == NULL)
-		return false;
-	if (IsA(node, Var))
-	{
-		Var		   *var = (Var *) node;
-
-		if (var->varlevelsup == context->sublevels_up &&
-			var->varno == context->rt_index &&
-			var->varattno == context->attno)
-			return true;
-		return false;
-	}
-	if (IsA(node, Query))
-	{
-		/* Recurse into subselects */
-		bool		result;
-
-		context->sublevels_up++;
-		result = query_tree_walker((Query *) node, attribute_used_walker,
-								   (void *) context, 0);
-		context->sublevels_up--;
-		return result;
-	}
-	return expression_tree_walker(node, attribute_used_walker,
-								  (void *) context);
-}
-
-bool
-attribute_used(Node *node, int rt_index, int attno, int sublevels_up)
-{
-	attribute_used_context context;
-
-	context.rt_index = rt_index;
-	context.attno = attno;
-	context.sublevels_up = sublevels_up;
-
-	/*
-	 * Must be prepared to start with a Query or a bare expression tree; if
-	 * it's a Query, we don't want to increment sublevels_up.
-	 */
-	return query_or_expression_tree_walker(node,
-										   attribute_used_walker,
-										   (void *) &context,
-										   0);
-}
-
-
 /*
  * If the given Query is an INSERT ... SELECT construct, extract and
  * return the sub-Query node that represents the SELECT part.  Otherwise
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 37d66e18e8f..9a1d12eb9a9 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -3734,7 +3734,6 @@ make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
 	char	   *rulename;
 	char		ev_type;
 	Oid			ev_class;
-	int16		ev_attr;
 	bool		is_instead;
 	char	   *ev_qual;
 	char	   *ev_action;
@@ -3761,11 +3760,6 @@ make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
 	Assert(!isnull);
 	ev_class = DatumGetObjectId(dat);
 
-	fno = SPI_fnumber(rulettc, "ev_attr");
-	dat = SPI_getbinval(ruletup, rulettc, fno, &isnull);
-	Assert(!isnull);
-	ev_attr = DatumGetInt16(dat);
-
 	fno = SPI_fnumber(rulettc, "is_instead");
 	dat = SPI_getbinval(ruletup, rulettc, fno, &isnull);
 	Assert(!isnull);
@@ -3820,10 +3814,6 @@ make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
 
 	/* The relation the rule is fired on */
 	appendStringInfo(buf, " TO %s", generate_relation_name(ev_class, NIL));
-	if (ev_attr > 0)
-		appendStringInfo(buf, ".%s",
-						 quote_identifier(get_relid_attribute_name(ev_class,
-																   ev_attr)));
 
 	/* If the rule has an event qualification, add it */
 	if (ev_qual == NULL)
@@ -3925,7 +3915,6 @@ make_viewdef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
 	Query	   *query;
 	char		ev_type;
 	Oid			ev_class;
-	int16		ev_attr;
 	bool		is_instead;
 	char	   *ev_qual;
 	char	   *ev_action;
@@ -3943,9 +3932,6 @@ make_viewdef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
 	fno = SPI_fnumber(rulettc, "ev_class");
 	ev_class = (Oid) SPI_getbinval(ruletup, rulettc, fno, &isnull);
 
-	fno = SPI_fnumber(rulettc, "ev_attr");
-	ev_attr = (int16) SPI_getbinval(ruletup, rulettc, fno, &isnull);
-
 	fno = SPI_fnumber(rulettc, "is_instead");
 	is_instead = (bool) SPI_getbinval(ruletup, rulettc, fno, &isnull);
 
@@ -3965,7 +3951,7 @@ make_viewdef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
 
 	query = (Query *) linitial(actions);
 
-	if (ev_type != '1' || ev_attr >= 0 || !is_instead ||
+	if (ev_type != '1' || !is_instead ||
 		strcmp(ev_qual, "<>") != 0 || query->commandType != CMD_SELECT)
 	{
 		appendStringInfo(buf, "Not a view");
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 66fb63b9e48..b4cc6ad2210 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -682,7 +682,6 @@ RelationBuildRuleLock(Relation relation)
 		rule->ruleId = HeapTupleGetOid(rewrite_tuple);
 
 		rule->event = rewrite_form->ev_type - '0';
-		rule->attrno = rewrite_form->ev_attr;
 		rule->enabled = rewrite_form->ev_enabled;
 		rule->isInstead = rewrite_form->is_instead;
 
@@ -798,8 +797,6 @@ equalRuleLocks(RuleLock *rlock1, RuleLock *rlock2)
 				return false;
 			if (rule1->event != rule2->event)
 				return false;
-			if (rule1->attrno != rule2->attrno)
-				return false;
 			if (rule1->enabled != rule2->enabled)
 				return false;
 			if (rule1->isInstead != rule2->isInstead)
diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h
index 9e46c55ed56..3a18935072e 100644
--- a/src/include/catalog/catversion.h
+++ b/src/include/catalog/catversion.h
@@ -53,6 +53,6 @@
  */
 
 /*							yyyymmddN */
-#define CATALOG_VERSION_NO	201309031
+#define CATALOG_VERSION_NO	201309051
 
 #endif
diff --git a/src/include/catalog/pg_rewrite.h b/src/include/catalog/pg_rewrite.h
index 54bc42677ab..bdd9fc5d152 100644
--- a/src/include/catalog/pg_rewrite.h
+++ b/src/include/catalog/pg_rewrite.h
@@ -35,7 +35,6 @@ CATALOG(pg_rewrite,2618)
 {
 	NameData	rulename;
 	Oid			ev_class;
-	int16		ev_attr;
 	char		ev_type;
 	char		ev_enabled;
 	bool		is_instead;
@@ -57,14 +56,13 @@ typedef FormData_pg_rewrite *Form_pg_rewrite;
  *		compiler constants for pg_rewrite
  * ----------------
  */
-#define Natts_pg_rewrite				8
+#define Natts_pg_rewrite				7
 #define Anum_pg_rewrite_rulename		1
 #define Anum_pg_rewrite_ev_class		2
-#define Anum_pg_rewrite_ev_attr			3
-#define Anum_pg_rewrite_ev_type			4
-#define Anum_pg_rewrite_ev_enabled		5
-#define Anum_pg_rewrite_is_instead		6
-#define Anum_pg_rewrite_ev_qual			7
-#define Anum_pg_rewrite_ev_action		8
+#define Anum_pg_rewrite_ev_type			3
+#define Anum_pg_rewrite_ev_enabled		4
+#define Anum_pg_rewrite_is_instead		5
+#define Anum_pg_rewrite_ev_qual			6
+#define Anum_pg_rewrite_ev_action		7
 
 #endif   /* PG_REWRITE_H */
diff --git a/src/include/rewrite/prs2lock.h b/src/include/rewrite/prs2lock.h
index 88d57d2d1f8..aaca2113aa8 100644
--- a/src/include/rewrite/prs2lock.h
+++ b/src/include/rewrite/prs2lock.h
@@ -25,7 +25,6 @@ typedef struct RewriteRule
 {
 	Oid			ruleId;
 	CmdType		event;
-	AttrNumber	attrno;
 	Node	   *qual;
 	List	   *actions;
 	char		enabled;
diff --git a/src/include/rewrite/rewriteManip.h b/src/include/rewrite/rewriteManip.h
index eadf8f11797..bd5cf62a19e 100644
--- a/src/include/rewrite/rewriteManip.h
+++ b/src/include/rewrite/rewriteManip.h
@@ -49,8 +49,6 @@ extern void IncrementVarSublevelsUp_rtable(List *rtable,
 
 extern bool rangeTableEntry_used(Node *node, int rt_index,
 					 int sublevels_up);
-extern bool attribute_used(Node *node, int rt_index, int attno,
-			   int sublevels_up);
 
 extern Query *getInsertSelectQuery(Query *parsetree, Query ***subquery_ptr);
 
diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list
index 452235de8af..b20eb0d5ac9 100644
--- a/src/tools/pgindent/typedefs.list
+++ b/src/tools/pgindent/typedefs.list
@@ -1955,7 +1955,6 @@ adjust_appendrel_attrs_context
 allocfunc
 array_unnest_fctx
 assign_collations_context
-attribute_used_context
 autovac_table
 av_relation
 avl_dbase
-- 
GitLab