public TSQLWhereClause Parse(ITSQLTokenizer tokenizer) { TSQLWhereClause where = new TSQLWhereClause(); if (!tokenizer.Current.IsKeyword(TSQLKeywords.WHERE)) { throw new InvalidOperationException("WHERE expected."); } where.Tokens.Add(tokenizer.Current); // subqueries TSQLTokenParserHelper.ReadUntilStop( tokenizer, where, new List <TSQLFutureKeywords>() { }, new List <TSQLKeywords>() { TSQLKeywords.GROUP, TSQLKeywords.HAVING, TSQLKeywords.UNION, TSQLKeywords.EXCEPT, TSQLKeywords.INTERSECT, TSQLKeywords.ORDER, TSQLKeywords.FOR, TSQLKeywords.OPTION }, lookForStatementStarts: true); return(where); }
public TSQLWhereClause Parse(ITSQLTokenizer tokenizer) { TSQLWhereClause where = new TSQLWhereClause(); if (!tokenizer.Current.IsKeyword(TSQLKeywords.WHERE)) { throw new InvalidOperationException("WHERE expected."); } where.Tokens.Add(tokenizer.Current); // subqueries int nestedLevel = 0; while ( tokenizer.MoveNext() && !tokenizer.Current.IsCharacter(TSQLCharacters.Semicolon) && !( nestedLevel == 0 && tokenizer.Current.IsCharacter(TSQLCharacters.CloseParentheses) ) && ( nestedLevel > 0 || tokenizer.Current.Type != TSQLTokenType.Keyword || ( tokenizer.Current.Type == TSQLTokenType.Keyword && !tokenizer.Current.AsKeyword.Keyword.In ( TSQLKeywords.GROUP, TSQLKeywords.HAVING, TSQLKeywords.UNION, TSQLKeywords.EXCEPT, TSQLKeywords.INTERSECT, TSQLKeywords.ORDER, TSQLKeywords.FOR, TSQLKeywords.OPTION ) && !tokenizer.Current.AsKeyword.Keyword.IsStatementStart() ) )) { TSQLSubqueryHelper.RecurseParens( tokenizer, where, ref nestedLevel); } return(where); }
public TSQLWhereClause Parse(TSQLTokenizer tokenizer) { TSQLWhereClause where = new TSQLWhereClause(); TSQLKeyword keyword = tokenizer.Current.AsKeyword; if (keyword == null || keyword.Keyword != TSQLKeywords.WHERE) { throw new ApplicationException("WHERE expected."); } where.Tokens.Add(keyword); // subqueries int nestedLevel = 0; while ( tokenizer.Read() && !( tokenizer.Current.Type == TSQLTokenType.Character && tokenizer.Current.AsCharacter.Character == TSQLCharacters.Semicolon ) && !( nestedLevel == 0 && tokenizer.Current.Type == TSQLTokenType.Character && tokenizer.Current.AsCharacter.Character == TSQLCharacters.CloseParentheses ) && ( nestedLevel > 0 || tokenizer.Current.Type != TSQLTokenType.Keyword || ( tokenizer.Current.Type == TSQLTokenType.Keyword && tokenizer.Current.AsKeyword.Keyword.In ( TSQLKeywords.NULL, TSQLKeywords.CASE, TSQLKeywords.WHEN, TSQLKeywords.THEN, TSQLKeywords.ELSE, TSQLKeywords.AND, TSQLKeywords.OR, TSQLKeywords.BETWEEN, TSQLKeywords.EXISTS, TSQLKeywords.END, TSQLKeywords.IN, TSQLKeywords.IS, TSQLKeywords.NOT, TSQLKeywords.LIKE ) ) )) { where.Tokens.Add(tokenizer.Current); if (tokenizer.Current.Type == TSQLTokenType.Character) { TSQLCharacters character = tokenizer.Current.AsCharacter.Character; if (character == TSQLCharacters.OpenParentheses) { // should we recurse for subqueries? nestedLevel++; if (tokenizer.Read()) { if ( tokenizer.Current.Type == TSQLTokenType.Keyword && tokenizer.Current.AsKeyword.Keyword == TSQLKeywords.SELECT) { TSQLSelectStatement selectStatement = new TSQLSelectStatementParser().Parse(tokenizer); where.Tokens.AddRange(selectStatement.Tokens); if ( tokenizer.Current != null && tokenizer.Current.Type == TSQLTokenType.Character && tokenizer.Current.AsCharacter.Character == TSQLCharacters.CloseParentheses) { nestedLevel--; where.Tokens.Add(tokenizer.Current); } } else { where.Tokens.Add(tokenizer.Current); } } } else if (character == TSQLCharacters.CloseParentheses) { nestedLevel--; } } } return where; }
public TSQLWhereClause Parse(ITSQLTokenizer tokenizer) { TSQLWhereClause where = new TSQLWhereClause(); if (!tokenizer.Current.IsKeyword(TSQLKeywords.WHERE)) { throw new ApplicationException("WHERE expected."); } where.Tokens.Add(tokenizer.Current); // subqueries int nestedLevel = 0; while ( tokenizer.MoveNext() && !tokenizer.Current.IsCharacter(TSQLCharacters.Semicolon) && !( nestedLevel == 0 && tokenizer.Current.IsCharacter(TSQLCharacters.CloseParentheses) ) && ( nestedLevel > 0 || tokenizer.Current.Type != TSQLTokenType.Keyword || ( tokenizer.Current.Type == TSQLTokenType.Keyword && tokenizer.Current.AsKeyword.Keyword.In ( TSQLKeywords.NULL, TSQLKeywords.CASE, TSQLKeywords.WHEN, TSQLKeywords.THEN, TSQLKeywords.ELSE, TSQLKeywords.AND, TSQLKeywords.OR, TSQLKeywords.BETWEEN, TSQLKeywords.EXISTS, TSQLKeywords.END, TSQLKeywords.IN, TSQLKeywords.IS, TSQLKeywords.NOT, TSQLKeywords.LIKE ) ) )) { where.Tokens.Add(tokenizer.Current); if (tokenizer.Current.Type == TSQLTokenType.Character) { TSQLCharacters character = tokenizer.Current.AsCharacter.Character; if (character == TSQLCharacters.OpenParentheses) { // should we recurse for subqueries? nestedLevel++; if (tokenizer.MoveNext()) { if (tokenizer.Current.IsKeyword(TSQLKeywords.SELECT)) { TSQLSelectStatement selectStatement = new TSQLSelectStatementParser().Parse(tokenizer); where.Tokens.AddRange(selectStatement.Tokens); if (tokenizer.Current.IsCharacter(TSQLCharacters.CloseParentheses)) { nestedLevel--; where.Tokens.Add(tokenizer.Current); } } else { where.Tokens.Add(tokenizer.Current); } } } else if (character == TSQLCharacters.CloseParentheses) { nestedLevel--; } } } return(where); }
public static List <WhereCondition> Conditions(this TSQLWhereClause whereClause) { WhereCondition.OperatorType op; var conditions = new List <WhereCondition>(); WhereCondition currentCondition = null; if (whereClause == null) { return(conditions); } foreach (TSQLToken token in whereClause.Tokens) { switch (token.Type) { case TSQLTokenType.Identifier: // column // save current condition if (currentCondition != null) { conditions.Add(currentCondition); } currentCondition = new WhereCondition() { Column = token.Text.ToString() }; break; case TSQLTokenType.Operator: op = WhereCondition.ToOperatorType(token.Text.ToString()); if (op != WhereCondition.OperatorType.Unknown) { currentCondition.Operator = op; } break; case TSQLTokenType.NumericLiteral: currentCondition.Type = WhereCondition.LiteralType.Numeric; currentCondition.Value = token.Text.ToString(); break; case TSQLTokenType.StringLiteral: currentCondition.Type = WhereCondition.LiteralType.String; currentCondition.Value = token.Text.ToString(); break; case TSQLTokenType.Keyword: // keyword also contain operators (like "in" or "between") op = WhereCondition.ToOperatorType(token.Text.ToString()); if (op != WhereCondition.OperatorType.Unknown) { currentCondition.Operator = op; } break; case TSQLTokenType.MoneyLiteral: break; case TSQLTokenType.BinaryLiteral: break; case TSQLTokenType.SystemIdentifier: break; case TSQLTokenType.SingleLineComment: break; case TSQLTokenType.MultilineComment: break; case TSQLTokenType.Variable: break; case TSQLTokenType.SystemVariable: break; case TSQLTokenType.Whitespace: break; case TSQLTokenType.Character: break; } } // save current condition if (currentCondition != null) { conditions.Add(currentCondition); } return(conditions); }