[MDEV-16625] GROUP BY temp table fields should provide ColumnStore with info about their origin. Created: 2018-06-29  Updated: 2018-08-29  Resolved: 2018-08-29

Status: Closed
Project: MariaDB Server
Component/s: Optimizer
Fix Version/s: 10.3.9

Type: Task Priority: Minor
Reporter: Roman Assignee: Sergei Petrunia
Resolution: Duplicate Votes: 0
Labels: None


 Description   

Consider an example:

select sum(i)+1 from cs1 group by i;

Initially in JOIN::make_aggr_tables_info() the all_fields list has these elements

(gdb) p dbug_print_item(all_fields.elem(0))
$5 = 0x5592c6ec3b20 <dbug_item_print_buf> "cs1.i"
(gdb) p dbug_print_item(all_fields.elem(1))
$6 = 0x5592c6ec3b20 <dbug_item_print_buf> "sum(cs1.i)"
(gdb) p dbug_print_item(all_fields.elem(2))
$7 = 0x5592c6ec3b20 <dbug_item_print_buf> "sum(cs1.i) + 1"

By the time we reach this point:

#0  cal_impl_if::getGroupPlan (gwi=..., select_lex=..., csep=..., gi=..., isUnion=false)
    at /git/mariadb-columnstore-server/d2-mariadb-columnstore-engine/dbcon/mysql/ha_calpont_execplan.cpp:8167
#1  0x00007fd1981c3a3c in cal_impl_if::cp_get_group_plan (thd=0x7fd0e4000b00, csep=..., gi=...)
    at /git/mariadb-columnstore-server/d2-mariadb-columnstore-engine/dbcon/mysql/ha_calpont_execplan.cpp:8090
#2  0x00007fd198144577 in ha_calpont_impl_group_by_init (group_hand=0x7fd0e4010e50, table=0x7fd0e401d2b8)
    at /git/mariadb-columnstore-server/d2-mariadb-columnstore-engine/dbcon/mysql/ha_calpont_impl.cpp:5298
#3  0x00007fd19812bc52 in ha_calpont_group_by_handler::init_scan (this=0x7fd0e4010e50)
    at /git/mariadb-columnstore-server/d2-mariadb-columnstore-engine/dbcon/mysql/ha_calpont.cpp:1187
#4  0x00005592c59b825b in Pushdown_query::execute (this=0x7fd0e4015ed8, join=0x7fd0e4014190) at /git/mariadb-columnstore-server/sql/group_by_handler.cc:48
#5  0x00005592c5978138 in do_select (join=0x7fd0e4014190, procedure=0x0) at /git/mariadb-columnstore-server/sql/sql_select.cc:18321
#6  0x00005592c5953153 in JOIN::exec_inner (this=0x7fd0e4014190) at /git/mariadb-columnstore-server/sql/sql_select.cc:3729
#7  0x00005592c5951e7a in JOIN::exec (this=0x7fd0e4014190) at /git/mariadb-columnstore-server/sql/sql_select.cc:3316
#8  0x00005592c5953922 in mysql_select (thd=0x7fd0e4000b00, tables=0x7fd0e4013918, wild_num=0, fields=..., conds=0x0, og_num=1, order=0x0, group=0x7fd0e4014048, 
    having=0x0, proc_param=0x0, select_options=2147748608, result=0x7fd0e4014170, unit=0x7fd0e40047f8, select_lex=0x7fd0e4004f30)
    at /git/mariadb-columnstore-server/sql/sql_select.cc:3964

The expression in the list points to a field in the temporary table:

(gdb) p dbug_print_item(gi.groupByFields->elem(0))
$18 = 0x5592c6ec3b20 <dbug_item_print_buf> "cs1.i"
(gdb) p dbug_print_item(gi.groupByFields->elem(1))
$19 = 0x5592c6ec3b20 <dbug_item_print_buf> "sum(cs1.i)"
(gdb) p dbug_print_item(gi.groupByFields->elem(2))
$20 = 0x5592c6ec3b20 <dbug_item_print_buf> "tmp_field + 1"

(Here gi.groupByFields points to JOIN::all_fields)

more details about the "tmp_field" :

(gdb) p gi.groupByFields
$23 = (List<Item> *) 0x7fd0e40144b0
(gdb) p dbug_print_item(gi.groupByFields->elem(2))
$24 = 0x5592c6ec3b20 <dbug_item_print_buf> "tmp_field + 1"
 
(gdb) p  gi.groupByFields->elem(2)
$25 = (Item_func_plus *) 0x7fd0e40137e8
(gdb) p  gi.groupByFields->elem(2)->args[0]
$26 = (Item_aggregate_ref *) 0x7fd0e4014888
(gdb) p  gi.groupByFields->elem(2)->args[0]->ref[0]
$27 = (Item_temptable_field *) 0x7fd0e4016310
(gdb) p  gi.groupByFields->elem(2)->args[0]->ref[0]->field_name
$28 = 0x0
(gdb) p  gi.groupByFields->elem(2)->args[0]->ref[0]->table_name
$29 = 0x5592c63c4f56 ""
(gdb) p  gi.groupByFields->elem(2)->args[0]->ref[0]->field
$30 = (Field_new_decimal *) 0x7fd0e401e968
(gdb) p  gi.groupByFields->elem(2)->args[0]->ref[0]->field_name
$31 = 0x0

So, one can see this is a field in the group-by temp.table, but there is no way to figure out what expression it refers to.


Generated at Thu Feb 08 08:30:19 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.