From 40b898b59f213807553b47ff77aea9e54e127d00 Mon Sep 17 00:00:00 2001 From: Onder Kalaci Date: Mon, 5 Mar 2018 14:46:47 +0200 Subject: [PATCH] Improve error messages for INSERT queries that have subqueries --- .../planner/multi_router_planner.c | 22 +++++-------------- .../regress/expected/multi_modifications.out | 14 ++++++++++++ src/test/regress/expected/multi_upsert.out | 4 ++-- src/test/regress/sql/multi_modifications.sql | 8 +++++++ 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/backend/distributed/planner/multi_router_planner.c b/src/backend/distributed/planner/multi_router_planner.c index 716b7b543..4eef09f7d 100644 --- a/src/backend/distributed/planner/multi_router_planner.c +++ b/src/backend/distributed/planner/multi_router_planner.c @@ -562,27 +562,15 @@ ModifyQuerySupported(Query *queryTree, Query *originalQuery, bool multiShardQuer */ if (queryTree->hasSubLinks == true) { - /* - * We support UPDATE and DELETE with subqueries unless they are multi - * shard queries. - */ + /* we support subqueries for INSERTs only via INSERT INTO ... SELECT */ if (!UpdateOrDeleteQuery(queryTree)) { - StringInfo errorHint = makeStringInfo(); - DistTableCacheEntry *cacheEntry = DistributedTableCacheEntry( - distributedTableId); - char *partitionKeyString = cacheEntry->partitionKeyString; - char *partitionColumnName = ColumnNameToColumn(distributedTableId, - partitionKeyString); - - appendStringInfo(errorHint, - "Consider using an equality filter on partition column \"%s\" to target a single shard.", - partitionColumnName); + Assert(queryTree->commandType == CMD_INSERT); return DeferredError(ERRCODE_FEATURE_NOT_SUPPORTED, - "subqueries are not supported in modifications across " - "multiple shards", - errorHint->data, NULL); + "subqueries are not supported within INSERT queries", + NULL, "Try rewriting your queries with 'INSERT " + "INTO ... SELECT' syntax."); } } diff --git a/src/test/regress/expected/multi_modifications.out b/src/test/regress/expected/multi_modifications.out index 57518532b..d18cc51f7 100644 --- a/src/test/regress/expected/multi_modifications.out +++ b/src/test/regress/expected/multi_modifications.out @@ -1275,6 +1275,20 @@ SELECT * FROM summary_table ORDER BY id; ----+-----------+---------------+-------+--------- (0 rows) +-- we don't support subqueries in VALUES clause +INSERT INTO summary_table (id) VALUES ((SELECT id FROM summary_table)); +ERROR: subqueries are not supported within INSERT queries +HINT: Try rewriting your queries with 'INSERT INTO ... SELECT' syntax. +INSERT INTO summary_table (id) VALUES (5), ((SELECT id FROM summary_table)); +ERROR: subqueries are not supported within INSERT queries +HINT: Try rewriting your queries with 'INSERT INTO ... SELECT' syntax. +-- similar queries with reference tables +INSERT INTO reference_summary_table (id) VALUES ((SELECT id FROM summary_table)); +ERROR: subqueries are not supported within INSERT queries +HINT: Try rewriting your queries with 'INSERT INTO ... SELECT' syntax. +INSERT INTO summary_table (id) VALUES ((SELECT id FROM reference_summary_table)); +ERROR: subqueries are not supported within INSERT queries +HINT: Try rewriting your queries with 'INSERT INTO ... SELECT' syntax. DROP TABLE raw_table; DROP TABLE summary_table; DROP TABLE reference_raw_table; diff --git a/src/test/regress/expected/multi_upsert.out b/src/test/regress/expected/multi_upsert.out index a20b8194c..ef2808493 100644 --- a/src/test/regress/expected/multi_upsert.out +++ b/src/test/regress/expected/multi_upsert.out @@ -253,8 +253,8 @@ INSERT INTO dropcol_distributed AS dropcol (key, keep1) VALUES (1, '5') ON CONFL -- subquery in the SET clause INSERT INTO upsert_test (part_key, other_col) VALUES (1, 1) ON CONFLICT (part_key) DO UPDATE SET other_col = (SELECT count(*) from upsert_test); -ERROR: subqueries are not supported in modifications across multiple shards -DETAIL: Consider using an equality filter on partition column "part_key" to target a single shard. +ERROR: subqueries are not supported within INSERT queries +HINT: Try rewriting your queries with 'INSERT INTO ... SELECT' syntax. -- non mutable function call in the SET INSERT INTO upsert_test (part_key, other_col) VALUES (1, 1) ON CONFLICT (part_key) DO UPDATE SET other_col = random()::int; diff --git a/src/test/regress/sql/multi_modifications.sql b/src/test/regress/sql/multi_modifications.sql index ae9c2c6bb..bcbd1c59c 100644 --- a/src/test/regress/sql/multi_modifications.sql +++ b/src/test/regress/sql/multi_modifications.sql @@ -821,6 +821,14 @@ EXECUTE prepared_delete_with_join(6); SELECT * FROM summary_table ORDER BY id; +-- we don't support subqueries in VALUES clause +INSERT INTO summary_table (id) VALUES ((SELECT id FROM summary_table)); +INSERT INTO summary_table (id) VALUES (5), ((SELECT id FROM summary_table)); + +-- similar queries with reference tables +INSERT INTO reference_summary_table (id) VALUES ((SELECT id FROM summary_table)); +INSERT INTO summary_table (id) VALUES ((SELECT id FROM reference_summary_table)); + DROP TABLE raw_table; DROP TABLE summary_table; DROP TABLE reference_raw_table;