CREATE SCHEMA modification_correctness;
SET search_path to 'modification_correctness';
CREATE TABLE test(k int, a int, b int, c int unique, d int, e int);
ALTER TABLE test DROP column k;
SELECT create_distributed_table('test', 'c');
 create_distributed_table
---------------------------------------------------------------------

(1 row)

ALTER TABLE test DROP column b;
UPDATE test SET a = 5, c = 5;
ERROR:  modifying the partition value of rows is not allowed
UPDATE test SET a = 5, c = d, d =3;
ERROR:  modifying the partition value of rows is not allowed
UPDATE test SET c = d, d =3;
ERROR:  modifying the partition value of rows is not allowed
UPDATE test SET d=c, c = d;
ERROR:  modifying the partition value of rows is not allowed
UPDATE test SET e = c, d = 3;
UPDATE test SET c = c;
UPDATE test SET c = c, c = 3;
ERROR:  multiple assignments to same column "c"
UPDATE test SET c = c, d = c;
UPDATE test SET c = c, d = 5, e = 3;
INSERT INTO test (c,d) VALUES(3,4) ON CONFLICT(c) DO UPDATE SET c=7;
ERROR:  modifying the partition value of rows is not allowed
INSERT INTO test (c,d) VALUES(3,4) ON CONFLICT(c) DO UPDATE SET d=7;
INSERT INTO test (c,d) VALUES(3,4) ON CONFLICT(c) DO UPDATE SET a=7;
INSERT INTO test (d,c) VALUES(3,4) ON CONFLICT(c) DO UPDATE SET c=7;
ERROR:  modifying the partition value of rows is not allowed
INSERT INTO test (d,c) VALUES(3,4) ON CONFLICT(c) DO UPDATE SET d=7;
INSERT INTO test (a,c) VALUES(3,4) ON CONFLICT(c) DO UPDATE SET d=7;
INSERT INTO test (c) VALUES(3) ON CONFLICT(c) DO UPDATE SET d=7;
INSERT INTO test (c,a) VALUES(3,4) ON CONFLICT(c) DO UPDATE SET d=7;
INSERT INTO test (c,a) VALUES(3,4) ON CONFLICT(c) DO UPDATE SET c=EXCLUDED.c, d = EXCLUDED.c;
INSERT INTO test (c,a) VALUES(3,4) ON CONFLICT(c) DO UPDATE SET c=EXCLUDED.c, d = EXCLUDED.c, e = EXCLUDED.c;
INSERT INTO test (c,a) VALUES(3,4) ON CONFLICT(c) DO UPDATE SET c=EXCLUDED.c, d = EXCLUDED.c, e = 7;
-- make sure that without fast path planner, we don't get any unexpected errors.
SET citus.enable_fast_path_router_planner to false;
INSERT INTO test (c,a) VALUES(3,4) ON CONFLICT(c) DO UPDATE SET d=7;
INSERT INTO test (c,a) VALUES(3,4) ON CONFLICT(c) DO UPDATE SET c=EXCLUDED.c, d = EXCLUDED.c;
INSERT INTO test (c,a) VALUES(3,4) ON CONFLICT(c) DO UPDATE SET c=EXCLUDED.c, d = EXCLUDED.c, e = EXCLUDED.c;
INSERT INTO test (c,a) VALUES(3,4) ON CONFLICT(c) DO UPDATE SET c=EXCLUDED.c, d = EXCLUDED.c, e = 7;
UPDATE test SET e = c, d = 3;
UPDATE test SET c = c;
UPDATE test SET c = c, c = 3;
ERROR:  multiple assignments to same column "c"
UPDATE test SET c = c, d = c;
UPDATE test SET c = c, d = 5, e = 3;
RESET citus.enable_fast_path_router_planner;
PREPARE foo(int,int) AS INSERT INTO test (c,a) VALUES($1,$2) ON CONFLICT(c) DO UPDATE SET c=EXCLUDED.c, d = EXCLUDED.c, e = $1;
EXECUTE foo(1,2);
EXECUTE foo(1,2);
EXECUTE foo(1,2);
EXECUTE foo(1,2);
EXECUTE foo(1,2);
EXECUTE foo(1,2);
EXECUTE foo(1,2);
PREPARE foo1(int, int) AS UPDATE test SET c = c, d = $1, e = $2;
EXECUTE foo1(1,2);
EXECUTE foo1(1,2);
EXECUTE foo1(1,2);
EXECUTE foo1(1,2);
EXECUTE foo1(1,2);
EXECUTE foo1(1,2);
EXECUTE foo1(1,2);
-- we don't get an error because this is something like c = c
UPDATE test SET a = 5,d  = 2, c = 5 FROM (SELECT * FROM test LIMIT 10) t2 WHERE t2.d = test.c  and test.c = 5;
-- we should get an error because c gets 6 -> 5
UPDATE test SET a = 5,d  = 2, c = 5 FROM (SELECT * FROM test LIMIT 10) t2 WHERE t2.d = test.c  and test.c = 6;
ERROR:  modifying the partition value of rows is not allowed
DROP SCHEMA modification_correctness CASCADE;
NOTICE:  drop cascades to table test
