mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Fixed bug mdev-9923.
Partition and order lists of a window specification cannot use constant integer to refer to select list elements.
This commit is contained in:
@ -2472,3 +2472,28 @@ select sum(sum(id)) over (order by sum(id)) from t1;
|
|||||||
sum(sum(id)) over (order by sum(id))
|
sum(sum(id)) over (order by sum(id))
|
||||||
8
|
8
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
#
|
||||||
|
# MDEV-9923: integer constant in order by list
|
||||||
|
# of window specification
|
||||||
|
#
|
||||||
|
create table test.t1 (id int);
|
||||||
|
insert into test.t1 values (1), (2), (3), (2);
|
||||||
|
select rank() over (order by 1) from t1;
|
||||||
|
rank() over (order by 1)
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
select rank() over (order by 2) from t1;
|
||||||
|
rank() over (order by 2)
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
select rank() over (partition by id order by 2) from t1;
|
||||||
|
rank() over (partition by id order by 2)
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
drop table t1;
|
||||||
|
@ -1504,3 +1504,16 @@ select sum(sum(id)) over (order by sum(id)) from t1;
|
|||||||
|
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-9923: integer constant in order by list
|
||||||
|
--echo # of window specification
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
create table test.t1 (id int);
|
||||||
|
insert into test.t1 values (1), (2), (3), (2);
|
||||||
|
|
||||||
|
select rank() over (order by 1) from t1;
|
||||||
|
select rank() over (order by 2) from t1;
|
||||||
|
select rank() over (partition by id order by 2) from t1;
|
||||||
|
|
||||||
|
drop table t1;
|
||||||
|
@ -21917,7 +21917,7 @@ cp_buffer_from_ref(THD *thd, TABLE *table, TABLE_REF *ref)
|
|||||||
@param[in,out] all_fields All select, group and order by fields
|
@param[in,out] all_fields All select, group and order by fields
|
||||||
@param[in] is_group_field True if order is a GROUP field, false if
|
@param[in] is_group_field True if order is a GROUP field, false if
|
||||||
ORDER by field
|
ORDER by field
|
||||||
@param[in] search_in_all_fields If true then search in all_fields
|
@param[in] from_window_spec If true then order is from a window spec
|
||||||
|
|
||||||
@retval
|
@retval
|
||||||
FALSE if OK
|
FALSE if OK
|
||||||
@ -21928,7 +21928,7 @@ cp_buffer_from_ref(THD *thd, TABLE *table, TABLE_REF *ref)
|
|||||||
static bool
|
static bool
|
||||||
find_order_in_list(THD *thd, Ref_ptr_array ref_pointer_array, TABLE_LIST *tables,
|
find_order_in_list(THD *thd, Ref_ptr_array ref_pointer_array, TABLE_LIST *tables,
|
||||||
ORDER *order, List<Item> &fields, List<Item> &all_fields,
|
ORDER *order, List<Item> &fields, List<Item> &all_fields,
|
||||||
bool is_group_field, bool search_in_all_fields)
|
bool is_group_field, bool from_window_spec)
|
||||||
{
|
{
|
||||||
Item *order_item= *order->item; /* The item from the GROUP/ORDER caluse. */
|
Item *order_item= *order->item; /* The item from the GROUP/ORDER caluse. */
|
||||||
Item::Type order_item_type;
|
Item::Type order_item_type;
|
||||||
@ -21941,7 +21941,8 @@ find_order_in_list(THD *thd, Ref_ptr_array ref_pointer_array, TABLE_LIST *tables
|
|||||||
Local SP variables may be int but are expressions, not positions.
|
Local SP variables may be int but are expressions, not positions.
|
||||||
(And they can't be used before fix_fields is called for them).
|
(And they can't be used before fix_fields is called for them).
|
||||||
*/
|
*/
|
||||||
if (order_item->type() == Item::INT_ITEM && order_item->basic_const_item())
|
if (order_item->type() == Item::INT_ITEM && order_item->basic_const_item() &&
|
||||||
|
!from_window_spec)
|
||||||
{ /* Order by position */
|
{ /* Order by position */
|
||||||
uint count;
|
uint count;
|
||||||
if (order->counter_used)
|
if (order->counter_used)
|
||||||
@ -22033,7 +22034,7 @@ find_order_in_list(THD *thd, Ref_ptr_array ref_pointer_array, TABLE_LIST *tables
|
|||||||
thd->where);
|
thd->where);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (search_in_all_fields)
|
else if (from_window_spec)
|
||||||
{
|
{
|
||||||
Item **found_item= find_item_in_list(order_item, all_fields, &counter,
|
Item **found_item= find_item_in_list(order_item, all_fields, &counter,
|
||||||
REPORT_EXCEPT_NOT_FOUND, &resolution,
|
REPORT_EXCEPT_NOT_FOUND, &resolution,
|
||||||
@ -22093,14 +22094,14 @@ find_order_in_list(THD *thd, Ref_ptr_array ref_pointer_array, TABLE_LIST *tables
|
|||||||
|
|
||||||
int setup_order(THD *thd, Ref_ptr_array ref_pointer_array, TABLE_LIST *tables,
|
int setup_order(THD *thd, Ref_ptr_array ref_pointer_array, TABLE_LIST *tables,
|
||||||
List<Item> &fields, List<Item> &all_fields, ORDER *order,
|
List<Item> &fields, List<Item> &all_fields, ORDER *order,
|
||||||
bool search_in_all_fields)
|
bool from_window_spec)
|
||||||
{
|
{
|
||||||
enum_parsing_place parsing_place= thd->lex->current_select->parsing_place;
|
enum_parsing_place parsing_place= thd->lex->current_select->parsing_place;
|
||||||
thd->where="order clause";
|
thd->where="order clause";
|
||||||
for (; order; order=order->next)
|
for (; order; order=order->next)
|
||||||
{
|
{
|
||||||
if (find_order_in_list(thd, ref_pointer_array, tables, order, fields,
|
if (find_order_in_list(thd, ref_pointer_array, tables, order, fields,
|
||||||
all_fields, FALSE, search_in_all_fields))
|
all_fields, FALSE, from_window_spec))
|
||||||
return 1;
|
return 1;
|
||||||
if ((*order->item)->with_window_func && parsing_place != IN_ORDER_BY)
|
if ((*order->item)->with_window_func && parsing_place != IN_ORDER_BY)
|
||||||
{
|
{
|
||||||
@ -22127,7 +22128,7 @@ int setup_order(THD *thd, Ref_ptr_array ref_pointer_array, TABLE_LIST *tables,
|
|||||||
@param order The fields we should do GROUP/PARTITION BY on
|
@param order The fields we should do GROUP/PARTITION BY on
|
||||||
@param hidden_group_fields Pointer to flag that is set to 1 if we added
|
@param hidden_group_fields Pointer to flag that is set to 1 if we added
|
||||||
any fields to all_fields.
|
any fields to all_fields.
|
||||||
@param search_in_all_fields If true then search in all_fields
|
@param from_window_spec If true then list is from a window spec
|
||||||
|
|
||||||
@todo
|
@todo
|
||||||
change ER_WRONG_FIELD_WITH_GROUP to more detailed
|
change ER_WRONG_FIELD_WITH_GROUP to more detailed
|
||||||
@ -22142,7 +22143,7 @@ int setup_order(THD *thd, Ref_ptr_array ref_pointer_array, TABLE_LIST *tables,
|
|||||||
int
|
int
|
||||||
setup_group(THD *thd, Ref_ptr_array ref_pointer_array, TABLE_LIST *tables,
|
setup_group(THD *thd, Ref_ptr_array ref_pointer_array, TABLE_LIST *tables,
|
||||||
List<Item> &fields, List<Item> &all_fields, ORDER *order,
|
List<Item> &fields, List<Item> &all_fields, ORDER *order,
|
||||||
bool *hidden_group_fields, bool search_in_all_fields)
|
bool *hidden_group_fields, bool from_window_spec)
|
||||||
{
|
{
|
||||||
enum_parsing_place parsing_place= thd->lex->current_select->parsing_place;
|
enum_parsing_place parsing_place= thd->lex->current_select->parsing_place;
|
||||||
*hidden_group_fields=0;
|
*hidden_group_fields=0;
|
||||||
@ -22157,7 +22158,7 @@ setup_group(THD *thd, Ref_ptr_array ref_pointer_array, TABLE_LIST *tables,
|
|||||||
for (ord= order; ord; ord= ord->next)
|
for (ord= order; ord; ord= ord->next)
|
||||||
{
|
{
|
||||||
if (find_order_in_list(thd, ref_pointer_array, tables, ord, fields,
|
if (find_order_in_list(thd, ref_pointer_array, tables, ord, fields,
|
||||||
all_fields, TRUE, search_in_all_fields))
|
all_fields, TRUE, from_window_spec))
|
||||||
return 1;
|
return 1;
|
||||||
(*ord->item)->marker= UNDEF_POS; /* Mark found */
|
(*ord->item)->marker= UNDEF_POS; /* Mark found */
|
||||||
if ((*ord->item)->with_sum_func && parsing_place == IN_GROUP_BY)
|
if ((*ord->item)->with_sum_func && parsing_place == IN_GROUP_BY)
|
||||||
|
@ -1943,10 +1943,10 @@ int safe_index_read(JOIN_TAB *tab);
|
|||||||
int get_quick_record(SQL_SELECT *select);
|
int get_quick_record(SQL_SELECT *select);
|
||||||
int setup_order(THD *thd, Ref_ptr_array ref_pointer_array, TABLE_LIST *tables,
|
int setup_order(THD *thd, Ref_ptr_array ref_pointer_array, TABLE_LIST *tables,
|
||||||
List<Item> &fields, List <Item> &all_fields, ORDER *order,
|
List<Item> &fields, List <Item> &all_fields, ORDER *order,
|
||||||
bool search_in_all_fields= true);
|
bool from_window_spec= false);
|
||||||
int setup_group(THD *thd, Ref_ptr_array ref_pointer_array, TABLE_LIST *tables,
|
int setup_group(THD *thd, Ref_ptr_array ref_pointer_array, TABLE_LIST *tables,
|
||||||
List<Item> &fields, List<Item> &all_fields, ORDER *order,
|
List<Item> &fields, List<Item> &all_fields, ORDER *order,
|
||||||
bool *hidden_group_fields, bool search_in_all_fields= true);
|
bool *hidden_group_fields, bool from_window_spec= false);
|
||||||
bool fix_inner_refs(THD *thd, List<Item> &all_fields, SELECT_LEX *select,
|
bool fix_inner_refs(THD *thd, List<Item> &all_fields, SELECT_LEX *select,
|
||||||
Ref_ptr_array ref_pointer_array);
|
Ref_ptr_array ref_pointer_array);
|
||||||
int join_read_key2(THD *thd, struct st_join_table *tab, TABLE *table,
|
int join_read_key2(THD *thd, struct st_join_table *tab, TABLE *table,
|
||||||
|
Reference in New Issue
Block a user