private void ParseSqlSelectStatement(TSqlStatement sqlStatement) { if (sqlStatement.GetType() == typeof(SelectStatement)) { SelectStatement aSelectStatement = (SelectStatement)sqlStatement; QueryExpression aQueryExpression = aSelectStatement.QueryExpression; if (aQueryExpression.GetType() == typeof(QuerySpecification)) { QuerySpecification aQuerySpecification = (QuerySpecification)aQueryExpression; if (aQuerySpecification.FromClause == null) { return; //'select *' is valid query, but not of our interest } //tables NamedTableReferenceVisitor ntVisitor = new NamedTableReferenceVisitor(Context); aQuerySpecification.FromClause.Accept(ntVisitor); TablesReferred = ntVisitor.Tables; //columns ScalarExpressionVisitor seVisitor = null; foreach (SelectElement selectStatement in aQuerySpecification.SelectElements) { seVisitor = new ScalarExpressionVisitor(Context, TablesReferred[0]); selectStatement.Accept(seVisitor); Columns.AddRange(seVisitor.Columns); } if (!string.IsNullOrEmpty(seVisitor.ParsedQuery)) { ParsedQuery = seVisitor.ParsedQuery; //todo } //else // ParsedQuery = Columns.GetParsedQuery(ParsedQuery); UpdateReferredTables(Columns); //ensure unique tables TablesReferred = new List <RbacTable>(TablesReferred.DistinctBy(t => t.Name)); //joins JoinClauseVisitor jcVisitor = new JoinClauseVisitor(Context); aQueryExpression.AcceptChildren(jcVisitor); JoinClauses = jcVisitor.JoinClauses; //where clause if (aQuerySpecification.WhereClause != null) { EqualVisitor cidv = new EqualVisitor(ParsedQuery); InPredicateVisitor inpv = new InPredicateVisitor(ParsedQuery); aQuerySpecification.WhereClause.AcceptChildren(cidv); aQuerySpecification.WhereClause.AcceptChildren(inpv); WhereClauses.AddRange(cidv.WhereClauses); WhereClauses.AddRange(inpv.WhereClauses); WhereClauses.ParseReferenceTableNames(JoinClauses); } } } else { Errors.Add("Not a select statement!"); } }