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 }); }
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 }); }