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

MCOL-597 Fix up Windows Functions

This commit is contained in:
David Hall
2017-03-21 16:27:09 -05:00
parent a3c4503bc9
commit d7da34c249
7 changed files with 576 additions and 396 deletions

View File

@ -1,326 +1,302 @@
<!DOCTYPE Project SYSTEM "http://www.slickedit.com/dtd/vse/10.0/vpj.dtd"> <!DOCTYPE Project SYSTEM "http://www.slickedit.com/dtd/vse/10.0/vpj.dtd">
<Project <Project
Version="10.0" Version="10.0"
VendorName="SlickEdit" VendorName="SlickEdit"
TemplateName="GNU C/C++" TemplateName="GNU C/C++"
WorkingDir="."> WorkingDir=".">
<Config <Config
Name="Debug" Name="Debug"
Type="gnuc" Type="gnuc"
DebugCallbackName="gdb" DebugCallbackName="gdb"
Version="1" Version="1"
OutputFile="%bdexecplan.so" OutputFile="%bdexecplan.so"
CompilerConfigName="Latest Version" CompilerConfigName="Latest Version"
ObjectDir="/home/dhall/genii/dbcon/execplan/"> ObjectDir="/home/dhall/genii/dbcon/execplan/">
<Menu> <Menu>
<Target <Target
Name="Compile" Name="Compile"
MenuCaption="&amp;Compile" MenuCaption="&amp;Compile"
Dialog="_gnuc_options_form Compile" Dialog="_gnuc_options_form Compile"
CaptureOutputWith="ProcessBuffer" CaptureOutputWith="ProcessBuffer"
Deletable="0" Deletable="0"
OutputExts="*.o" OutputExts="*.o"
SaveOption="SaveCurrent" SaveOption="SaveCurrent"
RunFromDir="%rw"> RunFromDir="%rw">
<Exec CmdLine='g++ -c %xup %defd -g -o "%bd%n%oe" %i "%f"'/> <Exec CmdLine='g++ -c %xup %defd -g -o "%bd%n%oe" %i "%f"'/>
</Target> </Target>
<Target <Target
Name="Link" Name="Link"
MenuCaption="&amp;Link" MenuCaption="&amp;Link"
ShowOnMenu="Never" ShowOnMenu="Never"
Dialog="_gnuc_options_form Link" Dialog="_gnuc_options_form Link"
CaptureOutputWith="ProcessBuffer" CaptureOutputWith="ProcessBuffer"
Deletable="0" Deletable="0"
SaveOption="SaveCurrent" SaveOption="SaveCurrent"
RunFromDir="%rw"> RunFromDir="%rw">
<Exec CmdLine='g++ %xup -g -o "%o" %f %libs -shared -fPIC'/> <Exec CmdLine='g++ %xup -g -o "%o" %f %libs -shared -fPIC'/>
</Target> </Target>
<Target <Target
Name="Build" Name="Build"
MenuCaption="&amp;Build" MenuCaption="&amp;Build"
CaptureOutputWith="ProcessBuffer" CaptureOutputWith="ProcessBuffer"
Deletable="0" Deletable="0"
SaveOption="SaveWorkspaceFiles" SaveOption="SaveWorkspaceFiles"
RunFromDir="%rw" RunFromDir="%rw"
ClearProcessBuffer="1"> ClearProcessBuffer="1">
<Exec CmdLine="make install"/> <Exec CmdLine="make install"/>
</Target> </Target>
<Target <Target
Name="Rebuild" Name="Rebuild"
MenuCaption="&amp;Rebuild" MenuCaption="&amp;Rebuild"
CaptureOutputWith="ProcessBuffer" CaptureOutputWith="ProcessBuffer"
Deletable="0" Deletable="0"
SaveOption="SaveWorkspaceFiles" SaveOption="SaveWorkspaceFiles"
RunFromDir="%rw"> RunFromDir="%rw">
<Exec CmdLine=""/> <Exec CmdLine=""/>
</Target> </Target>
<Target <Target
Name="Debug" Name="Debug"
MenuCaption="&amp;Debug" MenuCaption="&amp;Debug"
Dialog="_gnuc_options_form Run/Debug" Dialog="_gnuc_options_form Run/Debug"
BuildFirst="1" BuildFirst="1"
CaptureOutputWith="ProcessBuffer" CaptureOutputWith="ProcessBuffer"
Deletable="0" Deletable="0"
SaveOption="SaveNone" SaveOption="SaveNone"
RunFromDir="%rw"> RunFromDir="%rw">
<Exec CmdLine=""/> <Exec CmdLine=""/>
</Target> </Target>
<Target <Target
Name="Execute" Name="Execute"
MenuCaption="E&amp;xecute" MenuCaption="E&amp;xecute"
Dialog="_gnuc_options_form Run/Debug" Dialog="_gnuc_options_form Run/Debug"
BuildFirst="1" BuildFirst="1"
CaptureOutputWith="ProcessBuffer" CaptureOutputWith="ProcessBuffer"
Deletable="0" Deletable="0"
SaveOption="SaveWorkspaceFiles" SaveOption="SaveWorkspaceFiles"
RunFromDir="%rw"> RunFromDir="%rw">
<Exec CmdLine=""/> <Exec CmdLine=""/>
</Target> </Target>
<Target <Target
Name="dash" Name="dash"
MenuCaption="-" MenuCaption="-"
Deletable="0"> Deletable="0">
<Exec/> <Exec/>
</Target> </Target>
<Target <Target
Name="GNU C Options" Name="GNU C Options"
MenuCaption="GNU C &amp;Options..." MenuCaption="GNU C &amp;Options..."
ShowOnMenu="HideIfNoCmdLine" ShowOnMenu="HideIfNoCmdLine"
Deletable="0" Deletable="0"
SaveOption="SaveNone"> SaveOption="SaveNone">
<Exec <Exec
CmdLine="gnucoptions" CmdLine="gnucoptions"
Type="Slick-C"/> Type="Slick-C"/>
</Target> </Target>
</Menu> </Menu>
<List Name="GNUC Options"> <List Name="GNUC Options">
<Item <Item
Name="LinkerOutputType" Name="LinkerOutputType"
Value="SharedLibrary"/> Value="SharedLibrary"/>
</List> </List>
</Config> </Config>
<Config <Config
Name="Release" Name="Release"
Type="gnuc" Type="gnuc"
DebugCallbackName="gdb" DebugCallbackName="gdb"
Version="1" Version="1"
OutputFile="%bdexecplan.so" OutputFile="%bdexecplan.so"
CompilerConfigName="Latest Version"> CompilerConfigName="Latest Version">
<Menu> <Menu>
<Target <Target
Name="Compile" Name="Compile"
MenuCaption="&amp;Compile" MenuCaption="&amp;Compile"
Dialog="_gnuc_options_form Compile" Dialog="_gnuc_options_form Compile"
CaptureOutputWith="ProcessBuffer" CaptureOutputWith="ProcessBuffer"
Deletable="0" Deletable="0"
OutputExts="*.o" OutputExts="*.o"
SaveOption="SaveCurrent" SaveOption="SaveCurrent"
RunFromDir="%rw"> RunFromDir="%rw">
<Exec CmdLine='g++ -c %xup %defd -o "%bd%n%oe" %i "%f"'/> <Exec CmdLine='g++ -c %xup %defd -o "%bd%n%oe" %i "%f"'/>
</Target> </Target>
<Target <Target
Name="Link" Name="Link"
MenuCaption="&amp;Link" MenuCaption="&amp;Link"
ShowOnMenu="Never" ShowOnMenu="Never"
Dialog="_gnuc_options_form Link" Dialog="_gnuc_options_form Link"
CaptureOutputWith="ProcessBuffer" CaptureOutputWith="ProcessBuffer"
Deletable="0" Deletable="0"
SaveOption="SaveCurrent" SaveOption="SaveCurrent"
RunFromDir="%rw"> RunFromDir="%rw">
<Exec CmdLine='g++ %xup -o "%o" %f %libs -shared -fPIC'/> <Exec CmdLine='g++ %xup -o "%o" %f %libs -shared -fPIC'/>
</Target> </Target>
<Target <Target
Name="Build" Name="Build"
MenuCaption="&amp;Build" MenuCaption="&amp;Build"
CaptureOutputWith="ProcessBuffer" CaptureOutputWith="ProcessBuffer"
Deletable="0" Deletable="0"
SaveOption="SaveWorkspaceFiles" SaveOption="SaveWorkspaceFiles"
RunFromDir="%rw" RunFromDir="%rw"
ClearProcessBuffer="1"> ClearProcessBuffer="1">
<Exec CmdLine="make install"/> <Exec CmdLine="make install"/>
</Target> </Target>
<Target <Target
Name="Rebuild" Name="Rebuild"
MenuCaption="&amp;Rebuild" MenuCaption="&amp;Rebuild"
CaptureOutputWith="ProcessBuffer" CaptureOutputWith="ProcessBuffer"
Deletable="0" Deletable="0"
SaveOption="SaveWorkspaceFiles" SaveOption="SaveWorkspaceFiles"
RunFromDir="%rw"> RunFromDir="%rw">
<Exec CmdLine=""/> <Exec CmdLine=""/>
</Target> </Target>
<Target <Target
Name="Debug" Name="Debug"
MenuCaption="&amp;Debug" MenuCaption="&amp;Debug"
Dialog="_gnuc_options_form Run/Debug" Dialog="_gnuc_options_form Run/Debug"
BuildFirst="1" BuildFirst="1"
CaptureOutputWith="ProcessBuffer" CaptureOutputWith="ProcessBuffer"
Deletable="0" Deletable="0"
SaveOption="SaveNone" SaveOption="SaveNone"
RunFromDir="%rw"> RunFromDir="%rw">
<Exec CmdLine=""/> <Exec CmdLine=""/>
</Target> </Target>
<Target <Target
Name="Execute" Name="Execute"
MenuCaption="E&amp;xecute" MenuCaption="E&amp;xecute"
Dialog="_gnuc_options_form Run/Debug" Dialog="_gnuc_options_form Run/Debug"
BuildFirst="1" BuildFirst="1"
CaptureOutputWith="ProcessBuffer" CaptureOutputWith="ProcessBuffer"
Deletable="0" Deletable="0"
SaveOption="SaveWorkspaceFiles" SaveOption="SaveWorkspaceFiles"
RunFromDir="%rw"> RunFromDir="%rw">
<Exec CmdLine=""/> <Exec CmdLine=""/>
</Target> </Target>
<Target <Target
Name="dash" Name="dash"
MenuCaption="-" MenuCaption="-"
Deletable="0"> Deletable="0">
<Exec/> <Exec/>
</Target> </Target>
<Target <Target
Name="GNU C Options" Name="GNU C Options"
MenuCaption="GNU C &amp;Options..." MenuCaption="GNU C &amp;Options..."
ShowOnMenu="HideIfNoCmdLine" ShowOnMenu="HideIfNoCmdLine"
Deletable="0" Deletable="0"
SaveOption="SaveNone"> SaveOption="SaveNone">
<Exec <Exec
CmdLine="gnucoptions" CmdLine="gnucoptions"
Type="Slick-C"/> Type="Slick-C"/>
</Target> </Target>
</Menu> </Menu>
<List Name="GNUC Options"> <List Name="GNUC Options">
<Item <Item
Name="LinkerOutputType" Name="LinkerOutputType"
Value="SharedLibrary"/> Value="SharedLibrary"/>
</List> </List>
</Config> </Config>
<Files> <Files>
<Folder <Folder
Name="Source Files" Name="Source Files"
Filters="*.c;*.C;*.cc;*.cpp;*.cp;*.cxx;*.c++;*.prg;*.pas;*.dpr;*.asm;*.s;*.bas;*.java;*.cs;*.sc;*.e;*.cob;*.html;*.rc;*.tcl;*.py;*.pl;*.d"> Filters="*.c;*.C;*.cc;*.cpp;*.cp;*.cxx;*.c++;*.prg;*.pas;*.dpr;*.asm;*.s;*.bas;*.java;*.cs;*.sc;*.e;*.cob;*.html;*.rc;*.tcl;*.py;*.pl;*.d">
<F N="aggregatecolumn.cpp"/> <F N="aggregatecolumn.cpp"/>
<F N="arithmeticcolumn.cpp"/> <F N="arithmeticcolumn.cpp"/>
<F N="arithmeticoperator.cpp"/> <F N="arithmeticoperator.cpp"/>
<F N="btdriver.cpp"/> <F N="btdriver.cpp"/>
<F N="calpontexecutionplan.cpp"/> <F N="calpontexecutionplan.cpp"/>
<F N="calpontexecutionplanfactory.cpp"/> <F N="calpontexecutionplanfactory.cpp"/>
<F N="calpontselectexecutionplan.cpp"/> <F N="calpontselectexecutionplan.cpp"/>
<F N="calpontsystemcatalog.cpp"/> <F N="calpontsystemcatalog.cpp"/>
<F N="clientrotator.cpp"/> <F N="clientrotator.cpp"/>
<F N="constantcolumn.cpp"/> <F N="constantcolumn.cpp"/>
<F N="constantfilter.cpp"/> <F N="constantfilter.cpp"/>
<F N="existsfilter.cpp"/> <F N="existsfilter.cpp"/>
<F N="expressionparser.cpp"/> <F N="expressionparser.cpp"/>
<F N="filter.cpp"/> <F N="filter.cpp"/>
<F N="functioncolumn.cpp"/> <F N="functioncolumn.cpp"/>
<F N="groupconcatcolumn.cpp"/> <F N="groupconcatcolumn.cpp"/>
<F N="logicoperator.cpp"/> <F N="logicoperator.cpp"/>
<F N="mysqlexecutionplan.cpp"/> <F N="mysqlexecutionplan.cpp"/>
<F N="objectidmanager.cpp"/> <F N="objectidmanager.cpp"/>
<F N="objectreader.cpp"/> <F N="objectreader.cpp"/>
<F N="operator.cpp"/> <F N="operator.cpp"/>
<F N="oracleexecutionplan.cpp"/> <F N="oracleexecutionplan.cpp"/>
<F N="outerjoinonfilter.cpp"/> <F N="outerjoinonfilter.cpp"/>
<F N="predicateoperator.cpp"/> <F N="predicateoperator.cpp"/>
<F N="range.cpp"/> <F N="range.cpp"/>
<F N="returnedcolumn.cpp"/> <F N="returnedcolumn.cpp"/>
<F N="rowcolumn.cpp"/> <F N="rowcolumn.cpp"/>
<F N="selectfilter.cpp"/> <F N="selectfilter.cpp"/>
<F N="sessionmanager.cpp"/> <F N="sessionmanager.cpp"/>
<F N="sessionmonitor.cpp"/> <F N="sessionmonitor.cpp"/>
<F N="simplecolumn.cpp"/> <F N="simplecolumn.cpp"/>
<F N="simplefilter.cpp"/> <F N="simplefilter.cpp"/>
<F N="simplescalarfilter.cpp"/> <F N="simplescalarfilter.cpp"/>
<F N="tdriver-oid.cpp"/> <F N="treenode.cpp"/>
<F N="tdriver-sm.cpp"/> <F N="treenodeimpl.cpp"/>
<F N="tdriver.cpp"/> <F N="vendorexecutionplan.cpp"/>
<F N="tdriver1.cpp"/> <F N="windowfunctioncolumn.cpp"/>
<F N="tdriver10.cpp"/> </Folder>
<F N="tdriver11.cpp"/> <Folder
<F N="tdriver12.cpp"/> Name="Header Files"
<F N="tdriver13.cpp"/> Filters="*.h;*.H;*.hh;*.hpp;*.hxx;*.inc;*.sh;*.cpy;*.if">
<F N="tdriver14.cpp"/> <F N="aggregatecolumn.h"/>
<F N="tdriver15.cpp"/> <F N="arithmeticcolumn.h"/>
<F N="tdriver16.cpp"/> <F N="arithmeticoperator.h"/>
<F N="tdriver17.cpp"/> <F N="blocksize.h"/>
<F N="tdriver18.cpp"/> <F N="calpontexecutionplan.h"/>
<F N="tdriver19.cpp"/> <F N="calpontexecutionplanfactory.h"/>
<F N="tdriver2.cpp"/> <F N="calpontselectexecutionplan.h"/>
<F N="tdriver20.cpp"/> <F N="calpontsystemcatalog.h"/>
<F N="tdriver21.cpp"/> <F N="clientrotator.h"/>
<F N="tdriver22.cpp"/> <F N="columnresult.h"/>
<F N="tdriver23.cpp"/> <F N="constantcolumn.h"/>
<F N="tdriver3.cpp"/> <F N="constantfilter.h"/>
<F N="tdriver4.cpp"/> <F N="datatypes.h"/>
<F N="tdriver5.cpp"/> <F N="existsfilter.h"/>
<F N="tdriver6.cpp"/> <F N="exp_templates.h"/>
<F N="tdriver7.cpp"/> <F N="expressionparser.h"/>
<F N="tdriver8.cpp"/> <F N="expressiontree.h"/>
<F N="tdriver9.cpp"/> <F N="filter.h"/>
<F N="treenode.cpp"/> <F N="functioncolumn.h"/>
<F N="treenodeimpl.cpp"/> <F N="groupconcatcolumn.h"/>
<F N="vendorexecutionplan.cpp"/> <F N="logicoperator.h"/>
</Folder> <F N="mysqlexecutionplan.h"/>
<Folder <F N="njlcolumnresult.h"/>
Name="Header Files" <F N="objectidmanager.h"/>
Filters="*.h;*.H;*.hh;*.hpp;*.hxx;*.inc;*.sh;*.cpy;*.if"> <F N="objectreader.h"/>
<F N="aggregatecolumn.h"/> <F N="operator.h"/>
<F N="arithmeticcolumn.h"/> <F N="oracleexecutionplan.h"/>
<F N="arithmeticoperator.h"/> <F N="outerjoinonfilter.h"/>
<F N="blocksize.h"/> <F N="parsetree.h"/>
<F N="calpontexecutionplan.h"/> <F N="predicateoperator.h"/>
<F N="calpontexecutionplanfactory.h"/> <F N="range.h"/>
<F N="calpontselectexecutionplan.h"/> <F N="returnedcolumn.h"/>
<F N="calpontsystemcatalog.h"/> <F N="rowcolumn.h"/>
<F N="clientrotator.h"/> <F N="selectfilter.h"/>
<F N="columnresult.h"/> <F N="sessionmanager.h"/>
<F N="constantcolumn.h"/> <F N="sessionmonitor.h"/>
<F N="constantfilter.h"/> <F N="simplecolumn.h"/>
<F N="datatypes.h"/> <F N="simplecolumn_decimal.h"/>
<F N="existsfilter.h"/> <F N="simplecolumn_int.h"/>
<F N="exp_templates.h"/> <F N="simplecolumn_uint.h"/>
<F N="expressionparser.h"/> <F N="simplefilter.h"/>
<F N="expressiontree.h"/> <F N="simplescalarfilter.h"/>
<F N="filter.h"/> <F N="treenode.h"/>
<F N="functioncolumn.h"/> <F N="treenodeimpl.h"/>
<F N="groupconcatcolumn.h"/> <F N="vendorexecutionplan.h"/>
<F N="logicoperator.h"/> <F N="windowfunctioncolumn.h"/>
<F N="mysqlexecutionplan.h"/> </Folder>
<F N="njlcolumnresult.h"/> <Folder
<F N="objectidmanager.h"/> Name="Resource Files"
<F N="objectreader.h"/> Filters="*.ico;*.cur;*.dlg"/>
<F N="operator.h"/> <Folder
<F N="oracleexecutionplan.h"/> Name="Bitmaps"
<F N="outerjoinonfilter.h"/> Filters="*.bmp"/>
<F N="parsetree.h"/> <Folder
<F N="predicateoperator.h"/> Name="Other Files"
<F N="range.h"/> Filters="">
<F N="returnedcolumn.h"/> <F
<F N="rowcolumn.h"/> N="Makefile"
<F N="selectfilter.h"/> Type="Makefile"/>
<F N="sessionmanager.h"/> </Folder>
<F N="sessionmonitor.h"/> </Files>
<F N="simplecolumn.h"/>
<F N="simplecolumn_decimal.h"/>
<F N="simplecolumn_int.h"/>
<F N="simplecolumn_uint.h"/>
<F N="simplefilter.h"/>
<F N="simplescalarfilter.h"/>
<F N="treenode.h"/>
<F N="treenodeimpl.h"/>
<F N="vendorexecutionplan.h"/>
</Folder>
<Folder
Name="Resource Files"
Filters="*.ico;*.cur;*.dlg"/>
<Folder
Name="Bitmaps"
Filters="*.bmp"/>
<Folder
Name="Other Files"
Filters="">
<F
N="Makefile"
Type="Makefile"/>
</Folder>
</Files>
</Project> </Project>

