]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Remove special checks for pg_rewrite.ev_qual and ev_action being NULL.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 2 Nov 2020 19:34:34 +0000 (14:34 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 2 Nov 2020 19:34:34 +0000 (14:34 -0500)
make_ruledef() and make_viewdef() were coded to cope with possible
null-ness of these columns, but they've been marked BKI_FORCE_NOT_NULL
for some time.  So there's not really any need to do more than what
we do for the other columns of pg_rewrite, i.e. just Assert that
we got non-null results.

(There is a school of thought that says Asserts aren't the thing
to do to check for corrupt data, but surely here is not the place
to start if we want such a policy.)

Also, remove long-dead-if-indeed-it-ever-wasn't-dead handling of
an empty actions list in make_ruledef().  That's an error case
and should be treated as such.  (DO INSTEAD NOTHING is represented
by a CMD_NOTHING Query, not an empty list; cf transformRuleStmt.)

Kyotaro Horiguchi, some changes by me

Discussion: https://postgr.es/m/CAEudQApoA=tMTic6xEPYP_hsNZ8XtToVThK_0x7D_aFQYowq3w@mail.gmail.com

src/backend/utils/adt/ruleutils.c

index 7446193252948e186cbe60cc0944c664dcedd17c..28f56074c0c688bccce87d2152d54de61f74c410 100644 (file)
@@ -4733,7 +4733,7 @@ make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
        bool            is_instead;
        char       *ev_qual;
        char       *ev_action;
-       List       *actions = NIL;
+       List       *actions;
        Relation        ev_relation;
        TupleDesc       viewResultDesc = NULL;
        int                     fno;
@@ -4763,14 +4763,16 @@ make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
        Assert(!isnull);
        is_instead = DatumGetBool(dat);
 
-       /* these could be nulls */
        fno = SPI_fnumber(rulettc, "ev_qual");
        ev_qual = SPI_getvalue(ruletup, rulettc, fno);
+       Assert(ev_qual != NULL);
 
        fno = SPI_fnumber(rulettc, "ev_action");
        ev_action = SPI_getvalue(ruletup, rulettc, fno);
-       if (ev_action != NULL)
-               actions = (List *) stringToNode(ev_action);
+       Assert(ev_action != NULL);
+       actions = (List *) stringToNode(ev_action);
+       if (actions == NIL)
+               elog(ERROR, "invalid empty ev_action list");
 
        ev_relation = table_open(ev_class, AccessShareLock);
 
@@ -4820,9 +4822,7 @@ make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
                                         generate_qualified_relation_name(ev_class));
 
        /* If the rule has an event qualification, add it */
-       if (ev_qual == NULL)
-               ev_qual = "";
-       if (strlen(ev_qual) > 0 && strcmp(ev_qual, "<>") != 0)
+       if (strcmp(ev_qual, "<>") != 0)
        {
                Node       *qual;
                Query      *query;
@@ -4893,10 +4893,6 @@ make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
                }
                appendStringInfoString(buf, ");");
        }
-       else if (list_length(actions) == 0)
-       {
-               appendStringInfoString(buf, "NOTHING;");
-       }
        else
        {
                Query      *query;
@@ -4926,7 +4922,7 @@ make_viewdef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
        bool            is_instead;
        char       *ev_qual;
        char       *ev_action;
-       List       *actions = NIL;
+       List       *actions;
        Relation        ev_relation;
        int                     fno;
        Datum           dat;
@@ -4950,14 +4946,14 @@ make_viewdef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
        Assert(!isnull);
        is_instead = DatumGetBool(dat);
 
-       /* these could be nulls */
        fno = SPI_fnumber(rulettc, "ev_qual");
        ev_qual = SPI_getvalue(ruletup, rulettc, fno);
+       Assert(ev_qual != NULL);
 
        fno = SPI_fnumber(rulettc, "ev_action");
        ev_action = SPI_getvalue(ruletup, rulettc, fno);
-       if (ev_action != NULL)
-               actions = (List *) stringToNode(ev_action);
+       Assert(ev_action != NULL);
+       actions = (List *) stringToNode(ev_action);
 
        if (list_length(actions) != 1)
        {