Skip to content

Commit ff6d68d

Browse files
committed
Added support for the "null" expression.
1 parent 586b526 commit ff6d68d

3 files changed

Lines changed: 22 additions & 4 deletions

File tree

SqlServerSimulator.Tests/BuiltInFunctionTests.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ namespace SqlServerSimulator;
66
[TestClass]
77
public sealed class BuiltInFunctionTests
88
{
9+
private static object? ExecuteScalar(string commandText) => new Simulation().ExecuteScalar(commandText);
10+
911
private static T ExecuteScalar<T>(string commandText) where T : struct => new Simulation().ExecuteScalar<T>(commandText);
1012

1113
[TestMethod]
@@ -16,7 +18,11 @@ public void UnrecognizedBuiltInFunction()
1618
}
1719

1820
[TestMethod]
19-
public void DataLength() => AreEqual(4, ExecuteScalar<int>("select datalength(1)"));
21+
public void DataLengthOfNull() => IsInstanceOfType<DBNull>(ExecuteScalar("select datalength(null)"));
22+
23+
[TestMethod]
24+
[DataRow("1", 4)]
25+
public void DataLength(string input, object? output) => AreEqual(output, ExecuteScalar($"select datalength({input})"));
2026

2127
[TestMethod]
2228
public void DataLengthAllCaps() => AreEqual(4, ExecuteScalar<int>("select DATALENGTH(1)"));

SqlServerSimulator.Tests/SelectTests.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ namespace SqlServerSimulator;
55
[TestClass]
66
public class SelectTests
77
{
8-
private static DbDataReader ScalarViaReaderTest(string commandText)
8+
private static object? ExecuteScalar(string commandText) => new Simulation().ExecuteScalar(commandText);
9+
10+
private static DbDataReader ExecuteReaderAndRead(string commandText)
911
{
1012
var reader = new Simulation().ExecuteReader(commandText);
1113
Assert.IsTrue(reader.Read());
@@ -14,11 +16,14 @@ private static DbDataReader ScalarViaReaderTest(string commandText)
1416

1517
[TestMethod]
1618
public void Select1ViaExecuteReaderIndexer()
17-
=> Assert.AreEqual(1, ScalarViaReaderTest("select 1")[0]);
19+
=> Assert.AreEqual(1, ExecuteReaderAndRead("select 1")[0]);
1820

1921
[TestMethod]
2022
public void Select1ViaExecuteReaderGetInt32()
21-
=> Assert.AreEqual(1, ScalarViaReaderTest("select 1").GetInt32(0));
23+
=> Assert.AreEqual(1, ExecuteReaderAndRead("select 1").GetInt32(0));
24+
25+
[TestMethod]
26+
public void Null() => Assert.IsInstanceOfType<DBNull>(ExecuteScalar("select null"));
2227

2328
[TestMethod]
2429
[DataRow("SELECT @@VERSION")]

SqlServerSimulator/Parser/Expression.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ public static Expression Parse(Simulation simulation, IEnumerator<Token> tokens,
4848
throw SimulatedSqlException.SyntaxErrorNear(name);
4949

5050
return expression;
51+
case Keyword.Null:
52+
expression = new Value();
53+
continue;
5154
}
5255
}
5356

@@ -154,6 +157,10 @@ private sealed class Value : Expression
154157
{
155158
private readonly object? value;
156159

160+
public Value()
161+
{
162+
}
163+
157164
public Value(Numeric value)
158165
{
159166
this.value = value.Value;

0 commit comments

Comments
 (0)