Example #1
0
        public static SqlStatement Declare(PlSqlParser.CursorDeclarationContext context)
        {
            var cursorName = Name.Simple(context.cursor_name());
            var query = Subquery.Form(context.subquery());

            CursorParameter[] parameters = null;
            if (context.parameterSpec() != null) {
                parameters = context.parameterSpec().Select(Parameter.Form).ToArray();
            }

            return new DeclareCursorStatement(cursorName, parameters, query);
        }
Example #2
0
        public static SqlStatement Build(PlSqlParser.SelectStatementContext context)
        {
            IntoClause into;
            var query = Subquery.Form(context.subquery(), out into);

            if (into != null) {
                SqlExpression reference;
                if (into.TableName != null) {
                    reference = SqlExpression.Reference(into.TableName);
                } else {
                    var vars = into.Variables;
                    reference = SqlExpression.Tuple(vars.Select(SqlExpression.VariableReference).Cast<SqlExpression>().ToArray());
                }

                return new SelectIntoStatement(query, reference);
            }

            var statement = new SelectStatement(query);

            var orderBy = context.orderByClause();
            var forUpdate = context.forUpdateClause();

            if (orderBy != null) {
                var sortColumns = orderBy.orderByElements().orderByElement().Select(x => {
                    bool asc = x.DESC() == null;
                    var exp = Expression.Build(x.expression());
                    return new SortColumn(exp, asc);
                });

                statement.OrderBy = sortColumns;
            }

            statement.ForUpdate = forUpdate != null;

            var limit = context.queryLimitClause();
            if (limit != null) {
                var n1 = Number.PositiveInteger(limit.n1);
                var n2 = Number.PositiveInteger(limit.n2);

                if (n1 == null)
                    throw new ParseCanceledException("Invalid LIMIT clause");

                if (n2 != null) {
                    statement.Limit = new QueryLimit(n1.Value, n2.Value);
                } else {
                    statement.Limit = new QueryLimit(n1.Value);
                }
            }

            return statement;
        }
Example #3
0
        public static CreateViewStatement Create(PlSqlParser.CreateViewStatementContext context)
        {
            var orReplace = context.OR() != null && context.REPLACE() != null;

            var viewName = Name.Object(context.objectName());
            var query = (SqlQueryExpression) Expression.Build(context.subquery());

            string[] columnNames = null;
            if (context.columnList() != null) {
                columnNames = context.columnList().columnName().Select(Name.Simple).ToArray();
            }

            return new CreateViewStatement(viewName, columnNames, query) {
                ReplaceIfExists = orReplace
            };
        }
Example #4
0
        private static SqlQueryExpression Form(PlSqlParser.SubqueryBasicElementsContext context, out IntoClause into)
        {
            var sub = context.subquery();
            if (sub != null && !sub.IsEmpty)
                return Form(sub, out into);

            return Form(context.queryBlock(), out into);
        }
Example #5
0
            private static FromSource FormSource(PlSqlParser.Dml_table_expression_clauseContext context)
            {
                var tableName = Name.Object(context.objectName());
                var query = context.subquery();

                var source = new FromSource();

                if (tableName != null) {
                    source.TableName = tableName.ToString();
                } else if (!query.IsEmpty) {
                    source.SubQuery = Form(query);
                }

                if (context.alias != null && !context.alias.IsEmpty) {
                    source.Alias = context.alias.GetText();
                }

                return source;
            }