View File

@ -41,7 +41,7 @@ class ByteStream;
*/ */
namespace execplan { namespace execplan {
// This enum is made consistant with mysql item_func_window // This enum is made consistant with mysql Item_window_func
enum WF_FRAME enum WF_FRAME
{ {
WF_PRECEDING = 0, WF_PRECEDING = 0,

View File

@ -21,7 +21,7 @@
*/ */
/** @file */ /** @file */
//#define DEBUG_WALK_COND #define DEBUG_WALK_COND
#include <my_config.h> #include <my_config.h>
#include <string> #include <string>
#include <iostream> #include <iostream>
@ -38,7 +38,6 @@
#include <cerrno> #include <cerrno>
#include <cstring> #include <cstring>
#include <time.h> #include <time.h>
//#define NDEBUG
#include <cassert> #include <cassert>
#include <vector> #include <vector>
#include <map> #include <map>
@ -699,13 +698,11 @@ void debug_walk(const Item *item, void *arg)
cout << ": <NULL>" << endl; cout << ": <NULL>" << endl;
break; break;
} }
#if 0
case Item::WINDOW_FUNC_ITEM: case Item::WINDOW_FUNC_ITEM:
{ {
cout << "Window Function Item" << endl; cout << "Window Function Item" << endl;
break; break;
} }
#endif
default: default:
{ {
cout << "UNKNOWN_ITEM type " << item->type() << endl; cout << "UNKNOWN_ITEM type " << item->type() << endl;
@ -2464,11 +2461,11 @@ ReturnedColumn* buildReturnedColumn(Item* item, gp_walk_info& gwi, bool& nonSupp
rc = new ConstantColumn(valStr); rc = new ConstantColumn(valStr);
break; break;
} }
#if 0
case Item::WINDOW_FUNC_ITEM: case Item::WINDOW_FUNC_ITEM:
{ {
return buildWindowFunctionColumn(item, gwi, nonSupport); return buildWindowFunctionColumn(item, gwi, nonSupport);
} }
#if INTERVAL_ITEM
case Item::INTERVAL_ITEM: case Item::INTERVAL_ITEM:
{ {
Item_interval* interval = (Item_interval*)item; Item_interval* interval = (Item_interval*)item;
@ -2481,7 +2478,7 @@ ReturnedColumn* buildReturnedColumn(Item* item, gp_walk_info& gwi, bool& nonSupp
rc->resultType(srcp->resultType()); rc->resultType(srcp->resultType());
break; break;
} }
#endif #endif
case Item::SUBSELECT_ITEM: case Item::SUBSELECT_ITEM:
{ {
gwi.hasSubSelect = true; gwi.hasSubSelect = true;
@ -4437,17 +4434,15 @@ void gp_walk(const Item *item, void *arg)
gwip->rcWorkStack.push(buildReturnedColumn(itp, *gwip, gwip->fatalParseError)); gwip->rcWorkStack.push(buildReturnedColumn(itp, *gwip, gwip->fatalParseError));
break; break;
} }
#if 0
case Item::WINDOW_FUNC_ITEM: case Item::WINDOW_FUNC_ITEM:
{ {
gwip->hasWindowFunc = true; gwip->hasWindowFunc = true;
Item_func_window* ifa = (Item_func_window*)item; Item_window_func* ifa = (Item_window_func*)item;
ReturnedColumn* af = buildWindowFunctionColumn(ifa, *gwip, gwip->fatalParseError); ReturnedColumn* af = buildWindowFunctionColumn(ifa, *gwip, gwip->fatalParseError);
if (af) if (af)
gwip->rcWorkStack.push(af); gwip->rcWorkStack.push(af);
break; break;
} }
#endif
case Item::COPY_STR_ITEM: case Item::COPY_STR_ITEM:
printf("********** received COPY_STR_ITEM *********\n"); printf("********** received COPY_STR_ITEM *********\n");
break; break;
@ -4631,11 +4626,9 @@ void parse_item (Item *item, vector<Item_field*>& field_vec, bool& hasNonSupport
setError(item->thd(), ER_CHECK_NOT_IMPLEMENTED, parseErrorText); setError(item->thd(), ER_CHECK_NOT_IMPLEMENTED, parseErrorText);
break; break;
} }
#if 0
case Item::WINDOW_FUNC_ITEM: case Item::WINDOW_FUNC_ITEM:
parseInfo |= AF_BIT; parseInfo |= AF_BIT;
break; break;
#endif
default: default:
break; break;
} }
@ -5525,7 +5518,6 @@ int getSelectPlan(gp_walk_info& gwi, SELECT_LEX& select_lex, SCSEP& csep, bool i
setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi);
return ER_CHECK_NOT_IMPLEMENTED; return ER_CHECK_NOT_IMPLEMENTED;
} }
#if 0
case Item::WINDOW_FUNC_ITEM: case Item::WINDOW_FUNC_ITEM:
{ {
SRCP srcp(buildWindowFunctionColumn(item, gwi, gwi.fatalParseError)); SRCP srcp(buildWindowFunctionColumn(item, gwi, gwi.fatalParseError));
@ -5539,7 +5531,6 @@ int getSelectPlan(gp_walk_info& gwi, SELECT_LEX& select_lex, SCSEP& csep, bool i
gwi.returnedCols.push_back(srcp); gwi.returnedCols.push_back(srcp);
break; break;
} }
#endif
default: default:
{ {
break; break;
@ -5692,7 +5683,6 @@ int getSelectPlan(gp_walk_info& gwi, SELECT_LEX& select_lex, SCSEP& csep, bool i
// check if window functions are in order by. InfiniDB process order by list if // check if window functions are in order by. InfiniDB process order by list if
// window functions are involved, either in order by or projection. // window functions are involved, either in order by or projection.
#if 0
bool hasWindowFunc = gwi.hasWindowFunc; bool hasWindowFunc = gwi.hasWindowFunc;
gwi.hasWindowFunc = false; gwi.hasWindowFunc = false;
for (; groupcol; groupcol= groupcol->next) for (; groupcol; groupcol= groupcol->next)
@ -5708,7 +5698,6 @@ int getSelectPlan(gp_walk_info& gwi, SELECT_LEX& select_lex, SCSEP& csep, bool i
return ER_CHECK_NOT_IMPLEMENTED; return ER_CHECK_NOT_IMPLEMENTED;
} }
gwi.hasWindowFunc = hasWindowFunc; gwi.hasWindowFunc = hasWindowFunc;
#endif
groupcol = reinterpret_cast<ORDER*>(select_lex.group_list.first); groupcol = reinterpret_cast<ORDER*>(select_lex.group_list.first);
for (; groupcol; groupcol= groupcol->next) for (; groupcol; groupcol= groupcol->next)
@ -5954,13 +5943,11 @@ int getSelectPlan(gp_walk_info& gwi, SELECT_LEX& select_lex, SCSEP& csep, bool i
// check if window functions are in order by. InfiniDB process order by list if // check if window functions are in order by. InfiniDB process order by list if
// window functions are involved, either in order by or projection. // window functions are involved, either in order by or projection.
#if 0
for (; ordercol; ordercol= ordercol->next) for (; ordercol; ordercol= ordercol->next)
{ {
if ((*(ordercol->item))->type() == Item::WINDOW_FUNC_ITEM) if ((*(ordercol->item))->type() == Item::WINDOW_FUNC_ITEM)
gwi.hasWindowFunc = true; gwi.hasWindowFunc = true;
} }
#endif
// re-visit the first of ordercol list // re-visit the first of ordercol list
ordercol = reinterpret_cast<ORDER*>(order_list.first); ordercol = reinterpret_cast<ORDER*>(order_list.first);

View File

@ -3017,7 +3017,7 @@ int ha_calpont_impl_rnd_next(uchar *buf, TABLE* table)
rc = fetchNextRow(buf, ti, ci); rc = fetchNextRow(buf, ti, ci);
} catch (std::exception& e) } catch (std::exception& e)
{ {
string emsg = string("Lost connection to ExeMgr while fetching: ") + e.what(); string emsg = string("Error while fetching from ExeMgr: ") + e.what();
setError(thd, ER_INTERNAL_ERROR, emsg); setError(thd, ER_INTERNAL_ERROR, emsg);
CalpontSystemCatalog::removeCalpontSystemCatalog(tid2sid(thd->thread_id)); CalpontSystemCatalog::removeCalpontSystemCatalog(tid2sid(thd->thread_id));
return ER_INTERNAL_ERROR; return ER_INTERNAL_ERROR;

View File

@ -63,26 +63,26 @@ ReturnedColumn* nullOnError(gp_walk_info& gwi)
return NULL; return NULL;
} }
#if 0 WF_FRAME frame(Window_frame_bound::Bound_precedence_type bound, Item* offset)
WF_FRAME frame(BOUND& bound)
{ {
switch (bound) switch (bound)
{ {
case PRECEDING: case Window_frame_bound::PRECEDING:
return WF_PRECEDING; if (offset)
case FOLLOWING: return WF_PRECEDING;
return WF_FOLLOWING; else
case UNBOUNDED_PRECEDING: return WF_UNBOUNDED_PRECEDING;
return WF_UNBOUNDED_PRECEDING; case Window_frame_bound::FOLLOWING:
case UNBOUNDED_FOLLOWING: if (offset)
return WF_UNBOUNDED_FOLLOWING; return WF_FOLLOWING;
case CURRENT_ROW: else
return WF_UNBOUNDED_FOLLOWING;
case Window_frame_bound::CURRENT: // Offset is meaningless
return WF_CURRENT_ROW; return WF_CURRENT_ROW;
default: default:
return WF_UNKNOWN; return WF_UNKNOWN;
} }
} }
#endif
ReturnedColumn* buildBoundExp(WF_Boundary& bound, SRCP& order, gp_walk_info& gwi) ReturnedColumn* buildBoundExp(WF_Boundary& bound, SRCP& order, gp_walk_info& gwi)
{ {
if (!(gwi.thd->infinidb_vtable.cal_conn_info)) if (!(gwi.thd->infinidb_vtable.cal_conn_info))
@ -178,6 +178,96 @@ ReturnedColumn* buildBoundExp(WF_Boundary& bound, SRCP& order, gp_walk_info& gwi
return rc; return rc;
} }
// Since columnstore implemented Windows Functions before MariaDB, we need
// map from the enum MariaDB uses to the string that columnstore uses to
// identify the function type.
string ConvertFuncName(Item_sum* item)
{
switch (item->sum_func())
{
case Item_sum::COUNT_FUNC:
if (!item->arguments()[0]->name)
return "COUNT(*)";
return "COUNT";
break;
case Item_sum::COUNT_DISTINCT_FUNC:
return "COUNT_DISTINCT";
break;
case Item_sum::SUM_FUNC:
return "SUM";
break;
case Item_sum::SUM_DISTINCT_FUNC:
return "SUM_DISTINCT";
break;
case Item_sum::AVG_FUNC:
return "AVG";
break;
case Item_sum::AVG_DISTINCT_FUNC:
return "AVG_DISTINCT";
break;
case Item_sum::MIN_FUNC:
return "MIN";
break;
case Item_sum::MAX_FUNC:
return "MAX";
break;
case Item_sum::STD_FUNC:
return "STDDEV_POP";
break;
case Item_sum::VARIANCE_FUNC:
return "VAR_POP";
break;
case Item_sum::SUM_BIT_FUNC:
if (strcmp(item->func_name(), "bit_or(") == 0)
return "BIT_OR";
if (strcmp(item->func_name(), "bit_and(") == 0)
return "BIT_AND";
if (strcmp(item->func_name(), "bit_xor(") == 0)
return "BIT_XOR";
break;
case Item_sum::UDF_SUM_FUNC:
return "UDF_SUM_FUNC"; // Not supported
break;
case Item_sum::GROUP_CONCAT_FUNC:
return "GROUP_CONCAT"; // Not supported
break;
case Item_sum::ROW_NUMBER_FUNC:
return "ROW_NUMBER";
break;
case Item_sum::RANK_FUNC:
return "RANK";
break;
case Item_sum::DENSE_RANK_FUNC:
return "DENSE_RANK";
break;
case Item_sum::PERCENT_RANK_FUNC:
return "PERCENT_RANK";
break;
case Item_sum::CUME_DIST_FUNC:
return "CUME_DIST";
break;
case Item_sum::NTILE_FUNC:
return "NTILE";
break;
case Item_sum::FIRST_VALUE_FUNC:
return "FIRST_VALUE";
break;
case Item_sum::LAST_VALUE_FUNC:
return "LAST_VALUE";
break;
case Item_sum::NTH_VALUE_FUNC:
return "NTH_VALUE";
break;
case Item_sum::LEAD_FUNC:
return "LEAD";
break;
case Item_sum::LAG_FUNC:
return "LAG";
break;
};
return "";
}
ReturnedColumn* buildWindowFunctionColumn(Item* item, gp_walk_info& gwi, bool& nonSupport) ReturnedColumn* buildWindowFunctionColumn(Item* item, gp_walk_info& gwi, bool& nonSupport)
{ {
//@todo fix print for create view //@todo fix print for create view
@ -186,37 +276,82 @@ ReturnedColumn* buildWindowFunctionColumn(Item* item, gp_walk_info& gwi, bool& n
//cout << str.c_ptr() << endl; //cout << str.c_ptr() << endl;
if (!(gwi.thd->infinidb_vtable.cal_conn_info)) if (!(gwi.thd->infinidb_vtable.cal_conn_info))
gwi.thd->infinidb_vtable.cal_conn_info = (void*)(new cal_connection_info()); gwi.thd->infinidb_vtable.cal_conn_info = (void*)(new cal_connection_info());
// cal_connection_info* ci = reinterpret_cast<cal_connection_info*>(gwi.thd->infinidb_vtable.cal_conn_info); cal_connection_info* ci = reinterpret_cast<cal_connection_info*>(gwi.thd->infinidb_vtable.cal_conn_info);
gwi.hasWindowFunc = true; gwi.hasWindowFunc = true;
// Item_func_window* wf = (Item_func_window*)item; Item_window_func* wf = (Item_window_func*)item;
string funcName /*= wf->func_name()*/; string funcName = ConvertFuncName(wf->window_func());
WindowFunctionColumn* ac = new WindowFunctionColumn(funcName); WindowFunctionColumn* ac = new WindowFunctionColumn(funcName);
// ac->distinct(wf->isDistinct()); ac->distinct(wf->window_func()->has_with_distinct());
// Window_context *wf_ctx = wf->window_ctx(); Window_spec *win_spec = wf->window_spec;
SRCP srcp; SRCP srcp;
#if 0 // arguments
vector<SRCP> funcParms;
Item_sum* item_sum = (Item_sum*)wf->arguments()[0];
for (uint32_t i = 0; i < item_sum->argument_count(); i++)
{
srcp.reset(buildReturnedColumn((item_sum->arguments()[i]), gwi, nonSupport));
if (!srcp)
return nullOnError(gwi);
funcParms.push_back(srcp);
if (gwi.clauseType == WHERE && !gwi.rcWorkStack.empty())
gwi.rcWorkStack.pop();
}
// Some functions, such as LEAD/LAG don't have all parameters implemented in the
// front end. Add dummies here to make the backend use defaults.
// Some of these will be temporary until they are implemented in the front end.
// Others need to stay because the back end expects them, but the front end
// no longer sends them.
// This case is kept in enum order in hopes the compiler can optimize
switch (wf->window_func()->sum_func())
{
case Item_sum::COUNT_FUNC:
case Item_sum::COUNT_DISTINCT_FUNC:
break;
case Item_sum::FIRST_VALUE_FUNC:
srcp.reset(new ConstantColumn("1", (uint64_t)1, ConstantColumn::NUM)); // OFFSET (always one)
funcParms.push_back(srcp);
srcp.reset(new ConstantColumn("1", (uint64_t)1, ConstantColumn::NUM)); // FROM_FIRST
funcParms.push_back(srcp);
srcp.reset(new ConstantColumn("1", (uint64_t)1, ConstantColumn::NUM)); // IGNORE/RESPECT NULLS. 1 => RESPECT
funcParms.push_back(srcp);
break;
case Item_sum::LAST_VALUE_FUNC:
srcp.reset(new ConstantColumn("1", (uint64_t)1, ConstantColumn::NUM)); // OFFSET (always one)
funcParms.push_back(srcp);
srcp.reset(new ConstantColumn("0", (uint64_t)0, ConstantColumn::NUM)); // FROM_LAST
funcParms.push_back(srcp);
srcp.reset(new ConstantColumn("1", (uint64_t)1, ConstantColumn::NUM)); // IGNORE/RESPECT NULLS. 1 => RESPECT
funcParms.push_back(srcp);
break;
case Item_sum::NTH_VALUE_FUNC:
// When the front end supports these paramters, this needs modification
srcp.reset(new ConstantColumn("1", (uint64_t)1, ConstantColumn::NUM)); // FROM FIRST/LAST 1 => FIRST
funcParms.push_back(srcp);
srcp.reset(new ConstantColumn("1", (uint64_t)1, ConstantColumn::NUM)); // IGNORE/RESPECT NULLS. 1 => RESPECT
funcParms.push_back(srcp);
break;
case Item_sum::LEAD_FUNC:
case Item_sum::LAG_FUNC:
// When the front end supports these paramters, this needs modification
srcp.reset(new ConstantColumn("", ConstantColumn::NULLDATA)); // Default to fill in for NULL values
funcParms.push_back(srcp);
srcp.reset(new ConstantColumn("1", (uint64_t)1, ConstantColumn::NUM)); // IGNORE/RESPECT NULLS. 1 => RESPECT
funcParms.push_back(srcp);
break;
default:
break;
};
// arguments ac->functionParms(funcParms);
vector<SRCP> funcParms;
for (uint32_t i = 0; i < wf->argument_count(); i++)
{
srcp.reset(buildReturnedColumn(wf->arguments()[i], gwi, nonSupport));
if (!srcp)
return nullOnError(gwi);
funcParms.push_back(srcp);
if (gwi.clauseType == WHERE && !gwi.rcWorkStack.empty())
gwi.rcWorkStack.pop();
}
ac->functionParms(funcParms);
// Partition by // Partition by
if (wf_ctx) if (win_spec)
{ {
vector<SRCP> partitions; vector<SRCP> partitions;
for (uint32_t i = 0; i < wf_ctx->partition_count; i++) for (ORDER *ord= win_spec->partition_list->first; ord; ord=ord->next)
{ {
srcp.reset(buildReturnedColumn(wf_ctx->partitions[i], gwi, nonSupport)); srcp.reset(buildReturnedColumn(*ord->item, gwi, nonSupport));
if (!srcp) if (!srcp)
return nullOnError(gwi); return nullOnError(gwi);
partitions.push_back(srcp); partitions.push_back(srcp);
@ -224,40 +359,42 @@ ReturnedColumn* buildWindowFunctionColumn(Item* item, gp_walk_info& gwi, bool& n
ac->partitions(partitions); ac->partitions(partitions);
// Order by // Order by
if (wf_ctx->ordering) if (win_spec->order_list)
{ {
WF_OrderBy orderBy; WF_OrderBy orderBy;
// order columns // order columns
if (wf_ctx->ordering->orders) if (win_spec->order_list)
{ {
vector<SRCP> orders; vector<SRCP> orders;
ORDER* orderCol = reinterpret_cast<ORDER*>(wf_ctx->ordering->orders->first); ORDER* orderCol = reinterpret_cast<ORDER*>(win_spec->order_list->first);
for (; orderCol; orderCol= orderCol->next) for (; orderCol; orderCol= orderCol->next)
{ {
Item* orderItem = *(orderCol->item); Item* orderItem = *(orderCol->item);
srcp.reset(buildReturnedColumn(orderItem, gwi, nonSupport)); srcp.reset(buildReturnedColumn(orderItem, gwi, nonSupport));
if (!srcp) if (!srcp)
return nullOnError(gwi); return nullOnError(gwi);
srcp->asc(orderCol->asc); srcp->asc(orderCol->direction == ORDER::ORDER_ASC ? true : false);
srcp->nullsFirst(orderCol->nulls); // nulls 1-nulls first 0-nulls last // srcp->nullsFirst(orderCol->nulls); // nulls 2-default, 1-nulls first, 0-nulls last
orders.push_back(srcp); srcp->nullsFirst(1); // WINDOWS TODO: implement NULLS FIRST/LAST in 10.2 front end
orders.push_back(srcp);
} }
orderBy.fOrders = orders; orderBy.fOrders = orders;
} }
// window frame // window frame
WF_Frame frm; WF_Frame frm;
if (wf_ctx->ordering->frame) if (win_spec->window_frame)
{ {
frm.fIsRange = wf_ctx->ordering->frame->isRange; frm.fIsRange = win_spec->window_frame->units == Window_frame::UNITS_RANGE;
// start // start
if (wf_ctx->ordering->frame->start) if (win_spec->window_frame->top_bound)
{ {
frm.fStart.fFrame = frame(wf_ctx->ordering->frame->start->bound); frm.fStart.fFrame = frame(win_spec->window_frame->top_bound->precedence_type,
win_spec->window_frame->top_bound->offset); // offset NULL means UNBOUNDED
if (wf_ctx->ordering->frame->start->item) if (win_spec->window_frame->top_bound->offset)
{ {
frm.fStart.fVal.reset(buildReturnedColumn(wf_ctx->ordering->frame->start->item, gwi, nonSupport)); frm.fStart.fVal.reset(buildReturnedColumn(win_spec->window_frame->top_bound->offset, gwi, nonSupport));
if (!frm.fStart.fVal) if (!frm.fStart.fVal)
return nullOnError(gwi); return nullOnError(gwi);
@ -295,12 +432,13 @@ ReturnedColumn* buildWindowFunctionColumn(Item* item, gp_walk_info& gwi, bool& n
} }
// end // end
if (wf_ctx->ordering->frame->end) if (win_spec->window_frame->bottom_bound)
{ {
frm.fEnd.fFrame = frame(wf_ctx->ordering->frame->end->bound); frm.fEnd.fFrame = frame(win_spec->window_frame->bottom_bound->precedence_type,
if (wf_ctx->ordering->frame->end->item) win_spec->window_frame->bottom_bound->offset);
if (win_spec->window_frame->bottom_bound->offset)
{ {
frm.fEnd.fVal.reset(buildReturnedColumn(wf_ctx->ordering->frame->end->item, gwi, nonSupport)); frm.fEnd.fVal.reset(buildReturnedColumn(win_spec->window_frame->bottom_bound->offset, gwi, nonSupport));
if (!frm.fEnd.fVal) if (!frm.fEnd.fVal)
return nullOnError(gwi); return nullOnError(gwi);
@ -409,8 +547,57 @@ ReturnedColumn* buildWindowFunctionColumn(Item* item, gp_walk_info& gwi, bool& n
} }
else else
{ {
frm.fStart.fFrame = WF_UNBOUNDED_PRECEDING; // Certain function types have different default boundaries
frm.fEnd.fFrame = WF_CURRENT_ROW; // This case is kept in enum order in hopes the compiler can optimize
switch (wf->window_func()->sum_func())
{
case Item_sum::COUNT_FUNC:
case Item_sum::COUNT_DISTINCT_FUNC:
case Item_sum::SUM_FUNC:
case Item_sum::SUM_DISTINCT_FUNC:
case Item_sum::AVG_FUNC:
case Item_sum::AVG_DISTINCT_FUNC:
case Item_sum::MIN_FUNC:
case Item_sum::MAX_FUNC:
case Item_sum::STD_FUNC:
case Item_sum::VARIANCE_FUNC:
case Item_sum::SUM_BIT_FUNC:
case Item_sum::UDF_SUM_FUNC:
case Item_sum::GROUP_CONCAT_FUNC:
frm.fStart.fFrame = WF_UNBOUNDED_PRECEDING;
frm.fEnd.fFrame = WF_CURRENT_ROW;
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;
break;
case Item_sum::FIRST_VALUE_FUNC:
case Item_sum::LAST_VALUE_FUNC:
case Item_sum::NTH_VALUE_FUNC:
frm.fStart.fFrame = WF_UNBOUNDED_PRECEDING;
frm.fEnd.fFrame = WF_CURRENT_ROW;
break;
case Item_sum::LEAD_FUNC:
case Item_sum::LAG_FUNC:
frm.fStart.fFrame = WF_UNBOUNDED_PRECEDING;
frm.fEnd.fFrame = WF_UNBOUNDED_FOLLOWING;
break;
default:
frm.fStart.fFrame = WF_UNBOUNDED_PRECEDING;
frm.fEnd.fFrame = WF_CURRENT_ROW;
break;
};
} }
orderBy.fFrame = frm; orderBy.fFrame = frm;
@ -426,8 +613,7 @@ ReturnedColumn* buildWindowFunctionColumn(Item* item, gp_walk_info& gwi, bool& n
return NULL; return NULL;
} }
ac->resultType(colType_MysqlToIDB(wf)); ac->resultType(colType_MysqlToIDB(wf->arguments()[0]));
// bug5736. Make the result type double for some window functions when // bug5736. Make the result type double for some window functions when
// infinidb_double_for_decimal_math is set. // infinidb_double_for_decimal_math is set.
ac->adjustResultType(); ac->adjustResultType();
@ -438,7 +624,6 @@ ReturnedColumn* buildWindowFunctionColumn(Item* item, gp_walk_info& gwi, bool& n
// put ac on windowFuncList // put ac on windowFuncList
gwi.windowFuncList.push_back(ac); gwi.windowFuncList.push_back(ac);
#endif
return ac; return ac;
} }

View File

@ -65,6 +65,7 @@ template <class T> bool isnan(T);
#include "sql_table.h" #include "sql_table.h"
#include "sql_select.h" #include "sql_select.h"
#include "item_windowfunc.h"
// Now clean up the pollution as best we can... // Now clean up the pollution as best we can...
#undef min #undef min

View File

@ -121,6 +121,11 @@ void WF_lead_lag<T>::parseParms(const std::vector<execplan::SRCP>& parms)
{ {
// lead | lag // lead | lag
fLead = 1; fLead = 1;
fRespectNulls = true;
fDefNull = false;
fDefault = (T)0;
fOffsetNull = false;
fOffset = 0;
if (fFunctionId == WF__LAG) if (fFunctionId == WF__LAG)
fLead = -1; fLead = -1;
@ -148,6 +153,32 @@ void WF_lead_lag<T>::parseParms(const std::vector<execplan::SRCP>& parms)
idbassert(cc != NULL); idbassert(cc != NULL);
bool isNull = false; // dummy, harded coded bool isNull = false; // dummy, harded coded
fRespectNulls = (cc->getIntVal(fRow, isNull) > 0); fRespectNulls = (cc->getIntVal(fRow, isNull) > 0);
#if 0
// parms[1]: offset
for (std::vector<execplan::SRCP>::size_type i = 1/*ignore 0th element*/; i < parms.size(); ++i)
{
ConstantColumn* cc = dynamic_cast<ConstantColumn*>(parms[i].get());
if (cc != NULL)
{
fOffset = cc->getIntVal(fRow, fOffsetNull) * fLead; // row not used, no need to setData.
continue;
}
cc = dynamic_cast<ConstantColumn*>(parms[i].get());
if (cc != NULL)
{
getConstValue(cc, fDefault, fDefNull);
continue;
}
// IGNORE/RESPECT nulls is currently broken in the front end
cc = dynamic_cast<ConstantColumn*>(parms[i].get());
if (cc != NULL)
{
bool isNull = false; // dummy, harded coded
fRespectNulls = (cc->getIntVal(fRow, isNull) > 0);
}
}
#endif
} }