From 8c356b2bc8d56fc4aaece86badfaf4ada7622a6f Mon Sep 17 00:00:00 2001 From: metdos Date: Tue, 31 Oct 2017 17:11:08 +0200 Subject: [PATCH] Don't try to add restrictions for reference tables in insert into select --- .../distributed/planner/deparse_shard_query.c | 9 ++++- .../regress/expected/multi_insert_select.out | 33 +++++++++++++++++++ src/test/regress/sql/multi_insert_select.sql | 19 +++++++++++ 3 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/backend/distributed/planner/deparse_shard_query.c b/src/backend/distributed/planner/deparse_shard_query.c index 66f81a47a..3192cb80b 100644 --- a/src/backend/distributed/planner/deparse_shard_query.c +++ b/src/backend/distributed/planner/deparse_shard_query.c @@ -66,6 +66,7 @@ RebuildQueryStrings(Query *originalQuery, List *taskList) Query *copiedSubquery = NULL; List *relationShardList = task->relationShardList; ShardInterval *shardInterval = LoadShardInterval(task->anchorShardId); + char partitionMethod = 0; query = copyObject(originalQuery); @@ -73,7 +74,13 @@ RebuildQueryStrings(Query *originalQuery, List *taskList) copiedSubqueryRte = ExtractSelectRangeTableEntry(query); copiedSubquery = copiedSubqueryRte->subquery; - AddShardIntervalRestrictionToSelect(copiedSubquery, shardInterval); + /* there are no restrictions to add for reference tables */ + partitionMethod = PartitionMethod(shardInterval->relationId); + if (partitionMethod != DISTRIBUTE_BY_NONE) + { + AddShardIntervalRestrictionToSelect(copiedSubquery, shardInterval); + } + ReorderInsertSelectTargetLists(query, copiedInsertRte, copiedSubqueryRte); /* setting an alias simplifies deparsing of RETURNING */ diff --git a/src/test/regress/expected/multi_insert_select.out b/src/test/regress/expected/multi_insert_select.out index 05752141c..93b565d62 100644 --- a/src/test/regress/expected/multi_insert_select.out +++ b/src/test/regress/expected/multi_insert_select.out @@ -2392,6 +2392,39 @@ SELECT * FROM ref_table ORDER BY user_id, value_1; (5 rows) DROP TABLE ref_table; +-- Select from reference table into reference table +CREATE TABLE ref1 (d timestamptz); +SELECT create_reference_table('ref1'); + create_reference_table +------------------------ + +(1 row) + +CREATE TABLE ref2 (d date); +SELECT create_reference_table('ref2'); + create_reference_table +------------------------ + +(1 row) + +INSERT INTO ref2 VALUES ('2017-10-31'); +INSERT INTO ref1 SELECT * FROM ref2; +SELECT count(*) from ref1; + count +------- + 1 +(1 row) + +-- also test with now() +INSERT INTO ref1 SELECT now() FROM ref2; +SELECT count(*) from ref1; + count +------- + 2 +(1 row) + +DROP TABLE ref1; +DROP TABLE ref2; -- Select into an append-partitioned table is not supported CREATE TABLE insert_append_table (user_id int, value_4 bigint); SELECT create_distributed_table('insert_append_table', 'user_id', 'append'); diff --git a/src/test/regress/sql/multi_insert_select.sql b/src/test/regress/sql/multi_insert_select.sql index 9f78ed93d..715830760 100644 --- a/src/test/regress/sql/multi_insert_select.sql +++ b/src/test/regress/sql/multi_insert_select.sql @@ -1885,6 +1885,25 @@ SELECT * FROM ref_table ORDER BY user_id, value_1; DROP TABLE ref_table; +-- Select from reference table into reference table +CREATE TABLE ref1 (d timestamptz); +SELECT create_reference_table('ref1'); + +CREATE TABLE ref2 (d date); +SELECT create_reference_table('ref2'); +INSERT INTO ref2 VALUES ('2017-10-31'); + +INSERT INTO ref1 SELECT * FROM ref2; +SELECT count(*) from ref1; + +-- also test with now() +INSERT INTO ref1 SELECT now() FROM ref2; +SELECT count(*) from ref1; + + +DROP TABLE ref1; +DROP TABLE ref2; + -- Select into an append-partitioned table is not supported CREATE TABLE insert_append_table (user_id int, value_4 bigint); SELECT create_distributed_table('insert_append_table', 'user_id', 'append');