Пример #1
0
        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_));
        }
Пример #2
0
        // 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;