Skip to content

Commit b7432b8

Browse files
committed
Improve InlineFunctionSqlCodeAnalysisRule
1 parent 6bb1059 commit b7432b8

3 files changed

Lines changed: 39 additions & 14 deletions

File tree

src/Dibix.Sdk/CodeAnalysis/Rules/InlineFunctionSqlCodeAnalysisRule.cs

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public override void Visit(CreateFunctionStatement node)
4040

4141
public override void Visit(CheckConstraintDefinition node)
4242
{
43+
// CONSTRAINT [CK_dbx_codeanalysis_error_037_table_x] CHECK ([dbo].[dbx_codeanalysis_error_037_scalar]() = 0)
4344
ScalarFunctionCallVisitor visitor = new ScalarFunctionCallVisitor(this.IsScalarFunctionCall);
4445
node.CheckCondition.Accept(visitor);
4546
foreach (FunctionCall call in visitor.Locations)
@@ -51,39 +52,62 @@ public override void Visit(CheckConstraintDefinition node)
5152

5253
public override void Visit(DeclareVariableElement node)
5354
{
55+
// DECLARE @y INT = [dbo].[dbx_codeanalysis_error_037_scalar]()
56+
if (node.Value is FunctionCall call)
57+
{
58+
VisitFunctionCall(call);
59+
return;
60+
}
61+
62+
// DECLARE @x INT = (SELECT [dbo].[dbx_codeanalysis_error_037_scalar]())
5463
if (node.Value is ScalarSubquery scalarSubquery
5564
&& scalarSubquery.QueryExpression is QuerySpecification querySpecification)
5665
this.VisitQuerySpecification(querySpecification);
5766
}
5867

5968
public override void Visit(SelectStatement node)
6069
{
70+
// SELECT @x = [dbo].[dbx_codeanalysis_error_037_scalar]()
71+
// and
72+
// SELECT [dbo].[dbx_codeanalysis_error_037_scalar]()
6173
if (node.QueryExpression is QuerySpecification querySpecification)
6274
this.VisitQuerySpecification(querySpecification);
6375
}
6476

6577
public override void Visit(SetVariableStatement node)
6678
{
67-
TSqlFragment target = node?.Expression;
68-
if (target == null)
69-
return;
70-
71-
if (this._scalarFunctionCalls.ContainsKey(target.StartOffset))
72-
this._scalarFunctionCalls.Remove(target.StartOffset);
79+
// SET @x = [dbo].[dbx_codeanalysis_error_037_scalar]()
80+
if (node?.Expression is FunctionCall call)
81+
VisitFunctionCall(call);
7382
}
7483

7584
private void VisitQuerySpecification(QuerySpecification node)
7685
{
77-
if (node.SelectElements.Count == 1
78-
&& node.FromClause == null)
86+
if (node.SelectElements.Count != 1 || node.FromClause != null)
87+
return;
88+
89+
TSqlFragment target = node.SelectElements[0];
90+
switch (target)
7991
{
80-
TSqlFragment target = node.SelectElements[0];
81-
if (target is SelectSetVariable selectSetVariable)
92+
// SELECT @x = [dbo].[dbx_codeanalysis_error_037_scalar]()
93+
case SelectSetVariable selectSetVariable:
8294
target = selectSetVariable.Expression;
95+
break;
8396

84-
if (this._scalarFunctionCalls.ContainsKey(target.StartOffset))
85-
this._scalarFunctionCalls.Remove(target.StartOffset);
97+
// DECLARE @x INT = (SELECT [dbo].[dbx_codeanalysis_error_037_scalar]())
98+
case SelectScalarExpression selectScalarExpression:
99+
target = selectScalarExpression.Expression;
100+
break;
86101
}
102+
103+
if (target is FunctionCall call)
104+
this.VisitFunctionCall(call);
105+
}
106+
107+
private void VisitFunctionCall(FunctionCall call)
108+
{
109+
if (this._scalarFunctionCalls.ContainsKey(call.StartOffset) && IsScalarFunctionCall(call))
110+
this._scalarFunctionCalls.Remove(call.StartOffset);
87111
}
88112

89113
private bool IsScalarFunctionCall(FunctionCall call) => base.Model.IsScalarFunction(call);

tests/Dibix.Sdk.Tests.Database/CodeAnalysis/dbx_codeanalysis_error_037.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ AS
3131
BEGIN
3232

3333
DECLARE @x INT = (SELECT [dbo].[dbx_codeanalysis_error_037_scalar]()) -- OK
34+
DECLARE @y INT = [dbo].[dbx_codeanalysis_error_037_scalar]() -- OK
3435
SELECT @x = [dbo].[dbx_codeanalysis_error_037_scalar]() -- OK
3536
SET @x = [dbo].[dbx_codeanalysis_error_037_scalar]() -- OK
3637
SELECT [dbo].[dbx_codeanalysis_error_037_scalar]() -- OK

tests/Dibix.Sdk.Tests/Resources/CodeAnalysis/InlineFunctionSqlCodeAnalysisRule.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88
<error
99
ruleid="37"
1010
message="Scalar functions should only be used for assignments or check constraints. Otherwise replace it with an inline table-valued function: dbx_codeanalysis_error_037_scalar"
11-
line="40"
11+
line="41"
1212
column="16" />
1313
<error
1414
ruleid="37"
1515
message="Scalar functions should only be used for assignments or check constraints. Otherwise replace it with an inline table-valued function: dbx_codeanalysis_error_037_scalar"
16-
line="42"
16+
line="43"
1717
column="18" />
1818
</errors>

0 commit comments

Comments
 (0)