diff options
author | Andrew Dunstan <andrew@dunslane.net> | 2014-12-13 13:56:09 -0500 |
---|---|---|
committer | Andrew Dunstan <andrew@dunslane.net> | 2014-12-13 13:56:09 -0500 |
commit | e39b6f953e8c699eacd676314574ed5869ebacef (patch) | |
tree | 420894d9b39ef8e41d302d76b14a4e7e3e54d3f6 /src/backend | |
parent | e311cd6ded096122a5f2b5cbe91bc3a9f0dda3cb (diff) | |
download | postgresql-e39b6f953e8c699eacd676314574ed5869ebacef.tar.gz postgresql-e39b6f953e8c699eacd676314574ed5869ebacef.zip |
Add CINE option for CREATE TABLE AS and CREATE MATERIALIZED VIEW
FabrÃzio de Royes Mello reviewed by Rushabh Lathia.
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/commands/createas.c | 17 | ||||
-rw-r--r-- | src/backend/nodes/copyfuncs.c | 1 | ||||
-rw-r--r-- | src/backend/nodes/equalfuncs.c | 1 | ||||
-rw-r--r-- | src/backend/parser/gram.y | 28 |
4 files changed, 47 insertions, 0 deletions
diff --git a/src/backend/commands/createas.c b/src/backend/commands/createas.c index 5e0ac585603..72315c2f3fc 100644 --- a/src/backend/commands/createas.c +++ b/src/backend/commands/createas.c @@ -28,6 +28,7 @@ #include "access/sysattr.h" #include "access/xact.h" #include "access/xlog.h" +#include "catalog/namespace.h" #include "catalog/toasting.h" #include "commands/createas.h" #include "commands/matview.h" @@ -86,6 +87,22 @@ ExecCreateTableAs(CreateTableAsStmt *stmt, const char *queryString, QueryDesc *queryDesc; ScanDirection dir; + if (stmt->if_not_exists) + { + Oid nspid; + + nspid = RangeVarGetCreationNamespace(stmt->into->rel); + + if (get_relname_relid(stmt->into->rel->relname, nspid)) + { + ereport(NOTICE, + (errcode(ERRCODE_DUPLICATE_TABLE), + errmsg("relation \"%s\" already exists, skipping", + stmt->into->rel->relname))); + return InvalidOid; + } + } + /* * Create the tuple receiver object and insert info it will need */ diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index 6b1bf7be19d..491e4db9d6f 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -3317,6 +3317,7 @@ _copyCreateTableAsStmt(const CreateTableAsStmt *from) COPY_NODE_FIELD(into); COPY_SCALAR_FIELD(relkind); COPY_SCALAR_FIELD(is_select_into); + COPY_SCALAR_FIELD(if_not_exists); return newnode; } diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index d5db71d3a86..08036743d57 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -1530,6 +1530,7 @@ _equalCreateTableAsStmt(const CreateTableAsStmt *a, const CreateTableAsStmt *b) COMPARE_NODE_FIELD(into); COMPARE_SCALAR_FIELD(relkind); COMPARE_SCALAR_FIELD(is_select_into); + COMPARE_SCALAR_FIELD(if_not_exists); return true; } diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 4b5009b636d..1f4fe9d4943 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -3401,11 +3401,25 @@ CreateAsStmt: ctas->into = $4; ctas->relkind = OBJECT_TABLE; ctas->is_select_into = false; + ctas->if_not_exists = false; /* cram additional flags into the IntoClause */ $4->rel->relpersistence = $2; $4->skipData = !($7); $$ = (Node *) ctas; } + | CREATE OptTemp TABLE IF_P NOT EXISTS create_as_target AS SelectStmt opt_with_data + { + CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt); + ctas->query = $9; + ctas->into = $7; + ctas->relkind = OBJECT_TABLE; + ctas->is_select_into = false; + ctas->if_not_exists = true; + /* cram additional flags into the IntoClause */ + $7->rel->relpersistence = $2; + $7->skipData = !($10); + $$ = (Node *) ctas; + } ; create_as_target: @@ -3444,11 +3458,25 @@ CreateMatViewStmt: ctas->into = $5; ctas->relkind = OBJECT_MATVIEW; ctas->is_select_into = false; + ctas->if_not_exists = false; /* cram additional flags into the IntoClause */ $5->rel->relpersistence = $2; $5->skipData = !($8); $$ = (Node *) ctas; } + | CREATE OptNoLog MATERIALIZED VIEW IF_P NOT EXISTS create_mv_target AS SelectStmt opt_with_data + { + CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt); + ctas->query = $10; + ctas->into = $8; + ctas->relkind = OBJECT_MATVIEW; + ctas->is_select_into = false; + ctas->if_not_exists = true; + /* cram additional flags into the IntoClause */ + $8->rel->relpersistence = $2; + $8->skipData = !($11); + $$ = (Node *) ctas; + } ; create_mv_target: |