diff options
Diffstat (limited to 'src/backend/commands/createas.c')
-rw-r--r-- | src/backend/commands/createas.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/backend/commands/createas.c b/src/backend/commands/createas.c index d53ec952d07..29c350f1f06 100644 --- a/src/backend/commands/createas.c +++ b/src/backend/commands/createas.c @@ -242,15 +242,27 @@ ExecCreateTableAs(ParseState *pstate, CreateTableAsStmt *stmt, if (stmt->if_not_exists) { Oid nspid; + Oid oldrelid; - nspid = RangeVarGetCreationNamespace(stmt->into->rel); + nspid = RangeVarGetCreationNamespace(into->rel); - if (get_relname_relid(stmt->into->rel->relname, nspid)) + oldrelid = get_relname_relid(into->rel->relname, nspid); + if (OidIsValid(oldrelid)) { + /* + * The relation exists and IF NOT EXISTS has been specified. + * + * If we are in an extension script, insist that the pre-existing + * object be a member of the extension, to avoid security risks. + */ + ObjectAddressSet(address, RelationRelationId, oldrelid); + checkMembershipInCurrentExtension(&address); + + /* OK to skip */ ereport(NOTICE, (errcode(ERRCODE_DUPLICATE_TABLE), errmsg("relation \"%s\" already exists, skipping", - stmt->into->rel->relname))); + into->rel->relname))); return InvalidObjectAddress; } } |