public override CGroupMember Apply(CGroupMember expr) { // create a group member CteSelect var memo = expr.group_.memo_; LogicCteConsumer cteConsumer = expr.logic_ as LogicCteConsumer; LogicSelectCte logicSelectCte = new LogicSelectCte(cteConsumer, memo); return(new CGroupMember(logicSelectCte, expr.group_)); }
// from clause - // pair each from item with cross join, their join conditions will be handled // with where clause processing. // LogicNode transformFromClause() { LogicNode transformOneFrom(TableRef tab) { LogicNode from; switch (tab) { case BaseTableRef bref: if (bref.Table().source_ == TableDef.TableSource.Table) { from = new LogicScanTable(bref); } else { from = new LogicScanStream(bref); } if (bref.tableSample_ != null) { from = new LogicSampleScan(from, bref.tableSample_); } break; case ExternalTableRef eref: from = new LogicScanFile(eref); break; case CTEQueryRef cref: if (this is CteSelectStmt css && css.CteId() == cref.cte_.cteId_) { cref.query_.cteInfo_ = cteInfo_; var ctePlan = cref.query_.CreatePlan(); string alias = null; NamedQuery key; alias = cref.alias_; key = new NamedQuery(cref.query_, alias, NamedQuery.QueryType.FROM); from = new LogicFromQuery(cref, ctePlan); subQueries_.Add(key); if (!fromQueries_.ContainsKey(key)) { fromQueries_.Add(key, from as LogicFromQuery); } } else { from = new LogicCteConsumer(cteInfo_.GetCteInfoEntryByCteId(cref.cte_.cteId_), cref); } break;