public override IList <SqlRuleProblem> Analyze(SqlRuleExecutionContext ruleExecutionContext) { var problems = new List <SqlRuleProblem>(); var sqlObj = ruleExecutionContext.ModelElement; if (sqlObj == null || sqlObj.IsWhiteListed()) { return(problems); } var fragment = ruleExecutionContext.ScriptFragment.GetFragment(ProgrammingSchemaTypes); // only visit the function calls inside the where clauses var visitor = new WhereClauseVisitor(); fragment.Accept(visitor); foreach (var clause in visitor.Statements) { var functionVisitor = new FunctionCallVisitor("charindex"); clause.Accept(functionVisitor); problems.AddRange(functionVisitor.NotIgnoredStatements(RuleId).Select(f => new SqlRuleProblem(Message, sqlObj, f))); } return(problems); }
/// <summary> /// Performs analysis and returns a list of problems detected /// </summary> /// <param name="ruleExecutionContext">Contains the schema model and model element to analyze</param> /// <returns> /// The problems detected by the rule in the given element /// </returns> public override IList <SqlRuleProblem> Analyze(SqlRuleExecutionContext ruleExecutionContext) { var problems = new List <SqlRuleProblem>(); var sqlObj = ruleExecutionContext.ModelElement; if (sqlObj == null || sqlObj.IsWhiteListed()) { return(problems); } var fragment = ruleExecutionContext.ScriptFragment.GetFragment(ProgrammingAndViewSchemaTypes); var whereClauseVisitor = new WhereClauseVisitor(); fragment.Accept(whereClauseVisitor); foreach (var whereClause in whereClauseVisitor.Statements) { var functionVisitor = new FunctionCallVisitor(); whereClause.Accept(functionVisitor); var offenders = from FunctionCall f in functionVisitor.NotIgnoredStatements(RuleId) where CheckFunction(f) select f; problems.AddRange(offenders.Select(f => new SqlRuleProblem(Message, sqlObj, f))); } return(problems); }
public override IList <SqlRuleProblem> Analyze(SqlRuleExecutionContext ruleExecutionContext) { var problems = new List <SqlRuleProblem>(); var sqlObj = ruleExecutionContext.ModelElement; if (sqlObj == null || sqlObj.IsWhiteListed()) { return(problems); } var model = ruleExecutionContext.SchemaModel; var fragment = ruleExecutionContext.ScriptFragment.GetFragment(ProgrammingSchemaTypes); var visitor = new DataModificationStatementVisitor(); fragment.Accept(visitor); var modelFunctions = model.GetObjects(DacQueryScopes.UserDefined, new[] { ModelSchema.ScalarFunction, ModelSchema.TableValuedFunction }); foreach (var stmt in visitor.Statements) { var functionCallVisitor = new FunctionCallVisitor(); stmt.Accept(functionCallVisitor); foreach (var functionCall in functionCallVisitor.NotIgnoredStatements(RuleId)) { var createFunctionVisitor = new CreateFunctionVisitor(); IList <ParseError> parseErrors; TSqlFragment fnFragment; var fnName = functionCall.GetName(); var modelFunction = modelFunctions.FirstOrDefault(mf => _comparer.Equals(mf.Name.GetName(), fnName)); if (modelFunction == null) { continue; } //we need to parse the sql into a fragment, so we can use the visitors on it fnFragment = modelFunction.GetFragment(out parseErrors); fnFragment.Accept(createFunctionVisitor); if (!createFunctionVisitor.Statements.Any(crfn => crfn.Options != null && crfn.Options.Any(o => o.OptionKind == FunctionOptionKind.SchemaBinding))) { problems.Add(new SqlRuleProblem(Message, sqlObj, functionCall)); } } } return(problems); }
public override IList <SqlRuleProblem> Analyze(SqlRuleExecutionContext ruleExecutionContext) { var problems = new List <SqlRuleProblem>(); var sqlObj = ruleExecutionContext.ModelElement; if (sqlObj == null || sqlObj.IsWhiteListed()) { return(problems); } var fragment = ruleExecutionContext.ScriptFragment.GetFragment(ProgrammingAndViewSchemaTypes); var selectStatementVisitor = new SelectStatementVisitor(); fragment.Accept(selectStatementVisitor); foreach (var statement in selectStatementVisitor.Statements) { bool found = false; if (statement.QueryExpression is QuerySpecification selects) { foreach (var selectElement in selects.SelectElements) { var functionCallVisitor = new FunctionCallVisitor(); selectElement.Accept(functionCallVisitor); foreach (var function in functionCallVisitor.NotIgnoredStatements(RuleId)) { if (function.UniqueRowFilter == UniqueRowFilter.Distinct && Constants.Aggregates.Contains(function.FunctionName.Value.ToUpper())) { problems.Add(new SqlRuleProblem(Message, sqlObj, statement)); } } if (found) { break; } } } } return(problems); }