1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-08-07 03:22:57 +03:00

MCOL-597 Fix up Windows Functions

This commit is contained in:
David Hall
2017-03-28 13:03:28 -05:00
parent d7da34c249
commit d531796bf2
6 changed files with 61 additions and 36 deletions

View File

@@ -496,6 +496,11 @@ void debug_walk(const Item *item, void *arg)
'.' << ifp->field_name << endl;
break;
}
else if (field->type() == Item::FUNC_ITEM)
{
Item_func* ifp = (Item_func*)field;
cout << "CACHED REF FUNC_ITEM " << ifp->func_name() << endl;
}
else if (field->type() == Item::REF_ITEM)
{
Item_ref* ifr = (Item_ref*)field;
@@ -563,7 +568,20 @@ void debug_walk(const Item *item, void *arg)
ifp->field_name << endl;
break;
}
cout << "UNKNOWN REF ITEM type " << ref->real_item()->type() << endl;
else if (ref->real_item()->type() == Item::FUNC_ITEM)
{
Item_func* ifp = (Item_func*)ref->real_item();
cout << "REF FUNC_ITEM " << ifp->func_name() << endl;
}
else if (ref->real_item()->type() == Item::WINDOW_FUNC_ITEM)
{
Item_window_func* ifp = (Item_window_func*)ref->real_item();
cout << "REF WINDOW_FUNC_ITEM " << ifp->window_func()->func_name() << endl;
}
else
{
cout << "UNKNOWN REF ITEM type " << ref->real_item()->type() << endl;
}
break;
}
case Item::ROW_ITEM:
@@ -700,7 +718,8 @@ void debug_walk(const Item *item, void *arg)
}
case Item::WINDOW_FUNC_ITEM:
{
cout << "Window Function Item" << endl;
Item_window_func* ifp = (Item_window_func*)item;
cout << "Window Function Item " << ifp->window_func()->func_name() << endl;
break;
}
default:
@@ -2407,18 +2426,19 @@ ReturnedColumn* buildReturnedColumn(Item* item, gp_walk_info& gwi, bool& nonSupp
case Item::REF_ITEM:
{
Item_ref* ref = (Item_ref*)item;
if ((*(ref->ref))->type() == Item::SUM_FUNC_ITEM)
{
switch ((*(ref->ref))->type())
{
case Item::SUM_FUNC_ITEM:
return buildAggregateColumn(*(ref->ref), gwi);
}
else if ((*(ref->ref))->type() == Item::FIELD_ITEM)
case Item::FIELD_ITEM:
return buildReturnedColumn(*(ref->ref), gwi, nonSupport);
else if ((*(ref->ref))->type() == Item::REF_ITEM)
case Item::REF_ITEM:
return buildReturnedColumn(*(((Item_ref*)(*(ref->ref)))->ref), gwi, nonSupport);
else if ((*(ref->ref))->type() == Item::FUNC_ITEM)
case Item::FUNC_ITEM:
return buildFunctionColumn((Item_func*)(*(ref->ref)), gwi, nonSupport);
else
{
case Item::WINDOW_FUNC_ITEM:
return buildWindowFunctionColumn(*(ref->ref), gwi, nonSupport);
default:
gwi.fatalParseError = true;
gwi.parseErrorText = "Unknown REF item";
break;
@@ -4390,8 +4410,6 @@ void gp_walk(const Item *item, void *arg)
gwip->subQuery = orig;
gwip->lastSub = existsSub;
}
#if MYSQL_VERSION_ID >= 50172
else if (sub->substype() == Item_subselect::IN_SUBS)
{
if (!((Item_in_subselect*)sub)->getOptimizer() && gwip->thd->derived_tables_processing)
@@ -4403,7 +4421,6 @@ void gp_walk(const Item *item, void *arg)
break;
}
}
#endif
// store a dummy subselect object. the transform is handled in item_func.
SubSelect *subselect = new SubSelect();
gwip->rcWorkStack.push(subselect);
@@ -4595,6 +4612,11 @@ void parse_item (Item *item, vector<Item_field*>& field_vec, bool& hasNonSupport
item = (*(ref->ref));
continue;
}
else if ((*(ref->ref))->type() == Item::WINDOW_FUNC_ITEM)
{
parseInfo |= AF_BIT;
break;
}
else
{
cout << "UNKNOWN REF Item" << endl;

View File

@@ -212,10 +212,16 @@ string ConvertFuncName(Item_sum* item)
return "MAX";
break;
case Item_sum::STD_FUNC:
return "STDDEV_POP";
if (((Item_sum_variance*)item)->sample)
return "STDDEV_SAMP";
else
return "STDDEV_POP";
break;
case Item_sum::VARIANCE_FUNC:
return "VAR_POP";
case Item_sum::VARIANCE_FUNC:
if (((Item_sum_variance*)item)->sample)
return "VAR_SAMP";
else
return "VAR_POP";
break;
case Item_sum::SUM_BIT_FUNC:
if (strcmp(item->func_name(), "bit_or(") == 0)
@@ -375,7 +381,7 @@ ReturnedColumn* buildWindowFunctionColumn(Item* item, gp_walk_info& gwi, bool& n
return nullOnError(gwi);
srcp->asc(orderCol->direction == ORDER::ORDER_ASC ? true : false);
// srcp->nullsFirst(orderCol->nulls); // nulls 2-default, 1-nulls first, 0-nulls last
srcp->nullsFirst(1); // WINDOWS TODO: implement NULLS FIRST/LAST in 10.2 front end
srcp->nullsFirst(orderCol->direction == ORDER::ORDER_ASC ? 1 : 0); // WINDOWS TODO: implement NULLS FIRST/LAST in 10.2 front end
orders.push_back(srcp);
}
orderBy.fOrders = orders;
@@ -557,8 +563,15 @@ ReturnedColumn* buildWindowFunctionColumn(Item* item, gp_walk_info& gwi, bool& n
case Item_sum::SUM_DISTINCT_FUNC:
case Item_sum::AVG_FUNC:
case Item_sum::AVG_DISTINCT_FUNC:
frm.fStart.fFrame = WF_UNBOUNDED_PRECEDING;
frm.fEnd.fFrame = WF_CURRENT_ROW;
break;
case Item_sum::MIN_FUNC:
case Item_sum::MAX_FUNC:
frm.fStart.fFrame = WF_UNBOUNDED_PRECEDING;
// frm.fEnd.fFrame = WF_UNBOUNDED_FOLLOWING;
frm.fEnd.fFrame = WF_CURRENT_ROW;
break;
case Item_sum::STD_FUNC:
case Item_sum::VARIANCE_FUNC:
case Item_sum::SUM_BIT_FUNC:
@@ -569,15 +582,9 @@ ReturnedColumn* buildWindowFunctionColumn(Item* item, gp_walk_info& gwi, bool& n
break;
case Item_sum::ROW_NUMBER_FUNC:
case Item_sum::RANK_FUNC:
frm.fStart.fFrame = WF_UNBOUNDED_PRECEDING;
frm.fEnd.fFrame = WF_UNBOUNDED_FOLLOWING;
break;
case Item_sum::DENSE_RANK_FUNC:
case Item_sum::PERCENT_RANK_FUNC:
case Item_sum::CUME_DIST_FUNC:
frm.fStart.fFrame = WF_UNBOUNDED_PRECEDING;
frm.fEnd.fFrame = WF_CURRENT_ROW;
break;
case Item_sum::NTILE_FUNC:
frm.fStart.fFrame = WF_UNBOUNDED_PRECEDING;
frm.fEnd.fFrame = WF_UNBOUNDED_FOLLOWING;