-- ===================================================================
-- create FDW objects
-- ===================================================================
CREATE EXTENSION postgres_fdw;
CREATE SERVER testserver1 FOREIGN DATA WRAPPER postgres_fdw;
CREATE SERVER loopback FOREIGN DATA WRAPPER postgres_fdw
  OPTIONS (dbname 'contrib_regression');
CREATE USER MAPPING FOR public SERVER testserver1
	OPTIONS (user 'value', password 'value');
CREATE USER MAPPING FOR CURRENT_USER SERVER loopback;
-- ===================================================================
-- create objects used through FDW loopback server
-- ===================================================================
CREATE TYPE user_enum AS ENUM ('foo', 'bar', 'buz');
CREATE SCHEMA "S 1";
CREATE TABLE "S 1"."T 1" (
	"C 1" int NOT NULL,
	c2 int NOT NULL,
	c3 text,
	c4 timestamptz,
	c5 timestamp,
	c6 varchar(10),
	c7 char(10),
	c8 user_enum,
	CONSTRAINT t1_pkey PRIMARY KEY ("C 1")
);
CREATE TABLE "S 1"."T 2" (
	c1 int NOT NULL,
	c2 text,
	CONSTRAINT t2_pkey PRIMARY KEY (c1)
);
INSERT INTO "S 1"."T 1"
	SELECT id,
	       id % 10,
	       to_char(id, 'FM00000'),
	       '1970-01-01'::timestamptz + ((id % 100) || ' days')::interval,
	       '1970-01-01'::timestamp + ((id % 100) || ' days')::interval,
	       id % 10,
	       id % 10,
	       'foo'::user_enum
	FROM generate_series(1, 1000) id;
INSERT INTO "S 1"."T 2"
	SELECT id,
	       'AAA' || to_char(id, 'FM000')
	FROM generate_series(1, 100) id;
ANALYZE "S 1"."T 1";
ANALYZE "S 1"."T 2";
-- ===================================================================
-- create foreign tables
-- ===================================================================
CREATE FOREIGN TABLE ft1 (
	c0 int,
	c1 int NOT NULL,
	c2 int NOT NULL,
	c3 text,
	c4 timestamptz,
	c5 timestamp,
	c6 varchar(10),
	c7 char(10) default 'ft1',
	c8 user_enum
) SERVER loopback;
ALTER FOREIGN TABLE ft1 DROP COLUMN c0;
CREATE FOREIGN TABLE ft2 (
	c1 int NOT NULL,
	c2 int NOT NULL,
	cx int,
	c3 text,
	c4 timestamptz,
	c5 timestamp,
	c6 varchar(10),
	c7 char(10) default 'ft2',
	c8 user_enum
) SERVER loopback;
ALTER FOREIGN TABLE ft2 DROP COLUMN cx;
-- ===================================================================
-- tests for validator
-- ===================================================================
-- requiressl, krbsrvname and gsslib are omitted because they depend on
-- configure options
ALTER SERVER testserver1 OPTIONS (
	use_remote_estimate 'false',
	updatable 'true',
	fdw_startup_cost '123.456',
	fdw_tuple_cost '0.123',
	service 'value',
	connect_timeout 'value',
	dbname 'value',
	host 'value',
	hostaddr 'value',
	port 'value',
	--client_encoding 'value',
	application_name 'value',
	--fallback_application_name 'value',
	keepalives 'value',
	keepalives_idle 'value',
	keepalives_interval 'value',
	-- requiressl 'value',
	sslcompression 'value',
	sslmode 'value',
	sslcert 'value',
	sslkey 'value',
	sslrootcert 'value',
	sslcrl 'value'
	--requirepeer 'value',
	-- krbsrvname 'value',
	-- gsslib 'value',
	--replication 'value'
);
ALTER USER MAPPING FOR public SERVER testserver1
	OPTIONS (DROP user, DROP password);
ALTER FOREIGN TABLE ft1 OPTIONS (schema_name 'S 1', table_name 'T 1');
ALTER FOREIGN TABLE ft2 OPTIONS (schema_name 'S 1', table_name 'T 1');
ALTER FOREIGN TABLE ft1 ALTER COLUMN c1 OPTIONS (column_name 'C 1');
ALTER FOREIGN TABLE ft2 ALTER COLUMN c1 OPTIONS (column_name 'C 1');
\det+
                             List of foreign tables
 Schema | Table |  Server  |              FDW Options              | Description 
--------+-------+----------+---------------------------------------+-------------
 public | ft1   | loopback | (schema_name 'S 1', table_name 'T 1') | 
 public | ft2   | loopback | (schema_name 'S 1', table_name 'T 1') | 
(2 rows)

-- Now we should be able to run ANALYZE.
-- To exercise multiple code paths, we use local stats on ft1
-- and remote-estimate mode on ft2.
ANALYZE ft1;
ALTER FOREIGN TABLE ft2 OPTIONS (use_remote_estimate 'true');
-- ===================================================================
-- simple queries
-- ===================================================================
-- single table, with/without alias
EXPLAIN (COSTS false) SELECT * FROM ft1 ORDER BY c3, c1 OFFSET 100 LIMIT 10;
           QUERY PLAN            
---------------------------------
 Limit
   ->  Sort
         Sort Key: c3, c1
         ->  Foreign Scan on ft1
(4 rows)

SELECT * FROM ft1 ORDER BY c3, c1 OFFSET 100 LIMIT 10;
 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
 102 |  2 | 00102 | Sat Jan 03 00:00:00 1970 PST | Sat Jan 03 00:00:00 1970 | 2  | 2          | foo
 103 |  3 | 00103 | Sun Jan 04 00:00:00 1970 PST | Sun Jan 04 00:00:00 1970 | 3  | 3          | foo
 104 |  4 | 00104 | Mon Jan 05 00:00:00 1970 PST | Mon Jan 05 00:00:00 1970 | 4  | 4          | foo
 105 |  5 | 00105 | Tue Jan 06 00:00:00 1970 PST | Tue Jan 06 00:00:00 1970 | 5  | 5          | foo
 106 |  6 | 00106 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6  | 6          | foo
 107 |  7 | 00107 | Thu Jan 08 00:00:00 1970 PST | Thu Jan 08 00:00:00 1970 | 7  | 7          | foo
 108 |  8 | 00108 | Fri Jan 09 00:00:00 1970 PST | Fri Jan 09 00:00:00 1970 | 8  | 8          | foo
 109 |  9 | 00109 | Sat Jan 10 00:00:00 1970 PST | Sat Jan 10 00:00:00 1970 | 9  | 9          | foo
 110 |  0 | 00110 | Sun Jan 11 00:00:00 1970 PST | Sun Jan 11 00:00:00 1970 | 0  | 0          | foo
(10 rows)

EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 t1 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
                                     QUERY PLAN                                      
-------------------------------------------------------------------------------------
 Limit
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   ->  Sort
         Output: c1, c2, c3, c4, c5, c6, c7, c8
         Sort Key: t1.c3, t1.c1
         ->  Foreign Scan on public.ft1 t1
               Output: c1, c2, c3, c4, c5, c6, c7, c8
               Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1"
(8 rows)

SELECT * FROM ft1 t1 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
 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
 102 |  2 | 00102 | Sat Jan 03 00:00:00 1970 PST | Sat Jan 03 00:00:00 1970 | 2  | 2          | foo
 103 |  3 | 00103 | Sun Jan 04 00:00:00 1970 PST | Sun Jan 04 00:00:00 1970 | 3  | 3          | foo
 104 |  4 | 00104 | Mon Jan 05 00:00:00 1970 PST | Mon Jan 05 00:00:00 1970 | 4  | 4          | foo
 105 |  5 | 00105 | Tue Jan 06 00:00:00 1970 PST | Tue Jan 06 00:00:00 1970 | 5  | 5          | foo
 106 |  6 | 00106 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6  | 6          | foo
 107 |  7 | 00107 | Thu Jan 08 00:00:00 1970 PST | Thu Jan 08 00:00:00 1970 | 7  | 7          | foo
 108 |  8 | 00108 | Fri Jan 09 00:00:00 1970 PST | Fri Jan 09 00:00:00 1970 | 8  | 8          | foo
 109 |  9 | 00109 | Sat Jan 10 00:00:00 1970 PST | Sat Jan 10 00:00:00 1970 | 9  | 9          | foo
 110 |  0 | 00110 | Sun Jan 11 00:00:00 1970 PST | Sun Jan 11 00:00:00 1970 | 0  | 0          | foo
(10 rows)

-- whole-row reference
EXPLAIN (VERBOSE, COSTS false) SELECT t1 FROM ft1 t1 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
                                     QUERY PLAN                                      
-------------------------------------------------------------------------------------
 Limit
   Output: t1.*, c3, c1
   ->  Sort
         Output: t1.*, c3, c1
         Sort Key: t1.c3, t1.c1
         ->  Foreign Scan on public.ft1 t1
               Output: t1.*, c3, c1
               Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1"
(8 rows)

SELECT t1 FROM ft1 t1 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
                                             t1                                             
--------------------------------------------------------------------------------------------
 (101,1,00101,"Fri Jan 02 00:00:00 1970 PST","Fri Jan 02 00:00:00 1970",1,"1         ",foo)
 (102,2,00102,"Sat Jan 03 00:00:00 1970 PST","Sat Jan 03 00:00:00 1970",2,"2         ",foo)
 (103,3,00103,"Sun Jan 04 00:00:00 1970 PST","Sun Jan 04 00:00:00 1970",3,"3         ",foo)
 (104,4,00104,"Mon Jan 05 00:00:00 1970 PST","Mon Jan 05 00:00:00 1970",4,"4         ",foo)
 (105,5,00105,"Tue Jan 06 00:00:00 1970 PST","Tue Jan 06 00:00:00 1970",5,"5         ",foo)
 (106,6,00106,"Wed Jan 07 00:00:00 1970 PST","Wed Jan 07 00:00:00 1970",6,"6         ",foo)
 (107,7,00107,"Thu Jan 08 00:00:00 1970 PST","Thu Jan 08 00:00:00 1970",7,"7         ",foo)
 (108,8,00108,"Fri Jan 09 00:00:00 1970 PST","Fri Jan 09 00:00:00 1970",8,"8         ",foo)
 (109,9,00109,"Sat Jan 10 00:00:00 1970 PST","Sat Jan 10 00:00:00 1970",9,"9         ",foo)
 (110,0,00110,"Sun Jan 11 00:00:00 1970 PST","Sun Jan 11 00:00:00 1970",0,"0         ",foo)
(10 rows)

-- empty result
SELECT * FROM ft1 WHERE false;
 c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8 
----+----+----+----+----+----+----+----
(0 rows)

-- with WHERE clause
EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 t1 WHERE t1.c1 = 101 AND t1.c6 = '1' AND t1.c7 >= '1';
                                                                   QUERY PLAN                                                                   
------------------------------------------------------------------------------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE ((c7 >= '1'::bpchar)) AND (("C 1" = 101)) AND ((c6 = '1'::text))
(3 rows)

SELECT * FROM ft1 t1 WHERE t1.c1 = 101 AND t1.c6 = '1' AND t1.c7 >= '1';
 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)

-- aggregate
SELECT COUNT(*) FROM ft1 t1;
 count 
-------
  1000
(1 row)

-- join two tables
SELECT t1.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
 c1  
-----
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
(10 rows)

-- subquery
SELECT * FROM ft1 t1 WHERE t1.c3 IN (SELECT c3 FROM ft2 t2 WHERE c1 <= 10) ORDER BY c1;
 c1 | c2 |  c3   |              c4              |            c5            | c6 |     c7     | c8  
----+----+-------+------------------------------+--------------------------+----+------------+-----
  1 |  1 | 00001 | Fri Jan 02 00:00:00 1970 PST | Fri Jan 02 00:00:00 1970 | 1  | 1          | foo
  2 |  2 | 00002 | Sat Jan 03 00:00:00 1970 PST | Sat Jan 03 00:00:00 1970 | 2  | 2          | foo
  3 |  3 | 00003 | Sun Jan 04 00:00:00 1970 PST | Sun Jan 04 00:00:00 1970 | 3  | 3          | foo
  4 |  4 | 00004 | Mon Jan 05 00:00:00 1970 PST | Mon Jan 05 00:00:00 1970 | 4  | 4          | foo
  5 |  5 | 00005 | Tue Jan 06 00:00:00 1970 PST | Tue Jan 06 00:00:00 1970 | 5  | 5          | foo
  6 |  6 | 00006 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6  | 6          | foo
  7 |  7 | 00007 | Thu Jan 08 00:00:00 1970 PST | Thu Jan 08 00:00:00 1970 | 7  | 7          | foo
  8 |  8 | 00008 | Fri Jan 09 00:00:00 1970 PST | Fri Jan 09 00:00:00 1970 | 8  | 8          | foo
  9 |  9 | 00009 | Sat Jan 10 00:00:00 1970 PST | Sat Jan 10 00:00:00 1970 | 9  | 9          | foo
 10 |  0 | 00010 | Sun Jan 11 00:00:00 1970 PST | Sun Jan 11 00:00:00 1970 | 0  | 0          | foo
(10 rows)

-- subquery+MAX
SELECT * FROM ft1 t1 WHERE t1.c3 = (SELECT MAX(c3) FROM ft2 t2) ORDER BY c1;
  c1  | c2 |  c3   |              c4              |            c5            | c6 |     c7     | c8  
------+----+-------+------------------------------+--------------------------+----+------------+-----
 1000 |  0 | 01000 | Thu Jan 01 00:00:00 1970 PST | Thu Jan 01 00:00:00 1970 | 0  | 0          | foo
(1 row)

-- used in CTE
WITH t1 AS (SELECT * FROM ft1 WHERE c1 <= 10) SELECT t2.c1, t2.c2, t2.c3, t2.c4 FROM t1, ft2 t2 WHERE t1.c1 = t2.c1 ORDER BY t1.c1;
 c1 | c2 |  c3   |              c4              
----+----+-------+------------------------------
  1 |  1 | 00001 | Fri Jan 02 00:00:00 1970 PST
  2 |  2 | 00002 | Sat Jan 03 00:00:00 1970 PST
  3 |  3 | 00003 | Sun Jan 04 00:00:00 1970 PST
  4 |  4 | 00004 | Mon Jan 05 00:00:00 1970 PST
  5 |  5 | 00005 | Tue Jan 06 00:00:00 1970 PST
  6 |  6 | 00006 | Wed Jan 07 00:00:00 1970 PST
  7 |  7 | 00007 | Thu Jan 08 00:00:00 1970 PST
  8 |  8 | 00008 | Fri Jan 09 00:00:00 1970 PST
  9 |  9 | 00009 | Sat Jan 10 00:00:00 1970 PST
 10 |  0 | 00010 | Sun Jan 11 00:00:00 1970 PST
(10 rows)

-- fixed values
SELECT 'fixed', NULL FROM ft1 t1 WHERE c1 = 1;
 ?column? | ?column? 
----------+----------
 fixed    | 
(1 row)

-- user-defined operator/function
CREATE FUNCTION postgres_fdw_abs(int) RETURNS int AS $$
BEGIN
RETURN abs($1);
END
$$ LANGUAGE plpgsql IMMUTABLE;
CREATE OPERATOR === (
    LEFTARG = int,
    RIGHTARG = int,
    PROCEDURE = int4eq,
    COMMUTATOR = ===,
    NEGATOR = !==
);
EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 t1 WHERE t1.c1 = postgres_fdw_abs(t1.c2);
                               QUERY PLAN                                
-------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Filter: (t1.c1 = postgres_fdw_abs(t1.c2))
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1"
(4 rows)

EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 t1 WHERE t1.c1 === t1.c2;
                               QUERY PLAN                                
-------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Filter: (t1.c1 === t1.c2)
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1"
(4 rows)

EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 t1 WHERE t1.c1 = abs(t1.c2);
                                            QUERY PLAN                                             
---------------------------------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" = abs(c2)))
(3 rows)

EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 t1 WHERE t1.c1 = t1.c2;
                                          QUERY PLAN                                          
----------------------------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" = c2))
(3 rows)

-- ===================================================================
-- WHERE with remotely-executable conditions
-- ===================================================================
EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 t1 WHERE t1.c1 = 1;         -- Var, OpExpr(b), Const
                                         QUERY PLAN                                          
---------------------------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" = 1))
(3 rows)

EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 t1 WHERE t1.c1 = 100 AND t1.c2 = 0; -- BoolExpr
                                                  QUERY PLAN                                                  
--------------------------------------------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" = 100)) AND ((c2 = 0))
(3 rows)

EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 t1 WHERE c1 IS NULL;        -- NullTest
                                           QUERY PLAN                                            
-------------------------------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" IS NULL))
(3 rows)

EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 t1 WHERE c1 IS NOT NULL;    -- NullTest
                                             QUERY PLAN                                              
-----------------------------------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" IS NOT NULL))
(3 rows)

EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 t1 WHERE round(abs(c1), 0) = 1; -- FuncExpr
                                                     QUERY PLAN                                                      
---------------------------------------------------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE ((round(abs("C 1"), 0) = 1::numeric))
(3 rows)

EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 t1 WHERE c1 = -c1;          -- OpExpr(l)
                                             QUERY PLAN                                              
-----------------------------------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" = (- "C 1")))
(3 rows)

EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 t1 WHERE 1 = c1!;           -- OpExpr(r)
                                                QUERY PLAN                                                
----------------------------------------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE ((1::numeric = ("C 1" !)))
(3 rows)

EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 t1 WHERE (c1 IS NOT NULL) IS DISTINCT FROM (c1 IS NOT NULL); -- DistinctExpr
                                                                 QUERY PLAN                                                                 
--------------------------------------------------------------------------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE ((("C 1" IS NOT NULL) IS DISTINCT FROM ("C 1" IS NOT NULL)))
(3 rows)

EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 t1 WHERE c1 = ANY(ARRAY[c2, 1, c1 + 0]); -- ScalarArrayOpExpr
                                                        QUERY PLAN                                                         
---------------------------------------------------------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" = ANY (ARRAY[c2, 1, ("C 1" + 0)])))
(3 rows)

EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 t1 WHERE c1 = (ARRAY[c1,c2,3])[1]; -- ArrayRef
                                                      QUERY PLAN                                                      
----------------------------------------------------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" = ((ARRAY["C 1", c2, 3])[1])))
(3 rows)

EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 t1 WHERE c6 = E'foo''s\\bar';  -- check special chars
                                                 QUERY PLAN                                                  
-------------------------------------------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE ((c6 = E'foo''s\\bar'::text))
(3 rows)

EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 t1 WHERE c8 = 'foo';  -- can't be sent to remote
                               QUERY PLAN                                
-------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Filter: (t1.c8 = 'foo'::user_enum)
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1"
(4 rows)

-- parameterized remote path
EXPLAIN (VERBOSE, COSTS false)
  SELECT * FROM ft2 a, ft2 b WHERE a.c1 = 47 AND b.c1 = a.c2;
                                                 QUERY PLAN                                                  
-------------------------------------------------------------------------------------------------------------
 Nested Loop
   Output: a.c1, a.c2, a.c3, a.c4, a.c5, a.c6, a.c7, a.c8, b.c1, b.c2, b.c3, b.c4, b.c5, b.c6, b.c7, b.c8
   ->  Foreign Scan on public.ft2 a
         Output: a.c1, a.c2, a.c3, a.c4, a.c5, a.c6, a.c7, a.c8
         Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" = 47))
   ->  Foreign Scan on public.ft2 b
         Output: b.c1, b.c2, b.c3, b.c4, b.c5, b.c6, b.c7, b.c8
         Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (($1::integer = "C 1"))
(8 rows)

SELECT * FROM ft2 a, ft2 b WHERE a.c1 = 47 AND b.c1 = a.c2;
 c1 | c2 |  c3   |              c4              |            c5            | c6 |     c7     | c8  | c1 | c2 |  c3   |              c4              |            c5            | c6 |     c7     | c8  
----+----+-------+------------------------------+--------------------------+----+------------+-----+----+----+-------+------------------------------+--------------------------+----+------------+-----
 47 |  7 | 00047 | Tue Feb 17 00:00:00 1970 PST | Tue Feb 17 00:00:00 1970 | 7  | 7          | foo |  7 |  7 | 00007 | Thu Jan 08 00:00:00 1970 PST | Thu Jan 08 00:00:00 1970 | 7  | 7          | foo
(1 row)

-- check both safe and unsafe join conditions
EXPLAIN (VERBOSE, COSTS false)
  SELECT * FROM ft2 a, ft2 b
  WHERE a.c2 = 6 AND b.c1 = a.c1 AND a.c8 = 'foo' AND b.c7 = upper(a.c7);
                                                 QUERY PLAN                                                  
-------------------------------------------------------------------------------------------------------------
 Nested Loop
   Output: a.c1, a.c2, a.c3, a.c4, a.c5, a.c6, a.c7, a.c8, b.c1, b.c2, b.c3, b.c4, b.c5, b.c6, b.c7, b.c8
   ->  Foreign Scan on public.ft2 a
         Output: a.c1, a.c2, a.c3, a.c4, a.c5, a.c6, a.c7, a.c8
         Filter: (a.c8 = 'foo'::user_enum)
         Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE ((c2 = 6))
   ->  Foreign Scan on public.ft2 b
         Output: b.c1, b.c2, b.c3, b.c4, b.c5, b.c6, b.c7, b.c8
         Filter: (upper((a.c7)::text) = (b.c7)::text)
         Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (($1::integer = "C 1"))
(10 rows)

SELECT * FROM ft2 a, ft2 b
WHERE a.c2 = 6 AND b.c1 = a.c1 AND a.c8 = 'foo' AND b.c7 = upper(a.c7);
 c1  | c2 |  c3   |              c4              |            c5            | c6 |     c7     | c8  | c1  | c2 |  c3   |              c4              |            c5            | c6 |     c7     | c8  
