mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-10 01:25:21 +00:00
Merge pull request #34393 from kitaisreal/sort-added-equal-items-randomization
Sort added equal items ranges randomization
This commit is contained in:
commit
70ffcb8e33
109
base/base/sort.h
109
base/base/sort.h
@ -2,6 +2,63 @@
|
||||
|
||||
#include <pdqsort.h>
|
||||
|
||||
#ifndef NDEBUG
|
||||
|
||||
#include <pcg_random.hpp>
|
||||
#include <base/getThreadId.h>
|
||||
|
||||
/** Same as libcxx std::__debug_less. Just without dependency on private part of standard library.
|
||||
* Check that Comparator induce strict weak ordering.
|
||||
*/
|
||||
template <typename Comparator>
|
||||
class DebugLessComparator
|
||||
{
|
||||
public:
|
||||
constexpr DebugLessComparator(Comparator & cmp_)
|
||||
: cmp(cmp_)
|
||||
{}
|
||||
|
||||
template <typename LhsType, typename RhsType>
|
||||
constexpr bool operator()(const LhsType & lhs, const RhsType & rhs)
|
||||
{
|
||||
bool lhs_less_than_rhs = cmp(lhs, rhs);
|
||||
if (lhs_less_than_rhs)
|
||||
assert(!cmp(rhs, lhs));
|
||||
|
||||
return lhs_less_than_rhs;
|
||||
}
|
||||
|
||||
template <typename LhsType, typename RhsType>
|
||||
constexpr bool operator()(LhsType & lhs, RhsType & rhs)
|
||||
{
|
||||
bool lhs_less_than_rhs = cmp(lhs, rhs);
|
||||
if (lhs_less_than_rhs)
|
||||
assert(!cmp(rhs, lhs));
|
||||
|
||||
return lhs_less_than_rhs;
|
||||
}
|
||||
|
||||
private:
|
||||
Comparator & cmp;
|
||||
};
|
||||
|
||||
template <typename Comparator>
|
||||
using ComparatorWrapper = DebugLessComparator<Comparator>;
|
||||
|
||||
template <typename RandomIt>
|
||||
void shuffle(RandomIt first, RandomIt last)
|
||||
{
|
||||
static thread_local pcg64 rng(getThreadId());
|
||||
std::shuffle(first, last, rng);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
template <typename Comparator>
|
||||
using ComparatorWrapper = Comparator;
|
||||
|
||||
#endif
|
||||
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wold-style-cast"
|
||||
|
||||
@ -10,19 +67,48 @@
|
||||
template <typename RandomIt>
|
||||
void nth_element(RandomIt first, RandomIt nth, RandomIt last)
|
||||
{
|
||||
::miniselect::floyd_rivest_select(first, nth, last);
|
||||
}
|
||||
using value_type = typename std::iterator_traits<RandomIt>::value_type;
|
||||
using comparator = std::less<value_type>;
|
||||
|
||||
template <typename RandomIt>
|
||||
void partial_sort(RandomIt first, RandomIt middle, RandomIt last)
|
||||
{
|
||||
::miniselect::floyd_rivest_partial_sort(first, middle, last);
|
||||
comparator compare;
|
||||
ComparatorWrapper<comparator> compare_wrapper = compare;
|
||||
|
||||
#ifndef NDEBUG
|
||||
::shuffle(first, last);
|
||||
#endif
|
||||
|
||||
::miniselect::floyd_rivest_select(first, nth, last, compare_wrapper);
|
||||
|
||||
#ifndef NDEBUG
|
||||
::shuffle(first, nth);
|
||||
|
||||
if (nth != last)
|
||||
::shuffle(nth + 1, last);
|
||||
#endif
|
||||
}
|
||||
|
||||
template <typename RandomIt, typename Compare>
|
||||
void partial_sort(RandomIt first, RandomIt middle, RandomIt last, Compare compare)
|
||||
{
|
||||
::miniselect::floyd_rivest_partial_sort(first, middle, last, compare);
|
||||
#ifndef NDEBUG
|
||||
::shuffle(first, last);
|
||||
#endif
|
||||
|
||||
ComparatorWrapper<Compare> compare_wrapper = compare;
|
||||
::miniselect::floyd_rivest_partial_sort(first, middle, last, compare_wrapper);
|
||||
|
||||
#ifndef NDEBUG
|
||||
::shuffle(middle, last);
|
||||
#endif
|
||||
}
|
||||
|
||||
template <typename RandomIt>
|
||||
void partial_sort(RandomIt first, RandomIt middle, RandomIt last)
|
||||
{
|
||||
using value_type = typename std::iterator_traits<RandomIt>::value_type;
|
||||
using comparator = std::less<value_type>;
|
||||
|
||||
::partial_sort(first, middle, last, comparator());
|
||||
}
|
||||
|
||||
#pragma GCC diagnostic pop
|
||||
@ -30,7 +116,12 @@ void partial_sort(RandomIt first, RandomIt middle, RandomIt last, Compare compar
|
||||
template <typename RandomIt, typename Compare>
|
||||
void sort(RandomIt first, RandomIt last, Compare compare)
|
||||
{
|
||||
::pdqsort(first, last, compare);
|
||||
#ifndef NDEBUG
|
||||
::shuffle(first, last);
|
||||
#endif
|
||||
|
||||
ComparatorWrapper<Compare> compare_wrapper = compare;
|
||||
::pdqsort(first, last, compare_wrapper);
|
||||
}
|
||||
|
||||
template <typename RandomIt>
|
||||
@ -38,5 +129,5 @@ void sort(RandomIt first, RandomIt last)
|
||||
{
|
||||
using value_type = typename std::iterator_traits<RandomIt>::value_type;
|
||||
using comparator = std::less<value_type>;
|
||||
::pdqsort(first, last, comparator());
|
||||
::sort(first, last, comparator());
|
||||
}
|
||||
|
@ -33,7 +33,7 @@ select s.*, j.* from (select * from X) as s right join (select * from Y) as j on
|
||||
select 'full';
|
||||
select X.*, Y.* from X full join Y on X.id = Y.id order by X.id, X.x_a, X.x_b, Y.id, Y.y_a, Y.y_b;
|
||||
select 'full subs';
|
||||
select s.*, j.* from (select * from X) as s full join (select * from Y) as j on s.id = j.id order by s.id, s.x_a;
|
||||
select s.*, j.* from (select * from X) as s full join (select * from Y) as j on s.id = j.id order by s.id, s.x_a, s.x_b, j.id, j.y_a, j.y_b;
|
||||
--select 'full expr';
|
||||
--select X.*, Y.* from X full join Y on (X.id + 1) = (Y.id + 1) order by id;
|
||||
|
||||
@ -48,14 +48,14 @@ select 'self inner nullable vs not nullable 2';
|
||||
select Y.*, s.* from Y inner join (select * from Y) as s on concat('n', Y.y_a) = s.y_b order by Y.id, Y.y_a, Y.y_b, s.id, s.y_a, s.y_b;
|
||||
|
||||
select 'self left';
|
||||
select X.*, s.* from X left join (select * from X) as s on X.id = s.id order by X.id, X.x_a, s.x_a;
|
||||
select X.*, s.* from X left join (select * from X) as s on X.id = s.id order by X.id, X.x_a, X.x_b, s.id, s.x_a, s.x_b;
|
||||
select 'self left nullable';
|
||||
select X.*, s.* from X left join (select * from X) as s on X.x_b = s.x_b order by X.id, X.x_a;
|
||||
select X.*, s.* from X left join (select * from X) as s on X.x_b = s.x_b order by X.id, X.x_a, X.x_b, s.id, s.x_a, s.x_b;
|
||||
select 'self left nullable vs not nullable';
|
||||
select X.*, s.* from X left join (select * from X) as s on X.id = s.x_b order by X.id, X.x_a;
|
||||
select X.*, s.* from X left join (select * from X) as s on X.id = s.x_b order by X.id, X.x_a, X.x_b, s.id, s.x_a, s.x_b;
|
||||
-- TODO: s.y_b == '' instead of NULL
|
||||
select 'self left nullable vs not nullable 2';
|
||||
select Y.*, s.* from Y left join (select * from Y) as s on concat('n', Y.y_a) = s.y_b order by Y.id, Y.y_a;
|
||||
select Y.*, s.* from Y left join (select * from Y) as s on concat('n', Y.y_a) = s.y_b order by Y.id, Y.y_a, Y.y_b, s.id, s.y_a, s.y_b;
|
||||
|
||||
select 'self right';
|
||||
select X.*, s.* from X right join (select * from X) as s on X.id = s.id order by X.id, X.x_a, X.x_b, s.id, s.x_a, s.x_b;
|
||||
|
@ -23,7 +23,7 @@ select 'right subs';
|
||||
select s.*, j.* from (select * from X) as s right join (select * from Y) as j using id order by s.id, j.id, s.x_name, j.y_name;
|
||||
|
||||
select 'full';
|
||||
select X.*, Y.* from X full join Y using id order by X.id, Y.id;
|
||||
select X.*, Y.* from X full join Y using id order by X.id, Y.id, X.x_name, Y.y_name;
|
||||
select 'full subs';
|
||||
select s.*, j.* from (select * from X) as s full join (select * from Y) as j using id order by s.id, j.id, s.x_name, j.y_name;
|
||||
|
||||
|
@ -30,7 +30,6 @@ $CLICKHOUSE_CLIENT $settings -q "$touching_many_parts_query" &> /dev/null
|
||||
|
||||
$CLICKHOUSE_CLIENT $settings -q "SYSTEM FLUSH LOGS"
|
||||
|
||||
|
||||
$CLICKHOUSE_CLIENT $settings -q "SELECT ProfileEvents['FileOpen'] FROM system.query_log WHERE query='$touching_many_parts_query' and current_database = currentDatabase() ORDER BY event_time DESC LIMIT 1;"
|
||||
$CLICKHOUSE_CLIENT $settings -q "SELECT ProfileEvents['FileOpen'] as opened_files FROM system.query_log WHERE query='$touching_many_parts_query' and current_database = currentDatabase() ORDER BY event_time DESC, opened_files DESC LIMIT 1;"
|
||||
|
||||
$CLICKHOUSE_CLIENT $settings -q "DROP TABLE IF EXISTS merge_tree_table;"
|
||||
|
@ -37,5 +37,5 @@ $CLICKHOUSE_CLIENT --query="""
|
||||
('upyachka', 'a'), ('test', 'b'), ('foo', 'c'),
|
||||
('bar', 'd'))
|
||||
ORDER BY Payload LIMIT 1 BY Phrase
|
||||
) ORDER BY Payload, Payload
|
||||
) ORDER BY Payload, Phrase
|
||||
"""
|
||||
|
@ -10,16 +10,16 @@ INSERT INTO t2 (x, s) VALUES (2, 'b1'), (2, 'b2'), (4, 'b3'), (4, 'b4'), (4, 'b5
|
||||
SET join_use_nulls = 0;
|
||||
|
||||
SELECT 'semi left';
|
||||
SELECT t1.*, t2.* FROM t1 SEMI LEFT JOIN t2 USING(x) ORDER BY t1.x, t2.x;
|
||||
SELECT t1.*, t2.* FROM t1 SEMI LEFT JOIN t2 USING(x) ORDER BY t1.x, t2.x, t1.s, t2.s;
|
||||
|
||||
SELECT 'semi right';
|
||||
SELECT t1.*, t2.* FROM t1 SEMI RIGHT JOIN t2 USING(x) ORDER BY t1.x, t2.x;
|
||||
SELECT t1.*, t2.* FROM t1 SEMI RIGHT JOIN t2 USING(x) ORDER BY t1.x, t2.x, t1.s, t2.s;
|
||||
|
||||
SELECT 'anti left';
|
||||
SELECT t1.*, t2.* FROM t1 ANTI LEFT JOIN t2 USING(x) ORDER BY t1.x, t2.x;
|
||||
SELECT t1.*, t2.* FROM t1 ANTI LEFT JOIN t2 USING(x) ORDER BY t1.x, t2.x, t1.s, t2.s;
|
||||
|
||||
SELECT 'anti right';
|
||||
SELECT t1.*, t2.* FROM t1 ANTI RIGHT JOIN t2 USING(x) ORDER BY t1.x, t2.x;
|
||||
SELECT t1.*, t2.* FROM t1 ANTI RIGHT JOIN t2 USING(x) ORDER BY t1.x, t2.x, t1.s, t2.s;
|
||||
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t2;
|
||||
|
@ -17,7 +17,7 @@ ${CLICKHOUSE_CLIENT} --query "select count() > 1 as ok from (select * from odbc(
|
||||
${CLICKHOUSE_CLIENT} --query "CREATE TABLE t (x UInt8, y Float32, z String) ENGINE = Memory"
|
||||
${CLICKHOUSE_CLIENT} --query "INSERT INTO t VALUES (1,0.1,'a я'),(2,0.2,'b ą'),(3,0.3,'c d')"
|
||||
|
||||
${CLICKHOUSE_CLIENT} --query "SELECT * FROM odbc('DSN={ClickHouse DSN (ANSI)}','$CLICKHOUSE_DATABASE','t') ORDER BY x"
|
||||
${CLICKHOUSE_CLIENT} --query "SELECT * FROM odbc('DSN={ClickHouse DSN (Unicode)}','$CLICKHOUSE_DATABASE','t') ORDER BY x"
|
||||
${CLICKHOUSE_CLIENT} --query "SELECT x, y, z FROM odbc('DSN={ClickHouse DSN (ANSI)}','$CLICKHOUSE_DATABASE','t') ORDER BY x"
|
||||
${CLICKHOUSE_CLIENT} --query "SELECT x, y, z FROM odbc('DSN={ClickHouse DSN (Unicode)}','$CLICKHOUSE_DATABASE','t') ORDER BY x"
|
||||
|
||||
${CLICKHOUSE_CLIENT} --query "DROP TABLE t"
|
||||
|
@ -3,6 +3,6 @@ SELECT number FROM numbers(10) ORDER BY number DESC OFFSET 2 ROWS FETCH NEXT 3 R
|
||||
DROP TABLE IF EXISTS test_fetch;
|
||||
CREATE TABLE test_fetch(a Int32, b Int32) Engine = Memory;
|
||||
INSERT INTO test_fetch VALUES(1, 1), (2, 1), (3, 4), (3, 3), (5, 4), (0, 6), (5, 7);
|
||||
SELECT * FROM test_fetch ORDER BY a OFFSET 1 ROW FETCH FIRST 3 ROWS ONLY;
|
||||
SELECT * FROM (SELECT * FROM test_fetch ORDER BY a, b OFFSET 1 ROW FETCH FIRST 3 ROWS ONLY) ORDER BY a, b;
|
||||
SELECT * FROM (SELECT * FROM test_fetch ORDER BY a OFFSET 1 ROW FETCH FIRST 3 ROWS WITH TIES) ORDER BY a, b;
|
||||
DROP TABLE test_fetch;
|
||||
|
@ -12,19 +12,19 @@ INSERT INTO collate_test1 VALUES (1, (1, 'Ё')), (1, (1, 'ё')), (1, (1, 'а')),
|
||||
INSERT INTO collate_test2 VALUES (1, (1, 'Ё')), (1, (1, 'ё')), (1, (1, 'а')), (2, (2, 'А')), (2, (1, 'я')), (2, (2, 'Я')), (1, (2, null)), (1, (3, 'я')), (1, (1, null)), (2, (2, null));
|
||||
INSERT INTO collate_test3 VALUES (1, (1, (1, ['Ё']))), (1, (2, (1, ['ё']))), (1, (1, (2, ['а']))), (2, (1, (1, ['А']))), (2, (2, (1, ['я']))), (2, (1, (1, ['Я']))), (1, (2, (1, ['ё','а']))), (1, (1, (2, ['ё', 'я']))), (2, (1, (1, ['ё', 'а', 'а'])));
|
||||
|
||||
SELECT * FROM collate_test1 ORDER BY s COLLATE 'ru';
|
||||
SELECT * FROM collate_test1 ORDER BY s COLLATE 'ru', x;
|
||||
SELECT '';
|
||||
|
||||
SELECT * FROM collate_test1 ORDER BY x, s COLLATE 'ru';
|
||||
SELECT '';
|
||||
|
||||
SELECT * FROM collate_test2 ORDER BY s COLLATE 'ru';
|
||||
SELECT * FROM collate_test2 ORDER BY s COLLATE 'ru', x;
|
||||
SELECT '';
|
||||
|
||||
SELECT * FROM collate_test2 ORDER BY x, s COLLATE 'ru';
|
||||
SELECT '';
|
||||
|
||||
SELECT * FROM collate_test3 ORDER BY s COLLATE 'ru';
|
||||
SELECT * FROM collate_test3 ORDER BY s COLLATE 'ru', x;
|
||||
SELECT '';
|
||||
|
||||
SELECT * FROM collate_test3 ORDER BY x, s COLLATE 'ru';
|
||||
|
@ -39,7 +39,7 @@ select number, avg(number) over (order by number rows unbounded preceding) from
|
||||
8 4
|
||||
9 4.5
|
||||
-- no order by
|
||||
select number, quantileExact(number) over (partition by intDiv(number, 3) AS value order by value rows unbounded preceding) from numbers(10);
|
||||
select number, quantileExact(number) over (partition by intDiv(number, 3) AS value order by number rows unbounded preceding) from numbers(10);
|
||||
0 0
|
||||
1 1
|
||||
2 1
|
||||
@ -51,7 +51,7 @@ select number, quantileExact(number) over (partition by intDiv(number, 3) AS val
|
||||
8 7
|
||||
9 9
|
||||
-- can add an alias after window spec
|
||||
select number, quantileExact(number) over (partition by intDiv(number, 3) AS value order by value rows unbounded preceding) q from numbers(10);
|
||||
select number, quantileExact(number) over (partition by intDiv(number, 3) AS value order by number rows unbounded preceding) q from numbers(10);
|
||||
0 0
|
||||
1 1
|
||||
2 1
|
||||
@ -198,7 +198,7 @@ select sum(number) over w1, sum(number) over w2
|
||||
from numbers(10)
|
||||
window
|
||||
w1 as (rows unbounded preceding),
|
||||
w2 as (partition by intDiv(number, 3) as value order by value rows unbounded preceding)
|
||||
w2 as (partition by intDiv(number, 3) as value order by number rows unbounded preceding)
|
||||
;
|
||||
0 0
|
||||
1 1
|
||||
@ -214,7 +214,7 @@ window
|
||||
-- EXPLAIN test for this.
|
||||
select
|
||||
sum(number) over w1,
|
||||
sum(number) over (partition by intDiv(number, 3) as value order by value rows unbounded preceding)
|
||||
sum(number) over (partition by intDiv(number, 3) as value order by number rows unbounded preceding)
|
||||
from numbers(10)
|
||||
window
|
||||
w1 as (partition by intDiv(number, 3) rows unbounded preceding)
|
||||
@ -240,118 +240,118 @@ select sum(number) over () from numbers(3);
|
||||
-- interesting corner cases.
|
||||
select number, intDiv(number, 3) p, mod(number, 2) o, count(number) over w as c
|
||||
from numbers(31)
|
||||
window w as (partition by p order by o range unbounded preceding)
|
||||
window w as (partition by p order by o, number range unbounded preceding)
|
||||
order by number
|
||||
settings max_block_size = 5
|
||||
;
|
||||
0 0 0 2
|
||||
0 0 0 1
|
||||
1 0 1 3
|
||||
2 0 0 2
|
||||
3 1 1 3
|
||||
3 1 1 2
|
||||
4 1 0 1
|
||||
5 1 1 3
|
||||
6 2 0 2
|
||||
6 2 0 1
|
||||
7 2 1 3
|
||||
8 2 0 2
|
||||
9 3 1 3
|
||||
9 3 1 2
|
||||
10 3 0 1
|
||||
11 3 1 3
|
||||
12 4 0 2
|
||||
12 4 0 1
|
||||
13 4 1 3
|
||||
14 4 0 2
|
||||
15 5 1 3
|
||||
15 5 1 2
|
||||
16 5 0 1
|
||||
17 5 1 3
|
||||
18 6 0 2
|
||||
18 6 0 1
|
||||
19 6 1 3
|
||||
20 6 0 2
|
||||
21 7 1 3
|
||||
21 7 1 2
|
||||
22 7 0 1
|
||||
23 7 1 3
|
||||
24 8 0 2
|
||||
24 8 0 1
|
||||
25 8 1 3
|
||||
26 8 0 2
|
||||
27 9 1 3
|
||||
27 9 1 2
|
||||
28 9 0 1
|
||||
29 9 1 3
|
||||
30 10 0 1
|
||||
select number, intDiv(number, 5) p, mod(number, 3) o, count(number) over w as c
|
||||
from numbers(31)
|
||||
window w as (partition by p order by o range unbounded preceding)
|
||||
window w as (partition by p order by o, number range unbounded preceding)
|
||||
order by number
|
||||
settings max_block_size = 2
|
||||
;
|
||||
0 0 0 2
|
||||
1 0 1 4
|
||||
0 0 0 1
|
||||
1 0 1 3
|
||||
2 0 2 5
|
||||
3 0 0 2
|
||||
4 0 1 4
|
||||
5 1 2 5
|
||||
6 1 0 2
|
||||
5 1 2 4
|
||||
6 1 0 1
|
||||
7 1 1 3
|
||||
8 1 2 5
|
||||
9 1 0 2
|
||||
10 2 1 3
|
||||
11 2 2 5
|
||||
10 2 1 2
|
||||
11 2 2 4
|
||||
12 2 0 1
|
||||
13 2 1 3
|
||||
14 2 2 5
|
||||
15 3 0 2
|
||||
16 3 1 4
|
||||
15 3 0 1
|
||||
16 3 1 3
|
||||
17 3 2 5
|
||||
18 3 0 2
|
||||
19 3 1 4
|
||||
20 4 2 5
|
||||
21 4 0 2
|
||||
20 4 2 4
|
||||
21 4 0 1
|
||||
22 4 1 3
|
||||
23 4 2 5
|
||||
24 4 0 2
|
||||
25 5 1 3
|
||||
26 5 2 5
|
||||
25 5 1 2
|
||||
26 5 2 4
|
||||
27 5 0 1
|
||||
28 5 1 3
|
||||
29 5 2 5
|
||||
30 6 0 1
|
||||
select number, intDiv(number, 5) p, mod(number, 2) o, count(number) over w as c
|
||||
from numbers(31)
|
||||
window w as (partition by p order by o range unbounded preceding)
|
||||
window w as (partition by p order by o, number range unbounded preceding)
|
||||
order by number
|
||||
settings max_block_size = 3
|
||||
;
|
||||
0 0 0 3
|
||||
1 0 1 5
|
||||
2 0 0 3
|
||||
0 0 0 1
|
||||
1 0 1 4
|
||||
2 0 0 2
|
||||
3 0 1 5
|
||||
4 0 0 3
|
||||
5 1 1 5
|
||||
6 1 0 2
|
||||
7 1 1 5
|
||||
5 1 1 3
|
||||
6 1 0 1
|
||||
7 1 1 4
|
||||
8 1 0 2
|
||||
9 1 1 5
|
||||
10 2 0 3
|
||||
11 2 1 5
|
||||
12 2 0 3
|
||||
10 2 0 1
|
||||
11 2 1 4
|
||||
12 2 0 2
|
||||
13 2 1 5
|
||||
14 2 0 3
|
||||
15 3 1 5
|
||||
16 3 0 2
|
||||
17 3 1 5
|
||||
15 3 1 3
|
||||
16 3 0 1
|
||||
17 3 1 4
|
||||
18 3 0 2
|
||||
19 3 1 5
|
||||
20 4 0 3
|
||||
21 4 1 5
|
||||
22 4 0 3
|
||||
20 4 0 1
|
||||
21 4 1 4
|
||||
22 4 0 2
|
||||
23 4 1 5
|
||||
24 4 0 3
|
||||
25 5 1 5
|
||||
26 5 0 2
|
||||
27 5 1 5
|
||||
25 5 1 3
|
||||
26 5 0 1
|
||||
27 5 1 4
|
||||
28 5 0 2
|
||||
29 5 1 5
|
||||
30 6 0 1
|
||||
select number, intDiv(number, 3) p, mod(number, 5) o, count(number) over w as c
|
||||
from numbers(31)
|
||||
window w as (partition by p order by o range unbounded preceding)
|
||||
window w as (partition by p order by o, number range unbounded preceding)
|
||||
order by number
|
||||
settings max_block_size = 2
|
||||
;
|
||||
@ -388,7 +388,7 @@ settings max_block_size = 2
|
||||
30 10 0 1
|
||||
select number, intDiv(number, 2) p, mod(number, 5) o, count(number) over w as c
|
||||
from numbers(31)
|
||||
window w as (partition by p order by o range unbounded preceding)
|
||||
window w as (partition by p order by o, number range unbounded preceding)
|
||||
order by number
|
||||
settings max_block_size = 3
|
||||
;
|
||||
@ -975,39 +975,39 @@ select number, p, o,
|
||||
row_number() over w
|
||||
from (select number, intDiv(number, 5) p, mod(number, 3) o
|
||||
from numbers(31) order by o, number) t
|
||||
window w as (partition by p order by o)
|
||||
window w as (partition by p order by o, number)
|
||||
order by p, o, number
|
||||
settings max_block_size = 2;
|
||||
0 0 0 2 1 1 1
|
||||
3 0 0 2 1 1 2
|
||||
1 0 1 4 3 2 3
|
||||
4 0 1 4 3 2 4
|
||||
2 0 2 5 5 3 5
|
||||
6 1 0 2 1 1 1
|
||||
9 1 0 2 1 1 2
|
||||
7 1 1 3 3 2 3
|
||||
5 1 2 5 4 3 4
|
||||
8 1 2 5 4 3 5
|
||||
0 0 0 1 1 1 1
|
||||
3 0 0 2 2 2 2
|
||||
1 0 1 3 3 3 3
|
||||
4 0 1 4 4 4 4
|
||||
2 0 2 5 5 5 5
|
||||
6 1 0 1 1 1 1
|
||||
9 1 0 2 2 2 2
|
||||
7 1 1 3 3 3 3
|
||||
5 1 2 4 4 4 4
|
||||
8 1 2 5 5 5 5
|
||||
12 2 0 1 1 1 1
|
||||
10 2 1 3 2 2 2
|
||||
13 2 1 3 2 2 3
|
||||
11 2 2 5 4 3 4
|
||||
14 2 2 5 4 3 5
|
||||
15 3 0 2 1 1 2
|
||||
18 3 0 2 1 1 1
|
||||
16 3 1 4 3 2 3
|
||||
19 3 1 4 3 2 4
|
||||
17 3 2 5 5 3 5
|
||||
21 4 0 2 1 1 1
|
||||
24 4 0 2 1 1 2
|
||||
22 4 1 3 3 2 3
|
||||
20 4 2 5 4 3 5
|
||||
23 4 2 5 4 3 4
|
||||
10 2 1 2 2 2 2
|
||||
13 2 1 3 3 3 3
|
||||
11 2 2 4 4 4 4
|
||||
14 2 2 5 5 5 5
|
||||
15 3 0 1 1 1 1
|
||||
18 3 0 2 2 2 2
|
||||
16 3 1 3 3 3 3
|
||||
19 3 1 4 4 4 4
|
||||
17 3 2 5 5 5 5
|
||||
21 4 0 1 1 1 1
|
||||
24 4 0 2 2 2 2
|
||||
22 4 1 3 3 3 3
|
||||
20 4 2 4 4 4 4
|
||||
23 4 2 5 5 5 5
|
||||
27 5 0 1 1 1 1
|
||||
25 5 1 3 2 2 2
|
||||
28 5 1 3 2 2 3
|
||||
26 5 2 5 4 3 4
|
||||
29 5 2 5 4 3 5
|
||||
25 5 1 2 2 2 2
|
||||
28 5 1 3 3 3 3
|
||||
26 5 2 4 4 4 4
|
||||
29 5 2 5 5 5 5
|
||||
30 6 0 1 1 1 1
|
||||
-- our replacement for lag/lead
|
||||
select
|
||||
@ -1153,7 +1153,7 @@ select count() over () where null;
|
||||
select number, count() over (w1 rows unbounded preceding) from numbers(10)
|
||||
window
|
||||
w0 as (partition by intDiv(number, 5) as p),
|
||||
w1 as (w0 order by mod(number, 3) as o)
|
||||
w1 as (w0 order by mod(number, 3) as o, number)
|
||||
order by p, o, number
|
||||
;
|
||||
0 1
|
||||
|
@ -13,10 +13,10 @@ select number, abs(number) over (partition by toString(intDiv(number, 3)) rows u
|
||||
select number, avg(number) over (order by number rows unbounded preceding) from numbers(10);
|
||||
|
||||
-- no order by
|
||||
select number, quantileExact(number) over (partition by intDiv(number, 3) AS value order by value rows unbounded preceding) from numbers(10);
|
||||
select number, quantileExact(number) over (partition by intDiv(number, 3) AS value order by number rows unbounded preceding) from numbers(10);
|
||||
|
||||
-- can add an alias after window spec
|
||||
select number, quantileExact(number) over (partition by intDiv(number, 3) AS value order by value rows unbounded preceding) q from numbers(10);
|
||||
select number, quantileExact(number) over (partition by intDiv(number, 3) AS value order by number rows unbounded preceding) q from numbers(10);
|
||||
|
||||
-- can't reference it yet -- the window functions are calculated at the
|
||||
-- last stage of select, after all other functions.
|
||||
@ -81,14 +81,14 @@ select sum(number) over w1, sum(number) over w2
|
||||
from numbers(10)
|
||||
window
|
||||
w1 as (rows unbounded preceding),
|
||||
w2 as (partition by intDiv(number, 3) as value order by value rows unbounded preceding)
|
||||
w2 as (partition by intDiv(number, 3) as value order by number rows unbounded preceding)
|
||||
;
|
||||
|
||||
-- FIXME both functions should use the same window, but they don't. Add an
|
||||
-- EXPLAIN test for this.
|
||||
select
|
||||
sum(number) over w1,
|
||||
sum(number) over (partition by intDiv(number, 3) as value order by value rows unbounded preceding)
|
||||
sum(number) over (partition by intDiv(number, 3) as value order by number rows unbounded preceding)
|
||||
from numbers(10)
|
||||
window
|
||||
w1 as (partition by intDiv(number, 3) rows unbounded preceding)
|
||||
@ -103,35 +103,35 @@ select sum(number) over () from numbers(3);
|
||||
-- interesting corner cases.
|
||||
select number, intDiv(number, 3) p, mod(number, 2) o, count(number) over w as c
|
||||
from numbers(31)
|
||||
window w as (partition by p order by o range unbounded preceding)
|
||||
window w as (partition by p order by o, number range unbounded preceding)
|
||||
order by number
|
||||
settings max_block_size = 5
|
||||
;
|
||||
|
||||
select number, intDiv(number, 5) p, mod(number, 3) o, count(number) over w as c
|
||||
from numbers(31)
|
||||
window w as (partition by p order by o range unbounded preceding)
|
||||
window w as (partition by p order by o, number range unbounded preceding)
|
||||
order by number
|
||||
settings max_block_size = 2
|
||||
;
|
||||
|
||||
select number, intDiv(number, 5) p, mod(number, 2) o, count(number) over w as c
|
||||
from numbers(31)
|
||||
window w as (partition by p order by o range unbounded preceding)
|
||||
window w as (partition by p order by o, number range unbounded preceding)
|
||||
order by number
|
||||
settings max_block_size = 3
|
||||
;
|
||||
|
||||
select number, intDiv(number, 3) p, mod(number, 5) o, count(number) over w as c
|
||||
from numbers(31)
|
||||
window w as (partition by p order by o range unbounded preceding)
|
||||
window w as (partition by p order by o, number range unbounded preceding)
|
||||
order by number
|
||||
settings max_block_size = 2
|
||||
;
|
||||
|
||||
select number, intDiv(number, 2) p, mod(number, 5) o, count(number) over w as c
|
||||
from numbers(31)
|
||||
window w as (partition by p order by o range unbounded preceding)
|
||||
window w as (partition by p order by o, number range unbounded preceding)
|
||||
order by number
|
||||
settings max_block_size = 3
|
||||
;
|
||||
@ -349,7 +349,7 @@ select number, p, o,
|
||||
row_number() over w
|
||||
from (select number, intDiv(number, 5) p, mod(number, 3) o
|
||||
from numbers(31) order by o, number) t
|
||||
window w as (partition by p order by o)
|
||||
window w as (partition by p order by o, number)
|
||||
order by p, o, number
|
||||
settings max_block_size = 2;
|
||||
|
||||
@ -456,7 +456,7 @@ select count() over () where null;
|
||||
select number, count() over (w1 rows unbounded preceding) from numbers(10)
|
||||
window
|
||||
w0 as (partition by intDiv(number, 5) as p),
|
||||
w1 as (w0 order by mod(number, 3) as o)
|
||||
w1 as (w0 order by mod(number, 3) as o, number)
|
||||
order by p, o, number
|
||||
;
|
||||
|
||||
|
@ -36,7 +36,7 @@ SELECT
|
||||
price,
|
||||
rank() OVER (PARTITION BY group_name ORDER BY price) rank
|
||||
FROM products INNER JOIN product_groups USING (group_id)
|
||||
order by group_name, rank, price;
|
||||
order by group_name, rank, price, product_name;
|
||||
|
||||
select '---- Q3 ----';
|
||||
SELECT
|
||||
|
@ -37,7 +37,7 @@ FROM
|
||||
(
|
||||
SELECT *
|
||||
FROM neighbor_test
|
||||
ORDER BY val_string ASC
|
||||
ORDER BY val_string, rowNr
|
||||
)
|
||||
ORDER BY rowNr, val_string, str_m1, str_p1, val_low, low_m1, low_p1
|
||||
format PrettyCompact;
|
||||
|
@ -14,8 +14,8 @@ $CLICKHOUSE_CLIENT -q "select x + y, sum(x - y) as s from test_agg_proj group by
|
||||
$CLICKHOUSE_CLIENT -q "select (x + y) * 2, sum(x - y) * 2 as s from test_agg_proj group by x + y order by s desc limit 5 settings allow_experimental_projection_optimization=1"
|
||||
$CLICKHOUSE_CLIENT -q "select (x + y) * 2, sum(x - y) * 2 as s from test_agg_proj group by x + y order by s desc limit 5 settings allow_experimental_projection_optimization=1 format JSON" | grep "rows_read"
|
||||
|
||||
$CLICKHOUSE_CLIENT -q "select intDiv(x + y, 2), intDiv(x + y, 3), sum(x - y) as s from test_agg_proj group by intDiv(x + y, 2), intDiv(x + y, 3) order by s desc limit 5 settings allow_experimental_projection_optimization=1"
|
||||
$CLICKHOUSE_CLIENT -q "select intDiv(x + y, 2), intDiv(x + y, 3), sum(x - y) as s from test_agg_proj group by intDiv(x + y, 2), intDiv(x + y, 3) order by s desc limit 5 settings allow_experimental_projection_optimization=1 format JSON" | grep "rows_read"
|
||||
$CLICKHOUSE_CLIENT -q "select intDiv(x + y, 2) as v, intDiv(x + y, 3), sum(x - y) as s from test_agg_proj group by intDiv(x + y, 2), intDiv(x + y, 3) order by s desc, v limit 5 settings allow_experimental_projection_optimization=1"
|
||||
$CLICKHOUSE_CLIENT -q "select intDiv(x + y, 2) as v, intDiv(x + y, 3), sum(x - y) as s from test_agg_proj group by intDiv(x + y, 2), intDiv(x + y, 3) order by s desc, v limit 5 settings allow_experimental_projection_optimization=1 format JSON" | grep "rows_read"
|
||||
|
||||
$CLICKHOUSE_CLIENT -q "select x + y + 1, argMax(x, y) * sum(x - y) as s from test_agg_proj group by x + y + 1 order by s desc limit 5 settings allow_experimental_projection_optimization=1"
|
||||
$CLICKHOUSE_CLIENT -q "select x + y + 1, argMax(x, y) * sum(x - y) as s from test_agg_proj group by x + y + 1 order by s desc limit 5 settings allow_experimental_projection_optimization=1 format JSON" | grep "rows_read"
|
||||
|
@ -91,9 +91,9 @@ all_2_2_0 u Default
|
||||
======
|
||||
0 0 0
|
||||
0 0 0
|
||||
1 1 1
|
||||
1 0
|
||||
2 2 2
|
||||
1 1 1
|
||||
2 0
|
||||
======
|
||||
0 0 0
|
||||
0 0 0
|
||||
|
@ -81,7 +81,7 @@ INNER JOIN t_sparse_full USING(u) ORDER BY id, u, s LIMIT 5;
|
||||
SELECT '======';
|
||||
|
||||
SELECT id, u, s FROM (SELECT number * 2 AS u FROM numbers(10)) AS t1
|
||||
FULL JOIN t_sparse_full USING(u) ORDER BY id LIMIT 5;
|
||||
FULL JOIN t_sparse_full USING(u) ORDER BY id, u, s LIMIT 5;
|
||||
|
||||
SELECT '======';
|
||||
|
||||
|
@ -24,9 +24,9 @@ SET join_algorithm = 'partial_merge';
|
||||
SELECT '-- partial_merge --';
|
||||
|
||||
SELECT '--';
|
||||
SELECT t1.key, t1.key2 FROM t1 INNER ALL JOIN t2 ON t1.id == t2.id AND t2.key == t2.key2;
|
||||
SELECT t1.key, t1.key2 FROM t1 INNER ALL JOIN t2 ON t1.id == t2.id AND t2.key == t2.key2 ORDER BY t1.key, t1.key2;
|
||||
SELECT '--';
|
||||
SELECT t1.key, t1.key2 FROM t1 INNER ALL JOIN t2 ON t1.id == t2.id AND t2.key == t2.key2 AND t1.key == t1.key2;
|
||||
SELECT t1.key, t1.key2 FROM t1 INNER ALL JOIN t2 ON t1.id == t2.id AND t2.key == t2.key2 AND t1.key == t1.key2 ORDER BY t1.key, t1.key2;
|
||||
|
||||
SELECT '--';
|
||||
SELECT t1.key FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND t2.key == t2.key2 AND t1.key == t1.key2;
|
||||
|
Loading…
Reference in New Issue
Block a user