Skip to content

Commit 39cf3f5

Browse files
committed
Try fix firebird parameter regex
1 parent 492d1bd commit 39cf3f5

File tree

3 files changed

+124
-20
lines changed

3 files changed

+124
-20
lines changed

src/NHibernate.Test/Async/Linq/ParameterTests.cs

Lines changed: 61 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,15 @@ public async Task CompareIntegralParametersAndColumnsAsync()
162162
3,
163163
sql =>
164164
{
165-
Assert.That(sql, Does.Not.Contain("cast"));
165+
if (Sfi.Dialect is FirebirdDialect)
166+
{
167+
Assert.That(sql, Does.Contain("cast"));
168+
}
169+
else
170+
{
171+
Assert.That(sql, Does.Not.Contain("cast"));
172+
}
173+
166174
Assert.That(GetTotalOccurrences(sql, $"Type: {pair.Value}"), Is.EqualTo(3));
167175
}));
168176
}
@@ -203,7 +211,15 @@ public async Task CompareIntegralParametersWithFloatingPointColumnsAsync()
203211
3,
204212
sql =>
205213
{
206-
Assert.That(sql, Does.Not.Contain("cast"));
214+
if (Sfi.Dialect is FirebirdDialect)
215+
{
216+
Assert.That(sql, Does.Contain("cast"));
217+
}
218+
else
219+
{
220+
Assert.That(sql, Does.Not.Contain("cast"));
221+
}
222+
207223
Assert.That(GetTotalOccurrences(sql, $"Type: {pair.Value}"), Is.EqualTo(3));
208224
}));
209225
}
@@ -245,7 +261,15 @@ public async Task CompareFloatingPointParametersAndColumnsAsync()
245261
totalParameters,
246262
sql =>
247263
{
248-
Assert.That(sql, Does.Not.Contain("cast"));
264+
if (Sfi.Dialect is FirebirdDialect)
265+
{
266+
Assert.That(sql, Does.Contain("cast"));
267+
}
268+
else
269+
{
270+
Assert.That(sql, Does.Not.Contain("cast"));
271+
}
272+
249273
Assert.That(GetTotalOccurrences(sql, $"Type: {pair.Value}"), Is.EqualTo(totalParameters));
250274
}));
251275
}
@@ -368,8 +392,17 @@ public async Task CompareFloatingPointParameterWithDifferentFloatingPointColumns
368392
var matches = pair.Value == "Double"
369393
? Regex.Matches(sql, @"cast\([\w\d]+\..+\)")
370394
: Regex.Matches(sql, @"cast\(((@|\?|:)p\d+|\?)\s+as.*\)");
371-
// SQLiteDialect uses sql cast for transparentcast method
372-
Assert.That(matches.Count, Is.EqualTo(sameType && !(Sfi.Dialect is SQLiteDialect) ? 0 : 1));
395+
if (Sfi.Dialect is FirebirdDialect)
396+
{
397+
// Additional casts are added by FirebirdClientDriver
398+
Assert.That(matches.Count, Is.EqualTo(pair.Value == "Double" ? 1 : 2));
399+
}
400+
else
401+
{
402+
// SQLiteDialect uses sql cast for transparentcast method
403+
Assert.That(matches.Count, Is.EqualTo(sameType && !(Sfi.Dialect is SQLiteDialect) ? 0 : 1));
404+
}
405+
373406
Assert.That(GetTotalOccurrences(sql, $"Type: {pair.Value}"), Is.EqualTo(1));
374407
}));
375408
}
@@ -408,7 +441,7 @@ public async Task CompareIntegralParameterWithIntegralAndFloatingPointColumnsAsy
408441
sql =>
409442
{
410443
var matches = Regex.Matches(sql, @"cast\(((@|\?|:)p\d+|\?)\s+as.*\)");
411-
Assert.That(matches.Count, Is.EqualTo(1));
444+
Assert.That(matches.Count, Is.EqualTo(Sfi.Dialect is FirebirdDialect ? 2 : 1));
412445
Assert.That(GetTotalOccurrences(sql, $"Type: {pair.Value}"), Is.EqualTo(1));
413446
}));
414447
}
@@ -447,7 +480,17 @@ public async Task UsingValueTypeParameterOfDifferentTypeAsync()
447480
await (AssertTotalParametersAsync(
448481
query,
449482
1,
450-
sql => Assert.That(sql, Does.Not.Contain("cast"))));
483+
sql =>
484+
{
485+
if (Sfi.Dialect is FirebirdDialect)
486+
{
487+
Assert.That(sql, Does.Contain("cast"));
488+
}
489+
else
490+
{
491+
Assert.That(sql, Does.Not.Contain("cast"));
492+
}
493+
}));
451494
}
452495