-----+----+-------+------------------------------+--------------------------+----+------------+-----+-----+----+-------+------------------------------+--------------------------+----+------------+-----
   6 |  6 | 00006 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6  | 6          | foo |   6 |  6 | 00006 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6  | 6          | foo
  16 |  6 | 00016 | Sat Jan 17 00:00:00 1970 PST | Sat Jan 17 00:00:00 1970 | 6  | 6          | foo |  16 |  6 | 00016 | Sat Jan 17 00:00:00 1970 PST | Sat Jan 17 00:00:00 1970 | 6  | 6          | foo
  26 |  6 | 00026 | Tue Jan 27 00:00:00 1970 PST | Tue Jan 27 00:00:00 1970 | 6  | 6          | foo |  26 |  6 | 00026 | Tue Jan 27 00:00:00 1970 PST | Tue Jan 27 00:00:00 1970 | 6  | 6          | foo
  36 |  6 | 00036 | Fri Feb 06 00:00:00 1970 PST | Fri Feb 06 00:00:00 1970 | 6  | 6          | foo |  36 |  6 | 00036 | Fri Feb 06 00:00:00 1970 PST | Fri Feb 06 00:00:00 1970 | 6  | 6          | foo
  46 |  6 | 00046 | Mon Feb 16 00:00:00 1970 PST | Mon Feb 16 00:00:00 1970 | 6  | 6          | foo |  46 |  6 | 00046 | Mon Feb 16 00:00:00 1970 PST | Mon Feb 16 00:00:00 1970 | 6  | 6          | foo
  56 |  6 | 00056 | Thu Feb 26 00:00:00 1970 PST | Thu Feb 26 00:00:00 1970 | 6  | 6          | foo |  56 |  6 | 00056 | Thu Feb 26 00:00:00 1970 PST | Thu Feb 26 00:00:00 1970 | 6  | 6          | foo
  66 |  6 | 00066 | Sun Mar 08 00:00:00 1970 PST | Sun Mar 08 00:00:00 1970 | 6  | 6          | foo |  66 |  6 | 00066 | Sun Mar 08 00:00:00 1970 PST | Sun Mar 08 00:00:00 1970 | 6  | 6          | foo
  76 |  6 | 00076 | Wed Mar 18 00:00:00 1970 PST | Wed Mar 18 00:00:00 1970 | 6  | 6          | foo |  76 |  6 | 00076 | Wed Mar 18 00:00:00 1970 PST | Wed Mar 18 00:00:00 1970 | 6  | 6          | foo
  86 |  6 | 00086 | Sat Mar 28 00:00:00 1970 PST | Sat Mar 28 00:00:00 1970 | 6  | 6          | foo |  86 |  6 | 00086 | Sat Mar 28 00:00:00 1970 PST | Sat Mar 28 00:00:00 1970 | 6  | 6          | foo
  96 |  6 | 00096 | Tue Apr 07 00:00:00 1970 PST | Tue Apr 07 00:00:00 1970 | 6  | 6          | foo |  96 |  6 | 00096 | Tue Apr 07 00:00:00 1970 PST | Tue Apr 07 00:00:00 1970 | 6  | 6          | foo
 106 |  6 | 00106 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6  | 6          | foo | 106 |  6 | 00106 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6  | 6          | foo
 116 |  6 | 00116 | Sat Jan 17 00:00:00 1970 PST | Sat Jan 17 00:00:00 1970 | 6  | 6          | foo | 116 |  6 | 00116 | Sat Jan 17 00:00:00 1970 PST | Sat Jan 17 00:00:00 1970 | 6  | 6          | foo
 126 |  6 | 00126 | Tue Jan 27 00:00:00 1970 PST | Tue Jan 27 00:00:00 1970 | 6  | 6          | foo | 126 |  6 | 00126 | Tue Jan 27 00:00:00 1970 PST | Tue Jan 27 00:00:00 1970 | 6  | 6          | foo
 136 |  6 | 00136 | Fri Feb 06 00:00:00 1970 PST | Fri Feb 06 00:00:00 1970 | 6  | 6          | foo | 136 |  6 | 00136 | Fri Feb 06 00:00:00 1970 PST | Fri Feb 06 00:00:00 1970 | 6  | 6          | foo
 146 |  6 | 00146 | Mon Feb 16 00:00:00 1970 PST | Mon Feb 16 00:00:00 1970 | 6  | 6          | foo | 146 |  6 | 00146 | Mon Feb 16 00:00:00 1970 PST | Mon Feb 16 00:00:00 1970 | 6  | 6          | foo
 156 |  6 | 00156 | Thu Feb 26 00:00:00 1970 PST | Thu Feb 26 00:00:00 1970 | 6  | 6          | foo | 156 |  6 | 00156 | Thu Feb 26 00:00:00 1970 PST | Thu Feb 26 00:00:00 1970 | 6  | 6          | foo
 166 |  6 | 00166 | Sun Mar 08 00:00:00 1970 PST | Sun Mar 08 00:00:00 1970 | 6  | 6          | foo | 166 |  6 | 00166 | Sun Mar 08 00:00:00 1970 PST | Sun Mar 08 00:00:00 1970 | 6  | 6          | foo
 176 |  6 | 00176 | Wed Mar 18 00:00:00 1970 PST | Wed Mar 18 00:00:00 1970 | 6  | 6          | foo | 176 |  6 | 00176 | Wed Mar 18 00:00:00 1970 PST | Wed Mar 18 00:00:00 1970 | 6  | 6          | foo
 186 |  6 | 00186 | Sat Mar 28 00:00:00 1970 PST | Sat Mar 28 00:00:00 1970 | 6  | 6          | foo | 186 |  6 | 00186 | Sat Mar 28 00:00:00 1970 PST | Sat Mar 28 00:00:00 1970 | 6  | 6          | foo
 196 |  6 | 00196 | Tue Apr 07 00:00:00 1970 PST | Tue Apr 07 00:00:00 1970 | 6  | 6          | foo | 196 |  6 | 00196 | Tue Apr 07 00:00:00 1970 PST | Tue Apr 07 00:00:00 1970 | 6  | 6          | foo
 206 |  6 | 00206 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6  | 6          | foo | 206 |  6 | 00206 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6  | 6          | foo
 216 |  6 | 00216 | Sat Jan 17 00:00:00 1970 PST | Sat Jan 17 00:00:00 1970 | 6  | 6          | foo | 216 |  6 | 00216 | Sat Jan 17 00:00:00 1970 PST | Sat Jan 17 00:00:00 1970 | 6  | 6          | foo
 226 |  6 | 00226 | Tue Jan 27 00:00:00 1970 PST | Tue Jan 27 00:00:00 1970 | 6  | 6          | foo | 226 |  6 | 00226 | Tue Jan 27 00:00:00 1970 PST | Tue Jan 27 00:00:00 1970 | 6  | 6          | foo
 236 |  6 | 00236 | Fri Feb 06 00:00:00 1970 PST | Fri Feb 06 00:00:00 1970 | 6  | 6          | foo | 236 |  6 | 00236 | Fri Feb 06 00:00:00 1970 PST | Fri Feb 06 00:00:00 1970 | 6  | 6          | foo
 246 |  6 | 00246 | Mon Feb 16 00:00:00 1970 PST | Mon Feb 16 00:00:00 1970 | 6  | 6          | foo | 246 |  6 | 00246 | Mon Feb 16 00:00:00 1970 PST | Mon Feb 16 00:00:00 1970 | 6  | 6          | foo
 256 |  6 | 00256 | Thu Feb 26 00:00:00 1970 PST | Thu Feb 26 00:00:00 1970 | 6  | 6          | foo | 256 |  6 | 00256 | Thu Feb 26 00:00:00 1970 PST | Thu Feb 26 00:00:00 1970 | 6  | 6          | foo
 266 |  6 | 00266 | Sun Mar 08 00:00:00 1970 PST | Sun Mar 08 00:00:00 1970 | 6  | 6          | foo | 266 |  6 | 00266 | Sun Mar 08 00:00:00 1970 PST | Sun Mar 08 00:00:00 1970 | 6  | 6          | foo
 276 |  6 | 00276 | Wed Mar 18 00:00:00 1970 PST | Wed Mar 18 00:00:00 1970 | 6  | 6          | foo | 276 |  6 | 00276 | Wed Mar 18 00:00:00 1970 PST | Wed Mar 18 00:00:00 1970 | 6  | 6          | foo
 286 |  6 | 00286 | Sat Mar 28 00:00:00 1970 PST | Sat Mar 28 00:00:00 1970 | 6  | 6          | foo | 286 |  6 | 00286 | Sat Mar 28 00:00:00 1970 PST | Sat Mar 28 00:00:00 1970 | 6  | 6          | foo
 296 |  6 | 00296 | Tue Apr 07 00:00:00 1970 PST | Tue Apr 07 00:00:00 1970 | 6  | 6          | foo | 296 |  6 | 00296 | Tue Apr 07 00:00:00 1970 PST | Tue Apr 07 00:00:00 1970 | 6  | 6          | foo
 306 |  6 | 00306 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6  | 6          | foo | 306 |  6 | 00306 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6  | 6          | foo
 316 |  6 | 00316 | Sat Jan 17 00:00:00 1970 PST | Sat Jan 17 00:00:00 1970 | 6  | 6          | foo | 316 |  6 | 00316 | Sat Jan 17 00:00:00 1970 PST | Sat Jan 17 00:00:00 1970 | 6  | 6          | foo
 326 |  6 | 00326 | Tue Jan 27 00:00:00 1970 PST | Tue Jan 27 00:00:00 1970 | 6  | 6          | foo | 326 |  6 | 00326 | Tue Jan 27 00:00:00 1970 PST | Tue Jan 27 00:00:00 1970 | 6  | 6          | foo
 336 |  6 | 00336 | Fri Feb 06 00:00:00 1970 PST | Fri Feb 06 00:00:00 1970 | 6  | 6          | foo | 336 |  6 | 00336 | Fri Feb 06 00:00:00 1970 PST | Fri Feb 06 00:00:00 1970 | 6  | 6          | foo
 346 |  6 | 00346 | Mon Feb 16 00:00:00 1970 PST | Mon Feb 16 00:00:00 1970 | 6  | 6          | foo | 346 |  6 | 00346 | Mon Feb 16 00:00:00 1970 PST | Mon Feb 16 00:00:00 1970 | 6  | 6          | foo
 356 |  6 | 00356 | Thu Feb 26 00:00:00 1970 PST | Thu Feb 26 00:00:00 1970 | 6  | 6          | foo | 356 |  6 | 00356 | Thu Feb 26 00:00:00 1970 PST | Thu Feb 26 00:00:00 1970 | 6  | 6          | foo
 366 |  6 | 00366 | Sun Mar 08 00:00:00 1970 PST | Sun Mar 08 00:00:00 1970 | 6  | 6          | foo | 366 |  6 | 00366 | Sun Mar 08 00:00:00 1970 PST | Sun Mar 08 00:00:00 1970 | 6  | 6          | foo
 376 |  6 | 00376 | Wed Mar 18 00:00:00 1970 PST | Wed Mar 18 00:00:00 1970 | 6  | 6          | foo | 376 |  6 | 00376 | Wed Mar 18 00:00:00 1970 PST | Wed Mar 18 00:00:00 1970 | 6  | 6          | foo
 386 |  6 | 00386 | Sat Mar 28 00:00:00 1970 PST | Sat Mar 28 00:00:00 1970 | 6  | 6          | foo | 386 |  6 | 00386 | Sat Mar 28 00:00:00 1970 PST | Sat Mar 28 00:00:00 1970 | 6  | 6          | foo
 396 |  6 | 00396 | Tue Apr 07 00:00:00 1970 PST | Tue Apr 07 00:00:00 1970 | 6  | 6          | foo | 396 |  6 | 00396 | Tue Apr 07 00:00:00 1970 PST | Tue Apr 07 00:00:00 1970 | 6  | 6          | foo
 406 |  6 | 00406 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6  | 6          | foo | 406 |  6 | 00406 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6  | 6          | foo
 416 |  6 | 00416 | Sat Jan 17 00:00:00 1970 PST | Sat Jan 17 00:00:00 1970 | 6  | 6          | foo | 416 |  6 | 00416 | Sat Jan 17 00:00:00 1970 PST | Sat Jan 17 00:00:00 1970 | 6  | 6          | foo
 426 |  6 | 00426 | Tue Jan 27 00:00:00 1970 PST | Tue Jan 27 00:00:00 1970 | 6  | 6          | foo | 426 |  6 | 00426 | Tue Jan 27 00:00:00 1970 PST | Tue Jan 27 00:00:00 1970 | 6  | 6          | foo
 436 |  6 | 00436 | Fri Feb 06 00:00:00 1970 PST | Fri Feb 06 00:00:00 1970 | 6  | 6          | foo | 436 |  6 | 00436 | Fri Feb 06 00:00:00 1970 PST | Fri Feb 06 00:00:00 1970 | 6  | 6          | foo
 446 |  6 | 00446 | Mon Feb 16 00:00:00 1970 PST | Mon Feb 16 00:00:00 1970 | 6  | 6          | foo | 446 |  6 | 00446 | Mon Feb 16 00:00:00 1970 PST | Mon Feb 16 00:00:00 1970 | 6  | 6          | foo
 456 |  6 | 00456 | Thu Feb 26 00:00:00 1970 PST | Thu Feb 26 00:00:00 1970 | 6  | 6          | foo | 456 |  6 | 00456 | Thu Feb 26 00:00:00 1970 PST | Thu Feb 26 00:00:00 1970 | 6  | 6          | foo
 466 |  6 | 00466 | Sun Mar 08 00:00:00 1970 PST | Sun Mar 08 00:00:00 1970 | 6  | 6          | foo | 466 |  6 | 00466 | Sun Mar 08 00:00:00 1970 PST | Sun Mar 08 00:00:00 1970 | 6  | 6          | foo
 476 |  6 | 00476 | Wed Mar 18 00:00:00 1970 PST | Wed Mar 18 00:00:00 1970 | 6  | 6          | foo | 476 |  6 | 00476 | Wed Mar 18 00:00:00 1970 PST | Wed Mar 18 00:00:00 1970 | 6  | 6          | foo
 486 |  6 | 00486 | Sat Mar 28 00:00:00 1970 PST | Sat Mar 28 00:00:00 1970 | 6  | 6          | foo | 486 |  6 | 00486 | Sat Mar 28 00:00:00 1970 PST | Sat Mar 28 00:00:00 1970 | 6  | 6          | foo
 496 |  6 | 00496 | Tue Apr 07 00:00:00 1970 PST | Tue Apr 07 00:00:00 1970 | 6  | 6          | foo | 496 |  6 | 00496 | Tue Apr 07 00:00:00 1970 PST | Tue Apr 07 00:00:00 1970 | 6  | 6          | foo
 506 |  6 | 00506 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6  | 6          | foo | 506 |  6 | 00506 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6  | 6          | foo
 516 |  6 | 00516 | Sat Jan 17 00:00:00 1970 PST | Sat Jan 17 00:00:00 1970 | 6  | 6          | foo | 516 |  6 | 00516 | Sat Jan 17 00:00:00 1970 PST | Sat Jan 17 00:00:00 1970 | 6  | 6          | foo
 526 |  6 | 00526 | Tue Jan 27 00:00:00 1970 PST | Tue Jan 27 00:00:00 1970 | 6  | 6          | foo | 526 |  6 | 00526 | Tue Jan 27 00:00:00 1970 PST | Tue Jan 27 00:00:00 1970 | 6  | 6          | foo
 536 |  6 | 00536 | Fri Feb 06 00:00:00 1970 PST | Fri Feb 06 00:00:00 1970 | 6  | 6          | foo | 536 |  6 | 00536 | Fri Feb 06 00:00:00 1970 PST | Fri Feb 06 00:00:00 1970 | 6  | 6          | foo
 546 |  6 | 00546 | Mon Feb 16 00:00:00 1970 PST | Mon Feb 16 00:00:00 1970 | 6  | 6          | foo | 546 |  6 | 00546 | Mon Feb 16 00:00:00 1970 PST | Mon Feb 16 00:00:00 1970 | 6  | 6          | foo
 556 |  6 | 00556 | Thu Feb 26 00:00:00 1970 PST | Thu Feb 26 00:00:00 1970 | 6  | 6          | foo | 556 |  6 | 00556 | Thu Feb 26 00:00:00 1970 PST | Thu Feb 26 00:00:00 1970 | 6  | 6          | foo
 566 |  6 | 00566 | Sun Mar 08 00:00:00 1970 PST | Sun Mar 08 00:00:00 1970 | 6  | 6          | foo | 566 |  6 | 00566 | Sun Mar 08 00:00:00 1970 PST | Sun Mar 08 00:00:00 1970 | 6  | 6          | foo
 576 |  6 | 00576 | Wed Mar 18 00:00:00 1970 PST | Wed Mar 18 00:00:00 1970 | 6  | 6          | foo | 576 |  6 | 00576 | Wed Mar 18 00:00:00 1970 PST | Wed Mar 18 00:00:00 1970 | 6  | 6          | foo
 586 |  6 | 00586 | Sat Mar 28 00:00:00 1970 PST | Sat Mar 28 00:00:00 1970 | 6  | 6          | foo | 586 |  6 | 00586 | Sat Mar 28 00:00:00 1970 PST | Sat Mar 28 00:00:00 1970 | 6  | 6          | foo
 596 |  6 | 00596 | Tue Apr 07 00:00:00 1970 PST | Tue Apr 07 00:00:00 1970 | 6  | 6          | foo | 596 |  6 | 00596 | Tue Apr 07 00:00:00 1970 PST | Tue Apr 07 00:00:00 1970 | 6  | 6          | foo
 606 |  6 | 00606 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6  | 6          | foo | 606 |  6 | 00606 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6  | 6          | foo
 616 |  6 | 00616 | Sat Jan 17 00:00:00 1970 PST | Sat Jan 17 00:00:00 1970 | 6  | 6          | foo | 616 |  6 | 00616 | Sat Jan 17 00:00:00 1970 PST | Sat Jan 17 00:00:00 1970 | 6  | 6          | foo
 626 |  6 | 00626 | Tue Jan 27 00:00:00 1970 PST | Tue Jan 27 00:00:00 1970 | 6  | 6          | foo | 626 |  6 | 00626 | Tue Jan 27 00:00:00 1970 PST | Tue Jan 27 00:00:00 1970 | 6  | 6          | foo
 636 |  6 | 00636 | Fri Feb 06 00:00:00 1970 PST | Fri Feb 06 00:00:00 1970 | 6  | 6          | foo | 636 |  6 | 00636 | Fri Feb 06 00:00:00 1970 PST | Fri Feb 06 00:00:00 1970 | 6  | 6          | foo
 646 |  6 | 00646 | Mon Feb 16 00:00:00 1970 PST | Mon Feb 16 00:00:00 1970 | 6  | 6          | foo | 646 |  6 | 00646 | Mon Feb 16 00:00:00 1970 PST | Mon Feb 16 00:00:00 1970 | 6  | 6          | foo
 656 |  6 | 00656 | Thu Feb 26 00:00:00 1970 PST | Thu Feb 26 00:00:00 1970 | 6  | 6          | foo | 656 |  6 | 00656 | Thu Feb 26 00:00:00 1970 PST | Thu Feb 26 00:00:00 1970 | 6  | 6          | foo
 666 |  6 | 00666 | Sun Mar 08 00:00:00 1970 PST | Sun Mar 08 00:00:00 1970 | 6  | 6          | foo | 666 |  6 | 00666 | Sun Mar 08 00:00:00 1970 PST | Sun Mar 08 00:00:00 1970 | 6  | 6          | foo
 676 |  6 | 00676 | Wed Mar 18 00:00:00 1970 PST | Wed Mar 18 00:00:00 1970 | 6  | 6          | foo | 676 |  6 | 00676 | Wed Mar 18 00:00:00 1970 PST | Wed Mar 18 00:00:00 1970 | 6  | 6          | foo
 686 |  6 | 00686 | Sat Mar 28 00:00:00 1970 PST | Sat Mar 28 00:00:00 1970 | 6  | 6          | foo | 686 |  6 | 00686 | Sat Mar 28 00:00:00 1970 PST | Sat Mar 28 00:00:00 1970 | 6  | 6          | foo
 696 |  6 | 00696 | Tue Apr 07 00:00:00 1970 PST | Tue Apr 07 00:00:00 1970 | 6  | 6          | foo | 696 |  6 | 00696 | Tue Apr 07 00:00:00 1970 PST | Tue Apr 07 00:00:00 1970 | 6  | 6          | foo
 706 |  6 | 00706 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6  | 6          | foo | 706 |  6 | 00706 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6  | 6          | foo
 716 |  6 | 00716 | Sat Jan 17 00:00:00 1970 PST | Sat Jan 17 00:00:00 1970 | 6  | 6          | foo | 716 |  6 | 00716 | Sat Jan 17 00:00:00 1970 PST | Sat Jan 17 00:00:00 1970 | 6  | 6          | foo
 726 |  6 | 00726 | Tue Jan 27 00:00:00 1970 PST | Tue Jan 27 00:00:00 1970 | 6  | 6          | foo | 726 |  6 | 00726 | Tue Jan 27 00:00:00 1970 PST | Tue Jan 27 00:00:00 1970 | 6  | 6          | foo
 736 |  6 | 00736 | Fri Feb 06 00:00:00 1970 PST | Fri Feb 06 00:00:00 1970 | 6  | 6          | foo | 736 |  6 | 00736 | Fri Feb 06 00:00:00 1970 PST | Fri Feb 06 00:00:00 1970 | 6  | 6          | foo
 746 |  6 | 00746 | Mon Feb 16 00:00:00 1970 PST | Mon Feb 16 00:00:00 1970 | 6  | 6          | foo | 746 |  6 | 00746 | Mon Feb 16 00:00:00 1970 PST | Mon Feb 16 00:00:00 1970 | 6  | 6          | foo
 756 |  6 | 00756 | Thu Feb 26 00:00:00 1970 PST | Thu Feb 26 00:00:00 1970 | 6  | 6          | foo | 756 |  6 | 00756 | Thu Feb 26 00:00:00 1970 PST | Thu Feb 26 00:00:00 1970 | 6  | 6          | foo
 766 |  6 | 00766 | Sun Mar 08 00:00:00 1970 PST | Sun Mar 08 00:00:00 1970 | 6  | 6          | foo | 766 |  6 | 00766 | Sun Mar 08 00:00:00 1970 PST | Sun Mar 08 00:00:00 1970 | 6  | 6          | foo
 776 |  6 | 00776 | Wed Mar 18 00:00:00 1970 PST | Wed Mar 18 00:00:00 1970 | 6  | 6          | foo | 776 |  6 | 00776 | Wed Mar 18 00:00:00 1970 PST | Wed Mar 18 00:00:00 1970 | 6  | 6          | foo
 786 |  6 | 00786 | Sat Mar 28 00:00:00 1970 PST | Sat Mar 28 00:00:00 1970 | 6  | 6          | foo | 786 |  6 | 00786 | Sat Mar 28 00:00:00 1970 PST | Sat Mar 28 00:00:00 1970 | 6  | 6          | foo
 796 |  6 | 00796 | Tue Apr 07 00:00:00 1970 PST | Tue Apr 07 00:00:00 1970 | 6  | 6          | foo | 796 |  6 | 00796 | Tue Apr 07 00:00:00 1970 PST | Tue Apr 07 00:00:00 1970 | 6  | 6          | foo
 806 |  6 | 00806 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6  | 6          | foo | 806 |  6 | 00806 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6  | 6          | foo
 816 |  6 | 00816 | Sat Jan 17 00:00:00 1970 PST | Sat Jan 17 00:00:00 1970 | 6  | 6          | foo | 816 |  6 | 00816 | Sat Jan 17 00:00:00 1970 PST | Sat Jan 17 00:00:00 1970 | 6  | 6          | foo
 826 |  6 | 00826 | Tue Jan 27 00:00:00 1970 PST | Tue Jan 27 00:00:00 1970 | 6  | 6          | foo | 826 |  6 | 00826 | Tue Jan 27 00:00:00 1970 PST | Tue Jan 27 00:00:00 1970 | 6  | 6          | foo
 836 |  6 | 00836 | Fri Feb 06 00:00:00 1970 PST | Fri Feb 06 00:00:00 1970 | 6  | 6          | foo | 836 |  6 | 00836 | Fri Feb 06 00:00:00 1970 PST | Fri Feb 06 00:00:00 1970 | 6  | 6          | foo
 846 |  6 | 00846 | Mon Feb 16 00:00:00 1970 PST | Mon Feb 16 00:00:00 1970 | 6  | 6          | foo | 846 |  6 | 00846 | Mon Feb 16 00:00:00 1970 PST | Mon Feb 16 00:00:00 1970 | 6  | 6          | foo
 856 |  6 | 00856 | Thu Feb 26 00:00:00 1970 PST | Thu Feb 26 00:00:00 1970 | 6  | 6          | foo | 856 |  6 | 00856 | Thu Feb 26 00:00:00 1970 PST | Thu Feb 26 00:00:00 1970 | 6  | 6          | foo
 866 |  6 | 00866 | Sun Mar 08 00:00:00 1970 PST | Sun Mar 08 00:00:00 1970 | 6  | 6          | foo | 866 |  6 | 00866 | Sun Mar 08 00:00:00 1970 PST | Sun Mar 08 00:00:00 1970 | 6  | 6          | foo
 876 |  6 | 00876 | Wed Mar 18 00:00:00 1970 PST | Wed Mar 18 00:00:00 1970 | 6  | 6          | foo | 876 |  6 | 00876 | Wed Mar 18 00:00:00 1970 PST | Wed Mar 18 00:00:00 1970 | 6  | 6          | foo
 886 |  6 | 00886 | Sat Mar 28 00:00:00 1970 PST | Sat Mar 28 00:00:00 1970 | 6  | 6          | foo | 886 |  6 | 00886 | Sat Mar 28 00:00:00 1970 PST | Sat Mar 28 00:00:00 1970 | 6  | 6          | foo
 896 |  6 | 00896 | Tue Apr 07 00:00:00 1970 PST | Tue Apr 07 00:00:00 1970 | 6  | 6          | foo | 896 |  6 | 00896 | Tue Apr 07 00:00:00 1970 PST | Tue Apr 07 00:00:00 1970 | 6  | 6          | foo
 906 |  6 | 00906 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6  | 6          | foo | 906 |  6 | 00906 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6  | 6          | foo
 916 |  6 | 00916 | Sat Jan 17 00:00:00 1970 PST | Sat Jan 17 00:00:00 1970 | 6  | 6          | foo | 916 |  6 | 00916 | Sat Jan 17 00:00:00 1970 PST | Sat Jan 17 00:00:00 1970 | 6  | 6          | foo
 926 |  6 | 00926 | Tue Jan 27 00:00:00 1970 PST | Tue Jan 27 00:00:00 1970 | 6  | 6          | foo | 926 |  6 | 00926 | Tue Jan 27 00:00:00 1970 PST | Tue Jan 27 00:00:00 1970 | 6  | 6          | foo
 936 |  6 | 00936 | Fri Feb 06 00:00:00 1970 PST | Fri Feb 06 00:00:00 1970 | 6  | 6          | foo | 936 |  6 | 00936 | Fri Feb 06 00:00:00 1970 PST | Fri Feb 06 00:00:00 1970 | 6  | 6          | foo
 946 |  6 | 00946 | Mon Feb 16 00:00:00 1970 PST | Mon Feb 16 00:00:00 1970 | 6  | 6          | foo | 946 |  6 | 00946 | Mon Feb 16 00:00:00 1970 PST | Mon Feb 16 00:00:00 1970 | 6  | 6          | foo
 956 |  6 | 00956 | Thu Feb 26 00:00:00 1970 PST | Thu Feb 26 00:00:00 1970 | 6  | 6          | foo | 956 |  6 | 00956 | Thu Feb 26 00:00:00 1970 PST | Thu Feb 26 00:00:00 1970 | 6  | 6          | foo
 966 |  6 | 00966 | Sun Mar 08 00:00:00 1970 PST | Sun Mar 08 00:00:00 1970 | 6  | 6          | foo | 966 |  6 | 00966 | Sun Mar 08 00:00:00 1970 PST | Sun Mar 08 00:00:00 1970 | 6  | 6          | foo
 976 |  6 | 00976 | Wed Mar 18 00:00:00 1970 PST | Wed Mar 18 00:00:00 1970 | 6  | 6          | foo | 976 |  6 | 00976 | Wed Mar 18 00:00:00 1970 PST | Wed Mar 18 00:00:00 1970 | 6  | 6          | foo
 986 |  6 | 00986 | Sat Mar 28 00:00:00 1970 PST | Sat Mar 28 00:00:00 1970 | 6  | 6          | foo | 986 |  6 | 00986 | Sat Mar 28 00:00:00 1970 PST | Sat Mar 28 00:00:00 1970 | 6  | 6          | foo
 996 |  6 | 00996 | Tue Apr 07 00:00:00 1970 PST | Tue Apr 07 00:00:00 1970 | 6  | 6          | foo | 996 |  6 | 00996 | Tue Apr 07 00:00:00 1970 PST | Tue Apr 07 00:00:00 1970 | 6  | 6          | foo
