public static SqlQueryExpression Form(IContext context, PlSqlParser.SubqueryContext subquery,
                                                  out SqlParseIntoClause into)
            {
                var query = Form(context, subquery.subqueryBasicElements(), out @into);

                var opPart = subquery.subquery_operation_part();

                if (opPart.Length > 0)
                {
                    if (@into != null)
                    {
                        throw new InvalidOperationException("Cannot SELECT INTO in a composite query.");
                    }

                    foreach (var part in opPart)
                    {
                        CompositeFunction function;

                        if (part.MINUS() != null || part.EXCEPT() != null)
                        {
                            function = CompositeFunction.Except;
                        }
                        else if (part.UNION() != null)
                        {
                            function = CompositeFunction.Union;
                        }
                        else if (part.INTERSECT() != null)
                        {
                            function = CompositeFunction.Intersect;
                        }
                        else
                        {
                            throw new ParseCanceledException("Invalid composite function.");
                        }

                        bool isAll = part.ALL() != null;

                        var next = Form(context, part.subqueryBasicElements());
                        var prev = query.NextComposite;

                        if (prev == null)
                        {
                            prev = new SqlQueryExpressionComposite(function, isAll, next);
                        }
                        else
                        {
                            prev.Expression.NextComposite = new SqlQueryExpressionComposite(function, isAll, next);
                        }

                        query.NextComposite = prev;
                    }
                }

                return(query);
            }
示例#2
0
 public override SqlExpression VisitSubquery(PlSqlParser.SubqueryContext context)
 {
     return(SqlParseSubquery.Form(context));
 }
            public static SqlQueryExpression Form(IContext context, PlSqlParser.SubqueryContext subquery)
            {
                SqlParseIntoClause into;

                return(Form(context, subquery, out @into));
            }
        public static SqlQueryExpression Form(PlSqlParser.SubqueryContext context)
        {
            SqlParseIntoClause into;

            return(Form(context, out into));
        }