statement ok
SET propagate_input_ordering=true;

query I
WITH tmp AS (SELECT * FROM generate_series(1, 10) i ORDER BY i % 5 ASC, i ASC) SELECT * FROM tmp;
----
5
10
1
6
2
7
3
8
4
9

query I
WITH tmp AS (SELECT * FROM generate_series(1, 10) i ORDER BY i % 5 ASC, i ASC) SELECT * FROM tmp;
----
5
10
1
6
2
7
3
8
4
9

# The internal ordering column for i%5 should not be present in the output.
query T
SELECT foo FROM (SELECT i, i%2 FROM generate_series(1, 10) i ORDER BY i % 5 ASC, i ASC) AS foo
----
(5,1)
(10,0)
(1,1)
(6,0)
(2,0)
(7,1)
(3,1)
(8,0)
(4,0)
(9,1)

# The internal ordering column for i%5 should not be present in the output.
query II
SELECT foo.* FROM (SELECT i, i%2 FROM generate_series(1, 10) i ORDER BY i % 5 ASC, i ASC) AS foo
----
5   1
10  0
1   1
6   0
2   0
7   1
3   1
8   0
4   0
9   1

# The subquery ordering is propagated to the aggregation.
query T
SELECT array_agg(i) FROM (SELECT * FROM generate_series(1, 5) i ORDER BY i%2 DESC, i)
----
{1,3,5,2,4}

# The input ordering is not propagated through joins.
query II
SELECT *
FROM (SELECT * FROM generate_series(1, 2) x) tmp,
     (SELECT * FROM generate_series(8, 12) i ORDER BY i % 5 ASC, i ASC) tmp2;
----
1  8
1  9
1  10
1  11
1  12
2  8
2  9
2  10
2  11
2  12

# Do not preserve the subquery ordering because the parent scope has its own
# ordering.
query I
WITH tmp AS (SELECT * FROM generate_series(1, 10) i ORDER BY i % 5 ASC, i ASC)
SELECT * FROM tmp ORDER BY i DESC;
----
10
9
8
7
6
5
4
3
2
1

# Do not preserve the subquery ordering because the parent scope has its own
# ordering.
query I
WITH tmp AS (SELECT * FROM generate_series(1, 10) i ORDER BY i % 5 ASC, i ASC)
SELECT * FROM tmp ORDER BY i DESC;
----
10
9
8
7
6
5
4
3
2
1

statement ok
CREATE TABLE ab (a int, b int)

statement ok
INSERT INTO ab VALUES (10, 100), (1, 10), (5, 50)

statement ok
CREATE TABLE xy (x int, y int);

statement ok
INSERT INTO xy VALUES (2, 20), (8, 80), (4, 41), (4, 40)

query I
WITH
  cte1 AS (SELECT b FROM ab ORDER BY a),
  cte2 AS (SELECT y FROM xy ORDER BY x, y)
SELECT * FROM cte1 UNION ALL SELECT * FROM cte2
----
10
50
100
20
40
41
80

query I
WITH
  cte1 AS (SELECT b FROM ab ORDER BY a+b),
  cte2 AS (SELECT DISTINCT ON (x) y FROM xy ORDER BY x, y)
SELECT * FROM cte1 UNION ALL SELECT * FROM cte2
----
10
50
100
20
40
80

statement ok
RESET propagate_input_ordering
