Skip to content

Commit a69a328

Browse files
committed
IS NOT DISTINCT FROM seems to be mostly MSSQL
1 parent e21f871 commit a69a328

3 files changed

Lines changed: 27 additions & 25 deletions

File tree

src/SyntaxImprovement.Tests/Generators/PostgreSQL/EnumerableMethodsTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public void It_understands_Enumerable_First_method()
1414
{
1515
var list = new List<long> { 100, 200 };
1616
var query = new Select<LongTestEntity>().Where(e => e.Id == list.First()).ToQuery();
17-
Assert.Equal("WHERE \"Id\" IS NOT DISTINCT FROM @p0;", query.QueryText.AfterFirst("WHERE", includeMatchStringInResult: true));
17+
Assert.Equal("WHERE \"Id\" = @p0;", query.QueryText.AfterFirst("WHERE", includeMatchStringInResult: true));
1818
Assert.Single(query.EnumerateParameters());
1919
Assert.Equal(100, (long)query.EnumerateParameters().First().Value);
2020
}
@@ -24,7 +24,7 @@ public void It_understands_Enumerable_Single_method()
2424
{
2525
var list = new List<long> { 200 };
2626
var query = new Select<LongTestEntity>().Where(e => e.Id == list.Single()).ToQuery();
27-
Assert.Equal("WHERE \"Id\" IS NOT DISTINCT FROM @p0;", query.QueryText.AfterFirst("WHERE", includeMatchStringInResult: true));
27+
Assert.Equal("WHERE \"Id\" = @p0;", query.QueryText.AfterFirst("WHERE", includeMatchStringInResult: true));
2828
Assert.Single(query.EnumerateParameters());
2929
Assert.Equal(200, (long)query.EnumerateParameters().First().Value);
3030
}

src/SyntaxImprovement.Tests/Generators/PostgreSQL/SqlGeneratorTests.cs

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public void It_generates_correct_where_with_single_argument()
5454
.Where(person => person.Name == "Peter")
5555
.ToQuery();
5656

57-
Assert.Equal("SELECT \"Id\", \"Name\" FROM \"Person\" WHERE \"Name\" IS NOT DISTINCT FROM @p0;", query.QueryText);
57+
Assert.Equal("SELECT \"Id\", \"Name\" FROM \"Person\" WHERE \"Name\" = @p0;", query.QueryText);
5858
Assert.Equal("Peter", ((IDictionary<string, object>)((dynamic)query).Parameters)["@p0"]);
5959
}
6060

@@ -63,7 +63,7 @@ public void It_generates_correct_where_with_single_argument()
6363
.Where(person => person.Name != "Peter")
6464
.ToQuery();
6565

66-
Assert.Equal("SELECT \"Id\", \"Name\" FROM \"Person\" WHERE \"Name\" IS DISTINCT FROM @p0;", query.QueryText);
66+
Assert.Equal("SELECT \"Id\", \"Name\" FROM \"Person\" WHERE \"Name\" != @p0;", query.QueryText);
6767
Assert.Equal("Peter", ((IDictionary<string, object>)((dynamic)query).Parameters)["@p0"]);
6868
}
6969
}
@@ -75,7 +75,7 @@ public void It_generates_correct_where_with_multiple_arguments()
7575
.Where(person => person.Name == "Peter" && person.Id == 1)
7676
.ToQuery();
7777

