summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Babaev <igor@askmonty.org>2016-04-14 01:08:54 -0700
committerIgor Babaev <igor@askmonty.org>2016-04-14 01:08:54 -0700
commitbc6df8d6e0b3568a2cb15c37c6d5330a0d5254fa (patch)
tree9b6a9e516049b3902edece54432ff2edacf86cff
parent5ff4b21e02dee1879436ebb4a484f0d2e756acaf (diff)
parent31fb045c1296aba5b7ed95cf96843ddfb5b91ef9 (diff)
downloadmariadb-git-bc6df8d6e0b3568a2cb15c37c6d5330a0d5254fa.tar.gz
Merge branch 'bb-10.2-mdev9543' of github.com:MariaDB/server into bb-10.2-mdev9543
-rw-r--r--mysql-test/r/win_rank.result10
-rw-r--r--sql/item_windowfunc.cc5
-rw-r--r--sql/item_windowfunc.h22
3 files changed, 15 insertions, 22 deletions
diff --git a/mysql-test/r/win_rank.result b/mysql-test/r/win_rank.result
index 54f70147b1a..725683d3869 100644
--- a/mysql-test/r/win_rank.result
+++ b/mysql-test/r/win_rank.result
@@ -40,11 +40,11 @@ pk a b rank dense_rank
3 1 10 3 2
4 1 10 3 2
8 2 10 5 3
-5 2 20 1 0
-6 2 20 1 0
-7 2 20 1 0
-9 4 20 4 1
-10 4 20 4 1
+5 2 20 1 1
+6 2 20 1 1
+7 2 20 1 1
+9 4 20 4 2
+10 4 20 4 2
drop table t1;
#
# Test with null values in the table.
diff --git a/sql/item_windowfunc.cc b/sql/item_windowfunc.cc
index c8f398577b5..d157d545dad 100644
--- a/sql/item_windowfunc.cc
+++ b/sql/item_windowfunc.cc
@@ -185,8 +185,11 @@ void Item_sum_dense_rank::setup_window_func(THD *thd, Window_spec *window_spec)
bool Item_sum_dense_rank::add()
{
- if (peer_tracker.check_if_next_group())
+ if (peer_tracker.check_if_next_group() || first_add)
+ {
+ first_add= false;
dense_rank++;
+ }
return false;
}
diff --git a/sql/item_windowfunc.h b/sql/item_windowfunc.h
index 35fff511e5a..40f48cc7dc5 100644
--- a/sql/item_windowfunc.h
+++ b/sql/item_windowfunc.h
@@ -213,7 +213,9 @@ public:
class Item_sum_dense_rank: public Item_sum_int
{
longlong dense_rank;
+ bool first_add;
Group_bound_tracker peer_tracker;
+ public:
/*
XXX(cvicentiu) This class could potentially be implemented in the rank
class, with a switch for the DENSE case.
@@ -221,6 +223,7 @@ class Item_sum_dense_rank: public Item_sum_int
void clear()
{
dense_rank= 0;
+ first_add= true;
}
bool add();
void update_field() {}
@@ -229,9 +232,8 @@ class Item_sum_dense_rank: public Item_sum_int
return dense_rank;
}
- public:
Item_sum_dense_rank(THD *thd)
- : Item_sum_int(thd), dense_rank(0) {}
+ : Item_sum_int(thd), dense_rank(0), first_add(true) {}
enum Sumfunctype sum_func () const
{
return DENSE_RANK_FUNC;
@@ -427,7 +429,6 @@ class Item_sum_ntile : public Item_sum_window_with_row_count
public:
Item_sum_ntile(THD* thd, Item* num_quantiles_expr) :
Item_sum_window_with_row_count(thd, num_quantiles_expr),
- num_quantiles_expr_(num_quantiles_expr),
current_row_count_(0) {};
double val_real()
@@ -443,7 +444,7 @@ class Item_sum_ntile : public Item_sum_window_with_row_count
return 0;
}
- longlong num_quantiles= num_quantiles_expr_->val_int();
+ longlong num_quantiles= get_num_quantiles();
if (num_quantiles <= 0) {
my_error(ER_INVALID_NTILE_ARGUMENT, MYF(0));
@@ -487,19 +488,8 @@ class Item_sum_ntile : public Item_sum_window_with_row_count
enum Item_result result_type () const { return INT_RESULT; }
enum_field_types field_type() const { return MYSQL_TYPE_LONGLONG; }
- bool fix_fields(THD *thd, Item **ref)
- {
- if (Item_sum_window_with_row_count::fix_fields(thd, ref))
- return true;
- // TODO-cvicentiu is ref as a parameter here ok?
- if (!num_quantiles_expr_->fixed)
- num_quantiles_expr_->fix_fields(thd, ref);
-
- return false;
- }
-
private:
- Item* num_quantiles_expr_;
+ longlong get_num_quantiles() { return args[0]->val_int(); }
ulong current_row_count_;
};