]> granicus.if.org Git - postgresql/commitdiff
Revert misguided change to postgres_fdw FOR UPDATE/SHARE code.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 12 Dec 2014 17:41:52 +0000 (12:41 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 12 Dec 2014 17:41:52 +0000 (12:41 -0500)
In commit 462bd95705a0c23ba0b0ba60a78d32566a0384c1, I changed postgres_fdw
to rely on get_plan_rowmark() instead of get_parse_rowmark().  I still
think that's a good idea in the long run, but as Etsuro Fujita pointed out,
it doesn't work today because planner.c forces PlanRowMarks to have
markType = ROW_MARK_COPY for all foreign tables.  There's no urgent reason
to change this in the back branches, so let's just revert that part of
yesterday's commit rather than trying to design a better solution under
time pressure.

Also, add a regression test case showing what postgres_fdw does with FOR
UPDATE/SHARE.  I'd blithely assumed there was one already, else I'd have
realized yesterday that this code didn't work.

contrib/postgres_fdw/expected/postgres_fdw.out
contrib/postgres_fdw/postgres_fdw.c
contrib/postgres_fdw/sql/postgres_fdw.sql

index 86ce334672627dab8b410d9fe3de309d42cd8340..10a9dd685a47ac3d87340020b72ee2b72016d67f 100644 (file)
@@ -231,6 +231,39 @@ SELECT * FROM ft1 t1 WHERE t1.c1 = 101 AND t1.c6 = '1' AND t1.c7 >= '1';
  101 |  1 | 00101 | Fri Jan 02 00:00:00 1970 PST | Fri Jan 02 00:00:00 1970 | 1  | 1          | foo
 (1 row)
 
+-- with FOR UPDATE/SHARE
+EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 t1 WHERE c1 = 101 FOR UPDATE;
+                                                   QUERY PLAN                                                   
+----------------------------------------------------------------------------------------------------------------
+ LockRows
+   Output: c1, c2, c3, c4, c5, c6, c7, c8, t1.*
+   ->  Foreign Scan on public.ft1 t1
+         Output: c1, c2, c3, c4, c5, c6, c7, c8, t1.*
+         Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" = 101)) FOR UPDATE
+(5 rows)
+
+SELECT * FROM ft1 t1 WHERE c1 = 101 FOR UPDATE;
+ c1  | c2 |  c3   |              c4              |            c5            | c6 |     c7     | c8  
+-----+----+-------+------------------------------+--------------------------+----+------------+-----
+ 101 |  1 | 00101 | Fri Jan 02 00:00:00 1970 PST | Fri Jan 02 00:00:00 1970 | 1  | 1          | foo
+(1 row)
+
+EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 t1 WHERE c1 = 102 FOR SHARE;
+                                                  QUERY PLAN                                                   
+---------------------------------------------------------------------------------------------------------------
+ LockRows
+   Output: c1, c2, c3, c4, c5, c6, c7, c8, t1.*
+   ->  Foreign Scan on public.ft1 t1
+         Output: c1, c2, c3, c4, c5, c6, c7, c8, t1.*
+         Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" = 102)) FOR SHARE
+(5 rows)
+
+SELECT * FROM ft1 t1 WHERE c1 = 102 FOR SHARE;
+ c1  | c2 |  c3   |              c4              |            c5            | c6 |     c7     | c8  
+-----+----+-------+------------------------------+--------------------------+----+------------+-----
+ 102 |  2 | 00102 | Sat Jan 03 00:00:00 1970 PST | Sat Jan 03 00:00:00 1970 | 2  | 2          | foo
+(1 row)
+
 -- aggregate
 SELECT COUNT(*) FROM ft1 t1;
  count 
index c3a683715a422beb725b916fde148db60987ecee..7dd43a993798467e08a8e187f92b0951ab5960bf 100644 (file)
@@ -817,7 +817,7 @@ postgresGetForeignPlan(PlannerInfo *root,
        }
        else
        {
-               PlanRowMark *rc = get_plan_rowmark(root->rowMarks, baserel->relid);
+               RowMarkClause *rc = get_parse_rowmark(root->parse, baserel->relid);
 
                if (rc)
                {
@@ -830,18 +830,15 @@ postgresGetForeignPlan(PlannerInfo *root,
                         * complete information about, and (b) it wouldn't work anyway on
                         * older remote servers.  Likewise, we don't worry about NOWAIT.
                         */
-                       switch (rc->markType)
+                       switch (rc->strength)
                        {
-                               case ROW_MARK_EXCLUSIVE:
-                               case ROW_MARK_NOKEYEXCLUSIVE:
-                                       appendStringInfoString(&sql, " FOR UPDATE");
-                                       break;
-                               case ROW_MARK_SHARE:
-                               case ROW_MARK_KEYSHARE:
+                               case LCS_FORKEYSHARE:
+                               case LCS_FORSHARE:
                                        appendStringInfoString(&sql, " FOR SHARE");
                                        break;
-                               default:
-                                       /* nothing needed */
+                               case LCS_FORNOKEYUPDATE:
+                               case LCS_FORUPDATE:
+                                       appendStringInfoString(&sql, " FOR UPDATE");
                                        break;
                        }
                }
index d422884f308b5be7230bc21737df785124b05a21..3c15d9a7daf4f05d89865344bd33c2ce0b534c66 100644 (file)
@@ -145,6 +145,11 @@ SELECT * FROM ft1 WHERE false;
 -- with WHERE clause
 EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 t1 WHERE t1.c1 = 101 AND t1.c6 = '1' AND t1.c7 >= '1';
 SELECT * FROM ft1 t1 WHERE t1.c1 = 101 AND t1.c6 = '1' AND t1.c7 >= '1';
+-- with FOR UPDATE/SHARE
+EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 t1 WHERE c1 = 101 FOR UPDATE;
+SELECT * FROM ft1 t1 WHERE c1 = 101 FOR UPDATE;
+EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 t1 WHERE c1 = 102 FOR SHARE;
+SELECT * FROM ft1 t1 WHERE c1 = 102 FOR SHARE;
 -- aggregate
 SELECT COUNT(*) FROM ft1 t1;
 -- join two tables