public TokenParserResults Parse(ParseArgs <SelectStatement> parseArgs) { var selectStatement = parseArgs.Statement; var args = parseArgs.StatementArgs; var results = new TokenParserResults(); var words = ParserUtils.GetWords(args).ToList(); if (words.Any()) { var columns = ParserUtils.SplitTokens(words); foreach (var wordList in columns) { SelectFromBase selectFrom = null; var startWord = wordList[0]; if (wordList.Count > 3) { results.Errors.Add(new SqlStatementError("Unknown tokens", 0)); return(results); } else if (wordList.Count == 3) { if (wordList[1] != "as") { results.Errors.Add(new SqlStatementError("Expecting 'As' keyword", 0)); return(results); } selectFrom = new SelectFrom(startWord, wordList[2]); } else if (wordList.Count == 2) { selectFrom = new SelectFrom(startWord, wordList[1]); } else { selectFrom = new SelectFrom(startWord); } if (selectFrom != null) { selectStatement.From.Add(selectFrom); } } } return(results); }
public TokenParserResults Parse(ParseArgs <SelectStatement> parseArgs) { var selectStatement = parseArgs.Statement; var args = parseArgs.StatementArgs; var results = new TokenParserResults(); var words = ParserUtils.GetWords(args).ToList(); var segments = ParserUtils.SplitTokens(words); foreach (var wordList in segments) { if (wordList.Any() == false) { results.Errors.Add(new SqlStatementError("No order clause specified", 0)); return(results); } SelectOrderBase orderColumn = null; var startWord = wordList[0]; var number = 0; if (int.TryParse(startWord, out number)) { if (wordList.Count > 2) { results.Errors.Add(new SqlStatementError("Unknown tokens", 0)); return(results); } else if (wordList.Count == 2) { if (wordList[1] != "asc" && wordList[1] != "desc") { results.Errors.Add(new SqlStatementError("Expecting 'Asc' or 'Desc' keyword", 0)); return(results); } var sortDirection = wordList[1] == "asc" ? OrderDirection.Asc : OrderDirection.Desc; orderColumn = new SelectOrderPosition(number, sortDirection); } else if (wordList.Count == 1) { orderColumn = new SelectOrderPosition(number); } } else if (startWord.StartsWith("'") && startWord.EndsWith("'")) { results.Errors.Add(new SqlStatementError("A constant expression was encountered in the ORDER BY list", 0)); return(results); } else if (char.IsLetter(startWord[0])) { if (wordList.Count > 2) { results.Errors.Add(new SqlStatementError("Unknown tokens", 0)); return(results); } else if (wordList.Count == 2) { if (wordList[1] != "asc" && wordList[1] != "desc") { results.Errors.Add(new SqlStatementError("Expecting 'Asc' or 'Desc' keyword", 0)); return(results); } var sortDirection = wordList[1] == "asc" ? OrderDirection.Asc : OrderDirection.Desc; orderColumn = new SelectOrderColumn(startWord, sortDirection); } else if (wordList.Count == 1) { orderColumn = new SelectOrderColumn(startWord); } } if (orderColumn == null) { throw new NotSupportedException(); } selectStatement.Order.Add(orderColumn); } return(results); }
public TokenParserResults Parse(ParseArgs <SelectStatement> parseArgs) { var selectStatement = parseArgs.Statement; var args = parseArgs.StatementArgs; var results = new TokenParserResults(); var words = GetWords != null ? GetWords(args).ToList() : ParserUtils.GetWords(args).ToList(); if (words.Any()) { var currentGroup = new SelectWhereGroup(); var groupStack = new Stack <SelectWhereGroup>(); var clauseWords = new List <string>(); for (int i = 0; i < words.Count; i++) { var word = words[i]; if (word.In("(", ")", "and", "or")) { ParseClauseWords(clauseWords, currentGroup); } if (word == "(") { groupStack.Push(currentGroup); var newGroup = new SelectWhereGroup(); currentGroup.Clauses.Add(newGroup); currentGroup = newGroup; } else if (word == ")") { currentGroup = groupStack.Pop(); } else if (word == "or") { var clauseOperator = new SelectWhereOperator(SelectWhereClauseOperatorEnum.Or); currentGroup.Clauses.Add(clauseOperator); } else if (word == "and") { var clauseOperator = new SelectWhereOperator(SelectWhereClauseOperatorEnum.And); currentGroup.Clauses.Add(clauseOperator); } else { clauseWords.Add(word); } } ParseClauseWords(clauseWords, currentGroup); selectStatement.Where = currentGroup.Clauses; } return(results); }
public TokenParserResults Parse(ParseArgs <SelectStatement> parseArgs) { var selectStatement = parseArgs.Statement; var args = parseArgs.StatementArgs; var statementParser = parseArgs.StatementsParser; var results = new TokenParserResults(); var words = ParserUtils.GetWords(args).ToList(); var index = 0; if (words.Any()) { if (words[0] == "top") { if (words.Count >= 2) { var value = 0; if (int.TryParse(words[1], out value)) { selectStatement.Top = value; index = 2; } else { results.Errors.Add(new SqlStatementError("Top expects a numerical value", 0)); } } else { results.Errors.Add(new SqlStatementError("Top without a numerical value", 0)); } } if (results.Errors.Any()) { return(results); } var columns = ParserUtils.SplitTokens(words.GetRange(index, words.Count - index)); foreach (var wordList in columns) { if (wordList.Any() == false) { results.Errors.Add(new SqlStatementError("No column specified", 0)); return(results); } SelectColumnBase selectColumn = null; var startWord = wordList[0]; double number = 0; if (startWord.IsQuoted() || double.TryParse(startWord, out number)) { object value = startWord.IsQuoted() ? startWord.CleanRaw() : number.ToString(); var valueType = startWord.IsQuoted() ? typeof(string) : typeof(double); if (startWord.IsQuoted() == false && startWord.IndexOf(".", StringComparison.Ordinal) < 0) { valueType = typeof(int); value = int.Parse(startWord); } if (wordList.Count > 3) { results.Errors.Add(new SqlStatementError("Unknown tokens", 0)); return(results); } if (wordList.Count == 3) { if (wordList[1] != "as") { results.Errors.Add(new SqlStatementError("Expecting 'As' keyword", 0)); return(results); } selectColumn = new RawSelectColumn(wordList[2], value) { ValueType = valueType }; } else if (wordList.Count == 2) { selectColumn = new RawSelectColumn(wordList[1], value) { ValueType = valueType }; } else { selectColumn = new RawSelectColumn(null, value) { ValueType = valueType }; } } else if (startWord.StartsWith("*")) { if (wordList.Count > 1) { results.Errors.Add(new SqlStatementError("Found unsupported tokens after '*'", 0)); return(results); } selectColumn = new AllSelectColumn(); } else if (startWord.StartsWith("+")) { if (wordList.Count > 1) { results.Errors.Add(new SqlStatementError("Found unsupported tokens after '+'", 0)); return(results); } selectColumn = new SystemSelectColumn(); } else if (char.IsLetter(startWord[0])) { selectColumn = ParseColumn(wordList, results.Errors); } else if (startWord == "(") { var nextWord = wordList[1]; if (nextWord == "select") { var startIndex = 1; var endIndex = wordList.FindLastIndex(x => x == ")"); var innerSql = string.Join(" ", wordList.GetRange(startIndex, endIndex - startIndex)); var statement = statementParser.ParseSelect(new SqlStatement() { Builder = new StringBuilder(innerSql) }); if (statement.Errors.Any()) { throw new Exception($"Unable to parse inner select statement '{innerSql}'"); } var descTokenIndex = wordList.Count - 1; var label = wordList[descTokenIndex]; descTokenIndex--; if (wordList[descTokenIndex].NotIn(")", "as")) { throw new Exception($"Unexpected token after inner select '{innerSql}'"); } if (wordList[descTokenIndex] == "as") { descTokenIndex--; } if (wordList[descTokenIndex] != ")") { throw new Exception($"Unexpected token after inner select '{innerSql}'"); } selectColumn = new InnerSelectColumn(label, statement.Value); } } if (selectColumn == null) { throw new NotSupportedException(); } selectStatement.Columns.Add(selectColumn); } } return(results); }