Skip to content

Commit 9cee89b

Browse files
Merge pull request #105 from bruce-dunwiddie/develop
Release v2.4
2 parents 5a20e60 + 325b32f commit 9cee89b

18 files changed

+216
-46
lines changed

TSQL_Parser/TSQL_Parser/Expressions/Parsers/TSQLOperatorExpressionParser.cs renamed to TSQL_Parser/TSQL_Parser/Expressions/Parsers/TSQLOperationExpressionParser.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88

99
namespace TSQL.Expressions.Parsers
1010
{
11-
internal class TSQLOperatorExpressionParser
11+
internal class TSQLOperationExpressionParser
1212
{
13-
public TSQLOperatorExpression Parse(
13+
public TSQLOperationExpression Parse(
1414
ITSQLTokenizer tokenizer,
1515
TSQLExpression leftSide)
1616
{
17-
TSQLOperatorExpression opExpression = new TSQLOperatorExpression();
17+
TSQLOperationExpression opExpression = new TSQLOperationExpression();
1818

1919
opExpression.LeftSide = leftSide;
2020
opExpression.Operator = tokenizer.Current.AsOperator;

TSQL_Parser/TSQL_Parser/Expressions/Parsers/TSQLSelectExpressionParser.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public TSQLExpression Parse(ITSQLTokenizer tokenizer)
5151
}
5252
else
5353
{
54-
return new TSQLOperatorExpressionParser().Parse(
54+
return new TSQLOperationExpressionParser().Parse(
5555
tokenizer,
5656
expression);
5757
}

TSQL_Parser/TSQL_Parser/Expressions/Parsers/TSQLValueExpressionParser.cs

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public TSQLExpression Parse(ITSQLTokenizer tokenizer)
2222
tokenizer.Current.Type.In(
2323
TSQLTokenType.Operator))
2424
{
25-
return new TSQLOperatorExpressionParser().Parse(
25+
return new TSQLOperationExpressionParser().Parse(
2626
tokenizer,
2727
expression);
2828
}
@@ -125,6 +125,39 @@ public TSQLExpression ParseNext(
125125
#endregion
126126
}
127127
}
128+
else if (
129+
tokenizer.Current.IsKeyword(TSQLKeywords.DISTINCT) ||
130+
tokenizer.Current.IsKeyword(TSQLKeywords.ALL))
131+
{
132+
#region parse rest of expression contained inside parenthesis
133+
134+
TSQLDuplicateSpecificationExpression distinct = new TSQLDuplicateSpecificationExpression();
135+
136+
distinct.Tokens.Add(tokenizer.Current);
137+
138+
if (tokenizer.Current.IsKeyword(TSQLKeywords.ALL))
139+
{
140+
distinct.DuplicateSpecificationType = TSQLDuplicateSpecificationExpression.TSQLDuplicateSpecificationType.All;
141+
}
142+
else
143+
{
144+
distinct.DuplicateSpecificationType = TSQLDuplicateSpecificationExpression.TSQLDuplicateSpecificationType.Distinct;
145+
}
146+
147+
TSQLTokenParserHelper.ReadThroughAnyCommentsOrWhitespace(
148+
tokenizer,
149+
distinct.Tokens);
150+
151+
distinct.InnerExpression =
152+
new TSQLValueExpressionParser().Parse(
153+
tokenizer);
154+
155+
distinct.Tokens.AddRange(distinct.InnerExpression.Tokens);
156+
157+
return distinct;
158+
159+
#endregion
160+
}
128161
else if (tokenizer.Current.Type.In(
129162
TSQLTokenType.Variable,
130163
TSQLTokenType.SystemVariable))
@@ -158,6 +191,18 @@ public TSQLExpression ParseNext(
158191

159192
return constant;
160193
}
194+
else if (tokenizer.Current.IsKeyword(TSQLKeywords.NULL))
195+
{
196+
TSQLNullExpression nullExp = new TSQLNullExpression();
197+
198+
nullExp.Tokens.Add(tokenizer.Current);
199+
200+
TSQLTokenParserHelper.ReadThroughAnyCommentsOrWhitespace(
201+
tokenizer,
202+
nullExp.Tokens);
203+
204+
return nullExp;
205+
}
161206
else if (tokenizer.Current.IsKeyword(TSQLKeywords.CASE))
162207
{
163208
return new TSQLCaseExpressionParser().Parse(tokenizer);

TSQL_Parser/TSQL_Parser/Expressions/Parsers/TSQLVariableAssignmentExpressionParser.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public TSQLVariableAssignmentExpression Parse(
4444
tokenizer.Current.Type.In(
4545
TSQLTokenType.Operator))
4646
{
47-
rightSide = new TSQLOperatorExpressionParser().Parse(
47+
rightSide = new TSQLOperationExpressionParser().Parse(
4848
tokenizer,
4949
rightSide);
5050
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
7+
using TSQL.Tokens;
8+
9+
namespace TSQL.Expressions
10+
{
11+
public class TSQLDuplicateSpecificationExpression : TSQLExpression
12+
{
13+
public override TSQLExpressionType Type
14+
{
15+
get
16+
{
17+
return TSQLExpressionType.DuplicateSpecification;
18+
}
19+
}
20+
21+
public TSQLDuplicateSpecificationType DuplicateSpecificationType { get; internal set; }
22+
23+
public TSQLExpression InnerExpression { get; internal set; }
24+
25+
public enum TSQLDuplicateSpecificationType
26+
{
27+
Distinct,
28+
All
29+
}
30+
}
31+
}

TSQL_Parser/TSQL_Parser/Expressions/TSQLExpression.cs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,11 @@ public TSQLMulticolumnExpression AsMulticolumn
7272
}
7373
}
7474

75-
public TSQLOperatorExpression AsOperator
75+
public TSQLOperationExpression AsOperation
7676
{
7777
get
7878
{
79-
return this as TSQLOperatorExpression;
79+
return this as TSQLOperationExpression;
8080
}
8181
}
8282

@@ -119,5 +119,21 @@ public TSQLValueAsTypeExpression AsValueAsType
119119
return this as TSQLValueAsTypeExpression;
120120
}
121121
}
122+
123+
public TSQLNullExpression AsNull
124+
{
125+
get
126+
{
127+
return this as TSQLNullExpression;
128+
}
129+
}
130+
131+
public TSQLDuplicateSpecificationExpression AsDuplicateSpecification
132+
{
133+
get
134+
{
135+
return this as TSQLDuplicateSpecificationExpression;
136+
}
137+
}
122138
}
123139
}

