Ensure commands in extension scripts see the results of preceding DDL.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 2 May 2017 22:05:54 +0000 (18:05 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 2 May 2017 22:05:54 +0000 (18:05 -0400)
Due to a missing CommandCounterIncrement() call, parsing of a non-utility
command in an extension script would not see the effects of the immediately
preceding DDL command, unless that command's execution ends with
CommandCounterIncrement() internally ... which some do but many don't.
Report by Philippe Beaudoin, diagnosis by Julien Rouhaud.

Rather remarkably, this bug has evaded detection since extensions were
invented, so back-patch to all supported branches.

Discussion: https://postgr.es/m/2cf7941e-4e41-7714-3de8-37b1a8f74dff@free.fr

src/backend/commands/extension.c

index 9a0afa4b5dcc63431be3a21155ad068ada9a11f7..ff830b679ecbc33bd951c4c392a8427a1951f4de 100644 (file)
@@ -706,6 +706,9 @@ execute_sql_string(const char *sql, const char *filename)
        List       *stmt_list;
        ListCell   *lc2;
 
+       /* Be sure parser can see any DDL done so far */
+       CommandCounterIncrement();
+
        stmt_list = pg_analyze_and_rewrite(parsetree,
                                           sql,
                                           NULL,