(100 rows)

-- bug before 9.3.5 due to sloppy handling of remote-estimate parameters
SELECT * FROM ft1 WHERE c1 = ANY (ARRAY(SELECT c1 FROM ft2 WHERE c1 < 5));
 c1 | c2 |  c3   |              c4              |            c5            | c6 |     c7     | c8  
----+----+-------+------------------------------+--------------------------+----+------------+-----
  1 |  1 | 00001 | Fri Jan 02 00:00:00 1970 PST | Fri Jan 02 00:00:00 1970 | 1  | 1          | foo
  2 |  2 | 00002 | Sat Jan 03 00:00:00 1970 PST | Sat Jan 03 00:00:00 1970 | 2  | 2          | foo
  3 |  3 | 00003 | Sun Jan 04 00:00:00 1970 PST | Sun Jan 04 00:00:00 1970 | 3  | 3          | foo
  4 |  4 | 00004 | Mon Jan 05 00:00:00 1970 PST | Mon Jan 05 00:00:00 1970 | 4  | 4          | foo
(4 rows)

SELECT * FROM ft2 WHERE c1 = ANY (ARRAY(SELECT c1 FROM ft1 WHERE c1 < 5));
 c1 | c2 |  c3   |              c4              |            c5            | c6 |     c7     | c8  
----+----+-------+------------------------------+--------------------------+----+------------+-----
  1 |  1 | 00001 | Fri Jan 02 00:00:00 1970 PST | Fri Jan 02 00:00:00 1970 | 1  | 1          | foo
  2 |  2 | 00002 | Sat Jan 03 00:00:00 1970 PST | Sat Jan 03 00:00:00 1970 | 2  | 2          | foo
  3 |  3 | 00003 | Sun Jan 04 00:00:00 1970 PST | Sun Jan 04 00:00:00 1970 | 3  | 3          | foo
  4 |  4 | 00004 | Mon Jan 05 00:00:00 1970 PST | Mon Jan 05 00:00:00 1970 | 4  | 4          | foo
(4 rows)

-- ===================================================================
-- parameterized queries
-- ===================================================================
-- simple join
PREPARE st1(int, int) AS SELECT t1.c3, t2.c3 FROM ft1 t1, ft2 t2 WHERE t1.c1 = $1 AND t2.c1 = $2;
EXPLAIN (VERBOSE, COSTS false) EXECUTE st1(1, 2);
                             QUERY PLAN                             
--------------------------------------------------------------------
 Nested Loop
   Output: t1.c3, t2.c3
   ->  Foreign Scan on public.ft1 t1
         Output: t1.c3
         Remote SQL: SELECT c3 FROM "S 1"."T 1" WHERE (("C 1" = 1))
   ->  Foreign Scan on public.ft2 t2
         Output: t2.c3
         Remote SQL: SELECT c3 FROM "S 1"."T 1" WHERE (("C 1" = 2))
(8 rows)

EXECUTE st1(1, 1);
  c3   |  c3   
-------+-------
 00001 | 00001
(1 row)

EXECUTE st1(101, 101);
  c3   |  c3   
-------+-------
 00101 | 00101
(1 row)

