summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Paquier2019-02-15 08:12:24 +0000
committerMichael Paquier2019-02-15 08:12:24 +0000
commit331a613e9d363febfee8508e8de545fd84624758 (patch)
tree72b6f96f3f22a89108ac4c23ff102da192a67941
parent6c0fb941892519ad6b8873e99c4001404fb9a128 (diff)
Fix support for CREATE TABLE IF NOT EXISTS AS EXECUTE
The grammar IF NOT EXISTS for CTAS is supported since 9.5 and documented as such, however the case of using EXECUTE as query has never been covered as EXECUTE CTAS statements and normal CTAS statements are parsed separately. Author: Andreas Karlsson Discussion: https://postgr.es/m/[email protected] Backpatch-through: 9.5
-rw-r--r--src/backend/parser/gram.y18
-rw-r--r--src/test/regress/expected/create_table.out14
-rw-r--r--src/test/regress/sql/create_table.sql8
3 files changed, 40 insertions, 0 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index ef6bbe35d7f..7bb2b0b2a52 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -10700,11 +10700,29 @@ ExecuteStmt: EXECUTE name execute_param_clause
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 = !($9);
$$ = (Node *) ctas;
}
+ | CREATE OptTemp TABLE IF_P NOT EXISTS create_as_target AS
+ EXECUTE name execute_param_clause opt_with_data
+ {
+ CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt);
+ ExecuteStmt *n = makeNode(ExecuteStmt);
+ n->name = $10;
+ n->params = $11;
+ ctas->query = (Node *) n;
+ 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 = !($12);
+ $$ = (Node *) ctas;
+ }
;
execute_param_clause: '(' expr_list ')' { $$ = $2; }
diff --git a/src/test/regress/expected/create_table.out b/src/test/regress/expected/create_table.out
index 100fa53ab0c..d51e547278e 100644
--- a/src/test/regress/expected/create_table.out
+++ b/src/test/regress/expected/create_table.out
@@ -261,6 +261,20 @@ ERROR: relation "as_select1" already exists
CREATE TABLE IF NOT EXISTS as_select1 AS SELECT * FROM pg_class WHERE relkind = 'r';
NOTICE: relation "as_select1" already exists, skipping
DROP TABLE as_select1;
+PREPARE select1 AS SELECT 1 as a;
+CREATE TABLE as_select1 AS EXECUTE select1;
+CREATE TABLE as_select1 AS EXECUTE select1;
+ERROR: relation "as_select1" already exists
+SELECT * FROM as_select1;
+ a
+---
+ 1
+(1 row)
+
+CREATE TABLE IF NOT EXISTS as_select1 AS EXECUTE select1;
+NOTICE: relation "as_select1" already exists, skipping
+DROP TABLE as_select1;
+DEALLOCATE select1;
-- create an extra wide table to test for issues related to that
-- (temporarily hide query, to avoid the long CREATE TABLE stmt)
\set ECHO none
diff --git a/src/test/regress/sql/create_table.sql b/src/test/regress/sql/create_table.sql
index 22a3d901013..4091c19cf03 100644
--- a/src/test/regress/sql/create_table.sql
+++ b/src/test/regress/sql/create_table.sql
@@ -277,6 +277,14 @@ CREATE TABLE as_select1 AS SELECT * FROM pg_class WHERE relkind = 'r';
CREATE TABLE IF NOT EXISTS as_select1 AS SELECT * FROM pg_class WHERE relkind = 'r';
DROP TABLE as_select1;
+PREPARE select1 AS SELECT 1 as a;
+CREATE TABLE as_select1 AS EXECUTE select1;
+CREATE TABLE as_select1 AS EXECUTE select1;
+SELECT * FROM as_select1;
+CREATE TABLE IF NOT EXISTS as_select1 AS EXECUTE select1;
+DROP TABLE as_select1;
+DEALLOCATE select1;
+
-- create an extra wide table to test for issues related to that
-- (temporarily hide query, to avoid the long CREATE TABLE stmt)
\set ECHO none