TSQL_Parser/TSQL_Parser/Expressions/TSQLExpressionType.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public enum TSQLExpressionType
2929
/// </summary>
3030
Multicolumn,
3131

32-
Operator,
32+
Operation,
3333

3434
/// <summary>
3535
/// i.e. an expression surrounded by parenthesis, but not containing a subquery
@@ -54,6 +54,16 @@ public enum TSQLExpressionType
5454
/// <summary>
5555
/// e.g. 123.45 AS INT (only used as an argument to CAST function)
5656
/// </summary>
57-
ValueAsType
57+
ValueAsType,
58+
59+
/// <summary>
60+
/// e.g. NULL
61+
/// </summary>
62+
Null,
63+
64+
/// <summary>
65+
/// e.g. DISTINCT or ALL
66+
/// </summary>
67+
DuplicateSpecification
5868
}
5969
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
7+
using TSQL.Tokens;
8+
9+
namespace TSQL.Expressions
10+
{
11+
public class TSQLNullExpression : TSQLExpression
12+
{
13+
public override TSQLExpressionType Type
14+
{
15+
get
16+
{
17+
return TSQLExpressionType.Null;
18+
}
19+
}
20+
}
21+
}

TSQL_Parser/TSQL_Parser/Expressions/TSQLOperatorExpression.cs renamed to TSQL_Parser/TSQL_Parser/Expressions/TSQLOperationExpression.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88

