public SqlObject FindSqlObject(Token previousToken, Token currentToken) { SqlObject sqlObject = null; if (previousToken != null) { if (previousToken.Type == TokenType.KeyWord) { var value = previousToken.Value.ToLower(); var name = currentToken != null ? currentToken.Value : null; switch (value) { case "use": case "database": sqlObject = new SqlObject(null, null, SqlObjectTypes.Database, value); break; case "delete": case "insert": case "update": case "into": sqlObject = new SqlObject(null, null, SqlObjectTypes.Table | SqlObjectTypes.View, name); break; case "from": case "join": sqlObject = new SqlObject(null, null, SqlObjectTypes.Table | SqlObjectTypes.View | SqlObjectTypes.Function, name); break; case "table": sqlObject = new SqlObject(null, null, SqlObjectTypes.Table, name); break; case "exec": case "proc": sqlObject = new SqlObject(null, null, SqlObjectTypes.Procedure, name); break; case "function": sqlObject = new SqlObject(null, null, SqlObjectTypes.Function, null); break; case "trigger": sqlObject = new SqlObject(null, null, SqlObjectTypes.Trigger, null); break; case "view": sqlObject = new SqlObject(null, null, SqlObjectTypes.View, null); break; case "index": sqlObject = new SqlObject(null, null, SqlObjectTypes.Index, null); break; case "where": // if (currentToken != null) { sqlObject = GetSqlObject(currentToken.Value); } if (sqlObject == null) { var index = _allTables.LastIndexOf(t => t.Index < previousToken.Index - 1); if (index >= 0) { var table = _allTables[index]; sqlObject = new SqlObject(table.Name, null, SqlObjectTypes.Column, name); } } break; default: break; } if (sqlObject == null && currentToken != null) { sqlObject = GetSqlObject(currentToken.Value); } } else if (previousToken.Type == TokenType.OperatorOrPunctuator) { if (previousToken.Value == "=" && previousToken.Index > 0) { if (currentToken != null) { switch (currentToken.Type) { case TokenType.KeyWord: sqlObject = GetSqlObject(currentToken.Value); break; default: sqlObject = GetValue(previousToken); break; } } else { sqlObject = GetValue(previousToken); } } else if (currentToken != null && currentToken.Type == TokenType.KeyWord && currentToken.Value.Contains('.')) { sqlObject = GetSqlObject(currentToken.Value); } } } return(sqlObject); }
public SqlObject FindSqlObject(int index) { SqlObject sqlObject = null; if (index >= 1) { var prev = Tokens[index - 1]; if (prev.Type == TokenType.KeyWord) { var value = prev.Value.ToLower(); string name = null; if (index < Tokens.Count) { var token = Tokens[index]; name = token.Value; } switch (value) { case "use": sqlObject = new SqlObject(null, null, SqlObjectTypes.Database, null); break; case "delete": case "insert": case "into": case "update": sqlObject = new SqlObject(null, null, SqlObjectTypes.Table | SqlObjectTypes.View, name); break; case "from": case "join": sqlObject = new SqlObject(null, null, SqlObjectTypes.Table | SqlObjectTypes.View | SqlObjectTypes.Function, name); break; case "table": sqlObject = new SqlObject(null, null, SqlObjectTypes.Table, name); break; case "exec": case "proc": sqlObject = new SqlObject(null, null, SqlObjectTypes.Procedure, name); break; case "function": sqlObject = new SqlObject(null, null, SqlObjectTypes.Function, null); break; case "trigger": sqlObject = new SqlObject(null, null, SqlObjectTypes.Trigger, null); break; case "view": sqlObject = new SqlObject(null, null, SqlObjectTypes.View, null); break; case "index": sqlObject = new SqlObject(null, null, SqlObjectTypes.Index, null); break; case "where": index = _allTables.LastIndexOf(t => t.Index < index - 1); if (index >= 0) { var table = _allTables[index]; sqlObject = new SqlObject(table.Name, null, SqlObjectTypes.Column, name); } break; default: break; } if (sqlObject == null && index >= 0 && index < Tokens.Count) { var token = Tokens[index]; sqlObject = GetSqlObject(token.Value); } } else if (prev.Type == TokenType.OperatorOrPunctuator) { var tokenAfterOperator = index < Tokens.Count ? Tokens[index] : null; if (tokenAfterOperator != null && tokenAfterOperator.Value.Contains('.')) { sqlObject = GetSqlObject(tokenAfterOperator.Value); } else if (prev.Value == "=" && index >= 2) { var tokenBeforeOperator = Tokens[index - 2]; sqlObject = new SqlObject(tokenBeforeOperator.Value, null, SqlObjectTypes.Value, null); } } } return(sqlObject); }