diff options
Diffstat (limited to 'sql')
-rw-r--r-- | sql/item_windowfunc.cc | 18 | ||||
-rw-r--r-- | sql/sql_window.cc | 6 |
2 files changed, 24 insertions, 0 deletions
diff --git a/sql/item_windowfunc.cc b/sql/item_windowfunc.cc index 051dc203ab9..d5e13054755 100644 --- a/sql/item_windowfunc.cc +++ b/sql/item_windowfunc.cc @@ -185,6 +185,21 @@ void Item_window_func::split_sum_func(THD *thd, Ref_ptr_array ref_pointer_array, window_func()->setup_caches(thd); } +bool Item_window_func::check_order_list() +{ + if (only_single_element_order_list()) + { + Item_result rtype= window_spec->order_list->first->item[0]->result_type(); + if (rtype != REAL_RESULT && rtype != INT_RESULT && + rtype != DECIMAL_RESULT) + { + // TODO(varun) please change the error name + my_error(ER_WRONG_TYPE_FOR_RANGE_FRAME, MYF(0),"percentile functions"); + return TRUE; + } + } + return FALSE; +} /* This must be called before attempting to compute the window function values. @@ -224,6 +239,9 @@ void Item_sum_percentile_disc::setup_window_func(THD *thd, Window_spec *window_s void Item_sum_percentile_cont::setup_window_func(THD *thd, Window_spec *window_spec) { order_item= window_spec->order_list->first->item[0]; + /* TODO(varun): need to discuss and finalise what type should we + return for percentile cont functions + */ //set_handler_by_cmp_type(order_item->result_type()); if (!(ceil_value= order_item->get_cache(thd))) return; diff --git a/sql/sql_window.cc b/sql/sql_window.cc index d1628c46e2a..08e93dfcce2 100644 --- a/sql/sql_window.cc +++ b/sql/sql_window.cc @@ -321,6 +321,12 @@ setup_windows(THD *thd, Ref_ptr_array ref_pointer_array, TABLE_LIST *tables, win_func_item->update_used_tables(); } + li.rewind(); + while((win_func_item= li++)) + { + if (win_func_item->check_order_list()) + DBUG_RETURN(1); + } DBUG_RETURN(0); } |