From 874fe3aea121b4ceb186d59ba6956e2f7d5aa0bb Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 27 Jun 2016 15:57:21 -0400 Subject: Fix CREATE MATVIEW/CREATE TABLE AS ... WITH NO DATA to not plan the query. Previously, these commands always planned the given query and went through executor startup before deciding not to actually run the query if WITH NO DATA is specified. This behavior is problematic for pg_dump because it may cause errors to be raised that we would rather not see before a REFRESH MATERIALIZED VIEW command is issued. See for example bug #13907 from Marian Krucina. This change is not sufficient to fix that particular bug, because we also need to tweak pg_dump to issue the REFRESH later, but it's a necessary step on the way. A user-visible side effect of doing things this way is that the returned command tag for WITH NO DATA cases will now be "CREATE MATERIALIZED VIEW" or "CREATE TABLE AS", not "SELECT 0". We could preserve the old behavior but it would take more code, and arguably that was just an implementation artifact not intended behavior anyhow. In 9.5 and HEAD, also get rid of the static variable CreateAsReladdr, which was trouble waiting to happen; there is not any prohibition on nested CREATE commands. Back-patch to 9.3 where CREATE MATERIALIZED VIEW was introduced. Michael Paquier and Tom Lane Report: <20160202161407.2778.24659@wrigleys.postgresql.org> --- src/backend/commands/view.c | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) (limited to 'src/backend/commands/view.c') diff --git a/src/backend/commands/view.c b/src/backend/commands/view.c index e9d9ba288ad..085bf323205 100644 --- a/src/backend/commands/view.c +++ b/src/backend/commands/view.c @@ -82,25 +82,14 @@ DefineVirtualRelation(RangeVar *relation, List *tlist, bool replace, attrList = NIL; foreach(t, tlist) { - TargetEntry *tle = lfirst(t); + TargetEntry *tle = (TargetEntry *) lfirst(t); if (!tle->resjunk) { - ColumnDef *def = makeNode(ColumnDef); - - def->colname = pstrdup(tle->resname); - def->typeName = makeTypeNameFromOid(exprType((Node *) tle->expr), - exprTypmod((Node *) tle->expr)); - def->inhcount = 0; - def->is_local = true; - def->is_not_null = false; - def->is_from_type = false; - def->storage = 0; - def->raw_default = NULL; - def->cooked_default = NULL; - def->collClause = NULL; - def->collOid = exprCollation((Node *) tle->expr); - def->location = -1; + ColumnDef *def = makeColumnDef(tle->resname, + exprType((Node *) tle->expr), + exprTypmod((Node *) tle->expr), + exprCollation((Node *) tle->expr)); /* * It's possible that the column is of a collatable type but the @@ -117,7 +106,6 @@ DefineVirtualRelation(RangeVar *relation, List *tlist, bool replace, } else Assert(!OidIsValid(def->collOid)); - def->constraints = NIL; attrList = lappend(attrList, def); } -- cgit v1.2.3