1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-07-30 19:23:07 +03:00

Changes needed for Item::CACHE_ITEM

This commit is contained in:
David Hall
2016-02-29 18:01:22 -06:00
parent 6e58ad4cc2
commit 353ec57908
6 changed files with 390 additions and 217 deletions

View File

@ -428,6 +428,18 @@ void debug_walk(const Item *item, void *arg)
((Item_cache_wrapper*)item)->get_orig_item()->traverse_cond(debug_walk, arg, Item::POSTFIX); ((Item_cache_wrapper*)item)->get_orig_item()->traverse_cond(debug_walk, arg, Item::POSTFIX);
break; break;
} }
case Item::CACHE_ITEM:
{
Item_cache* isp = (Item_cache*)item;
if (item->result_type() == ROW_RESULT)
{
cout << "CACHE_ROW_ITEM" << endl;
break;
}
String val, *str = isp->val_str(&val);
cout << "CACHE_ITEM: >" << str->c_ptr() << '<' << endl;
break;
}
case Item::WINDOW_FUNC_ITEM: case Item::WINDOW_FUNC_ITEM:
{ {
cout << "Window Function Item" << endl; cout << "Window Function Item" << endl;
@ -442,6 +454,51 @@ void debug_walk(const Item *item, void *arg)
} }
#endif #endif
void buildNestedTableOuterJoin(gp_walk_info& gwi, TABLE_LIST* table_ptr)
{
TABLE_LIST *table;
List_iterator<TABLE_LIST> li(table_ptr->nested_join->join_list);
while ((table= li++))
{
gwi.innerTables.clear();
if (table->outer_join)
{
CalpontSystemCatalog::TableAliasName ta = make_aliasview(
(table->db ? table->db : ""),
(table->table_name ? table->table_name : ""),
(table->alias ? table->alias : ""),
getViewName(table));
gwi.innerTables.insert(ta);
}
if (table->nested_join)
{
TABLE_LIST *tab;
List_iterator<TABLE_LIST> li(table->nested_join->join_list);
while ((tab= li++))
{
CalpontSystemCatalog::TableAliasName ta = make_aliasview(
(tab->db ? table->db : ""),
(tab->table_name ? tab->table_name : ""),
(tab->alias ? tab->alias : ""),
getViewName(tab));
gwi.innerTables.insert(ta);
}
}
if (table->on_expr)
{
Item_cond* expr = reinterpret_cast<Item_cond*>(table->on_expr);
#ifdef DEBUG_WALK_COND
expr->traverse_cond(debug_walk, &gwi, Item::POSTFIX);
#endif
expr->traverse_cond(gp_walk, &gwi, Item::POSTFIX);
}
if (table->nested_join && &(table->nested_join->join_list))
{
buildNestedTableOuterJoin(gwi, table);
}
}
}
uint32_t buildOuterJoin(gp_walk_info& gwi, SELECT_LEX& select_lex) uint32_t buildOuterJoin(gp_walk_info& gwi, SELECT_LEX& select_lex)
{ {
// check non-collapsed outer join // check non-collapsed outer join
@ -476,6 +533,20 @@ uint32_t buildOuterJoin(gp_walk_info& gwi, SELECT_LEX& select_lex)
{ {
Item_cond* expr = reinterpret_cast<Item_cond*>(table_ptr->on_expr); Item_cond* expr = reinterpret_cast<Item_cond*>(table_ptr->on_expr);
gwi_outer.innerTables.insert(tan); gwi_outer.innerTables.insert(tan);
if (table_ptr->nested_join && &(table_ptr->nested_join->join_list))
{
TABLE_LIST *table;
List_iterator<TABLE_LIST> li(table_ptr->nested_join->join_list);
while ((table= li++))
{
CalpontSystemCatalog::TableAliasName ta = make_aliasview(
(table->db ? table->db : ""),
(table->table_name ? table->table_name : ""),
(table->alias ? table->alias : ""),
getViewName(table));
gwi_outer.innerTables.insert(ta);
}
}
#ifdef DEBUG_WALK_COND #ifdef DEBUG_WALK_COND
if (table_ptr->alias) if (table_ptr->alias)
@ -487,12 +558,17 @@ uint32_t buildOuterJoin(gp_walk_info& gwi, SELECT_LEX& select_lex)
#endif #endif
expr->traverse_cond(gp_walk, &gwi_outer, Item::POSTFIX); expr->traverse_cond(gp_walk, &gwi_outer, Item::POSTFIX);
} }
if (table_ptr->nested_join && &(table_ptr->nested_join->join_list))
{
buildNestedTableOuterJoin(gwi_outer, table_ptr);
}
// this part is ambiguous. Not quite sure how MySQL's lay out the outer join filters in the structure // this part is ambiguous. Not quite sure how MySQL's lay out the outer join filters in the structure
else if (table_ptr->embedding && table_ptr->embedding->outer_join && table_ptr->embedding->on_expr) if (table_ptr->embedding && table_ptr->embedding->outer_join && table_ptr->embedding->sj_on_expr)
{ {
// all the tables in nested_join are inner tables. // all the tables in nested_join are inner tables.
TABLE_LIST *table; TABLE_LIST *table;
List_iterator<TABLE_LIST> li(table_ptr->embedding->nested_join->join_list); List_iterator<TABLE_LIST> li(table_ptr->embedding->nested_join->join_list);
gwi_outer.innerTables.clear();
while ((table= li++)) while ((table= li++))
{ {
CalpontSystemCatalog:: TableAliasName ta = make_aliasview( CalpontSystemCatalog:: TableAliasName ta = make_aliasview(
@ -506,7 +582,7 @@ uint32_t buildOuterJoin(gp_walk_info& gwi, SELECT_LEX& select_lex)
if (embeddingSet.find(table_ptr->embedding) != embeddingSet.end()) if (embeddingSet.find(table_ptr->embedding) != embeddingSet.end())
continue; continue;
embeddingSet.insert(table_ptr->embedding); embeddingSet.insert(table_ptr->embedding);
Item_cond* expr = reinterpret_cast<Item_cond*>(table_ptr->embedding->on_expr); Item_cond* expr = reinterpret_cast<Item_cond*>(table_ptr->embedding->sj_on_expr);
#ifdef DEBUG_WALK_COND #ifdef DEBUG_WALK_COND
cout << "inner tables: " << endl; cout << "inner tables: " << endl;
@ -519,7 +595,7 @@ uint32_t buildOuterJoin(gp_walk_info& gwi, SELECT_LEX& select_lex)
expr->traverse_cond(gp_walk, &gwi_outer, Item::POSTFIX); expr->traverse_cond(gp_walk, &gwi_outer, Item::POSTFIX);
} }
// @bug 2849 // @bug 2849
else if (table_ptr->embedding && table_ptr->embedding->nested_join) if (table_ptr->embedding && table_ptr->embedding->nested_join)
{ {
// if this is dervied table process phase, mysql may have not developed the plan // if this is dervied table process phase, mysql may have not developed the plan
// completely. Return and let it finish. It will come to rnd_init again. // completely. Return and let it finish. It will come to rnd_init again.
@ -535,6 +611,7 @@ uint32_t buildOuterJoin(gp_walk_info& gwi, SELECT_LEX& select_lex)
if (embeddingSet.find(table_ptr->embedding) != embeddingSet.end()) if (embeddingSet.find(table_ptr->embedding) != embeddingSet.end())
continue; continue;
gwi_outer.innerTables.clear();
gwi_outer.innerTables.insert(tan); gwi_outer.innerTables.insert(tan);
embeddingSet.insert(table_ptr->embedding); embeddingSet.insert(table_ptr->embedding);
List<TABLE_LIST> *inners = &(table_ptr->embedding->nested_join->join_list); List<TABLE_LIST> *inners = &(table_ptr->embedding->nested_join->join_list);
@ -542,12 +619,12 @@ uint32_t buildOuterJoin(gp_walk_info& gwi, SELECT_LEX& select_lex)
TABLE_LIST* curr; TABLE_LIST* curr;
while ((curr = li++)) while ((curr = li++))
{ {
if (curr->on_expr) if (curr->sj_on_expr)
{ {
if (!curr->outer_join) // only handle nested JOIN for now if (!curr->outer_join) // only handle nested JOIN for now
{ {
gwi_outer.innerTables.clear(); gwi_outer.innerTables.clear();
Item_cond* expr = reinterpret_cast<Item_cond*>(curr->on_expr); Item_cond* expr = reinterpret_cast<Item_cond*>(curr->sj_on_expr);
#ifdef DEBUG_WALK_COND #ifdef DEBUG_WALK_COND
expr->traverse_cond(debug_walk, &gwi_outer, Item::POSTFIX); expr->traverse_cond(debug_walk, &gwi_outer, Item::POSTFIX);
@ -628,7 +705,7 @@ ParseTree* buildRowPredicate(RowColumn* lhs, RowColumn* rhs, string predicateOp)
return pt; return pt;
} }
void buildRowColumnFilter(gp_walk_info* gwip, RowColumn* rhs, RowColumn* lhs, Item_func* ifp) bool buildRowColumnFilter(gp_walk_info* gwip, RowColumn* rhs, RowColumn* lhs, Item_func* ifp)
{ {
if (ifp->functype() == Item_func::EQ_FUNC || ifp->functype() == Item_func::NE_FUNC) if (ifp->functype() == Item_func::EQ_FUNC || ifp->functype() == Item_func::NE_FUNC)
{ {
@ -653,7 +730,7 @@ void buildRowColumnFilter(gp_walk_info* gwip, RowColumn* rhs, RowColumn* lhs, It
predicateOp = "="; predicateOp = "=";
logicOp = "or"; logicOp = "or";
} }
LogicOperator *lo = new LogicOperator(logicOp); scoped_ptr<LogicOperator> lo(new LogicOperator(logicOp));
// 1st round. build the equivalent filters // 1st round. build the equivalent filters
// two entries have been popped from the stack already: lhs and rhs // two entries have been popped from the stack already: lhs and rhs
@ -688,7 +765,7 @@ void buildRowColumnFilter(gp_walk_info* gwip, RowColumn* rhs, RowColumn* lhs, It
// done for NOTIN clause // done for NOTIN clause
if (predicateOp == "<>") if (predicateOp == "<>")
return; return true;
// 2nd round. add the filter to favor casual partition for IN clause // 2nd round. add the filter to favor casual partition for IN clause
boost::shared_ptr<Operator> sop; boost::shared_ptr<Operator> sop;
@ -765,11 +842,12 @@ void buildRowColumnFilter(gp_walk_info* gwip, RowColumn* rhs, RowColumn* lhs, It
{ {
gwip->fatalParseError = true; gwip->fatalParseError = true;
gwip->parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_FUNC_MULTI_COL); gwip->parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_FUNC_MULTI_COL);
return; return false;
} }
return true;
} }
void buildPredicateItem(Item_func* ifp, gp_walk_info* gwip) bool buildPredicateItem(Item_func* ifp, gp_walk_info* gwip)
{ {
boost::shared_ptr<Operator> sop(new PredicateOperator(ifp->func_name())); boost::shared_ptr<Operator> sop(new PredicateOperator(ifp->func_name()));
if (!(gwip->thd->infinidb_vtable.cal_conn_info)) if (!(gwip->thd->infinidb_vtable.cal_conn_info))
@ -813,11 +891,12 @@ void buildPredicateItem(Item_func* ifp, gp_walk_info* gwip)
// @bug5811. This filter string is for cross engine to use. // @bug5811. This filter string is for cross engine to use.
// Use real table name. // Use real table name.
ifp->print(&str, QT_INFINIDB_DERIVED); ifp->print(&str, QT_INFINIDB_DERIVED);
IDEBUG(cout << str.c_ptr() << endl); //IDEBUG(cout << str.c_ptr() << endl);
if (str.c_ptr()) if (str.c_ptr())
cf->data(str.c_ptr()); cf->data(str.c_ptr());
ParseTree* ptp = new ParseTree(cf); ParseTree* ptp = new ParseTree(cf);
gwip->ptWorkStack.push(ptp); gwip->ptWorkStack.push(ptp);
return true;
} }
else if (ifp->functype() == Item_func::IN_FUNC) else if (ifp->functype() == Item_func::IN_FUNC)
{ {
@ -832,8 +911,7 @@ void buildPredicateItem(Item_func* ifp, gp_walk_info* gwip)
RowColumn *rlhs = dynamic_cast<RowColumn*>(lhs); RowColumn *rlhs = dynamic_cast<RowColumn*>(lhs);
if (rrhs && rlhs) if (rrhs && rlhs)
{ {
buildRowColumnFilter(gwip, rrhs, rlhs, ifp); return buildRowColumnFilter(gwip, rrhs, rlhs, ifp);
return;
} }
ConstantColumn *crhs = dynamic_cast<ConstantColumn*>(rhs); ConstantColumn *crhs = dynamic_cast<ConstantColumn*>(rhs);
@ -842,7 +920,7 @@ void buildPredicateItem(Item_func* ifp, gp_walk_info* gwip)
{ {
gwip->fatalParseError = true; gwip->fatalParseError = true;
gwip->parseErrorText = "non constant value in IN clause"; gwip->parseErrorText = "non constant value in IN clause";
return; return false;
} }
string eqop; string eqop;
@ -885,7 +963,7 @@ void buildPredicateItem(Item_func* ifp, gp_walk_info* gwip)
gwip->fatalParseError = true; gwip->fatalParseError = true;
gwip->parseErrorText = "non constant value in IN clause"; gwip->parseErrorText = "non constant value in IN clause";
delete cf; delete cf;
return; return false;
} }
cf->functionName(gwip->funcName); cf->functionName(gwip->funcName);
String str; String str;
@ -918,7 +996,7 @@ void buildPredicateItem(Item_func* ifp, gp_walk_info* gwip)
{ {
gwip->fatalParseError = true; gwip->fatalParseError = true;
gwip->parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_FILTER_COND_EXP); gwip->parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_FILTER_COND_EXP);
return; return false;
} }
} }
@ -947,7 +1025,7 @@ void buildPredicateItem(Item_func* ifp, gp_walk_info* gwip)
oss << "Unknown user variable: " << udf->name.str; oss << "Unknown user variable: " << udf->name.str;
gwip->parseErrorText = oss.str(); gwip->parseErrorText = oss.str();
gwip->fatalParseError = true; gwip->fatalParseError = true;
return; return false;
} }
if (udf->result_type() == STRING_RESULT) if (udf->result_type() == STRING_RESULT)
@ -956,8 +1034,10 @@ void buildPredicateItem(Item_func* ifp, gp_walk_info* gwip)
{ {
gwip->rcWorkStack.push(new ConstantColumn(buf.c_ptr(), ConstantColumn::NUM)); gwip->rcWorkStack.push(new ConstantColumn(buf.c_ptr(), ConstantColumn::NUM));
} }
return false;
} }
} }
#if 0
else if (ifp->functype() == Item_func::NEG_FUNC) else if (ifp->functype() == Item_func::NEG_FUNC)
{ {
//peek at the (hopefully) ConstantColumn on the top of stack, negate it in place //peek at the (hopefully) ConstantColumn on the top of stack, negate it in place
@ -978,14 +1058,15 @@ void buildPredicateItem(Item_func* ifp, gp_walk_info* gwip)
newval = "-" + cval; newval = "-" + cval;
ccp->constval(newval); ccp->constval(newval);
} }
#endif
else if (ifp->functype() == Item_func::NOT_FUNC) else if (ifp->functype() == Item_func::NOT_FUNC)
{ {
if (gwip->condPush && ifp->next->type() == Item::SUBSELECT_ITEM) if (gwip->condPush && ifp->next->type() == Item::SUBSELECT_ITEM)
return; return false;
if (ifp->next && ifp->next->type() == Item::SUBSELECT_ITEM && gwip->lastSub) if (ifp->next && ifp->next->type() == Item::SUBSELECT_ITEM && gwip->lastSub)
{ {
gwip->lastSub->handleNot(); gwip->lastSub->handleNot();
return; return false;
} }
idbassert(ifp->argument_count() == 1); idbassert(ifp->argument_count() == 1);
@ -1017,16 +1098,44 @@ void buildPredicateItem(Item_func* ifp, gp_walk_info* gwip)
rhs = buildReturnedColumn(ifp->arguments()[0], *gwip, gwip->fatalParseError); rhs = buildReturnedColumn(ifp->arguments()[0], *gwip, gwip->fatalParseError);
} }
if (rhs && !gwip->fatalParseError) if (rhs && !gwip->fatalParseError)
buildConstPredicate(ifp, rhs, gwip); return buildConstPredicate(ifp, rhs, gwip);
else if (!rhs) // @bug3802 else if (!rhs) // @bug3802
{ {
gwip->fatalParseError = true; gwip->fatalParseError = true;
gwip->parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_FILTER_COND_EXP); gwip->parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_FILTER_COND_EXP);
return; return false;
} }
} }
} }
else if (ifp->functype() == Item_func::MULT_EQUAL_FUNC)
{
#if 0 // MYSQL_5.6
Item_equal* item_eq = (Item_equal*)ifp;
// This code is for mysql 5.6. Need to convert to MariaDB 10.1
List_iterator_fast<Item_field> it(item_eq->fields);
idbassert(item_eq->fields.elements == 2);
// @todo handle more than 2 equal fields
Item *item_field = it++;
ReturnedColumn* lhs = buildReturnedColumn(item_field, *gwip, gwip->fatalParseError);
item_field = it++;
ReturnedColumn* rhs = buildReturnedColumn(item_field, *gwip, gwip->fatalParseError);
if (!rhs || !lhs)
{
gwip->fatalParseError = true;
gwip->parseErrorText = "Unsupport elements in MULT_EQUAL item";
delete rhs;
delete lhs;
return false;
}
PredicateOperator *po = new PredicateOperator("=");
boost::shared_ptr<Operator> sop(po);
sop->setOpType(lhs->resultType(), rhs->resultType());
SimpleFilter *sf = new SimpleFilter(sop, lhs, rhs);
ParseTree *pt = new ParseTree(sf);
gwip->ptWorkStack.push(pt);
#endif
}
else //std rel ops (incl "like") else //std rel ops (incl "like")
{ {
if (gwip->rcWorkStack.size() < 2) if (gwip->rcWorkStack.size() < 2)
@ -1040,7 +1149,7 @@ void buildPredicateItem(Item_func* ifp, gp_walk_info* gwip)
gwip->fatalParseError = true; gwip->fatalParseError = true;
gwip->parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_FILTER_COND_EXP); gwip->parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_FILTER_COND_EXP);
} }
return; return false;
} }
ReturnedColumn* rhs = gwip->rcWorkStack.top(); ReturnedColumn* rhs = gwip->rcWorkStack.top();
@ -1054,8 +1163,7 @@ void buildPredicateItem(Item_func* ifp, gp_walk_info* gwip)
if (rrhs && rlhs) if (rrhs && rlhs)
{ {
buildRowColumnFilter(gwip, rrhs, rlhs, ifp); return buildRowColumnFilter(gwip, rrhs, rlhs, ifp);
return;
} }
// push the column that is associated with the correlated column to the returned // push the column that is associated with the correlated column to the returned
@ -1125,7 +1233,7 @@ void buildPredicateItem(Item_func* ifp, gp_walk_info* gwip)
IDEBUG( cout << "deleted func with 2 const columns" << endl ); IDEBUG( cout << "deleted func with 2 const columns" << endl );
delete rhs; delete rhs;
delete lhs; delete lhs;
return; return false;
} }
// handle noop (only for table mode) // handle noop (only for table mode)
@ -1174,8 +1282,10 @@ void buildPredicateItem(Item_func* ifp, gp_walk_info* gwip)
} }
if (notInner) if (notInner)
{
lhs->returnAll(true); lhs->returnAll(true);
IDEBUG( cout << "setting returnAll on " << tan_lhs << endl); IDEBUG( cout << "setting returnAll on " << tan_lhs << endl);
}
} }
if (!gwip->innerTables.empty()) if (!gwip->innerTables.empty())
{ {
@ -1188,8 +1298,10 @@ void buildPredicateItem(Item_func* ifp, gp_walk_info* gwip)
} }
if (notInner) if (notInner)
{
rhs->returnAll(true); rhs->returnAll(true);
IDEBUG( cout << "setting returnAll on " << tan_rhs << endl ); IDEBUG( cout << "setting returnAll on " << tan_rhs << endl );
}
} }
ParseTree* ptp = new ParseTree(sf); ParseTree* ptp = new ParseTree(sf);
@ -1208,9 +1320,10 @@ void buildPredicateItem(Item_func* ifp, gp_walk_info* gwip)
gwip->ptWorkStack.push(ptp); gwip->ptWorkStack.push(ptp);
} }
} }
return true;
} }
void buildConstPredicate(Item_func* ifp, ReturnedColumn* rhs, gp_walk_info* gwip) bool buildConstPredicate(Item_func* ifp, ReturnedColumn* rhs, gp_walk_info* gwip)
{ {
SimpleFilter *sf = new SimpleFilter(); SimpleFilter *sf = new SimpleFilter();
boost::shared_ptr<Operator> sop(new PredicateOperator(ifp->func_name())); boost::shared_ptr<Operator> sop(new PredicateOperator(ifp->func_name()));
@ -1249,6 +1362,7 @@ void buildConstPredicate(Item_func* ifp, ReturnedColumn* rhs, gp_walk_info* gwip
sf->rhs(lhs); sf->rhs(lhs);
ParseTree* ptp = new ParseTree(sf); ParseTree* ptp = new ParseTree(sf);
gwip->ptWorkStack.push(ptp); gwip->ptWorkStack.push(ptp);
return true;
} }
SimpleColumn* buildSimpleColFromDerivedTable(gp_walk_info& gwi, Item_field* ifp) SimpleColumn* buildSimpleColFromDerivedTable(gp_walk_info& gwi, Item_field* ifp)
@ -1547,6 +1661,8 @@ void buildSubselectFunc(Item_func* ifp, gp_walk_info* gwip)
bool isPredicateFunction(Item* item, gp_walk_info* gwip) bool isPredicateFunction(Item* item, gp_walk_info* gwip)
{ {
if (item->type() == Item::COND_ITEM)
return true;
if (item->type() != Item::FUNC_ITEM) if (item->type() != Item::FUNC_ITEM)
return false; return false;
Item_func* ifp = (Item_func*)item; Item_func* ifp = (Item_func*)item;
@ -1566,8 +1682,8 @@ bool isPredicateFunction(Item* item, gp_walk_info* gwip)
ifp->functype() == Item_func::NOT_FUNC || ifp->functype() == Item_func::NOT_FUNC ||
ifp->functype() == Item_func::ISNOTNULLTEST_FUNC || ifp->functype() == Item_func::ISNOTNULLTEST_FUNC ||
ifp->functype() == Item_func::TRIG_COND_FUNC || ifp->functype() == Item_func::TRIG_COND_FUNC ||
string(ifp->func_name()) == "<in_optimizer>" || string(ifp->func_name()) == "<in_optimizer>"/* ||
string(ifp->func_name()) == "xor"); string(ifp->func_name()) == "xor"*/);
} }
void setError(THD* thd, uint32_t errcode, string errmsg) void setError(THD* thd, uint32_t errcode, string errmsg)
@ -2203,7 +2319,7 @@ ArithmeticColumn* buildArithmeticColumn(Item_func* item, gp_walk_info& gwi, bool
// decimal arithmetic operation gives double result when the session variable is set. // decimal arithmetic operation gives double result when the session variable is set.
//idbassert(pt->left() && pt->right() && pt->left()->data() && pt->right()->data()); //idbassert(pt->left() && pt->right() && pt->left()->data() && pt->right()->data());
CalpontSystemCatalog::ColType mysql_type = colType_MysqlToIDB(item); CalpontSystemCatalog::ColType mysql_type = colType_MysqlToIDB(item);
if (gwi.thd->variables.infinidb_double_for_decimal_math == 1) if (current_thd->variables.infinidb_double_for_decimal_math == 1)
aop->adjustResultType(mysql_type); aop->adjustResultType(mysql_type);
else else
aop->resultType(mysql_type); aop->resultType(mysql_type);
@ -2277,6 +2393,10 @@ ReturnedColumn* buildFunctionColumn(Item_func* ifp, gp_walk_info& gwi, bool& non
return rc; return rc;
} }
// TODO MariaDB 10.1: Until we figure out what to do with this
if (funcName == "multiple equal")
return NULL;
// Arithmetic exp // Arithmetic exp
if (funcName == "+" || funcName == "-" || funcName == "*" || funcName == "/" ) if (funcName == "+" || funcName == "-" || funcName == "*" || funcName == "/" )
{ {
@ -2341,6 +2461,7 @@ ReturnedColumn* buildFunctionColumn(Item_func* ifp, gp_walk_info& gwi, bool& non
// @todo non-support function as argument. need to do post process. Assume all support for now // @todo non-support function as argument. need to do post process. Assume all support for now
fc = new FunctionColumn(); fc = new FunctionColumn();
fc->data(funcName);
FunctionParm funcParms; FunctionParm funcParms;
SPTP sptp; SPTP sptp;
ClauseType clauseType = gwi.clauseType; ClauseType clauseType = gwi.clauseType;
@ -2368,7 +2489,7 @@ ReturnedColumn* buildFunctionColumn(Item_func* ifp, gp_walk_info& gwi, bool& non
} }
// special handling for function that takes a filter arguments, like if(). // special handling for function that takes a filter arguments, like if().
// @todo. merge this logic to buildParseTree(). // @todo. merge this logic to buildParseTree().
if (funcName == "if" && i == 0) if ((funcName == "if" && i == 0) || funcName == "xor")
{ {
// make sure the rcWorkStack is cleaned. // make sure the rcWorkStack is cleaned.
gwi.clauseType = WHERE; gwi.clauseType = WHERE;
@ -2383,7 +2504,8 @@ ReturnedColumn* buildFunctionColumn(Item_func* ifp, gp_walk_info& gwi, bool& non
continue; continue;
} }
// @bug 3039 // @bug 3039
if (isPredicateFunction(ifp->arguments()[i], &gwi) || ifp->arguments()[i]->with_subselect) //if (isPredicateFunction(ifp->arguments()[i], &gwi) || ifp->arguments()[i]->has_subquery())
if (ifp->arguments()[i]->has_subquery())
{ {
nonSupport = true; nonSupport = true;
gwi.fatalParseError = true; gwi.fatalParseError = true;
@ -2403,68 +2525,25 @@ ReturnedColumn* buildFunctionColumn(Item_func* ifp, gp_walk_info& gwi, bool& non
} }
else // where clause else // where clause
{ {
stack<SPTP> tmpPtStack;; stack<SPTP> tmpPtStack;
for (uint32_t i = 0; i < ifp->argument_count(); i++) for (int32_t i = ifp->argument_count(); i>0; i--)
{ {
if (funcName == "if" ) if (isPredicateFunction((ifp->arguments()[i]), &gwi) && !gwi.ptWorkStack.empty())
{ {
// bug5438 sptp.reset(gwi.ptWorkStack.top());
gwi.clauseType = SELECT; tmpPtStack.push(sptp);
if (i == 0) gwi.ptWorkStack.pop();
{ }
// @bug 2366. build item from arguments to avoid parm sequence complexity else if (!isPredicateFunction((ifp->arguments()[i]), &gwi) && !gwi.rcWorkStack.empty())
sptp.reset(buildParseTree((Item_func*)(ifp->arguments()[i]), gwi, nonSupport)); {
if (nonSupport) sptp.reset(new ParseTree(gwi.rcWorkStack.top()));
return NULL; tmpPtStack.push(sptp);
funcParms.push_back(sptp); gwi.rcWorkStack.pop();
if (!gwi.ptWorkStack.empty())
gwi.ptWorkStack.pop();
continue;
}
else
{
ReturnedColumn *rc = buildReturnedColumn(ifp->arguments()[i], gwi, nonSupport);
if (!rc || nonSupport)
{
nonSupport = true;
return NULL;
}
sptp.reset(new ParseTree(rc));
funcParms.push_back(sptp);
if (!gwi.rcWorkStack.empty())
gwi.rcWorkStack.pop();
}
gwi.clauseType = clauseType;
} }
else else
{ {
if (isPredicateFunction(ifp->arguments()[i], &gwi) || ifp->arguments()[i]->with_subselect) nonSupport = true;
{ return NULL;
nonSupport = true;
gwi.fatalParseError = true;
gwi.parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_SUB_EXPRESSION);
return NULL;
}
else
{
if (gwi.rcWorkStack.empty())
{
ReturnedColumn *rc = buildReturnedColumn(ifp->arguments()[i], gwi, nonSupport);
if (!rc || nonSupport)
{
nonSupport = true;
gwi.fatalParseError = true;
return NULL;
}
sptp.reset(new ParseTree(buildReturnedColumn(ifp->arguments()[i], gwi, nonSupport)));
}
else
{
sptp.reset(new ParseTree(gwi.rcWorkStack.top()));
gwi.rcWorkStack.pop();
}
}
tmpPtStack.push(sptp);
} }
} }
@ -2600,6 +2679,23 @@ ReturnedColumn* buildFunctionColumn(Item_func* ifp, gp_walk_info& gwi, bool& non
// MySQL give string result type for date function, but has the flag set. // MySQL give string result type for date function, but has the flag set.
// we should set the result type to be datetime for comparision. // we should set the result type to be datetime for comparision.
if (ifp->field_type() == MYSQL_TYPE_DATETIME ||
ifp->field_type() == MYSQL_TYPE_TIMESTAMP ||
funcName == "add_time")
{
CalpontSystemCatalog::ColType ct;
ct.colDataType = CalpontSystemCatalog::DATETIME;
ct.colWidth = 8;
fc->resultType(ct);
}
else if (ifp->field_type() == MYSQL_TYPE_DATE)
{
CalpontSystemCatalog::ColType ct;
ct.colDataType = CalpontSystemCatalog::DATE;
ct.colWidth = 4;
fc->resultType(ct);
}
#if 0
if (is_temporal_type_with_date(ifp->field_type())) if (is_temporal_type_with_date(ifp->field_type()))
{ {
CalpontSystemCatalog::ColType ct; CalpontSystemCatalog::ColType ct;
@ -2614,6 +2710,7 @@ ReturnedColumn* buildFunctionColumn(Item_func* ifp, gp_walk_info& gwi, bool& non
ct.colWidth = 4; ct.colWidth = 4;
fc->resultType(ct); fc->resultType(ct);
} }
#endif
fc->operationType(functor->operationType(funcParms, fc->resultType())); fc->operationType(functor->operationType(funcParms, fc->resultType()));
fc->expressionId(ci->expressionId++); fc->expressionId(ci->expressionId++);
@ -3002,10 +3099,11 @@ ParseTree* buildParseTree(Item_func* item, gp_walk_info& gwi, bool& nonSupport)
{ {
ParseTree* pt = 0; ParseTree* pt = 0;
Item_cond* icp = (Item_cond*)item; Item_cond* icp = (Item_cond*)item;
#ifdef DEBUG_WALK_COND
// debug // debug
//cout << "Build Parsetree: " << endl; cout << "Build Parsetree: " << endl;
//icp->traverse_cond(debug_walk, &gwi, Item::POSTFIX); icp->traverse_cond(debug_walk, &gwi, Item::POSTFIX);
#endif
//@bug5044. PPSTFIX walking should always be treated as WHERE clause filter //@bug5044. PPSTFIX walking should always be treated as WHERE clause filter
ClauseType clauseType = gwi.clauseType; ClauseType clauseType = gwi.clauseType;
gwi.clauseType = WHERE; gwi.clauseType = WHERE;
@ -3036,7 +3134,8 @@ ReturnedColumn* buildAggregateColumn(Item* item, gp_walk_info& gwi)
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);
Item_sum* isp = reinterpret_cast<Item_sum*>(item); Item_sum* isp = reinterpret_cast<Item_sum*>(item);
Item** sfitempp = isp->arguments(); Item** sfitempp = isp->get_orig_args();
// Item** sfitempp = isp->arguments();
SRCP parm; SRCP parm;
// @bug4756 // @bug4756
if (gwi.clauseType == SELECT) if (gwi.clauseType == SELECT)
@ -3105,7 +3204,7 @@ ReturnedColumn* buildAggregateColumn(Item* item, gp_walk_info& gwi)
{ {
rc = buildReturnedColumn(ord_col, gwi, gwi.fatalParseError); rc = buildReturnedColumn(ord_col, gwi, gwi.fatalParseError);
} }
rc->asc((*order_item)->asc); rc->asc((*order_item)->asc);
orderCols.push_back(SRCP(rc)); orderCols.push_back(SRCP(rc));
} }
@ -3481,14 +3580,22 @@ void gp_walk(const Item *item, void *arg)
{ {
gp_walk_info* gwip = reinterpret_cast<gp_walk_info*>(arg); gp_walk_info* gwip = reinterpret_cast<gp_walk_info*>(arg);
idbassert(gwip); idbassert(gwip);
bool isCached = false;
//Bailout... //Bailout...
if (gwip->fatalParseError) return; if (gwip->fatalParseError) return;
RecursionCounter r(gwip); // Increments and auto-decrements upon exit. RecursionCounter r(gwip); // Increments and auto-decrements upon exit.
Item::Type itype = item->type(); Item::Type itype = item->type();
if (itype == Item::FUNC_ITEM && string(((Item_func*)item)->func_name()) == "xor") //if (itype == Item::FUNC_ITEM && string(((Item_func*)item)->func_name()) == "xor")
itype = Item::COND_ITEM; // itype = Item::COND_ITEM;
if(item->type() == Item::CACHE_ITEM)
{
item = ((Item_cache*)item)->get_example();
itype = item->type();
isCached = true;
}
switch (itype) switch (itype)
{ {
@ -3586,12 +3693,12 @@ void gp_walk(const Item *item, void *arg)
if (!gwip->condPush) if (!gwip->condPush)
{ {
if (ifp->with_subselect || funcName == "<in_optimizer>") if (ifp->has_subquery() || funcName == "<in_optimizer>")
{ {
buildSubselectFunc(ifp, gwip); buildSubselectFunc(ifp, gwip);
return; return;
} }
if (ifp->arguments() && ifp->argument_count() > 0) if (ifp->argument_count() > 0 && ifp->arguments())
{ {
for (uint32_t i = 0; i < ifp->argument_count(); i++) for (uint32_t i = 0; i < ifp->argument_count(); i++)
{ {
@ -3645,7 +3752,8 @@ void gp_walk(const Item *item, void *arg)
!(parseInfo & SUB_BIT) && !(parseInfo & SUB_BIT) &&
!nonConstFunc(ifp) && !nonConstFunc(ifp) &&
!(parseInfo & AF_BIT) && !(parseInfo & AF_BIT) &&
tmpVec.size() == 0) tmpVec.size() == 0 &&
ifp->functype() != Item_func::MULT_EQUAL_FUNC)
{ {
String val, *str = ifp->val_str(&val); String val, *str = ifp->val_str(&val);
@ -3668,11 +3776,14 @@ void gp_walk(const Item *item, void *arg)
cc->resultType(colType_MysqlToIDB(item)); cc->resultType(colType_MysqlToIDB(item));
} }
for (uint32_t i = 0; i < ifp->argument_count() && !gwip->rcWorkStack.empty(); i++) // cached item comes in one piece
if (!isCached)
{ {
gwip->rcWorkStack.pop(); for (uint32_t i = 0; i < ifp->argument_count() && !gwip->rcWorkStack.empty(); i++)
{
gwip->rcWorkStack.pop();
}
} }
// bug 3137. If filter constant like 1=0, put it to ptWorkStack // bug 3137. If filter constant like 1=0, put it to ptWorkStack
// MariaDB bug 750. Breaks if compare is an argument to a function. // MariaDB bug 750. Breaks if compare is an argument to a function.
if ((int32_t)gwip->rcWorkStack.size() <= (gwip->rcBookMarkStack.empty() ? 0 : gwip->rcBookMarkStack.top()) if ((int32_t)gwip->rcWorkStack.size() <= (gwip->rcBookMarkStack.empty() ? 0 : gwip->rcBookMarkStack.top())
@ -3974,6 +4085,48 @@ void gp_walk(const Item *item, void *arg)
gwip->rcWorkStack.push(af); gwip->rcWorkStack.push(af);
break; break;
} }
case Item::COPY_STR_ITEM:
printf("********** received COPY_STR_ITEM *********");
break;
case Item::FIELD_AVG_ITEM:
printf("********** received FIELD_AVG_ITEM *********");
break;
case Item::DEFAULT_VALUE_ITEM:
printf("********** received DEFAULT_VALUE_ITEM *********");
break;
case Item::PROC_ITEM:
printf("********** received PROC_ITEM *********");
break;
case Item::FIELD_STD_ITEM:
printf("********** received FIELD_STD_ITEM *********");
break;
case Item::FIELD_VARIANCE_ITEM:
printf("********** received FIELD_VARIANCE_ITEM *********");
break;
case Item::INSERT_VALUE_ITEM:
printf("********** received INSERT_VALUE_ITEM *********");
break;
case Item::Item::TYPE_HOLDER:
printf("********** received TYPE_HOLDER *********");
break;
case Item::PARAM_ITEM:
printf("********** received PARAM_ITEM *********");
break;
case Item::TRIGGER_FIELD_ITEM:
printf("********** received TRIGGER_FIELD_ITEM *********");
break;
case Item::XPATH_NODESET:
printf("********** received XPATH_NODESET *********");
break;
case Item::XPATH_NODESET_CMP:
printf("********** received XPATH_NODESET_CMP *********");
break;
case Item::VIEW_FIXER_ITEM:
printf("********** received VIEW_FIXER_ITEM *********");
break;
case Item::DATE_ITEM:
printf("********** received DATE_ITEM *********");
break;
default: default:
{ {
if (gwip->condPush) if (gwip->condPush)
@ -4029,7 +4182,8 @@ void parse_item (Item *item, vector<Item_field*>& field_vec, bool& hasNonSupport
} }
Item** sfitempp = isp->arguments(); Item** sfitempp = isp->arguments();
for (uint32_t i = 0; i < isp->argument_count(); i++) for (uint32_t i = 0; i < isp->argument_count(); i++)
parse_item(sfitempp[i], field_vec, hasNonSupportItem, parseInfo); parse_item(isp->arguments()[i], field_vec, hasNonSupportItem, parseInfo);
// parse_item(sfitempp[i], field_vec, hasNonSupportItem, parseInfo);
break; break;
} }
case Item::COND_ITEM: case Item::COND_ITEM:
@ -4223,6 +4377,16 @@ int getSelectPlan(gp_walk_info& gwi, SELECT_LEX& select_lex, SCSEP& csep, bool i
TABLE_LIST* table_ptr = select_lex.get_table_list(); TABLE_LIST* table_ptr = select_lex.get_table_list();
CalpontSelectExecutionPlan::SelectList derivedTbList; CalpontSelectExecutionPlan::SelectList derivedTbList;
// DEBUG
#ifdef DEBUG_WALK_COND
List_iterator<TABLE_LIST> sj_list_it(select_lex.sj_nests);
TABLE_LIST *sj_nest;
while ((sj_nest= sj_list_it++))
{
cout << sj_nest->db << "." << sj_nest->table_name << endl;
}
#endif
// @bug 1796. Remember table order on the FROM list. // @bug 1796. Remember table order on the FROM list.
gwi.clauseType = FROM; gwi.clauseType = FROM;
try { try {
@ -4248,6 +4412,12 @@ int getSelectPlan(gp_walk_info& gwi, SELECT_LEX& select_lex, SCSEP& csep, bool i
// @todo process from subquery // @todo process from subquery
if (table_ptr->derived) if (table_ptr->derived)
{ {
//cout << "DERIVED TABLE DEBUG" << endl;
//String str;
//(table_ptr->derived->first_select())->print(gwi.thd, &str, QT_INFINIDB_DERIVED);
//cout << str.ptr() << endl;
//cout << "DERIVED TABLE DEBUG END" << endl;
SELECT_LEX *select_cursor = table_ptr->derived->first_select(); SELECT_LEX *select_cursor = table_ptr->derived->first_select();
FromSubQuery fromSub(gwi, select_cursor); FromSubQuery fromSub(gwi, select_cursor);
string alias(table_ptr->alias); string alias(table_ptr->alias);
@ -4298,6 +4468,9 @@ int getSelectPlan(gp_walk_info& gwi, SELECT_LEX& select_lex, SCSEP& csep, bool i
gwi.tbList.push_back(tn); gwi.tbList.push_back(tn);
CalpontSystemCatalog::TableAliasName tan = make_aliastable(table_ptr->db, table_name, table_ptr->alias, infiniDB); CalpontSystemCatalog::TableAliasName tan = make_aliastable(table_ptr->db, table_name, table_ptr->alias, infiniDB);
gwi.tableMap[tan] = make_pair(0,table_ptr); gwi.tableMap[tan] = make_pair(0,table_ptr);
#ifdef DEBUG_WALK_COND
cout << tn << endl;
#endif
} }
} }
if (gwi.fatalParseError) if (gwi.fatalParseError)
@ -4426,23 +4599,30 @@ int getSelectPlan(gp_walk_info& gwi, SELECT_LEX& select_lex, SCSEP& csep, bool i
return ER_CHECK_NOT_IMPLEMENTED; return ER_CHECK_NOT_IMPLEMENTED;
} }
} }
else if (join && join->zero_result_cause)
{
gwi.rcWorkStack.push(new ConstantColumn((int64_t)0, ConstantColumn::NUM));
}
// ZZ - the followinig debug shows the structure of nested outer join. should // ZZ - the followinig debug shows the structure of nested outer join. should
// use a recursive function. // use a recursive function.
#ifdef OUTER_JOIN_DEBUG #ifdef OUTER_JOIN_DEBUG
List<TABLE_LIST> *tables = &(select_lex.top_join_list); List<TABLE_LIST> *tables = &(select_lex.top_join_list);
List_iterator_fast<TABLE_LIST> ti(*tables); List_iterator_fast<TABLE_LIST> ti(*tables);
TABLE_LIST *inner; //TABLE_LIST *inner;
TABLE_LIST **table= (TABLE_LIST **)gwi.thd->alloc(sizeof(TABLE_LIST*) * tables->elements); //TABLE_LIST **table= (TABLE_LIST **)gwi.thd->alloc(sizeof(TABLE_LIST*) * tables->elements);
for (TABLE_LIST **t= table + (tables->elements - 1); t >= table; t--) //for (TABLE_LIST **t= table + (tables->elements - 1); t >= table; t--)
*t= ti++; // *t= ti++;
DBUG_ASSERT(tables->elements >= 1); //DBUG_ASSERT(tables->elements >= 1);
TABLE_LIST **end= table + tables->elements; //TABLE_LIST **end= table + tables->elements;
for (TABLE_LIST **tbl= table; tbl < end; tbl++) //for (TABLE_LIST **tbl= table; tbl < end; tbl++)
{ TABLE_LIST *curr;
TABLE_LIST *curr= *tbl; while ((curr= ti++))
{
TABLE_LIST *curr= *tbl;
if (curr->table_name) if (curr->table_name)
cout << curr->table_name << " "; cout << curr->table_name << " ";
else else
@ -4466,20 +4646,21 @@ int getSelectPlan(gp_walk_info& gwi, SELECT_LEX& select_lex, SCSEP& csep, bool i
{ {
TABLE_LIST *curr1= *tb; TABLE_LIST *curr1= *tb;
cout << curr1->alias << endl; cout << curr1->alias << endl;
if (curr1->on_expr) if (curr1->sj_on_expr)
{ {
curr1->on_expr->traverse_cond(debug_walk, &gwi, Item::POSTFIX); curr1->sj_on_expr->traverse_cond(debug_walk, &gwi, Item::POSTFIX);
} }
} }
} }
if (curr->on_expr) if (curr->sj_on_expr)
{ {
curr->on_expr->traverse_cond(debug_walk, &gwi, Item::POSTFIX); curr->sj_on_expr->traverse_cond(debug_walk, &gwi, Item::POSTFIX);
} }
} }
#endif #endif
uint32_t failed = buildOuterJoin(gwi, select_lex); uint32_t failed = buildOuterJoin(gwi, select_lex);
if (failed) return failed;
// @bug5764. build outer join for view, make sure outerjoin filter is appended // @bug5764. build outer join for view, make sure outerjoin filter is appended
// to the end of the filter list. // to the end of the filter list.
@ -4498,7 +4679,9 @@ int getSelectPlan(gp_walk_info& gwi, SELECT_LEX& select_lex, SCSEP& csep, bool i
// @bug 2932. for "select * from region where r_name" case. if icp not null and // @bug 2932. for "select * from region where r_name" case. if icp not null and
// ptWorkStack empty, the item is in rcWorkStack. // ptWorkStack empty, the item is in rcWorkStack.
if (icp && gwi.ptWorkStack.empty() && !gwi.rcWorkStack.empty()) // MySQL 5.6 (MariaDB?). when icp is null and zero_result_cause is set, a constant 0
// is pushed to rcWorkStack.
if (/*icp && */gwi.ptWorkStack.empty() && !gwi.rcWorkStack.empty())
{ {
filters = new ParseTree(gwi.rcWorkStack.top()); filters = new ParseTree(gwi.rcWorkStack.top());
gwi.rcWorkStack.pop(); gwi.rcWorkStack.pop();
@ -4680,7 +4863,7 @@ int getSelectPlan(gp_walk_info& gwi, SELECT_LEX& select_lex, SCSEP& csep, bool i
vector <Item_field*> tmpVec; vector <Item_field*> tmpVec;
bool hasNonSupportItem = false; bool hasNonSupportItem = false;
parse_item(ifp, tmpVec, hasNonSupportItem, parseInfo); parse_item(ifp, tmpVec, hasNonSupportItem, parseInfo);
if (ifp->with_subselect || if (ifp->has_subquery() ||
string(ifp->func_name()) == string("<in_optimizer>") || string(ifp->func_name()) == string("<in_optimizer>") ||
ifp->functype() == Item_func::NOT_ALL_FUNC || ifp->functype() == Item_func::NOT_ALL_FUNC ||
parseInfo & SUB_BIT) parseInfo & SUB_BIT)
@ -5442,7 +5625,7 @@ int getSelectPlan(gp_walk_info& gwi, SELECT_LEX& select_lex, SCSEP& csep, bool i
{ {
Item* ord_item = *(ordercol->item); Item* ord_item = *(ordercol->item);
// ignore not_used column on order by. // ignore not_used column on order by.
if (ord_item->type() == Item::INT_ITEM && ord_item->name && string(ord_item->name) == "Not_used") if (ord_item->type() == Item::INT_ITEM && ord_item->full_name() && string(ord_item->full_name()) == "Not_used")
continue; continue;
else if (ord_item->type() == Item::INT_ITEM) else if (ord_item->type() == Item::INT_ITEM)
rc = gwi.returnedCols[((Item_int*)ord_item)->val_int()-1]->clone(); rc = gwi.returnedCols[((Item_int*)ord_item)->val_int()-1]->clone();
@ -5637,19 +5820,22 @@ int getSelectPlan(gp_walk_info& gwi, SELECT_LEX& select_lex, SCSEP& csep, bool i
{ {
Item_field *field = reinterpret_cast<Item_field*>(ord_item); Item_field *field = reinterpret_cast<Item_field*>(ord_item);
ReturnedColumn *rc = buildSimpleColumn(field, gwi); ReturnedColumn *rc = buildSimpleColumn(field, gwi);
if (field->db_name) fullname = field->full_name();
fullname += string(field->db_name) + "."; // if (field->db_name)
if (field->table_name) // fullname += string(field->db_name) + ".";
fullname += string(field->table_name) + "."; // if (field->table_name)
if (field->field_name) // fullname += string(field->table_name) + ".";
fullname += string(field->field_name); // if (field->field_name)
// fullname += string(field->field_name);
for (uint32_t i = 0; i < gwi.returnedCols.size(); i++) for (uint32_t i = 0; i < gwi.returnedCols.size(); i++)
{ {
SimpleColumn* sc = dynamic_cast<SimpleColumn*>(gwi.returnedCols[i].get()); SimpleColumn* sc = dynamic_cast<SimpleColumn*>(gwi.returnedCols[i].get());
if (sc && ((Item_field*)ord_item)->cached_table && if (sc && ((Item_field*)ord_item)->cached_table &&
(strcasecmp(getViewName(((Item_field*)ord_item)->cached_table).c_str(), sc->viewName().c_str()) != 0)) (strcasecmp(getViewName(((Item_field*)ord_item)->cached_table).c_str(), sc->viewName().c_str()) != 0))
{
continue; continue;
}
if (strcasecmp(fullname.c_str(),gwi.returnedCols[i]->alias().c_str()) == 0 || if (strcasecmp(fullname.c_str(),gwi.returnedCols[i]->alias().c_str()) == 0 ||
strcasecmp(ord_item->name,gwi.returnedCols[i]->alias().c_str()) == 0) strcasecmp(ord_item->name,gwi.returnedCols[i]->alias().c_str()) == 0)
{ {

View File

@ -656,7 +656,6 @@ int fetchNextRow(uchar *buf, cal_table_info& ti, cal_connection_info* ci)
ti.c = 0; ti.c = 0;
ti.moreRows = false; ti.moreRows = false;
rc = HA_ERR_END_OF_FILE; rc = HA_ERR_END_OF_FILE;
current_thd->infinidb_vtable.has_limit = true;
ci->rc = rc; ci->rc = rc;
} }
else else
@ -773,8 +772,10 @@ uint32_t doUpdateDelete(THD *thd)
ci->stats.reset(); ci->stats.reset();
ci->stats.setStartTime(); ci->stats.setStartTime();
ci->stats.fUser = thd->main_security_ctx.user; ci->stats.fUser = thd->main_security_ctx.user;
if (thd->main_security_ctx.host) // if (thd->main_security_ctx.host)
ci->stats.fHost = thd->main_security_ctx.host; // ci->stats.fHost = thd->main_security_ctx.host;
if (thd->main_security_ctx.get_host())
ci->stats.fHost = thd->main_security_ctx.get_host()->c_ptr();
else if (thd->main_security_ctx.host_or_ip) else if (thd->main_security_ctx.host_or_ip)
ci->stats.fHost = thd->main_security_ctx.host_or_ip; ci->stats.fHost = thd->main_security_ctx.host_or_ip;
else else
@ -828,7 +829,8 @@ uint32_t doUpdateDelete(THD *thd)
} }
// @bug 1127. Re-construct update stmt using lex instead of using the original query. // @bug 1127. Re-construct update stmt using lex instead of using the original query.
string dmlStmt=""; // string dmlStmt="";
string dmlStmt=string(idb_mysql_query_str(thd));
string schemaName; string schemaName;
string tableName(""); string tableName("");
string aliasName(""); string aliasName("");
@ -844,27 +846,27 @@ uint32_t doUpdateDelete(THD *thd)
{ {
ColumnAssignment* columnAssignmentPtr; ColumnAssignment* columnAssignmentPtr;
Item_field *item; Item_field *item;
TABLE_LIST* table_ptr = thd->lex->select_lex.get_table_list(); // TABLE_LIST* table_ptr = thd->lex->select_lex.get_table_list();
List_iterator_fast<Item> field_it(thd->lex->select_lex.item_list); List_iterator_fast<Item> field_it(thd->lex->select_lex.item_list);
List_iterator_fast<Item> value_it(thd->lex->value_list); List_iterator_fast<Item> value_it(thd->lex->value_list);
dmlStmt += "update "; // dmlStmt += "update ";
updateCP->queryType(CalpontSelectExecutionPlan::UPDATE); updateCP->queryType(CalpontSelectExecutionPlan::UPDATE);
ci->stats.fQueryType = updateCP->queryType(); ci->stats.fQueryType = updateCP->queryType();
uint32_t cnt = 0; uint32_t cnt = 0;
for (; table_ptr; table_ptr= table_ptr->next_local) // for (; table_ptr; table_ptr= table_ptr->next_local)
{ // {
dmlStmt += string(table_ptr->table_name); // dmlStmt += string(table_ptr->table_name);
if (table_ptr->next_local) // if (table_ptr->next_local)
dmlStmt += ", "; // dmlStmt += ", ";
} // }
dmlStmt += " set "; // dmlStmt += " set ";
while ((item= (Item_field *) field_it++)) while ((item= (Item_field *) field_it++))
{ {
cnt++; cnt++;
dmlStmt += string(item->name) + "="; // dmlStmt += string(item->name) + "=";
string tmpTableName = bestTableName(item); string tmpTableName = bestTableName(item);
@ -913,7 +915,7 @@ uint32_t doUpdateDelete(THD *thd)
//@Bug 2587 use val_str to replace value->name to get rid of 255 limit //@Bug 2587 use val_str to replace value->name to get rid of 255 limit
String val, *str; String val, *str;
str = value->val_str(&val); str = value->val_str(&val);
dmlStmt += "'" + string(str->c_ptr()) + "'"; // dmlStmt += "'" + string(str->c_ptr()) + "'";
columnAssignmentPtr->fScalarExpression = string(str->c_ptr()) ; columnAssignmentPtr->fScalarExpression = string(str->c_ptr()) ;
columnAssignmentPtr->fFromCol = false; columnAssignmentPtr->fFromCol = false;
} }
@ -921,7 +923,7 @@ uint32_t doUpdateDelete(THD *thd)
{ {
String val, *str; String val, *str;
str = value->val_str(&val); str = value->val_str(&val);
dmlStmt += "'" + string(str->c_ptr()) + "'"; // dmlStmt += "'" + string(str->c_ptr()) + "'";
columnAssignmentPtr->fScalarExpression = string(str->c_ptr()) ; columnAssignmentPtr->fScalarExpression = string(str->c_ptr()) ;
columnAssignmentPtr->fFromCol = false; columnAssignmentPtr->fFromCol = false;
} }
@ -995,7 +997,7 @@ uint32_t doUpdateDelete(THD *thd)
{ {
oss << value->val_int(); oss << value->val_int();
} }
dmlStmt += oss.str(); // dmlStmt += oss.str();
columnAssignmentPtr->fScalarExpression = oss.str(); columnAssignmentPtr->fScalarExpression = oss.str();
columnAssignmentPtr->fFromCol = false; columnAssignmentPtr->fFromCol = false;
} }
@ -1020,21 +1022,21 @@ uint32_t doUpdateDelete(THD *thd)
} }
else if ( value->type() == Item::NULL_ITEM ) else if ( value->type() == Item::NULL_ITEM )
{ {
dmlStmt += "NULL"; // dmlStmt += "NULL";
columnAssignmentPtr->fScalarExpression = "NULL"; columnAssignmentPtr->fScalarExpression = "NULL";
columnAssignmentPtr->fFromCol = false; columnAssignmentPtr->fFromCol = false;
} }
else if ( value->type() == Item::SUBSELECT_ITEM ) else if ( value->type() == Item::SUBSELECT_ITEM )
{ {
isFromCol = true; // isFromCol = true;
columnAssignmentPtr->fFromCol = true; // columnAssignmentPtr->fFromCol = true;
Item_field* setIt = reinterpret_cast<Item_field*> (value); // Item_field* setIt = reinterpret_cast<Item_field*> (value);
string sectableName = string(setIt->table_name); // string sectableName = string(setIt->table_name);
string secschemaName = string(setIt->db_name); // string secschemaName = string(setIt->db_name);
if ( (strcasecmp(tableName.c_str(), sectableName.c_str()) != 0) || (strcasecmp(schemaName.c_str(), secschemaName.c_str()) != 0)) // if ( (strcasecmp(tableName.c_str(), sectableName.c_str()) != 0) || (strcasecmp(schemaName.c_str(), secschemaName.c_str()) != 0))
{ // {
isFromSameTable = false; isFromSameTable = false;
} // }
} }
//@Bug 4449 handle default value //@Bug 4449 handle default value
else if (value->type() == Item::DEFAULT_VALUE_ITEM) else if (value->type() == Item::DEFAULT_VALUE_ITEM)
@ -1043,7 +1045,7 @@ uint32_t doUpdateDelete(THD *thd)
if (!tmp->field_name) //null if (!tmp->field_name) //null
{ {
dmlStmt += "NULL"; // dmlStmt += "NULL";
columnAssignmentPtr->fScalarExpression = "NULL"; columnAssignmentPtr->fScalarExpression = "NULL";
columnAssignmentPtr->fFromCol = false; columnAssignmentPtr->fFromCol = false;
} }
@ -1051,7 +1053,7 @@ uint32_t doUpdateDelete(THD *thd)
{ {
String val, *str; String val, *str;
str = value->val_str(&val); str = value->val_str(&val);
dmlStmt += string(str->c_ptr()); // dmlStmt += string(str->c_ptr());
columnAssignmentPtr->fScalarExpression = string(str->c_ptr()); columnAssignmentPtr->fScalarExpression = string(str->c_ptr());
columnAssignmentPtr->fFromCol = false; columnAssignmentPtr->fFromCol = false;
} }
@ -1069,26 +1071,26 @@ uint32_t doUpdateDelete(THD *thd)
str = value->val_str(&val); str = value->val_str(&val);
if (str) if (str)
{ {
dmlStmt += string(str->c_ptr()); // dmlStmt += string(str->c_ptr());
columnAssignmentPtr->fScalarExpression = string(str->c_ptr()); columnAssignmentPtr->fScalarExpression = string(str->c_ptr());
columnAssignmentPtr->fFromCol = false; columnAssignmentPtr->fFromCol = false;
} }
else else
{ {
dmlStmt += "NULL"; // dmlStmt += "NULL";
columnAssignmentPtr->fScalarExpression = "NULL"; columnAssignmentPtr->fScalarExpression = "NULL";
columnAssignmentPtr->fFromCol = false; columnAssignmentPtr->fFromCol = false;
} }
} }
colAssignmentListPtr->push_back ( columnAssignmentPtr ); colAssignmentListPtr->push_back ( columnAssignmentPtr );
if (cnt < thd->lex->select_lex.item_list.elements) // if (cnt < thd->lex->select_lex.item_list.elements)
dmlStmt += ", "; // dmlStmt += ", ";
} }
} }
else else
{ {
dmlStmt = string(idb_mysql_query_str(thd)); // dmlStmt = string(idb_mysql_query_str(thd));
updateCP->queryType(CalpontSelectExecutionPlan::DELETE); updateCP->queryType(CalpontSelectExecutionPlan::DELETE);
ci->stats.fQueryType = updateCP->queryType(); ci->stats.fQueryType = updateCP->queryType();
} }
@ -1126,7 +1128,7 @@ uint32_t doUpdateDelete(THD *thd)
ci->tableOid = roPair.objnum; ci->tableOid = roPair.objnum;
CalpontDMLPackage* pDMLPackage = 0; CalpontDMLPackage* pDMLPackage = 0;
dmlStmt += ";"; // dmlStmt += ";";
IDEBUG( cout << "STMT: " << dmlStmt << " and sessionID " << thd->thread_id << endl ); IDEBUG( cout << "STMT: " << dmlStmt << " and sessionID " << thd->thread_id << endl );
VendorDMLStatement dmlStatement(dmlStmt, sessionID); VendorDMLStatement dmlStatement(dmlStmt, sessionID);
if (( (thd->lex)->sql_command == SQLCOM_UPDATE ) || ( (thd->lex)->sql_command == SQLCOM_UPDATE_MULTI ) ) if (( (thd->lex)->sql_command == SQLCOM_UPDATE ) || ( (thd->lex)->sql_command == SQLCOM_UPDATE_MULTI ) )
@ -1314,14 +1316,6 @@ uint32_t doUpdateDelete(THD *thd)
} }
if ( notFirst ) if ( notFirst )
{ {
//error out for now. Wait for scalar join.
/* Message::Args args;
string emsg(IDBErrorInfo::instance()->errorMsg(ERR_COLUMN_EQ_DIFFTABLE_COLUMN, args));
thd->raise_error_printf(ER_INTERNAL_ERROR, emsg.c_str());
ci->rc = 1;
thd->set_row_count_func(0);
return 0;
*/
CalpontSystemCatalog::TableAliasName tn = make_aliastable(schemaName, tableName, aliasName); CalpontSystemCatalog::TableAliasName tn = make_aliastable(schemaName, tableName, aliasName);
iter = tbList.begin(); iter = tbList.begin();
tbList.insert( iter, 1, tn ); tbList.insert( iter, 1, tn );
@ -1669,7 +1663,7 @@ uint32_t doUpdateDelete(THD *thd)
} }
else else
{ {
if (dmlRowCount != 0) //Bug 5117. Handling self join. // if (dmlRowCount != 0) //Bug 5117. Handling self join.
thd->set_row_count_func(dmlRowCount); thd->set_row_count_func(dmlRowCount);
@ -2433,6 +2427,12 @@ int ha_calpont_impl_rnd_init(TABLE* table)
idbassert(ci != 0); idbassert(ci != 0);
// MySQL sometimes calls rnd_init multiple times, plan should only be
// generated and sent once.
if (thd->infinidb_vtable.vtable_state == THD::INFINIDB_CREATE_VTABLE &&
!thd->infinidb_vtable.isNewQuery)
return 0;
if(thd->killed == KILL_QUERY || thd->killed == KILL_QUERY_HARD) if(thd->killed == KILL_QUERY || thd->killed == KILL_QUERY_HARD)
{ {
if (ci->cal_conn_hndl) if (ci->cal_conn_hndl)
@ -2450,7 +2450,6 @@ int ha_calpont_impl_rnd_init(TABLE* table)
sm::sm_cleanup(ci->cal_conn_hndl); sm::sm_cleanup(ci->cal_conn_hndl);
ci->cal_conn_hndl = 0; ci->cal_conn_hndl = 0;
} }
thd->infinidb_vtable.has_limit = false;
return 0; return 0;
} }
@ -2545,8 +2544,10 @@ int ha_calpont_impl_rnd_init(TABLE* table)
ci->stats.reset(); // reset query stats ci->stats.reset(); // reset query stats
ci->stats.setStartTime(); ci->stats.setStartTime();
ci->stats.fUser = thd->main_security_ctx.user; ci->stats.fUser = thd->main_security_ctx.user;
if (thd->main_security_ctx.host) // if (thd->main_security_ctx.host)
ci->stats.fHost = thd->main_security_ctx.host; // ci->stats.fHost = thd->main_security_ctx.host;
if (thd->main_security_ctx.get_host())
ci->stats.fHost = thd->main_security_ctx.get_host()->c_ptr();
else if (thd->main_security_ctx.host_or_ip) else if (thd->main_security_ctx.host_or_ip)
ci->stats.fHost = thd->main_security_ctx.host_or_ip; ci->stats.fHost = thd->main_security_ctx.host_or_ip;
else else
@ -2558,7 +2559,6 @@ int ha_calpont_impl_rnd_init(TABLE* table)
string msg = string("InfiniDB User Priority - ") + e.what(); string msg = string("InfiniDB User Priority - ") + e.what();
ci->warningMsg = msg; ci->warningMsg = msg;
} }
thd->infinidb_vtable.has_limit = false;
// if the previous query has error, re-establish the connection // if the previous query has error, re-establish the connection
if (ci->queryState != 0) if (ci->queryState != 0)
@ -2753,6 +2753,11 @@ int ha_calpont_impl_rnd_init(TABLE* table)
} }
} }
// set query state to be in_process. Sometimes mysql calls rnd_init multiple
// times, this makes sure plan only being generated and sent once. It will be
// reset when query finishes in sm::end_query
thd->infinidb_vtable.isNewQuery = false;
// common path for both vtable select phase and table mode -- open scan handle // common path for both vtable select phase and table mode -- open scan handle
ti = ci->tableMap[table]; ti = ci->tableMap[table];
ti.msTablePtr = table; ti.msTablePtr = table;
@ -2904,7 +2909,6 @@ int ha_calpont_impl_rnd_next(uchar *buf, TABLE* table)
sm::sm_cleanup(ci->cal_conn_hndl); sm::sm_cleanup(ci->cal_conn_hndl);
ci->cal_conn_hndl = 0; ci->cal_conn_hndl = 0;
} }
thd->infinidb_vtable.has_limit = false;
return 0; return 0;
} }
@ -2916,13 +2920,6 @@ int ha_calpont_impl_rnd_next(uchar *buf, TABLE* table)
if (!ti.tpl_ctx || !ti.tpl_scan_ctx) if (!ti.tpl_ctx || !ti.tpl_scan_ctx)
{ {
// @bug 2135. Changed wording of error message below. If error already
// set, do not reset.
if (!thd->get_stmt_da()->is_error())
{
string emsg = "Cannot open table handle for " + string(table->s->table_name.str) + ".";
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;
} }
@ -3017,7 +3014,6 @@ int ha_calpont_impl_rnd_end(TABLE* table)
} }
sm::sm_cleanup(ci->cal_conn_hndl); sm::sm_cleanup(ci->cal_conn_hndl);
ci->cal_conn_hndl = 0; ci->cal_conn_hndl = 0;
thd->infinidb_vtable.has_limit = false; // prevent connection re-established
return rc; return rc;
} }
} }
@ -3052,7 +3048,6 @@ int ha_calpont_impl_rnd_end(TABLE* table)
// clear querystats because no query stats available for cancelled query // clear querystats because no query stats available for cancelled query
ci->queryStats = ""; ci->queryStats = "";
} }
thd->infinidb_vtable.has_limit = false;
return 0; return 0;
} }
@ -3174,13 +3169,6 @@ int ha_calpont_impl_delete_table(const char *name)
TABLE_LIST *first_table= (TABLE_LIST*) thd->lex->select_lex.table_list.first; TABLE_LIST *first_table= (TABLE_LIST*) thd->lex->select_lex.table_list.first;
// should never get in here
if (!first_table)
{
setError(thd, ER_INTERNAL_ERROR, "Null table pointer detected when dropping table");
return 1;
}
if (!ci) return 0; if (!ci) return 0;
//@Bug 1948,2306. if alter table want to drop the old table, InfiniDB does not need to drop. //@Bug 1948,2306. if alter table want to drop the old table, InfiniDB does not need to drop.
@ -3420,10 +3408,10 @@ void ha_calpont_impl_start_bulk_insert(ha_rows rows, TABLE* table)
ci->mysqld_pid = getpid(); ci->mysqld_pid = getpid();
//get delimiter //get delimiter
if (char(thd->variables.infinidb_import_for_batchinsert_delimiter) != '\7') if (char(thd->variables.infinidb_import_for_batchinsert_delimiter) != '\007')
ci->delimiter = char(thd->variables.infinidb_import_for_batchinsert_delimiter); ci->delimiter = char(thd->variables.infinidb_import_for_batchinsert_delimiter);
else else
ci->delimiter = '\7'; ci->delimiter = '\007';
//get enclosed by //get enclosed by
if (char(thd->variables.infinidb_import_for_batchinsert_enclosed_by) != 8) if (char(thd->variables.infinidb_import_for_batchinsert_enclosed_by) != 8)
ci->enclosed_by = char(thd->variables.infinidb_import_for_batchinsert_enclosed_by); ci->enclosed_by = char(thd->variables.infinidb_import_for_batchinsert_enclosed_by);
@ -3734,8 +3722,10 @@ void ha_calpont_impl_start_bulk_insert(ha_rows rows, TABLE* table)
ci->stats.reset(); ci->stats.reset();
ci->stats.setStartTime(); ci->stats.setStartTime();
ci->stats.fUser = thd->main_security_ctx.user; ci->stats.fUser = thd->main_security_ctx.user;
if (thd->main_security_ctx.host) // if (thd->main_security_ctx.host)
ci->stats.fHost = thd->main_security_ctx.host; // ci->stats.fHost = thd->main_security_ctx.host;
if (thd->main_security_ctx.get_host())
ci->stats.fHost = thd->main_security_ctx.get_host()->c_ptr();
else if (thd->main_security_ctx.host_or_ip) else if (thd->main_security_ctx.host_or_ip)
ci->stats.fHost = thd->main_security_ctx.host_or_ip; ci->stats.fHost = thd->main_security_ctx.host_or_ip;
else else
@ -4017,6 +4007,12 @@ int ha_calpont_impl_end_bulk_insert(bool abort, TABLE* table)
int ha_calpont_impl_commit (handlerton *hton, THD *thd, bool all) int ha_calpont_impl_commit (handlerton *hton, THD *thd, bool all)
{ {
if (thd->infinidb_vtable.vtable_state == THD::INFINIDB_CREATE_VTABLE ||
thd->infinidb_vtable.vtable_state == THD::INFINIDB_ALTER_VTABLE ||
thd->infinidb_vtable.vtable_state == THD::INFINIDB_DROP_VTABLE ||
thd->infinidb_vtable.vtable_state == THD::INFINIDB_REDO_PHASE1)
return 0;
if (!thd->infinidb_vtable.cal_conn_info) if (!thd->infinidb_vtable.cal_conn_info)
thd->infinidb_vtable.cal_conn_info = (void*)(new cal_connection_info()); thd->infinidb_vtable.cal_conn_info = (void*)(new cal_connection_info());
cal_connection_info* ci = reinterpret_cast<cal_connection_info*>(thd->infinidb_vtable.cal_conn_info); cal_connection_info* ci = reinterpret_cast<cal_connection_info*>(thd->infinidb_vtable.cal_conn_info);
@ -4130,14 +4126,6 @@ int ha_calpont_impl_rename_table(const char* from, const char* to)
} }
else if ( thd->infinidb_vtable.vtable_state == THD::INFINIDB_ALTER_VTABLE ) else if ( thd->infinidb_vtable.vtable_state == THD::INFINIDB_ALTER_VTABLE )
return 0; return 0;
else
{
#if 0
thd->get_stmt_da()->set_overwrite_status(true);
thd->raise_error_printf(ER_CHECK_NOT_IMPLEMENTED, "Syntax is not supported in InfiniDB.");
return 1;
#endif
}
int rc = ha_calpont_impl_rename_table_(from, to, *ci); int rc = ha_calpont_impl_rename_table_(from, to, *ci);
return rc; return rc;
@ -4255,7 +4243,6 @@ int ha_calpont_impl_external_lock(THD *thd, TABLE* table, int lock_type)
sm::sm_cleanup(ci->cal_conn_hndl); sm::sm_cleanup(ci->cal_conn_hndl);
ci->cal_conn_hndl = 0; ci->cal_conn_hndl = 0;
} }
thd->infinidb_vtable.has_limit = false;
return 0; return 0;
} }
@ -4307,7 +4294,6 @@ int ha_calpont_impl_external_lock(THD *thd, TABLE* table, int lock_type)
ci->miniStats = ci->cal_conn_hndl->miniStats; ci->miniStats = ci->cal_conn_hndl->miniStats;
ci->queryState = 0; ci->queryState = 0;
thd->infinidb_vtable.override_largeside_estimate = false; thd->infinidb_vtable.override_largeside_estimate = false;
thd->infinidb_vtable.has_limit = false;
} }
} }
ci->tableMap.erase(table); ci->tableMap.erase(table);

