Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit331a613

Browse files
committed
Fix support for CREATE TABLE IF NOT EXISTS AS EXECUTE
The grammar IF NOT EXISTS for CTAS is supported since 9.5 and documentedas such, however the case of using EXECUTE as query has never beencovered as EXECUTE CTAS statements and normal CTAS statements are parsedseparately.Author: Andreas KarlssonDiscussion:https://postgr.es/m/2ddcc188-e37c-a0be-32bf-a56b07c3559e@proxel.seBackpatch-through: 9.5
1 parent6c0fb94 commit331a613

File tree

3 files changed

+40
-0
lines changed

3 files changed

+40
-0
lines changed

‎src/backend/parser/gram.y

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10700,11 +10700,29 @@ ExecuteStmt: EXECUTE name execute_param_clause
1070010700
ctas->into =$4;
1070110701
ctas->relkind = OBJECT_TABLE;
1070210702
ctas->is_select_into =false;
10703+
ctas->if_not_exists =false;
1070310704
/* cram additional flags into the IntoClause*/
1070410705
$4->rel->relpersistence =$2;
1070510706
$4->skipData = !($9);
1070610707
$$ = (Node *) ctas;
1070710708
}
10709+
|CREATEOptTempTABLEIF_PNOTEXISTScreate_as_targetAS
10710+
EXECUTEnameexecute_param_clauseopt_with_data
10711+
{
10712+
CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt);
10713+
ExecuteStmt *n = makeNode(ExecuteStmt);
10714+
n->name =$10;
10715+
n->params =$11;
10716+
ctas->query = (Node *) n;
10717+
ctas->into =$7;
10718+
ctas->relkind = OBJECT_TABLE;
10719+
ctas->is_select_into =false;
10720+
ctas->if_not_exists =true;
10721+
/* cram additional flags into the IntoClause*/
10722+
$7->rel->relpersistence =$2;
10723+
$7->skipData = !($12);
10724+
$$ = (Node *) ctas;
10725+
}
1070810726
;
1070910727

1071010728
execute_param_clause:'('expr_list')'{$$ =$2; }

‎src/test/regress/expected/create_table.out

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,20 @@ ERROR: relation "as_select1" already exists
261261
CREATE TABLE IF NOT EXISTS as_select1 AS SELECT * FROM pg_class WHERE relkind = 'r';
262262
NOTICE: relation "as_select1" already exists, skipping
263263
DROP TABLE as_select1;
264+
PREPARE select1 AS SELECT 1 as a;
265+
CREATE TABLE as_select1 AS EXECUTE select1;
266+
CREATE TABLE as_select1 AS EXECUTE select1;
267+
ERROR: relation "as_select1" already exists
268+
SELECT * FROM as_select1;
269+
a
270+
---
271+
1
272+
(1 row)
273+
274+
CREATE TABLE IF NOT EXISTS as_select1 AS EXECUTE select1;
275+
NOTICE: relation "as_select1" already exists, skipping
276+
DROP TABLE as_select1;
277+
DEALLOCATE select1;
264278
-- create an extra wide table to test for issues related to that
265279
-- (temporarily hide query, to avoid the long CREATE TABLE stmt)
266280
\set ECHO none

‎src/test/regress/sql/create_table.sql

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,14 @@ CREATE TABLE as_select1 AS SELECT * FROM pg_class WHERE relkind = 'r';
277277
CREATETABLEIF NOT EXISTS as_select1ASSELECT*FROM pg_classWHERE relkind='r';
278278
DROPTABLE as_select1;
279279

280+
PREPARE select1ASSELECT1as a;
281+
CREATETABLEas_select1AS EXECUTE select1;
282+
CREATETABLEas_select1AS EXECUTE select1;
283+
SELECT*FROM as_select1;
284+
CREATETABLEIF NOT EXISTS as_select1AS EXECUTE select1;
285+
DROPTABLE as_select1;
286+
DEALLOCATE select1;
287+
280288
-- create an extra wide table to test for issues related to that
281289
-- (temporarily hide query, to avoid the long CREATE TABLE stmt)
282290
\set ECHO none

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp