void SimpleFilter::replaceRealCol(CalpontSelectExecutionPlan::ReturnedColumnList& derivedColList) { SimpleColumn *sc = NULL; if (fLhs) { sc = dynamic_cast<SimpleColumn*>(fLhs); if (sc) { ReturnedColumn* tmp = derivedColList[sc->colPosition()]->clone(); delete fLhs; fLhs = tmp; } else { fLhs->replaceRealCol(derivedColList); } } if (fRhs) { sc = dynamic_cast<SimpleColumn*>(fRhs); if (sc) { ReturnedColumn* tmp = derivedColList[sc->colPosition()]->clone(); delete fRhs; fRhs = tmp; } else { fRhs->replaceRealCol(derivedColList); } } }
ParseTree* replaceRefCol(ParseTree*& n, CalpontSelectExecutionPlan::ReturnedColumnList& derivedColList) { ParseTree *lhs = n->left(); ParseTree *rhs = n->right(); if (lhs) n->left(replaceRefCol(lhs, derivedColList)); if (rhs) n->right(replaceRefCol(rhs, derivedColList)); SimpleFilter *sf = dynamic_cast<SimpleFilter*>(n->data()); ConstantFilter *cf = dynamic_cast<ConstantFilter*>(n->data()); ReturnedColumn *rc = dynamic_cast<ReturnedColumn*>(n->data()); if (sf) { sf->replaceRealCol(derivedColList); } else if (cf) { cf->replaceRealCol(derivedColList); } else if (rc) { SimpleColumn* sc = dynamic_cast<SimpleColumn*>(rc); if (sc) { ReturnedColumn* tmp = derivedColList[sc->colPosition()]->clone(); delete sc; n->data(tmp); } else { rc->replaceRealCol(derivedColList); } } return n; }
void VirtualTable::addColumn(const SRCP& column) { // As of bug3695, make sure varbinary is not used in subquery. if (column->resultType().colDataType == CalpontSystemCatalog::VARBINARY && !fVarBinOK) throw runtime_error ("VARBINARY in subquery is not supported."); AggregateColumn* agc = NULL; ArithmeticColumn* arc = NULL; ConstantColumn* cc = NULL; FunctionColumn* fc = NULL; SimpleColumn* sc = NULL; WindowFunctionColumn* wc = NULL; string columnName; ostringstream oss; UniqId colId; if ((sc = dynamic_cast<SimpleColumn*>(column.get())) != NULL) { columnName = sc->columnName(); colId = UniqId(sc); } else if ((agc = dynamic_cast<AggregateColumn*>(column.get())) != NULL) { // oss << agc->functionName() << "_" << agc->expressionId(); // oss << "Aggregate_" << agc->expressionId(); columnName = agc->data(); colId = UniqId(agc->expressionId(), "", "", ""); } else if ((wc = dynamic_cast<WindowFunctionColumn*>(column.get())) != NULL) { // oss << wc->functionName() << "_" << wc->expressionId(); // oss << "Window_" << wc->expressionId(); columnName = wc->data(); colId = UniqId(wc->expressionId(), "", "", ""); } else if ((arc = dynamic_cast<ArithmeticColumn*>(column.get())) != NULL) { // oss << "Arithmetic_" << arc->expressionId(); columnName = arc->data(); colId = UniqId(arc->expressionId(), "", "", ""); } else if ((fc = dynamic_cast<FunctionColumn*>(column.get())) != NULL) { // oss << fc->functionName() << "_" << fc->expressionId(); columnName = fc->data(); colId = UniqId(fc->expressionId(), "", "", ""); } else if ((cc = dynamic_cast<ConstantColumn*>(column.get())) != NULL) { // oss << "Constant_" << cc->expressionId(); columnName = cc->data(); colId = UniqId(cc->expressionId(), cc->alias(), "", fView); } else // new column type has added, but this code is not updated. { oss << "not supported column type: " << typeid(*(column.get())).name(); throw runtime_error(oss.str()); } if (columnName.empty()) columnName = column->alias(); SimpleColumn* vc = new SimpleColumn(); vc->tableName(fName); vc->tableAlias(fAlias); vc->columnName(columnName); vc->alias(column->alias()); vc->viewName(fView); uint32_t index = fColumns.size(); vc->colPosition(index); vc->oid(fTableOid+index+1); vc->resultType(column->resultType()); SSC ssc(vc); fColumns.push_back(ssc); fColumnTypes.push_back(column->resultType()); fColumnMap.insert(make_pair(colId, index)); }