Exemplo n.º 1
0
        public IExpression Parse(TextSpan token, IParser parser)
        {
            SqlCodeExpr returnVariable = null;

            if (parser.Scanner.TryConsume(SqlToken.Variable, out var returnVariableSpan))
            {
                returnVariable = parser.PrefixParse(returnVariableSpan, int.MaxValue) as SqlCodeExpr;
                parser.Scanner.Consume(SqlToken.Equal);
            }

            SqlCodeExpr funcName = null;

            if (parser.Scanner.Match(SqlToken.LParen))
            {
                funcName = new GroupSqlCodeExpr
                {
                    InnerExpr = parser.ParseExpIgnoreComment()
                };
                parser.Scanner.Consume(SqlToken.RParen);
            }
            else
            {
                funcName = parser.ConsumeAny(SqlToken.SqlIdentifier, SqlToken.Identifier) as SqlCodeExpr;
            }

            var isEnd = parser.IsToken(SqlToken.End);


            var parameters = new List <SqlCodeExpr>();

            if (!isEnd)
            {
                do
                {
                    var name = parser.ParseExpIgnoreComment();
                    if (name == null)
                    {
                        break;
                    }

                    var isOutput = parser.MatchTokenAny(SqlToken.Out, SqlToken.Output);
                    parameters.Add(new ParameterSqlCodeExpr
                    {
                        Name     = name,
                        IsOutput = isOutput
                    });
                } while (parser.Scanner.Match(SqlToken.Comma));
            }

            return(new ExecSqlCodeExpr
            {
                ExecToken = "EXEC",
                ReturnVariable = returnVariable,
                Name = funcName,
                Parameters = parameters
            });
        }
Exemplo n.º 2
0
        public IExpression Parse(TextSpan token, IParser parser)
        {
            var intoStr = string.Empty;

            if (parser.Scanner.TryConsume(SqlToken.Into, out var intoToken))
            {
                intoStr = parser.Scanner.GetSpanString(intoToken);
            }

            var tableName = parser.ConsumeTableName();

            var withExpr = parser.ParsePrefix(SqlToken.With);

            var columnList = GetColumnsList(parser);

            if (parser.Scanner.TryConsumeAny(out var execSpan, SqlToken.Exec, SqlToken.Execute))
            {
                var execExpr = parser.PrefixParse(execSpan) as SqlCodeExpr;
                return(new InsertIntoFromSqlCodeExpr
                {
                    Table = tableName,
                    ColumnsList = columnList,
                    WithExpr = withExpr,
                    SelectFromExpr = execExpr,
                });
            }

            var outputList = parser.ParseOutputListExpr();
            var outputInto = parser.ParseInto_TableExpr();


            var hasGroup = parser.MatchToken(SqlToken.LParen);

            if (parser.Scanner.TryConsume(SqlToken.Select, out var selectToken))
            {
                var selectExpr = new SelectParselet().Parse(selectToken, parser) as SqlCodeExpr;
                if (hasGroup)
                {
                    parser.MatchToken(SqlToken.RParen);
                    selectExpr = new GroupSqlCodeExpr
                    {
                        InnerExpr = selectExpr
                    };
                }

                return(new InsertIntoFromSqlCodeExpr
                {
                    Table = tableName,
                    ColumnsList = columnList,
                    OutputList = outputList,
                    OutputIntoExpr = outputInto,
                    SelectFromExpr = selectExpr,
                });
            }


            parser.Scanner.Consume(SqlToken.Values);
            var valuesList = parser.ConsumeByDelimiter(SqlToken.Comma, () =>
            {
                parser.Scanner.Consume(SqlToken.LParen);
                var values = new List <SqlCodeExpr>();
                do
                {
                    var expr = parser.ParseExpIgnoreComment();
                    values.Add(expr);
                } while (parser.Scanner.Match(SqlToken.Comma));

                parser.Scanner.Consume(SqlToken.RParen);

                return(new ExprListSqlCodeExpr
                {
                    Items = values.ToList()
                });
            }).ToList();

            return(new InsertSqlCodeExpr
            {
                IntoStr = intoStr,
                TableName = tableName,
                Columns = columnList,
                WithExpr = withExpr,
                ValuesList = valuesList
            });
        }