//---------------------------------------------------------------------------- // if the aggregation is MAX(A) then we can create two types of columns: // INS_MAX_A = MAX(CASE @OP WHEN -1 THEN null ELSE SYS_DELTA.A). // DEL_MAX_A = MAX(CASE @OP WHEN 1 THEN null ELSE SYS_DELTA.A). // the 1 & -1 values will be refered to as constOpValue. ItemExpr *MavRelRootBuilder::buildExtraMinMaxExpr(const ItemExpr *pMinMaxExpr, const NAString& colName, extraColumnType columnType) const { // if the pMinMaxExpr is the MAX(A) then pAggregationSubject is A. ItemExpr *pAggregationSubject = pMinMaxExpr->child(0); ItemExpr *copyOfAggSubject = pAggregationSubject->copyTree(heap_); ColReference *opCol = new(heap_) ColReference(new(heap_) ColRefName(MavBuilder::getVirtualOpColumnName())); ConstValue *pConstOpValue = new(heap_) SystemLiteral( (columnType == AGG_FOR_DELETE) ? 1 : -1); Case *pCase = new(heap_) Case(NULL, new(heap_) IfThenElse(new(heap_) BiRelat(ITM_EQUAL, opCol, pConstOpValue), new(heap_) SystemLiteral(), // NULL copyOfAggSubject)); Aggregate *pNewAggregate = new(heap_) Aggregate(pMinMaxExpr->getOperatorType(), pCase); ColRefName *extraColName = createExtraAggName(colName, columnType); ItemExpr *result = new(heap_) RenameCol(pNewAggregate, extraColName); return result; } // buildExtraMinMaxExpr
//---------------------------------------------------------------------------- // The select list here is: (<fixed-count-cols>, <sum-col-refs>) // The count cols become: // Case( If <count-col> IS NULL THEN 0 ELSE <count-col>) // Since the count cols were transformed from COUNT to SUM(@OP), They will // now evaluate to NULL instead of 0 when no data is returned, for MAVs // without a GROUP BY clause. This is what is fixed here. //---------------------------------------------------------------------------- RelRoot *MavRelRootBuilder::buildRootForNoGroupBy(RelExpr *topNode) { ItemExprList selectList(heap_); for (CollIndex i=0; i<countCols_.entries(); i++) { const MVColumnInfo *currentMavColumn = countCols_[i]; const NAString& colName = currentMavColumn->getColName(); // Build a col reference to the SYS_DELTA column. ItemExpr *sysDeltaColExpr = new(heap_) ColReference(new(heap_) ColRefName(colName, deltaCorrName_)); ItemExpr *condExpr = new(heap_) Case(NULL, new(heap_) IfThenElse(new(heap_) UnLogic(ITM_IS_NULL, sysDeltaColExpr), new(heap_) SystemLiteral(0), sysDeltaColExpr->copyTree(heap_))); ItemExpr *renamedColExpr = new(heap_) RenameCol(condExpr, new(heap_) ColRefName(colName, deltaCorrName_)); selectList.insert(renamedColExpr); } // Add the SUM cols. addColsToSelectList(sumCols_, selectList, deltaCorrName_); // Add the extra Min/Max columns. selectList.insert(extraMinMaxColRefs_); // The select list is ready. Create the root over topNode. RelRoot *newRoot = new(heap_) RelRoot(topNode, REL_ROOT, selectList.convertToItemExpr()); newRoot->setDontOpenNewScope(); selectList.clear(); return newRoot; } // MavRelRootBuilder::buildRootForNoGroupBy()