View File

@ -317,13 +317,13 @@ void castTypeArgs(Item_func* ifp, funcexp::FunctionParm& functionParms);
void parse_item (Item *item, std::vector<Item_field*>& field_vec, bool& hasNonSupportItem, uint16& parseInfo); void parse_item (Item *item, std::vector<Item_field*>& field_vec, bool& hasNonSupportItem, uint16& parseInfo);
bool isPredicateFunction(Item* item, gp_walk_info* gwip); bool isPredicateFunction(Item* item, gp_walk_info* gwip);
execplan::ParseTree* buildRowPredicate(execplan::RowColumn* lhs, execplan::RowColumn* rhs, std::string predicateOp); execplan::ParseTree* buildRowPredicate(execplan::RowColumn* lhs, execplan::RowColumn* rhs, std::string predicateOp);
void buildRowColumnFilter(gp_walk_info* gwip, execplan::RowColumn* rhs, execplan::RowColumn* lhs, Item_func* ifp); bool buildRowColumnFilter(gp_walk_info* gwip, execplan::RowColumn* rhs, execplan::RowColumn* lhs, Item_func* ifp);
void buildPredicateItem(Item_func* ifp, gp_walk_info* gwip); bool buildPredicateItem(Item_func* ifp, gp_walk_info* gwip);
void collectAllCols(gp_walk_info& gwi, Item_field* ifp); void collectAllCols(gp_walk_info& gwi, Item_field* ifp);
void buildSubselectFunc(Item_func* ifp, gp_walk_info* gwip); void buildSubselectFunc(Item_func* ifp, gp_walk_info* gwip);
uint32_t buildOuterJoin(gp_walk_info& gwi, SELECT_LEX& select_lex); uint32_t buildOuterJoin(gp_walk_info& gwi, SELECT_LEX& select_lex);
std::string getViewName(TABLE_LIST* table_ptr); std::string getViewName(TABLE_LIST* table_ptr);
void buildConstPredicate(Item_func* ifp, execplan::ReturnedColumn* rhs, gp_walk_info* gwip); bool buildConstPredicate(Item_func* ifp, execplan::ReturnedColumn* rhs, gp_walk_info* gwip);
execplan::CalpontSystemCatalog::ColType fieldType_MysqlToIDB (const Field* field); execplan::CalpontSystemCatalog::ColType fieldType_MysqlToIDB (const Field* field);
execplan::CalpontSystemCatalog::ColType colType_MysqlToIDB (const Item* item); execplan::CalpontSystemCatalog::ColType colType_MysqlToIDB (const Item* item);
execplan::SPTP getIntervalType(int interval_type); execplan::SPTP getIntervalType(int interval_type);

