Commit 0e9fb982 authored by Sergei Petrunia's avatar Sergei Petrunia

MDEV-9695: Wrong window frame when using RANGE BETWEEN N FOLLOWING AND PRECEDING

Part#1: Frame_n_rows::next_partition() should not assume that the
current table->record[0] points to the first row in the partition.

Since cursor supports move_to() operation, we dont need this.
parent 89383812
...@@ -658,3 +658,29 @@ part_id pk val CNT ...@@ -658,3 +658,29 @@ part_id pk val CNT
5678 207 3 9 5678 207 3 9
5678 208 3 9 5678 208 3 9
drop table t4; drop table t4;
#
# MDEV-9695: Wrong window frame when using RANGE BETWEEN N FOLLOWING AND PRECEDING
#
create table t1 (pk int, a int, b int);
insert into t1 values
( 1 , 0, 1),
( 2 , 0, 2),
( 3 , 1, 4),
( 4 , 1, 8),
( 5 , 2, 32),
( 6 , 2, 64),
( 7 , 2, 128),
( 8 , 2, 16);
select pk, a, b,
bit_or(b) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) as bit_or
from t1;
pk a b bit_or
1 0 1 3
2 0 2 3
3 1 4 12
4 1 8 12
5 2 32 96
6 2 64 224
7 2 128 208
8 2 16 144
drop table t1;
...@@ -422,3 +422,22 @@ from t4; ...@@ -422,3 +422,22 @@ from t4;
drop table t4; drop table t4;
--echo #
--echo # MDEV-9695: Wrong window frame when using RANGE BETWEEN N FOLLOWING AND PRECEDING
--echo #
create table t1 (pk int, a int, b int);
insert into t1 values
( 1 , 0, 1),
( 2 , 0, 2),
( 3 , 1, 4),
( 4 , 1, 8),
( 5 , 2, 32),
( 6 , 2, 64),
( 7 , 2, 128),
( 8 , 2, 16);
select pk, a, b,
bit_or(b) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) as bit_or
from t1;
drop table t1;
...@@ -650,16 +650,8 @@ public: ...@@ -650,16 +650,8 @@ public:
{ {
if (rownum != 0) if (rownum != 0)
{ {
/* /* The cursor in "ROWS n PRECEDING" lags behind by n_rows rows. */
The cursor in "ROWS n PRECEDING" lags behind by n_rows rows. cursor.move_to(rownum);
Catch up.
TODO: change this to be a jump forward.
*/
while (!(cursor_eof= (0 != cursor.get_next())))
{
if (bound_tracker.check_if_next_group())
break;
}
} }
n_rows_to_skip= n_rows - (is_top_bound? 0:1); n_rows_to_skip= n_rows - (is_top_bound? 0:1);
} }
...@@ -717,7 +709,7 @@ private: ...@@ -717,7 +709,7 @@ private:
{ {
if (!(cursor_eof= (0 != cursor.get_next()))) if (!(cursor_eof= (0 != cursor.get_next())))
{ {
bool new_group= bound_tracker.check_if_next_group(); bool new_group= is_preceding? false: bound_tracker.check_if_next_group();
if (at_partition_start || !new_group) if (at_partition_start || !new_group)
{ {
if (is_top_bound) // this is frame start endpoint if (is_top_bound) // this is frame start endpoint
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment