postgres_fdw: When sending ORDER BY, always include NULLS FIRST/LAST.
Previously, we included NULLS FIRST when appropriate but relied on the default behavior to be NULLS LAST. This is, however, not true for a sort in descending order and seems like a fragile assumption anyway. Report by Rajkumar Raghuwanshi. Patch by Ashutosh Bapat. Review comments from Michael Paquier and Tom Lane.
This commit is contained in:
parent
52fe6f4e02
commit
3bea3f88d5
3 changed files with 125 additions and 31 deletions
|
@ -2308,6 +2308,8 @@ appendOrderByClause(List *pathkeys, deparse_expr_cxt *context)
|
||||||
|
|
||||||
if (pathkey->pk_nulls_first)
|
if (pathkey->pk_nulls_first)
|
||||||
appendStringInfoString(buf, " NULLS FIRST");
|
appendStringInfoString(buf, " NULLS FIRST");
|
||||||
|
else
|
||||||
|
appendStringInfoString(buf, " NULLS LAST");
|
||||||
|
|
||||||
delim = ", ";
|
delim = ", ";
|
||||||
}
|
}
|
||||||
|
|
|
@ -245,13 +245,13 @@ SELECT * FROM ft1 t1 ORDER BY t1.c3, t1.c1, t1.tableoid OFFSET 100 LIMIT 10;
|
||||||
|
|
||||||
-- whole-row reference
|
-- whole-row reference
|
||||||
EXPLAIN (VERBOSE, COSTS false) SELECT t1 FROM ft1 t1 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
|
EXPLAIN (VERBOSE, COSTS false) SELECT t1 FROM ft1 t1 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
|
||||||
QUERY PLAN
|
QUERY PLAN
|
||||||
----------------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------------------------------------
|
||||||
Limit
|
Limit
|
||||||
Output: t1.*, c3, c1
|
Output: t1.*, c3, c1
|
||||||
-> Foreign Scan on public.ft1 t1
|
-> Foreign Scan on public.ft1 t1
|
||||||
Output: t1.*, c3, c1
|
Output: t1.*, c3, c1
|
||||||
Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" ORDER BY c3 ASC, "C 1" ASC
|
Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" ORDER BY c3 ASC NULLS LAST, "C 1" ASC NULLS LAST
|
||||||
(5 rows)
|
(5 rows)
|
||||||
|
|
||||||
SELECT t1 FROM ft1 t1 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
|
SELECT t1 FROM ft1 t1 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
|
||||||
|
@ -382,8 +382,8 @@ SET enable_nestloop TO false;
|
||||||
-- inner join; expressions in the clauses appear in the equivalence class list
|
-- inner join; expressions in the clauses appear in the equivalence class list
|
||||||
EXPLAIN (VERBOSE, COSTS false)
|
EXPLAIN (VERBOSE, COSTS false)
|
||||||
SELECT t1.c1, t2."C 1" FROM ft2 t1 JOIN "S 1"."T 1" t2 ON (t1.c1 = t2."C 1") OFFSET 100 LIMIT 10;
|
SELECT t1.c1, t2."C 1" FROM ft2 t1 JOIN "S 1"."T 1" t2 ON (t1.c1 = t2."C 1") OFFSET 100 LIMIT 10;
|
||||||
QUERY PLAN
|
QUERY PLAN
|
||||||
----------------------------------------------------------------------------
|
---------------------------------------------------------------------------------------
|
||||||
Limit
|
Limit
|
||||||
Output: t1.c1, t2."C 1"
|
Output: t1.c1, t2."C 1"
|
||||||
-> Merge Join
|
-> Merge Join
|
||||||
|
@ -391,7 +391,7 @@ EXPLAIN (VERBOSE, COSTS false)
|
||||||
Merge Cond: (t1.c1 = t2."C 1")
|
Merge Cond: (t1.c1 = t2."C 1")
|
||||||
-> Foreign Scan on public.ft2 t1
|
-> Foreign Scan on public.ft2 t1
|
||||||
Output: t1.c1
|
Output: t1.c1
|
||||||
Remote SQL: SELECT "C 1" FROM "S 1"."T 1" ORDER BY "C 1" ASC
|
Remote SQL: SELECT "C 1" FROM "S 1"."T 1" ORDER BY "C 1" ASC NULLS LAST
|
||||||
-> Index Only Scan using t1_pkey on "S 1"."T 1" t2
|
-> Index Only Scan using t1_pkey on "S 1"."T 1" t2
|
||||||
Output: t2."C 1"
|
Output: t2."C 1"
|
||||||
(10 rows)
|
(10 rows)
|
||||||
|
@ -415,8 +415,8 @@ SELECT t1.c1, t2."C 1" FROM ft2 t1 JOIN "S 1"."T 1" t2 ON (t1.c1 = t2."C 1") OFF
|
||||||
-- list but no output change as compared to the previous query
|
-- list but no output change as compared to the previous query
|
||||||
EXPLAIN (VERBOSE, COSTS false)
|
EXPLAIN (VERBOSE, COSTS false)
|
||||||
SELECT t1.c1, t2."C 1" FROM ft2 t1 LEFT JOIN "S 1"."T 1" t2 ON (t1.c1 = t2."C 1") OFFSET 100 LIMIT 10;
|
SELECT t1.c1, t2."C 1" FROM ft2 t1 LEFT JOIN "S 1"."T 1" t2 ON (t1.c1 = t2."C 1") OFFSET 100 LIMIT 10;
|
||||||
QUERY PLAN
|
QUERY PLAN
|
||||||
----------------------------------------------------------------------------
|
---------------------------------------------------------------------------------------
|
||||||
Limit
|
Limit
|
||||||
Output: t1.c1, t2."C 1"
|
Output: t1.c1, t2."C 1"
|
||||||
-> Merge Left Join
|
-> Merge Left Join
|
||||||
|
@ -424,7 +424,7 @@ EXPLAIN (VERBOSE, COSTS false)
|
||||||
Merge Cond: (t1.c1 = t2."C 1")
|
Merge Cond: (t1.c1 = t2."C 1")
|
||||||
-> Foreign Scan on public.ft2 t1
|
-> Foreign Scan on public.ft2 t1
|
||||||
Output: t1.c1
|
Output: t1.c1
|
||||||
Remote SQL: SELECT "C 1" FROM "S 1"."T 1" ORDER BY "C 1" ASC
|
Remote SQL: SELECT "C 1" FROM "S 1"."T 1" ORDER BY "C 1" ASC NULLS LAST
|
||||||
-> Index Only Scan using t1_pkey on "S 1"."T 1" t2
|
-> Index Only Scan using t1_pkey on "S 1"."T 1" t2
|
||||||
Output: t2."C 1"
|
Output: t2."C 1"
|
||||||
(10 rows)
|
(10 rows)
|
||||||
|
@ -1341,8 +1341,8 @@ SELECT t1.ctid, t1, t2, t1.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER B
|
||||||
-- SEMI JOIN, not pushed down
|
-- SEMI JOIN, not pushed down
|
||||||
EXPLAIN (COSTS false, VERBOSE)
|
EXPLAIN (COSTS false, VERBOSE)
|
||||||
SELECT t1.c1 FROM ft1 t1 WHERE EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c1) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
|
SELECT t1.c1 FROM ft1 t1 WHERE EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c1) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
|
||||||
QUERY PLAN
|
QUERY PLAN
|
||||||
----------------------------------------------------------------------------------
|
---------------------------------------------------------------------------------------------
|
||||||
Limit
|
Limit
|
||||||
Output: t1.c1
|
Output: t1.c1
|
||||||
-> Merge Semi Join
|
-> Merge Semi Join
|
||||||
|
@ -1350,12 +1350,12 @@ SELECT t1.c1 FROM ft1 t1 WHERE EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c1)
|
||||||
Merge Cond: (t1.c1 = t2.c1)
|
Merge Cond: (t1.c1 = t2.c1)
|
||||||
-> Foreign Scan on public.ft1 t1
|
-> Foreign Scan on public.ft1 t1
|
||||||
Output: t1.c1
|
Output: t1.c1
|
||||||
Remote SQL: SELECT "C 1" FROM "S 1"."T 1" ORDER BY "C 1" ASC
|
Remote SQL: SELECT "C 1" FROM "S 1"."T 1" ORDER BY "C 1" ASC NULLS LAST
|
||||||
-> Materialize
|
-> Materialize
|
||||||
Output: t2.c1
|
Output: t2.c1
|
||||||
-> Foreign Scan on public.ft2 t2
|
-> Foreign Scan on public.ft2 t2
|
||||||
Output: t2.c1
|
Output: t2.c1
|
||||||
Remote SQL: SELECT "C 1" FROM "S 1"."T 1" ORDER BY "C 1" ASC
|
Remote SQL: SELECT "C 1" FROM "S 1"."T 1" ORDER BY "C 1" ASC NULLS LAST
|
||||||
(13 rows)
|
(13 rows)
|
||||||
|
|
||||||
SELECT t1.c1 FROM ft1 t1 WHERE EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c1) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
|
SELECT t1.c1 FROM ft1 t1 WHERE EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c1) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
|
||||||
|
@ -1376,8 +1376,8 @@ SELECT t1.c1 FROM ft1 t1 WHERE EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c1)
|
||||||
-- ANTI JOIN, not pushed down
|
-- ANTI JOIN, not pushed down
|
||||||
EXPLAIN (COSTS false, VERBOSE)
|
EXPLAIN (COSTS false, VERBOSE)
|
||||||
SELECT t1.c1 FROM ft1 t1 WHERE NOT EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c2) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
|
SELECT t1.c1 FROM ft1 t1 WHERE NOT EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c2) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
|
||||||
QUERY PLAN
|
QUERY PLAN
|
||||||
----------------------------------------------------------------------------
|
---------------------------------------------------------------------------------------
|
||||||
Limit
|
Limit
|
||||||
Output: t1.c1
|
Output: t1.c1
|
||||||
-> Merge Anti Join
|
-> Merge Anti Join
|
||||||
|
@ -1385,12 +1385,12 @@ SELECT t1.c1 FROM ft1 t1 WHERE NOT EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2
|
||||||
Merge Cond: (t1.c1 = t2.c2)
|
Merge Cond: (t1.c1 = t2.c2)
|
||||||
-> Foreign Scan on public.ft1 t1
|
-> Foreign Scan on public.ft1 t1
|
||||||
Output: t1.c1
|
Output: t1.c1
|
||||||
Remote SQL: SELECT "C 1" FROM "S 1"."T 1" ORDER BY "C 1" ASC
|
Remote SQL: SELECT "C 1" FROM "S 1"."T 1" ORDER BY "C 1" ASC NULLS LAST
|
||||||
-> Materialize
|
-> Materialize
|
||||||
Output: t2.c2
|
Output: t2.c2
|
||||||
-> Foreign Scan on public.ft2 t2
|
-> Foreign Scan on public.ft2 t2
|
||||||
Output: t2.c2
|
Output: t2.c2
|
||||||
Remote SQL: SELECT c2 FROM "S 1"."T 1" ORDER BY c2 ASC
|
Remote SQL: SELECT c2 FROM "S 1"."T 1" ORDER BY c2 ASC NULLS LAST
|
||||||
(13 rows)
|
(13 rows)
|
||||||
|
|
||||||
SELECT t1.c1 FROM ft1 t1 WHERE NOT EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c2) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
|
SELECT t1.c1 FROM ft1 t1 WHERE NOT EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c2) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
|
||||||
|
@ -1448,8 +1448,8 @@ SELECT t1.c1, t2.c1 FROM ft1 t1 CROSS JOIN ft2 t2 ORDER BY t1.c1, t2.c1 OFFSET 1
|
||||||
-- different server, not pushed down. No result expected.
|
-- different server, not pushed down. No result expected.
|
||||||
EXPLAIN (COSTS false, VERBOSE)
|
EXPLAIN (COSTS false, VERBOSE)
|
||||||
SELECT t1.c1, t2.c1 FROM ft5 t1 JOIN ft6 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
|
SELECT t1.c1, t2.c1 FROM ft5 t1 JOIN ft6 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
|
||||||
QUERY PLAN
|
QUERY PLAN
|
||||||
----------------------------------------------------------------------------
|
---------------------------------------------------------------------------------------
|
||||||
Limit
|
Limit
|
||||||
Output: t1.c1, t2.c1
|
Output: t1.c1, t2.c1
|
||||||
-> Merge Join
|
-> Merge Join
|
||||||
|
@ -1457,12 +1457,12 @@ SELECT t1.c1, t2.c1 FROM ft5 t1 JOIN ft6 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t
|
||||||
Merge Cond: (t2.c1 = t1.c1)
|
Merge Cond: (t2.c1 = t1.c1)
|
||||||
-> Foreign Scan on public.ft6 t2
|
-> Foreign Scan on public.ft6 t2
|
||||||
Output: t2.c1, t2.c2, t2.c3
|
Output: t2.c1, t2.c2, t2.c3
|
||||||
Remote SQL: SELECT c1 FROM "S 1"."T 4" ORDER BY c1 ASC
|
Remote SQL: SELECT c1 FROM "S 1"."T 4" ORDER BY c1 ASC NULLS LAST
|
||||||
-> Materialize
|
-> Materialize
|
||||||
Output: t1.c1, t1.c2, t1.c3
|
Output: t1.c1, t1.c2, t1.c3
|
||||||
-> Foreign Scan on public.ft5 t1
|
-> Foreign Scan on public.ft5 t1
|
||||||
Output: t1.c1, t1.c2, t1.c3
|
Output: t1.c1, t1.c2, t1.c3
|
||||||
Remote SQL: SELECT c1 FROM "S 1"."T 4" ORDER BY c1 ASC
|
Remote SQL: SELECT c1 FROM "S 1"."T 4" ORDER BY c1 ASC NULLS LAST
|
||||||
(13 rows)
|
(13 rows)
|
||||||
|
|
||||||
SELECT t1.c1, t2.c1 FROM ft5 t1 JOIN ft6 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
|
SELECT t1.c1, t2.c1 FROM ft5 t1 JOIN ft6 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
|
||||||
|
@ -1746,8 +1746,8 @@ EXECUTE join_stmt;
|
||||||
-- different user mappings
|
-- different user mappings
|
||||||
CREATE USER MAPPING FOR view_owner SERVER loopback;
|
CREATE USER MAPPING FOR view_owner SERVER loopback;
|
||||||
EXPLAIN (COSTS false, VERBOSE) EXECUTE join_stmt;
|
EXPLAIN (COSTS false, VERBOSE) EXECUTE join_stmt;
|
||||||
QUERY PLAN
|
QUERY PLAN
|
||||||
----------------------------------------------------------------------------
|
---------------------------------------------------------------------------------------
|
||||||
Limit
|
Limit
|
||||||
Output: t1.c1, ft5.c1
|
Output: t1.c1, ft5.c1
|
||||||
-> Merge Join
|
-> Merge Join
|
||||||
|
@ -1755,12 +1755,12 @@ EXPLAIN (COSTS false, VERBOSE) EXECUTE join_stmt;
|
||||||
Merge Cond: (t1.c1 = ft5.c1)
|
Merge Cond: (t1.c1 = ft5.c1)
|
||||||
-> Foreign Scan on public.ft5 t1
|
-> Foreign Scan on public.ft5 t1
|
||||||
Output: t1.c1, t1.c2, t1.c3
|
Output: t1.c1, t1.c2, t1.c3
|
||||||
Remote SQL: SELECT c1 FROM "S 1"."T 4" ORDER BY c1 ASC
|
Remote SQL: SELECT c1 FROM "S 1"."T 4" ORDER BY c1 ASC NULLS LAST
|
||||||
-> Materialize
|
-> Materialize
|
||||||
Output: ft5.c1, ft5.c2, ft5.c3
|
Output: ft5.c1, ft5.c2, ft5.c3
|
||||||
-> Foreign Scan on public.ft5
|
-> Foreign Scan on public.ft5
|
||||||
Output: ft5.c1, ft5.c2, ft5.c3
|
Output: ft5.c1, ft5.c2, ft5.c3
|
||||||
Remote SQL: SELECT c1 FROM "S 1"."T 4" ORDER BY c1 ASC
|
Remote SQL: SELECT c1 FROM "S 1"."T 4" ORDER BY c1 ASC NULLS LAST
|
||||||
(13 rows)
|
(13 rows)
|
||||||
|
|
||||||
EXECUTE join_stmt;
|
EXECUTE join_stmt;
|
||||||
|
@ -3813,6 +3813,86 @@ select c2, count(*) from "S 1"."T 1" where c2 < 500 group by 1 order by 1;
|
||||||
407 | 100
|
407 | 100
|
||||||
(13 rows)
|
(13 rows)
|
||||||
|
|
||||||
|
-- Above DMLs add data with c6 as NULL in ft1, so test ORDER BY NULLS LAST and NULLs
|
||||||
|
-- FIRST behavior here.
|
||||||
|
-- ORDER BY DESC NULLS LAST options
|
||||||
|
EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 ORDER BY c6 DESC NULLS LAST, c1 OFFSET 795 LIMIT 10;
|
||||||
|
QUERY PLAN
|
||||||
|
---------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
Limit
|
||||||
|
Output: c1, c2, c3, c4, c5, c6, c7, c8
|
||||||
|
-> Foreign Scan on public.ft1
|
||||||
|
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" ORDER BY c6 DESC NULLS LAST, "C 1" ASC NULLS LAST
|
||||||
|
(5 rows)
|
||||||
|
|
||||||
|
SELECT * FROM ft1 ORDER BY c6 DESC NULLS LAST, c1 OFFSET 795 LIMIT 10;
|
||||||
|
c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8
|
||||||
|
------+-----+--------------------+------------------------------+--------------------------+------+------------+-----
|
||||||
|
960 | 42 | 00960_trig_update | Mon Mar 02 00:00:00 1970 PST | Mon Mar 02 00:00:00 1970 | 0 | 0 | foo
|
||||||
|
970 | 42 | 00970_trig_update | Thu Mar 12 00:00:00 1970 PST | Thu Mar 12 00:00:00 1970 | 0 | 0 | foo
|
||||||
|
980 | 42 | 00980_trig_update | Sun Mar 22 00:00:00 1970 PST | Sun Mar 22 00:00:00 1970 | 0 | 0 | foo
|
||||||
|
990 | 42 | 00990_trig_update | Wed Apr 01 00:00:00 1970 PST | Wed Apr 01 00:00:00 1970 | 0 | 0 | foo
|
||||||
|
1000 | 42 | 01000_trig_update | Thu Jan 01 00:00:00 1970 PST | Thu Jan 01 00:00:00 1970 | 0 | 0 | foo
|
||||||
|
1218 | 818 | ggg_trig_update | | | (--; | ft2 |
|
||||||
|
1001 | 101 | 0000100001 | | | | ft2 |
|
||||||
|
1003 | 403 | 0000300003_update3 | | | | ft2 |
|
||||||
|
1004 | 104 | 0000400004 | | | | ft2 |
|
||||||
|
1006 | 106 | 0000600006 | | | | ft2 |
|
||||||
|
(10 rows)
|
||||||
|
|
||||||
|
-- ORDER BY DESC NULLS FIRST options
|
||||||
|
EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 ORDER BY c6 DESC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
|
||||||
|
QUERY PLAN
|
||||||
|
----------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
Limit
|
||||||
|
Output: c1, c2, c3, c4, c5, c6, c7, c8
|
||||||
|
-> Foreign Scan on public.ft1
|
||||||
|
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" ORDER BY c6 DESC NULLS FIRST, "C 1" ASC NULLS LAST
|
||||||
|
(5 rows)
|
||||||
|
|
||||||
|
SELECT * FROM ft1 ORDER BY c6 DESC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
|
||||||
|
c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8
|
||||||
|
------+-----+-----------------+------------------------------+--------------------------+----+------------+-----
|
||||||
|
1020 | 100 | 0002000020 | | | | ft2 |
|
||||||
|
1101 | 201 | aaa | | | | ft2 |
|
||||||
|
1103 | 503 | ccc_update3 | | | | ft2 |
|
||||||
|
1104 | 204 | ddd | | | | ft2 |
|
||||||
|
1208 | 818 | fff_trig_update | | | | ft2 |
|
||||||
|
9 | 509 | 00009_update9 | Sat Jan 10 00:00:00 1970 PST | Sat Jan 10 00:00:00 1970 | 9 | ft2 | foo
|
||||||
|
19 | 509 | 00019_update9 | Tue Jan 20 00:00:00 1970 PST | Tue Jan 20 00:00:00 1970 | 9 | ft2 | foo
|
||||||
|
29 | 509 | 00029_update9 | Fri Jan 30 00:00:00 1970 PST | Fri Jan 30 00:00:00 1970 | 9 | ft2 | foo
|
||||||
|
39 | 509 | 00039_update9 | Mon Feb 09 00:00:00 1970 PST | Mon Feb 09 00:00:00 1970 | 9 | ft2 | foo
|
||||||
|
49 | 509 | 00049_update9 | Thu Feb 19 00:00:00 1970 PST | Thu Feb 19 00:00:00 1970 | 9 | ft2 | foo
|
||||||
|
(10 rows)
|
||||||
|
|
||||||
|
-- ORDER BY ASC NULLS FIRST options
|
||||||
|
EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 ORDER BY c6 ASC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
|
||||||
|
QUERY PLAN
|
||||||
|
---------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
Limit
|
||||||
|
Output: c1, c2, c3, c4, c5, c6, c7, c8
|
||||||
|
-> Foreign Scan on public.ft1
|
||||||
|
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" ORDER BY c6 ASC NULLS FIRST, "C 1" ASC NULLS LAST
|
||||||
|
(5 rows)
|
||||||
|
|
||||||
|
SELECT * FROM ft1 ORDER BY c6 ASC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
|
||||||
|
c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8
|
||||||
|
------+-----+-------------------+------------------------------+--------------------------+------+------------+-----
|
||||||
|
1020 | 100 | 0002000020 | | | | ft2 |
|
||||||
|
1101 | 201 | aaa | | | | ft2 |
|
||||||
|
1103 | 503 | ccc_update3 | | | | ft2 |
|
||||||
|
1104 | 204 | ddd | | | | ft2 |
|
||||||
|
1208 | 818 | fff_trig_update | | | | ft2 |
|
||||||
|
1218 | 818 | ggg_trig_update | | | (--; | ft2 |
|
||||||
|
10 | 42 | 00010_trig_update | Sun Jan 11 00:00:00 1970 PST | Sun Jan 11 00:00:00 1970 | 0 | 0 | foo
|
||||||
|
20 | 42 | 00020_trig_update | Wed Jan 21 00:00:00 1970 PST | Wed Jan 21 00:00:00 1970 | 0 | 0 | foo
|
||||||
|
30 | 42 | 00030_trig_update | Sat Jan 31 00:00:00 1970 PST | Sat Jan 31 00:00:00 1970 | 0 | 0 | foo
|
||||||
|
40 | 42 | 00040_trig_update | Tue Feb 10 00:00:00 1970 PST | Tue Feb 10 00:00:00 1970 | 0 | 0 | foo
|
||||||
|
(10 rows)
|
||||||
|
|
||||||
-- ===================================================================
|
-- ===================================================================
|
||||||
-- test check constraints
|
-- test check constraints
|
||||||
-- ===================================================================
|
-- ===================================================================
|
||||||
|
@ -4630,8 +4710,8 @@ analyze loct1;
|
||||||
-- inner join; expressions in the clauses appear in the equivalence class list
|
-- inner join; expressions in the clauses appear in the equivalence class list
|
||||||
explain (verbose, costs off)
|
explain (verbose, costs off)
|
||||||
select foo.f1, loct1.f1 from foo join loct1 on (foo.f1 = loct1.f1) order by foo.f2 offset 10 limit 10;
|
select foo.f1, loct1.f1 from foo join loct1 on (foo.f1 = loct1.f1) order by foo.f2 offset 10 limit 10;
|
||||||
QUERY PLAN
|
QUERY PLAN
|
||||||
---------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------
|
||||||
Limit
|
Limit
|
||||||
Output: foo.f1, loct1.f1, foo.f2
|
Output: foo.f1, loct1.f1, foo.f2
|
||||||
-> Sort
|
-> Sort
|
||||||
|
@ -4646,7 +4726,7 @@ explain (verbose, costs off)
|
||||||
Output: foo.f1, foo.f2
|
Output: foo.f1, foo.f2
|
||||||
-> Foreign Scan on public.foo2
|
-> Foreign Scan on public.foo2
|
||||||
Output: foo2.f1, foo2.f2
|
Output: foo2.f1, foo2.f2
|
||||||
Remote SQL: SELECT f1, f2 FROM public.loct1 ORDER BY f1 ASC
|
Remote SQL: SELECT f1, f2 FROM public.loct1 ORDER BY f1 ASC NULLS LAST
|
||||||
-> Index Only Scan using i_loct1_f1 on public.loct1
|
-> Index Only Scan using i_loct1_f1 on public.loct1
|
||||||
Output: loct1.f1
|
Output: loct1.f1
|
||||||
(17 rows)
|
(17 rows)
|
||||||
|
@ -4670,8 +4750,8 @@ select foo.f1, loct1.f1 from foo join loct1 on (foo.f1 = loct1.f1) order by foo.
|
||||||
-- list but no output change as compared to the previous query
|
-- list but no output change as compared to the previous query
|
||||||
explain (verbose, costs off)
|
explain (verbose, costs off)
|
||||||
select foo.f1, loct1.f1 from foo left join loct1 on (foo.f1 = loct1.f1) order by foo.f2 offset 10 limit 10;
|
select foo.f1, loct1.f1 from foo left join loct1 on (foo.f1 = loct1.f1) order by foo.f2 offset 10 limit 10;
|
||||||
QUERY PLAN
|
QUERY PLAN
|
||||||
---------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------
|
||||||
Limit
|
Limit
|
||||||
Output: foo.f1, loct1.f1, foo.f2
|
Output: foo.f1, loct1.f1, foo.f2
|
||||||
-> Sort
|
-> Sort
|
||||||
|
@ -4686,7 +4766,7 @@ explain (verbose, costs off)
|
||||||
Output: foo.f1, foo.f2
|
Output: foo.f1, foo.f2
|
||||||
-> Foreign Scan on public.foo2
|
-> Foreign Scan on public.foo2
|
||||||
Output: foo2.f1, foo2.f2
|
Output: foo2.f1, foo2.f2
|
||||||
Remote SQL: SELECT f1, f2 FROM public.loct1 ORDER BY f1 ASC
|
Remote SQL: SELECT f1, f2 FROM public.loct1 ORDER BY f1 ASC NULLS LAST
|
||||||
-> Index Only Scan using i_loct1_f1 on public.loct1
|
-> Index Only Scan using i_loct1_f1 on public.loct1
|
||||||
Output: loct1.f1
|
Output: loct1.f1
|
||||||
(17 rows)
|
(17 rows)
|
||||||
|
|
|
@ -677,6 +677,18 @@ commit;
|
||||||
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
|
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
|
||||||
select c2, count(*) from "S 1"."T 1" where c2 < 500 group by 1 order by 1;
|
select c2, count(*) from "S 1"."T 1" where c2 < 500 group by 1 order by 1;
|
||||||
|
|
||||||
|
-- Above DMLs add data with c6 as NULL in ft1, so test ORDER BY NULLS LAST and NULLs
|
||||||
|
-- FIRST behavior here.
|
||||||
|
-- ORDER BY DESC NULLS LAST options
|
||||||
|
EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 ORDER BY c6 DESC NULLS LAST, c1 OFFSET 795 LIMIT 10;
|
||||||
|
SELECT * FROM ft1 ORDER BY c6 DESC NULLS LAST, c1 OFFSET 795 LIMIT 10;
|
||||||
|
-- ORDER BY DESC NULLS FIRST options
|
||||||
|
EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 ORDER BY c6 DESC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
|
||||||
|
SELECT * FROM ft1 ORDER BY c6 DESC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
|
||||||
|
-- ORDER BY ASC NULLS FIRST options
|
||||||
|
EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 ORDER BY c6 ASC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
|
||||||
|
SELECT * FROM ft1 ORDER BY c6 ASC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
|
||||||
|
|
||||||
-- ===================================================================
|
-- ===================================================================
|
||||||
-- test check constraints
|
-- test check constraints
|
||||||
-- ===================================================================
|
-- ===================================================================
|
||||||
|
|
Loading…
Reference in a new issue