View File

@ -489,7 +489,7 @@ execplan::ReturnedColumn* buildPseudoColumn(Item* item,
cc = new ConstantColumn(localPm); cc = new ConstantColumn(localPm);
else else
cc = new ConstantColumn("", ConstantColumn::NULLDATA); cc = new ConstantColumn("", ConstantColumn::NULLDATA);
cc->alias(ifp->name? ifp->name : ""); cc->alias(ifp->full_name() ? ifp->full_name() : "");
return cc; return cc;
} }
@ -559,7 +559,7 @@ execplan::ReturnedColumn* buildPseudoColumn(Item* item,
// operation type integer // operation type integer
funcexp::Func_idbpartition* idbpartition = new funcexp::Func_idbpartition(); funcexp::Func_idbpartition* idbpartition = new funcexp::Func_idbpartition();
fc->operationType(idbpartition->operationType(parms, fc->resultType())); fc->operationType(idbpartition->operationType(parms, fc->resultType()));
fc->alias(ifp->name? ifp->name : ""); fc->alias(ifp->full_name() ? ifp->full_name() : "");
return fc; return fc;
} }

View File

@ -288,7 +288,8 @@ execplan::ParseTree* ScalarSub::buildParseTree(PredicateOperator* op)
csep->tableList(tblist); csep->tableList(tblist);
csep->derivedTableList(derivedTbList); csep->derivedTableList(derivedTbList);
if (fSub->is_correlated) // if (fSub->is_correlated)
if (fSub->unit->first_select()->master_unit()->uncacheable)
{ {
SelectFilter *subFilter = new SelectFilter(); SelectFilter *subFilter = new SelectFilter();
subFilter->correlated(true); subFilter->correlated(true);

View File

@ -427,8 +427,8 @@ ReturnedColumn* buildWindowFunctionColumn(Item* item, gp_walk_info& gwi, bool& n
ac->adjustResultType(); ac->adjustResultType();
ac->expressionId(ci->expressionId++); ac->expressionId(ci->expressionId++);
if (item->name) if (item->full_name())
ac->alias(item->name); ac->alias(item->full_name());
// put ac on windowFuncList // put ac on windowFuncList
gwi.windowFuncList.push_back(ac); gwi.windowFuncList.push_back(ac);