mirror of
https://github.com/postgres/postgres.git
synced 2025-06-11 20:28:21 +03:00
In postgres_fdw, don't try to ship MULTIEXPR updates to remote server.
In a statement like "UPDATE remote_tab SET (x,y) = (SELECT ...)", we'd conclude that the statement could be directly executed remotely, because the sub-SELECT is in a resjunk tlist item that's not examined for shippability. Currently that ends up crashing if the sub-SELECT contains any remote Vars. Prevent the crash by deeming MULTIEXEC Params to be unshippable. This is a bit of a brute-force solution, since if the sub-SELECT *doesn't* contain any remote Vars, the current execution technology would work; but that's not a terribly common use-case for this syntax, I think. In any case, we generally don't try to ship sub-SELECTs, so it won't surprise anybody that this doesn't end up as a remote direct update. I'd be inclined to see if that general limitation can be fixed before worrying about this case further. Per report from Lukáš Sobotka. Back-patch to 9.6. 9.5 had MULTIEXPR, but we didn't try to perform remote direct updates then, so the case didn't arise anyway. Discussion: https://postgr.es/m/CAJif3k+iA_ekBB5Zw2hDBaE1wtiQa4LH4_JUXrrMGwTrH0J01Q@mail.gmail.com
This commit is contained in:
@ -784,6 +784,26 @@ EXPLAIN (verbose, costs off)
|
||||
DELETE FROM ft2 WHERE c1 = 9999 RETURNING tableoid::regclass; -- can be pushed down
|
||||
DELETE FROM ft2 WHERE c1 = 9999 RETURNING tableoid::regclass;
|
||||
|
||||
-- Test UPDATE with a MULTIEXPR sub-select
|
||||
-- (maybe someday this'll be remotely executable, but not today)
|
||||
EXPLAIN (verbose, costs off)
|
||||
UPDATE ft2 AS target SET (c2, c7) = (
|
||||
SELECT c2 * 10, c7
|
||||
FROM ft2 AS src
|
||||
WHERE target.c1 = src.c1
|
||||
) WHERE c1 > 1100;
|
||||
UPDATE ft2 AS target SET (c2, c7) = (
|
||||
SELECT c2 * 10, c7
|
||||
FROM ft2 AS src
|
||||
WHERE target.c1 = src.c1
|
||||
) WHERE c1 > 1100;
|
||||
|
||||
UPDATE ft2 AS target SET (c2) = (
|
||||
SELECT c2 / 10
|
||||
FROM ft2 AS src
|
||||
WHERE target.c1 = src.c1
|
||||
) WHERE c1 > 1100;
|
||||
|
||||
-- Test that trigger on remote table works as expected
|
||||
CREATE OR REPLACE FUNCTION "S 1".F_BRTRIG() RETURNS trigger AS $$
|
||||
BEGIN
|
||||
|
Reference in New Issue
Block a user