Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
872c0b42
Commit
872c0b42
authored
Sep 21, 2016
by
Vicențiu Ciorbaru
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Allow first/last value functions to have frame definitions
Add a test case to check this behavior.
parent
74fa1064
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
12 additions
and
77 deletions
+12
-77
mysql-test/r/win_first_last_value.result
mysql-test/r/win_first_last_value.result
+0
-75
sql/item_windowfunc.h
sql/item_windowfunc.h
+10
-1
sql/sql_window.cc
sql/sql_window.cc
+2
-1
No files found.
mysql-test/r/win_first_last_value.result
deleted
100644 → 0
View file @
74fa1064
create table t1 (
pk int primary key,
a int,
b int,
c char(10),
d decimal(10, 3),
e real
);
insert into t1 values
( 1, 0, 1, 'one', 0.1, 0.001),
( 2, 0, 2, 'two', 0.2, 0.002),
( 3, 0, 3, 'three', 0.3, 0.003),
( 4, 1, 2, 'three', 0.4, 0.004),
( 5, 1, 1, 'two', 0.5, 0.005),
( 6, 1, 1, 'one', 0.6, 0.006),
( 7, 2, NULL, 'n_one', 0.5, 0.007),
( 8, 2, 1, 'n_two', NULL, 0.008),
( 9, 2, 2, NULL, 0.7, 0.009),
(10, 2, 0, 'n_four', 0.8, 0.010),
(11, 2, 10, NULL, 0.9, NULL);
select pk, first_value(pk) over (order by pk),
last_value(pk) over (order by pk)
from t1
order by pk desc;
pk first_value(pk) over (order by pk) last_value(pk) over (order by pk)
11 1 11
10 1 10
9 1 9
8 1 8
7 1 7
6 1 6
5 1 5
4 1 4
3 1 3
2 1 2
1 1 1
select pk,
first_value(pk) over (order by pk desc),
last_value(pk) over (order by pk desc)
from t1;
pk first_value(pk) over (order by pk desc) last_value(pk) over (order by pk desc)
1 11 1
2 11 2
3 11 3
4 11 4
5 11 5
6 11 6
7 11 7
8 11 8
9 11 9
10 11 10
11 11 11
select pk, a, b, c, d, e,
first_value(b) over (partition by a order by pk) as fst_b,
last_value(b) over (partition by a order by pk) as lst_b,
first_value(c) over (partition by a order by pk) as fst_c,
last_value(c) over (partition by a order by pk) as lst_c,
first_value(d) over (partition by a order by pk) as fst_d,
last_value(d) over (partition by a order by pk) as lst_d,
first_value(e) over (partition by a order by pk) as fst_e,
last_value(e) over (partition by a order by pk) as lst_e
from t1;
pk a b c d e fst_b lst_b fst_c lst_c fst_d lst_d fst_e lst_e
1 0 1 one 0.100 0.001 1 1 one one 0.100 0.100 0.001 0.001
2 0 2 two 0.200 0.002 1 2 one two 0.100 0.200 0.001 0.002
3 0 3 three 0.300 0.003 1 3 one three 0.100 0.300 0.001 0.003
4 1 2 three 0.400 0.004 2 2 three three 0.400 0.400 0.004 0.004
5 1 1 two 0.500 0.005 2 1 three two 0.400 0.500 0.004 0.005
6 1 1 one 0.600 0.006 2 1 three one 0.400 0.600 0.004 0.006
7 2 NULL n_one 0.500 0.007 NULL NULL n_one n_one 0.500 0.500 0.007 0.007
8 2 1 n_two NULL 0.008 NULL 1 n_one n_two 0.500 NULL 0.007 0.008
9 2 2 NULL 0.700 0.009 NULL 2 n_one NULL 0.500 0.700 0.007 0.009
10 2 0 n_four 0.800 0.01 NULL 0 n_one n_four 0.500 0.800 0.007 0.01
11 2 10 NULL 0.900 NULL NULL 10 n_one NULL 0.500 0.900 0.007 NULL
drop table t1;
sql/item_windowfunc.h
View file @
872c0b42
...
...
@@ -657,10 +657,19 @@ class Item_window_func : public Item_func_or_sum
case
Item_sum
:
:
PERCENT_RANK_FUNC
:
case
Item_sum
:
:
CUME_DIST_FUNC
:
case
Item_sum
:
:
NTILE_FUNC
:
return
true
;
default:
return
false
;
}
}
bool
requires_special_cursors
()
const
{
switch
(
window_func
()
->
sum_func
())
{
case
Item_sum
:
:
FIRST_VALUE_FUNC
:
case
Item_sum
:
:
LAST_VALUE_FUNC
:
return
true
;
default:
default:
return
false
;
}
}
...
...
sql/sql_window.cc
View file @
872c0b42
...
...
@@ -2147,7 +2147,8 @@ void get_window_functions_required_cursors(
functions can keep the default frame generating code, overwrite it or
add to it.
*/
if
(
item_win_func
->
is_frame_prohibited
())
if
(
item_win_func
->
is_frame_prohibited
()
||
item_win_func
->
requires_special_cursors
())
{
add_special_frame_cursors
(
thd
,
cursor_manager
,
item_win_func
);
cursor_managers
->
push_back
(
cursor_manager
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment