protected override Statement Prepare(IQueryContext context)
        {
            var selectStatement = new SelectStatement {
                SelectExpression = SelectExpression,
                OrderBy          = OrderBy
            };

            // check to see if the construct is the special one for
            // selecting the latest IDENTITY value from a table
            if (IsIdentitySelect(selectStatement.SelectExpression))
            {
                selectStatement.SelectExpression.Columns.RemoveAt(0);
                FromTable fromTable = ((IList <FromTable>)selectStatement.SelectExpression.From.AllTables)[0];
                var       idExp     = Expression.FunctionCall("identity", Expression.Constant(DataObject.String(fromTable.Name.ToString())));
                selectStatement.SelectExpression.Columns.Add(new SelectColumn(idExp));
            }

            if (selectStatement.SelectExpression.Into != null)
            {
                selectStatement.intoClause = selectStatement.SelectExpression.Into;
            }

            // Generate the TableExpressionFromSet hierarchy for the expression,
            TableExpressionFromSet fromSet = Planner.GenerateFromSet(selectStatement.SelectExpression, context.Connection);

            // Form the plan
            selectStatement.Plan = Planner.FormQueryPlan(context.Connection, selectStatement.SelectExpression, fromSet, selectStatement.OrderBy);
            return(selectStatement);
        }
        protected override DataObject OnEvaluate(IExpressionEvaluator evaluator)
        {
            // Generate the TableExpressionFromSet hierarchy for the expression,
            TableExpressionFromSet fromSet = Planner.GenerateFromSet(SelectExpression, evaluator.Context.QueryContext.Connection);

            // Form the plan
            IQueryPlanNode plan = Planner.FormQueryPlan(evaluator.Context.QueryContext.Connection, SelectExpression, fromSet, new List <ByColumn>());

            return(new DataObject(PrimitiveTypes.Query(), plan));
        }