78-
Assert.Equal("SELECT \"Id\", \"Name\" FROM \"Person\" WHERE (\"Name\" IS NOT DISTINCT FROM @p0) AND (\"Id\" IS NOT DISTINCT FROM @p1);", query.QueryText);
78+
Assert.Equal("SELECT \"Id\", \"Name\" FROM \"Person\" WHERE (\"Name\" = @p0) AND (\"Id\" = @p1);", query.QueryText);
7979
Assert.Equal("Peter", ((IDictionary<string, object>)((dynamic)query).Parameters)["@p0"]);
8080
Assert.Equal(1, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p1"]);
8181
}
@@ -145,39 +145,39 @@ public void It_does_not_have_the_bug_described_in_issue_2()
145145
{
146146
var idString = "DeviceId";
147147
var query = new Select<BooleanTestModel>().Where(model => model.IdStr == idString && model.IsActive == true).ToQuery();
148-
Assert.Equal("SELECT \"IdStr\", \"IsActive\" FROM \"BooleanTestModel\" WHERE (\"IdStr\" IS NOT DISTINCT FROM @p0) AND (\"IsActive\" IS NOT DISTINCT FROM @p1);", query.QueryText);
148+
Assert.Equal("SELECT \"IdStr\", \"IsActive\" FROM \"BooleanTestModel\" WHERE (\"IdStr\" = @p0) AND (\"IsActive\" = @p1);", query.QueryText);
149149
Assert.Equal(idString, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p0"]);
150150
Assert.Equal(true, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p1"]);
151151
}
152152

153153
{
154154
long? id = 28;
155155
var query = new Select<LongTestEntity>().Where(model => model.Id == id && model.IsDeleted == false).ToQuery();
156-
Assert.Equal("SELECT \"Id\", \"IsDeleted\" FROM \"LongTest\" WHERE (\"Id\" IS NOT DISTINCT FROM @p0) AND (\"IsDeleted\" IS NOT DISTINCT FROM @p1);", query.QueryText);
156+
Assert.Equal("SELECT \"Id\", \"IsDeleted\" FROM \"LongTest\" WHERE (\"Id\" = @p0) AND (\"IsDeleted\" = @p1);", query.QueryText);
157157
Assert.Equal(id, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p0"]);
158158
Assert.Equal(false, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p1"]);
159159
}
160160

161161
{
162162
long? id = 28;
163163
var query = new Select<LongTestEntity>().Where(model => model.Id == id.Value && model.IsDeleted == false).ToQuery();
164-
Assert.Equal("SELECT \"Id\", \"IsDeleted\" FROM \"LongTest\" WHERE (\"Id\" IS NOT DISTINCT FROM @p0) AND (\"IsDeleted\" IS NOT DISTINCT FROM @p1);", query.QueryText);
164+
Assert.Equal("SELECT \"Id\", \"IsDeleted\" FROM \"LongTest\" WHERE (\"Id\" = @p0) AND (\"IsDeleted\" = @p1);", query.QueryText);
165165
Assert.Equal(id, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p0"]);
166166
Assert.Equal(false, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p1"]);
167167
}
168168

169169
{
170170
Guid? id = Guid.NewGuid();
171171
var query = new Select<GuidTestEntity>().Where(model => model.Fk == id && model.IsDeleted == false).ToQuery();
172-
Assert.Equal("SELECT \"Id\", \"Fk\", \"IsDeleted\" FROM \"GuidTestEntity\" WHERE (\"Fk\" IS NOT DISTINCT FROM @p0) AND (\"IsDeleted\" IS NOT DISTINCT FROM @p1);", query.QueryText);
172+
Assert.Equal("SELECT \"Id\", \"Fk\", \"IsDeleted\" FROM \"GuidTestEntity\" WHERE (\"Fk\" = @p0) AND (\"IsDeleted\" = @p1);", query.QueryText);
173173
Assert.Equal(id, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p0"]);
174174
Assert.Equal(false, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p1"]);
175175
}
176176

177177
{
178178
Guid? id = Guid.NewGuid();
179179
var query = new Select<GuidTestEntity>().Where(model => model.Fk == id.Value && model.IsDeleted == false).ToQuery();
180-
Assert.Equal("SELECT \"Id\", \"Fk\", \"IsDeleted\" FROM \"GuidTestEntity\" WHERE (\"Fk\" IS NOT DISTINCT FROM @p0) AND (\"IsDeleted\" IS NOT DISTINCT FROM @p1);", query.QueryText);
180+
Assert.Equal("SELECT \"Id\", \"Fk\", \"IsDeleted\" FROM \"GuidTestEntity\" WHERE (\"Fk\" = @p0) AND (\"IsDeleted\" = @p1);", query.QueryText);
181181
Assert.Equal(id, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p0"]);
182182
Assert.Equal(false, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p1"]);
183183
}
@@ -189,7 +189,7 @@ public void It_understands_unary_not()
189189
{
190190
long id = 0;
191191
var query = new Select<LongTestEntity>().Where(model => model.Id == id && model.IsDeleted == !false).ToQuery();
192-
Assert.Equal("SELECT \"Id\", \"IsDeleted\" FROM \"LongTest\" WHERE (\"Id\" IS NOT DISTINCT FROM @p0) AND (\"IsDeleted\" IS NOT DISTINCT FROM @p1);", query.QueryText);
192+
Assert.Equal("SELECT \"Id\", \"IsDeleted\" FROM \"LongTest\" WHERE (\"Id\" = @p0) AND (\"IsDeleted\" = @p1);", query.QueryText);
193193
Assert.Equal(id, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p0"]);
194194
Assert.Equal(true, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p1"]);
195195
}
@@ -199,7 +199,7 @@ public void It_understands_unary_not()
199199
public void It_understands_gt_and_lt()
200200
{
201201
var query = new Select<LongTestEntity>().Where(model => model.Id > 1000 && model.IsDeleted == !true && model.Id <= 1001L).ToQuery();
202-
Assert.Equal("SELECT \"Id\", \"IsDeleted\" FROM \"LongTest\" WHERE ((\"Id\" > @p0) AND (\"IsDeleted\" IS NOT DISTINCT FROM @p1)) AND (\"Id\" <= @p2);", query.QueryText);
202+
Assert.Equal("SELECT \"Id\", \"IsDeleted\" FROM \"LongTest\" WHERE ((\"Id\" > @p0) AND (\"IsDeleted\" = @p1)) AND (\"Id\" <= @p2);", query.QueryText);
203203
Assert.Equal(1000L, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p0"]);
204204
Assert.Equal(false, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p1"]);
205205
Assert.Equal(1001L, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p2"]);
@@ -211,7 +211,7 @@ public void It_understands_boolean_true()
211211
var query = new Select<BooleanTestModel>()
212212
.Where(e => e.IsActive)
213213
.ToQuery();
214-
Assert.Equal("SELECT \"IdStr\", \"IsActive\" FROM \"BooleanTestModel\" WHERE \"IsActive\" IS NOT DISTINCT FROM @p0;", query.QueryText);
214+
Assert.Equal("SELECT \"IdStr\", \"IsActive\" FROM \"BooleanTestModel\" WHERE \"IsActive\" = @p0;", query.QueryText);
215215
Assert.Equal(true, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p0"]);
216216
}
217217

@@ -221,7 +221,7 @@ public void It_understands_boolean_false()
221221
var query = new Select<BooleanTestModel>()
222222
.Where(e => e.IsActive == false)
223223
.ToQuery();
224-
Assert.Equal("SELECT \"IdStr\", \"IsActive\" FROM \"BooleanTestModel\" WHERE \"IsActive\" IS NOT DISTINCT FROM @p0;", query.QueryText);
224+
Assert.Equal("SELECT \"IdStr\", \"IsActive\" FROM \"BooleanTestModel\" WHERE \"IsActive\" = @p0;", query.QueryText);
225225
Assert.Equal(false, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p0"]);
226226
}
227227

@@ -231,7 +231,7 @@ public void It_understands_boolean_negate()
231231
var query = new Select<BooleanTestModel>()
232232
.Where(e => !e.IsActive)
233233
.ToQuery();
234-
Assert.Equal("SELECT \"IdStr\", \"IsActive\" FROM \"BooleanTestModel\" WHERE \"IsActive\" IS NOT DISTINCT FROM @p0;", query.QueryText);
234+
Assert.Equal("SELECT \"IdStr\", \"IsActive\" FROM \"BooleanTestModel\" WHERE \"IsActive\" = @p0;", query.QueryText);
235235
Assert.Equal(false, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p0"]);
236236
}
237237

@@ -259,7 +259,7 @@ public void It_generates_correct_update()
259259
.Where(person => person.Id == 1)
260260
.ToQuery();
261261

262-
Assert.Equal("UPDATE \"Person\" SET \"Name\" = @p1 WHERE \"Id\" IS NOT DISTINCT FROM @p0", query.QueryText);
262+
Assert.Equal("UPDATE \"Person\" SET \"Name\" = @p1 WHERE \"Id\" = @p0", query.QueryText);
263263
Assert.Equal("Peter", ((IDictionary<string, object>)((dynamic)query).Parameters)["@p1"]);
264264
Assert.Equal(1, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p0"]);
265265
}
@@ -274,7 +274,7 @@ public void It_generates_correct_update_IN()
274274
.Where(person => names.Contains(person.Name) && person.Id == 1)
275275
.ToQuery();
276276

277-
Assert.Equal("UPDATE \"Person\" SET \"Name\" = @p4 WHERE (\"Name\" IN (@p0, @p1, @p2)) AND (\"Id\" IS NOT DISTINCT FROM @p3)", query.QueryText);
277+
Assert.Equal("UPDATE \"Person\" SET \"Name\" = @p4 WHERE (\"Name\" IN (@p0, @p1, @p2)) AND (\"Id\" = @p3)", query.QueryText);
278278
Assert.Equal("Per", ((IDictionary<string, object>)((dynamic)query).Parameters)["@p0"]);
279279
Assert.Equal("Pål", ((IDictionary<string, object>)((dynamic)query).Parameters)["@p1"]);
280280
Assert.Equal("Espen", ((IDictionary<string, object>)((dynamic)query).Parameters)["@p2"]);
@@ -304,7 +304,7 @@ public void It_generates_correct_update_with_multi_params()
304304
.Where(person => person.Id == 1)
305305
.ToQuery();
306306

307-
Assert.Equal("UPDATE \"Person\" SET \"Name\" = @p1, \"Id\" = @p2 WHERE \"Id\" IS NOT DISTINCT FROM @p0", query.QueryText);
307+
Assert.Equal("UPDATE \"Person\" SET \"Name\" = @p1, \"Id\" = @p2 WHERE \"Id\" = @p0", query.QueryText);
308308
Assert.Equal("Peter", ((IDictionary<string, object>)((dynamic)query).Parameters)["@p1"]);
309309
Assert.Equal(2, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p2"]);
310310
Assert.Equal(1, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p0"]);
@@ -360,7 +360,7 @@ public void It_can_update_entire_model()
360360
.Where(e => e.Id == original.Id)
361361
.ToQuery();
362362

363-
Assert.Equal("UPDATE \"Table\" SET \"Id\" = @p1, \"FirstName\" = @p2, \"IsAdmin\" = @p4, \"LastName\" = @p5 WHERE \"Id\" IS NOT DISTINCT FROM @p0", query.QueryText);
363+
Assert.Equal("UPDATE \"Table\" SET \"Id\" = @p1, \"FirstName\" = @p2, \"IsAdmin\" = @p4, \"LastName\" = @p5 WHERE \"Id\" = @p0", query.QueryText);
364364
Assert.Equal(2, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p0"]);
365365
Assert.Equal(5, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p1"]);
366366
Assert.Equal("Ole M", ((IDictionary<string, object>)((dynamic)query).Parameters)["@p2"]);
@@ -397,7 +397,7 @@ public void It_can_update_boolean_fields()
397397
.Where(u => u.Id == user.Id)
398398
.ToQuery();
399399

400-
Assert.Equal("UPDATE \"userschema\".\"User\" SET \"PersonId\" = @p1, \"IsActive\" = @p2, \"IsAdmin\" = @p3, \"CanWrite\" = @p4 WHERE \"Id\" IS NOT DISTINCT FROM @p0", query.QueryText);
400+
Assert.Equal("UPDATE \"userschema\".\"User\" SET \"PersonId\" = @p1, \"IsActive\" = @p2, \"IsAdmin\" = @p3, \"CanWrite\" = @p4 WHERE \"Id\" = @p0", query.QueryText);
401401
Assert.Equal(userId, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p0"]);
402402
Assert.Equal(personId, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p1"]);
403403
Assert.Equal(true, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p2"]);
@@ -492,7 +492,7 @@ public class DeleteTests
492492
public void It_generates_correct_query()
493493
{
494494
var query = new Delete<Person>().Where(person => person.Name == "Peter" || person.Id == 1).ToQuery();
495-
Assert.Equal("DELETE FROM \"Person\" WHERE (\"Name\" IS NOT DISTINCT FROM @p0) OR (\"Id\" IS NOT DISTINCT FROM @p1);", query.QueryText);
495+
Assert.Equal("DELETE FROM \"Person\" WHERE (\"Name\" = @p0) OR (\"Id\" = @p1);", query.QueryText);
496496
Assert.Equal("Peter", ((IDictionary<string, object>)((dynamic)query).Parameters)["@p0"]);
497497
Assert.Equal(1, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p1"]);
498498
}
@@ -515,7 +515,7 @@ public void It_handles_NULL_in_WHERE()
515515

516516
var query = select.ToQuery();
517517

518-
var expected = $"SELECT \"Id\", \"FkId\", \"NullableDateTime\", \"NullableBool\", \"NullableStr\" FROM \"NullTest\" WHERE (\"FkId\" IS NOT DISTINCT FROM @p0) AND (((\"NullableDateTime\" IS NOT DISTINCT FROM NULL) OR ((\"NullableBool\" IS NOT DISTINCT FROM @p1) AND (\"NullableStr\" IS NOT DISTINCT FROM NULL))) OR (\"NullableStr\" IS NOT DISTINCT FROM @p2));";
518+
var expected = $"SELECT \"Id\", \"FkId\", \"NullableDateTime\", \"NullableBool\", \"NullableStr\" FROM \"NullTest\" WHERE (\"FkId\" = @p0) AND (((\"NullableDateTime\" = NULL) OR ((\"NullableBool\" = @p1) AND (\"NullableStr\" = NULL))) OR (\"NullableStr\" = @p2));";
519519
Assert.Equal(expected, query.QueryText);
520520
Assert.Equal(1, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p0"]);
521521
Assert.Equal(false, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p1"]);
@@ -538,7 +538,7 @@ public void It_handles_NOT_NULL_in_WHERE()
538538

539539
var query = select.ToQuery();
540540

541-
var expected = $"SELECT \"Id\", \"FkId\", \"NullableDateTime\", \"NullableBool\", \"NullableStr\" FROM \"NullTest\" WHERE (\"FkId\" IS NOT DISTINCT FROM @p0) AND (((\"NullableDateTime\" IS DISTINCT FROM NULL) OR ((\"NullableBool\" IS NOT DISTINCT FROM @p1) AND (\"NullableStr\" IS NOT DISTINCT FROM NULL))) OR (\"NullableStr\" IS NOT DISTINCT FROM @p2));";
541+
var expected = $"SELECT \"Id\", \"FkId\", \"NullableDateTime\", \"NullableBool\", \"NullableStr\" FROM \"NullTest\" WHERE (\"FkId\" = @p0) AND (((\"NullableDateTime\" != NULL) OR ((\"NullableBool\" = @p1) AND (\"NullableStr\" = NULL))) OR (\"NullableStr\" = @p2));";
542542
Assert.Equal(expected, query.QueryText);
543543
Assert.Equal(1, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p0"]);
544544
Assert.Equal(false, ((IDictionary<string, object>)((dynamic)query).Parameters)["@p1"]);

src/SyntaxImprovement/Generators/Sql/Internal/DatabaseTypeExtensions.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ public static string GetEqualsOperator(this DatabaseType databaseType)
77
return databaseType switch
88
{
99
DatabaseType.SQLite => " IS ",
10-
_ => " IS NOT DISTINCT FROM "
10+
DatabaseType.MSSQL => " IS NOT DISTINCT FROM ",
11+
_ => " = "
1112
};
1213
}
1314

@@ -16,7 +17,8 @@ public static string GetNotEqualsOperator(this DatabaseType databaseType)
1617
return databaseType switch
1718
{
1819
DatabaseType.SQLite => " IS NOT ",
19-
_ => " IS DISTINCT FROM "
20+
DatabaseType.MSSQL => " IS DISTINCT FROM ",
21+
_ => " != "
2022
};
2123
}
2224

0 commit comments

Comments
 (0)