Commit b5c104d0 authored by Varun Gupta's avatar Varun Gupta

Changes made according to the review given, mostly fixing coding style errors

parent 24e219b1
CREATE TABLE student (name CHAR(10), test double, score DECIMAL(19,4));
INSERT INTO student VALUES
('Chun', 0, 3), ('Chun', 0, 7),
('Kaolin', 0.5, 3), ('Kaolin', 0.6, 7),
('Kaolin', 0.5, 4),
('Tatiana', 0.8, 4), ('Tata', 0.8, 4);
select name, percentile_disc(0.5) within group(order by score) over () from student;
name percentile_disc(0.5) within group(order by score) over ()
Chun 4.0000000000
Chun 4.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Tatiana 4.0000000000
Tata 4.0000000000
select name, percentile_cont(0.5) within group(order by score) over () from student;
name percentile_cont(0.5) within group(order by score) over ()
Chun 4.0000000000
Chun 4.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Tatiana 4.0000000000
Tata 4.0000000000
select name, percentile_cont(null) within group(order by score) over (partition by name) from student;
name percentile_cont(null) within group(order by score) over (partition by name)
Chun NULL
Chun NULL
Kaolin NULL
Kaolin NULL
Kaolin NULL
Tatiana NULL
Tata NULL
select name, percentile_disc(null) within group(order by score) over (partition by name) from student;
name percentile_disc(null) within group(order by score) over (partition by name)
Chun NULL
Chun NULL
Kaolin NULL
Kaolin NULL
Kaolin NULL
Tatiana NULL
Tata NULL
select name, percentile_cont(0.5) within group(order by score) over (partition by name) as c from student;
name c
Chun 5.0000000000
Chun 5.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Tatiana 4.0000000000
Tata 4.0000000000
select name, percentile_disc(0.5) within group(order by score) over (partition by name) as c from student;
name c
Chun 3.0000000000
Chun 3.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Tatiana 4.0000000000
Tata 4.0000000000
select * from ( select name , percentile_cont(0.5) within group ( order by score) over (partition by name ) from student ) as t;
name percentile_cont(0.5) within group ( order by score) over (partition by name )
Chun 5.0000000000
Chun 5.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Tatiana 4.0000000000
Tata 4.0000000000
select * from ( select name , percentile_disc(0.5) within group ( order by score) over (partition by name ) from student ) as t;
name percentile_disc(0.5) within group ( order by score) over (partition by name )
Chun 3.0000000000
Chun 3.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Tatiana 4.0000000000
Tata 4.0000000000
select name from student a where (select percentile_disc(0.5) within group (order by score) over (partition by name) from student b limit 1) >= 0.5;
name
Chun
Chun
Kaolin
Kaolin
Kaolin
Tatiana
Tata
select score, percentile_cont(0.5) within group(order by name) over (partition by score) from student;
ERROR HY000: Numeric datatype is required for Percentile_CONT function
select score, percentile_disc(0.5) within group(order by name) over (partition by score) from student;
score percentile_disc(0.5) within group(order by name) over (partition by score)
3.0000 Chun
7.0000 Chun
3.0000 Chun
7.0000 Chun
4.0000 Tata
4.0000 Tata
4.0000 Tata
select percentile_disc(0.5) within group(order by score,test) over (partition by name) from student;
ERROR HY000: Incorrect number of elements in the order list for 'percentile_disc'
select percentile_cont(0.5) within group(order by score,test) over (partition by name) from student;
ERROR HY000: Incorrect number of elements in the order list for 'percentile_cont'
select percentile_disc(1.5) within group(order by score) over (partition by name) from student;
ERROR HY000: Argument to the percentile functions does not belong to the range [0,1]
select percentile_cont(1.5) within group(order by score) over (partition by name) from student;
ERROR HY000: Argument to the percentile functions does not belong to the range [0,1]
select name,percentile_cont(test) within group(order by score) over (partition by name) from student;
ERROR HY000: Argument to the percentile functions is not a constant
select name, percentile_disc(test) within group(order by score) over (partition by name) from student;
ERROR HY000: Argument to the percentile functions is not a constant
drop table student;
CREATE TABLE student (name CHAR(10), test double, score DECIMAL(19,4));
INSERT INTO student VALUES
('Chun', 0, 3), ('Chun', 0, 7),
('Kaolin', 0.5, 3), ('Kaolin', 0.6, 7),
('Kaolin', 0.5, 4),
('Tatiana', 0.8, 4), ('Tata', 0.8, 4);
#no partition clause
select name, percentile_disc(0.5) within group(order by score) over () from student;
select name, percentile_cont(0.5) within group(order by score) over () from student;
# argument set to null
select name, percentile_cont(null) within group(order by score) over (partition by name) from student;
select name, percentile_disc(null) within group(order by score) over (partition by name) from student;
# complete query with partition column
select name, percentile_cont(0.5) within group(order by score) over (partition by name) as c from student;
select name, percentile_disc(0.5) within group(order by score) over (partition by name) as c from student;
#subqueries having percentile functions
select * from ( select name , percentile_cont(0.5) within group ( order by score) over (partition by name ) from student ) as t;
select * from ( select name , percentile_disc(0.5) within group ( order by score) over (partition by name ) from student ) as t;
select name from student a where (select percentile_disc(0.5) within group (order by score) over (partition by name) from student b limit 1) >= 0.5;
# WITH STORED PROCEDURES
#DISALLOWED FIELDS IN ORDER BY CLAUSE
--error ER_WRONG_TYPE_FOR_PERCENTILE_CONT
select score, percentile_cont(0.5) within group(order by name) over (partition by score) from student;
select score, percentile_disc(0.5) within group(order by name) over (partition by score) from student;
# error with 2 order by elements
--error ER_NOT_SINGLE_ELEMENT_ORDER_LIST
select percentile_disc(0.5) within group(order by score,test) over (partition by name) from student;
--error ER_NOT_SINGLE_ELEMENT_ORDER_LIST
select percentile_cont(0.5) within group(order by score,test) over (partition by name) from student;
#parameter value should be in the range of 0 to 1( NEED TO THINK A WAY FOR THIS)
--error ER_ARGUMENT_OUT_OF_RANGE
select percentile_disc(1.5) within group(order by score) over (partition by name) from student;
--error ER_ARGUMENT_OUT_OF_RANGE
select percentile_cont(1.5) within group(order by score) over (partition by name) from student;
--error ER_ARGUMENT_NOT_CONSTANT
select name,percentile_cont(test) within group(order by score) over (partition by name) from student;
--error ER_ARGUMENT_NOT_CONSTANT
select name, percentile_disc(test) within group(order by score) over (partition by name) from student;
#CHECK TYPE OF THE ARGUMENT, SHOULD BE ONLY NUMERICAL
#select name, percentile_cont(name) within group(order by score) over (partition by name) from student;
drop table student;
...@@ -5341,7 +5341,6 @@ class Cached_item_real :public Cached_item_item ...@@ -5341,7 +5341,6 @@ class Cached_item_real :public Cached_item_item
Cached_item_real(Item *item_par) :Cached_item_item(item_par),value(0.0) {} Cached_item_real(Item *item_par) :Cached_item_item(item_par),value(0.0) {}
bool cmp(void); bool cmp(void);
int cmp_read_only(); int cmp_read_only();
double get_value(){ return value;}
}; };
class Cached_item_int :public Cached_item_item class Cached_item_int :public Cached_item_item
...@@ -5351,7 +5350,6 @@ class Cached_item_int :public Cached_item_item ...@@ -5351,7 +5350,6 @@ class Cached_item_int :public Cached_item_item
Cached_item_int(Item *item_par) :Cached_item_item(item_par),value(0) {} Cached_item_int(Item *item_par) :Cached_item_item(item_par),value(0) {}
bool cmp(void); bool cmp(void);
int cmp_read_only(); int cmp_read_only();
longlong get_value(){ return value;}
}; };
...@@ -5362,7 +5360,6 @@ class Cached_item_decimal :public Cached_item_item ...@@ -5362,7 +5360,6 @@ class Cached_item_decimal :public Cached_item_item
Cached_item_decimal(Item *item_par); Cached_item_decimal(Item *item_par);
bool cmp(void); bool cmp(void);
int cmp_read_only(); int cmp_read_only();
my_decimal *get_value(){ return &value;};
}; };
class Cached_item_field :public Cached_item class Cached_item_field :public Cached_item
......
...@@ -757,14 +757,14 @@ class Item_sum_percentile_disc : public Item_sum_cume_dist, ...@@ -757,14 +757,14 @@ class Item_sum_percentile_disc : public Item_sum_cume_dist,
bool add() bool add()
{ {
Item *arg = get_arg(0); Item *arg= get_arg(0);
if (arg->is_null()) if (arg->is_null())
return false; return false;
if (first_call) if (first_call)
{ {
prev_value= arg->val_real(); prev_value= arg->val_real();
if (prev_value >1 || prev_value < 0) if (prev_value > 1 || prev_value < 0)
{ {
my_error(ER_ARGUMENT_OUT_OF_RANGE, MYF(0)); my_error(ER_ARGUMENT_OUT_OF_RANGE, MYF(0));
return true; return true;
...@@ -774,7 +774,7 @@ class Item_sum_percentile_disc : public Item_sum_cume_dist, ...@@ -774,7 +774,7 @@ class Item_sum_percentile_disc : public Item_sum_cume_dist,
double arg_val= arg->val_real(); double arg_val= arg->val_real();
if (prev_value != arg_val) if (prev_value != arg_val)
{ {
my_error(ER_ARGUMENT_NOT_CONSTANT, MYF(0)); my_error(ER_ARGUMENT_NOT_CONSTANT, MYF(0));
return true; return true;
...@@ -821,7 +821,7 @@ class Item_sum_percentile_disc : public Item_sum_cume_dist, ...@@ -821,7 +821,7 @@ class Item_sum_percentile_disc : public Item_sum_cume_dist,
void fix_length_and_dec() void fix_length_and_dec()
{ {
decimals = 10; // TODO-cvicentiu find out how many decimals the standard decimals = 5; // TODO-cvicentiu find out how many decimals the standard
// requires. // requires.
} }
...@@ -829,6 +829,7 @@ class Item_sum_percentile_disc : public Item_sum_cume_dist, ...@@ -829,6 +829,7 @@ class Item_sum_percentile_disc : public Item_sum_cume_dist,
{ return get_item_copy<Item_sum_percentile_disc>(thd, mem_root, this); } { return get_item_copy<Item_sum_percentile_disc>(thd, mem_root, this); }
void setup_window_func(THD *thd, Window_spec *window_spec); void setup_window_func(THD *thd, Window_spec *window_spec);
void setup_hybrid(THD *thd, Item *item); void setup_hybrid(THD *thd, Item *item);
bool fix_fields(THD *thd, Item **ref);
private: private:
Item_cache *value; Item_cache *value;
...@@ -876,7 +877,7 @@ class Item_sum_percentile_cont : public Item_sum_cume_dist, ...@@ -876,7 +877,7 @@ class Item_sum_percentile_cont : public Item_sum_cume_dist,
bool add() bool add()
{ {
Item *arg = get_arg(0); Item *arg= get_arg(0);
if (arg->is_null()) if (arg->is_null())
return false; return false;
...@@ -884,7 +885,7 @@ class Item_sum_percentile_cont : public Item_sum_cume_dist, ...@@ -884,7 +885,7 @@ class Item_sum_percentile_cont : public Item_sum_cume_dist,
{ {
first_call= false; first_call= false;
prev_value= arg->val_real(); prev_value= arg->val_real();
if (prev_value >1 || prev_value < 0) if (prev_value > 1 || prev_value < 0)
{ {
my_error(ER_ARGUMENT_OUT_OF_RANGE, MYF(0)); my_error(ER_ARGUMENT_OUT_OF_RANGE, MYF(0));
return true; return true;
...@@ -892,7 +893,7 @@ class Item_sum_percentile_cont : public Item_sum_cume_dist, ...@@ -892,7 +893,7 @@ class Item_sum_percentile_cont : public Item_sum_cume_dist,
} }
double arg_val= arg->val_real(); double arg_val= arg->val_real();
if (prev_value != arg_val) if (prev_value != arg_val)
{ {
my_error(ER_ARGUMENT_NOT_CONSTANT, MYF(0)); my_error(ER_ARGUMENT_NOT_CONSTANT, MYF(0));
return true; return true;
...@@ -950,7 +951,7 @@ class Item_sum_percentile_cont : public Item_sum_cume_dist, ...@@ -950,7 +951,7 @@ class Item_sum_percentile_cont : public Item_sum_cume_dist,
void fix_length_and_dec() void fix_length_and_dec()
{ {
decimals = 10; // TODO-cvicentiu find out how many decimals the standard decimals = 5; // TODO-cvicentiu find out how many decimals the standard
// requires. // requires.
} }
...@@ -958,6 +959,7 @@ class Item_sum_percentile_cont : public Item_sum_cume_dist, ...@@ -958,6 +959,7 @@ class Item_sum_percentile_cont : public Item_sum_cume_dist,
{ return get_item_copy<Item_sum_percentile_cont>(thd, mem_root, this); } { return get_item_copy<Item_sum_percentile_cont>(thd, mem_root, this); }
void setup_window_func(THD *thd, Window_spec *window_spec); void setup_window_func(THD *thd, Window_spec *window_spec);
void setup_hybrid(THD *thd, Item *item); void setup_hybrid(THD *thd, Item *item);
bool fix_fields(THD *thd, Item **ref);
private: private:
Item_cache *floor_value; Item_cache *floor_value;
......
...@@ -1743,7 +1743,17 @@ class Frame_unbounded_following_set_count : public Frame_unbounded_following ...@@ -1743,7 +1743,17 @@ class Frame_unbounded_following_set_count : public Frame_unbounded_following
/* Walk to the end of the partition, find how many rows there are. */ /* Walk to the end of the partition, find how many rows there are. */
while (!cursor.next()) while (!cursor.next())
num_rows_in_partition++; num_rows_in_partition++;
set_win_funcs_row_count(num_rows_in_partition);
}
ha_rows get_curr_rownum() const
{
return cursor.get_rownum();
}
protected:
void set_win_funcs_row_count(ha_rows num_rows_in_partition)
{
List_iterator_fast<Item_sum> it(sum_functions); List_iterator_fast<Item_sum> it(sum_functions);
Item_sum* item; Item_sum* item;
while ((item= it++)) while ((item= it++))
...@@ -1753,20 +1763,16 @@ class Frame_unbounded_following_set_count : public Frame_unbounded_following ...@@ -1753,20 +1763,16 @@ class Frame_unbounded_following_set_count : public Frame_unbounded_following
item_with_row_count->set_row_count(num_rows_in_partition); item_with_row_count->set_row_count(num_rows_in_partition);
} }
} }
ha_rows get_curr_rownum() const
{
return cursor.get_rownum();
}
}; };
class Frame_unbounded_following_set_count_special: public Frame_unbounded_following_set_count class Frame_unbounded_following_set_count_no_nulls:
public Frame_unbounded_following_set_count
{ {
public: public:
Frame_unbounded_following_set_count_special(THD *thd, Frame_unbounded_following_set_count_no_nulls(THD *thd,
SQL_I_List<ORDER> *partition_list, SQL_I_List<ORDER> *partition_list,
SQL_I_List<ORDER> *order_list, Item* arg) : SQL_I_List<ORDER> *order_list) :
Frame_unbounded_following_set_count(thd,partition_list, order_list) Frame_unbounded_following_set_count(thd,partition_list, order_list)
{ {
order_item= order_list->first->item[0]; order_item= order_list->first->item[0];
...@@ -1782,16 +1788,9 @@ class Frame_unbounded_following_set_count_special: public Frame_unbounded_follow ...@@ -1782,16 +1788,9 @@ class Frame_unbounded_following_set_count_special: public Frame_unbounded_follow
{ {
if (!order_item->is_null()) if (!order_item->is_null())
num_rows_in_partition++; num_rows_in_partition++;
}while (!cursor.next()); } while (!cursor.next());
List_iterator_fast<Item_sum> it(sum_functions); set_win_funcs_row_count(num_rows_in_partition);
Item_sum* item;
while ((item= it++))
{
Item_sum_window_with_row_count* item_with_row_count =
static_cast<Item_sum_window_with_row_count *>(item);
item_with_row_count->set_row_count(num_rows_in_partition);
}
} }
ha_rows get_curr_rownum() const ha_rows get_curr_rownum() const
...@@ -2614,9 +2613,9 @@ void get_window_functions_required_cursors( ...@@ -2614,9 +2613,9 @@ void get_window_functions_required_cursors(
{ {
if (item_win_func->only_single_element_order_list()) if (item_win_func->only_single_element_order_list())
{ {
fc= new Frame_unbounded_following_set_count_special(thd, fc= new Frame_unbounded_following_set_count_no_nulls(thd,
item_win_func->window_spec->partition_list, item_win_func->window_spec->partition_list,
item_win_func->window_spec->order_list, item_win_func->window_func()->get_arg(0)); item_win_func->window_spec->order_list);
} }
else else
{ {
......
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