Eliminate pg_rewrite.ev_attr column and related dead code.
authorKevin Grittner <[email protected]>
Thu, 5 Sep 2013 19:03:43 +0000 (14:03 -0500)
committerKevin Grittner <[email protected]>
Thu, 5 Sep 2013 19:03:43 +0000 (14:03 -0500)
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
src/backend/rewrite/rewriteDefine.c
src/backend/rewrite/rewriteHandler.c
src/backend/rewrite/rewriteManip.c
src/backend/utils/adt/ruleutils.c
src/backend/utils/cache/relcache.c
src/include/catalog/catversion.h
src/include/catalog/pg_rewrite.h
src/include/rewrite/prs2lock.h
src/include/rewrite/rewriteManip.h
src/tools/pgindent/typedefs.list

index 67157829fdfc67d5f0e64b6e024712d4232c00a9..9af4697a47b5491ad7d0caad298dfde33c82e00f 100644 (file)
       <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>
index 0e9f515a09c8a74f79fba8ee47a436f8d81c31ca..9c4a5d47e28ecca46d38e872a239a77c390715c8 100644 (file)
@@ -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,
index c55fb14e081d50efc41a871b7ac9c2c81f3f0df1..8a9a703c1291729676c3e905316bfae880327cc7 100644 (file)
@@ -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);
index 6ea91f5b211da1427da3549ed887308fb1a9ef0a..b2626f1f44fb3f6b24a88cc8e5672be356f3b99a 100644 (file)
@@ -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
index 37d66e18e8f4d19ec04478330e29b7632ee47624..9a1d12eb9a9a7b14bfabea3411ba590bba5ea2b8 100644 (file)
@@ -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");
index 66fb63b9e4820b49584531c37d49514d4e329175..b4cc6ad221063867c4a5fc1cb781d6773f2e10aa 100644 (file)
@@ -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)
index 9e46c55ed5614969dc97b86ccbc459443c8e8367..3a18935072e81a17eac2762902297846f5336d68 100644 (file)
@@ -53,6 +53,6 @@
  */
 
 /*                                                     yyyymmddN */
-#define CATALOG_VERSION_NO     201309031
+#define CATALOG_VERSION_NO     201309051
 
 #endif
index 54bc42677abb7a1a1792d118a0dda599ff36ec78..bdd9fc5d1525df640c4d70d6b752009fe53a9a02 100644 (file)
@@ -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 */
index 88d57d2d1f84fbc25efdc04b9cb068203f33b12f..aaca2113aa84645939a2267a14b3ceae70637cbe 100644 (file)
@@ -25,7 +25,6 @@ typedef struct RewriteRule
 {
        Oid                     ruleId;
        CmdType         event;
-       AttrNumber      attrno;
        Node       *qual;
        List       *actions;
        char            enabled;
index eadf8f1179755a6480073ff40d0648b25a0d93b9..bd5cf62a19eeb58036344d9d89d9047d4bab41d4 100644 (file)
@@ -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);
 
index 452235de8afdcfe014fe2fa89a8e5996567ababa..b20eb0d5ac9951ff7ee69d043d43da9a0eeb51cd 100644 (file)
@@ -1955,7 +1955,6 @@ adjust_appendrel_attrs_context
 allocfunc
 array_unnest_fctx
 assign_collations_context
-attribute_used_context
 autovac_table
 av_relation
 avl_dbase