99
namespace TSQL.Expressions
1010
{
11-
public class TSQLOperatorExpression : TSQLExpression
11+
public class TSQLOperationExpression : TSQLExpression
1212
{
1313
public override TSQLExpressionType Type
1414
{
1515
get
1616
{
17-
return TSQLExpressionType.Operator;
17+
return TSQLExpressionType.Operation;
1818
}
1919
}
2020

TSQL_Parser/TSQL_Parser/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
// You can specify all the values or you can default the Build and Revision Numbers
3333
// by using the '*' as shown below:
3434
// [assembly: AssemblyVersion("1.0.*")]
35-
[assembly: AssemblyVersion("2.3.0.0")]
36-
[assembly: AssemblyFileVersion("2.3.0.0")]
35+
[assembly: AssemblyVersion("2.4.0.0")]
36+
[assembly: AssemblyFileVersion("2.4.0.0")]
3737

3838
[assembly: InternalsVisibleTo("Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100793625650b945744f8a2c57bc75da89cd4d2c551636aa180c3020b7a15b815c10e983e83c312eb02f131c6fcf18aaffd6c8d9af6c4353c91ca0e9206b0fb8fb7805fc07b510a47ff40705ae56977ae8893e2d247d166aa400926582840e8a5602df055762bc3479dd14c9621a77946b6e6b0a00a77204c78fb52c65121bd75ba")]

TSQL_Parser/TSQL_Parser/Push.bat

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
nuget SetApiKey %NUGET_KEY%
2-
nuget push TSQL.Parser.2.3.0.snupkg -Source https://api.nuget.org/v3/index.json
3-
nuget push TSQL.Parser.2.3.0.nupkg -Source https://api.nuget.org/v3/index.json
2+
nuget push TSQL.Parser.2.4.0.snupkg -Source https://api.nuget.org/v3/index.json
3+
nuget push TSQL.Parser.2.4.0.nupkg -Source https://api.nuget.org/v3/index.json
44
pause

TSQL_Parser/TSQL_Parser/TSQL_Parser.csproj

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,18 +118,19 @@
118118
<Compile Include="Expressions\Parsers\TSQLValueExpressionParser.cs" />
119119
<Compile Include="Expressions\Parsers\TSQLSelectExpressionParser.cs" />
120120
<Compile Include="Elements\Parsers\TSQLValuesParser.cs" />
121-
<Compile Include="Expressions\Parsers\TSQLOperatorExpressionParser.cs" />
121+
<Compile Include="Expressions\Parsers\TSQLOperationExpressionParser.cs" />
122122
<Compile Include="Expressions\TSQLArgumentList.cs" />
123123
<Compile Include="Expressions\TSQLArgumentList.IEnumerable.cs">
124124
<DependentUpon>TSQLArgumentList.cs</DependentUpon>
125125
</Compile>
126126
<Compile Include="Expressions\TSQLColumnExpression.cs" />
127127
<Compile Include="Elements\TSQLDefaultValues.cs" />
128128
<Compile Include="Expressions\TSQLConstantExpression.cs" />
129+
<Compile Include="Expressions\TSQLDuplicateSpecificationExpression.cs" />
129130
<Compile Include="Expressions\TSQLValueAsTypeExpression.cs" />
130131
<Compile Include="Expressions\TSQLVariableAssignmentExpression.cs" />
131132
<Compile Include="Expressions\TSQLLogicalExpression.cs" />
132-
<Compile Include="Expressions\TSQLOperatorExpression.cs" />
133+
<Compile Include="Expressions\TSQLOperationExpression.cs" />
133134
<Compile Include="Expressions\TSQLExpressionType.cs" />
134135
<Compile Include="Expressions\TSQLFunctionExpression.cs" />
135136
<Compile Include="Expressions\TSQLGroupedExpression.cs" />
@@ -140,6 +141,7 @@
140141
<Compile Include="Expressions\TSQLCaseExpression.cs" />
141142
<Compile Include="Expressions\Parsers\TSQLCaseExpressionParser.cs" />
142143
<Compile Include="Expressions\TSQLExpression.cs" />
144+
<Compile Include="Expressions\TSQLNullExpression.cs" />
143145
<Compile Include="Expressions\TSQLVariableExpression.cs" />
144146
<Compile Include="IO\BufferedTextReader.cs" />
145147
<Compile Include="IO\BufferedTextReader.IDisposable.cs">

TSQL_Parser/TSQL_Parser/TSQL_Parser.nuspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22
<package>
33
<metadata>
44
<id>TSQL.Parser</id>
5-
<version>2.3.0</version>
5+
<version>2.4.0</version>
66
<title>TSQL.Parser</title>
77
<authors>Bruce Dunwiddie</authors>
88
<owners>shriop</owners>
99
<license type="expression">Apache-2.0</license>
1010
<projectUrl>https://github.com/bruce-dunwiddie/tsql-parser</projectUrl>
1111
<requireLicenseAcceptance>false</requireLicenseAcceptance>
1212
<description>Library for Parsing SQL Server T-SQL Scripts</description>
13-
<releaseNotes>Fixed handling of asterisks within SELECT, as both multiplication and multicolumn expression.</releaseNotes>
13+
<releaseNotes>Fixed handling of NULL in SELECT, and DISTINCT in COUNT().</releaseNotes>
1414
<copyright>Copyright © 2022</copyright>
1515
<tags>sql parser sql-server tsql</tags>
1616
</metadata>

TSQL_Parser/TSQL_Parser/TSQL_Parser_NetStandard.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
<TargetFramework>netstandard2.0</TargetFramework>
55
<AssemblyName>TSQL_Parser</AssemblyName>
66
<RootNamespace>TSQL_Parser</RootNamespace>
7-
<Version>2.3.0.0</Version>
8-
<AssemblyVersion>2.3.0.0</AssemblyVersion>
9-
<FileVersion>2.3.0.0</FileVersion>
7+
<Version>2.4.0.0</Version>
8+
<AssemblyVersion>2.4.0.0</AssemblyVersion>
9+
<FileVersion>2.4.0.0</FileVersion>
1010
<Description>Library for Parsing SQL Server TSQL Scripts</Description>
1111
<Copyright>Copyright © 2022</Copyright>
1212
<Company />

TSQL_Parser/Tests/Clauses/SelectClauseTests.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,18 +59,18 @@ public void SelectClause_Comments()
5959

6060
Assert.AreEqual(1, select.Columns.Count);
6161
Assert.IsNull(select.Columns[0].ColumnAlias);
62-
Assert.AreEqual(TSQLExpressionType.Operator, select.Columns[0].Expression.Type);
62+
Assert.AreEqual(TSQLExpressionType.Operation, select.Columns[0].Expression.Type);
6363

64-
TSQLOperatorExpression operatorExpression = select.Columns[0].Expression.AsOperator;
65-
Assert.AreEqual("/", operatorExpression.Operator.Text);
66-
Assert.AreEqual(TSQLExpressionType.Column, operatorExpression.LeftSide.Type);
64+
TSQLOperationExpression operationExpression = select.Columns[0].Expression.AsOperation;
65+
Assert.AreEqual("/", operationExpression.Operator.Text);
66+
Assert.AreEqual(TSQLExpressionType.Column, operationExpression.LeftSide.Type);
6767

68-
TSQLColumnExpression leftSide = operatorExpression.LeftSide.AsColumn;
68+
TSQLColumnExpression leftSide = operationExpression.LeftSide.AsColumn;
6969
Assert.AreEqual("oh", leftSide.TableReference.Single().AsIdentifier.Name);
7070
Assert.AreEqual("TaxAmt", leftSide.Column.Name);
71-
Assert.AreEqual(TSQLExpressionType.Column, operatorExpression.RightSide.Type);
71+
Assert.AreEqual(TSQLExpressionType.Column, operationExpression.RightSide.Type);
7272

73-
TSQLColumnExpression rightSide = operatorExpression.RightSide.AsColumn;
73+
TSQLColumnExpression rightSide = operationExpression.RightSide.AsColumn;
7474
Assert.AreEqual("oh", rightSide.TableReference.Single().AsIdentifier.Name);
7575
Assert.AreEqual("SubTotal", rightSide.Column.Name);
7676
Assert.AreEqual(" tax percent ", select.Columns.Last().Tokens.Last().AsMultilineComment.Comment);
@@ -327,9 +327,9 @@ public void SelectClause_UnaryOperator()
327327
TSQLSelectColumn column = select.Columns[0];
328328

329329
Assert.IsNull(column.ColumnAlias);
330-
Assert.AreEqual(TSQLExpressionType.Operator, column.Expression.Type);
330+
Assert.AreEqual(TSQLExpressionType.Operation, column.Expression.Type);
331331

332-
TSQLOperatorExpression tsqlOperator = column.Expression.AsOperator;
332+
TSQLOperationExpression tsqlOperator = column.Expression.AsOperation;
333333

334334
Assert.AreEqual("+", tsqlOperator.Operator.Text);
335335
Assert.IsNull(tsqlOperator.LeftSide);

TSQL_Parser/Tests/Expressions/OperatorExpressionTests.cs renamed to TSQL_Parser/Tests/Expressions/OperationExpressionTests.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616
namespace Tests.Expressions
1717
{
1818
[TestFixture(Category = "Expression Parsing")]
19-
public class OperatorExpressionTests
19+
public class OperationExpressionTests
2020
{
2121
[Test]
22-
public void OperatorExpression_Simple()
22+
public void OperationExpression_Simple()
2323
{
2424
TSQLTokenizer tokenizer = new TSQLTokenizer(
2525
"+ 2 - 3")
@@ -38,7 +38,7 @@ public void OperatorExpression_Simple()
3838

3939
Assert.IsTrue(tokenizer.MoveNext());
4040

41-
TSQLOperatorExpression op = new TSQLOperatorExpressionParser().Parse(
41+
TSQLOperationExpression op = new TSQLOperationExpressionParser().Parse(
4242
tokenizer,
4343
leftSide);
4444

@@ -61,8 +61,8 @@ public void OperatorExpression_Simple()
6161

6262
Assert.AreEqual("+", op.Operator.Text);
6363

64-
Assert.AreEqual(TSQLExpressionType.Operator, op.RightSide.Type);
65-
TSQLOperatorExpression rightSide = op.RightSide.AsOperator;
64+
Assert.AreEqual(TSQLExpressionType.Operation, op.RightSide.Type);
65+
TSQLOperationExpression rightSide = op.RightSide.AsOperation;
6666
TokenComparisons.CompareTokenLists(
6767
new List<TSQLToken>()
6868
{

0 commit comments

Comments
 (0)