-- subquery using stable function (can't be sent to remote)
PREPARE st2(int) AS SELECT * FROM ft1 t1 WHERE t1.c1 < $2 AND t1.c3 IN (SELECT c3 FROM ft2 t2 WHERE c1 > $1 AND date(c4) = '1970-01-17'::date) ORDER BY c1;
EXPLAIN (VERBOSE, COSTS false) EXECUTE st2(10, 20);
                                                QUERY PLAN                                                
----------------------------------------------------------------------------------------------------------
 Sort
   Output: t1.c1, t1.c2, t1.c3, t1.c4, t1.c5, t1.c6, t1.c7, t1.c8
   Sort Key: t1.c1
   ->  Nested Loop Semi Join
         Output: t1.c1, t1.c2, t1.c3, t1.c4, t1.c5, t1.c6, t1.c7, t1.c8
         Join Filter: (t1.c3 = t2.c3)
         ->  Foreign Scan on public.ft1 t1
               Output: t1.c1, t1.c2, t1.c3, t1.c4, t1.c5, t1.c6, t1.c7, t1.c8
               Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" < 20))
         ->  Materialize
               Output: t2.c3
               ->  Foreign Scan on public.ft2 t2
                     Output: t2.c3
                     Filter: (date(t2.c4) = '01-17-1970'::date)
                     Remote SQL: SELECT c3, c4 FROM "S 1"."T 1" WHERE (("C 1" > 10))
(15 rows)

EXECUTE st2(10, 20);
 c1 | c2 |  c3   |              c4              |            c5            | c6 |     c7     | c8  
----+----+-------+------------------------------+--------------------------+----+------------+-----
 16 |  6 | 00016 | Sat Jan 17 00:00:00 1970 PST | Sat Jan 17 00:00:00 1970 | 6  | 6          | foo
(1 row)

EXECUTE st2(101, 121);
 c1  | c2 |  c3   |              c4              |            c5            | c6 |     c7     | c8  
-----+----+-------+------------------------------+--------------------------+----+------------+-----
 116 |  6 | 00116 | Sat Jan 17 00:00:00 1970 PST | Sat Jan 17 00:00:00 1970 | 6  | 6          | foo
(1 row)

-- subquery using immutable function (can be sent to remote)
PREPARE st3(int) AS SELECT * FROM ft1 t1 WHERE t1.c1 < $2 AND t1.c3 IN (SELECT c3 FROM ft2 t2 WHERE c1 > $1 AND date(c5) = '1970-01-17'::date) ORDER BY c1;
EXPLAIN (VERBOSE, COSTS false) EXECUTE st3(10, 20);
                                                      QUERY PLAN                                                       
-----------------------------------------------------------------------------------------------------------------------
 Sort
   Output: t1.c1, t1.c2, t1.c3, t1.c4, t1.c5, t1.c6, t1.c7, t1.c8
   Sort Key: t1.c1
   ->  Nested Loop Semi Join
         Output: t1.c1, t1.c2, t1.c3, t1.c4, t1.c5, t1.c6, t1.c7, t1.c8
         Join Filter: (t1.c3 = t2.c3)
         ->  Foreign Scan on public.ft1 t1
               Output: t1.c1, t1.c2, t1.c3, t1.c4, t1.c5, t1.c6, t1.c7, t1.c8
               Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" < 20))
         ->  Materialize
               Output: t2.c3
               ->  Foreign Scan on public.ft2 t2
                     Output: t2.c3
                     Remote SQL: SELECT c3 FROM "S 1"."T 1" WHERE (("C 1" > 10)) AND ((date(c5) = '1970-01-17'::date))
(14 rows)

EXECUTE st3(10, 20);
 c1 | c2 |  c3   |              c4              |            c5            | c6 |     c7     | c8  
----+----+-------+------------------------------+--------------------------+----+------------+-----
 16 |  6 | 00016 | Sat Jan 17 00:00:00 1970 PST | Sat Jan 17 00:00:00 1970 | 6  | 6          | foo
(1 row)

EXECUTE st3(20, 30);
 c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8 
----+----+----+----+----+----+----+----
(0 rows)

-- custom plan should be chosen initially
PREPARE st4(int) AS SELECT * FROM ft1 t1 WHERE t1.c1 = $1;
EXPLAIN (VERBOSE, COSTS false) EXECUTE st4(1);
                                         QUERY PLAN                                          
---------------------------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" = 1))
(3 rows)

EXPLAIN (VERBOSE, COSTS false) EXECUTE st4(1);
                                         QUERY PLAN                                          
---------------------------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" = 1))
(3 rows)

EXPLAIN (VERBOSE, COSTS false) EXECUTE st4(1);
                                         QUERY PLAN                                          
---------------------------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" = 1))
(3 rows)

EXPLAIN (VERBOSE, COSTS false) EXECUTE st4(1);
                                         QUERY PLAN                                          
---------------------------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" = 1))
(3 rows)

EXPLAIN (VERBOSE, COSTS false) EXECUTE st4(1);
                                         QUERY PLAN                                          
---------------------------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" = 1))
(3 rows)

-- once we try it enough times, should switch to generic plan
EXPLAIN (VERBOSE, COSTS false) EXECUTE st4(1);
                                              QUERY PLAN                                               
-------------------------------------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" = $1::integer))
(3 rows)

-- value of $1 should not be sent to remote
PREPARE st5(user_enum,int) AS SELECT * FROM ft1 t1 WHERE c8 = $1 and c1 = $2;
EXPLAIN (VERBOSE, COSTS false) EXECUTE st5('foo', 1);
                                         QUERY PLAN                                          
---------------------------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Filter: (t1.c8 = 'foo'::user_enum)
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" = 1))
(4 rows)

EXPLAIN (VERBOSE, COSTS false) EXECUTE st5('foo', 1);
                                         QUERY PLAN                                          
---------------------------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Filter: (t1.c8 = 'foo'::user_enum)
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" = 1))
(4 rows)

EXPLAIN (VERBOSE, COSTS false) EXECUTE st5('foo', 1);
                                         QUERY PLAN                                          
---------------------------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Filter: (t1.c8 = 'foo'::user_enum)
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" = 1))
(4 rows)

EXPLAIN (VERBOSE, COSTS false) EXECUTE st5('foo', 1);
                                         QUERY PLAN                                          
---------------------------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Filter: (t1.c8 = 'foo'::user_enum)
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" = 1))
(4 rows)

EXPLAIN (VERBOSE, COSTS false) EXECUTE st5('foo', 1);
                                         QUERY PLAN                                          
---------------------------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Filter: (t1.c8 = 'foo'::user_enum)
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" = 1))
(4 rows)

EXPLAIN (VERBOSE, COSTS false) EXECUTE st5('foo', 1);
                                              QUERY PLAN                                               
-------------------------------------------------------------------------------------------------------
 Foreign Scan on public.ft1 t1
   Output: c1, c2, c3, c4, c5, c6, c7, c8
   Filter: (t1.c8 = $1)
   Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" = $1::integer))
(4 rows)

EXECUTE st5('foo', 1);
 c1 | c2 |  c3   |              c4              |            c5            | c6 |     c7     | c8  
----+----+-------+------------------------------+--------------------------+----+------------+-----
  1 |  1 | 00001 | Fri Jan 02 00:00:00 1970 PST | Fri Jan 02 00:00:00 1970 | 1  | 1          | foo
(1 row)

-- cleanup
DEALLOCATE st1;
DEALLOCATE st2;
DEALLOCATE st3;
DEALLOCATE st4;
DEALLOCATE st5;
-- ===================================================================
-- used in pl/pgsql function
-- ===================================================================
CREATE OR REPLACE FUNCTION f_test(p_c1 int) RETURNS int AS $$
DECLARE
	v_c1 int;
BEGIN
    SELECT c1 INTO v_c1 FROM ft1 WHERE c1 = p_c1 LIMIT 1;
    PERFORM c1 FROM ft1 WHERE c1 = p_c1 AND p_c1 = v_c1 LIMIT 1;
    RETURN v_c1;
END;
$$ LANGUAGE plpgsql;
SELECT f_test(100);
 f_test 
--------
    100
(1 row)

DROP FUNCTION f_test(int);
-- ===================================================================
-- conversion error
-- ===================================================================
ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 TYPE int;
SELECT * FROM ft1 WHERE c1 = 1;  -- ERROR
ERROR:  invalid input syntax for integer: "foo"
CONTEXT:  column "c8" of foreign table "ft1"
ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 TYPE user_enum;
-- ===================================================================
-- subtransaction
--  + local/remote error doesn't break cursor
-- ===================================================================
BEGIN;
DECLARE c CURSOR FOR SELECT * FROM ft1 ORDER BY c1;
FETCH c;
 c1 | c2 |  c3   |              c4              |            c5            | c6 |     c7     | c8  
----+----+-------+------------------------------+--------------------------+----+------------+-----
  1 |  1 | 00001 | Fri Jan 02 00:00:00 1970 PST | Fri Jan 02 00:00:00 1970 | 1  | 1          | foo
(1 row)

SAVEPOINT s;
ERROR OUT;          -- ERROR
ERROR:  syntax error at or near "ERROR"
LINE 1: ERROR OUT;
        ^
ROLLBACK TO s;
FETCH c;
 c1 | c2 |  c3   |              c4              |            c5            | c6 |     c7     | c8  
----+----+-------+------------------------------+--------------------------+----+------------+-----
  2 |  2 | 00002 | Sat Jan 03 00:00:00 1970 PST | Sat Jan 03 00:00:00 1970 | 2  | 2          | foo
(1 row)

SAVEPOINT s;
SELECT * FROM ft1 WHERE 1 / (c1 - 1) > 0;  -- ERROR
ERROR:  division by zero
CONTEXT:  Remote SQL command: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (((1 / ("C 1" - 1)) > 0))
ROLLBACK TO s;
FETCH c;
 c1 | c2 |  c3   |              c4              |            c5            | c6 |     c7     | c8  
----+----+-------+------------------------------+--------------------------+----+------------+-----
  3 |  3 | 00003 | Sun Jan 04 00:00:00 1970 PST | Sun Jan 04 00:00:00 1970 | 3  | 3          | foo
(1 row)

SELECT * FROM ft1 ORDER BY c1 LIMIT 1;
 c1 | c2 |  c3   |              c4              |            c5            | c6 |     c7     | c8  
----+----+-------+------------------------------+--------------------------+----+------------+-----
  1 |  1 | 00001 | Fri Jan 02 00:00:00 1970 PST | Fri Jan 02 00:00:00 1970 | 1  | 1          | foo
(1 row)

COMMIT;
-- ===================================================================
-- test handling of collations
-- ===================================================================
create table loct3 (f1 text collate "C", f2 text);
create foreign table ft3 (f1 text collate "C", f2 text)
  server loopback options (table_name 'loct3');
-- can be sent to remote
explain (verbose, costs off) select * from ft3 where f1 = 'foo';
                                QUERY PLAN                                
--------------------------------------------------------------------------
 Foreign Scan on public.ft3
   Output: f1, f2
   Remote SQL: SELECT f1, f2 FROM public.loct3 WHERE ((f1 = 'foo'::text))
(3 rows)

explain (verbose, costs off) select * from ft3 where f1 COLLATE "C" = 'foo';
                                QUERY PLAN                                
--------------------------------------------------------------------------
 Foreign Scan on public.ft3
   Output: f1, f2
   Remote SQL: SELECT f1, f2 FROM public.loct3 WHERE ((f1 = 'foo'::text))
(3 rows)

explain (verbose, costs off) select * from ft3 where f2 = 'foo';
                                QUERY PLAN                                
--------------------------------------------------------------------------
 Foreign Scan on public.ft3
   Output: f1, f2
   Remote SQL: SELECT f1, f2 FROM public.loct3 WHERE ((f2 = 'foo'::text))
(3 rows)

-- can't be sent to remote
explain (verbose, costs off) select * from ft3 where f1 COLLATE "POSIX" = 'foo';
                  QUERY PLAN                   
-----------------------------------------------
 Foreign Scan on public.ft3
   Output: f1, f2
   Filter: ((ft3.f1)::text = 'foo'::text)
   Remote SQL: SELECT f1, f2 FROM public.loct3
(4 rows)

explain (verbose, costs off) select * from ft3 where f1 = 'foo' COLLATE "C";
                  QUERY PLAN                   
-----------------------------------------------
 Foreign Scan on public.ft3
   Output: f1, f2
   Filter: (ft3.f1 = 'foo'::text COLLATE "C")
   Remote SQL: SELECT f1, f2 FROM public.loct3
(4 rows)

explain (verbose, costs off) select * from ft3 where f2 COLLATE "C" = 'foo';
                  QUERY PLAN                   
-----------------------------------------------
 Foreign Scan on public.ft3
   Output: f1, f2
   Filter: ((ft3.f2)::text = 'foo'::text)
   Remote SQL: SELECT f1, f2 FROM public.loct3
(4 rows)

explain (verbose, costs off) select * from ft3 where f2 = 'foo' COLLATE "C";
                  QUERY PLAN                   
-----------------------------------------------
 Foreign Scan on public.ft3
   Output: f1, f2
   Filter: (ft3.f2 = 'foo'::text COLLATE "C")
   Remote SQL: SELECT f1, f2 FROM public.loct3
(4 rows)

-- ===================================================================
-- test writable foreign table stuff
-- ===================================================================
EXPLAIN (verbose, costs off)
INSERT INTO ft2 (c1,c2,c3) SELECT c1+1000,c2+100, c3 || c3 FROM ft2 LIMIT 20;
                                                                                                                    QUERY PLAN                                                                                                                    
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Insert on public.ft2
   Remote SQL: INSERT INTO "S 1"."T 1"("C 1", c2, c3, c4, c5, c6, c7, c8) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
   ->  Subquery Scan on "*SELECT*"
         Output: "*SELECT*"."?column?", "*SELECT*"."?column?_1", NULL::integer, "*SELECT*"."?column?_2", NULL::timestamp with time zone, NULL::timestamp without time zone, NULL::character varying, 'ft2       '::character(10), NULL::user_enum
         ->  Limit
               Output: ((ft2_1.c1 + 1000)), ((ft2_1.c2 + 100)), ((ft2_1.c3 || ft2_1.c3))
               ->  Foreign Scan on public.ft2 ft2_1
                     Output: (ft2_1.c1 + 1000), (ft2_1.c2 + 100), (ft2_1.c3 || ft2_1.c3)
                     Remote SQL: SELECT "C 1", c2, c3 FROM "S 1"."T 1"
(9 rows)

INSERT INTO ft2 (c1,c2,c3) SELECT c1+1000,c2+100, c3 || c3 FROM ft2 LIMIT 20;
INSERT INTO ft2 (c1,c2,c3)
  VALUES (1101,201,'aaa'), (1102,202,'bbb'), (1103,203,'ccc') RETURNING *;
  c1  | c2  | c3  | c4 | c5 | c6 |     c7     | c8 
------+-----+-----+----+----+----+------------+----
 1101 | 201 | aaa |    |    |    | ft2        | 
 1102 | 202 | bbb |    |    |    | ft2        | 
 1103 | 203 | ccc |    |    |    | ft2        | 
(3 rows)

INSERT INTO ft2 (c1,c2,c3) VALUES (1104,204,'ddd'), (1105,205,'eee');
UPDATE ft2 SET c2 = c2 + 300, c3 = c3 || '_update3' WHERE c1 % 10 = 3;
UPDATE ft2 SET c2 = c2 + 400, c3 = c3 || '_update7' WHERE c1 % 10 = 7 RETURNING *;
  c1  | c2  |         c3         |              c4              |            c5            | c6 |     c7     | c8  
------+-----+--------------------+------------------------------+--------------------------+----+------------+-----
    7 | 407 | 00007_update7      | Thu Jan 08 00:00:00 1970 PST | Thu Jan 08 00:00:00 1970 | 7  | 7          | foo
   17 | 407 | 00017_update7      | Sun Jan 18 00:00:00 1970 PST | Sun Jan 18 00:00:00 1970 | 7  | 7          | foo
   27 | 407 | 00027_update7      | Wed Jan 28 00:00:00 1970 PST | Wed Jan 28 00:00:00 1970 | 7  | 7          | foo
   37 | 407 | 00037_update7      | Sat Feb 07 00:00:00 1970 PST | Sat Feb 07 00:00:00 1970 | 7  | 7          | foo
   47 | 407 | 00047_update7      | Tue Feb 17 00:00:00 1970 PST | Tue Feb 17 00:00:00 1970 | 7  | 7          | foo
   57 | 407 | 00057_update7      | Fri Feb 27 00:00:00 1970 PST | Fri Feb 27 00:00:00 1970 | 7  | 7          | foo
   67 | 407 | 00067_update7      | Mon Mar 09 00:00:00 1970 PST | Mon Mar 09 00:00:00 1970 | 7  | 7          | foo
   77 | 407 | 00077_update7      | Thu Mar 19 00:00:00 1970 PST | Thu Mar 19 00:00:00 1970 | 7  | 7          | foo
   87 | 407 | 00087_update7      | Sun Mar 29 00:00:00 1970 PST | Sun Mar 29 00:00:00 1970 | 7  | 7          | foo
   97 | 407 | 00097_update7      | Wed Apr 08 00:00:00 1970 PST | Wed Apr 08 00:00:00 1970 | 7  | 7          | foo
  107 | 407 | 00107_update7      | Thu Jan 08 00:00:00 1970 PST | Thu Jan 08 00:00:00 1970 | 7  | 7          | foo
  117 | 407 | 00117_update7      | Sun Jan 18 00:00:00 1970 PST | Sun Jan 18 00:00:00 1970 | 7  | 7          | foo
  127 | 407 | 00127_update7      | Wed Jan 28 00:00:00 1970 PST | Wed Jan 28 00:00:00 1970 | 7  | 7          | foo
  137 | 407 | 00137_update7      | Sat Feb 07 00:00:00 1970 PST | Sat Feb 07 00:00:00 1970 | 7  | 7          | foo
  147 | 407 | 00147_update7      | Tue Feb 17 00:00:00 1970 PST | Tue Feb 17 00:00:00 1970 | 7  | 7          | foo
  157 | 407 | 00157_update7      | Fri Feb 27 00:00:00 1970 PST | Fri Feb 27 00:00:00 1970 | 7  | 7          | foo
  167 | 407 | 00167_update7      | Mon Mar 09 00:00:00 1970 PST | Mon Mar 09 00:00:00 1970 | 7  | 7          | foo
  177 | 407 | 00177_update7      | Thu Mar 19 00:00:00 1970 PST | Thu Mar 19 00:00:00 1970 | 7  | 7          | foo
  187 | 407 | 00187_update7      | Sun Mar 29 00:00:00 1970 PST | Sun Mar 29 00:00:00 1970 | 7  | 7          | foo
  197 | 407 | 00197_update7      | Wed Apr 08 00:00:00 1970 PST | Wed Apr 08 00:00:00 1970 | 7  | 7          | foo
  207 | 407 | 00207_update7      | Thu Jan 08 00:00:00 1970 PST | Thu Jan 08 00:00:00 1970 | 7  | 7          | foo
  217 | 407 | 00217_update7      | Sun Jan 18 00:00:00 1970 PST | Sun Jan 18 00:00:00 1970 | 7  | 7          | foo
  227 | 407 | 00227_update7      | Wed Jan 28 00:00:00 1970 PST | Wed Jan 28 00:00:00 1970 | 7  | 7          | foo
  237 | 407 | 00237_update7      | Sat Feb 07 00:00:00 1970 PST | Sat Feb 07 00:00:00 1970 | 7  | 7          | foo
  247 | 407 | 00247_update7      | Tue Feb 17 00:00:00 1970 PST | Tue Feb 17 00:00:00 1970 | 7  | 7          | foo
  257 | 407 | 00257_update7      | Fri Feb 27 00:00:00 1970 PST | Fri Feb 27 00:00:00 1970 | 7  | 7          | foo
  267 | 407 | 00267_update7      | Mon Mar 09 00:00:00 1970 PST | Mon Mar 09 00:00:00 1970 | 7  | 7          | foo
  277 | 407 | 00277_update7      | Thu Mar 19 00:00:00 1970 PST | Thu Mar 19 00:00:00 1970 | 7  | 7          | foo
  287 | 407 | 00287_update7      | Sun Mar 29 00:00:00 1970 PST | Sun Mar 29 00:00:00 1970 | 7  | 7          | foo
  297 | 407 | 00297_update7      | Wed Apr 08 00:00:00 1970 PST | Wed Apr 08 00:00:00 1970 | 7  | 7          | foo
  307 | 407 | 00307_update7      | Thu Jan 08 00:00:00 1970 PST | Thu Jan 08 00:00:00 1970 | 7  | 7          | foo
  317 | 407 | 00317_update7      | Sun Jan 18 00:00:00 1970 PST | Sun Jan 18 00:00:00 1970 | 7  | 7          | foo
  327 | 407 | 00327_update7      | Wed Jan 28 00:00:00 1970 PST | Wed Jan 28 00:00:00 1970 | 7  | 7          | foo
  337 | 407 | 00337_update7      | Sat Feb 07 00:00:00 1970 PST | Sat Feb 07 00:00:00 1970 | 7  | 7          | foo
  347 | 407 | 00347_update7      | Tue Feb 17 00:00:00 1970 PST | Tue Feb 17 00:00:00 1970 | 7  | 7          | foo
  357 | 407 | 00357_update7      | Fri Feb 27 00:00:00 1970 PST | Fri Feb 27 00:00:00 1970 | 7  | 7          | foo
  367 | 407 | 00367_update7      | Mon Mar 09 00:00:00 1970 PST | Mon Mar 09 00:00:00 1970 | 7  | 7          | foo
  377 | 407 | 00377_update7      | Thu Mar 19 00:00:00 1970 PST | Thu Mar 19 00:00:00 1970 | 7  | 7          | foo
  387 | 407 | 00387_update7      | Sun Mar 29 00:00:00 1970 PST | Sun Mar 29 00:00:00 1970 | 7  | 7          | foo
  397 | 407 | 00397_update7      | Wed Apr 08 00:00:00 1970 PST | Wed Apr 08 00:00:00 1970 | 7  | 7          | foo
  407 | 407 | 00407_update7      | Thu Jan 08 00:00:00 1970 PST | Thu Jan 08 00:00:00 1970 | 7  | 7          | foo
  417 | 407 | 00417_update7      | Sun Jan 18 00:00:00 1970 PST | Sun Jan 18 00:00:00 1970 | 7  | 7          | foo
  427 | 407 | 00427_update7      | Wed Jan 28 00:00:00 1970 PST | Wed Jan 28 00:00:00 1970 | 7  | 7          | foo
  437 | 407 | 00437_update7      | Sat Feb 07 00:00:00 1970 PST | Sat Feb 07 00:00:00 1970 | 7  | 7          | foo
  447 | 407 | 00447_update7      | Tue Feb 17 00:00:00 1970 PST | Tue Feb 17 00:00:00 1970 | 7  | 7          | foo
  457 | 407 | 00457_update7      | Fri Feb 27 00:00:00 1970 PST | Fri Feb 27 00:00:00 1970 | 7  | 7          | foo
  467 | 407 | 00467_update7      | Mon Mar 09 00:00:00 1970 PST | Mon Mar 09 00:00:00 1970 | 7  | 7          | foo
  477 | 407 | 00477_update7      | Thu Mar 19 00:00:00 1970 PST | Thu Mar 19 00:00:00 1970 | 7  | 7          | foo
  487 | 407 | 00487_update7      | Sun Mar 29 00:00:00 1970 PST | Sun Mar 29 00:00:00 1970 | 7  | 7          | foo
  497 | 407 | 00497_update7      | Wed Apr 08 00:00:00 1970 PST | Wed Apr 08 00:00:00 1970 | 7  | 7          | foo
  507 | 407 | 00507_update7      | Thu Jan 08 00:00:00 1970 PST | Thu Jan 08 00:00:00 1970 | 7  | 7          | foo
  517 | 407 | 00517_update7      | Sun Jan 18 00:00:00 1970 PST | Sun Jan 18 00:00:00 1970 | 7  | 7          | foo
  527 | 407 | 00527_update7      | Wed Jan 28 00:00:00 1970 PST | Wed Jan 28 00:00:00 1970 | 7  | 7          | foo
  537 | 407 | 00537_update7      | Sat Feb 07 00:00:00 1970 PST | Sat Feb 07 00:00:00 1970 | 7  | 7          | foo
  547 | 407 | 00547_update7      | Tue Feb 17 00:00:00 1970 PST | Tue Feb 17 00:00:00 1970 | 7  | 7          | foo
  557 | 407 | 00557_update7      | Fri Feb 27 00:00:00 1970 PST | Fri Feb 27 00:00:00 1970 | 7  | 7          | foo
  567 | 407 | 00567_update7      | Mon Mar 09 00:00:00 1970 PST | Mon Mar 09 00:00:00 1970 | 7  | 7          | foo
  577 | 407 | 00577_update7      | Thu Mar 19 00:00:00 1970 PST | Thu Mar 19 00:00:00 1970 | 7  | 7          | foo
  587 | 407 | 00587_update7      | Sun Mar 29 00:00:00 1970 PST | Sun Mar 29 00:00:00 1970 | 7  | 7          | foo
  597 | 407 | 00597_update7      | Wed Apr 08 00:00:00 1970 PST | Wed Apr 08 00:00:00 1970 | 7  | 7          | foo
  607 | 407 | 00607_update7      | Thu Jan 08 00:00:00 1970 PST | Thu Jan 08 00:00:00 1970 | 7  | 7          | foo
  617 | 407 | 00617_update7      | Sun Jan 18 00:00:00 1970 PST | Sun Jan 18 00:00:00 1970 | 7  | 7          | foo
  627 | 407 | 00627_update7      | Wed Jan 28 00:00:00 1970 PST | Wed Jan 28 00:00:00 1970 | 7  | 7          | foo
  637 | 407 | 00637_update7      | Sat Feb 07 00:00:00 1970 PST | Sat Feb 07 00:00:00 1970 | 7  | 7          | foo
  647 | 407 | 00647_update7      | Tue Feb 17 00:00:00 1970 PST | Tue Feb 17 00:00:00 1970 | 7  | 7          | foo
  657 | 407 | 00657_update7      | Fri Feb 27 00:00:00 1970 PST | Fri Feb 27 00:00:00 1970 | 7  | 7          | foo
  667 | 407 | 00667_update7      | Mon Mar 09 00:00:00 1970 PST | Mon Mar 09 00:00:00 1970 | 7  | 7          | foo
  677 | 407 | 00677_update7      | Thu Mar 19 00:00:00 1970 PST | Thu Mar 19 00:00:00 1970 | 7  | 7          | foo
  687 | 407 | 00687_update7      | Sun Mar 29 00:00:00 1970 PST | Sun Mar 29 00:00:00 1970 | 7  | 7          | foo
  697 | 407 | 00697_update7      | Wed Apr 08 00:00:00 1970 PST | Wed Apr 08 00:00:00 1970 | 7  | 7          | foo
  707 | 407 | 00707_update7      | Thu Jan 08 00:00:00 1970 PST | Thu Jan 08 00:00:00 1970 | 7  | 7          | foo
  717 | 407 | 00717_update7      | Sun Jan 18 00:00:00 1970 PST | Sun Jan 18 00:00:00 1970 | 7  | 7          | foo
  727 | 407 | 00727_update7      | Wed Jan 28 00:00:00 1970 PST | Wed Jan 28 00:00:00 1970 | 7  | 7          | foo
  737 | 407 | 00737_update7      | Sat Feb 07 00:00:00 1970 PST | Sat Feb 07 00:00:00 1970 | 7  | 7          | foo
  747 | 407 | 00747_update7      | Tue Feb 17 00:00:00 1970 PST | Tue Feb 17 00:00:00 1970 | 7  | 7          | foo
  757 | 407 | 00757_update7      | Fri Feb 27 00:00:00 1970 PST | Fri Feb 27 00:00:00 1970 | 7  | 7          | foo
  767 | 407 | 00767_update7      | Mon Mar 09 00:00:00 1970 PST | Mon Mar 09 00:00:00 1970 | 7  | 7          | foo
  777 | 407 | 00777_update7      | Thu Mar 19 00:00:00 1970 PST | Thu Mar 19 00:00:00 1970 | 7  | 7          | foo
  787 | 407 | 00787_update7      | Sun Mar 29 00:00:00 1970 PST | Sun Mar 29 00:00:00 1970 | 7  | 7          | foo
  797 | 407 | 00797_update7      | Wed Apr 08 00:00:00 1970 PST | Wed Apr 08 00:00:00 1970 | 7  | 7          | foo
  807 | 407 | 00807_update7      | Thu Jan 08 00:00:00 1970 PST | Thu Jan 08 00:00:00 1970 | 7  | 7          | foo
  817 | 407 | 00817_update7      | Sun Jan 18 00:00:00 1970 PST | Sun Jan 18 00:00:00 1970 | 7  | 7          | foo
  827 | 407 | 00827_update7      | Wed Jan 28 00:00:00 1970 PST | Wed Jan 28 00:00:00 1970 | 7  | 7          | foo
  837 | 407 | 00837_update7      | Sat Feb 07 00:00:00 1970 PST | Sat Feb 07 00:00:00 1970 | 7  | 7          | foo
  847 | 407 | 00847_update7      | Tue Feb 17 00:00:00 1970 PST | Tue Feb 17 00:00:00 1970 | 7  | 7          | foo
  857 | 407 | 00857_update7      | Fri Feb 27 00:00:00 1970 PST | Fri Feb 27 00:00:00 1970 | 7  | 7          | foo
  867 | 407 | 00867_update7      | Mon Mar 09 00:00:00 1970 PST | Mon Mar 09 00:00:00 1970 | 7  | 7          | foo
  877 | 407 | 00877_update7      | Thu Mar 19 00:00:00 1970 PST | Thu Mar 19 00:00:00 1970 | 7  | 7          | foo
  887 | 407 | 00887_update7      | Sun Mar 29 00:00:00 1970 PST | Sun Mar 29 00:00:00 1970 | 7  | 7          | foo
  897 | 407 | 00897_update7      | Wed Apr 08 00:00:00 1970 PST | Wed Apr 08 00:00:00 1970 | 7  | 7          | foo
  907 | 407 | 00907_update7      | Thu Jan 08 00:00:00 1970 PST | Thu Jan 08 00:00:00 1970 | 7  | 7          | foo
  917 | 407 | 00917_update7      | Sun Jan 18 00:00:00 1970 PST | Sun Jan 18 00:00:00 1970 | 7  | 7          | foo
  927 | 407 | 00927_update7      | Wed Jan 28 00:00:00 1970 PST | Wed Jan 28 00:00:00 1970 | 7  | 7          | foo
  937 | 407 | 00937_update7      | Sat Feb 07 00:00:00 1970 PST | Sat Feb 07 00:00:00 1970 | 7  | 7          | foo
  947 | 407 | 00947_update7      | Tue Feb 17 00:00:00 1970 PST | Tue Feb 17 00:00:00 1970 | 7  | 7          | foo
  957 | 407 | 00957_update7      | Fri Feb 27 00:00:00 1970 PST | Fri Feb 27 00:00:00 1970 | 7  | 7          | foo
  967 | 407 | 00967_update7      | Mon Mar 09 00:00:00 1970 PST | Mon Mar 09 00:00:00 1970 | 7  | 7          | foo
  977 | 407 | 00977_update7      | Thu Mar 19 00:00:00 1970 PST | Thu Mar 19 00:00:00 1970 | 7  | 7          | foo
  987 | 407 | 00987_update7      | Sun Mar 29 00:00:00 1970 PST | Sun Mar 29 00:00:00 1970 | 7  | 7          | foo
  997 | 407 | 00997_update7      | Wed Apr 08 00:00:00 1970 PST | Wed Apr 08 00:00:00 1970 | 7  | 7          | foo
 1007 | 507 | 0000700007_update7 |                              |                          |    | ft2        | 
 1017 | 507 | 0001700017_update7 |                              |                          |    | ft2        | 
(102 rows)

EXPLAIN (verbose, costs off)
UPDATE ft2 SET c2 = ft2.c2 + 500, c3 = ft2.c3 || '_update9', c7 = DEFAULT
  FROM ft1 WHERE ft1.c1 = ft2.c2 AND ft1.c1 % 10 = 9;
                                                                            QUERY PLAN                                                                             
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Update on public.ft2
   Remote SQL: UPDATE "S 1"."T 1" SET c2 = $2, c3 = $3, c7 = $4 WHERE ctid = $1
   ->  Hash Join
         Output: ft2.c1, (ft2.c2 + 500), NULL::integer, (ft2.c3 || '_update9'::text), ft2.c4, ft2.c5, ft2.c6, 'ft2       '::character(10), ft2.c8, ft2.ctid, ft1.*
         Hash Cond: (ft2.c2 = ft1.c1)
         ->  Foreign Scan on public.ft2
               Output: ft2.c1, ft2.c2, ft2.c3, ft2.c4, ft2.c5, ft2.c6, ft2.c8, ft2.ctid
               Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c8, ctid FROM "S 1"."T 1" FOR UPDATE
         ->  Hash
               Output: ft1.*, ft1.c1
               ->  Foreign Scan on public.ft1
                     Output: ft1.*, ft1.c1
                     Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE ((("C 1" % 10) = 9))
(13 rows)

UPDATE ft2 SET c2 = ft2.c2 + 500, c3 = ft2.c3 || '_update9', c7 = DEFAULT
  FROM ft1 WHERE ft1.c1 = ft2.c2 AND ft1.c1 % 10 = 9;
EXPLAIN (verbose, costs off)
  DELETE FROM ft2 WHERE c1 % 10 = 5 RETURNING c1, c4;
                                       QUERY PLAN                                       
----------------------------------------------------------------------------------------
 Delete on public.ft2
   Output: c1, c4
   Remote SQL: DELETE FROM "S 1"."T 1" WHERE ctid = $1 RETURNING "C 1", c4
   ->  Foreign Scan on public.ft2
         Output: ctid
         Remote SQL: SELECT ctid FROM "S 1"."T 1" WHERE ((("C 1" % 10) = 5)) FOR UPDATE
(6 rows)

DELETE FROM ft2 WHERE c1 % 10 = 5 RETURNING c1, c4;
  c1  |              c4              
------+------------------------------
    5 | Tue Jan 06 00:00:00 1970 PST
   15 | Fri Jan 16 00:00:00 1970 PST
   25 | Mon Jan 26 00:00:00 1970 PST
   35 | Thu Feb 05 00:00:00 1970 PST
   45 | Sun Feb 15 00:00:00 1970 PST
   55 | Wed Feb 25 00:00:00 1970 PST
   65 | Sat Mar 07 00:00:00 1970 PST
   75 | Tue Mar 17 00:00:00 1970 PST
   85 | Fri Mar 27 00:00:00 1970 PST
   95 | Mon Apr 06 00:00:00 1970 PST
  105 | Tue Jan 06 00:00:00 1970 PST
  115 | Fri Jan 16 00:00:00 1970 PST
  125 | Mon Jan 26 00:00:00 1970 PST
  135 | Thu Feb 05 00:00:00 1970 PST
  145 | Sun Feb 15 00:00:00 1970 PST
  155 | Wed Feb 25 00:00:00 1970 PST
  165 | Sat Mar 07 00:00:00 1970 PST
  175 | Tue Mar 17 00:00:00 1970 PST
  185 | Fri Mar 27 00:00:00 1970 PST
  195 | Mon Apr 06 00:00:00 1970 PST
  205 | Tue Jan 06 00:00:00 1970 PST
  215 | Fri Jan 16 00:00:00 1970 PST
  225 | Mon Jan 26 00:00:00 1970 PST
  235 | Thu Feb 05 00:00:00 1970 PST
  245 | Sun Feb 15 00:00:00 1970 PST
  255 | Wed Feb 25 00:00:00 1970 PST
  265 | Sat Mar 07 00:00:00 1970 PST
  275 | Tue Mar 17 00:00:00 1970 PST
  285 | Fri Mar 27 00:00:00 1970 PST
  295 | Mon Apr 06 00:00:00 1970 PST
  305 | Tue Jan 06 00:00:00 1970 PST
  315 | Fri Jan 16 00:00:00 1970 PST
  325 | Mon Jan 26 00:00:00 1970 PST
  335 | Thu Feb 05 00:00:00 1970 PST
  345 | Sun Feb 15 00:00:00 1970 PST
  355 | Wed Feb 25 00:00:00 1970 PST
  365 | Sat Mar 07 00:00:00 1970 PST
  375 | Tue Mar 17 00:00:00 1970 PST
  385 | Fri Mar 27 00:00:00 1970 PST
  395 | Mon Apr 06 00:00:00 1970 PST
  405 | Tue Jan 06 00:00:00 1970 PST
  415 | Fri Jan 16 00:00:00 1970 PST
  425 | Mon Jan 26 00:00:00 1970 PST
  435 | Thu Feb 05 00:00:00 1970 PST
  445 | Sun Feb 15 00:00:00 1970 PST
  455 | Wed Feb 25 00:00:00 1970 PST
  465 | Sat Mar 07 00:00:00 1970 PST
  475 | Tue Mar 17 00:00:00 1970 PST
  485 | Fri Mar 27 00:00:00 1970 PST
  495 | Mon Apr 06 00:00:00 1970 PST
  505 | Tue Jan 06 00:00:00 1970 PST
  515 | Fri Jan 16 00:00:00 1970 PST
  525 | Mon Jan 26 00:00:00 1970 PST
  535 | Thu Feb 05 00:00:00 1970 PST
  545 | Sun Feb 15 00:00:00 1970 PST
  555 | Wed Feb 25 00:00:00 1970 PST
  565 | Sat Mar 07 00:00:00 1970 PST
  575 | Tue Mar 17 00:00:00 1970 PST
  585 | Fri Mar 27 00:00:00 1970 PST
  595 | Mon Apr 06 00:00:00 1970 PST
  605 | Tue Jan 06 00:00:00 1970 PST
  615 | Fri Jan 16 00:00:00 1970 PST
  625 | Mon Jan 26 00:00:00 1970 PST
  635 | Thu Feb 05 00:00:00 1970 PST
  645 | Sun Feb 15 00:00:00 1970 PST
  655 | Wed Feb 25 00:00:00 1970 PST
  665 | Sat Mar 07 00:00:00 1970 PST
  675 | Tue Mar 17 00:00:00 1970 PST
  685 | Fri Mar 27 00:00:00 1970 PST
  695 | Mon Apr 06 00:00:00 1970 PST
  705 | Tue Jan 06 00:00:00 1970 PST
  715 | Fri Jan 16 00:00:00 1970 PST
  725 | Mon Jan 26 00:00:00 1970 PST
  735 | Thu Feb 05 00:00:00 1970 PST
  745 | Sun Feb 15 00:00:00 1970 PST
  755 | Wed Feb 25 00:00:00 1970 PST
  765 | Sat Mar 07 00:00:00 1970 PST
  775 | Tue Mar 17 00:00:00 1970 PST
  785 | Fri Mar 27 00:00:00 1970 PST
  795 | Mon Apr 06 00:00:00 1970 PST
  805 | Tue Jan 06 00:00:00 1970 PST
  815 | Fri Jan 16 00:00:00 1970 PST
  825 | Mon Jan 26 00:00:00 1970 PST
  835 | Thu Feb 05 00:00:00 1970 PST
  845 | Sun Feb 15 00:00:00 1970 PST
  855 | Wed Feb 25 00:00:00 1970 PST
  865 | Sat Mar 07 00:00:00 1970 PST
  875 | Tue Mar 17 00:00:00 1970 PST
  885 | Fri Mar 27 00:00:00 1970 PST
  895 | Mon Apr 06 00:00:00 1970 PST
  905 | Tue Jan 06 00:00:00 1970 PST
  915 | Fri Jan 16 00:00:00 1970 PST
  925 | Mon Jan 26 00:00:00 1970 PST
  935 | Thu Feb 05 00:00:00 1970 PST
  945 | Sun Feb 15 00:00:00 1970 PST
  955 | Wed Feb 25 00:00:00 1970 PST
  965 | Sat Mar 07 00:00:00 1970 PST
  975 | Tue Mar 17 00:00:00 1970 PST
  985 | Fri Mar 27 00:00:00 1970 PST
  995 | Mon Apr 06 00:00:00 1970 PST
 1005 | 
 1015 | 
 1105 | 
(103 rows)

EXPLAIN (verbose, costs off)
DELETE FROM ft2 USING ft1 WHERE ft1.c1 = ft2.c2 AND ft1.c1 % 10 = 2;
                                                      QUERY PLAN                                                      
----------------------------------------------------------------------------------------------------------------------
 Delete on public.ft2
   Remote SQL: DELETE FROM "S 1"."T 1" WHERE ctid = $1
   ->  Hash Join
         Output: ft2.ctid, ft1.*
         Hash Cond: (ft2.c2 = ft1.c1)
         ->  Foreign Scan on public.ft2
               Output: ft2.ctid, ft2.c2
               Remote SQL: SELECT c2, ctid FROM "S 1"."T 1" FOR UPDATE
         ->  Hash
               Output: ft1.*, ft1.c1
               ->  Foreign Scan on public.ft1
                     Output: ft1.*, ft1.c1
                     Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE ((("C 1" % 10) = 2))
(13 rows)

DELETE FROM ft2 USING ft1 WHERE ft1.c1 = ft2.c2 AND ft1.c1 % 10 = 2;
SELECT c1,c2,c3,c4 FROM ft2 ORDER BY c1;
  c1  | c2  |         c3         |              c4              
------+-----+--------------------+------------------------------
    1 |   1 | 00001              | Fri Jan 02 00:00:00 1970 PST
    3 | 303 | 00003_update3      | Sun Jan 04 00:00:00 1970 PST
    4 |   4 | 00004              | Mon Jan 05 00:00:00 1970 PST
    6 |   6 | 00006              | Wed Jan 07 00:00:00 1970 PST
    7 | 407 | 00007_update7      | Thu Jan 08 00:00:00 1970 PST
    8 |   8 | 00008              | Fri Jan 09 00:00:00 1970 PST
    9 | 509 | 00009_update9      | Sat Jan 10 00:00:00 1970 PST
   10 |   0 | 00010              | Sun Jan 11 00:00:00 1970 PST
   11 |   1 | 00011              | Mon Jan 12 00:00:00 1970 PST
   13 | 303 | 00013_update3      | Wed Jan 14 00:00:00 1970 PST
   14 |   4 | 00014              | Thu Jan 15 00:00:00 1970 PST
   16 |   6 | 00016              | Sat Jan 17 00:00:00 1970 PST
   17 | 407 | 00017_update7      | Sun Jan 18 00:00:00 1970 PST
   18 |   8 | 00018              | Mon Jan 19 00:00:00 1970 PST
   19 | 509 | 00019_update9      | Tue Jan 20 00:00:00 1970 PST
   20 |   0 | 00020              | Wed Jan 21 00:00:00 1970 PST
   21 |   1 | 00021              | Thu Jan 22 00:00:00 1970 PST
   23 | 303 | 00023_update3      | Sat Jan 24 00:00:00 1970 PST
   24 |   4 | 00024              | Sun Jan 25 00:00:00 1970 PST
   26 |   6 | 00026              | Tue Jan 27 00:00:00 1970 PST
   27 | 407 | 00027_update7      | Wed Jan 28 00:00:00 1970 PST
   28 |   8 | 00028              | Thu Jan 29 00:00:00 1970 PST
   29 | 509 | 00029_update9      | Fri Jan 30 00:00:00 1970 PST
   30 |   0 | 00030              | Sat Jan 31 00:00:00 1970 PST
   31 |   1 | 00031              | Sun Feb 01 00:00:00 1970 PST
   33 | 303 | 00033_update3      | Tue Feb 03 00:00:00 1970 PST
   34 |   4 | 00034              | Wed Feb 04 00:00:00 1970 PST
   36 |   6 | 00036              | Fri Feb 06 00:00:00 1970 PST
   37 | 407 | 00037_update7      | Sat Feb 07 00:00:00 1970 PST
   38 |   8 | 00038              | Sun Feb 08 00:00:00 1970 PST
   39 | 509 | 00039_update9      | Mon Feb 09 00:00:00 1970 PST
   40 |   0 | 00040              | Tue Feb 10 00:00:00 1970 PST
   41 |   1 | 00041              | Wed Feb 11 00:00:00 1970 PST
   43 | 303 | 00043_update3      | Fri Feb 13 00:00:00 1970 PST
   44 |   4 | 00044              | Sat Feb 14 00:00:00 1970 PST
   46 |   6 | 00046              | Mon Feb 16 00:00:00 1970 PST
   47 | 407 | 00047_update7      | Tue Feb 17 00:00:00 1970 PST
   48 |   8 | 00048              | Wed Feb 18 00:00:00 1970 PST
   49 | 509 | 00049_update9      | Thu Feb 19 00:00:00 1970 PST
   50 |   0 | 00050              | Fri Feb 20 00:00:00 1970 PST
   51 |   1 | 00051              | Sat Feb 21 00:00:00 1970 PST
   53 | 303 | 00053_update3      | Mon Feb 23 00:00:00 1970 PST
   54 |   4 | 00054              | Tue Feb 24 00:00:00 1970 PST
   56 |   6 | 00056              | Thu Feb 26 00:00:00 1970 PST
   57 | 407 | 00057_update7      | Fri Feb 27 00:00:00 1970 PST
   58 |   8 | 00058              | Sat Feb 28 00:00:00 1970 PST
   59 | 509 | 00059_update9      | Sun Mar 01 00:00:00 1970 PST
   60 |   0 | 00060              | Mon Mar 02 00:00:00 1970 PST
   61 |   1 | 00061              | Tue Mar 03 00:00:00 1970 PST
   63 | 303 | 00063_update3      | Thu Mar 05 00:00:00 1970 PST
   64 |   4 | 00064              | Fri Mar 06 00:00:00 1970 PST
   66 |   6 | 00066              | Sun Mar 08 00:00:00 1970 PST
   67 | 407 | 00067_update7      | Mon Mar 09 00:00:00 1970 PST
   68 |   8 | 00068              | Tue Mar 10 00:00:00 1970 PST
   69 | 509 | 00069_update9      | Wed Mar 11 00:00:00 1970 PST
   70 |   0 | 00070              | Thu Mar 12 00:00:00 1970 PST
   71 |   1 | 00071              | Fri Mar 13 00:00:00 1970 PST
   73 | 303 | 00073_update3      | Sun Mar 15 00:00:00 1970 PST
   74 |   4 | 00074              | Mon Mar 16 00:00:00 1970 PST
   76 |   6 | 00076              | Wed Mar 18 00:00:00 1970 PST
   77 | 407 | 00077_update7      | Thu Mar 19 00:00:00 1970 PST
   78 |   8 | 00078              | Fri Mar 20 00:00:00 1970 PST
   79 | 509 | 00079_update9      | Sat Mar 21 00:00:00 1970 PST
   80 |   0 | 00080              | Sun Mar 22 00:00:00 1970 PST
   81 |   1 | 00081              | Mon Mar 23 00:00:00 1970 PST
   83 | 303 | 00083_update3      | Wed Mar 25 00:00:00 1970 PST
   84 |   4 | 00084              | Thu Mar 26 00:00:00 1970 PST
   86 |   6 | 00086              | Sat Mar 28 00:00:00 1970 PST
   87 | 407 | 00087_update7      | Sun Mar 29 00:00:00 1970 PST
   88 |   8 | 00088              | Mon Mar 30 00:00:00 1970 PST
   89 | 509 | 00089_update9      | Tue Mar 31 00:00:00 1970 PST
   90 |   0 | 00090              | Wed Apr 01 00:00:00 1970 PST
   91 |   1 | 00091              | Thu Apr 02 00:00:00 1970 PST
   93 | 303 | 00093_update3      | Sat Apr 04 00:00:00 1970 PST
   94 |   4 | 00094              | Sun Apr 05 00:00:00 1970 PST
   96 |   6 | 00096              | Tue Apr 07 00:00:00 1970 PST
   97 | 407 | 00097_update7      | Wed Apr 08 00:00:00 1970 PST
   98 |   8 | 00098              | Thu Apr 09 00:00:00 1970 PST
   99 | 509 | 00099_update9      | Fri Apr 10 00:00:00 1970 PST
  100 |   0 | 00100              | Thu Jan 01 00:00:00 1970 PST
  101 |   1 | 00101              | Fri Jan 02 00:00:00 1970 PST
  103 | 303 | 00103_update3      | Sun Jan 04 00:00:00 1970 PST
  104 |   4 | 00104              | Mon Jan 05 00:00:00 1970 PST
  106 |   6 | 00106              | Wed Jan 07 00:00:00 1970 PST
  107 | 407 | 00107_update7      | Thu Jan 08 00:00:00 1970 PST
  108 |   8 | 00108              | Fri Jan 09 00:00:00 1970 PST
  109 | 509 | 00109_update9      | Sat Jan 10 00:00:00 1970 PST
  110 |   0 | 00110              | Sun Jan 11 00:00:00 1970 PST
  111 |   1 | 00111              | Mon Jan 12 00:00:00 1970 PST
  113 | 303 | 00113_update3      | Wed Jan 14 00:00:00 1970 PST
  114 |   4 | 00114              | Thu Jan 15 00:00:00 1970 PST
  116 |   6 | 00116              | Sat Jan 17 00:00:00 1970 PST
  117 | 407 | 00117_update7      | Sun Jan 18 00:00:00 1970 PST
  118 |   8 | 00118              | Mon Jan 19 00:00:00 1970 PST
  119 | 509 | 00119_update9      | Tue Jan 20 00:00:00 1970 PST
  120 |   0 | 00120              | Wed Jan 21 00:00:00 1970 PST
  121 |   1 | 00121              | Thu Jan 22 00:00:00 1970 PST
  123 | 303 | 00123_update3      | Sat Jan 24 00:00:00 1970 PST
  124 |   4 | 00124              | Sun Jan 25 00:00:00 1970 PST
  126 |   6 | 00126              | Tue Jan 27 00:00:00 1970 PST
  127 | 407 | 00127_update7      | Wed Jan 28 00:00:00 1970 PST
  128 |   8 | 00128              | Thu Jan 29 00:00:00 1970 PST
  129 | 509 | 00129_update9      | Fri Jan 30 00:00:00 1970 PST
  130 |   0 | 00130              | Sat Jan 31 00:00:00 1970 PST
  131 |   1 | 00131              | Sun Feb 01 00:00:00 1970 PST
  133 | 303 | 00133_update3      | Tue Feb 03 00:00:00 1970 PST
  134 |   4 | 00134              | Wed Feb 04 00:00:00 1970 PST
  136 |   6 | 00136              | Fri Feb 06 00:00:00 1970 PST
  137 | 407 | 00137_update7      | Sat Feb 07 00:00:00 1970 PST
  138 |   8 | 00138              | Sun Feb 08 00:00:00 1970 PST
  139 | 509 | 00139_update9      | Mon Feb 09 00:00:00 1970 PST
  140 |   0 | 00140              | Tue Feb 10 00:00:00 1970 PST
  141 |   1 | 00141              | Wed Feb 11 00:00:00 1970 PST
  143 | 303 | 00143_update3      | Fri Feb 13 00:00:00 1970 PST
  144 |   4 | 00144              | Sat Feb 14 00:00:00 1970 PST
  146 |   6 | 00146              | Mon Feb 16 00:00:00 1970 PST
  147 | 407 | 00147_update7      | Tue Feb 17 00:00:00 1970 PST
  148 |   8 | 00148              | Wed Feb 18 00:00:00 1970 PST
  149 | 509 | 00149_update9      | Thu Feb 19 00:00:00 1970 PST
  150 |   0 | 00150              | Fri Feb 20 00:00:00 1970 PST
  151 |   1 | 00151              | Sat Feb 21 00:00:00 1970 PST
  153 | 303 | 00153_update3      | Mon Feb 23 00:00:00 1970 PST
  154 |   4 | 00154              | Tue Feb 24 00:00:00 1970 PST
  156 |   6 | 00156              | Thu Feb 26 00:00:00 1970 PST
  157 | 407 | 00157_update7      | Fri Feb 27 00:00:00 1970 PST
  158 |   8 | 00158              | Sat Feb 28 00:00:00 1970 PST
  159 | 509 | 00159_update9      | Sun Mar 01 00:00:00 1970 PST
  160 |   0 | 00160              | Mon Mar 02 00:00:00 1970 PST
  161 |   1 | 00161              | Tue Mar 03 00:00:00 1970 PST
  163 | 303 | 00163_update3      | Thu Mar 05 00:00:00 1970 PST
  164 |   4 | 00164              | Fri Mar 06 00:00:00 1970 PST
  166 |   6 | 00166              | Sun Mar 08 00:00:00 1970 PST
  167 | 407 | 00167_update7      | Mon Mar 09 00:00:00 1970 PST
  168 |   8 | 00168              | Tue Mar 10 00:00:00 1970 PST
  169 | 509 | 00169_update9      | Wed Mar 11 00:00:00 1970 PST
  170 |   0 | 00170              | Thu Mar 12 00:00:00 1970 PST
  171 |   1 | 00171              | Fri Mar 13 00:00:00 1970 PST
  173 | 303 | 00173_update3      | Sun Mar 15 00:00:00 1970 PST
  174 |   4 | 00174              | Mon Mar 16 00:00:00 1970 PST
  176 |   6 | 00176              | Wed Mar 18 00:00:00 1970 PST
  177 | 407 | 00177_update7      | Thu Mar 19 00:00:00 1970 PST
  178 |   8 | 00178              | Fri Mar 20 00:00:00 1970 PST
  179 | 509 | 00179_update9      | Sat Mar 21 00:00:00 1970 PST
  180 |   0 | 00180              | Sun Mar 22 00:00:00 1970 PST
  181 |   1 | 00181              | Mon Mar 23 00:00:00 1970 PST
  183 | 303 | 00183_update3      | Wed Mar 25 00:00:00 1970 PST
  184 |   4 | 00184              | Thu Mar 26 00:00:00 1970 PST
  186 |   6 | 00186              | Sat Mar 28 00:00:00 1970 PST
  187 | 407 | 00187_update7      | Sun Mar 29 00:00:00 1970 PST
  188 |   8 | 00188              | Mon Mar 30 00:00:00 1970 PST
  189 | 509 | 00189_update9      | Tue Mar 31 00:00:00 1970 PST
  190 |   0 | 00190              | Wed Apr 01 00:00:00 1970 PST
  191 |   1 | 00191              | Thu Apr 02 00:00:00 1970 PST
  193 | 303 | 00193_update3      | Sat Apr 04 00:00:00 1970 PST
  194 |   4 | 00194              | Sun Apr 05 00:00:00 1970 PST
  196 |   6 | 00196              | Tue Apr 07 00:00:00 1970 PST
  197 | 407 | 00197_update7      | Wed Apr 08 00:00:00 1970 PST
  198 |   8 | 00198              | Thu Apr 09 00:00:00 1970 PST
  199 | 509 | 00199_update9      | Fri Apr 10 00:00:00 1970 PST
  200 |   0 | 00200              | Thu Jan 01 00:00:00 1970 PST
  201 |   1 | 00201              | Fri Jan 02 00:00:00 1970 PST
  203 | 303 | 00203_update3      | Sun Jan 04 00:00:00 1970 PST
  204 |   4 | 00204              | Mon Jan 05 00:00:00 1970 PST
  206 |   6 | 00206              | Wed Jan 07 00:00:00 1970 PST
  207 | 407 | 00207_update7      | Thu Jan 08 00:00:00 1970 PST
  208 |   8 | 00208              | Fri Jan 09 00:00:00 1970 PST
  209 | 509 | 00209_update9      | Sat Jan 10 00:00:00 1970 PST
  210 |   0 | 00210              | Sun Jan 11 00:00:00 1970 PST
  211 |   1 | 00211              | Mon Jan 12 00:00:00 1970 PST
  213 | 303 | 00213_update3      | Wed Jan 14 00:00:00 1970 PST
  214 |   4 | 00214              | Thu Jan 15 00:00:00 1970 PST
  216 |   6 | 00216              | Sat Jan 17 00:00:00 1970 PST
  217 | 407 | 00217_update7      | Sun Jan 18 00:00:00 1970 PST
  218 |   8 | 00218              | Mon Jan 19 00:00:00 1970 PST
  219 | 509 | 00219_update9      | Tue Jan 20 00:00:00 1970 PST
  220 |   0 | 00220              | Wed Jan 21 00:00:00 1970 PST
  221 |   1 | 00221              | Thu Jan 22 00:00:00 1970 PST
  223 | 303 | 00223_update3      | Sat Jan 24 00:00:00 1970 PST
  224 |   4 | 00224              | Sun Jan 25 00:00:00 1970 PST
  226 |   6 | 00226              | Tue Jan 27 00:00:00 1970 PST
  227 | 407 | 00227_update7      | Wed Jan 28 00:00:00 1970 PST
  228 |   8 | 00228              | Thu Jan 29 00:00:00 1970 PST
  229 | 509 | 00229_update9      | Fri Jan 30 00:00:00 1970 PST
  230 |   0 | 00230              | Sat Jan 31 00:00:00 1970 PST
  231 |   1 | 00231              | Sun Feb 01 00:00:00 1970 PST
  233 | 303 | 00233_update3      | Tue Feb 03 00:00:00 1970 PST
  234 |   4 | 00234              | Wed Feb 04 00:00:00 1970 PST
  236 |   6 | 00236              | Fri Feb 06 00:00:00 1970 PST
  237 | 407 | 00237_update7      | Sat Feb 07 00:00:00 1970 PST
  238 |   8 | 00238              | Sun Feb 08 00:00:00 1970 PST
  239 | 509 | 00239_update9      | Mon Feb 09 00:00:00 1970 PST
  240 |   0 | 00240              | Tue Feb 10 00:00:00 1970 PST
  241 |   1 | 00241              | Wed Feb 11 00:00:00 1970 PST
  243 | 303 | 00243_update3      | Fri Feb 13 00:00:00 1970 PST
  244 |   4 | 00244              | Sat Feb 14 00:00:00 1970 PST
  246 |   6 | 00246              | Mon Feb 16 00:00:00 1970 PST
  247 | 407 | 00247_update7      | Tue Feb 17 00:00:00 1970 PST
  248 |   8 | 00248              | Wed Feb 18 00:00:00 1970 PST
  249 | 509 | 00249_update9      | Thu Feb 19 00:00:00 1970 PST
  250 |   0 | 00250              | Fri Feb 20 00:00:00 1970 PST
  251 |   1 | 00251              | Sat Feb 21 00:00:00 1970 PST
  253 | 303 | 00253_update3      | Mon Feb 23 00:00:00 1970 PST
  254 |   4 | 00254              | Tue Feb 24 00:00:00 1970 PST
  256 |   6 | 00256              | Thu Feb 26 00:00:00 1970 PST
  257 | 407 | 00257_update7      | Fri Feb 27 00:00:00 1970 PST
  258 |   8 | 00258              | Sat Feb 28 00:00:00 1970 PST
  259 | 509 | 00259_update9      | Sun Mar 01 00:00:00 1970 PST
  260 |   0 | 00260              | Mon Mar 02 00:00:00 1970 PST
  261 |   1 | 00261              | Tue Mar 03 00:00:00 1970 PST
  263 | 303 | 00263_update3      | Thu Mar 05 00:00:00 1970 PST
  264 |   4 | 00264              | Fri Mar 06 00:00:00 1970 PST
  266 |   6 | 00266              | Sun Mar 08 00:00:00 1970 PST
  267 | 407 | 00267_update7      | Mon Mar 09 00:00:00 1970 PST
  268 |   8 | 00268              | Tue Mar 10 00:00:00 1970 PST
  269 | 509 | 00269_update9      | Wed Mar 11 00:00:00 1970 PST
  270 |   0 | 00270              | Thu Mar 12 00:00:00 1970 PST
  271 |   1 | 00271              | Fri Mar 13 00:00:00 1970 PST
  273 | 303 | 00273_update3      | Sun Mar 15 00:00:00 1970 PST
  274 |   4 | 00274              | Mon Mar 16 00:00:00 1970 PST
  276 |   6 | 00276              | Wed Mar 18 00:00:00 1970 PST
  277 | 407 | 00277_update7      | Thu Mar 19 00:00:00 1970 PST
  278 |   8 | 00278              | Fri Mar 20 00:00:00 1970 PST
  279 | 509 | 00279_update9      | Sat Mar 21 00:00:00 1970 PST
  280 |   0 | 00280              | Sun Mar 22 00:00:00 1970 PST
  281 |   1 | 00281              | Mon Mar 23 00:00:00 1970 PST
  283 | 303 | 00283_update3      | Wed Mar 25 00:00:00 1970 PST
  284 |   4 | 00284              | Thu Mar 26 00:00:00 1970 PST
  286 |   6 | 00286              | Sat Mar 28 00:00:00 1970 PST
  287 | 407 | 00287_update7      | Sun Mar 29 00:00:00 1970 PST
  288 |   8 | 00288              | Mon Mar 30 00:00:00 1970 PST
  289 | 509 | 00289_update9      | Tue Mar 31 00:00:00 1970 PST
  290 |   0 | 00290              | Wed Apr 01 00:00:00 1970 PST
  291 |   1 | 00291              | Thu Apr 02 00:00:00 1970 PST
  293 | 303 | 00293_update3      | Sat Apr 04 00:00:00 1970 PST
  294 |   4 | 00294              | Sun Apr 05 00:00:00 1970 PST
  296 |   6 | 00296              | Tue Apr 07 00:00:00 1970 PST
  297 | 407 | 00297_update7      | Wed Apr 08 00:00:00 1970 PST
  298 |   8 | 00298              | Thu Apr 09 00:00:00 1970 PST
  299 | 509 | 00299_update9      | Fri Apr 10 00:00:00 1970 PST
  300 |   0 | 00300              | Thu Jan 01 00:00:00 1970 PST
  301 |   1 | 00301              | Fri Jan 02 00:00:00 1970 PST
  303 | 303 | 00303_update3      | Sun Jan 04 00:00:00 1970 PST
  304 |   4 | 00304              | Mon Jan 05 00:00:00 1970 PST
  306 |   6 | 00306              | Wed Jan 07 00:00:00 1970 PST
  307 | 407 | 00307_update7      | Thu Jan 08 00:00:00 1970 PST
  308 |   8 | 00308              | Fri Jan 09 00:00:00 1970 PST
  309 | 509 | 00309_update9      | Sat Jan 10 00:00:00 1970 PST
  310 |   0 | 00310              | Sun Jan 11 00:00:00 1970 PST
  311 |   1 | 00311              | Mon Jan 12 00:00:00 1970 PST
  313 | 303 | 00313_update3      | Wed Jan 14 00:00:00 1970 PST
  314 |   4 | 00314              | Thu Jan 15 00:00:00 1970 PST
  316 |   6 | 00316              | Sat Jan 17 00:00:00 1970 PST
  317 | 407 | 00317_update7      | Sun Jan 18 00:00:00 1970 PST
  318 |   8 | 00318              | Mon Jan 19 00:00:00 1970 PST
  319 | 509 | 00319_update9      | Tue Jan 20 00:00:00 1970 PST
  320 |   0 | 00320              | Wed Jan 21 00:00:00 1970 PST
  321 |   1 | 00321              | Thu Jan 22 00:00:00 1970 PST
  323 | 303 | 00323_update3      | Sat Jan 24 00:00:00 1970 PST
  324 |   4 | 00324              | Sun Jan 25 00:00:00 1970 PST
  326 |   6 | 00326              | Tue Jan 27 00:00:00 1970 PST
  327 | 407 | 00327_update7      | Wed Jan 28 00:00:00 1970 PST
  328 |   8 | 00328              | Thu Jan 29 00:00:00 1970 PST
  329 | 509 | 00329_update9      | Fri Jan 30 00:00:00 1970 PST
  330 |   0 | 00330              | Sat Jan 31 00:00:00 1970 PST
  331 |   1 | 00331              | Sun Feb 01 00:00:00 1970 PST
  333 | 303 | 00333_update3      | Tue Feb 03 00:00:00 1970 PST
  334 |   4 | 00334              | Wed Feb 04 00:00:00 1970 PST
  336 |   6 | 00336              | Fri Feb 06 00:00:00 1970 PST
  337 | 407 | 00337_update7      | Sat Feb 07 00:00:00 1970 PST
  338 |   8 | 00338              | Sun Feb 08 00:00:00 1970 PST
  339 | 509 | 00339_update9      | Mon Feb 09 00:00:00 1970 PST
  340 |   0 | 00340              | Tue Feb 10 00:00:00 1970 PST
  341 |   1 | 00341              | Wed Feb 11 00:00:00 1970 PST
  343 | 303 | 00343_update3      | Fri Feb 13 00:00:00 1970 PST
  344 |   4 | 00344              | Sat Feb 14 00:00:00 1970 PST
  346 |   6 | 00346              | Mon Feb 16 00:00:00 1970 PST
  347 | 407 | 00347_update7      | Tue Feb 17 00:00:00 1970 PST
  348 |   8 | 00348              | Wed Feb 18 00:00:00 1970 PST
  349 | 509 | 00349_update9      | Thu Feb 19 00:00:00 1970 PST
  350 |   0 | 00350              | Fri Feb 20 00:00:00 1970 PST
  351 |   1 | 00351              | Sat Feb 21 00:00:00 1970 PST
  353 | 303 | 00353_update3      | Mon Feb 23 00:00:00 1970 PST
  354 |   4 | 00354              | Tue Feb 24 00:00:00 1970 PST
  356 |   6 | 00356              | Thu Feb 26 00:00:00 1970 PST
  357 | 407 | 00357_update7      | Fri Feb 27 00:00:00 1970 PST
  358 |   8 | 00358              | Sat Feb 28 00:00:00 1970 PST
  359 | 509 | 00359_update9      | Sun Mar 01 00:00:00 1970 PST
  360 |   0 | 00360              | Mon Mar 02 00:00:00 1970 PST
  361 |   1 | 00361              | Tue Mar 03 00:00:00 1970 PST
  363 | 303 | 00363_update3      | Thu Mar 05 00:00:00 1970 PST
  364 |   4 | 00364              | Fri Mar 06 00:00:00 1970 PST
  366 |   6 | 00366              | Sun Mar 08 00:00:00 1970 PST
  367 | 407 | 00367_update7      | Mon Mar 09 00:00:00 1970 PST
  368 |   8 | 00368              | Tue Mar 10 00:00:00 1970 PST
  369 | 509 | 00369_update9      | Wed Mar 11 00:00:00 1970 PST
  370 |   0 | 00370              | Thu Mar 12 00:00:00 1970 PST
  371 |   1 | 00371              | Fri Mar 13 00:00:00 1970 PST
  373 | 303 | 00373_update3      | Sun Mar 15 00:00:00 1970 PST
  374 |   4 | 00374              | Mon Mar 16 00:00:00 1970 PST
  376 |   6 | 00376              | Wed Mar 18 00:00:00 1970 PST
  377 | 407 | 00377_update7      | Thu Mar 19 00:00:00 1970 PST
  378 |   8 | 00378              | Fri Mar 20 00:00:00 1970 PST
  379 | 509 | 00379_update9      | Sat Mar 21 00:00:00 1970 PST
  380 |   0 | 00380              | Sun Mar 22 00:00:00 1970 PST
  381 |   1 | 00381              | Mon Mar 23 00:00:00 1970 PST
  383 | 303 | 00383_update3      | Wed Mar 25 00:00:00 1970 PST
  384 |   4 | 00384              | Thu Mar 26 00:00:00 1970 PST
  386 |   6 | 00386              | Sat Mar 28 00:00:00 1970 PST
  387 | 407 | 00387_update7      | Sun Mar 29 00:00:00 1970 PST
  388 |   8 | 00388              | Mon Mar 30 00:00:00 1970 PST
  389 | 509 | 00389_update9      | Tue Mar 31 00:00:00 1970 PST
  390 |   0 | 00390              | Wed Apr 01 00:00:00 1970 PST
  391 |   1 | 00391              | Thu Apr 02 00:00:00 1970 PST
  393 | 303 | 00393_update3      | Sat Apr 04 00:00:00 1970 PST
  394 |   4 | 00394              | Sun Apr 05 00:00:00 1970 PST
  396 |   6 | 00396              | Tue Apr 07 00:00:00 1970 PST
  397 | 407 | 00397_update7      | Wed Apr 08 00:00:00 1970 PST
  398 |   8 | 00398              | Thu Apr 09 00:00:00 1970 PST
  399 | 509 | 00399_update9      | Fri Apr 10 00:00:00 1970 PST
  400 |   0 | 00400              | Thu Jan 01 00:00:00 1970 PST
  401 |   1 | 00401              | Fri Jan 02 00:00:00 1970 PST
  403 | 303 | 00403_update3      | Sun Jan 04 00:00:00 1970 PST
  404 |   4 | 00404              | Mon Jan 05 00:00:00 1970 PST
  406 |   6 | 00406              | Wed Jan 07 00:00:00 1970 PST
  407 | 407 | 00407_update7      | Thu Jan 08 00:00:00 1970 PST
  408 |   8 | 00408              | Fri Jan 09 00:00:00 1970 PST
  409 | 509 | 00409_update9      | Sat Jan 10 00:00:00 1970 PST
  410 |   0 | 00410              | Sun Jan 11 00:00:00 1970 PST
  411 |   1 | 00411              | Mon Jan 12 00:00:00 1970 PST
  413 | 303 | 00413_update3      | Wed Jan 14 00:00:00 1970 PST
  414 |   4 | 00414              | Thu Jan 15 00:00:00 1970 PST
  416 |   6 | 00416              | Sat Jan 17 00:00:00 1970 PST
  417 | 407 | 00417_update7      | Sun Jan 18 00:00:00 1970 PST
  418 |   8 | 00418              | Mon Jan 19 00:00:00 1970 PST
  419 | 509 | 00419_update9      | Tue Jan 20 00:00:00 1970 PST
  420 |   0 | 00420              | Wed Jan 21 00:00:00 1970 PST
  421 |   1 | 00421              | Thu Jan 22 00:00:00 1970 PST
  423 | 303 | 00423_update3      | Sat Jan 24 00:00:00 1970 PST
  424 |   4 | 00424              | Sun Jan 25 00:00:00 1970 PST
  426 |   6 | 00426              | Tue Jan 27 00:00:00 1970 PST
  427 | 407 | 00427_update7      | Wed Jan 28 00:00:00 1970 PST
  428 |   8 | 00428              | Thu Jan 29 00:00:00 1970 PST
  429 | 509 | 00429_update9      | Fri Jan 30 00:00:00 1970 PST
  430 |   0 | 00430              | Sat Jan 31 00:00:00 1970 PST
  431 |   1 | 00431              | Sun Feb 01 00:00:00 1970 PST
  433 | 303 | 00433_update3      | Tue Feb 03 00:00:00 1970 PST
  434 |   4 | 00434              | Wed Feb 04 00:00:00 1970 PST
  436 |   6 | 00436              | Fri Feb 06 00:00:00 1970 PST
  437 | 407 | 00437_update7      | Sat Feb 07 00:00:00 1970 PST
  438 |   8 | 00438              | Sun Feb 08 00:00:00 1970 PST
  439 | 509 | 00439_update9      | Mon Feb 09 00:00:00 1970 PST
  440 |   0 | 00440              | Tue Feb 10 00:00:00 1970 PST
  441 |   1 | 00441              | Wed Feb 11 00:00:00 1970 PST
  443 | 303 | 00443_update3      | Fri Feb 13 00:00:00 1970 PST
  444 |   4 | 00444              | Sat Feb 14 00:00:00 1970 PST
  446 |   6 | 00446              | Mon Feb 16 00:00:00 1970 PST
  447 | 407 | 00447_update7      | Tue Feb 17 00:00:00 1970 PST
  448 |   8 | 00448              | Wed Feb 18 00:00:00 1970 PST
  449 | 509 | 00449_update9      | Thu Feb 19 00:00:00 1970 PST
  450 |   0 | 00450              | Fri Feb 20 00:00:00 1970 PST
  451 |   1 | 00451              | Sat Feb 21 00:00:00 1970 PST
  453 | 303 | 00453_update3      | Mon Feb 23 00:00:00 1970 PST
  454 |   4 | 00454              | Tue Feb 24 00:00:00 1970 PST
  456 |   6 | 00456              | Thu Feb 26 00:00:00 1970 PST
  457 | 407 | 00457_update7      | Fri Feb 27 00:00:00 1970 PST
  458 |   8 | 00458              | Sat Feb 28 00:00:00 1970 PST
  459 | 509 | 00459_update9      | Sun Mar 01 00:00:00 1970 PST
  460 |   0 | 00460              | Mon Mar 02 00:00:00 1970 PST
  461 |   1 | 00461              | Tue Mar 03 00:00:00 1970 PST
  463 | 303 | 00463_update3      | Thu Mar 05 00:00:00 1970 PST
  464 |   4 | 00464              | Fri Mar 06 00:00:00 1970 PST
  466 |   6 | 00466              | Sun Mar 08 00:00:00 1970 PST
  467 | 407 | 00467_update7      | Mon Mar 09 00:00:00 1970 PST
  468 |   8 | 00468              | Tue Mar 10 00:00:00 1970 PST
  469 | 509 | 00469_update9      | Wed Mar 11 00:00:00 1970 PST
  470 |   0 | 00470              | Thu Mar 12 00:00:00 1970 PST
  471 |   1 | 00471              | Fri Mar 13 00:00:00 1970 PST
  473 | 303 | 00473_update3      | Sun Mar 15 00:00:00 1970 PST
  474 |   4 | 00474              | Mon Mar 16 00:00:00 1970 PST
  476 |   6 | 00476              | Wed Mar 18 00:00:00 1970 PST
  477 | 407 | 00477_update7      | Thu Mar 19 00:00:00 1970 PST
  478 |   8 | 00478              | Fri Mar 20 00:00:00 1970 PST
  479 | 509 | 00479_update9      | Sat Mar 21 00:00:00 1970 PST
  480 |   0 | 00480              | Sun Mar 22 00:00:00 1970 PST
  481 |   1 | 00481              | Mon Mar 23 00:00:00 1970 PST
  483 | 303 | 00483_update3      | Wed Mar 25 00:00:00 1970 PST
  484 |   4 | 00484              | Thu Mar 26 00:00:00 1970 PST
  486 |   6 | 00486              | Sat Mar 28 00:00:00 1970 PST
  487 | 407 | 00487_update7      | Sun Mar 29 00:00:00 1970 PST
  488 |   8 | 00488              | Mon Mar 30 00:00:00 1970 PST
  489 | 509 | 00489_update9      | Tue Mar 31 00:00:00 1970 PST
  490 |   0 | 00490              | Wed Apr 01 00:00:00 1970 PST
  491 |   1 | 00491              | Thu Apr 02 00:00:00 1970 PST
  493 | 303 | 00493_update3      | Sat Apr 04 00:00:00 1970 PST
  494 |   4 | 00494              | Sun Apr 05 00:00:00 1970 PST
  496 |   6 | 00496              | Tue Apr 07 00:00:00 1970 PST
  497 | 407 | 00497_update7      | Wed Apr 08 00:00:00 1970 PST
  498 |   8 | 00498              | Thu Apr 09 00:00:00 1970 PST
  499 | 509 | 00499_update9      | Fri Apr 10 00:00:00 1970 PST
  500 |   0 | 00500              | Thu Jan 01 00:00:00 1970 PST
  501 |   1 | 00501              | Fri Jan 02 00:00:00 1970 PST
  503 | 303 | 00503_update3      | Sun Jan 04 00:00:00 1970 PST
  504 |   4 | 00504              | Mon Jan 05 00:00:00 1970 PST
  506 |   6 | 00506              | Wed Jan 07 00:00:00 1970 PST
  507 | 407 | 00507_update7      | Thu Jan 08 00:00:00 1970 PST
  508 |   8 | 00508              | Fri Jan 09 00:00:00 1970 PST
  509 | 509 | 00509_update9      | Sat Jan 10 00:00:00 1970 PST
  510 |   0 | 00510              | Sun Jan 11 00:00:00 1970 PST
  511 |   1 | 00511              | Mon Jan 12 00:00:00 1970 PST
  513 | 303 | 00513_update3      | Wed Jan 14 00:00:00 1970 PST
  514 |   4 | 00514              | Thu Jan 15 00:00:00 1970 PST
  516 |   6 | 00516              | Sat Jan 17 00:00:00 1970 PST
  517 | 407 | 00517_update7      | Sun Jan 18 00:00:00 1970 PST
  518 |   8 | 00518              | Mon Jan 19 00:00:00 1970 PST
  519 | 509 | 00519_update9      | Tue Jan 20 00:00:00 1970 PST
  520 |   0 | 00520              | Wed Jan 21 00:00:00 1970 PST
  521 |   1 | 00521              | Thu Jan 22 00:00:00 1970 PST
  523 | 303 | 00523_update3      | Sat Jan 24 00:00:00 1970 PST
  524 |   4 | 00524              | Sun Jan 25 00:00:00 1970 PST
  526 |   6 | 00526              | Tue Jan 27 00:00:00 1970 PST
  527 | 407 | 00527_update7      | Wed Jan 28 00:00:00 1970 PST
  528 |   8 | 00528              | Thu Jan 29 00:00:00 1970 PST
  529 | 509 | 00529_update9      | Fri Jan 30 00:00:00 1970 PST
  530 |   0 | 00530              | Sat Jan 31 00:00:00 1970 PST
  531 |   1 | 00531              | Sun Feb 01 00:00:00 1970 PST
  533 | 303 | 00533_update3      | Tue Feb 03 00:00:00 1970 PST
  534 |   4 | 00534              | Wed Feb 04 00:00:00 1970 PST
  536 |   6 | 00536              | Fri Feb 06 00:00:00 1970 PST
  537 | 407 | 00537_update7      | Sat Feb 07 00:00:00 1970 PST
  538 |   8 | 00538              | Sun Feb 08 00:00:00 1970 PST
  539 | 509 | 00539_update9      | Mon Feb 09 00:00:00 1970 PST
  540 |   0 | 00540              | Tue Feb 10 00:00:00 1970 PST
  541 |   1 | 00541              | Wed Feb 11 00:00:00 1970 PST
  543 | 303 | 00543_update3      | Fri Feb 13 00:00:00 1970 PST
  544 |   4 | 00544              | Sat Feb 14 00:00:00 1970 PST
  546 |   6 | 00546              | Mon Feb 16 00:00:00 1970 PST
  547 | 407 | 00547_update7      | Tue Feb 17 00:00:00 1970 PST
  548 |   8 | 00548              | Wed Feb 18 00:00:00 1970 PST
  549 | 509 | 00549_update9      | Thu Feb 19 00:00:00 1970 PST
  550 |   0 | 00550              | Fri Feb 20 00:00:00 1970 PST
  551 |   1 | 00551              | Sat Feb 21 00:00:00 1970 PST
  553 | 303 | 00553_update3      | Mon Feb 23 00:00:00 1970 PST
  554 |   4 | 00554              | Tue Feb 24 00:00:00 1970 PST
  556 |   6 | 00556              | Thu Feb 26 00:00:00 1970 PST
  557 | 407 | 00557_update7      | Fri Feb 27 00:00:00 1970 PST
  558 |   8 | 00558              | Sat Feb 28 00:00:00 1970 PST
  559 | 509 | 00559_update9      | Sun Mar 01 00:00:00 1970 PST
  560 |   0 | 00560              | Mon Mar 02 00:00:00 1970 PST
  561 |   1 | 00561              | Tue Mar 03 00:00:00 1970 PST
  563 | 303 | 00563_update3      | Thu Mar 05 00:00:00 1970 PST
  564 |   4 | 00564              | Fri Mar 06 00:00:00 1970 PST
  566 |   6 | 00566              | Sun Mar 08 00:00:00 1970 PST
  567 | 407 | 00567_update7      | Mon Mar 09 00:00:00 1970 PST
  568 |   8 | 00568              | Tue Mar 10 00:00:00 1970 PST
  569 | 509 | 00569_update9      | Wed Mar 11 00:00:00 1970 PST
  570 |   0 | 00570              | Thu Mar 12 00:00:00 1970 PST
  571 |   1 | 00571              | Fri Mar 13 00:00:00 1970 PST
  573 | 303 | 00573_update3      | Sun Mar 15 00:00:00 1970 PST
  574 |   4 | 00574              | Mon Mar 16 00:00:00 1970 PST
  576 |   6 | 00576              | Wed Mar 18 00:00:00 1970 PST
  577 | 407 | 00577_update7      | Thu Mar 19 00:00:00 1970 PST
  578 |   8 | 00578              | Fri Mar 20 00:00:00 1970 PST
  579 | 509 | 00579_update9      | Sat Mar 21 00:00:00 1970 PST
  580 |   0 | 00580              | Sun Mar 22 00:00:00 1970 PST
  581 |   1 | 00581              | Mon Mar 23 00:00:00 1970 PST
  583 | 303 | 00583_update3      | Wed Mar 25 00:00:00 1970 PST
  584 |   4 | 00584              | Thu Mar 26 00:00:00 1970 PST
  586 |   6 | 00586              | Sat Mar 28 00:00:00 1970 PST
  587 | 407 | 00587_update7      | Sun Mar 29 00:00:00 1970 PST
  588 |   8 | 00588              | Mon Mar 30 00:00:00 1970 PST
  589 | 509 | 00589_update9      | Tue Mar 31 00:00:00 1970 PST
  590 |   0 | 00590              | Wed Apr 01 00:00:00 1970 PST
  591 |   1 | 00591              | Thu Apr 02 00:00:00 1970 PST
  593 | 303 | 00593_update3      | Sat Apr 04 00:00:00 1970 PST
  594 |   4 | 00594              | Sun Apr 05 00:00:00 1970 PST
  596 |   6 | 00596              | Tue Apr 07 00:00:00 1970 PST
  597 | 407 | 00597_update7      | Wed Apr 08 00:00:00 1970 PST
  598 |   8 | 00598              | Thu Apr 09 00:00:00 1970 PST
  599 | 509 | 00599_update9      | Fri Apr 10 00:00:00 1970 PST
  600 |   0 | 00600              | Thu Jan 01 00:00:00 1970 PST
  601 |   1 | 00601              | Fri Jan 02 00:00:00 1970 PST
  603 | 303 | 00603_update3      | Sun Jan 04 00:00:00 1970 PST
  604 |   4 | 00604              | Mon Jan 05 00:00:00 1970 PST
  606 |   6 | 00606              | Wed Jan 07 00:00:00 1970 PST
  607 | 407 | 00607_update7      | Thu Jan 08 00:00:00 1970 PST
  608 |   8 | 00608              | Fri Jan 09 00:00:00 1970 PST
  609 | 509 | 00609_update9      | Sat Jan 10 00:00:00 1970 PST
  610 |   0 | 00610              | Sun Jan 11 00:00:00 1970 PST
  611 |   1 | 00611              | Mon Jan 12 00:00:00 1970 PST
  613 | 303 | 00613_update3      | Wed Jan 14 00:00:00 1970 PST
  614 |   4 | 00614              | Thu Jan 15 00:00:00 1970 PST
  616 |   6 | 00616              | Sat Jan 17 00:00:00 1970 PST
  617 | 407 | 00617_update7      | Sun Jan 18 00:00:00 1970 PST
  618 |   8 | 00618              | Mon Jan 19 00:00:00 1970 PST
  619 | 509 | 00619_update9      | Tue Jan 20 00:00:00 1970 PST
  620 |   0 | 00620              | Wed Jan 21 00:00:00 1970 PST
  621 |   1 | 00621              | Thu Jan 22 00:00:00 1970 PST
  623 | 303 | 00623_update3      | Sat Jan 24 00:00:00 1970 PST
  624 |   4 | 00624              | Sun Jan 25 00:00:00 1970 PST
  626 |   6 | 00626              | Tue Jan 27 00:00:00 1970 PST
  627 | 407 | 00627_update7      | Wed Jan 28 00:00:00 1970 PST
  628 |   8 | 00628              | Thu Jan 29 00:00:00 1970 PST
  629 | 509 | 00629_update9      | Fri Jan 30 00:00:00 1970 PST
  630 |   0 | 00630              | Sat Jan 31 00:00:00 1970 PST
  631 |   1 | 00631              | Sun Feb 01 00:00:00 1970 PST
  633 | 303 | 00633_update3      | Tue Feb 03 00:00:00 1970 PST
  634 |   4 | 00634              | Wed Feb 04 00:00:00 1970 PST
  636 |   6 | 00636              | Fri Feb 06 00:00:00 1970 PST
  637 | 407 | 00637_update7      | Sat Feb 07 00:00:00 1970 PST
  638 |   8 | 00638              | Sun Feb 08 00:00:00 1970 PST
  639 | 509 | 00639_update9      | Mon Feb 09 00:00:00 1970 PST
  640 |   0 | 00640              | Tue Feb 10 00:00:00 1970 PST
  641 |   1 | 00641              | Wed Feb 11 00:00:00 1970 PST
  643 | 303 | 00643_update3      | Fri Feb 13 00:00:00 1970 PST
  644 |   4 | 00644              | Sat Feb 14 00:00:00 1970 PST
  646 |   6 | 00646              | Mon Feb 16 00:00:00 1970 PST
  647 | 407 | 00647_update7      | Tue Feb 17 00:00:00 1970 PST
  648 |   8 | 00648              | Wed Feb 18 00:00:00 1970 PST
  649 | 509 | 00649_update9      | Thu Feb 19 00:00:00 1970 PST
  650 |   0 | 00650              | Fri Feb 20 00:00:00 1970 PST
  651 |   1 | 00651              | Sat Feb 21 00:00:00 1970 PST
  653 | 303 | 00653_update3      | Mon Feb 23 00:00:00 1970 PST
  654 |   4 | 00654              | Tue Feb 24 00:00:00 1970 PST
  656 |   6 | 00656              | Thu Feb 26 00:00:00 1970 PST
  657 | 407 | 00657_update7      | Fri Feb 27 00:00:00 1970 PST
  658 |   8 | 00658              | Sat Feb 28 00:00:00 1970 PST
  659 | 509 | 00659_update9      | Sun Mar 01 00:00:00 1970 PST
  660 |   0 | 00660              | Mon Mar 02 00:00:00 1970 PST
  661 |   1 | 00661              | Tue Mar 03 00:00:00 1970 PST
  663 | 303 | 00663_update3      | Thu Mar 05 00:00:00 1970 PST
  664 |   4 | 00664              | Fri Mar 06 00:00:00 1970 PST
  666 |   6 | 00666              | Sun Mar 08 00:00:00 1970 PST
  667 | 407 | 00667_update7      | Mon Mar 09 00:00:00 1970 PST
  668 |   8 | 00668              | Tue Mar 10 00:00:00 1970 PST
  669 | 509 | 00669_update9      | Wed Mar 11 00:00:00 1970 PST
  670 |   0 | 00670              | Thu Mar 12 00:00:00 1970 PST
  671 |   1 | 00671              | Fri Mar 13 00:00:00 1970 PST
  673 | 303 | 00673_update3      | Sun Mar 15 00:00:00 1970 PST
  674 |   4 | 00674              | Mon Mar 16 00:00:00 1970 PST
  676 |   6 | 00676              | Wed Mar 18 00:00:00 1970 PST
  677 | 407 | 00677_update7      | Thu Mar 19 00:00:00 1970 PST
  678 |   8 | 00678              | Fri Mar 20 00:00:00 1970 PST
  679 | 509 | 00679_update9      | Sat Mar 21 00:00:00 1970 PST
  680 |   0 | 00680              | Sun Mar 22 00:00:00 1970 PST
  681 |   1 | 00681              | Mon Mar 23 00:00:00 1970 PST
  683 | 303 | 00683_update3      | Wed Mar 25 00:00:00 1970 PST
  684 |   4 | 00684              | Thu Mar 26 00:00:00 1970 PST
  686 |   6 | 00686              | Sat Mar 28 00:00:00 1970 PST
  687 | 407 | 00687_update7      | Sun Mar 29 00:00:00 1970 PST
  688 |   8 | 00688              | Mon Mar 30 00:00:00 1970 PST
  689 | 509 | 00689_update9      | Tue Mar 31 00:00:00 1970 PST
  690 |   0 | 00690              | Wed Apr 01 00:00:00 1970 PST
  691 |   1 | 00691              | Thu Apr 02 00:00:00 1970 PST
  693 | 303 | 00693_update3      | Sat Apr 04 00:00:00 1970 PST
  694 |   4 | 00694              | Sun Apr 05 00:00:00 1970 PST
  696 |   6 | 00696              | Tue Apr 07 00:00:00 1970 PST
  697 | 407 | 00697_update7      | Wed Apr 08 00:00:00 1970 PST
  698 |   8 | 00698              | Thu Apr 09 00:00:00 1970 PST
  699 | 509 | 00699_update9      | Fri Apr 10 00:00:00 1970 PST
  700 |   0 | 00700              | Thu Jan 01 00:00:00 1970 PST
  701 |   1 | 00701              | Fri Jan 02 00:00:00 1970 PST
  703 | 303 | 00703_update3      | Sun Jan 04 00:00:00 1970 PST
  704 |   4 | 00704              | Mon Jan 05 00:00:00 1970 PST
  706 |   6 | 00706              | Wed Jan 07 00:00:00 1970 PST
  707 | 407 | 00707_update7      | Thu Jan 08 00:00:00 1970 PST
  708 |   8 | 00708              | Fri Jan 09 00:00:00 1970 PST
  709 | 509 | 00709_update9      | Sat Jan 10 00:00:00 1970 PST
  710 |   0 | 00710              | Sun Jan 11 00:00:00 1970 PST
  711 |   1 | 00711              | Mon Jan 12 00:00:00 1970 PST
  713 | 303 | 00713_update3      | Wed Jan 14 00:00:00 1970 PST
  714 |   4 | 00714              | Thu Jan 15 00:00:00 1970 PST
  716 |   6 | 00716              | Sat Jan 17 00:00:00 1970 PST
  717 | 407 | 00717_update7      | Sun Jan 18 00:00:00 1970 PST
  718 |   8 | 00718              | Mon Jan 19 00:00:00 1970 PST
  719 | 509 | 00719_update9      | Tue Jan 20 00:00:00 1970 PST
  720 |   0 | 00720              | Wed Jan 21 00:00:00 1970 PST
  721 |   1 | 00721              | Thu Jan 22 00:00:00 1970 PST
  723 | 303 | 00723_update3      | Sat Jan 24 00:00:00 1970 PST
  724 |   4 | 00724              | Sun Jan 25 00:00:00 1970 PST
  726 |   6 | 00726              | Tue Jan 27 00:00:00 1970 PST
  727 | 407 | 00727_update7      | Wed Jan 28 00:00:00 1970 PST
  728 |   8 | 00728              | Thu Jan 29 00:00:00 1970 PST
  729 | 509 | 00729_update9      | Fri Jan 30 00:00:00 1970 PST
  730 |   0 | 00730              | Sat Jan 31 00:00:00 1970 PST
  731 |   1 | 00731              | Sun Feb 01 00:00:00 1970 PST
  733 | 303 | 00733_update3      | Tue Feb 03 00:00:00 1970 PST
  734 |   4 | 00734              | Wed Feb 04 00:00:00 1970 PST
  736 |   6 | 00736              | Fri Feb 06 00:00:00 1970 PST
  737 | 407 | 00737_update7      | Sat Feb 07 00:00:00 1970 PST
  738 |   8 | 00738              | Sun Feb 08 00:00:00 1970 PST
  739 | 509 | 00739_update9      | Mon Feb 09 00:00:00 1970 PST
  740 |   0 | 00740              | Tue Feb 10 00:00:00 1970 PST
  741 |   1 | 00741              | Wed Feb 11 00:00:00 1970 PST
  743 | 303 | 00743_update3      | Fri Feb 13 00:00:00 1970 PST
  744 |   4 | 00744              | Sat Feb 14 00:00:00 1970 PST
  746 |   6 | 00746              | Mon Feb 16 00:00:00 1970 PST
  747 | 407 | 00747_update7      | Tue Feb 17 00:00:00 1970 PST
  748 |   8 | 00748              | Wed Feb 18 00:00:00 1970 PST
  749 | 509 | 00749_update9      | Thu Feb 19 00:00:00 1970 PST
  750 |   0 | 00750              | Fri Feb 20 00:00:00 1970 PST
  751 |   1 | 00751              | Sat Feb 21 00:00:00 1970 PST
  753 | 303 | 00753_update3      | Mon Feb 23 00:00:00 1970 PST
  754 |   4 | 00754              | Tue Feb 24 00:00:00 1970 PST
  756 |   6 | 00756              | Thu Feb 26 00:00:00 1970 PST
  757 | 407 | 00757_update7      | Fri Feb 27 00:00:00 1970 PST
  758 |   8 | 00758              | Sat Feb 28 00:00:00 1970 PST
  759 | 509 | 00759_update9      | Sun Mar 01 00:00:00 1970 PST
  760 |   0 | 00760              | Mon Mar 02 00:00:00 1970 PST
  761 |   1 | 00761              | Tue Mar 03 00:00:00 1970 PST
  763 | 303 | 00763_update3      | Thu Mar 05 00:00:00 1970 PST
  764 |   4 | 00764              | Fri Mar 06 00:00:00 1970 PST
  766 |   6 | 00766              | Sun Mar 08 00:00:00 1970 PST
  767 | 407 | 00767_update7      | Mon Mar 09 00:00:00 1970 PST
  768 |   8 | 00768              | Tue Mar 10 00:00:00 1970 PST
  769 | 509 | 00769_update9      | Wed Mar 11 00:00:00 1970 PST
  770 |   0 | 00770              | Thu Mar 12 00:00:00 1970 PST
  771 |   1 | 00771              | Fri Mar 13 00:00:00 1970 PST
  773 | 303 | 00773_update3      | Sun Mar 15 00:00:00 1970 PST
  774 |   4 | 00774              | Mon Mar 16 00:00:00 1970 PST
  776 |   6 | 00776              | Wed Mar 18 00:00:00 1970 PST
  777 | 407 | 00777_update7      | Thu Mar 19 00:00:00 1970 PST
  778 |   8 | 00778              | Fri Mar 20 00:00:00 1970 PST
  779 | 509 | 00779_update9      | Sat Mar 21 00:00:00 1970 PST
  780 |   0 | 00780              | Sun Mar 22 00:00:00 1970 PST
  781 |   1 | 00781              | Mon Mar 23 00:00:00 1970 PST
  783 | 303 | 00783_update3      | Wed Mar 25 00:00:00 1970 PST
  784 |   4 | 00784              | Thu Mar 26 00:00:00 1970 PST
  786 |   6 | 00786              | Sat Mar 28 00:00:00 1970 PST
  787 | 407 | 00787_update7      | Sun Mar 29 00:00:00 1970 PST
  788 |   8 | 00788              | Mon Mar 30 00:00:00 1970 PST
  789 | 509 | 00789_update9      | Tue Mar 31 00:00:00 1970 PST
  790 |   0 | 00790              | Wed Apr 01 00:00:00 1970 PST
  791 |   1 | 00791              | Thu Apr 02 00:00:00 1970 PST
  793 | 303 | 00793_update3      | Sat Apr 04 00:00:00 1970 PST
  794 |   4 | 00794              | Sun Apr 05 00:00:00 1970 PST
  796 |   6 | 00796              | Tue Apr 07 00:00:00 1970 PST
  797 | 407 | 00797_update7      | Wed Apr 08 00:00:00 1970 PST
  798 |   8 | 00798              | Thu Apr 09 00:00:00 1970 PST
  799 | 509 | 00799_update9      | Fri Apr 10 00:00:00 1970 PST
  800 |   0 | 00800              | Thu Jan 01 00:00:00 1970 PST
  801 |   1 | 00801              | Fri Jan 02 00:00:00 1970 PST
  803 | 303 | 00803_update3      | Sun Jan 04 00:00:00 1970 PST
  804 |   4 | 00804              | Mon Jan 05 00:00:00 1970 PST
  806 |   6 | 00806              | Wed Jan 07 00:00:00 1970 PST
  807 | 407 | 00807_update7      | Thu Jan 08 00:00:00 1970 PST
  808 |   8 | 00808              | Fri Jan 09 00:00:00 1970 PST
  809 | 509 | 00809_update9      | Sat Jan 10 00:00:00 1970 PST
  810 |   0 | 00810              | Sun Jan 11 00:00:00 1970 PST
  811 |   1 | 00811              | Mon Jan 12 00:00:00 1970 PST
  813 | 303 | 00813_update3      | Wed Jan 14 00:00:00 1970 PST
  814 |   4 | 00814              | Thu Jan 15 00:00:00 1970 PST
  816 |   6 | 00816              | Sat Jan 17 00:00:00 1970 PST
  817 | 407 | 00817_update7      | Sun Jan 18 00:00:00 1970 PST
  818 |   8 | 00818              | Mon Jan 19 00:00:00 1970 PST
  819 | 509 | 00819_update9      | Tue Jan 20 00:00:00 1970 PST
  820 |   0 | 00820              | Wed Jan 21 00:00:00 1970 PST
  821 |   1 | 00821              | Thu Jan 22 00:00:00 1970 PST
  823 | 303 | 00823_update3      | Sat Jan 24 00:00:00 1970 PST
  824 |   4 | 00824              | Sun Jan 25 00:00:00 1970 PST
  826 |   6 | 00826              | Tue Jan 27 00:00:00 1970 PST
  827 | 407 | 00827_update7      | Wed Jan 28 00:00:00 1970 PST
  828 |   8 | 00828              | Thu Jan 29 00:00:00 1970 PST
  829 | 509 | 00829_update9      | Fri Jan 30 00:00:00 1970 PST
  830 |   0 | 00830              | Sat Jan 31 00:00:00 1970 PST
  831 |   1 | 00831              | Sun Feb 01 00:00:00 1970 PST
  833 | 303 | 00833_update3      | Tue Feb 03 00:00:00 1970 PST
  834 |   4 | 00834              | Wed Feb 04 00:00:00 1970 PST
  836 |   6 | 00836              | Fri Feb 06 00:00:00 1970 PST
  837 | 407 | 00837_update7      | Sat Feb 07 00:00:00 1970 PST
  838 |   8 | 00838              | Sun Feb 08 00:00:00 1970 PST
  839 | 509 | 00839_update9      | Mon Feb 09 00:00:00 1970 PST
  840 |   0 | 00840              | Tue Feb 10 00:00:00 1970 PST
  841 |   1 | 00841              | Wed Feb 11 00:00:00 1970 PST
  843 | 303 | 00843_update3      | Fri Feb 13 00:00:00 1970 PST
  844 |   4 | 00844              | Sat Feb 14 00:00:00 1970 PST
  846 |   6 | 00846              | Mon Feb 16 00:00:00 1970 PST
  847 | 407 | 00847_update7      | Tue Feb 17 00:00:00 1970 PST
  848 |   8 | 00848              | Wed Feb 18 00:00:00 1970 PST
  849 | 509 | 00849_update9      | Thu Feb 19 00:00:00 1970 PST
  850 |   0 | 00850              | Fri Feb 20 00:00:00 1970 PST
  851 |   1 | 00851              | Sat Feb 21 00:00:00 1970 PST
  853 | 303 | 00853_update3      | Mon Feb 23 00:00:00 1970 PST
  854 |   4 | 00854              | Tue Feb 24 00:00:00 1970 PST
  856 |   6 | 00856              | Thu Feb 26 00:00:00 1970 PST
  857 | 407 | 00857_update7      | Fri Feb 27 00:00:00 1970 PST
  858 |   8 | 00858              | Sat Feb 28 00:00:00 1970 PST
  859 | 509 | 00859_update9      | Sun Mar 01 00:00:00 1970 PST
  860 |   0 | 00860              | Mon Mar 02 00:00:00 1970 PST
  861 |   1 | 00861              | Tue Mar 03 00:00:00 1970 PST
  863 | 303 | 00863_update3      | Thu Mar 05 00:00:00 1970 PST
  864 |   4 | 00864              | Fri Mar 06 00:00:00 1970 PST
  866 |   6 | 00866              | Sun Mar 08 00:00:00 1970 PST
  867 | 407 | 00867_update7      | Mon Mar 09 00:00:00 1970 PST
  868 |   8 | 00868              | Tue Mar 10 00:00:00 1970 PST
  869 | 509 | 00869_update9      | Wed Mar 11 00:00:00 1970 PST
  870 |   0 | 00870              | Thu Mar 12 00:00:00 1970 PST
  871 |   1 | 00871              | Fri Mar 13 00:00:00 1970 PST
  873 | 303 | 00873_update3      | Sun Mar 15 00:00:00 1970 PST
  874 |   4 | 00874              | Mon Mar 16 00:00:00 1970 PST
  876 |   6 | 00876              | Wed Mar 18 00:00:00 1970 PST
  877 | 407 | 00877_update7      | Thu Mar 19 00:00:00 1970 PST
  878 |   8 | 00878              | Fri Mar 20 00:00:00 1970 PST
  879 | 509 | 00879_update9      | Sat Mar 21 00:00:00 1970 PST
  880 |   0 | 00880              | Sun Mar 22 00:00:00 1970 PST
  881 |   1 | 00881              | Mon Mar 23 00:00:00 1970 PST
  883 | 303 | 00883_update3      | Wed Mar 25 00:00:00 1970 PST
  884 |   4 | 00884              | Thu Mar 26 00:00:00 1970 PST
  886 |   6 | 00886              | Sat Mar 28 00:00:00 1970 PST
  887 | 407 | 00887_update7      | Sun Mar 29 00:00:00 1970 PST
  888 |   8 | 00888              | Mon Mar 30 00:00:00 1970 PST
  889 | 509 | 00889_update9      | Tue Mar 31 00:00:00 1970 PST
  890 |   0 | 00890              | Wed Apr 01 00:00:00 1970 PST
  891 |   1 | 00891              | Thu Apr 02 00:00:00 1970 PST
  893 | 303 | 00893_update3      | Sat Apr 04 00:00:00 1970 PST
  894 |   4 | 00894              | Sun Apr 05 00:00:00 1970 PST
  896 |   6 | 00896              | Tue Apr 07 00:00:00 1970 PST
  897 | 407 | 00897_update7      | Wed Apr 08 00:00:00 1970 PST
  898 |   8 | 00898              | Thu Apr 09 00:00:00 1970 PST
  899 | 509 | 00899_update9      | Fri Apr 10 00:00:00 1970 PST
  900 |   0 | 00900              | Thu Jan 01 00:00:00 1970 PST
  901 |   1 | 00901              | Fri Jan 02 00:00:00 1970 PST
  903 | 303 | 00903_update3      | Sun Jan 04 00:00:00 1970 PST
  904 |   4 | 00904              | Mon Jan 05 00:00:00 1970 PST
  906 |   6 | 00906              | Wed Jan 07 00:00:00 1970 PST
  907 | 407 | 00907_update7      | Thu Jan 08 00:00:00 1970 PST
  908 |   8 | 00908              | Fri Jan 09 00:00:00 1970 PST
  909 | 509 | 00909_update9      | Sat Jan 10 00:00:00 1970 PST
  910 |   0 | 00910              | Sun Jan 11 00:00:00 1970 PST
  911 |   1 | 00911              | Mon Jan 12 00:00:00 1970 PST
  913 | 303 | 00913_update3      | Wed Jan 14 00:00:00 1970 PST
  914 |   4 | 00914              | Thu Jan 15 00:00:00 1970 PST
  916 |   6 | 00916              | Sat Jan 17 00:00:00 1970 PST
  917 | 407 | 00917_update7      | Sun Jan 18 00:00:00 1970 PST
  918 |   8 | 00918              | Mon Jan 19 00:00:00 1970 PST
  919 | 509 | 00919_update9      | Tue Jan 20 00:00:00 1970 PST
  920 |   0 | 00920              | Wed Jan 21 00:00:00 1970 PST
  921 |   1 | 00921              | Thu Jan 22 00:00:00 1970 PST
  923 | 303 | 00923_update3      | Sat Jan 24 00:00:00 1970 PST
  924 |   4 | 00924              | Sun Jan 25 00:00:00 1970 PST
  926 |   6 | 00926              | Tue Jan 27 00:00:00 1970 PST
  927 | 407 | 00927_update7      | Wed Jan 28 00:00:00 1970 PST
  928 |   8 | 00928              | Thu Jan 29 00:00:00 1970 PST
  929 | 509 | 00929_update9      | Fri Jan 30 00:00:00 1970 PST
  930 |   0 | 00930              | Sat Jan 31 00:00:00 1970 PST
  931 |   1 | 00931              | Sun Feb 01 00:00:00 1970 PST
  933 | 303 | 00933_update3      | Tue Feb 03 00:00:00 1970 PST
  934 |   4 | 00934              | Wed Feb 04 00:00:00 1970 PST
  936 |   6 | 00936              | Fri Feb 06 00:00:00 1970 PST
  937 | 407 | 00937_update7      | Sat Feb 07 00:00:00 1970 PST
  938 |   8 | 00938              | Sun Feb 08 00:00:00 1970 PST
  939 | 509 | 00939_update9      | Mon Feb 09 00:00:00 1970 PST
  940 |   0 | 00940              | Tue Feb 10 00:00:00 1970 PST
  941 |   1 | 00941              | Wed Feb 11 00:00:00 1970 PST
  943 | 303 | 00943_update3      | Fri Feb 13 00:00:00 1970 PST
  944 |   4 | 00944              | Sat Feb 14 00:00:00 1970 PST
  946 |   6 | 00946              | Mon Feb 16 00:00:00 1970 PST
  947 | 407 | 00947_update7      | Tue Feb 17 00:00:00 1970 PST
  948 |   8 | 00948              | Wed Feb 18 00:00:00 1970 PST
  949 | 509 | 00949_update9      | Thu Feb 19 00:00:00 1970 PST
  950 |   0 | 00950              | Fri Feb 20 00:00:00 1970 PST
  951 |   1 | 00951              | Sat Feb 21 00:00:00 1970 PST
  953 | 303 | 00953_update3      | Mon Feb 23 00:00:00 1970 PST
  954 |   4 | 00954              | Tue Feb 24 00:00:00 1970 PST
  956 |   6 | 00956              | Thu Feb 26 00:00:00 1970 PST
  957 | 407 | 00957_update7      | Fri Feb 27 00:00:00 1970 PST
  958 |   8 | 00958              | Sat Feb 28 00:00:00 1970 PST
  959 | 509 | 00959_update9      | Sun Mar 01 00:00:00 1970 PST
  960 |   0 | 00960              | Mon Mar 02 00:00:00 1970 PST
  961 |   1 | 00961              | Tue Mar 03 00:00:00 1970 PST
  963 | 303 | 00963_update3      | Thu Mar 05 00:00:00 1970 PST
  964 |   4 | 00964              | Fri Mar 06 00:00:00 1970 PST
  966 |   6 | 00966              | Sun Mar 08 00:00:00 1970 PST
  967 | 407 | 00967_update7      | Mon Mar 09 00:00:00 1970 PST
  968 |   8 | 00968              | Tue Mar 10 00:00:00 1970 PST
  969 | 509 | 00969_update9      | Wed Mar 11 00:00:00 1970 PST
  970 |   0 | 00970              | Thu Mar 12 00:00:00 1970 PST
  971 |   1 | 00971              | Fri Mar 13 00:00:00 1970 PST
  973 | 303 | 00973_update3      | Sun Mar 15 00:00:00 1970 PST
  974 |   4 | 00974              | Mon Mar 16 00:00:00 1970 PST
  976 |   6 | 00976              | Wed Mar 18 00:00:00 1970 PST
  977 | 407 | 00977_update7      | Thu Mar 19 00:00:00 1970 PST
  978 |   8 | 00978              | Fri Mar 20 00:00:00 1970 PST
  979 | 509 | 00979_update9      | Sat Mar 21 00:00:00 1970 PST
  980 |   0 | 00980              | Sun Mar 22 00:00:00 1970 PST
  981 |   1 | 00981              | Mon Mar 23 00:00:00 1970 PST
  983 | 303 | 00983_update3      | Wed Mar 25 00:00:00 1970 PST
  984 |   4 | 00984              | Thu Mar 26 00:00:00 1970 PST
  986 |   6 | 00986              | Sat Mar 28 00:00:00 1970 PST
  987 | 407 | 00987_update7      | Sun Mar 29 00:00:00 1970 PST
  988 |   8 | 00988              | Mon Mar 30 00:00:00 1970 PST
  989 | 509 | 00989_update9      | Tue Mar 31 00:00:00 1970 PST
  990 |   0 | 00990              | Wed Apr 01 00:00:00 1970 PST
  991 |   1 | 00991              | Thu Apr 02 00:00:00 1970 PST
  993 | 303 | 00993_update3      | Sat Apr 04 00:00:00 1970 PST
  994 |   4 | 00994              | Sun Apr 05 00:00:00 1970 PST
  996 |   6 | 00996              | Tue Apr 07 00:00:00 1970 PST
  997 | 407 | 00997_update7      | Wed Apr 08 00:00:00 1970 PST
  998 |   8 | 00998              | Thu Apr 09 00:00:00 1970 PST
  999 | 509 | 00999_update9      | Fri Apr 10 00:00:00 1970 PST
 1000 |   0 | 01000              | Thu Jan 01 00:00:00 1970 PST
 1001 | 101 | 0000100001         | 
 1003 | 403 | 0000300003_update3 | 
 1004 | 104 | 0000400004         | 
 1006 | 106 | 0000600006         | 
 1007 | 507 | 0000700007_update7 | 
 1008 | 108 | 0000800008         | 
 1009 | 609 | 0000900009_update9 | 
 1010 | 100 | 0001000010         | 
 1011 | 101 | 0001100011         | 
 1013 | 403 | 0001300013_update3 | 
 1014 | 104 | 0001400014         | 
 1016 | 106 | 0001600016         | 
 1017 | 507 | 0001700017_update7 | 
 1018 | 108 | 0001800018         | 
 1019 | 609 | 0001900019_update9 | 
 1020 | 100 | 0002000020         | 
 1101 | 201 | aaa                | 
 1103 | 503 | ccc_update3        | 
 1104 | 204 | ddd                | 
(819 rows)

-- Test that trigger on remote table works as expected
CREATE OR REPLACE FUNCTION "S 1".F_BRTRIG() RETURNS trigger AS $$
BEGIN
    NEW.c3 = NEW.c3 || '_trig_update';
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER t1_br_insert BEFORE INSERT OR UPDATE
    ON "S 1"."T 1" FOR EACH ROW EXECUTE PROCEDURE "S 1".F_BRTRIG();
INSERT INTO ft2 (c1,c2,c3) VALUES (1208, 818, 'fff') RETURNING *;
  c1  | c2  |       c3        | c4 | c5 | c6 |     c7     | c8 
------+-----+-----------------+----+----+----+------------+----
 1208 | 818 | fff_trig_update |    |    |    | ft2        | 
(1 row)

INSERT INTO ft2 (c1,c2,c3,c6) VALUES (1218, 818, 'ggg', '(--;') RETURNING *;
  c1  | c2  |       c3        | c4 | c5 |  c6  |     c7     | c8 
------+-----+-----------------+----+----+------+------------+----
 1218 | 818 | ggg_trig_update |    |    | (--; | ft2        | 
(1 row)

UPDATE ft2 SET c2 = c2 + 600 WHERE c1 % 10 = 8 AND c1 < 1200 RETURNING *;
  c1  | c2  |           c3           |              c4              |            c5            | c6 |     c7     | c8  
------+-----+------------------------+------------------------------+--------------------------+----+------------+-----
    8 | 608 | 00008_trig_update      | Fri Jan 09 00:00:00 1970 PST | Fri Jan 09 00:00:00 1970 | 8  | 8          | foo
   18 | 608 | 00018_trig_update      | Mon Jan 19 00:00:00 1970 PST | Mon Jan 19 00:00:00 1970 | 8  | 8          | foo
   28 | 608 | 00028_trig_update      | Thu Jan 29 00:00:00 1970 PST | Thu Jan 29 00:00:00 1970 | 8  | 8          | foo
   38 | 608 | 00038_trig_update      | Sun Feb 08 00:00:00 1970 PST | Sun Feb 08 00:00:00 1970 | 8  | 8          | foo
   48 | 608 | 00048_trig_update      | Wed Feb 18 00:00:00 1970 PST | Wed Feb 18 00:00:00 1970 | 8  | 8          | foo
   58 | 608 | 00058_trig_update      | Sat Feb 28 00:00:00 1970 PST | Sat Feb 28 00:00:00 1970 | 8  | 8          | foo
   68 | 608 | 00068_trig_update      | Tue Mar 10 00:00:00 1970 PST | Tue Mar 10 00:00:00 1970 | 8  | 8          | foo
   78 | 608 | 00078_trig_update      | Fri Mar 20 00:00:00 1970 PST | Fri Mar 20 00:00:00 1970 | 8  | 8          | foo
   88 | 608 | 00088_trig_update      | Mon Mar 30 00:00:00 1970 PST | Mon Mar 30 00:00:00 1970 | 8  | 8          | foo
   98 | 608 | 00098_trig_update      | Thu Apr 09 00:00:00 1970 PST | Thu Apr 09 00:00:00 1970 | 8  | 8          | foo
  108 | 608 | 00108_trig_update      | Fri Jan 09 00:00:00 1970 PST | Fri Jan 09 00:00:00 1970 | 8  | 8          | foo
  118 | 608 | 00118_trig_update      | Mon Jan 19 00:00:00 1970 PST | Mon Jan 19 00:00:00 1970 | 8  | 8          | foo
  128 | 608 | 00128_trig_update      | Thu Jan 29 00:00:00 1970 PST | Thu Jan 29 00:00:00 1970 | 8  | 8          | foo
  138 | 608 | 00138_trig_update      | Sun Feb 08 00:00:00 1970 PST | Sun Feb 08 00:00:00 1970 | 8  | 8          | foo
  148 | 608 | 00148_trig_update      | Wed Feb 18 00:00:00 1970 PST | Wed Feb 18 00:00:00 1970 | 8  | 8          | foo
  158 | 608 | 00158_trig_update      | Sat Feb 28 00:00:00 1970 PST | Sat Feb 28 00:00:00 1970 | 8  | 8          | foo
  168 | 608 | 00168_trig_update      | Tue Mar 10 00:00:00 1970 PST | Tue Mar 10 00:00:00 1970 | 8  | 8          | foo
  178 | 608 | 00178_trig_update      | Fri Mar 20 00:00:00 1970 PST | Fri Mar 20 00:00:00 1970 | 8  | 8          | foo
  188 | 608 | 00188_trig_update      | Mon Mar 30 00:00:00 1970 PST | Mon Mar 30 00:00:00 1970 | 8  | 8          | foo
  198 | 608 | 00198_trig_update      | Thu Apr 09 00:00:00 1970 PST | Thu Apr 09 00:00:00 1970 | 8  | 8          | foo
  208 | 608 | 00208_trig_update      | Fri Jan 09 00:00:00 1970 PST | Fri Jan 09 00:00:00 1970 | 8  | 8          | foo
  218 | 608 | 00218_trig_update      | Mon Jan 19 00:00:00 1970 PST | Mon Jan 19 00:00:00 1970 | 8  | 8          | foo
  228 | 608 | 00228_trig_update      | Thu Jan 29 00:00:00 1970 PST | Thu Jan 29 00:00:00 1970 | 8  | 8          | foo
  238 | 608 | 00238_trig_update      | Sun Feb 08 00:00:00 1970 PST | Sun Feb 08 00:00:00 1970 | 8  | 8          | foo
  248 | 608 | 00248_trig_update      | Wed Feb 18 00:00:00 1970 PST | Wed Feb 18 00:00:00 1970 | 8  | 8          | foo
  258 | 608 | 00258_trig_update      | Sat Feb 28 00:00:00 1970 PST | Sat Feb 28 00:00:00 1970 | 8  | 8          | foo
  268 | 608 | 00268_trig_update      | Tue Mar 10 00:00:00 1970 PST | Tue Mar 10 00:00:00 1970 | 8  | 8          | foo
  278 | 608 | 00278_trig_update      | Fri Mar 20 00:00:00 1970 PST | Fri Mar 20 00:00:00 1970 | 8  | 8          | foo
  288 | 608 | 00288_trig_update      | Mon Mar 30 00:00:00 1970 PST | Mon Mar 30 00:00:00 1970 | 8  | 8          | foo
  298 | 608 | 00298_trig_update      | Thu Apr 09 00:00:00 1970 PST | Thu Apr 09 00:00:00 1970 | 8  | 8          | foo
  308 | 608 | 00308_trig_update      | Fri Jan 09 00:00:00 1970 PST | Fri Jan 09 00:00:00 1970 | 8  | 8          | foo
  318 | 608 | 00318_trig_update      | Mon Jan 19 00:00:00 1970 PST | Mon Jan 19 00:00:00 1970 | 8  | 8          | foo
  328 | 608 | 00328_trig_update      | Thu Jan 29 00:00:00 1970 PST | Thu Jan 29 00:00:00 1970 | 8  | 8          | foo
  338 | 608 | 00338_trig_update      | Sun Feb 08 00:00:00 1970 PST | Sun Feb 08 00:00:00 1970 | 8  | 8          | foo
  348 | 608 | 00348_trig_update      | Wed Feb 18 00:00:00 1970 PST | Wed Feb 18 00:00:00 1970 | 8  | 8          | foo
  358 | 608 | 00358_trig_update      | Sat Feb 28 00:00:00 1970 PST | Sat Feb 28 00:00:00 1970 | 8  | 8          | foo
  368 | 608 | 00368_trig_update      | Tue Mar 10 00:00:00 1970 PST | Tue Mar 10 00:00:00 1970 | 8  | 8          | foo
  378 | 608 | 00378_trig_update      | Fri Mar 20 00:00:00 1970 PST | Fri Mar 20 00:00:00 1970 | 8  | 8          | foo
  388 | 608 | 00388_trig_update      | Mon Mar 30 00:00:00 1970 PST | Mon Mar 30 00:00:00 1970 | 8  | 8          | foo
  398 | 608 | 00398_trig_update      | Thu Apr 09 00:00:00 1970 PST | Thu Apr 09 00:00:00 1970 | 8  | 8          | foo
  408 | 608 | 00408_trig_update      | Fri Jan 09 00:00:00 1970 PST | Fri Jan 09 00:00:00 1970 | 8  | 8          | foo
  418 | 608 | 00418_trig_update      | Mon Jan 19 00:00:00 1970 PST | Mon Jan 19 00:00:00 1970 | 8  | 8          | foo
  428 | 608 | 00428_trig_update      | Thu Jan 29 00:00:00 1970 PST | Thu Jan 29 00:00:00 1970 | 8  | 8          | foo
  438 | 608 | 00438_trig_update      | Sun Feb 08 00:00:00 1970 PST | Sun Feb 08 00:00:00 1970 | 8  | 8          | foo
  448 | 608 | 00448_trig_update      | Wed Feb 18 00:00:00 1970 PST | Wed Feb 18 00:00:00 1970 | 8  | 8          | foo
  458 | 608 | 00458_trig_update      | Sat Feb 28 00:00:00 1970 PST | Sat Feb 28 00:00:00 1970 | 8  | 8          | foo
  468 | 608 | 00468_trig_update      | Tue Mar 10 00:00:00 1970 PST | Tue Mar 10 00:00:00 1970 | 8  | 8          | foo
  478 | 608 | 00478_trig_update      | Fri Mar 20 00:00:00 1970 PST | Fri Mar 20 00:00:00 1970 | 8  | 8          | foo
  488 | 608 | 00488_trig_update      | Mon Mar 30 00:00:00 1970 PST | Mon Mar 30 00:00:00 1970 | 8  | 8          | foo
  498 | 608 | 00498_trig_update      | Thu Apr 09 00:00:00 1970 PST | Thu Apr 09 00:00:00 1970 | 8  | 8          | foo
  508 | 608 | 00508_trig_update      | Fri Jan 09 00:00:00 1970 PST | Fri Jan 09 00:00:00 1970 | 8  | 8          | foo
  518 | 608 | 00518_trig_update      | Mon Jan 19 00:00:00 1970 PST | Mon Jan 19 00:00:00 1970 | 8  | 8          | foo
  528 | 608 | 00528_trig_update      | Thu Jan 29 00:00:00 1970 PST | Thu Jan 29 00:00:00 1970 | 8  | 8          | foo
  538 | 608 | 00538_trig_update      | Sun Feb 08 00:00:00 1970 PST | Sun Feb 08 00:00:00 1970 | 8  | 8          | foo
  548 | 608 | 00548_trig_update      | Wed Feb 18 00:00:00 1970 PST | Wed Feb 18 00:00:00 1970 | 8  | 8          | foo
  558 | 608 | 00558_trig_update      | Sat Feb 28 00:00:00 1970 PST | Sat Feb 28 00:00:00 1970 | 8  | 8          | foo
  568 | 608 | 00568_trig_update      | Tue Mar 10 00:00:00 1970 PST | Tue Mar 10 00:00:00 1970 | 8  | 8          | foo
  578 | 608 | 00578_trig_update      | Fri Mar 20 00:00:00 1970 PST | Fri Mar 20 00:00:00 1970 | 8  | 8          | foo
  588 | 608 | 00588_trig_update      | Mon Mar 30 00:00:00 1970 PST | Mon Mar 30 00:00:00 1970 | 8  | 8          | foo
  598 | 608 | 00598_trig_update      | Thu Apr 09 00:00:00 1970 PST | Thu Apr 09 00:00:00 1970 | 8  | 8          | foo
  608 | 608 | 00608_trig_update      | Fri Jan 09 00:00:00 1970 PST | Fri Jan 09 00:00:00 1970 | 8  | 8          | foo
  618 | 608 | 00618_trig_update      | Mon Jan 19 00:00:00 1970 PST | Mon Jan 19 00:00:00 1970 | 8  | 8          | foo
  628 | 608 | 00628_trig_update      | Thu Jan 29 00:00:00 1970 PST | Thu Jan 29 00:00:00 1970 | 8  | 8          | foo
  638 | 608 | 00638_trig_update      | Sun Feb 08 00:00:00 1970 PST | Sun Feb 08 00:00:00 1970 | 8  | 8          | foo
  648 | 608 | 00648_trig_update      | Wed Feb 18 00:00:00 1970 PST | Wed Feb 18 00:00:00 1970 | 8  | 8          | foo
  658 | 608 | 00658_trig_update      | Sat Feb 28 00:00:00 1970 PST | Sat Feb 28 00:00:00 1970 | 8  | 8          | foo
  668 | 608 | 00668_trig_update      | Tue Mar 10 00:00:00 1970 PST | Tue Mar 10 00:00:00 1970 | 8  | 8          | foo
  678 | 608 | 00678_trig_update      | Fri Mar 20 00:00:00 1970 PST | Fri Mar 20 00:00:00 1970 | 8  | 8          | foo
  688 | 608 | 00688_trig_update      | Mon Mar 30 00:00:00 1970 PST | Mon Mar 30 00:00:00 1970 | 8  | 8          | foo
  698 | 608 | 00698_trig_update      | Thu Apr 09 00:00:00 1970 PST | Thu Apr 09 00:00:00 1970 | 8  | 8          | foo
  708 | 608 | 00708_trig_update      | Fri Jan 09 00:00:00 1970 PST | Fri Jan 09 00:00:00 1970 | 8  | 8          | foo
  718 | 608 | 00718_trig_update      | Mon Jan 19 00:00:00 1970 PST | Mon Jan 19 00:00:00 1970 | 8  | 8          | foo
  728 | 608 | 00728_trig_update      | Thu Jan 29 00:00:00 1970 PST | Thu Jan 29 00:00:00 1970 | 8  | 8          | foo
  738 | 608 | 00738_trig_update      | Sun Feb 08 00:00:00 1970 PST | Sun Feb 08 00:00:00 1970 | 8  | 8          | foo
  748 | 608 | 00748_trig_update      | Wed Feb 18 00:00:00 1970 PST | Wed Feb 18 00:00:00 1970 | 8  | 8          | foo
  758 | 608 | 00758_trig_update      | Sat Feb 28 00:00:00 1970 PST | Sat Feb 28 00:00:00 1970 | 8  | 8          | foo
  768 | 608 | 00768_trig_update      | Tue Mar 10 00:00:00 1970 PST | Tue Mar 10 00:00:00 1970 | 8  | 8          | foo
  778 | 608 | 00778_trig_update      | Fri Mar 20 00:00:00 1970 PST | Fri Mar 20 00:00:00 1970 | 8  | 8          | foo
  788 | 608 | 00788_trig_update      | Mon Mar 30 00:00:00 1970 PST | Mon Mar 30 00:00:00 1970 | 8  | 8          | foo
  798 | 608 | 00798_trig_update      | Thu Apr 09 00:00:00 1970 PST | Thu Apr 09 00:00:00 1970 | 8  | 8          | foo
  808 | 608 | 00808_trig_update      | Fri Jan 09 00:00:00 1970 PST | Fri Jan 09 00:00:00 1970 | 8  | 8          | foo
  818 | 608 | 00818_trig_update      | Mon Jan 19 00:00:00 1970 PST | Mon Jan 19 00:00:00 1970 | 8  | 8          | foo
  828 | 608 | 00828_trig_update      | Thu Jan 29 00:00:00 1970 PST | Thu Jan 29 00:00:00 1970 | 8  | 8          | foo
  838 | 608 | 00838_trig_update      | Sun Feb 08 00:00:00 1970 PST | Sun Feb 08 00:00:00 1970 | 8  | 8          | foo
  848 | 608 | 00848_trig_update      | Wed Feb 18 00:00:00 1970 PST | Wed Feb 18 00:00:00 1970 | 8  | 8          | foo
  858 | 608 | 00858_trig_update      | Sat Feb 28 00:00:00 1970 PST | Sat Feb 28 00:00:00 1970 | 8  | 8          | foo
  868 | 608 | 00868_trig_update      | Tue Mar 10 00:00:00 1970 PST | Tue Mar 10 00:00:00 1970 | 8  | 8          | foo
  878 | 608 | 00878_trig_update      | Fri Mar 20 00:00:00 1970 PST | Fri Mar 20 00:00:00 1970 | 8  | 8          | foo
  888 | 608 | 00888_trig_update      | Mon Mar 30 00:00:00 1970 PST | Mon Mar 30 00:00:00 1970 | 8  | 8          | foo
  898 | 608 | 00898_trig_update      | Thu Apr 09 00:00:00 1970 PST | Thu Apr 09 00:00:00 1970 | 8  | 8          | foo
  908 | 608 | 00908_trig_update      | Fri Jan 09 00:00:00 1970 PST | Fri Jan 09 00:00:00 1970 | 8  | 8          | foo
  918 | 608 | 00918_trig_update      | Mon Jan 19 00:00:00 1970 PST | Mon Jan 19 00:00:00 1970 | 8  | 8          | foo
  928 | 608 | 00928_trig_update      | Thu Jan 29 00:00:00 1970 PST | Thu Jan 29 00:00:00 1970 | 8  | 8          | foo
  938 | 608 | 00938_trig_update      | Sun Feb 08 00:00:00 1970 PST | Sun Feb 08 00:00:00 1970 | 8  | 8          | foo
  948 | 608 | 00948_trig_update      | Wed Feb 18 00:00:00 1970 PST | Wed Feb 18 00:00:00 1970 | 8  | 8          | foo
  958 | 608 | 00958_trig_update      | Sat Feb 28 00:00:00 1970 PST | Sat Feb 28 00:00:00 1970 | 8  | 8          | foo
  968 | 608 | 00968_trig_update      | Tue Mar 10 00:00:00 1970 PST | Tue Mar 10 00:00:00 1970 | 8  | 8          | foo
  978 | 608 | 00978_trig_update      | Fri Mar 20 00:00:00 1970 PST | Fri Mar 20 00:00:00 1970 | 8  | 8          | foo
  988 | 608 | 00988_trig_update      | Mon Mar 30 00:00:00 1970 PST | Mon Mar 30 00:00:00 1970 | 8  | 8          | foo
  998 | 608 | 00998_trig_update      | Thu Apr 09 00:00:00 1970 PST | Thu Apr 09 00:00:00 1970 | 8  | 8          | foo
 1008 | 708 | 0000800008_trig_update |                              |                          |    | ft2        | 
 1018 | 708 | 0001800018_trig_update |                              |                          |    | ft2        | 
(102 rows)

-- Test errors thrown on remote side during update
ALTER TABLE "S 1"."T 1" ADD CONSTRAINT c2positive CHECK (c2 >= 0);
INSERT INTO ft1(c1, c2) VALUES(11, 12);  -- duplicate key
ERROR:  duplicate key value violates unique constraint "t1_pkey"
DETAIL:  Key ("C 1")=(11) already exists.
CONTEXT:  Remote SQL command: INSERT INTO "S 1"."T 1"("C 1", c2, c3, c4, c5, c6, c7, c8) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
INSERT INTO ft1(c1, c2) VALUES(1111, -2);  -- c2positive
ERROR:  new row for relation "T 1" violates check constraint "c2positive"
DETAIL:  Failing row contains (1111, -2, null, null, null, null, ft1       , null).
CONTEXT:  Remote SQL command: INSERT INTO "S 1"."T 1"("C 1", c2, c3, c4, c5, c6, c7, c8) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
UPDATE ft1 SET c2 = -c2 WHERE c1 = 1;  -- c2positive
ERROR:  new row for relation "T 1" violates check constraint "c2positive"
DETAIL:  Failing row contains (1, -1, 00001_trig_update, 1970-01-02 08:00:00+00, 1970-01-02 00:00:00, 1, 1         , foo).
CONTEXT:  Remote SQL command: UPDATE "S 1"."T 1" SET c2 = $2 WHERE ctid = $1
-- Test savepoint/rollback behavior
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
 c2  | count 
-----+-------
   0 |   100
   1 |   100
   4 |   100
   6 |   100
 100 |     2
 101 |     2
 104 |     2
 106 |     2
 201 |     1
 204 |     1
 303 |   100
 403 |     2
 407 |   100
(13 rows)

select c2, count(*) from "S 1"."T 1" where c2 < 500 group by 1 order by 1;
 c2  | count 
-----+-------
   0 |   100
   1 |   100
   4 |   100
   6 |   100
 100 |     2
 101 |     2
 104 |     2
 106 |     2
 201 |     1
 204 |     1
 303 |   100
 403 |     2
 407 |   100
(13 rows)

begin;
update ft2 set c2 = 42 where c2 = 0;
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
 c2  | count 
-----+-------
   1 |   100
   4 |   100
   6 |   100
  42 |   100
 100 |     2
 101 |     2
 104 |     2
 106 |     2
 201 |     1
 204 |     1
 303 |   100
 403 |     2
 407 |   100
(13 rows)

savepoint s1;
update ft2 set c2 = 44 where c2 = 4;
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
 c2  | count 
-----+-------
   1 |   100
   6 |   100
  42 |   100
  44 |   100
 100 |     2
 101 |     2
 104 |     2
 106 |     2
 201 |     1
 204 |     1
 303 |   100
 403 |     2
 407 |   100
(13 rows)

release savepoint s1;
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
 c2  | count 
-----+-------
   1 |   100
   6 |   100
  42 |   100
  44 |   100
 100 |     2
 101 |     2
 104 |     2
 106 |     2
 201 |     1
 204 |     1
 303 |   100
 403 |     2
 407 |   100
(13 rows)

savepoint s2;
update ft2 set c2 = 46 where c2 = 6;
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
 c2  | count 
-----+-------
   1 |   100
  42 |   100
  44 |   100
  46 |   100
 100 |     2
 101 |     2
 104 |     2
 106 |     2
 201 |     1
 204 |     1
 303 |   100
 403 |     2
 407 |   100
(13 rows)

rollback to savepoint s2;
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
 c2  | count 
-----+-------
   1 |   100
   6 |   100
  42 |   100
  44 |   100
 100 |     2
 101 |     2
 104 |     2
 106 |     2
 201 |     1
 204 |     1
 303 |   100
 403 |     2
 407 |   100
(13 rows)

release savepoint s2;
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
 c2  | count 
-----+-------
   1 |   100
   6 |   100
  42 |   100
  44 |   100
 100 |     2
 101 |     2
 104 |     2
 106 |     2
 201 |     1
 204 |     1
 303 |   100
 403 |     2
 407 |   100
(13 rows)

savepoint s3;
update ft2 set c2 = -2 where c2 = 42 and c1 = 10; -- fail on remote side
ERROR:  new row for relation "T 1" violates check constraint "c2positive"
DETAIL:  Failing row contains (10, -2, 00010_trig_update_trig_update, 1970-01-11 08:00:00+00, 1970-01-11 00:00:00, 0, 0         , foo).
CONTEXT:  Remote SQL command: UPDATE "S 1"."T 1" SET c2 = $2 WHERE ctid = $1
rollback to savepoint s3;
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
 c2  | count 
-----+-------
   1 |   100
   6 |   100
  42 |   100
  44 |   100
 100 |     2
 101 |     2
 104 |     2
 106 |     2
 201 |     1
 204 |     1
 303 |   100
 403 |     2
 407 |   100
(13 rows)

release savepoint s3;
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
 c2  | count 
-----+-------
   1 |   100
   6 |   100
  42 |   100
  44 |   100
 100 |     2
 101 |     2
 104 |     2
 106 |     2
 201 |     1
 204 |     1
 303 |   100
 403 |     2
 407 |   100
(13 rows)

-- none of the above is committed yet remotely
select c2, count(*) from "S 1"."T 1" where c2 < 500 group by 1 order by 1;
 c2  | count 
-----+-------
   0 |   100
   1 |   100
   4 |   100
   6 |   100
 100 |     2
 101 |     2
 104 |     2
 106 |     2
 201 |     1
 204 |     1
 303 |   100
 403 |     2
 407 |   100
(13 rows)

commit;
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
 c2  | count 
-----+-------
   1 |   100
   6 |   100
  42 |   100
  44 |   100
 100 |     2
 101 |     2
 104 |     2
 106 |     2
 201 |     1
 204 |     1
 303 |   100
 403 |     2
 407 |   100
(13 rows)

select c2, count(*) from "S 1"."T 1" where c2 < 500 group by 1 order by 1;
 c2  | count 
-----+-------
   1 |   100
   6 |   100
  42 |   100
  44 |   100
 100 |     2
 101 |     2
 104 |     2
 106 |     2
 201 |     1
 204 |     1
 303 |   100
 403 |     2
 407 |   100
(13 rows)

-- ===================================================================
-- test serial columns (ie, sequence-based defaults)
-- ===================================================================
create table loc1 (f1 serial, f2 text);
create foreign table rem1 (f1 serial, f2 text)
  server loopback options(table_name 'loc1');
select pg_catalog.setval('rem1_f1_seq', 10, false);
 setval 
--------
     10
(1 row)

insert into loc1(f2) values('hi');
insert into rem1(f2) values('hi remote');
insert into loc1(f2) values('bye');
insert into rem1(f2) values('bye remote');
select * from loc1;
 f1 |     f2     
----+------------
  1 | hi
 10 | hi remote
  2 | bye
 11 | bye remote
(4 rows)

select * from rem1;
 f1 |     f2     
----+------------
  1 | hi
 10 | hi remote
  2 | bye
 11 | bye remote
(4 rows)

-- ===================================================================
-- test local triggers
-- ===================================================================
-- Trigger functions "borrowed" from triggers regress test.
CREATE FUNCTION trigger_func() RETURNS trigger LANGUAGE plpgsql AS $$
BEGIN
	RAISE NOTICE 'trigger_func(%) called: action = %, when = %, level = %',
		TG_ARGV[0], TG_OP, TG_WHEN, TG_LEVEL;
	RETURN NULL;
END;$$;
CREATE TRIGGER trig_stmt_before BEFORE DELETE OR INSERT OR UPDATE ON rem1
	FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func();
CREATE TRIGGER trig_stmt_after AFTER DELETE OR INSERT OR UPDATE ON rem1
	FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func();
CREATE OR REPLACE FUNCTION trigger_data()  RETURNS trigger
LANGUAGE plpgsql AS $$

declare
	oldnew text[];
	relid text;
    argstr text;
begin

	relid := TG_relid::regclass;
	argstr := '';
	for i in 0 .. TG_nargs - 1 loop
		if i > 0 then
			argstr := argstr || ', ';
		end if;
		argstr := argstr || TG_argv[i];
	end loop;

    RAISE NOTICE '%(%) % % % ON %',
		tg_name, argstr, TG_when, TG_level, TG_OP, relid;
    oldnew := '{}'::text[];
	if TG_OP != 'INSERT' then
		oldnew := array_append(oldnew, format('OLD: %s', OLD));
	end if;

	if TG_OP != 'DELETE' then
		oldnew := array_append(oldnew, format('NEW: %s', NEW));
	end if;

    RAISE NOTICE '%', array_to_string(oldnew, ',');

	if TG_OP = 'DELETE' then
		return OLD;
	else
		return NEW;
	end if;
end;
$$;
-- Test basic functionality
CREATE TRIGGER trig_row_before
BEFORE INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
CREATE TRIGGER trig_row_after
AFTER INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
delete from rem1;
NOTICE:  trigger_func(<NULL>) called: action = DELETE, when = BEFORE, level = STATEMENT
NOTICE:  trig_row_before(23, skidoo) BEFORE ROW DELETE ON rem1
NOTICE:  OLD: (1,hi)
NOTICE:  trig_row_before(23, skidoo) BEFORE ROW DELETE ON rem1
NOTICE:  OLD: (10,"hi remote")
NOTICE:  trig_row_before(23, skidoo) BEFORE ROW DELETE ON rem1
NOTICE:  OLD: (2,bye)
NOTICE:  trig_row_before(23, skidoo) BEFORE ROW DELETE ON rem1
NOTICE:  OLD: (11,"bye remote")
NOTICE:  trig_row_after(23, skidoo) AFTER ROW DELETE ON rem1
NOTICE:  OLD: (1,hi)
NOTICE:  trig_row_after(23, skidoo) AFTER ROW DELETE ON rem1
NOTICE:  OLD: (10,"hi remote")
NOTICE:  trig_row_after(23, skidoo) AFTER ROW DELETE ON rem1
NOTICE:  OLD: (2,bye)
NOTICE:  trig_row_after(23, skidoo) AFTER ROW DELETE ON rem1
NOTICE:  OLD: (11,"bye remote")
NOTICE:  trigger_func(<NULL>) called: action = DELETE, when = AFTER, level = STATEMENT
insert into rem1 values(1,'insert');
NOTICE:  trigger_func(<NULL>) called: action = INSERT, when = BEFORE, level = STATEMENT
NOTICE:  trig_row_before(23, skidoo) BEFORE ROW INSERT ON rem1
NOTICE:  NEW: (1,insert)
NOTICE:  trig_row_after(23, skidoo) AFTER ROW INSERT ON rem1
NOTICE:  NEW: (1,insert)
NOTICE:  trigger_func(<NULL>) called: action = INSERT, when = AFTER, level = STATEMENT
update rem1 set f2  = 'update' where f1 = 1;
NOTICE:  trigger_func(<NULL>) called: action = UPDATE, when = BEFORE, level = STATEMENT
NOTICE:  trig_row_before(23, skidoo) BEFORE ROW UPDATE ON rem1
NOTICE:  OLD: (1,insert),NEW: (1,update)
NOTICE:  trig_row_after(23, skidoo) AFTER ROW UPDATE ON rem1
NOTICE:  OLD: (1,insert),NEW: (1,update)
NOTICE:  trigger_func(<NULL>) called: action = UPDATE, when = AFTER, level = STATEMENT
update rem1 set f2 = f2 || f2;
NOTICE:  trigger_func(<NULL>) called: action = UPDATE, when = BEFORE, level = STATEMENT
NOTICE:  trig_row_before(23, skidoo) BEFORE ROW UPDATE ON rem1
NOTICE:  OLD: (1,update),NEW: (1,updateupdate)
NOTICE:  trig_row_after(23, skidoo) AFTER ROW UPDATE ON rem1
NOTICE:  OLD: (1,update),NEW: (1,updateupdate)
NOTICE:  trigger_func(<NULL>) called: action = UPDATE, when = AFTER, level = STATEMENT
-- cleanup
DROP TRIGGER trig_row_before ON rem1;
DROP TRIGGER trig_row_after ON rem1;
DROP TRIGGER trig_stmt_before ON rem1;
DROP TRIGGER trig_stmt_after ON rem1;
DELETE from rem1;
-- Test WHEN conditions
CREATE TRIGGER trig_row_before_insupd
BEFORE INSERT OR UPDATE ON rem1
FOR EACH ROW
WHEN (NEW.f2 like '%update%')
EXECUTE PROCEDURE trigger_data(23,'skidoo');
CREATE TRIGGER trig_row_after_insupd
AFTER INSERT OR UPDATE ON rem1
FOR EACH ROW
WHEN (NEW.f2 like '%update%')
EXECUTE PROCEDURE trigger_data(23,'skidoo');
-- Insert or update not matching: nothing happens
INSERT INTO rem1 values(1, 'insert');
UPDATE rem1 set f2 = 'test';
-- Insert or update matching: triggers are fired
INSERT INTO rem1 values(2, 'update');
NOTICE:  trig_row_before_insupd(23, skidoo) BEFORE ROW INSERT ON rem1
NOTICE:  NEW: (2,update)
NOTICE:  trig_row_after_insupd(23, skidoo) AFTER ROW INSERT ON rem1
NOTICE:  NEW: (2,update)
UPDATE rem1 set f2 = 'update update' where f1 = '2';
NOTICE:  trig_row_before_insupd(23, skidoo) BEFORE ROW UPDATE ON rem1
NOTICE:  OLD: (2,update),NEW: (2,"update update")
NOTICE:  trig_row_after_insupd(23, skidoo) AFTER ROW UPDATE ON rem1
NOTICE:  OLD: (2,update),NEW: (2,"update update")
CREATE TRIGGER trig_row_before_delete
BEFORE DELETE ON rem1
FOR EACH ROW
WHEN (OLD.f2 like '%update%')
EXECUTE PROCEDURE trigger_data(23,'skidoo');
CREATE TRIGGER trig_row_after_delete
AFTER DELETE ON rem1
FOR EACH ROW
WHEN (OLD.f2 like '%update%')
EXECUTE PROCEDURE trigger_data(23,'skidoo');
-- Trigger is fired for f1=2, not for f1=1
DELETE FROM rem1;
NOTICE:  trig_row_before_delete(23, skidoo) BEFORE ROW DELETE ON rem1
NOTICE:  OLD: (2,"update update")
NOTICE:  trig_row_after_delete(23, skidoo) AFTER ROW DELETE ON rem1
NOTICE:  OLD: (2,"update update")
-- cleanup
DROP TRIGGER trig_row_before_insupd ON rem1;
DROP TRIGGER trig_row_after_insupd ON rem1;
DROP TRIGGER trig_row_before_delete ON rem1;
DROP TRIGGER trig_row_after_delete ON rem1;
-- Test various RETURN statements in BEFORE triggers.
CREATE FUNCTION trig_row_before_insupdate() RETURNS TRIGGER AS $$
  BEGIN
    NEW.f2 := NEW.f2 || ' triggered !';
    RETURN NEW;
  END
$$ language plpgsql;
CREATE TRIGGER trig_row_before_insupd
BEFORE INSERT OR UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trig_row_before_insupdate();
-- The new values should have 'triggered' appended
INSERT INTO rem1 values(1, 'insert');
SELECT * from loc1;
 f1 |         f2         
----+--------------------
  1 | insert triggered !
(1 row)

INSERT INTO rem1 values(2, 'insert') RETURNING f2;
         f2         
--------------------
 insert triggered !
(1 row)

SELECT * from loc1;
 f1 |         f2         
----+--------------------
  1 | insert triggered !
  2 | insert triggered !
(2 rows)

UPDATE rem1 set f2 = '';
SELECT * from loc1;
 f1 |      f2      
----+--------------
  1 |  triggered !
  2 |  triggered !
(2 rows)

UPDATE rem1 set f2 = 'skidoo' RETURNING f2;
         f2         
--------------------
 skidoo triggered !
 skidoo triggered !
(2 rows)

SELECT * from loc1;
 f1 |         f2         
----+--------------------
  1 | skidoo triggered !
  2 | skidoo triggered !
(2 rows)

DELETE FROM rem1;
-- Add a second trigger, to check that the changes are propagated correctly
-- from trigger to trigger
CREATE TRIGGER trig_row_before_insupd2
BEFORE INSERT OR UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trig_row_before_insupdate();
INSERT INTO rem1 values(1, 'insert');
SELECT * from loc1;
 f1 |               f2               
----+--------------------------------
  1 | insert triggered ! triggered !
(1 row)

INSERT INTO rem1 values(2, 'insert') RETURNING f2;
               f2               
--------------------------------
 insert triggered ! triggered !
(1 row)

SELECT * from loc1;
 f1 |               f2               
----+--------------------------------
  1 | insert triggered ! triggered !
  2 | insert triggered ! triggered !
(2 rows)

UPDATE rem1 set f2 = '';
SELECT * from loc1;
 f1 |            f2            
----+--------------------------
  1 |  triggered ! triggered !
  2 |  triggered ! triggered !
(2 rows)

UPDATE rem1 set f2 = 'skidoo' RETURNING f2;
               f2               
--------------------------------
 skidoo triggered ! triggered !
 skidoo triggered ! triggered !
(2 rows)

SELECT * from loc1;
 f1 |               f2               
----+--------------------------------
  1 | skidoo triggered ! triggered !
  2 | skidoo triggered ! triggered !
(2 rows)

DROP TRIGGER trig_row_before_insupd ON rem1;
DROP TRIGGER trig_row_before_insupd2 ON rem1;
DELETE from rem1;
INSERT INTO rem1 VALUES (1, 'test');
-- Test with a trigger returning NULL
CREATE FUNCTION trig_null() RETURNS TRIGGER AS $$
  BEGIN
    RETURN NULL;
  END
$$ language plpgsql;
CREATE TRIGGER trig_null
BEFORE INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trig_null();
-- Nothing should have changed.
INSERT INTO rem1 VALUES (2, 'test2');
SELECT * from loc1;
 f1 |  f2  
----+------
  1 | test
(1 row)

UPDATE rem1 SET f2 = 'test2';
SELECT * from loc1;
 f1 |  f2  
----+------
  1 | test
(1 row)

DELETE from rem1;
SELECT * from loc1;
 f1 |  f2  
----+------
  1 | test
(1 row)

DROP TRIGGER trig_null ON rem1;
DELETE from rem1;
-- Test a combination of local and remote triggers
CREATE TRIGGER trig_row_before
BEFORE INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
CREATE TRIGGER trig_row_after
AFTER INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
CREATE TRIGGER trig_local_before BEFORE INSERT OR UPDATE ON loc1
FOR EACH ROW EXECUTE PROCEDURE trig_row_before_insupdate();
INSERT INTO rem1(f2) VALUES ('test');
NOTICE:  trig_row_before(23, skidoo) BEFORE ROW INSERT ON rem1
NOTICE:  NEW: (12,test)
NOTICE:  trig_row_after(23, skidoo) AFTER ROW INSERT ON rem1
NOTICE:  NEW: (12,"test triggered !")
UPDATE rem1 SET f2 = 'testo';
NOTICE:  trig_row_before(23, skidoo) BEFORE ROW UPDATE ON rem1
NOTICE:  OLD: (12,"test triggered !"),NEW: (12,testo)
NOTICE:  trig_row_after(23, skidoo) AFTER ROW UPDATE ON rem1
NOTICE:  OLD: (12,"test triggered !"),NEW: (12,"testo triggered !")
-- Test returning a system attribute
INSERT INTO rem1(f2) VALUES ('test') RETURNING ctid;
NOTICE:  trig_row_before(23, skidoo) BEFORE ROW INSERT ON rem1
NOTICE:  NEW: (13,test)
NOTICE:  trig_row_after(23, skidoo) AFTER ROW INSERT ON rem1
NOTICE:  NEW: (13,"test triggered !")
  ctid  
--------
 (0,27)
(1 row)