453496
queriables = new List<IQueryable<NumericEntity>>
@@ -476,7 +519,16 @@ public async Task UsingValueTypeParameterOfDifferentTypeAsync()
476519
sql => {
477520
// SQLiteDialect uses sql cast for transparentcast method
478521
Assert.That(sql, !sameType || Sfi.Dialect is SQLiteDialect ? Does.Match("where\\s+cast") : (IResolveConstraint)Does.Not.Contain("cast"));
479-
Assert.That(GetTotalOccurrences(sql, "cast"), Is.EqualTo(!sameType || Sfi.Dialect is SQLiteDialect ? 1 : 0));
522+
if (Sfi.Dialect is FirebirdDialect)
523+
{
524+
// Additional casts are added by FirebirdClientDriver
525+
Assert.That(GetTotalOccurrences(sql, "cast"), Is.EqualTo(3));
526+
}
527+
else
528+
{
529+
// SQLiteDialect uses sql cast for transparentcast method
530+
Assert.That(GetTotalOccurrences(sql, "cast"), Is.EqualTo(!sameType || Sfi.Dialect is SQLiteDialect ? 1 : 0));
531+
}
480532
}));
481533
}
482534
}
@@ -489,7 +541,7 @@ public async Task UsingValueTypeParameterTwiceOnNullablePropertyAsync()
489541
db.NumericEntities.Where(o => o.NullableShort == value && o.NullableShort != value && o.Short == value),
490542
1, sql => {
491543

492-
Assert.That(GetTotalOccurrences(sql, "cast"), Is.EqualTo(0));
544+
Assert.That(GetTotalOccurrences(sql, "cast"), Is.EqualTo(Sfi.Dialect is FirebirdDialect ? 3 : 0));
493545
}));
494546
}
495547

src/NHibernate.Test/Linq/ParameterTests.cs

Lines changed: 61 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,15 @@ public void CompareIntegralParametersAndColumns()
150150
3,
151151
sql =>
152152
{
153-
Assert.That(sql, Does.Not.Contain("cast"));
153+
if (Sfi.Dialect is FirebirdDialect)
154+
{
155+
Assert.That(sql, Does.Contain("cast"));
156+
}
157+
else
158+
{
159+
Assert.That(sql, Does.Not.Contain("cast"));
160+
}
161+
154162
Assert.That(GetTotalOccurrences(sql, $"Type: {pair.Value}"), Is.EqualTo(3));
155163
});
156164
}
@@ -191,7 +199,15 @@ public void CompareIntegralParametersWithFloatingPointColumns()
191199
3,
192200
sql =>
193201
{
194-
Assert.That(sql, Does.Not.Contain("cast"));
202+
if (Sfi.Dialect is FirebirdDialect)
203+
{
204+
Assert.That(sql, Does.Contain("cast"));
205+
}
206+
else
207+
{
208+
Assert.That(sql, Does.Not.Contain("cast"));
209+
}
210+
195211
Assert.That(GetTotalOccurrences(sql, $"Type: {pair.Value}"), Is.EqualTo(3));
196212
});
197213
}
@@ -233,7 +249,15 @@ public void CompareFloatingPointParametersAndColumns()
233249
totalParameters,
234250
sql =>
235251
{
236-
Assert.That(sql, Does.Not.Contain("cast"));
252+
if (Sfi.Dialect is FirebirdDialect)
253+
{
254+
Assert.That(sql, Does.Contain("cast"));
255+
}
256+
else
257+
{
258+
Assert.That(sql, Does.Not.Contain("cast"));
259+
}
260+
237261
Assert.That(GetTotalOccurrences(sql, $"Type: {pair.Value}"), Is.EqualTo(totalParameters));
238262
});
239263
}
@@ -356,8 +380,17 @@ public void CompareFloatingPointParameterWithDifferentFloatingPointColumns()
356380
var matches = pair.Value == "Double"
357381
? Regex.Matches(sql, @"cast\([\w\d]+\..+\)")
358382
: Regex.Matches(sql, @"cast\(((@|\?|:)p\d+|\?)\s+as.*\)");
359-
// SQLiteDialect uses sql cast for transparentcast method
360-
Assert.That(matches.Count, Is.EqualTo(sameType && !(Sfi.Dialect is SQLiteDialect) ? 0 : 1));
383+
if (Sfi.Dialect is FirebirdDialect)
384+
{
385+
// Additional casts are added by FirebirdClientDriver
386+
Assert.That(matches.Count, Is.EqualTo(pair.Value == "Double" ? 1 : 2));
387+
}
388+
else
389+
{
390+
// SQLiteDialect uses sql cast for transparentcast method
391+
Assert.That(matches.Count, Is.EqualTo(sameType && !(Sfi.Dialect is SQLiteDialect) ? 0 : 1));
392+
}
393+
361394
Assert.That(GetTotalOccurrences(sql, $"Type: {pair.Value}"), Is.EqualTo(1));
362395
});
363396
}
@@ -396,7 +429,7 @@ public void CompareIntegralParameterWithIntegralAndFloatingPointColumns()
396429
sql =>
397430
{
398431
var matches = Regex.Matches(sql, @"cast\(((@|\?|:)p\d+|\?)\s+as.*\)");
399-
Assert.That(matches.Count, Is.EqualTo(1));
432+
Assert.That(matches.Count, Is.EqualTo(Sfi.Dialect is FirebirdDialect ? 2 : 1));
400433
Assert.That(GetTotalOccurrences(sql, $"Type: {pair.Value}"), Is.EqualTo(1));
401434
});
402435
}
@@ -435,7 +468,17 @@ public void UsingValueTypeParameterOfDifferentType()
435468
AssertTotalParameters(
436469
query,
437470
1,
438-
sql => Assert.That(sql, Does.Not.Contain("cast")));
471+
sql =>
472+
{
473+
if (Sfi.Dialect is FirebirdDialect)
474+
{
475+
Assert.That(sql, Does.Contain("cast"));
476+
}
477+
else
478+
{
479+
Assert.That(sql, Does.Not.Contain("cast"));
480+
}
481+
});
439482
}
440483

