Ensure commands in extension scripts see the results of preceding DDL.
authorTom Lane
Tue, 2 May 2017 22:05:54 +0000 (18:05 -0400)
committerTom Lane
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 f69a19846fbf08887c702d7f39cb4d5ad4371313..39c9411367a679462159440ce2c0ed30de4e3ec2 100644 (file)
@@ -703,6 +703,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,