mirror of https://github.com/citusdata/citus.git
Merge pull request #2150 from citusdata/modify_volatility_check
Check volatile functions in modify queriespull/2151/head
commit
5b079c125b
|
@ -939,6 +939,13 @@ MultiShardModifyQuerySupported(Query *originalQuery,
|
||||||
"ON instead",
|
"ON instead",
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
}
|
}
|
||||||
|
else if (FindNodeCheck((Node *) originalQuery, CitusIsVolatileFunction))
|
||||||
|
{
|
||||||
|
errorMessage = DeferredError(ERRCODE_FEATURE_NOT_SUPPORTED,
|
||||||
|
"functions used in UPDATE queries on distributed "
|
||||||
|
"tables must not be VOLATILE",
|
||||||
|
NULL, NULL);
|
||||||
|
}
|
||||||
else if (resultPartitionMethod == DISTRIBUTE_BY_NONE)
|
else if (resultPartitionMethod == DISTRIBUTE_BY_NONE)
|
||||||
{
|
{
|
||||||
errorMessage = DeferredError(ERRCODE_FEATURE_NOT_SUPPORTED,
|
errorMessage = DeferredError(ERRCODE_FEATURE_NOT_SUPPORTED,
|
||||||
|
|
|
@ -699,10 +699,26 @@ SET value_2 = 5 * random()
|
||||||
FROM events_test_table
|
FROM events_test_table
|
||||||
WHERE users_test_table.user_id = events_test_table.user_id;
|
WHERE users_test_table.user_id = events_test_table.user_id;
|
||||||
ERROR: functions used in UPDATE queries on distributed tables must not be VOLATILE
|
ERROR: functions used in UPDATE queries on distributed tables must not be VOLATILE
|
||||||
|
-- Recursive modify planner does not take care of following test because the query
|
||||||
|
-- is fully pushdownable, yet not allowed because it would lead to inconsistent replicas.
|
||||||
|
UPDATE users_test_table
|
||||||
|
SET value_2 = subquery.random FROM (SELECT user_id, random()
|
||||||
|
FROM events_test_table) subquery
|
||||||
|
WHERE users_test_table.user_id = subquery.user_id;
|
||||||
|
ERROR: functions used in UPDATE queries on distributed tables must not be VOLATILE
|
||||||
-- Volatile functions in a subquery are recursively planned
|
-- Volatile functions in a subquery are recursively planned
|
||||||
UPDATE users_test_table
|
UPDATE users_test_table
|
||||||
SET value_2 = 5
|
SET value_2 = 5
|
||||||
WHERE users_test_table.user_id IN (SELECT user_id * random() FROM events_test_table);
|
WHERE users_test_table.user_id IN (SELECT user_id * random() FROM events_test_table);
|
||||||
|
UPDATE users_test_table
|
||||||
|
SET value_2 = subquery.random FROM (SELECT user_id, random()
|
||||||
|
FROM events_test_table) subquery;
|
||||||
|
UPDATE users_test_table
|
||||||
|
SET value_2 = subquery.random FROM (SELECT user_id, random()
|
||||||
|
FROM events_test_table OFFSET 0) subquery
|
||||||
|
WHERE users_test_table.user_id = subquery.user_id;
|
||||||
|
-- Make following tests consistent
|
||||||
|
UPDATE users_test_table SET value_2 = 0;
|
||||||
-- Local tables are not supported
|
-- Local tables are not supported
|
||||||
UPDATE users_test_table
|
UPDATE users_test_table
|
||||||
SET value_2 = 5
|
SET value_2 = 5
|
||||||
|
@ -738,7 +754,7 @@ DECLARE test_cursor CURSOR FOR SELECT * FROM users_test_table;
|
||||||
FETCH test_cursor;
|
FETCH test_cursor;
|
||||||
user_id | value_1 | value_2 | value_3
|
user_id | value_1 | value_2 | value_3
|
||||||
---------+---------+---------+---------
|
---------+---------+---------+---------
|
||||||
8 | 4 | 13 | 0
|
8 | 4 | 0 | 0
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
UPDATE users_test_table SET value_2 = 5 WHERE CURRENT OF test_cursor;
|
UPDATE users_test_table SET value_2 = 5 WHERE CURRENT OF test_cursor;
|
||||||
|
|
|
@ -722,10 +722,26 @@ SET value_2 = 5 * random()
|
||||||
FROM events_test_table
|
FROM events_test_table
|
||||||
WHERE users_test_table.user_id = events_test_table.user_id;
|
WHERE users_test_table.user_id = events_test_table.user_id;
|
||||||
ERROR: functions used in UPDATE queries on distributed tables must not be VOLATILE
|
ERROR: functions used in UPDATE queries on distributed tables must not be VOLATILE
|
||||||
|
-- Recursive modify planner does not take care of following test because the query
|
||||||
|
-- is fully pushdownable, yet not allowed because it would lead to inconsistent replicas.
|
||||||
|
UPDATE users_test_table
|
||||||
|
SET value_2 = subquery.random FROM (SELECT user_id, random()
|
||||||
|
FROM events_test_table) subquery
|
||||||
|
WHERE users_test_table.user_id = subquery.user_id;
|
||||||
|
ERROR: functions used in UPDATE queries on distributed tables must not be VOLATILE
|
||||||
-- Volatile functions in a subquery are recursively planned
|
-- Volatile functions in a subquery are recursively planned
|
||||||
UPDATE users_test_table
|
UPDATE users_test_table
|
||||||
SET value_2 = 5
|
SET value_2 = 5
|
||||||
WHERE users_test_table.user_id IN (SELECT user_id * random() FROM events_test_table);
|
WHERE users_test_table.user_id IN (SELECT user_id * random() FROM events_test_table);
|
||||||
|
UPDATE users_test_table
|
||||||
|
SET value_2 = subquery.random FROM (SELECT user_id, random()
|
||||||
|
FROM events_test_table) subquery;
|
||||||
|
UPDATE users_test_table
|
||||||
|
SET value_2 = subquery.random FROM (SELECT user_id, random()
|
||||||
|
FROM events_test_table OFFSET 0) subquery
|
||||||
|
WHERE users_test_table.user_id = subquery.user_id;
|
||||||
|
-- Make following tests consistent
|
||||||
|
UPDATE users_test_table SET value_2 = 0;
|
||||||
-- Local tables are not supported
|
-- Local tables are not supported
|
||||||
UPDATE users_test_table
|
UPDATE users_test_table
|
||||||
SET value_2 = 5
|
SET value_2 = 5
|
||||||
|
@ -761,7 +777,7 @@ DECLARE test_cursor CURSOR FOR SELECT * FROM users_test_table;
|
||||||
FETCH test_cursor;
|
FETCH test_cursor;
|
||||||
user_id | value_1 | value_2 | value_3
|
user_id | value_1 | value_2 | value_3
|
||||||
---------+---------+---------+---------
|
---------+---------+---------+---------
|
||||||
8 | 4 | 13 | 0
|
8 | 4 | 0 | 0
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
UPDATE users_test_table SET value_2 = 5 WHERE CURRENT OF test_cursor;
|
UPDATE users_test_table SET value_2 = 5 WHERE CURRENT OF test_cursor;
|
||||||
|
|
|
@ -580,11 +580,30 @@ SET value_2 = 5 * random()
|
||||||
FROM events_test_table
|
FROM events_test_table
|
||||||
WHERE users_test_table.user_id = events_test_table.user_id;
|
WHERE users_test_table.user_id = events_test_table.user_id;
|
||||||
|
|
||||||
|
-- Recursive modify planner does not take care of following test because the query
|
||||||
|
-- is fully pushdownable, yet not allowed because it would lead to inconsistent replicas.
|
||||||
|
UPDATE users_test_table
|
||||||
|
SET value_2 = subquery.random FROM (SELECT user_id, random()
|
||||||
|
FROM events_test_table) subquery
|
||||||
|
WHERE users_test_table.user_id = subquery.user_id;
|
||||||
|
|
||||||
-- Volatile functions in a subquery are recursively planned
|
-- Volatile functions in a subquery are recursively planned
|
||||||
UPDATE users_test_table
|
UPDATE users_test_table
|
||||||
SET value_2 = 5
|
SET value_2 = 5
|
||||||
WHERE users_test_table.user_id IN (SELECT user_id * random() FROM events_test_table);
|
WHERE users_test_table.user_id IN (SELECT user_id * random() FROM events_test_table);
|
||||||
|
|
||||||
|
UPDATE users_test_table
|
||||||
|
SET value_2 = subquery.random FROM (SELECT user_id, random()
|
||||||
|
FROM events_test_table) subquery;
|
||||||
|
|
||||||
|
UPDATE users_test_table
|
||||||
|
SET value_2 = subquery.random FROM (SELECT user_id, random()
|
||||||
|
FROM events_test_table OFFSET 0) subquery
|
||||||
|
WHERE users_test_table.user_id = subquery.user_id;
|
||||||
|
|
||||||
|
-- Make following tests consistent
|
||||||
|
UPDATE users_test_table SET value_2 = 0;
|
||||||
|
|
||||||
-- Local tables are not supported
|
-- Local tables are not supported
|
||||||
UPDATE users_test_table
|
UPDATE users_test_table
|
||||||
SET value_2 = 5
|
SET value_2 = 5
|
||||||
|
|
Loading…
Reference in New Issue