441484
queriables = new List<IQueryable<NumericEntity>>
@@ -464,7 +507,16 @@ public void UsingValueTypeParameterOfDifferentType()
464507
sql => {
465508
// SQLiteDialect uses sql cast for transparentcast method
466509
Assert.That(sql, !sameType || Sfi.Dialect is SQLiteDialect ? Does.Match("where\\s+cast") : (IResolveConstraint)Does.Not.Contain("cast"));
467-
Assert.That(GetTotalOccurrences(sql, "cast"), Is.EqualTo(!sameType || Sfi.Dialect is SQLiteDialect ? 1 : 0));
510+
if (Sfi.Dialect is FirebirdDialect)
511+
{
512+
// Additional casts are added by FirebirdClientDriver
513+
Assert.That(GetTotalOccurrences(sql, "cast"), Is.EqualTo(3));
514+
}
515+
else
516+
{
517+
// SQLiteDialect uses sql cast for transparentcast method
518+
Assert.That(GetTotalOccurrences(sql, "cast"), Is.EqualTo(!sameType || Sfi.Dialect is SQLiteDialect ? 1 : 0));
519+
}
468520
});
469521
}
470522
}
@@ -477,7 +529,7 @@ public void UsingValueTypeParameterTwiceOnNullableProperty()
477529
db.NumericEntities.Where(o => o.NullableShort == value && o.NullableShort != value && o.Short == value),
478530
1, sql => {
479531

480-
Assert.That(GetTotalOccurrences(sql, "cast"), Is.EqualTo(0));
532+
Assert.That(GetTotalOccurrences(sql, "cast"), Is.EqualTo(Sfi.Dialect is FirebirdDialect ? 3 : 0));
481533
});
482534
}
483535

src/NHibernate/Driver/FirebirdClientDriver.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public class FirebirdClientDriver : ReflectionBasedDriver
2424
// Zero-width negative look-behind: the match must not be preceded by
2525
@"(?<!" +
2626
// a comparison,
27-
@"[=<>]\s*" +
27+
@"[=<>]\s" +
2828
// or a paging instruction,
2929
@"|\bfirst\s+|\bskip\s+" +
3030
// or a "between" condition,
@@ -36,7 +36,7 @@ public class FirebirdClientDriver : ReflectionBasedDriver
3636
// Zero-width negative look-ahead: the match must not be followed by
3737
@"(?!" +
3838
// a comparison.
39-
@"\s*[=<>])";
39+
@"\s[=<>])";
4040
private static readonly Regex _statementRegEx = new Regex(SELECT_CLAUSE_EXP, RegexOptions.IgnoreCase);
4141
private static readonly Regex _castCandidateRegEx = new Regex(CAST_PARAMS_EXP, RegexOptions.IgnoreCase);
4242
private readonly FirebirdDialect _fbDialect = new FirebirdDialect();

0 commit comments

Comments
 (0)