From 59bc0d813a168d7589c85f0153acfe16912b7016 Mon Sep 17 00:00:00 2001 From: Christopher Jolly Date: Thu, 24 Nov 2022 02:08:14 +0800 Subject: [PATCH 1/8] Change option from 0 to 1 for InStr. Make it use vbTextCompare which is case insensitive --- .../Internal/JetMathTranslator.cs | 26 +++++++++---------- .../Internal/JetStringMethodTranslator.cs | 18 ++++++++++--- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/EFCore.Jet/Query/ExpressionTranslators/Internal/JetMathTranslator.cs b/src/EFCore.Jet/Query/ExpressionTranslators/Internal/JetMathTranslator.cs index 95f7d93..f49d882 100644 --- a/src/EFCore.Jet/Query/ExpressionTranslators/Internal/JetMathTranslator.cs +++ b/src/EFCore.Jet/Query/ExpressionTranslators/Internal/JetMathTranslator.cs @@ -84,8 +84,8 @@ namespace EntityFrameworkCore.Jet.Query.ExpressionTranslators.Internal return _sqlExpressionFactory.Function( sqlFunctionName, arguments, - false, - new[] {false}, + true, + new[] {true}, method.ReturnType); } @@ -121,8 +121,8 @@ namespace EntityFrameworkCore.Jet.Query.ExpressionTranslators.Internal ) ) }, - false, - new[] {false}, + true, + new[] {true}, method.ReturnType)), // Arcsin(X) = Atn(X / Sqr(-X * X + 1)) @@ -151,20 +151,20 @@ namespace EntityFrameworkCore.Jet.Query.ExpressionTranslators.Internal ) ) }, - false, - new[] {false}, + true, + new[] {true}, method.ReturnType), // Logn(x) = Log(x) / Log(n) nameof(Math.Log10) => _sqlExpressionFactory.Divide( - _sqlExpressionFactory.Function("LOG", new[] {arguments[0]}, false, new[] {false}, method.ReturnType), + _sqlExpressionFactory.Function("LOG", new[] {arguments[0]}, true, new[] {true}, method.ReturnType), _sqlExpressionFactory.Constant(Math.Log(10)) ), // Math.Log(x, n) //Logn(x) = Log(x) / Log(n) nameof(Math.Log) => _sqlExpressionFactory.Divide( - _sqlExpressionFactory.Function("LOG", new[] {arguments[0]}, false, new[] {false}, method.ReturnType), - _sqlExpressionFactory.Function("LOG", new[] {arguments[1]}, false, new[] {false}, method.ReturnType) + _sqlExpressionFactory.Function("LOG", new[] {arguments[0]}, true, new[] {true}, method.ReturnType), + _sqlExpressionFactory.Function("LOG", new[] {arguments[1]}, true, new[] {true}, method.ReturnType) ), _ => null, @@ -176,8 +176,8 @@ namespace EntityFrameworkCore.Jet.Query.ExpressionTranslators.Internal return _sqlExpressionFactory.Function( "INT", new[] {arguments[0]}, - false, - new[] {false}, + true, + new[] {true}, method.ReturnType); } @@ -188,8 +188,8 @@ namespace EntityFrameworkCore.Jet.Query.ExpressionTranslators.Internal arguments.Count == 1 ? new[] {arguments[0], _sqlExpressionFactory.Constant(0)} : new[] {arguments[0], arguments[1]}, - false, - new[] {false}, + true, + new[] {true}, method.ReturnType); } diff --git a/src/EFCore.Jet/Query/ExpressionTranslators/Internal/JetStringMethodTranslator.cs b/src/EFCore.Jet/Query/ExpressionTranslators/Internal/JetStringMethodTranslator.cs index 38978ec..a476d61 100644 --- a/src/EFCore.Jet/Query/ExpressionTranslators/Internal/JetStringMethodTranslator.cs +++ b/src/EFCore.Jet/Query/ExpressionTranslators/Internal/JetStringMethodTranslator.cs @@ -101,7 +101,7 @@ namespace EntityFrameworkCore.Jet.Query.ExpressionTranslators.Internal || string.Equals(storeType, "varchar(max)", StringComparison.OrdinalIgnoreCase)) { charIndexExpression = _sqlExpressionFactory.Function( - "INSTR", + "InStr", new[] { _sqlExpressionFactory.ApplyTypeMapping(instance, stringTypeMapping), argument }, nullable: true, argumentsPropagateNullability: new[] { true, true }, @@ -112,7 +112,7 @@ namespace EntityFrameworkCore.Jet.Query.ExpressionTranslators.Internal else { charIndexExpression = _sqlExpressionFactory.Function( - "INSTR", + "InStr", new[] { _sqlExpressionFactory.ApplyTypeMapping(instance, stringTypeMapping), argument }, nullable: true, argumentsPropagateNullability: new[] { true, true }, @@ -120,7 +120,17 @@ namespace EntityFrameworkCore.Jet.Query.ExpressionTranslators.Internal } charIndexExpression = _sqlExpressionFactory.Subtract(charIndexExpression, _sqlExpressionFactory.Constant(1)); - return charIndexExpression; + + return _sqlExpressionFactory.Case( + new[] + { + new CaseWhenClause( + _sqlExpressionFactory.Equal( + instance, + _sqlExpressionFactory.Constant(string.Empty, stringTypeMapping)), + _sqlExpressionFactory.Constant(0)) + }, + charIndexExpression); } if (Equals(method, _containsMethodInfo)) @@ -138,7 +148,7 @@ namespace EntityFrameworkCore.Jet.Query.ExpressionTranslators.Internal _sqlExpressionFactory.Constant(1), instance, patternExpression, - _sqlExpressionFactory.Constant(0) + _sqlExpressionFactory.Constant(1) }, false, new[] {false}, From e14b48db475aa4f04a722fb6491ad0de314b4a99 Mon Sep 17 00:00:00 2001 From: Christopher Jolly Date: Wed, 7 Dec 2022 01:42:20 +0800 Subject: [PATCH 2/8] Update tests --- global.json | 2 +- .../Internal/JetMathTranslator.cs | 149 +++-- .../Internal/JetStringMethodTranslator.cs | 457 ++++++++++----- .../Sql/Internal/JetQuerySqlGenerator.cs | 5 +- .../Internal/JetDatabaseModelFactory.cs | 11 +- .../Query/ComplexNavigationsQueryJetTest.cs | 26 +- .../Query/FunkyDataQueryJetTest.cs | 4 +- .../Query/GearsOfWarQueryJetTest.cs | 24 +- .../Query/InheritanceQueryJetTest.cs | 6 +- ...teOperatorsQueryJetTest.ResultOperators.cs | 64 +-- ...orthwindFunctionsQueryJetTest.Functions.cs | 533 +++++++++++++++--- .../Query/NorthwindGroupByQueryJetTest.cs | 402 +++++++------ .../Query/NorthwindIncludeQueryJetTest.cs | 241 ++++---- .../Query/NorthwindJoinQueryJetTest.cs | 22 +- .../NorthwindMiscellaneousQueryJetTest.cs | 148 ++--- .../Query/NorthwindNavigationsQueryJetTest.cs | 26 +- .../NorthwindQueryFiltersQueryJetTest.cs | 2 +- .../Query/NorthwindSelectQueryJetTest.cs | 44 +- .../NorthwindSetOperationsQueryJetTest.cs | 6 +- .../Query/NorthwindWhereQueryJetTest.cs | 4 +- .../Query/NullSemanticsQueryJetTest.cs | 2 +- .../Query/QueryBugsTest.cs | 14 +- .../JetDatabaseModelFactoryTest.cs | 2 +- .../Model_MainTests/Test.cs | 2 +- test/Northwind.sql | Bin 2098704 -> 2098704 bytes 25 files changed, 1436 insertions(+), 760 deletions(-) diff --git a/global.json b/global.json index 2a8dd78..8006886 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "6.0.100", + "version": "6.0.403", "allowPrerelease": false, "rollForward": "latestFeature" } diff --git a/src/EFCore.Jet/Query/ExpressionTranslators/Internal/JetMathTranslator.cs b/src/EFCore.Jet/Query/ExpressionTranslators/Internal/JetMathTranslator.cs index f49d882..6055757 100644 --- a/src/EFCore.Jet/Query/ExpressionTranslators/Internal/JetMathTranslator.cs +++ b/src/EFCore.Jet/Query/ExpressionTranslators/Internal/JetMathTranslator.cs @@ -22,54 +22,74 @@ namespace EntityFrameworkCore.Jet.Query.ExpressionTranslators.Internal private static readonly Dictionary _supportedMethodTranslationsDirect = new Dictionary { - {typeof(Math).GetRuntimeMethod(nameof(Math.Abs), new[] {typeof(decimal)}), "ABS"}, - {typeof(Math).GetRuntimeMethod(nameof(Math.Abs), new[] {typeof(double)}), "ABS"}, - {typeof(Math).GetRuntimeMethod(nameof(Math.Abs), new[] {typeof(float)}), "ABS"}, - {typeof(Math).GetRuntimeMethod(nameof(Math.Abs), new[] {typeof(int)}), "ABS"}, - {typeof(Math).GetRuntimeMethod(nameof(Math.Abs), new[] {typeof(long)}), "ABS"}, - {typeof(Math).GetRuntimeMethod(nameof(Math.Abs), new[] {typeof(sbyte)}), "ABS"}, - {typeof(Math).GetRuntimeMethod(nameof(Math.Abs), new[] {typeof(short)}), "ABS"}, - {typeof(Math).GetRuntimeMethod(nameof(Math.Pow), new[] {typeof(double), typeof(double)}), "POW"}, // This is handled by JetQuerySqlGenerator - {typeof(Math).GetRuntimeMethod(nameof(Math.Exp), new[] {typeof(double)}), "EXP"}, - {typeof(Math).GetRuntimeMethod(nameof(Math.Log), new[] {typeof(double)}), "LOG"}, - {typeof(Math).GetRuntimeMethod(nameof(Math.Sqrt), new[] {typeof(double)}), "SQR"}, - {typeof(Math).GetRuntimeMethod(nameof(Math.Atan), new[] {typeof(double)}), "ATN"}, - {typeof(Math).GetRuntimeMethod(nameof(Math.Cos), new[] {typeof(double)}), "COS"}, - {typeof(Math).GetRuntimeMethod(nameof(Math.Sin), new[] {typeof(double)}), "SIN"}, - {typeof(Math).GetRuntimeMethod(nameof(Math.Tan), new[] {typeof(double)}), "TAN"}, - {typeof(Math).GetRuntimeMethod(nameof(Math.Sign), new[] {typeof(decimal)}), "SGN"}, - {typeof(Math).GetRuntimeMethod(nameof(Math.Sign), new[] {typeof(double)}), "SGN"}, - {typeof(Math).GetRuntimeMethod(nameof(Math.Sign), new[] {typeof(float)}), "SGN"}, - {typeof(Math).GetRuntimeMethod(nameof(Math.Sign), new[] {typeof(int)}), "SGN"}, - {typeof(Math).GetRuntimeMethod(nameof(Math.Sign), new[] {typeof(long)}), "SGN"}, - {typeof(Math).GetRuntimeMethod(nameof(Math.Sign), new[] {typeof(sbyte)}), "SGN"}, - {typeof(Math).GetRuntimeMethod(nameof(Math.Sign), new[] {typeof(short)}), "SGN"} + {typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Abs), new[] {typeof(decimal)}), "ABS"}, + {typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Abs), new[] {typeof(double)}), "ABS"}, + {typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Abs), new[] {typeof(float)}), "ABS"}, + {typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Abs), new[] {typeof(int)}), "ABS"}, + {typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Abs), new[] {typeof(long)}), "ABS"}, + {typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Abs), new[] {typeof(sbyte)}), "ABS"}, + {typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Abs), new[] {typeof(short)}), "ABS"}, + {typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Pow), new[] {typeof(double), typeof(double)}), "POW"}, // This is handled by JetQuerySqlGenerator + {typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Exp), new[] {typeof(double)}), "EXP"}, + {typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Log), new[] {typeof(double)}), "LOG"}, + {typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Sqrt), new[] {typeof(double)}), "SQR"}, + {typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Atan), new[] {typeof(double)}), "ATN"}, + {typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Cos), new[] {typeof(double)}), "COS"}, + {typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Sin), new[] {typeof(double)}), "SIN"}, + {typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Tan), new[] {typeof(double)}), "TAN"}, + {typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Sign), new[] {typeof(decimal)}), "SGN"}, + {typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Sign), new[] {typeof(double)}), "SGN"}, + {typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Sign), new[] {typeof(float)}), "SGN"}, + {typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Sign), new[] {typeof(int)}), "SGN"}, + {typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Sign), new[] {typeof(long)}), "SGN"}, + {typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Sign), new[] {typeof(sbyte)}), "SGN"}, + {typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Sign), new[] {typeof(short)}), "SGN"}, + { typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Abs), typeof(float)), "ABS" }, + { typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Pow), typeof(float), typeof(float)), "POW" }, + { typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Exp), typeof(float)), "EXP" }, + { typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Log), typeof(float)), "LOG" }, + { typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Sqrt), typeof(float)), "SQR" }, + { typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Atan), typeof(float)), "ATN" }, + { typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Cos), typeof(float)), "COS" }, + { typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Sin), typeof(float)), "SIN" }, + { typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Tan), typeof(float)), "TAN" }, + { typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Sign), typeof(float)), "SGN" } }; private static readonly MethodInfo[] _supportedMethodTranslationsIndirect = { - typeof(Math).GetRuntimeMethod(nameof(Math.Acos), new[] {typeof(double)}), - typeof(Math).GetRuntimeMethod(nameof(Math.Asin), new[] {typeof(double)}), - typeof(Math).GetRuntimeMethod(nameof(Math.Atan2), new[] {typeof(double), typeof(double)}), - typeof(Math).GetRuntimeMethod(nameof(Math.Floor), new[] {typeof(decimal)}), - typeof(Math).GetRuntimeMethod(nameof(Math.Floor), new[] {typeof(double)}), - typeof(Math).GetRuntimeMethod(nameof(Math.Ceiling), new[] {typeof(decimal)}), - typeof(Math).GetRuntimeMethod(nameof(Math.Ceiling), new[] {typeof(double)}), - typeof(Math).GetRuntimeMethod(nameof(Math.Log10), new[] {typeof(double)}), - typeof(Math).GetRuntimeMethod(nameof(Math.Log), new[] {typeof(double), typeof(double)}) + typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Acos), new[] {typeof(double)}), + typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Asin), new[] {typeof(double)}), + typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Atan2), new[] {typeof(double), typeof(double)}), + typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Floor), new[] {typeof(decimal)}), + typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Floor), new[] {typeof(double)}), + typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Ceiling), new[] {typeof(decimal)}), + typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Ceiling), new[] {typeof(double)}), + typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Log10), new[] {typeof(double)}), + typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Log), new[] {typeof(double), typeof(double)}), + typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Ceiling), typeof(float)), + typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Floor), typeof(float)), + typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Log10), typeof(float)), + typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Log), typeof(float), typeof(float)), + typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Acos), typeof(float)), + typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Asin), typeof(float)), + typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Atan2), typeof(float), typeof(float)), }; private static readonly IEnumerable _truncateMethodInfos = new[] { - typeof(Math).GetRuntimeMethod(nameof(Math.Truncate), new[] {typeof(decimal)}), - typeof(Math).GetRuntimeMethod(nameof(Math.Truncate), new[] {typeof(double)}) + typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Truncate), new[] {typeof(decimal)}), + typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Truncate), new[] {typeof(double)}), + typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Truncate), typeof(float)) }; private static readonly IEnumerable _roundMethodInfos = new[] { - typeof(Math).GetRuntimeMethod(nameof(Math.Round), new[] {typeof(decimal)}), - typeof(Math).GetRuntimeMethod(nameof(Math.Round), new[] {typeof(double)}), - typeof(Math).GetRuntimeMethod(nameof(Math.Round), new[] {typeof(decimal), typeof(int)}), - typeof(Math).GetRuntimeMethod(nameof(Math.Round), new[] {typeof(double), typeof(int)}) + typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Round), new[] {typeof(decimal)}), + typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Round), new[] {typeof(double)}), + typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Round), new[] {typeof(decimal), typeof(int)}), + typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Round), new[] {typeof(double), typeof(int)}), + typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Round), typeof(float)), + typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Round), typeof(float), typeof(int)) }; public JetMathTranslator(ISqlExpressionFactory sqlExpressionFactory) @@ -81,12 +101,25 @@ namespace EntityFrameworkCore.Jet.Query.ExpressionTranslators.Internal if (_supportedMethodTranslationsDirect.TryGetValue(method, out var sqlFunctionName)) { + var typeMapping = arguments.Count == 1 + ? ExpressionExtensions.InferTypeMapping(arguments[0]) + : ExpressionExtensions.InferTypeMapping(arguments[0], arguments[1]); + + var newArguments = new SqlExpression[arguments.Count]; + newArguments[0] = _sqlExpressionFactory.ApplyTypeMapping(arguments[0], typeMapping); + + if (arguments.Count == 2) + { + newArguments[1] = _sqlExpressionFactory.ApplyTypeMapping(arguments[1], typeMapping); + } + return _sqlExpressionFactory.Function( sqlFunctionName, - arguments, - true, - new[] {true}, - method.ReturnType); + newArguments, + nullable: true, + argumentsPropagateNullability: newArguments.Select(a => true).ToArray(), + method.ReturnType, + sqlFunctionName == "SIGN" ? null : typeMapping); } if (_supportedMethodTranslationsIndirect.Contains(method)) @@ -173,24 +206,38 @@ namespace EntityFrameworkCore.Jet.Query.ExpressionTranslators.Internal if (_truncateMethodInfos.Contains(method)) { - return _sqlExpressionFactory.Function( + var argument = arguments[0]; + var result = (SqlExpression)_sqlExpressionFactory.Function( "INT", - new[] {arguments[0]}, + new[] {argument}, true, new[] {true}, - method.ReturnType); + typeof(double)); + if (argument.Type == typeof(float)) + { + result = _sqlExpressionFactory.Convert(result, typeof(float)); + } + return _sqlExpressionFactory.ApplyTypeMapping(result, argument.TypeMapping); } if (_roundMethodInfos.Contains(method)) { - return _sqlExpressionFactory.Function( + var argument = arguments[0]; + var digits = arguments.Count == 2 ? arguments[1] : _sqlExpressionFactory.Constant(0); + // Result of ROUND for float/double is always double in server side + var result = (SqlExpression)_sqlExpressionFactory.Function( "ROUND", - arguments.Count == 1 - ? new[] {arguments[0], _sqlExpressionFactory.Constant(0)} - : new[] {arguments[0], arguments[1]}, - true, - new[] {true}, - method.ReturnType); + new[] { argument, digits }, + nullable: true, + argumentsPropagateNullability: new[] { true, true }, + typeof(double)); + + if (argument.Type == typeof(float)) + { + result = _sqlExpressionFactory.Convert(result, typeof(float)); + } + + return _sqlExpressionFactory.ApplyTypeMapping(result, argument.TypeMapping); } return null; diff --git a/src/EFCore.Jet/Query/ExpressionTranslators/Internal/JetStringMethodTranslator.cs b/src/EFCore.Jet/Query/ExpressionTranslators/Internal/JetStringMethodTranslator.cs index a476d61..cc8aebf 100644 --- a/src/EFCore.Jet/Query/ExpressionTranslators/Internal/JetStringMethodTranslator.cs +++ b/src/EFCore.Jet/Query/ExpressionTranslators/Internal/JetStringMethodTranslator.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Reflection; +using System.Text; using JetBrains.Annotations; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Diagnostics; @@ -83,198 +84,255 @@ namespace EntityFrameworkCore.Jet.Query.ExpressionTranslators.Internal m => m.Name == nameof(Enumerable.LastOrDefault) && m.GetParameters().Length == 1).MakeGenericMethod(typeof(char)); + private const char LikeEscapeChar = '\\'; + private const string LikeEscapeString = "\\"; public JetStringMethodTranslator(ISqlExpressionFactory sqlExpressionFactory) => _sqlExpressionFactory = (JetSqlExpressionFactory)sqlExpressionFactory; public SqlExpression Translate(SqlExpression instance, MethodInfo method, IReadOnlyList arguments, IDiagnosticsLogger logger) { - if (_indexOfMethodInfo.Equals(method)) + if (instance != null) { - var argument = arguments[0]; - var stringTypeMapping = ExpressionExtensions.InferTypeMapping(instance, argument)!; - argument = _sqlExpressionFactory.ApplyTypeMapping(argument, stringTypeMapping); - - SqlExpression charIndexExpression; - var storeType = stringTypeMapping.StoreType; - if (string.Equals(storeType, "nvarchar(max)", StringComparison.OrdinalIgnoreCase) - || string.Equals(storeType, "varchar(max)", StringComparison.OrdinalIgnoreCase)) + if (_indexOfMethodInfo.Equals(method)) { - charIndexExpression = _sqlExpressionFactory.Function( - "InStr", - new[] { _sqlExpressionFactory.ApplyTypeMapping(instance, stringTypeMapping), argument }, - nullable: true, - argumentsPropagateNullability: new[] { true, true }, - typeof(long)); + var argument = arguments[0]; + var stringTypeMapping = ExpressionExtensions.InferTypeMapping(instance, argument)!; + argument = _sqlExpressionFactory.ApplyTypeMapping(argument, stringTypeMapping); + + SqlExpression charIndexExpression; + var storeType = stringTypeMapping.StoreType; + if (string.Equals(storeType, "nvarchar(max)", StringComparison.OrdinalIgnoreCase) + || string.Equals(storeType, "varchar(max)", StringComparison.OrdinalIgnoreCase)) + { + charIndexExpression = _sqlExpressionFactory.Function( + "InStr", + new[] + { + _sqlExpressionFactory.ApplyTypeMapping(instance, stringTypeMapping), argument, + _sqlExpressionFactory.Constant(1) + }, + nullable: true, + argumentsPropagateNullability: new[] { true, true, true }, + typeof(long)); - charIndexExpression = _sqlExpressionFactory.Convert(charIndexExpression, typeof(int)); - } - else - { - charIndexExpression = _sqlExpressionFactory.Function( - "InStr", - new[] { _sqlExpressionFactory.ApplyTypeMapping(instance, stringTypeMapping), argument }, - nullable: true, - argumentsPropagateNullability: new[] { true, true }, - method.ReturnType); - } + charIndexExpression = _sqlExpressionFactory.Convert(charIndexExpression, typeof(int)); + } + else + { + charIndexExpression = _sqlExpressionFactory.Function( + "InStr", + new[] + { + _sqlExpressionFactory.ApplyTypeMapping(instance, stringTypeMapping), argument, + _sqlExpressionFactory.Constant(1) + }, + nullable: true, + argumentsPropagateNullability: new[] { true, true, true }, + method.ReturnType); + } - charIndexExpression = _sqlExpressionFactory.Subtract(charIndexExpression, _sqlExpressionFactory.Constant(1)); + charIndexExpression = + _sqlExpressionFactory.Subtract(charIndexExpression, _sqlExpressionFactory.Constant(1)); - return _sqlExpressionFactory.Case( - new[] - { + return _sqlExpressionFactory.Case( + new[] + { new CaseWhenClause( _sqlExpressionFactory.Equal( instance, _sqlExpressionFactory.Constant(string.Empty, stringTypeMapping)), _sqlExpressionFactory.Constant(0)) - }, - charIndexExpression); - } + }, + charIndexExpression); + } - if (Equals(method, _containsMethodInfo)) - { - var patternExpression = arguments[0]; - var patternConstantExpression = patternExpression as SqlConstantExpression; + if (_replaceMethodInfo.Equals(method)) + { + var firstArgument = arguments[0]; + var secondArgument = arguments[1]; + var stringTypeMapping = + ExpressionExtensions.InferTypeMapping(instance, firstArgument, secondArgument); + + instance = _sqlExpressionFactory.ApplyTypeMapping(instance, stringTypeMapping); + firstArgument = _sqlExpressionFactory.ApplyTypeMapping(firstArgument, stringTypeMapping); + secondArgument = _sqlExpressionFactory.ApplyTypeMapping(secondArgument, stringTypeMapping); + + return _sqlExpressionFactory.Function( + "REPLACE", + new[] { instance, firstArgument, secondArgument }, + nullable: true, + argumentsPropagateNullability: new[] { true, true, true }, + method.ReturnType, + stringTypeMapping); + } - // CHECK: Index usage. It is likely needed to switch to the SQL Server approach of pre-searching - // with LIKE first to narrow down the results and use INSTR only for whatever remains. - var charIndexExpression = _sqlExpressionFactory.GreaterThan( - _sqlExpressionFactory.Function( - "INSTR", + if (_toLowerMethodInfo.Equals(method) + || _toUpperMethodInfo.Equals(method)) + { + return _sqlExpressionFactory.Function( + _toLowerMethodInfo.Equals(method) ? "LCASE" : "UCASE", + new[] { instance }, + nullable: true, + argumentsPropagateNullability: new[] { true }, + method.ReturnType, + instance.TypeMapping); + } + + if (_substringMethodInfoWithOneArg.Equals(method)) + { + return _sqlExpressionFactory.Function( + "MID", new[] { - _sqlExpressionFactory.Constant(1), instance, - patternExpression, - _sqlExpressionFactory.Constant(1) + _sqlExpressionFactory.Add( + arguments[0], + _sqlExpressionFactory.Constant(1)), + _sqlExpressionFactory.Function( + "LEN", + new[] { instance }, + nullable: true, + argumentsPropagateNullability: new[] { true }, + typeof(int)) }, - false, - new[] {false}, - typeof(int)), - _sqlExpressionFactory.Constant(0)); - - return patternConstantExpression != null - ? (string) patternConstantExpression.Value == string.Empty - ? (SqlExpression) _sqlExpressionFactory.Constant(true) - : charIndexExpression - : _sqlExpressionFactory.OrElse( - charIndexExpression, - _sqlExpressionFactory.Equal(patternExpression, _sqlExpressionFactory.Constant(string.Empty))); - } - - if (Equals(method, _startsWithMethodInfo)) - { - return _sqlExpressionFactory.Like( - // ReSharper disable once AssignNullToNotNullAttribute - instance, - _sqlExpressionFactory.Add(arguments[0], _sqlExpressionFactory.Constant("%")) - ); - } + nullable: true, + argumentsPropagateNullability: new[] { true, true, true }, + method.ReturnType, + instance.TypeMapping); + } - if (Equals(method, _endsWithMethodInfo)) - { - return _sqlExpressionFactory.Like( - instance, - _sqlExpressionFactory.Add(_sqlExpressionFactory.Constant("%"), arguments[0])); - } + if (_substringMethodInfoWithTwoArgs.Equals(method)) + { + return _sqlExpressionFactory.Function( + "MID", + new[] + { + instance, + _sqlExpressionFactory.Add( + arguments[0], + _sqlExpressionFactory.Constant(1)), + arguments[1] + }, + nullable: true, + argumentsPropagateNullability: new[] { true, true, true }, + method.ReturnType, + instance.TypeMapping); + } - // Jet TRIM does not take arguments. - // _trimWithNoParam is only available since .NET Core 2.0 (or .NET Standard 2.1). - if (Equals(method, _trimMethodInfoWithoutArgs) || - Equals(method, _trimMethodInfoWithCharArrayArg) && ((arguments[0] as SqlConstantExpression)?.Value == null || - ((arguments[0] as SqlConstantExpression)?.Value as Array)?.Length == 0)) - { - return _sqlExpressionFactory.Function("TRIM", new[] {instance}, false, new[] {false}, method.ReturnType, instance.TypeMapping); - } + if (_trimStartMethodInfoWithoutArgs?.Equals(method) == true + || (_trimStartMethodInfoWithCharArrayArg.Equals(method) + && ((arguments[0] as SqlConstantExpression)?.Value as Array)?.Length == 0)) + { + return _sqlExpressionFactory.Function( + "LTRIM", + new[] { instance }, + nullable: true, + argumentsPropagateNullability: new[] { true }, + instance.Type, + instance.TypeMapping); + } - // Jet LTRIM does not take arguments - // _trimStartWithNoParam is only available since .NET Core 2.0 (or .NET Standard 2.1). - if (Equals(method, _trimStartMethodInfoWithoutArgs) || - Equals(method, _trimStartMethodInfoWithCharArrayArg) && ((arguments[0] as SqlConstantExpression)?.Value == null || - ((arguments[0] as SqlConstantExpression)?.Value as Array)?.Length == 0)) - { - return _sqlExpressionFactory.Function("LTRIM", new[] {instance}, false, new[] {false}, method.ReturnType, instance.TypeMapping); - } + if (_trimEndMethodInfoWithoutArgs?.Equals(method) == true + || (_trimEndMethodInfoWithCharArrayArg.Equals(method) + && ((arguments[0] as SqlConstantExpression)?.Value as Array)?.Length == 0)) + { + return _sqlExpressionFactory.Function( + "RTRIM", + new[] { instance }, + nullable: true, + argumentsPropagateNullability: new[] { true }, + instance.Type, + instance.TypeMapping); + } - // Jet RTRIM does not take arguments - // _trimEndWithNoParam is only available since .NET Core 2.0 (or .NET Standard 2.1). - if (Equals(method, _trimEndMethodInfoWithoutArgs) || - Equals(method, _trimEndMethodInfoWithCharArrayArg) && ((arguments[0] as SqlConstantExpression)?.Value == null || - ((arguments[0] as SqlConstantExpression)?.Value as Array)?.Length == 0)) - { - return _sqlExpressionFactory.Function("RTRIM", new[] {instance}, false, new[] {false}, method.ReturnType, instance.TypeMapping); - } + if (_trimMethodInfoWithoutArgs?.Equals(method) == true + || (_trimMethodInfoWithCharArrayArg.Equals(method) + && ((arguments[0] as SqlConstantExpression)?.Value as Array)?.Length == 0)) + { + return _sqlExpressionFactory.Function( + "TRIM", + new[] { instance }, + nullable: true, + argumentsPropagateNullability: new[] { true }, + instance.Type, + instance.TypeMapping); + } - if (_toLowerMethodInfo.Equals(method) - || _toUpperMethodInfo.Equals(method)) - { - return _sqlExpressionFactory.Function( - _toLowerMethodInfo.Equals(method) ? "LCASE" : "UCASE", - new[] { instance }, - nullable: true, - argumentsPropagateNullability: new[] { true }, - method.ReturnType, - instance.TypeMapping); - } + if (_containsMethodInfo.Equals(method)) + { + var pattern = arguments[0]; + var stringTypeMapping = ExpressionExtensions.InferTypeMapping(instance, pattern); + instance = _sqlExpressionFactory.ApplyTypeMapping(instance, stringTypeMapping); + pattern = _sqlExpressionFactory.ApplyTypeMapping(pattern, stringTypeMapping); - if (_substringMethodInfoWithOneArg.Equals(method) || - _substringMethodInfoWithTwoArgs.Equals(method)) - { - var parameters = new List( - new[] + if (pattern is SqlConstantExpression constantPattern) { - instance, - // Accommodate for JET assumption of 1-based string indexes - arguments[0] is SqlConstantExpression constantExpression - ? (SqlExpression) _sqlExpressionFactory.Constant((int) constantExpression.Value + 1) - : _sqlExpressionFactory.Add( - arguments[0], - _sqlExpressionFactory.Constant(1)) - }); - if (arguments.Count >= 2) + if (!(constantPattern.Value is string patternValue)) + { + return _sqlExpressionFactory.Like( + instance, + _sqlExpressionFactory.Constant(null, stringTypeMapping)); + } + + if (patternValue.Length == 0) + { + return _sqlExpressionFactory.Constant(true); + } + + return patternValue.Any(IsLikeWildChar) + ? _sqlExpressionFactory.Like( + instance, + _sqlExpressionFactory.Constant($"%{EscapeLikePattern(patternValue)}%"), + _sqlExpressionFactory.Constant(LikeEscapeString)) + : _sqlExpressionFactory.Like(instance, _sqlExpressionFactory.Constant($"%{patternValue}%")); + } + + return _sqlExpressionFactory.OrElse( + _sqlExpressionFactory.Like( + pattern, + _sqlExpressionFactory.Constant(string.Empty, stringTypeMapping)), + _sqlExpressionFactory.GreaterThan( + _sqlExpressionFactory.Function( + "INSTR", + new[] { _sqlExpressionFactory.Constant(1), instance, pattern, _sqlExpressionFactory.Constant(1) }, + nullable: true, + argumentsPropagateNullability: new[] { true, true, true, true }, + typeof(int)), + _sqlExpressionFactory.Constant(0))); + } + + if (_startsWithMethodInfo.Equals(method)) { - parameters.Add(arguments[1]); + return TranslateStartsEndsWith(instance, arguments[0], true); } - return _sqlExpressionFactory.Function( - "MID", - parameters, - false, new[] {false}, - method.ReturnType,instance.TypeMapping); + if (_endsWithMethodInfo.Equals(method)) + { + return TranslateStartsEndsWith(instance, arguments[0], false); + } } - if (_replaceMethodInfo.Equals(method)) + if (_isNullOrEmptyMethodInfo.Equals(method)) { - var firstArgument = arguments[0]; - var secondArgument = arguments[1]; - var stringTypeMapping = ExpressionExtensions.InferTypeMapping(instance, firstArgument, secondArgument); - - instance = _sqlExpressionFactory.ApplyTypeMapping(instance, stringTypeMapping); - firstArgument = _sqlExpressionFactory.ApplyTypeMapping(firstArgument, stringTypeMapping); - secondArgument = _sqlExpressionFactory.ApplyTypeMapping(secondArgument, stringTypeMapping); + var argument = arguments[0]; - return _sqlExpressionFactory.Function( - "REPLACE", - new[] { instance, firstArgument, secondArgument }, - nullable: true, - argumentsPropagateNullability: new[] { true, true, true }, - method.ReturnType, - stringTypeMapping); + return _sqlExpressionFactory.OrElse( + _sqlExpressionFactory.IsNull(argument), + _sqlExpressionFactory.Like( + argument, + _sqlExpressionFactory.Constant(string.Empty))); } - if (Equals(method, _isNullOrWhiteSpaceMethodInfo)) + if (_isNullOrWhiteSpaceMethodInfo.Equals(method)) { + var argument = arguments[0]; + return _sqlExpressionFactory.OrElse( - _sqlExpressionFactory.IsNull(arguments[0]), + _sqlExpressionFactory.IsNull(argument), _sqlExpressionFactory.Equal( - _sqlExpressionFactory.Function( - "TRIM", - new[] {arguments[0]}, - false, new[] {false}, - typeof(string)), - _sqlExpressionFactory.Constant(string.Empty))); + argument, + _sqlExpressionFactory.Constant(string.Empty, argument.TypeMapping))); } if (_firstOrDefaultMethodInfoWithoutArgs.Equals(method)) @@ -308,8 +366,103 @@ namespace EntityFrameworkCore.Jet.Query.ExpressionTranslators.Internal argumentsPropagateNullability: new[] { true, true, true }, method.ReturnType); } - return null; } + + private SqlExpression TranslateStartsEndsWith(SqlExpression instance, SqlExpression pattern, bool startsWith) + { + var stringTypeMapping = ExpressionExtensions.InferTypeMapping(instance, pattern); + + instance = _sqlExpressionFactory.ApplyTypeMapping(instance, stringTypeMapping); + pattern = _sqlExpressionFactory.ApplyTypeMapping(pattern, stringTypeMapping); + + if (pattern is SqlConstantExpression constantExpression) + { + // The pattern is constant. Aside from null or empty, we escape all special characters (%, _, \) + // in C# and send a simple LIKE + if (!(constantExpression.Value is string patternValue)) + { + return _sqlExpressionFactory.Like( + instance, + _sqlExpressionFactory.Constant(null, stringTypeMapping)); + } + + return patternValue.Any(IsLikeWildChar) + ? _sqlExpressionFactory.Like( + instance, + _sqlExpressionFactory.Constant( + startsWith + ? EscapeLikePattern(patternValue) + '%' + : '%' + EscapeLikePattern(patternValue)), + _sqlExpressionFactory.Constant(LikeEscapeString)) + : _sqlExpressionFactory.Like( + instance, + _sqlExpressionFactory.Constant(startsWith ? patternValue + '%' : '%' + patternValue)); + } + + // The pattern is non-constant, we use LEFT or RIGHT to extract substring and compare. + if (startsWith) + { + return _sqlExpressionFactory.Equal( + _sqlExpressionFactory.Function( + "LEFT", + new[] + { + instance, + _sqlExpressionFactory.Function( + "LEN", + new[] { pattern }, + nullable: true, + argumentsPropagateNullability: new[] { true }, + typeof(int)) + }, + nullable: true, + argumentsPropagateNullability: new[] { true, true }, + typeof(string), + stringTypeMapping), + pattern); + } + + return _sqlExpressionFactory.Equal( + _sqlExpressionFactory.Function( + "RIGHT", + new[] + { + instance, + _sqlExpressionFactory.Function( + "LEN", + new[] { pattern }, + nullable: true, + argumentsPropagateNullability: new[] { true }, + typeof(int)) + }, + nullable: true, + argumentsPropagateNullability: new[] { true, true }, + typeof(string), + stringTypeMapping), + pattern); + } + + // See https://docs.microsoft.com/en-us/sql/t-sql/language-elements/like-transact-sql + private bool IsLikeWildChar(char c) + => c == '%' || c == '_' || c == '['; + + private string EscapeLikePattern(string pattern) + { + var builder = new StringBuilder(); + for (var i = 0; i < pattern.Length; i++) + { + var c = pattern[i]; + if (IsLikeWildChar(c) + || c == LikeEscapeChar) + { + builder.Append(LikeEscapeChar); + } + + builder.Append(c); + } + + return builder.ToString(); + } } } \ No newline at end of file diff --git a/src/EFCore.Jet/Query/Sql/Internal/JetQuerySqlGenerator.cs b/src/EFCore.Jet/Query/Sql/Internal/JetQuerySqlGenerator.cs index 60945b9..7032ff8 100644 --- a/src/EFCore.Jet/Query/Sql/Internal/JetQuerySqlGenerator.cs +++ b/src/EFCore.Jet/Query/Sql/Internal/JetQuerySqlGenerator.cs @@ -353,8 +353,9 @@ namespace EntityFrameworkCore.Jet.Query.Sql.Internal new CaseWhenClause(isnullexp, nullcons) }; CaseExpression caseexp = new CaseExpression(whenclause, notnullsqlexp); - Visit(caseexp); - return convertExpression; + //Visit(caseexp); + Visit(notnullsqlexp); + return notnullsqlexp; } if (typeMapping.ClrType.Name == nameof(String)) diff --git a/src/EFCore.Jet/Scaffolding/Internal/JetDatabaseModelFactory.cs b/src/EFCore.Jet/Scaffolding/Internal/JetDatabaseModelFactory.cs index e018eff..f0c08a4 100644 --- a/src/EFCore.Jet/Scaffolding/Internal/JetDatabaseModelFactory.cs +++ b/src/EFCore.Jet/Scaffolding/Internal/JetDatabaseModelFactory.cs @@ -284,8 +284,15 @@ namespace EntityFrameworkCore.Jet.Scaffolding.Internal return null; } } - else if ((dataTypeName == "datetime" && _defaultDateTimeValue.IsMatch(defaultValue)) || - (dataTypeName == "guid" && defaultValue == "'00000000-0000-0000-0000-000000000000'")) + else if ((defaultValue == "('1900-01-01T00:00:00.000')" && (dataTypeName == "datetime" || dataTypeName == "smalldatetime")) || + (dataTypeName == "guid" && defaultValue == "'00000000-0000-0000-0000-000000000000'") || + (defaultValue == "('0001-01-01')" && dataTypeName == "date") || + (defaultValue == "('0001-01-01')" && dataTypeName == "date") || + (defaultValue == "('0001-01-01T00:00:00.000')" && dataTypeName == "datetime2") || + (defaultValue == "('0001-01-01T00:00:00.000+00:00')" && dataTypeName == "datetimeoffset") || + (defaultValue == "('00:00:00')" && dataTypeName == "time") || + (defaultValue == "('00000000-0000-0000-0000-000000000000')" && dataTypeName == "uniqueidentifier") + ) { return null; } diff --git a/test/EFCore.Jet.FunctionalTests/Query/ComplexNavigationsQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/ComplexNavigationsQueryJetTest.cs index e563745..cfc3938 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/ComplexNavigationsQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/ComplexNavigationsQueryJetTest.cs @@ -236,7 +236,7 @@ WHERE `l0`.`Id` > 5"); $@"SELECT `l`.`Id`, `l`.`Date`, `l`.`Name`, `l`.`OneToMany_Optional_Self_Inverse1Id`, `l`.`OneToMany_Required_Self_Inverse1Id`, `l`.`OneToOne_Optional_Self1Id` FROM `LevelOne` AS `l` LEFT JOIN `LevelTwo` AS `l0` ON `l`.`Id` = `l0`.`Level1_Required_Id` -WHERE (`l0`.`Name` IS NOT NULL) AND (`l0`.`Name` LIKE 'L' & '%')"); +WHERE (`l0`.`Name` IS NOT NULL) AND (`l0`.`Name` LIKE 'L%')"); } public override async Task Navigation_inside_method_call_translated_to_join2(bool isAsync) @@ -244,10 +244,10 @@ WHERE (`l0`.`Name` IS NOT NULL) AND (`l0`.`Name` LIKE 'L' & '%')"); await base.Navigation_inside_method_call_translated_to_join2(isAsync); AssertSql( - @"SELECT `l`.`Id`, `l`.`Date`, `l`.`Name`, `l`.`OneToMany_Optional_Self_Inverse1Id`, `l`.`OneToMany_Required_Self_Inverse1Id`, `l`.`OneToOne_Optional_Self1Id` -FROM `LevelOne` AS `l` -LEFT JOIN `LevelTwo` AS `l0` ON `l`.`Id` = `l0`.`Level1_Optional_Id` -WHERE (`l0`.`Name` IS NOT NULL) AND (`l0`.`Name` LIKE 'L' & '%')"); + @"SELECT `l`.`Id`, `l`.`Level2_Optional_Id`, `l`.`Level2_Required_Id`, `l`.`Name`, `l`.`OneToMany_Optional_Inverse3Id`, `l`.`OneToMany_Optional_Self_Inverse3Id`, `l`.`OneToMany_Required_Inverse3Id`, `l`.`OneToMany_Required_Self_Inverse3Id`, `l`.`OneToOne_Optional_PK_Inverse3Id`, `l`.`OneToOne_Optional_Self3Id` +FROM `LevelThree` AS `l` +INNER JOIN `LevelTwo` AS `l0` ON `l`.`Level2_Required_Id` = `l0`.`Id` +WHERE (`l0`.`Name` IS NOT NULL) AND (`l0`.`Name` LIKE 'L%')"); } public override async Task Optional_navigation_inside_method_call_translated_to_join(bool isAsync) @@ -258,7 +258,7 @@ WHERE (`l0`.`Name` IS NOT NULL) AND (`l0`.`Name` LIKE 'L' & '%')"); @"SELECT `l`.`Id`, `l`.`Date`, `l`.`Name`, `l`.`OneToMany_Optional_Self_Inverse1Id`, `l`.`OneToMany_Required_Self_Inverse1Id`, `l`.`OneToOne_Optional_Self1Id` FROM `LevelOne` AS `l` LEFT JOIN `LevelTwo` AS `l0` ON `l`.`Id` = `l0`.`Level1_Optional_Id` -WHERE (`l0`.`Name` IS NOT NULL) AND (`l0`.`Name` LIKE 'L' & '%')"); +WHERE (`l0`.`Name` IS NOT NULL) AND (`l0`.`Name` LIKE 'L%')"); } public override async Task Optional_navigation_inside_property_method_translated_to_join(bool isAsync) @@ -280,7 +280,7 @@ WHERE `l0`.`Name` = 'L2 01'"); @"SELECT `l`.`Id`, `l`.`Date`, `l`.`Name`, `l`.`OneToMany_Optional_Self_Inverse1Id`, `l`.`OneToMany_Required_Self_Inverse1Id`, `l`.`OneToOne_Optional_Self1Id` FROM `LevelOne` AS `l` LEFT JOIN `LevelTwo` AS `l0` ON `l`.`Id` = `l0`.`Level1_Optional_Id` -WHERE (`l0`.`Name` IS NOT NULL) AND (UCASE(`l0`.`Name`) LIKE 'L' & '%')"); +WHERE (`l0`.`Name` IS NOT NULL) AND (UCASE(`l0`.`Name`) LIKE 'L%')"); } public override async Task Method_call_on_optional_navigation_translates_to_null_conditional_properly_for_arguments(bool isAsync) @@ -288,10 +288,10 @@ WHERE (`l0`.`Name` IS NOT NULL) AND (UCASE(`l0`.`Name`) LIKE 'L' & '%')"); await base.Method_call_on_optional_navigation_translates_to_null_conditional_properly_for_arguments(isAsync); AssertSql( - $@"SELECT `l`.`Id`, `l`.`Date`, `l`.`Name`, `l`.`OneToMany_Optional_Self_Inverse1Id`, `l`.`OneToMany_Required_Self_Inverse1Id`, `l`.`OneToOne_Optional_Self1Id` + @"SELECT `l`.`Id`, `l`.`Date`, `l`.`Name`, `l`.`OneToMany_Optional_Self_Inverse1Id`, `l`.`OneToMany_Required_Self_Inverse1Id`, `l`.`OneToOne_Optional_Self1Id` FROM `LevelOne` AS `l` LEFT JOIN `LevelTwo` AS `l0` ON `l`.`Id` = `l0`.`Level1_Optional_Id` -WHERE (`l0`.`Name` = '') OR ((`l0`.`Name` IS NOT NULL) AND ((`l0`.`Name` IS NOT NULL) AND (LEFT(`l0`.`Name`, LEN(`l0`.`Name`)) = `l0`.`Name`)))"); +WHERE (`l0`.`Name` = '') OR ((`l0`.`Name` IS NOT NULL) AND (LEFT(`l0`.`Name`, LEN(`l0`.`Name`)) = `l0`.`Name`))"); } public override async Task Optional_navigation_inside_method_call_translated_to_join_keeps_original_nullability(bool isAsync) @@ -1598,10 +1598,10 @@ INNER JOIN `LevelTwo` AS `l3` ON `l2`.`Id` = `l3`.`Id`"); AssertSql( @"SELECT `l2`.`Id`, `l2`.`Level3_Optional_Id`, `l2`.`Level3_Required_Id`, `l2`.`Name`, `l2`.`OneToMany_Optional_Inverse4Id`, `l2`.`OneToMany_Optional_Self_Inverse4Id`, `l2`.`OneToMany_Required_Inverse4Id`, `l2`.`OneToMany_Required_Self_Inverse4Id`, `l2`.`OneToOne_Optional_PK_Inverse4Id`, `l2`.`OneToOne_Optional_Self4Id`, `l3`.`Id`, `l3`.`Date`, `l3`.`Level1_Optional_Id`, `l3`.`Level1_Required_Id`, `l3`.`Name`, `l3`.`OneToMany_Optional_Inverse2Id`, `l3`.`OneToMany_Optional_Self_Inverse2Id`, `l3`.`OneToMany_Required_Inverse2Id`, `l3`.`OneToMany_Required_Self_Inverse2Id`, `l3`.`OneToOne_Optional_PK_Inverse2Id`, `l3`.`OneToOne_Optional_Self2Id` -FROM `LevelOne` AS `l` -LEFT JOIN `LevelTwo` AS `l0` ON `l`.`Id` = `l0`.`Level1_Required_Id` -LEFT JOIN `LevelThree` AS `l1` ON `l0`.`Id` = `l1`.`Level2_Optional_Id` -LEFT JOIN `LevelFour` AS `l2` ON `l1`.`Id` = `l2`.`OneToMany_Required_Inverse4Id` +FROM (((`LevelOne` AS `l` +LEFT JOIN `LevelTwo` AS `l0` ON `l`.`Id` = `l0`.`Level1_Required_Id`) +LEFT JOIN `LevelThree` AS `l1` ON `l0`.`Id` = `l1`.`Level2_Optional_Id`) +LEFT JOIN `LevelFour` AS `l2` ON `l1`.`Id` = `l2`.`OneToMany_Required_Inverse4Id`) LEFT JOIN `LevelTwo` AS `l3` ON `l2`.`Id` = `l3`.`Id`"); } diff --git a/test/EFCore.Jet.FunctionalTests/Query/FunkyDataQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/FunkyDataQueryJetTest.cs index 0851780..8291fb6 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/FunkyDataQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/FunkyDataQueryJetTest.cs @@ -116,7 +116,7 @@ WHERE CHARINDEX({AssertSqlHelper.Parameter("@__prm8_0")}, `f`.`FirstName`) <= 0" $@"SELECT `f`.`FirstName` AS `fn`, `f0`.`LastName` AS `ln` FROM `FunkyCustomers` AS `f`, `FunkyCustomers` AS `f0` -WHERE (INSTR(1, `f`.`FirstName`, `f0`.`LastName`, 0) > 0) OR (`f0`.`LastName` = '')"); +WHERE (`f0`.`LastName` LIKE '') OR (INSTR(1, `f`.`FirstName`, `f0`.`LastName`, 1) > 0)"); } public override async Task String_contains_on_argument_with_wildcard_column_negated(bool isAsync) @@ -127,7 +127,7 @@ WHERE (INSTR(1, `f`.`FirstName`, `f0`.`LastName`, 0) > 0) OR (`f0`.`LastName` = $@"SELECT `f`.`FirstName` AS `fn`, `f0`.`LastName` AS `ln` FROM `FunkyCustomers` AS `f`, `FunkyCustomers` AS `f0` -WHERE ((`f0`.`LastName` <> '') OR `f0`.`LastName` IS NULL) AND (CHARINDEX(`f0`.`LastName`, `f`.`FirstName`) <= 0)"); +WHERE NOT ((`f0`.`LastName` LIKE '') OR (INSTR(1, `f`.`FirstName`, `f0`.`LastName`, 1) > 0))"); } public override async Task String_starts_with_on_argument_with_wildcard_constant(bool isAsync) diff --git a/test/EFCore.Jet.FunctionalTests/Query/GearsOfWarQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/GearsOfWarQueryJetTest.cs index 68db6b9..87ffac7 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/GearsOfWarQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/GearsOfWarQueryJetTest.cs @@ -1309,7 +1309,7 @@ WHERE (`t1`.`Nickname` = `t2`.`Nickname`) OR (`t1`.`Nickname` IS NULL AND `t2`.` await base.Optional_Navigation_Null_Coalesce_To_Clr_Type(isAsync); AssertSql( - $@"SELECT TOP 1 IIf(`w0`.`IsAutomatic` IS NULL, False, `w0`.`IsAutomatic`) AS `IsAutomatic` + $@"SELECT TOP 1 IIF(`w0`.`IsAutomatic` IS NULL, False, `w0`.`IsAutomatic`) AS `IsAutomatic` FROM `Weapons` AS `w` LEFT JOIN `Weapons` AS `w0` ON `w`.`SynergyWithId` = `w0`.`Id` ORDER BY `w`.`Id`"); @@ -2033,7 +2033,7 @@ ORDER BY `t3`.`FullName0`, `t3`.`FullName`"); AssertSql( $@"SELECT `w`.`Id`, `w`.`AmmunitionType`, `w`.`IsAutomatic`, `w`.`Name`, `w`.`OwnerFullName`, `w`.`SynergyWithId` FROM `Weapons` AS `w` -WHERE IIf(`w`.`IsAutomatic` IS NULL, False, `w`.`IsAutomatic`) = True"); +WHERE IIF(`w`.`IsAutomatic` IS NULL, False, `w`.`IsAutomatic`) = True"); } public override async Task Coalesce_operator_in_predicate_with_other_conditions(bool isAsync) @@ -2043,7 +2043,7 @@ WHERE IIf(`w`.`IsAutomatic` IS NULL, False, `w`.`IsAutomatic`) = True"); AssertSql( $@"SELECT `w`.`Id`, `w`.`AmmunitionType`, `w`.`IsAutomatic`, `w`.`Name`, `w`.`OwnerFullName`, `w`.`SynergyWithId` FROM `Weapons` AS `w` -WHERE (`w`.`AmmunitionType` = 1) AND (IIf(`w`.`IsAutomatic` IS NULL, False, `w`.`IsAutomatic`) = True)"); +WHERE (`w`.`AmmunitionType` = 1) AND (IIF(`w`.`IsAutomatic` IS NULL, False, `w`.`IsAutomatic`) = True)"); } public override async Task Coalesce_operator_in_projection_with_other_conditions(bool isAsync) @@ -2051,7 +2051,7 @@ WHERE (`w`.`AmmunitionType` = 1) AND (IIf(`w`.`IsAutomatic` IS NULL, False, `w`. await base.Coalesce_operator_in_projection_with_other_conditions(isAsync); AssertSql( - $@"SELECT IIF(((`w`.`AmmunitionType` = 1) AND `w`.`AmmunitionType` IS NOT NULL) AND (IIf(`w`.`IsAutomatic` IS NULL, False, `w`.`IsAutomatic`) = True), 1, 0) + $@"SELECT IIF(((`w`.`AmmunitionType` = 1) AND `w`.`AmmunitionType` IS NOT NULL) AND (IIF(`w`.`IsAutomatic` IS NULL, False, `w`.`IsAutomatic`) = True), 1, 0) FROM `Weapons` AS `w`"); } @@ -5055,7 +5055,7 @@ ORDER BY `g`.`Nickname`, `g`.`SquadId`, `t1`.`Id`"); $@"SELECT CASE WHEN CASE WHEN `t0`.`HasSoulPatch` = True THEN True - ELSE IIf(`t0`.`HasSoulPatch` IS NULL, True, `t0`.`HasSoulPatch`) + ELSE IIF(`t0`.`HasSoulPatch` IS NULL, True, `t0`.`HasSoulPatch`) END <> True THEN True ELSE False END AS `c` @@ -5958,7 +5958,7 @@ FROM `Missions` AS `m`"); await base.GroupBy_Property_Include_Select_Average(isAsync); AssertSql( - $@"SELECT AVG(IIf(`g`.`SquadId` IS NULL, NULL, CDBL(`g`.`SquadId`))) + $@"SELECT AVG(IIF(`g`.`SquadId` IS NULL, NULL, CDBL(`g`.`SquadId`))) FROM `Gears` AS `g` WHERE `g`.`Discriminator` IN ('Gear', 'Officer') GROUP BY `g`.`Rank`"); @@ -6133,7 +6133,7 @@ END"); await base.GetValueOrDefault_in_projection(isAsync); AssertSql( - $@"SELECT IIf(`w`.`SynergyWithId` IS NULL, 0, `w`.`SynergyWithId`) + $@"SELECT IIF(`w`.`SynergyWithId` IS NULL, 0, `w`.`SynergyWithId`) FROM `Weapons` AS `w`"); } @@ -6144,7 +6144,7 @@ FROM `Weapons` AS `w`"); AssertSql( $@"SELECT `w`.`Id`, `w`.`AmmunitionType`, `w`.`IsAutomatic`, `w`.`Name`, `w`.`OwnerFullName`, `w`.`SynergyWithId` FROM `Weapons` AS `w` -WHERE IIf(`w`.`SynergyWithId` IS NULL, 0, `w`.`SynergyWithId`) = 0"); +WHERE IIF(`w`.`SynergyWithId` IS NULL, 0, `w`.`SynergyWithId`) = 0"); } public override async Task GetValueOrDefault_in_filter_non_nullable_column(bool isAsync) @@ -6154,7 +6154,7 @@ WHERE IIf(`w`.`SynergyWithId` IS NULL, 0, `w`.`SynergyWithId`) = 0"); AssertSql( $@"SELECT `w`.`Id`, `w`.`AmmunitionType`, `w`.`IsAutomatic`, `w`.`Name`, `w`.`OwnerFullName`, `w`.`SynergyWithId` FROM `Weapons` AS `w` -WHERE IIf(`w`.`Id` IS NULL, 0, `w`.`Id`) = 0"); +WHERE IIF(`w`.`Id` IS NULL, 0, `w`.`Id`) = 0"); } public override async Task GetValueOrDefault_in_order_by(bool isAsync) @@ -6164,7 +6164,7 @@ WHERE IIf(`w`.`Id` IS NULL, 0, `w`.`Id`) = 0"); AssertSql( $@"SELECT `w`.`Id`, `w`.`AmmunitionType`, `w`.`IsAutomatic`, `w`.`Name`, `w`.`OwnerFullName`, `w`.`SynergyWithId` FROM `Weapons` AS `w` -ORDER BY IIf(`w`.`SynergyWithId` IS NULL, 0, `w`.`SynergyWithId`), `w`.`Id`"); +ORDER BY IIF(`w`.`SynergyWithId` IS NULL, 0, `w`.`SynergyWithId`), `w`.`Id`"); } public override async Task GetValueOrDefault_with_argument(bool isAsync) @@ -6174,7 +6174,7 @@ ORDER BY IIf(`w`.`SynergyWithId` IS NULL, 0, `w`.`SynergyWithId`), `w`.`Id`"); AssertSql( $@"SELECT `w`.`Id`, `w`.`AmmunitionType`, `w`.`IsAutomatic`, `w`.`Name`, `w`.`OwnerFullName`, `w`.`SynergyWithId` FROM `Weapons` AS `w` -WHERE IIf(`w`.`SynergyWithId` IS NULL, 0, `w`.`SynergyWithId`) = 1"); +WHERE IIF(`w`.`SynergyWithId` IS NULL, 0, `w`.`SynergyWithId`) = 1"); } public override async Task GetValueOrDefault_with_argument_complex(bool isAsync) @@ -6184,7 +6184,7 @@ WHERE IIf(`w`.`SynergyWithId` IS NULL, 0, `w`.`SynergyWithId`) = 1"); AssertSql( $@"SELECT `w`.`Id`, `w`.`AmmunitionType`, `w`.`IsAutomatic`, `w`.`Name`, `w`.`OwnerFullName`, `w`.`SynergyWithId` FROM `Weapons` AS `w` -WHERE IIf(`w`.`SynergyWithId` IS NULL, 0, `w`.`SynergyWithId`) AS int) + 42) > 10"); +WHERE IIF(`w`.`SynergyWithId` IS NULL, 0, `w`.`SynergyWithId`) AS int) + 42) > 10"); } public override async Task Filter_with_complex_predicate_containing_subquery(bool isAsync) diff --git a/test/EFCore.Jet.FunctionalTests/Query/InheritanceQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/InheritanceQueryJetTest.cs index 7ff821d..6d9f4f3 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/InheritanceQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/InheritanceQueryJetTest.cs @@ -371,7 +371,7 @@ VALUES ({AssertSqlHelper.Parameter("@p0")}, {AssertSqlHelper.Parameter("@p1")}, // $@"SELECT TOP 2 `a`.`Species`, `a`.`CountryId`, `a`.`Discriminator`, `a`.`Name`, `a`.`EagleId`, `a`.`IsFlightless`, `a`.`FoundOn` FROM `Animals` AS `a` -WHERE (`a`.`Discriminator` = 'Kiwi') AND (`a`.`Species` LIKE '%' & 'owenii')", +WHERE (`a`.`Discriminator` = 'Kiwi') AND (`a`.`Species` LIKE '%owenii')", // $@"{ AssertSqlHelper.Declaration("@p0='Aquila chrysaetos canadensis' (Size = 100)")} {AssertSqlHelper.Declaration("@p1='Apteryx owenii' (Nullable = false) (Size = 100)")} @@ -382,7 +382,7 @@ SELECT @@ROWCOUNT;", // $@"SELECT TOP 2 `a`.`Species`, `a`.`CountryId`, `a`.`Discriminator`, `a`.`Name`, `a`.`EagleId`, `a`.`IsFlightless`, `a`.`FoundOn` FROM `Animals` AS `a` -WHERE (`a`.`Discriminator` = 'Kiwi') AND (`a`.`Species` LIKE '%' & 'owenii')", +WHERE (`a`.`Discriminator` = 'Kiwi') AND (`a`.`Species` LIKE '%owenii')", // $@"{AssertSqlHelper.Declaration("@p0='Apteryx owenii' (Nullable = false) (Size = 100)")} @@ -392,7 +392,7 @@ SELECT @@ROWCOUNT;", // $@"SELECT COUNT(*) FROM `Animals` AS `a` -WHERE (`a`.`Discriminator` = 'Kiwi') AND (`a`.`Species` LIKE '%' & 'owenii')"); +WHERE (`a`.`Discriminator` = 'Kiwi') AND (`a`.`Species` LIKE '%owenii')"); } public override async Task Byte_enum_value_constant_used_in_projection(bool async) diff --git a/test/EFCore.Jet.FunctionalTests/Query/NorthwindAggregateOperatorsQueryJetTest.ResultOperators.cs b/test/EFCore.Jet.FunctionalTests/Query/NorthwindAggregateOperatorsQueryJetTest.ResultOperators.cs index abc1abb..9c25c7d 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/NorthwindAggregateOperatorsQueryJetTest.ResultOperators.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/NorthwindAggregateOperatorsQueryJetTest.ResultOperators.cs @@ -40,7 +40,7 @@ FROM (SELECT COUNT(*) FROM MSysAccessStorage)"); await base.Sum_with_no_arg(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) + $@"SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) FROM `Orders` AS `o`"); } @@ -49,7 +49,7 @@ FROM `Orders` AS `o`"); await base.Sum_with_binary_expression(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID` * 2) + $@"SELECT IIF(SUM(`o`.`OrderID` * 2) IS NULL, 0, SUM(`o`.`OrderID` * 2)) FROM `Orders` AS `o`"); } @@ -58,7 +58,7 @@ FROM `Orders` AS `o`"); await base.Sum_with_arg(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) + $@"SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) FROM `Orders` AS `o`"); } @@ -67,7 +67,7 @@ FROM `Orders` AS `o`"); await base.Sum_with_arg_expression(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID` + `o`.`OrderID`) + $@"SELECT IIF(SUM(`o`.`OrderID` + `o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID` + `o`.`OrderID`)) FROM `Orders` AS `o`"); } @@ -94,7 +94,7 @@ FROM `Order Details` AS `o`"); await base.Sum_with_coalesce(isAsync); AssertSql( - $@"SELECT SUM(IIF(`p`.`UnitPrice` IS NULL, 0.0, `p`.`UnitPrice`)) + $@"SELECT IIF(SUM(IIF(`p`.`UnitPrice` IS NULL, 0.0, `p`.`UnitPrice`)) IS NULL, 0.0, SUM(IIF(`p`.`UnitPrice` IS NULL, 0.0, `p`.`UnitPrice`))) FROM `Products` AS `p` WHERE `p`.`ProductID` < 40"); } @@ -133,7 +133,7 @@ FROM `Customers` AS `c`"); await base.Sum_on_float_column(isAsync); AssertSql( - $@"SELECT IIF(SUM(`o`.`Discount`) IS NULL, NULL, CSNG(SUM(`o`.`Discount`))) + $@"SELECT CSNG(IIF(SUM(`o`.`Discount`) IS NULL, 0.0, SUM(`o`.`Discount`))) FROM `Order Details` AS `o` WHERE `o`.`ProductID` = 1"); } @@ -143,12 +143,12 @@ WHERE `o`.`ProductID` = 1"); await base.Sum_on_float_column_in_subquery(isAsync); AssertSql( - $@"SELECT `o0`.`OrderID`, ( - SELECT IIF(SUM(`o`.`Discount`) IS NULL, NULL, CSNG(SUM(`o`.`Discount`))) - FROM `Order Details` AS `o` - WHERE `o0`.`OrderID` = `o`.`OrderID`) AS `Sum` -FROM `Orders` AS `o0` -WHERE `o0`.`OrderID` < 10300"); + $@"SELECT `o`.`OrderID`, ( + SELECT CSNG(IIF(SUM(`o0`.`Discount`) IS NULL, 0.0, SUM(`o0`.`Discount`))) + FROM `Order Details` AS `o0` + WHERE `o`.`OrderID` = `o0`.`OrderID`) AS `Sum` +FROM `Orders` AS `o` +WHERE `o`.`OrderID` < 10300"); } public override async Task Average_with_no_arg(bool isAsync) @@ -156,7 +156,7 @@ WHERE `o0`.`OrderID` < 10300"); await base.Average_with_no_arg(isAsync); AssertSql( - $@"SELECT AVG(IIF(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) + $@"SELECT AVG(CDBL(`o`.`OrderID`)) FROM `Orders` AS `o`"); } @@ -165,7 +165,7 @@ FROM `Orders` AS `o`"); await base.Average_with_binary_expression(isAsync); AssertSql( - $@"SELECT AVG(IIF(`o`.`OrderID` * 2 IS NULL, NULL, CDBL(`o`.`OrderID` * 2))) + $@"SELECT AVG(CDBL(`o`.`OrderID` * 2)) FROM `Orders` AS `o`"); } @@ -174,7 +174,7 @@ FROM `Orders` AS `o`"); await base.Average_with_arg(isAsync); AssertSql( - $@"SELECT AVG(IIF(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) + $@"SELECT AVG(CDBL(`o`.`OrderID`)) FROM `Orders` AS `o`"); } @@ -183,7 +183,7 @@ FROM `Orders` AS `o`"); await base.Average_with_arg_expression(isAsync); AssertSql( - $@"SELECT AVG(IIF(`o`.`OrderID` + `o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID` + `o`.`OrderID`))) + $@"SELECT AVG(CDBL(`o`.`OrderID` + `o`.`OrderID`)) FROM `Orders` AS `o`"); } @@ -192,7 +192,7 @@ FROM `Orders` AS `o`"); await base.Average_with_division_on_decimal(isAsync); AssertSql( - $@"SELECT AVG(IIF(`o`.`Quantity` IS NULL, NULL, CCUR(`o`.`Quantity`)) / 2.09) + $@"SELECT AVG(CCUR(`o`.`Quantity`) / 2.09) FROM `Order Details` AS `o`"); } @@ -201,7 +201,7 @@ FROM `Order Details` AS `o`"); await base.Average_with_division_on_decimal_no_significant_digits(isAsync); AssertSql( - $@"SELECT AVG(IIF(`o`.`Quantity` IS NULL, NULL, CCUR(`o`.`Quantity`)) / 2.0) + $@"SELECT AVG(CCUR(`o`.`Quantity`) / 2.0) FROM `Order Details` AS `o`"); } @@ -255,7 +255,7 @@ ORDER BY `c`.`CustomerID`"); await base.Average_on_float_column(isAsync); AssertSql( - $@"SELECT IIF(AVG(`o`.`Discount`) IS NULL, NULL, CSNG(AVG(`o`.`Discount`))) + $@"SELECT CSNG(AVG(`o`.`Discount`)) FROM `Order Details` AS `o` WHERE `o`.`ProductID` = 1"); } @@ -266,7 +266,7 @@ WHERE `o`.`ProductID` = 1"); AssertSql( $@"SELECT `o`.`OrderID`, ( - SELECT IIF(AVG(`o0`.`Discount`) IS NULL, NULL, CSNG(AVG(`o0`.`Discount`))) + SELECT CSNG(AVG(`o0`.`Discount`)) FROM `Order Details` AS `o0` WHERE `o`.`OrderID` = `o0`.`OrderID`) AS `Sum` FROM `Orders` AS `o` @@ -279,7 +279,7 @@ WHERE `o`.`OrderID` < 10300"); AssertSql( $@"SELECT `o`.`OrderID`, ( - SELECT IIF(AVG(`o0`.`Discount`) IS NULL, NULL, CSNG(AVG(`o0`.`Discount`))) + SELECT CSNG(AVG(`o0`.`Discount`)) FROM `Order Details` AS `o0` WHERE `o`.`OrderID` = `o0`.`OrderID`) AS `Sum` FROM `Orders` AS `o` @@ -1016,9 +1016,9 @@ ORDER BY `o`.`OrderID`"); await base.Average_with_non_matching_types_in_projection_doesnt_produce_second_explicit_cast(isAsync); AssertSql( - $@"SELECT AVG(IIF(IIF(`o`.`OrderID` IS NULL, NULL, CLNG(`o`.`OrderID`)) IS NULL, NULL, CDBL(IIF(`o`.`OrderID` IS NULL, NULL, CLNG(`o`.`OrderID`))))) + $@"SELECT AVG(CDBL(CLNG(`o`.`OrderID`))) FROM `Orders` AS `o` -WHERE (`o`.`CustomerID` IS NOT NULL) AND (`o`.`CustomerID` LIKE 'A' & '%')"); +WHERE (`o`.`CustomerID` IS NOT NULL) AND (`o`.`CustomerID` LIKE 'A%')"); } public override async Task Max_with_non_matching_types_in_projection_introduces_explicit_cast(bool isAsync) @@ -1026,9 +1026,9 @@ WHERE (`o`.`CustomerID` IS NOT NULL) AND (`o`.`CustomerID` LIKE 'A' & '%')"); await base.Max_with_non_matching_types_in_projection_introduces_explicit_cast(isAsync); AssertSql( - $@"SELECT MAX(IIF(`o`.`OrderID` IS NULL, NULL, CLNG(`o`.`OrderID`))) + $@"SELECT MAX(CLNG(`o`.`OrderID`)) FROM `Orders` AS `o` -WHERE (`o`.`CustomerID` IS NOT NULL) AND (`o`.`CustomerID` LIKE 'A' & '%')"); +WHERE (`o`.`CustomerID` IS NOT NULL) AND (`o`.`CustomerID` LIKE 'A%')"); } public override async Task Min_with_non_matching_types_in_projection_introduces_explicit_cast(bool isAsync) @@ -1036,9 +1036,9 @@ WHERE (`o`.`CustomerID` IS NOT NULL) AND (`o`.`CustomerID` LIKE 'A' & '%')"); await base.Min_with_non_matching_types_in_projection_introduces_explicit_cast(isAsync); AssertSql( - $@"SELECT MIN(IIF(`o`.`OrderID` IS NULL, NULL, CLNG(`o`.`OrderID`))) + $@"SELECT MIN(CLNG(`o`.`OrderID`)) FROM `Orders` AS `o` -WHERE (`o`.`CustomerID` IS NOT NULL) AND (`o`.`CustomerID` LIKE 'A' & '%')"); +WHERE (`o`.`CustomerID` IS NOT NULL) AND (`o`.`CustomerID` LIKE 'A%')"); } public override async Task OrderBy_Take_Last_gives_correct_result(bool isAsync) @@ -1175,7 +1175,7 @@ WHERE `c`.`CustomerID` = 'ALFKI'"); await base.Project_constant_Sum(isAsync); AssertSql( - $@"SELECT SUM(1) + $@"SELECT IIF(SUM(1) IS NULL, 0, SUM(1)) FROM `Employees` AS `e`"); } @@ -1282,7 +1282,7 @@ FROM `Customers` AS `c`"); AssertSql( $@"SELECT ( - SELECT AVG(IIF(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) + SELECT AVG(CDBL(`o`.`OrderID`)) FROM `Orders` AS `o` WHERE `c`.`CustomerID` = `o`.`CustomerID`) FROM `Customers` AS `c`"); @@ -1307,7 +1307,7 @@ LEFT JOIN `Products` AS `p` ON 1 = 1"); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE (`c`.`CustomerID` LIKE 'F' & '%') AND (( +WHERE (`c`.`CustomerID` LIKE 'F%') AND (( SELECT TOP 1 `o`.`CustomerID` FROM `Orders` AS `o` WHERE `c`.`CustomerID` = `o`.`CustomerID` @@ -1321,7 +1321,7 @@ WHERE (`c`.`CustomerID` LIKE 'F' & '%') AND (( AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE (`c`.`CustomerID` LIKE 'F' & '%') AND (( +WHERE (`c`.`CustomerID` LIKE 'F%') AND (( SELECT TOP 1 `o`.`CustomerID` FROM `Orders` AS `o` WHERE `c`.`CustomerID` = `o`.`CustomerID` @@ -1333,7 +1333,7 @@ WHERE (`c`.`CustomerID` LIKE 'F' & '%') AND (( await base.Sum_over_explicit_cast_over_column(isAsync); AssertSql( - $@"SELECT SUM(CAST(`o`.`OrderID` AS bigint)) + $@"SELECT IIF(SUM(CLNG(`o`.`OrderID`)) IS NULL, 0, SUM(CLNG(`o`.`OrderID`))) FROM `Orders` AS `o`"); } diff --git a/test/EFCore.Jet.FunctionalTests/Query/NorthwindFunctionsQueryJetTest.Functions.cs b/test/EFCore.Jet.FunctionalTests/Query/NorthwindFunctionsQueryJetTest.Functions.cs index a05946e..6ec3357 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/NorthwindFunctionsQueryJetTest.Functions.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/NorthwindFunctionsQueryJetTest.Functions.cs @@ -27,6 +27,47 @@ namespace EntityFrameworkCore.Jet.FunctionalTests.Query Fixture.TestSqlLoggerFactory.SetTestOutputHelper(testOutputHelper); } + public override async Task TimeSpan_Compare_to_simple_zero(bool async, bool compareTo) + { + await base.TimeSpan_Compare_to_simple_zero(async, compareTo); + + AssertSql(@"@__myDatetime_0='1998-05-04T00:00:00.0000000' (DbType = DateTime) + +SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` +FROM `Orders` AS `o` +WHERE `o`.`OrderDate` = ?", + // + @"@__myDatetime_0='1998-05-04T00:00:00.0000000' (DbType = DateTime) + +SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` +FROM `Orders` AS `o` +WHERE (`o`.`OrderDate` <> ?) OR (`o`.`OrderDate` IS NULL)", + // + @"@__myDatetime_0='1998-05-04T00:00:00.0000000' (DbType = DateTime) + +SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` +FROM `Orders` AS `o` +WHERE `o`.`OrderDate` > ?", + // + @"@__myDatetime_0='1998-05-04T00:00:00.0000000' (DbType = DateTime) + +SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` +FROM `Orders` AS `o` +WHERE `o`.`OrderDate` <= ?", + // + @"@__myDatetime_0='1998-05-04T00:00:00.0000000' (DbType = DateTime) + +SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` +FROM `Orders` AS `o` +WHERE `o`.`OrderDate` > ?", + // + @"@__myDatetime_0='1998-05-04T00:00:00.0000000' (DbType = DateTime) + +SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` +FROM `Orders` AS `o` +WHERE `o`.`OrderDate` <= ?"); + } + public override async Task String_StartsWith_Literal(bool isAsync) { await base.String_StartsWith_Literal(isAsync); @@ -34,7 +75,7 @@ namespace EntityFrameworkCore.Jet.FunctionalTests.Query AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE `c`.`ContactName` IS NOT NULL AND (`c`.`ContactName` LIKE 'M' & '%')"); +WHERE (`c`.`ContactName` IS NOT NULL) AND (`c`.`ContactName` LIKE 'M%')"); } public override async Task String_StartsWith_Identity(bool isAsync) @@ -44,7 +85,7 @@ WHERE `c`.`ContactName` IS NOT NULL AND (`c`.`ContactName` LIKE 'M' & '%')"); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE (`c`.`ContactName` = '') OR (`c`.`ContactName` IS NOT NULL AND (`c`.`ContactName` IS NOT NULL AND (LEFT(`c`.`ContactName`, LEN(`c`.`ContactName`)) = `c`.`ContactName`)))"); +WHERE (`c`.`ContactName` = '') OR ((`c`.`ContactName` IS NOT NULL) AND (LEFT(`c`.`ContactName`, LEN(`c`.`ContactName`)) = `c`.`ContactName`))"); } public override async Task String_StartsWith_Column(bool isAsync) @@ -54,7 +95,7 @@ WHERE (`c`.`ContactName` = '') OR (`c`.`ContactName` IS NOT NULL AND (`c`.`Conta AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE (`c`.`ContactName` = '') OR (`c`.`ContactName` IS NOT NULL AND (`c`.`ContactName` IS NOT NULL AND (LEFT(`c`.`ContactName`, LEN(`c`.`ContactName`)) = `c`.`ContactName`)))"); +WHERE (`c`.`ContactName` = '') OR ((`c`.`ContactName` IS NOT NULL) AND (LEFT(`c`.`ContactName`, LEN(`c`.`ContactName`)) = `c`.`ContactName`))"); } public override async Task String_StartsWith_MethodCall(bool isAsync) @@ -64,7 +105,7 @@ WHERE (`c`.`ContactName` = '') OR (`c`.`ContactName` IS NOT NULL AND (`c`.`Conta AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE `c`.`ContactName` IS NOT NULL AND (`c`.`ContactName` LIKE 'M' & '%')"); +WHERE (`c`.`ContactName` IS NOT NULL) AND (`c`.`ContactName` LIKE 'M%')"); } public override async Task String_EndsWith_Literal(bool isAsync) @@ -74,7 +115,7 @@ WHERE `c`.`ContactName` IS NOT NULL AND (`c`.`ContactName` LIKE 'M' & '%')"); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE `c`.`ContactName` IS NOT NULL AND (`c`.`ContactName` LIKE '%b')"); +WHERE (`c`.`ContactName` IS NOT NULL) AND (`c`.`ContactName` LIKE '%b')"); } public override async Task String_EndsWith_Identity(bool isAsync) @@ -84,7 +125,7 @@ WHERE `c`.`ContactName` IS NOT NULL AND (`c`.`ContactName` LIKE '%b')"); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE (`c`.`ContactName` = '') OR (`c`.`ContactName` IS NOT NULL AND (`c`.`ContactName` IS NOT NULL AND (RIGHT(`c`.`ContactName`, LEN(`c`.`ContactName`)) = `c`.`ContactName`)))"); +WHERE (`c`.`ContactName` = '') OR ((`c`.`ContactName` IS NOT NULL) AND (RIGHT(`c`.`ContactName`, LEN(`c`.`ContactName`)) = `c`.`ContactName`))"); } public override async Task String_EndsWith_Column(bool isAsync) @@ -94,7 +135,7 @@ WHERE (`c`.`ContactName` = '') OR (`c`.`ContactName` IS NOT NULL AND (`c`.`Conta AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE (`c`.`ContactName` = '') OR (`c`.`ContactName` IS NOT NULL AND (`c`.`ContactName` IS NOT NULL AND (RIGHT(`c`.`ContactName`, LEN(`c`.`ContactName`)) = `c`.`ContactName`)))"); +WHERE (`c`.`ContactName` = '') OR ((`c`.`ContactName` IS NOT NULL) AND (RIGHT(`c`.`ContactName`, LEN(`c`.`ContactName`)) = `c`.`ContactName`))"); } public override async Task String_EndsWith_MethodCall(bool isAsync) @@ -104,7 +145,7 @@ WHERE (`c`.`ContactName` = '') OR (`c`.`ContactName` IS NOT NULL AND (`c`.`Conta AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE `c`.`ContactName` IS NOT NULL AND (`c`.`ContactName` LIKE '%m')"); +WHERE (`c`.`ContactName` IS NOT NULL) AND (`c`.`ContactName` LIKE '%m')"); } public override async Task String_Contains_Literal(bool isAsync) @@ -115,11 +156,10 @@ WHERE `c`.`ContactName` IS NOT NULL AND (`c`.`ContactName` LIKE '%m')"); ss => ss.Set().Where(c => c.ContactName.Contains("M") || c.ContactName.Contains("m")), // case-sensitive entryCount: 34); - // issue #15994 -// AssertSql( -// $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` -//FROM `Customers` AS `c` -//WHERE CHARINDEX('M', `c`.`ContactName`) > 0"); + AssertSql( + $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` +FROM `Customers` AS `c` +WHERE `c`.`ContactName` LIKE '%M%'"); } public override async Task String_Contains_Identity(bool isAsync) @@ -129,7 +169,7 @@ WHERE `c`.`ContactName` IS NOT NULL AND (`c`.`ContactName` LIKE '%m')"); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE (`c`.`ContactName` = '') OR (CHARINDEX(`c`.`ContactName`, `c`.`ContactName`) > 0)"); +WHERE (`c`.`ContactName` LIKE '') OR (INSTR(1, `c`.`ContactName`, `c`.`ContactName`, 1) > 0)"); } public override async Task String_Contains_Column(bool isAsync) @@ -139,7 +179,48 @@ WHERE (`c`.`ContactName` = '') OR (CHARINDEX(`c`.`ContactName`, `c`.`ContactName AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE (`c`.`ContactName` = '') OR (CHARINDEX(`c`.`ContactName`, `c`.`ContactName`) > 0)"); +WHERE (`c`.`ContactName` LIKE '') OR (INSTR(1, `c`.`ContactName`, `c`.`ContactName`, 1) > 0)"); + } + + public override async Task String_Contains_constant_with_whitespace(bool async) + { + await base.String_Contains_constant_with_whitespace(async); + + AssertSql( + @"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` +FROM `Customers` AS `c` +WHERE `c`.`ContactName` LIKE '% %'"); + } + + public override async Task String_Contains_parameter_with_whitespace(bool async) + { + await base.String_Contains_parameter_with_whitespace(async); + + AssertSql( + @"@__pattern_0=' ' (Size = 255) +@__pattern_0=' ' (Size = 255) + +SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` +FROM `Customers` AS `c` +WHERE (? LIKE '') OR (INSTR(1, `c`.`ContactName`, ?, 1) > 0)"); + } + + public override async Task String_FirstOrDefault_MethodCall(bool async) + { + await base.String_FirstOrDefault_MethodCall(async); + AssertSql( + @"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` +FROM `Customers` AS `c` +WHERE MID(`c`.`ContactName`, 1, 1) = 'A'"); + } + + public override async Task String_LastOrDefault_MethodCall(bool async) + { + await base.String_LastOrDefault_MethodCall(async); + AssertSql( + @"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` +FROM `Customers` AS `c` +WHERE MID(`c`.`ContactName`, LEN(`c`.`ContactName`), 1) = 's'"); } public override async Task String_Contains_MethodCall(bool isAsync) @@ -155,7 +236,7 @@ WHERE (`c`.`ContactName` = '') OR (CHARINDEX(`c`.`ContactName`, `c`.`ContactName AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE CHARINDEX('M', `c`.`ContactName`) > 0"); +WHERE `c`.`ContactName` LIKE '%M%'"); } public override async Task String_Compare_simple_zero(bool isAsync) @@ -583,9 +664,9 @@ WHERE CHARINDEX('M', `c`.`ContactName`) > 0"); await base.Where_math_abs1(isAsync); AssertSql( - $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` -FROM `Order Details` AS `o` -WHERE ABS(`o`.`ProductID`) > 10"); + @"SELECT `p`.`ProductID`, `p`.`Discontinued`, `p`.`ProductName`, `p`.`SupplierID`, `p`.`UnitPrice`, `p`.`UnitsInStock` +FROM `Products` AS `p` +WHERE ABS(`p`.`ProductID`) > 10"); } public override async Task Where_math_abs2(bool isAsync) @@ -593,9 +674,9 @@ WHERE ABS(`o`.`ProductID`) > 10"); await base.Where_math_abs2(isAsync); AssertSql( - $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` FROM `Order Details` AS `o` -WHERE ABS(`o`.`Quantity`) > 10"); +WHERE (`o`.`UnitPrice` < 7.0) AND (ABS(`o`.`Quantity`) > 10)"); } public override async Task Where_math_abs3(bool isAsync) @@ -603,9 +684,9 @@ WHERE ABS(`o`.`Quantity`) > 10"); await base.Where_math_abs3(isAsync); AssertSql( - $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` FROM `Order Details` AS `o` -WHERE ABS(`o`.`UnitPrice`) > 10.0"); +WHERE (`o`.`Quantity` < 5) AND (ABS(`o`.`UnitPrice`) > 10.0)"); } public override async Task Where_math_abs_uncorrelated(bool isAsync) @@ -615,7 +696,7 @@ WHERE ABS(`o`.`UnitPrice`) > 10.0"); AssertSql( $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` FROM `Order Details` AS `o` -WHERE 10 < `o`.`ProductID`"); +WHERE (`o`.`UnitPrice` < 7.0) AND (10 < `o`.`ProductID`)"); } public override async Task Where_math_ceiling1(bool isAsync) @@ -655,7 +736,19 @@ WHERE FLOOR(`o`.`UnitPrice`) > 10.0"); AssertSql( $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` FROM `Order Details` AS `o` -WHERE POWER(IIF(`o`.`Discount` IS NULL, NULL, CDBL(`o`.`Discount`)), 2.0E0) > 0.05000000074505806E0"); +WHERE CDBL(`o`.`Discount`)^3.0 > 0.004999999888241291"); + } + + public override async Task Where_math_square(bool async) + { + await base.Where_math_square(async); + + AssertSql( + """ +SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` +FROM `Order Details` AS `o` +WHERE CDBL(`o`.`Discount`)^2.0 > 0.05000000074505806 +"""); } public override async Task Where_math_round(bool isAsync) @@ -665,7 +758,7 @@ WHERE POWER(IIF(`o`.`Discount` IS NULL, NULL, CDBL(`o`.`Discount`)), 2.0E0) > 0. AssertSql( $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` FROM `Order Details` AS `o` -WHERE ROUND(`o`.`UnitPrice`, 0) > 10.0"); +WHERE (`o`.`Quantity` < 5) AND (ROUND(`o`.`UnitPrice`, 0) > 10.0)"); } public override async Task Select_math_round_int(bool isAsync) @@ -673,7 +766,7 @@ WHERE ROUND(`o`.`UnitPrice`, 0) > 10.0"); await base.Select_math_round_int(isAsync); AssertSql( - $@"SELECT ROUND(IIF(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`)), 0) AS `A` + $@"SELECT ROUND(CDBL(`o`.`OrderID`), 0) AS `A` FROM `Orders` AS `o` WHERE `o`.`OrderID` < 10250"); } @@ -683,7 +776,7 @@ WHERE `o`.`OrderID` < 10250"); await base.Select_math_truncate_int(isAsync); AssertSql( - $@"SELECT ROUND(IIF(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`)), 0, 1) AS `A` + $@"SELECT INT(CDBL(`o`.`OrderID`)) AS `A` FROM `Orders` AS `o` WHERE `o`.`OrderID` < 10250"); } @@ -705,7 +798,7 @@ WHERE ROUND(`o`.`UnitPrice`, 2) > 100.0"); AssertSql( $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` FROM `Order Details` AS `o` -WHERE ROUND(`o`.`UnitPrice`, 0, 1) > 10.0"); +WHERE (`o`.`Quantity` < 5) AND (INT(`o`.`UnitPrice`) > 10.0)"); } public override async Task Where_math_exp(bool isAsync) @@ -715,7 +808,7 @@ WHERE ROUND(`o`.`UnitPrice`, 0, 1) > 10.0"); AssertSql( $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` FROM `Order Details` AS `o` -WHERE (`o`.`OrderID` = 11077) AND (EXP(IIF(`o`.`Discount` IS NULL, NULL, CDBL(`o`.`Discount`))) > 1.0E0)"); +WHERE (`o`.`OrderID` = 11077) AND (EXP(CDBL(`o`.`Discount`)) > 1.0)"); } public override async Task Where_math_log10(bool isAsync) @@ -725,7 +818,7 @@ WHERE (`o`.`OrderID` = 11077) AND (EXP(IIF(`o`.`Discount` IS NULL, NULL, CDBL(`o AssertSql( $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` FROM `Order Details` AS `o` -WHERE ((`o`.`OrderID` = 11077) AND (`o`.`Discount` > IIF(0 IS NULL, NULL, CSNG(0)))) AND (LOG10(IIF(`o`.`Discount` IS NULL, NULL, CDBL(`o`.`Discount`))) < 0.0E0)"); +WHERE ((`o`.`OrderID` = 11077) AND (`o`.`Discount` > 0)) AND ((LOG(CDBL(`o`.`Discount`)) / 2.3025850929940459) < 0.0)"); } public override async Task Where_math_log(bool isAsync) @@ -735,7 +828,7 @@ WHERE ((`o`.`OrderID` = 11077) AND (`o`.`Discount` > IIF(0 IS NULL, NULL, CSNG(0 AssertSql( $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` FROM `Order Details` AS `o` -WHERE ((`o`.`OrderID` = 11077) AND (`o`.`Discount` > IIF(0 IS NULL, NULL, CSNG(0)))) AND (LOG(IIF(`o`.`Discount` IS NULL, NULL, CDBL(`o`.`Discount`))) < 0.0E0)"); +WHERE ((`o`.`OrderID` = 11077) AND (`o`.`Discount` > 0)) AND (LOG(CDBL(`o`.`Discount`)) < 0.0)"); } public override async Task Where_math_log_new_base(bool isAsync) @@ -745,7 +838,7 @@ WHERE ((`o`.`OrderID` = 11077) AND (`o`.`Discount` > IIF(0 IS NULL, NULL, CSNG(0 AssertSql( $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` FROM `Order Details` AS `o` -WHERE ((`o`.`OrderID` = 11077) AND (`o`.`Discount` > IIF(0 IS NULL, NULL, CSNG(0)))) AND (LOG(IIF(`o`.`Discount` IS NULL, NULL, CDBL(`o`.`Discount`)), 7.0E0) < 0.0E0)"); +WHERE ((`o`.`OrderID` = 11077) AND (`o`.`Discount` > 0)) AND ((LOG(CDBL(`o`.`Discount`)) / LOG(7.0)) < 0.0)"); } public override async Task Where_math_sqrt(bool isAsync) @@ -755,7 +848,7 @@ WHERE ((`o`.`OrderID` = 11077) AND (`o`.`Discount` > IIF(0 IS NULL, NULL, CSNG(0 AssertSql( $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` FROM `Order Details` AS `o` -WHERE (`o`.`OrderID` = 11077) AND (SQRT(IIF(`o`.`Discount` IS NULL, NULL, CDBL(`o`.`Discount`))) > 0.0E0)"); +WHERE (`o`.`OrderID` = 11077) AND (SQR(CDBL(`o`.`Discount`)) > 0.0)"); } public override async Task Where_math_acos(bool isAsync) @@ -763,9 +856,9 @@ WHERE (`o`.`OrderID` = 11077) AND (SQRT(IIF(`o`.`Discount` IS NULL, NULL, CDBL(` await base.Where_math_acos(isAsync); AssertSql( - $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` FROM `Order Details` AS `o` -WHERE (`o`.`OrderID` = 11077) AND (ACOS(IIF(`o`.`Discount` IS NULL, NULL, CDBL(`o`.`Discount`))) > 1.0E0)"); +WHERE (`o`.`OrderID` = 11077) AND ((1.5707963267948966 + ATN(-CDBL(`o`.`Discount`) / SQR(-(CDBL(`o`.`Discount`) * CDBL(`o`.`Discount`)) + 1.0))) > 1.0)"); } public override async Task Where_math_asin(bool isAsync) @@ -773,9 +866,9 @@ WHERE (`o`.`OrderID` = 11077) AND (ACOS(IIF(`o`.`Discount` IS NULL, NULL, CDBL(` await base.Where_math_asin(isAsync); AssertSql( - $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` FROM `Order Details` AS `o` -WHERE (`o`.`OrderID` = 11077) AND (ASIN(IIF(`o`.`Discount` IS NULL, NULL, CDBL(`o`.`Discount`))) > 0.0E0)"); +WHERE (`o`.`OrderID` = 11077) AND (ATN(CDBL(`o`.`Discount`) / SQR(-(CDBL(`o`.`Discount`) * CDBL(`o`.`Discount`)) + 1.0)) > 0.0)"); } public override async Task Where_math_atan(bool isAsync) @@ -785,7 +878,7 @@ WHERE (`o`.`OrderID` = 11077) AND (ASIN(IIF(`o`.`Discount` IS NULL, NULL, CDBL(` AssertSql( $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` FROM `Order Details` AS `o` -WHERE (`o`.`OrderID` = 11077) AND (ATAN(IIF(`o`.`Discount` IS NULL, NULL, CDBL(`o`.`Discount`))) > 0.0E0)"); +WHERE (`o`.`OrderID` = 11077) AND (ATN(CDBL(`o`.`Discount`)) > 0.0)"); } public override async Task Where_math_atan2(bool isAsync) @@ -805,7 +898,7 @@ WHERE (`o`.`OrderID` = 11077) AND (ATN2(IIF(`o`.`Discount` IS NULL, NULL, CDBL(` AssertSql( $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` FROM `Order Details` AS `o` -WHERE (`o`.`OrderID` = 11077) AND (COS(IIF(`o`.`Discount` IS NULL, NULL, CDBL(`o`.`Discount`))) > 0.0E0)"); +WHERE (`o`.`OrderID` = 11077) AND (COS(CDBL(`o`.`Discount`)) > 0.0)"); } public override async Task Where_math_sin(bool isAsync) @@ -815,7 +908,7 @@ WHERE (`o`.`OrderID` = 11077) AND (COS(IIF(`o`.`Discount` IS NULL, NULL, CDBL(`o AssertSql( $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` FROM `Order Details` AS `o` -WHERE (`o`.`OrderID` = 11077) AND (SIN(IIF(`o`.`Discount` IS NULL, NULL, CDBL(`o`.`Discount`))) > 0.0E0)"); +WHERE (`o`.`OrderID` = 11077) AND (SIN(CDBL(`o`.`Discount`)) > 0.0)"); } public override async Task Where_math_tan(bool isAsync) @@ -825,7 +918,7 @@ WHERE (`o`.`OrderID` = 11077) AND (SIN(IIF(`o`.`Discount` IS NULL, NULL, CDBL(`o AssertSql( $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` FROM `Order Details` AS `o` -WHERE (`o`.`OrderID` = 11077) AND (TAN(IIF(`o`.`Discount` IS NULL, NULL, CDBL(`o`.`Discount`))) > 0.0E0)"); +WHERE (`o`.`OrderID` = 11077) AND (TAN(CDBL(`o`.`Discount`)) > 0.0)"); } public override async Task Where_math_sign(bool isAsync) @@ -835,7 +928,7 @@ WHERE (`o`.`OrderID` = 11077) AND (TAN(IIF(`o`.`Discount` IS NULL, NULL, CDBL(`o AssertSql( $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` FROM `Order Details` AS `o` -WHERE (`o`.`OrderID` = 11077) AND (SIGN(`o`.`Discount`) > 0)"); +WHERE (`o`.`OrderID` = 11077) AND (SGN(`o`.`Discount`) > 0)"); } [ConditionalTheory(Skip = "Issue#17328")] @@ -844,6 +937,237 @@ WHERE (`o`.`OrderID` = 11077) AND (SIGN(`o`.`Discount`) > 0)"); [ConditionalTheory(Skip = "Issue#17328")] public override Task Where_math_max(bool isAsync) => base.Where_math_max(isAsync); + public override async Task Where_mathf_abs1(bool async) + { + await base.Where_mathf_abs1(async); + + AssertSql( + @"SELECT `p`.`ProductID`, `p`.`Discontinued`, `p`.`ProductName`, `p`.`SupplierID`, `p`.`UnitPrice`, `p`.`UnitsInStock` +FROM `Products` AS `p` +WHERE ABS(CSNG(`p`.`ProductID`)) > 10"); + } + + public override async Task Where_mathf_ceiling1(bool async) + { + await base.Where_mathf_ceiling1(async); + + AssertSql( + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` +FROM `Order Details` AS `o` +WHERE `o`.`UnitPrice` < 7.0 AND CEILING(`o`.`Discount`) > CAST(0 AS real)"); + } + + public override async Task Where_mathf_floor(bool async) + { + await base.Where_mathf_floor(async); + + AssertSql( + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` +FROM `Order Details` AS `o` +WHERE `o`.`Quantity` < CAST(5 AS smallint) AND FLOOR(CAST(`o`.`UnitPrice` AS real)) > CAST(10 AS real)"); + } + + public override async Task Where_mathf_power(bool async) + { + await base.Where_mathf_power(async); + + AssertSql( + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` +FROM `Order Details` AS `o` +WHERE `o`.`Discount`^3 > 0.005"); + } + + public override async Task Where_mathf_square(bool async) + { + await base.Where_mathf_square(async); + + AssertSql( + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` +FROM `Order Details` AS `o` +WHERE `o`.`Discount`^2 > 0.05"); + } + + public override async Task Where_mathf_round2(bool async) + { + await base.Where_mathf_round2(async); + + AssertSql( + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` +FROM `Order Details` AS `o` +WHERE CSNG(ROUND(CSNG(`o`.`UnitPrice`), 2)) > 100"); + } + + public override async Task Select_mathf_round(bool async) + { + await base.Select_mathf_round(async); + + AssertSql( + @"SELECT CSNG(ROUND(CSNG(`o`.`OrderID`), 0)) +FROM `Orders` AS `o` +WHERE `o`.`OrderID` < 10250"); + } + + public override async Task Select_mathf_round2(bool async) + { + await base.Select_mathf_round2(async); + + AssertSql( + @"SELECT CSNG(ROUND(CSNG(`o`.`UnitPrice`), 2)) +FROM `Order Details` AS `o` +WHERE `o`.`Quantity` < 5"); + } + + public override async Task Where_mathf_truncate(bool async) + { + await base.Where_mathf_truncate(async); + + AssertSql( + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` +FROM `Order Details` AS `o` +WHERE (`o`.`Quantity` < 5) AND (CSNG(INT(CSNG(`o`.`UnitPrice`))) > 10)"); + } + + public override async Task Select_mathf_truncate(bool async) + { + await base.Select_mathf_truncate(async); + + AssertSql( + @"SELECT CSNG(INT(CSNG(`o`.`UnitPrice`))) +FROM `Order Details` AS `o` +WHERE `o`.`Quantity` < 5"); + } + + public override async Task Where_mathf_exp(bool async) + { + await base.Where_mathf_exp(async); + + AssertSql( + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` +FROM `Order Details` AS `o` +WHERE (`o`.`OrderID` = 11077) AND (EXP(`o`.`Discount`) > 1)"); + } + + public override async Task Where_mathf_log10(bool async) + { + await base.Where_mathf_log10(async); + + AssertSql( + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` +FROM `Order Details` AS `o` +WHERE ((`o`.`OrderID` = 11077) AND (`o`.`Discount` > 0)) AND ((LOG(`o`.`Discount`) / 2.3025851) < 0)"); + } + + public override async Task Where_mathf_log(bool async) + { + await base.Where_mathf_log(async); + + AssertSql( + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` +FROM `Order Details` AS `o` +WHERE ((`o`.`OrderID` = 11077) AND (`o`.`Discount` > 0)) AND (LOG(`o`.`Discount`) < 0)"); + } + + public override async Task Where_mathf_log_new_base(bool async) + { + await base.Where_mathf_log_new_base(async); + + AssertSql( + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` +FROM `Order Details` AS `o` +WHERE ((`o`.`OrderID` = 11077) AND (`o`.`Discount` > 0)) AND ((LOG(`o`.`Discount`) / LOG(7)) < 0)"); + } + + public override async Task Where_mathf_sqrt(bool async) + { + await base.Where_mathf_sqrt(async); + + AssertSql( + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` +FROM `Order Details` AS `o` +WHERE (`o`.`OrderID` = 11077) AND (SQR(`o`.`Discount`) > 0)"); + } + + public override async Task Where_mathf_acos(bool async) + { + await base.Where_mathf_acos(async); + + AssertSql( + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` +FROM `Order Details` AS `o` +WHERE (`o`.`OrderID` = 11077) AND ((1.5707963267948966 + ATN(-`o`.`Discount` / SQR(-(`o`.`Discount` * `o`.`Discount`) + 1))) > 1.0)"); + + } + + public override async Task Where_mathf_asin(bool async) + { + await base.Where_mathf_asin(async); + + AssertSql( + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` +FROM `Order Details` AS `o` +WHERE (`o`.`OrderID` = 11077) AND (ATN(`o`.`Discount` / SQR(-(`o`.`Discount` * `o`.`Discount`) + 1)) > 0)"); + } + + public override async Task Where_mathf_atan(bool async) + { + await base.Where_mathf_atan(async); + + AssertSql( + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` +FROM `Order Details` AS `o` +WHERE (`o`.`OrderID` = 11077) AND (ATN(`o`.`Discount`) > 0)"); + } + + public override async Task Where_mathf_atan2(bool async) + { + await base.Where_mathf_atan2(async); + + AssertSql( + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` +FROM `Order Details` AS `o` +WHERE (`o`.`OrderID` = 11077) AND ATN2(`o`.`Discount`, CAST(1 AS real)) > CAST(0 AS real)"); + } + + public override async Task Where_mathf_cos(bool async) + { + await base.Where_mathf_cos(async); + + AssertSql( + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` +FROM `Order Details` AS `o` +WHERE (`o`.`OrderID` = 11077) AND (COS(`o`.`Discount`) > 0)"); + } + + public override async Task Where_mathf_sin(bool async) + { + await base.Where_mathf_sin(async); + + AssertSql( + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` +FROM `Order Details` AS `o` +WHERE (`o`.`OrderID` = 11077) AND (SIN(`o`.`Discount`) > 0)"); + } + + public override async Task Where_mathf_tan(bool async) + { + await base.Where_mathf_tan(async); + + AssertSql( + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` +FROM `Order Details` AS `o` +WHERE (`o`.`OrderID` = 11077) AND (TAN(`o`.`Discount`) > 0)"); + } + + public override async Task Where_mathf_sign(bool async) + { + await base.Where_mathf_sign(async); + + AssertSql( + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` +FROM `Order Details` AS `o` +WHERE (`o`.`OrderID` = 11077) AND (SGN(`o`.`Discount`) > 0)"); + } + public override async Task Where_guid_newguid(bool isAsync) { await base.Where_guid_newguid(isAsync); @@ -881,7 +1205,61 @@ WHERE LCASE(`c`.`CustomerID`) = 'alfki'"); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE POWER(IIF(CAST(LEN(`c`.`CustomerID`) AS int) IS NULL, NULL, CDBL(CAST(LEN(`c`.`CustomerID`) AS int))), 2.0E0) = 25.0E0"); +WHERE CDBL(CLNG(LEN(`c`.`CustomerID`)))^2.0 = 25.0"); + } + + public override async Task Convert_ToBoolean(bool async) + { + await base.Convert_ToBoolean(async); + + AssertSql( + """ +SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` +FROM `Orders` AS `o` +WHERE `o`.`CustomerID` = 'ALFKI' AND CONVERT(bit, CONVERT(bit, `o`.`OrderID` % 3)) = CAST(1 AS bit) +""", + // + """ +SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` +FROM `Orders` AS `o` +WHERE `o`.`CustomerID` = 'ALFKI' AND CONVERT(bit, CONVERT(tinyint, `o`.`OrderID` % 3)) = CAST(1 AS bit) +""", + // + """ +SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` +FROM `Orders` AS `o` +WHERE `o`.`CustomerID` = 'ALFKI' AND CONVERT(bit, CONVERT(decimal(18, 2), `o`.`OrderID` % 3)) = CAST(1 AS bit) +""", + // + """ +SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` +FROM `Orders` AS `o` +WHERE `o`.`CustomerID` = 'ALFKI' AND CONVERT(bit, CONVERT(float, `o`.`OrderID` % 3)) = CAST(1 AS bit) +""", + // + """ +SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` +FROM `Orders` AS `o` +WHERE `o`.`CustomerID` = 'ALFKI' AND CONVERT(bit, CAST(CONVERT(float, `o`.`OrderID` % 3) AS real)) = CAST(1 AS bit) +""", + // + """ +SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` +FROM `Orders` AS `o` +WHERE `o`.`CustomerID` = 'ALFKI' AND CONVERT(bit, CONVERT(smallint, `o`.`OrderID` % 3)) = CAST(1 AS bit) +""", + // + """ +SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` +FROM `Orders` AS `o` +WHERE `o`.`CustomerID` = 'ALFKI' AND CONVERT(bit, CONVERT(int, `o`.`OrderID` % 3)) = CAST(1 AS bit) +""", + // + """ +SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` +FROM `Orders` AS `o` +WHERE `o`.`CustomerID` = 'ALFKI' AND CONVERT(bit, CONVERT(bigint, `o`.`OrderID` % 3)) = CAST(1 AS bit) +"""); } public override async Task Convert_ToByte(bool isAsync) @@ -1254,10 +1632,17 @@ WHERE (`o`.`CustomerID` = 'ALFKI') AND ((CHARINDEX('1997', CONVERT(nvarchar(max) await base.Indexof_with_emptystring(isAsync); AssertSql( - $@"SELECT CASE - WHEN '' = '' THEN 0 - ELSE CHARINDEX('', `c`.`ContactName`) - 1 -END + $@"SELECT IIF(`c`.`ContactName` = '', 0, InStr(`c`.`ContactName`, '') - 1) +FROM `Customers` AS `c` +WHERE `c`.`CustomerID` = 'ALFKI'"); + } + + public override async Task Indexof_with_starting_position(bool async) + { + await base.Indexof_with_starting_position(async); + + AssertSql( + @"SELECT `c`.`ContactName` FROM `Customers` AS `c` WHERE `c`.`CustomerID` = 'ALFKI'"); } @@ -1289,7 +1674,7 @@ WHERE `c`.`CustomerID` = 'ALFKI'"); AssertSql( @"SELECT `c`.`ContactName` FROM `Customers` AS `c` -WHERE SUBSTRING(`c`.`CustomerID`, 0 + 1, LEN(`c`.`CustomerID`)) = 'ALFKI'"); +WHERE MID(`c`.`CustomerID`, 0 + 1, LEN(`c`.`CustomerID`)) = 'ALFKI'"); } public override async Task Substring_with_one_arg_with_constant(bool async) @@ -1299,7 +1684,7 @@ WHERE SUBSTRING(`c`.`CustomerID`, 0 + 1, LEN(`c`.`CustomerID`)) = 'ALFKI'"); AssertSql( @"SELECT `c`.`ContactName` FROM `Customers` AS `c` -WHERE SUBSTRING(`c`.`CustomerID`, 1 + 1, LEN(`c`.`CustomerID`)) = 'LFKI'"); +WHERE MID(`c`.`CustomerID`, 1 + 1, LEN(`c`.`CustomerID`)) = 'LFKI'"); } public override async Task Substring_with_one_arg_with_closure(bool async) @@ -1308,9 +1693,10 @@ WHERE SUBSTRING(`c`.`CustomerID`, 1 + 1, LEN(`c`.`CustomerID`)) = 'LFKI'"); AssertSql( @"@__start_0='2' + SELECT `c`.`ContactName` FROM `Customers` AS `c` -WHERE SUBSTRING(`c`.`CustomerID`, @__start_0 + 1, LEN(`c`.`CustomerID`)) = 'FKI'"); +WHERE MID(`c`.`CustomerID`, ? + 1, LEN(`c`.`CustomerID`)) = 'FKI'"); } public override async Task Substring_with_two_args_with_zero_startindex(bool async) @@ -1318,7 +1704,7 @@ WHERE SUBSTRING(`c`.`CustomerID`, @__start_0 + 1, LEN(`c`.`CustomerID`)) = 'FKI' await base.Substring_with_two_args_with_zero_startindex(async); AssertSql( - @"SELECT SUBSTRING(`c`.`ContactName`, 0 + 1, 3) + @"SELECT MID(`c`.`ContactName`, 0 + 1, 3) FROM `Customers` AS `c` WHERE `c`.`CustomerID` = 'ALFKI'"); } @@ -1328,7 +1714,7 @@ WHERE `c`.`CustomerID` = 'ALFKI'"); await base.Substring_with_two_args_with_zero_length(async); AssertSql( - @"SELECT SUBSTRING(`c`.`ContactName`, 2 + 1, 0) + @"SELECT MID(`c`.`ContactName`, 2 + 1, 0) FROM `Customers` AS `c` WHERE `c`.`CustomerID` = 'ALFKI'"); } @@ -1338,7 +1724,7 @@ WHERE `c`.`CustomerID` = 'ALFKI'"); await base.Substring_with_two_args_with_constant(async); AssertSql( - @"SELECT SUBSTRING(`c`.`ContactName`, 1 + 1, 3) + @"SELECT MID(`c`.`ContactName`, 1 + 1, 3) FROM `Customers` AS `c` WHERE `c`.`CustomerID` = 'ALFKI'"); } @@ -1350,7 +1736,7 @@ WHERE `c`.`CustomerID` = 'ALFKI'"); AssertSql( @"@__start_0='2' -SELECT SUBSTRING(`c`.`ContactName`, @__start_0 + 1, 3) +SELECT MID(`c`.`ContactName`, ? + 1, 3) FROM `Customers` AS `c` WHERE `c`.`CustomerID` = 'ALFKI'"); } @@ -1375,7 +1761,7 @@ WHERE `c`.`CustomerID` = 'ALFKI'"); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE (`c`.`Region` IS NULL) OR (`c`.`Region` = '')"); +WHERE (`c`.`Region` IS NULL) OR (`c`.`Region` LIKE '')"); } public override async Task IsNullOrEmpty_in_projection(bool async) @@ -1383,10 +1769,7 @@ WHERE (`c`.`Region` IS NULL) OR (`c`.`Region` = '')"); await base.IsNullOrEmpty_in_projection(async); AssertSql( - @"SELECT `c`.`CustomerID` AS `Id`, CASE - WHEN (`c`.`Region` IS NULL) OR (`c`.`Region` LIKE '') THEN CAST(1 AS bit) - ELSE CAST(0 AS bit) -END AS `Value` + @"SELECT `c`.`CustomerID` AS `Id`, IIF((`c`.`Region` IS NULL) OR (`c`.`Region` LIKE ''), TRUE, FALSE) AS `Value` FROM `Customers` AS `c`"); } @@ -1397,7 +1780,7 @@ FROM `Customers` AS `c`"); AssertSql( @"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE (`c`.`Region` IS NOT NULL) AND NOT (`c`.`Region` LIKE N'')"); +WHERE (`c`.`Region` IS NOT NULL) AND NOT (`c`.`Region` LIKE '')"); } public override async Task IsNullOrEmpty_negated_in_projection(bool async) @@ -1405,10 +1788,7 @@ WHERE (`c`.`Region` IS NOT NULL) AND NOT (`c`.`Region` LIKE N'')"); await base.IsNullOrEmpty_negated_in_projection(async); AssertSql( - @"SELECT `c`.`CustomerID` AS `Id`, CASE - WHEN (`c`.`Region` IS NOT NULL) AND NOT (`c`.`Region` LIKE N'') THEN CAST(1 AS bit) - ELSE CAST(0 AS bit) -END AS `Value` + @"SELECT `c`.`CustomerID` AS `Id`, IIF((`c`.`Region` IS NOT NULL) AND NOT (`c`.`Region` LIKE ''), TRUE, FALSE) AS `Value` FROM `Customers` AS `c`"); } @@ -1419,7 +1799,7 @@ FROM `Customers` AS `c`"); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE `c`.`Region` IS NULL OR (LTRIM(RTRIM(`c`.`Region`)) = '')"); +WHERE (`c`.`Region` IS NULL) OR (`c`.`Region` = '')"); } public override async Task IsNullOrWhiteSpace_in_predicate_on_non_nullable_column(bool isAsync) @@ -1429,7 +1809,7 @@ WHERE `c`.`Region` IS NULL OR (LTRIM(RTRIM(`c`.`Region`)) = '')"); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE LTRIM(RTRIM(`c`.`CustomerID`)) = ''"); +WHERE `c`.`CustomerID` = ''"); } public override async Task TrimStart_without_arguments_in_predicate(bool isAsync) @@ -1493,7 +1873,7 @@ WHERE TRIM(`c`.`ContactTitle`) = 'Owner'"); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -ORDER BY CAST(LEN(`c`.`CustomerID`) AS int), `c`.`CustomerID`"); +ORDER BY CLNG(LEN(`c`.`CustomerID`)), `c`.`CustomerID`"); } public override async Task Order_by_length_twice_followed_by_projection_of_naked_collection_navigation(bool isAsync) @@ -1504,7 +1884,7 @@ ORDER BY CAST(LEN(`c`.`CustomerID`) AS int), `c`.`CustomerID`"); $@"SELECT `c`.`CustomerID`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Customers` AS `c` LEFT JOIN `Orders` AS `o` ON `c`.`CustomerID` = `o`.`CustomerID` -ORDER BY CAST(LEN(`c`.`CustomerID`) AS int), `c`.`CustomerID`, `o`.`OrderID`"); +ORDER BY CLNG(LEN(`c`.`CustomerID`)), `c`.`CustomerID`"); } public override async Task Static_string_equals_in_predicate(bool isAsync) @@ -1575,6 +1955,21 @@ WHERE 0 = 1"); //ORDER BY `A` DESC"); } + public override Task Regex_IsMatch_MethodCall(bool async) + { + return AssertTranslationFailed(() => base.Regex_IsMatch_MethodCall(async)); + } + + public override Task Regex_IsMatch_MethodCall_constant_input(bool async) + { + return AssertTranslationFailed(() => base.Regex_IsMatch_MethodCall_constant_input(async)); + } + + public override Task Datetime_subtraction_TotalDays(bool async) + { + return AssertTranslationFailed(() => base.Datetime_subtraction_TotalDays(async)); + } + private void AssertSql(params string[] expected) => Fixture.TestSqlLoggerFactory.AssertBaseline(expected); diff --git a/test/EFCore.Jet.FunctionalTests/Query/NorthwindGroupByQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/NorthwindGroupByQueryJetTest.cs index 3bc9fd9..8b6d325 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/NorthwindGroupByQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/NorthwindGroupByQueryJetTest.cs @@ -26,7 +26,7 @@ namespace EntityFrameworkCore.Jet.FunctionalTests.Query await base.GroupBy_Property_Select_Average(isAsync); AssertSql( - $@"SELECT AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) + $@"SELECT AVG(CDBL(`o`.`OrderID`)) FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); @@ -51,7 +51,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_Property_Select_LongCount(isAsync); AssertSql( - $@"SELECT COUNT_BIG(*) + $@"SELECT COUNT(*) FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -81,7 +81,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_Property_Select_Sum(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) + $@"SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -91,7 +91,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_Property_Select_Sum_Min_Max_Avg(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, MAX(`o`.`OrderID`) AS `Max`, AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) AS `Avg` + $@"SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, MAX(`o`.`OrderID`) AS `Max`, AVG(CDBL(`o`.`OrderID`)) AS `Avg` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -101,7 +101,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_Property_Select_Key_Average(isAsync); AssertSql( - $@"SELECT `o`.`CustomerID` AS `Key`, AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) AS `Average` + $@"SELECT `o`.`CustomerID` AS `Key`, AVG(CDBL(`o`.`OrderID`)) AS `Average` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -121,7 +121,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_Property_Select_Key_LongCount(isAsync); AssertSql( - $@"SELECT `o`.`CustomerID` AS `Key`, COUNT_BIG(*) AS `LongCount` + $@"SELECT `o`.`CustomerID` AS `Key`, COUNT(*) AS `LongCount` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -151,7 +151,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_Property_Select_Key_Sum(isAsync); AssertSql( - $@"SELECT `o`.`CustomerID` AS `Key`, SUM(`o`.`OrderID`) AS `Sum` + $@"SELECT `o`.`CustomerID` AS `Key`, IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `Sum` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -161,7 +161,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_Property_Select_Key_Sum_Min_Max_Avg(isAsync); AssertSql( - $@"SELECT `o`.`CustomerID` AS `Key`, SUM(`o`.`OrderID`) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, MAX(`o`.`OrderID`) AS `Max`, AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) AS `Avg` + $@"SELECT `o`.`CustomerID` AS `Key`, IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, MAX(`o`.`OrderID`) AS `Max`, AVG(CDBL(`o`.`OrderID`)) AS `Avg` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -171,7 +171,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_Property_Select_Sum_Min_Key_Max_Avg(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, `o`.`CustomerID` AS `Key`, MAX(`o`.`OrderID`) AS `Max`, AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) AS `Avg` + $@"SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, `o`.`CustomerID` AS `Key`, MAX(`o`.`OrderID`) AS `Max`, AVG(CDBL(`o`.`OrderID`)) AS `Avg` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -181,7 +181,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_Property_Select_key_multiple_times_and_aggregate(isAsync); AssertSql( - $@"SELECT `o`.`CustomerID` AS `Key1`, SUM(`o`.`OrderID`) AS `Sum` + $@"SELECT `o`.`CustomerID` AS `Key1`, IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `Sum` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -191,9 +191,12 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_Property_Select_Key_with_constant(isAsync); AssertSql( - $@"SELECT 'CustomerID' AS `Name`, `o`.`CustomerID` AS `Value`, COUNT(*) AS `Count` -FROM `Orders` AS `o` -GROUP BY `o`.`CustomerID`"); + @"SELECT `t`.`Name`, `t`.`CustomerID` AS `Value`, COUNT(*) AS `Count` +FROM ( + SELECT `o`.`CustomerID`, 'CustomerID' AS `Name` + FROM `Orders` AS `o` +) AS `t` +GROUP BY `t`.`Name`, `t`.`CustomerID`"); } public override async Task GroupBy_aggregate_projecting_conditional_expression(bool isAsync) @@ -217,10 +220,7 @@ GROUP BY `o`.`OrderDate`"); await base.GroupBy_aggregate_projecting_conditional_expression_based_on_group_key(isAsync); AssertSql( - $@"SELECT CASE - WHEN `o`.`OrderDate` IS NULL THEN 'is null' - ELSE 'is not null' -END AS `Key`, SUM(`o`.`OrderID`) AS `Sum` + $@"SELECT IIF(`o`.`OrderDate` IS NULL, 'is null', 'is not null') AS `Key`, IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `Sum` FROM `Orders` AS `o` GROUP BY `o`.`OrderDate`"); } @@ -230,7 +230,7 @@ GROUP BY `o`.`OrderDate`"); await base.GroupBy_anonymous_Select_Average(isAsync); AssertSql( - $@"SELECT AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) + $@"SELECT AVG(CDBL(`o`.`OrderID`)) FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -250,7 +250,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_anonymous_Select_LongCount(isAsync); AssertSql( - $@"SELECT COUNT_BIG(*) + $@"SELECT COUNT(*) FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -280,7 +280,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_anonymous_Select_Sum(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) + $@"SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -290,7 +290,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_anonymous_Select_Sum_Min_Max_Avg(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, MAX(`o`.`OrderID`) AS `Max`, AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) AS `Avg` + $@"SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, MAX(`o`.`OrderID`) AS `Max`, AVG(CDBL(`o`.`OrderID`)) AS `Avg` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -300,7 +300,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_anonymous_with_alias_Select_Key_Sum(isAsync); AssertSql( - $@"SELECT `o`.`CustomerID` AS `Key`, SUM(`o`.`OrderID`) AS `Sum` + $@"SELECT `o`.`CustomerID` AS `Key`, IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `Sum` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -310,7 +310,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_Composite_Select_Average(isAsync); AssertSql( - $@"SELECT AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) + $@"SELECT AVG(CDBL(`o`.`OrderID`)) FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`, `o`.`EmployeeID`"); } @@ -330,7 +330,7 @@ GROUP BY `o`.`CustomerID`, `o`.`EmployeeID`"); await base.GroupBy_Composite_Select_LongCount(isAsync); AssertSql( - $@"SELECT COUNT_BIG(*) + $@"SELECT COUNT(*) FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`, `o`.`EmployeeID`"); } @@ -360,7 +360,7 @@ GROUP BY `o`.`CustomerID`, `o`.`EmployeeID`"); await base.GroupBy_Composite_Select_Sum(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) + $@"SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`, `o`.`EmployeeID`"); } @@ -370,7 +370,7 @@ GROUP BY `o`.`CustomerID`, `o`.`EmployeeID`"); await base.GroupBy_Composite_Select_Sum_Min_Max_Avg(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, MAX(`o`.`OrderID`) AS `Max`, AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) AS `Avg` + $@"SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, MAX(`o`.`OrderID`) AS `Max`, AVG(CDBL(`o`.`OrderID`)) AS `Avg` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`, `o`.`EmployeeID`"); } @@ -380,7 +380,7 @@ GROUP BY `o`.`CustomerID`, `o`.`EmployeeID`"); await base.GroupBy_Composite_Select_Key_Average(isAsync); AssertSql( - $@"SELECT `o`.`CustomerID`, `o`.`EmployeeID`, AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) AS `Average` + $@"SELECT `o`.`CustomerID`, `o`.`EmployeeID`, AVG(CDBL(`o`.`OrderID`)) AS `Average` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`, `o`.`EmployeeID`"); } @@ -400,7 +400,7 @@ GROUP BY `o`.`CustomerID`, `o`.`EmployeeID`"); await base.GroupBy_Composite_Select_Key_LongCount(isAsync); AssertSql( - $@"SELECT `o`.`CustomerID`, `o`.`EmployeeID`, COUNT_BIG(*) AS `LongCount` + $@"SELECT `o`.`CustomerID`, `o`.`EmployeeID`, COUNT(*) AS `LongCount` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`, `o`.`EmployeeID`"); } @@ -430,7 +430,7 @@ GROUP BY `o`.`CustomerID`, `o`.`EmployeeID`"); await base.GroupBy_Composite_Select_Key_Sum(isAsync); AssertSql( - $@"SELECT `o`.`CustomerID`, `o`.`EmployeeID`, SUM(`o`.`OrderID`) AS `Sum` + $@"SELECT `o`.`CustomerID`, `o`.`EmployeeID`, IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `Sum` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`, `o`.`EmployeeID`"); } @@ -440,7 +440,7 @@ GROUP BY `o`.`CustomerID`, `o`.`EmployeeID`"); await base.GroupBy_Composite_Select_Key_Sum_Min_Max_Avg(isAsync); AssertSql( - $@"SELECT `o`.`CustomerID`, `o`.`EmployeeID`, SUM(`o`.`OrderID`) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, MAX(`o`.`OrderID`) AS `Max`, AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) AS `Avg` + $@"SELECT `o`.`CustomerID`, `o`.`EmployeeID`, IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, MAX(`o`.`OrderID`) AS `Max`, AVG(CDBL(`o`.`OrderID`)) AS `Avg` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`, `o`.`EmployeeID`"); } @@ -450,7 +450,7 @@ GROUP BY `o`.`CustomerID`, `o`.`EmployeeID`"); await base.GroupBy_Composite_Select_Sum_Min_Key_Max_Avg(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, `o`.`CustomerID`, `o`.`EmployeeID`, MAX(`o`.`OrderID`) AS `Max`, AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) AS `Avg` + $@"SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, `o`.`CustomerID`, `o`.`EmployeeID`, MAX(`o`.`OrderID`) AS `Max`, AVG(CDBL(`o`.`OrderID`)) AS `Avg` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`, `o`.`EmployeeID`"); } @@ -460,7 +460,7 @@ GROUP BY `o`.`CustomerID`, `o`.`EmployeeID`"); await base.GroupBy_Composite_Select_Sum_Min_Key_flattened_Max_Avg(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, `o`.`CustomerID`, `o`.`EmployeeID`, MAX(`o`.`OrderID`) AS `Max`, AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) AS `Avg` + $@"SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, `o`.`CustomerID`, `o`.`EmployeeID`, MAX(`o`.`OrderID`) AS `Max`, AVG(CDBL(`o`.`OrderID`)) AS `Avg` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`, `o`.`EmployeeID`"); } @@ -470,7 +470,7 @@ GROUP BY `o`.`CustomerID`, `o`.`EmployeeID`"); await base.GroupBy_Dto_as_key_Select_Sum(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) AS `Sum`, `o`.`CustomerID`, `o`.`EmployeeID` + $@"SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `Sum`, `o`.`CustomerID`, `o`.`EmployeeID` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`, `o`.`EmployeeID`"); } @@ -480,7 +480,7 @@ GROUP BY `o`.`CustomerID`, `o`.`EmployeeID`"); await base.GroupBy_Dto_as_element_selector_Select_Sum(isAsync); AssertSql( - $@"SELECT SUM(CAST(`o`.`EmployeeID` AS bigint)) AS `Sum`, `o`.`CustomerID` AS `Key` + $@"SELECT IIF(SUM(CLNG(`o`.`EmployeeID`)) IS NULL, 0, SUM(CLNG(`o`.`EmployeeID`))) AS `Sum`, `o`.`CustomerID` AS `Key` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -490,7 +490,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_Composite_Select_Dto_Sum_Min_Key_flattened_Max_Avg(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, `o`.`CustomerID` AS `CustomerId`, `o`.`EmployeeID` AS `EmployeeId`, MAX(`o`.`OrderID`) AS `Max`, AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) AS `Avg` + $@"SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, `o`.`CustomerID` AS `CustomerId`, `o`.`EmployeeID` AS `EmployeeId`, MAX(`o`.`OrderID`) AS `Max`, AVG(CDBL(`o`.`OrderID`)) AS `Avg` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`, `o`.`EmployeeID`"); } @@ -500,7 +500,7 @@ GROUP BY `o`.`CustomerID`, `o`.`EmployeeID`"); await base.GroupBy_Composite_Select_Sum_Min_part_Key_flattened_Max_Avg(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, `o`.`CustomerID`, MAX(`o`.`OrderID`) AS `Max`, AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) AS `Avg` + $@"SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, `o`.`CustomerID`, MAX(`o`.`OrderID`) AS `Max`, AVG(CDBL(`o`.`OrderID`)) AS `Avg` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`, `o`.`EmployeeID`"); } @@ -510,8 +510,12 @@ GROUP BY `o`.`CustomerID`, `o`.`EmployeeID`"); await base.GroupBy_Constant_Select_Sum_Min_Key_Max_Avg(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, 2 AS `Key`, MAX(`o`.`OrderID`) AS `Max`, AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) AS `Avg` -FROM `Orders` AS `o`"); + $@"SELECT IIF(SUM(`t`.`OrderID`) IS NULL, 0, SUM(`t`.`OrderID`)) AS `Sum`, MIN(`t`.`OrderID`) AS `Min`, `t`.`Key`, MAX(`t`.`OrderID`) AS `Max`, AVG(CDBL(`t`.`OrderID`)) AS `Avg` +FROM ( + SELECT `o`.`OrderID`, 2 AS `Key` + FROM `Orders` AS `o` +) AS `t` +GROUP BY `t`.`Key`"); } public override async Task GroupBy_Constant_with_element_selector_Select_Sum(bool isAsync) @@ -519,8 +523,12 @@ FROM `Orders` AS `o`"); await base.GroupBy_Constant_with_element_selector_Select_Sum(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) AS `Sum` -FROM `Orders` AS `o`"); + $@"SELECT IIF(SUM(`t`.`OrderID`) IS NULL, 0, SUM(`t`.`OrderID`)) AS `Sum` +FROM ( + SELECT `o`.`OrderID`, 2 AS `Key` + FROM `Orders` AS `o` +) AS `t` +GROUP BY `t`.`Key`"); } public override async Task GroupBy_Constant_with_element_selector_Select_Sum2(bool isAsync) @@ -528,8 +536,12 @@ FROM `Orders` AS `o`"); await base.GroupBy_Constant_with_element_selector_Select_Sum2(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) AS `Sum` -FROM `Orders` AS `o`"); + $@"SELECT IIF(SUM(`t`.`OrderID`) IS NULL, 0, SUM(`t`.`OrderID`)) AS `Sum` +FROM ( + SELECT `o`.`OrderID`, 2 AS `Key` + FROM `Orders` AS `o` +) AS `t` +GROUP BY `t`.`Key`"); } public override async Task GroupBy_Constant_with_element_selector_Select_Sum3(bool isAsync) @@ -537,8 +549,12 @@ FROM `Orders` AS `o`"); await base.GroupBy_Constant_with_element_selector_Select_Sum3(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) AS `Sum` -FROM `Orders` AS `o`"); + $@"SELECT IIF(SUM(`t`.`OrderID`) IS NULL, 0, SUM(`t`.`OrderID`)) AS `Sum` +FROM ( + SELECT `o`.`OrderID`, 2 AS `Key` + FROM `Orders` AS `o` +) AS `t` +GROUP BY `t`.`Key`"); } public override async Task GroupBy_after_predicate_Constant_Select_Sum_Min_Key_Max_Avg(bool isAsync) @@ -546,9 +562,13 @@ FROM `Orders` AS `o`"); await base.GroupBy_after_predicate_Constant_Select_Sum_Min_Key_Max_Avg(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, 2 AS `Random`, MAX(`o`.`OrderID`) AS `Max`, AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) AS `Avg` -FROM `Orders` AS `o` -WHERE `o`.`OrderID` > 10500"); + $@"SELECT IIF(SUM(`t`.`OrderID`) IS NULL, 0, SUM(`t`.`OrderID`)) AS `Sum`, MIN(`t`.`OrderID`) AS `Min`, `t`.`Key` AS `Random`, MAX(`t`.`OrderID`) AS `Max`, AVG(CDBL(`t`.`OrderID`)) AS `Avg` +FROM ( + SELECT `o`.`OrderID`, 2 AS `Key` + FROM `Orders` AS `o` + WHERE `o`.`OrderID` > 10500 +) AS `t` +GROUP BY `t`.`Key`"); } public override async Task GroupBy_Constant_with_element_selector_Select_Sum_Min_Key_Max_Avg(bool isAsync) @@ -556,8 +576,12 @@ WHERE `o`.`OrderID` > 10500"); await base.GroupBy_Constant_with_element_selector_Select_Sum_Min_Key_Max_Avg(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) AS `Sum`, 2 AS `Key` -FROM `Orders` AS `o`"); + @"SELECT IIF(SUM(`t`.`OrderID`) IS NULL, 0, SUM(`t`.`OrderID`)) AS `Sum`, `t`.`Key` +FROM ( + SELECT `o`.`OrderID`, 2 AS `Key` + FROM `Orders` AS `o` +) AS `t` +GROUP BY `t`.`Key`"); } public override async Task GroupBy_param_Select_Sum_Min_Key_Max_Avg(bool isAsync) @@ -567,7 +591,7 @@ FROM `Orders` AS `o`"); AssertSql( $@"{AssertSqlHelper.Declaration("@__a_0='2'")} -SELECT SUM(`o`.`OrderID`) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, {AssertSqlHelper.Parameter("@__a_0")} AS `Key`, MAX(`o`.`OrderID`) AS `Max`, AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) AS `Avg` +SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, {AssertSqlHelper.Parameter("@__a_0")} AS `Key`, MAX(`o`.`OrderID`) AS `Max`, AVG(IIF(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) AS `Avg` FROM `Orders` AS `o`"); } @@ -576,8 +600,14 @@ FROM `Orders` AS `o`"); await base.GroupBy_param_with_element_selector_Select_Sum(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) AS `Sum` -FROM `Orders` AS `o`"); + @"@__a_0='2' + +SELECT IIF(SUM(`t`.`OrderID`) IS NULL, 0, SUM(`t`.`OrderID`)) AS `Sum` +FROM ( + SELECT `o`.`OrderID`, ? AS `Key` + FROM `Orders` AS `o` +) AS `t` +GROUP BY `t`.`Key`"); } public override async Task GroupBy_param_with_element_selector_Select_Sum2(bool isAsync) @@ -585,8 +615,14 @@ FROM `Orders` AS `o`"); await base.GroupBy_param_with_element_selector_Select_Sum2(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) AS `Sum` -FROM `Orders` AS `o`"); + @"@__a_0='2' + +SELECT IIF(SUM(`t`.`OrderID`) IS NULL, 0, SUM(`t`.`OrderID`)) AS `Sum` +FROM ( + SELECT `o`.`OrderID`, ? AS `Key` + FROM `Orders` AS `o` +) AS `t` +GROUP BY `t`.`Key`"); } public override async Task GroupBy_param_with_element_selector_Select_Sum3(bool isAsync) @@ -594,8 +630,14 @@ FROM `Orders` AS `o`"); await base.GroupBy_param_with_element_selector_Select_Sum3(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) AS `Sum` -FROM `Orders` AS `o`"); + @"@__a_0='2' + +SELECT IIF(SUM(`t`.`OrderID`) IS NULL, 0, SUM(`t`.`OrderID`)) AS `Sum` +FROM ( + SELECT `o`.`OrderID`, ? AS `Key` + FROM `Orders` AS `o` +) AS `t` +GROUP BY `t`.`Key`"); } public override async Task GroupBy_param_with_element_selector_Select_Sum_Min_Key_Max_Avg(bool isAsync) @@ -605,7 +647,7 @@ FROM `Orders` AS `o`"); AssertSql( $@"{AssertSqlHelper.Declaration("@__a_0='2'")} -SELECT SUM(`o`.`OrderID`) AS `Sum`, {AssertSqlHelper.Parameter("@__a_0")} AS `Key` +SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `Sum`, {AssertSqlHelper.Parameter("@__a_0")} AS `Key` FROM `Orders` AS `o`"); } @@ -625,7 +667,7 @@ ORDER BY DATEPART('yyyy', `o`.`OrderDate`)"); await base.GroupBy_Property_scalar_element_selector_Average(isAsync); AssertSql( - $@"SELECT AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) + $@"SELECT AVG(CDBL(`o`.`OrderID`)) FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -645,7 +687,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_Property_scalar_element_selector_LongCount(isAsync); AssertSql( - $@"SELECT COUNT_BIG(*) + $@"SELECT COUNT(*) FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -675,7 +717,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_Property_scalar_element_selector_Sum(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) + $@"SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -685,7 +727,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_Property_scalar_element_selector_Sum_Min_Max_Avg(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, MAX(`o`.`OrderID`) AS `Max`, AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) AS `Avg` + $@"SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, MAX(`o`.`OrderID`) AS `Max`, AVG(CDBL(`o`.`OrderID`)) AS `Avg` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -695,7 +737,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_Property_anonymous_element_selector_Average(isAsync); AssertSql( - $@"SELECT AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) + $@"SELECT AVG(CDBL(`o`.`OrderID`)) FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -715,7 +757,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_Property_anonymous_element_selector_LongCount(isAsync); AssertSql( - $@"SELECT COUNT_BIG(*) + $@"SELECT COUNT(*) FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -745,7 +787,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_Property_anonymous_element_selector_Sum(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) + $@"SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -755,7 +797,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_Property_anonymous_element_selector_Sum_Min_Max_Avg(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) AS `Sum`, MIN(`o`.`EmployeeID`) AS `Min`, MAX(`o`.`EmployeeID`) AS `Max`, AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) AS `Avg` + $@"SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `Sum`, MIN(`o`.`EmployeeID`) AS `Min`, MAX(`o`.`EmployeeID`) AS `Max`, AVG(CDBL(`o`.`OrderID`)) AS `Avg` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -765,7 +807,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_element_selector_complex_aggregate(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID` + 1) + $@"SELECT IIF(SUM(`o`.`OrderID` + 1) IS NULL, 0, SUM(`o`.`OrderID` + 1)) FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -775,7 +817,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_element_selector_complex_aggregate2(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID` + 1) + $@"SELECT IIF(SUM(`o`.`OrderID` + 1) IS NULL, 0, SUM(`o`.`OrderID` + 1)) FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -785,7 +827,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_element_selector_complex_aggregate3(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID` + 1) + $@"SELECT IIF(SUM(`o`.`OrderID` + 1) IS NULL, 0, SUM(`o`.`OrderID` + 1)) FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -795,7 +837,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_element_selector_complex_aggregate4(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID` + 1) + $@"SELECT IIF(SUM(`o`.`OrderID` + 1) IS NULL, 0, SUM(`o`.`OrderID` + 1)) FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -805,8 +847,12 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_empty_key_Aggregate(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) -FROM `Orders` AS `o`"); + @"SELECT IIF(SUM(`t`.`OrderID`) IS NULL, 0, SUM(`t`.`OrderID`)) +FROM ( + SELECT `o`.`OrderID`, 1 AS `Key` + FROM `Orders` AS `o` +) AS `t` +GROUP BY `t`.`Key`"); } public override async Task GroupBy_empty_key_Aggregate_Key(bool isAsync) @@ -814,8 +860,12 @@ FROM `Orders` AS `o`"); await base.GroupBy_empty_key_Aggregate_Key(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) AS `Sum` -FROM `Orders` AS `o`"); + @"SELECT IIF(SUM(`t`.`OrderID`) IS NULL, 0, SUM(`t`.`OrderID`)) AS `Sum` +FROM ( + SELECT `o`.`OrderID`, 1 AS `Key` + FROM `Orders` AS `o` +) AS `t` +GROUP BY `t`.`Key`"); } public override async Task OrderBy_GroupBy_Aggregate(bool isAsync) @@ -823,7 +873,7 @@ FROM `Orders` AS `o`"); await base.OrderBy_GroupBy_Aggregate(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) + $@"SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -833,14 +883,12 @@ GROUP BY `o`.`CustomerID`"); await base.OrderBy_Skip_GroupBy_Aggregate(isAsync); AssertSql( - $@"{AssertSqlHelper.Declaration("@__p_0='80'")} - -SELECT AVG(IIf(`t`.`OrderID` IS NULL, NULL, CDBL(`t`.`OrderID`))) + $@"SELECT AVG(IIF(`t`.`OrderID` IS NULL, NULL, CDBL(`t`.`OrderID`))) FROM ( SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Orders` AS `o` ORDER BY `o`.`OrderID` - SKIP {AssertSqlHelper.Parameter("@__p_0")} + SKIP 80 ) AS `t` GROUP BY `t`.`CustomerID`"); } @@ -850,11 +898,9 @@ GROUP BY `t`.`CustomerID`"); await base.OrderBy_Take_GroupBy_Aggregate(isAsync); AssertSql( - $@"{AssertSqlHelper.Declaration("@__p_0='500'")} - -SELECT MIN(`t`.`OrderID`) + @"SELECT MIN(`t`.`OrderID`) FROM ( - SELECT TOP {AssertSqlHelper.Parameter("@__p_0")} `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` + SELECT TOP 500 `o`.`OrderID`, `o`.`CustomerID` FROM `Orders` AS `o` ORDER BY `o`.`OrderID` ) AS `t` @@ -866,16 +912,12 @@ GROUP BY `t`.`CustomerID`"); await base.OrderBy_Skip_Take_GroupBy_Aggregate(isAsync); AssertSql( - $@"{AssertSqlHelper.Declaration("@__p_0='80'")} - -{AssertSqlHelper.Declaration("@__p_1='500'")} - -SELECT MAX(`t`.`OrderID`) + $@"SELECT MAX(`t`.`OrderID`) FROM ( SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Orders` AS `o` ORDER BY `o`.`OrderID` - SKIP {AssertSqlHelper.Parameter("@__p_0")} FETCH NEXT {AssertSqlHelper.Parameter("@__p_1")} ROWS ONLY + SKIP 80 FETCH NEXT 50 ROWS ONLY ) AS `t` GROUP BY `t`.`CustomerID`"); } @@ -922,7 +964,7 @@ GROUP BY `o`.`EmployeeID`"); await base.Join_GroupBy_Aggregate(isAsync); AssertSql( - $@"SELECT `c`.`CustomerID` AS `Key`, AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) AS `Count` + $@"SELECT `c`.`CustomerID` AS `Key`, AVG(CDBL(`o`.`OrderID`)) AS `Count` FROM `Orders` AS `o` INNER JOIN `Customers` AS `c` ON `o`.`CustomerID` = `c`.`CustomerID` GROUP BY `c`.`CustomerID`"); @@ -950,7 +992,7 @@ GROUP BY `o0`.`CustomerID`"); {AssertSqlHelper.Declaration("@__p_2='50'")} -SELECT `t0`.`CustomerID` AS `Key`, AVG(IIf(`t`.`OrderID` IS NULL, NULL, CDBL(`t`.`OrderID`))) AS `Count` +SELECT `t0`.`CustomerID` AS `Key`, AVG(CDBL(`t`.`OrderID`)) AS `Count` FROM ( SELECT TOP {AssertSqlHelper.Parameter("@__p_0")} `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Orders` AS `o` @@ -972,7 +1014,7 @@ GROUP BY `t0`.`CustomerID`"); await base.GroupJoin_GroupBy_Aggregate(isAsync); AssertSql( - $@"SELECT `o`.`CustomerID` AS `Key`, AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) AS `Average` + $@"SELECT `o`.`CustomerID` AS `Key`, AVG(CDBL(`o`.`OrderID`)) AS `Average` FROM `Customers` AS `c` LEFT JOIN `Orders` AS `o` ON `c`.`CustomerID` = `o`.`CustomerID` WHERE `o`.`OrderID` IS NOT NULL @@ -995,7 +1037,7 @@ GROUP BY `c`.`CustomerID`"); await base.GroupJoin_GroupBy_Aggregate_3(isAsync); AssertSql( - $@"SELECT `o`.`CustomerID` AS `Key`, AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) AS `Average` + $@"SELECT `o`.`CustomerID` AS `Key`, AVG(CDBL(`o`.`OrderID`)) AS `Average` FROM `Orders` AS `o` LEFT JOIN `Customers` AS `c` ON `o`.`CustomerID` = `c`.`CustomerID` GROUP BY `o`.`CustomerID`"); @@ -1017,7 +1059,7 @@ GROUP BY `c`.`CustomerID`"); await base.GroupJoin_GroupBy_Aggregate_5(isAsync); AssertSql( - $@"SELECT `o`.`OrderID` AS `Value`, AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) AS `Average` + $@"SELECT `o`.`OrderID` AS `Value`, AVG(CDBL(`o`.`OrderID`)) AS `Average` FROM `Orders` AS `o` LEFT JOIN `Customers` AS `c` ON `o`.`CustomerID` = `c`.`CustomerID` GROUP BY `o`.`OrderID`"); @@ -1045,7 +1087,7 @@ GROUP BY `c`.`Country`"); {AssertSqlHelper.Declaration("@__p_2='100'")} -SELECT `t0`.`CustomerID` AS `Key`, AVG(IIf(`t0`.`OrderID` IS NULL, NULL, CDBL(`t0`.`OrderID`))) AS `Count` +SELECT `t0`.`CustomerID` AS `Key`, AVG(IIF(`t0`.`OrderID` IS NULL, NULL, CDBL(`t0`.`OrderID`))) AS `Count` FROM ( SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` @@ -1068,7 +1110,7 @@ GROUP BY `t0`.`CustomerID`"); await base.Self_join_GroupBy_Aggregate(isAsync); AssertSql( - $@"SELECT `o`.`CustomerID` AS `Key`, AVG(IIf(`o0`.`OrderID` IS NULL, NULL, CDBL(`o0`.`OrderID`))) AS `Count` + $@"SELECT `o`.`CustomerID` AS `Key`, AVG(CDBL(`o0`.`OrderID`)) AS `Count` FROM `Orders` AS `o` INNER JOIN `Orders` AS `o0` ON `o`.`OrderID` = `o0`.`OrderID` WHERE `o`.`OrderID` < 10400 @@ -1081,8 +1123,8 @@ GROUP BY `o`.`CustomerID`"); AssertSql( $@"SELECT `o0`.`CustomerID`, `p`.`ProductName`, COUNT(*) AS `Count` -FROM `Order Details` AS `o` -INNER JOIN `Orders` AS `o0` ON `o`.`OrderID` = `o0`.`OrderID` +FROM (`Order Details` AS `o` +INNER JOIN `Orders` AS `o0` ON `o`.`OrderID` = `o0`.`OrderID`) INNER JOIN `Products` AS `p` ON `o`.`ProductID` = `p`.`ProductID` GROUP BY `o0`.`CustomerID`, `p`.`ProductName`"); } @@ -1110,7 +1152,7 @@ GROUP BY `t`.`City`"); await base.Select_anonymous_GroupBy_Aggregate(isAsync); AssertSql( - $@"SELECT MIN(`o`.`OrderDate`) AS `Min`, MAX(`o`.`OrderDate`) AS `Max`, SUM(`o`.`OrderID`) AS `Sum`, AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) AS `Avg` + $@"SELECT MIN(`o`.`OrderDate`) AS `Min`, MAX(`o`.`OrderDate`) AS `Max`, IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `Sum`, AVG(CDBL(`o`.`OrderID`)) AS `Avg` FROM `Orders` AS `o` WHERE `o`.`OrderID` < 10300 GROUP BY `o`.`CustomerID`"); @@ -1154,7 +1196,7 @@ ORDER BY COUNT(*), `o`.`CustomerID`"); await base.GroupBy_OrderBy_count_Select_sum(isAsync); AssertSql( - $@"SELECT `o`.`CustomerID` AS `Key`, SUM(`o`.`OrderID`) AS `Sum` + $@"SELECT `o`.`CustomerID` AS `Key`, IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `Sum` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID` ORDER BY COUNT(*), `o`.`CustomerID`"); @@ -1165,14 +1207,13 @@ ORDER BY COUNT(*), `o`.`CustomerID`"); await base.GroupBy_aggregate_Contains(isAsync); AssertSql( - $@"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` + @"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Orders` AS `o` -WHERE `o`.`CustomerID` IN ( - SELECT `o0`.`CustomerID` +WHERE EXISTS ( + SELECT 1 FROM `Orders` AS `o0` GROUP BY `o0`.`CustomerID` - HAVING COUNT(*) > 30 -)"); + HAVING (COUNT(*) > 30) AND ((`o0`.`CustomerID` = `o`.`CustomerID`) OR ((`o0`.`CustomerID` IS NULL) AND (`o`.`CustomerID` IS NULL))))"); } public override async Task GroupBy_aggregate_Pushdown(bool isAsync) @@ -1265,7 +1306,7 @@ HAVING COUNT(*) > 4"); await base.GroupBy_filter_count_OrderBy_count_Select_sum(isAsync); AssertSql( - $@"SELECT `o`.`CustomerID` AS `Key`, COUNT(*) AS `Count`, SUM(`o`.`OrderID`) AS `Sum` + $@"SELECT `o`.`CustomerID` AS `Key`, COUNT(*) AS `Count`, IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `Sum` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID` HAVING COUNT(*) > 4 @@ -1277,15 +1318,15 @@ ORDER BY COUNT(*), `o`.`CustomerID`"); await base.GroupBy_Aggregate_Join(isAsync); AssertSql( - $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o0`.`OrderID`, `o0`.`CustomerID`, `o0`.`EmployeeID`, `o0`.`OrderDate` -FROM ( - SELECT `o`.`CustomerID`, MAX(`o`.`OrderID`) AS `c` + @"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o0`.`OrderID`, `o0`.`CustomerID`, `o0`.`EmployeeID`, `o0`.`OrderDate` +FROM (( + SELECT `o`.`CustomerID`, MAX(`o`.`OrderID`) AS `LastOrderID` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID` HAVING COUNT(*) > 5 ) AS `t` -INNER JOIN `Customers` AS `c` ON `t`.`CustomerID` = `c`.`CustomerID` -INNER JOIN `Orders` AS `o0` ON `t`.`c` = `o0`.`OrderID`"); +INNER JOIN `Customers` AS `c` ON `t`.`CustomerID` = `c`.`CustomerID`) +INNER JOIN `Orders` AS `o0` ON `t`.`LastOrderID` = `o0`.`OrderID`"); } public override async Task Join_GroupBy_Aggregate_multijoins(bool isAsync) @@ -1293,15 +1334,15 @@ INNER JOIN `Orders` AS `o0` ON `t`.`c` = `o0`.`OrderID`"); await base.Join_GroupBy_Aggregate_multijoins(isAsync); AssertSql( - $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o0`.`OrderID`, `o0`.`CustomerID`, `o0`.`EmployeeID`, `o0`.`OrderDate` -FROM `Customers` AS `c` + @"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o0`.`OrderID`, `o0`.`CustomerID`, `o0`.`EmployeeID`, `o0`.`OrderDate` +FROM (`Customers` AS `c` INNER JOIN ( - SELECT `o`.`CustomerID`, MAX(`o`.`OrderID`) AS `c` + SELECT `o`.`CustomerID`, MAX(`o`.`OrderID`) AS `LastOrderID` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID` HAVING COUNT(*) > 5 -) AS `t` ON `c`.`CustomerID` = `t`.`CustomerID` -INNER JOIN `Orders` AS `o0` ON `t`.`c` = `o0`.`OrderID`"); +) AS `t` ON `c`.`CustomerID` = `t`.`CustomerID`) +INNER JOIN `Orders` AS `o0` ON `t`.`LastOrderID` = `o0`.`OrderID`"); } public override async Task Join_GroupBy_Aggregate_single_join(bool isAsync) @@ -1309,10 +1350,10 @@ INNER JOIN `Orders` AS `o0` ON `t`.`c` = `o0`.`OrderID`"); await base.Join_GroupBy_Aggregate_single_join(isAsync); AssertSql( - $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `t`.`c` AS `LastOrderID` + @"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `t`.`LastOrderID` FROM `Customers` AS `c` INNER JOIN ( - SELECT `o`.`CustomerID`, MAX(`o`.`OrderID`) AS `c` + SELECT `o`.`CustomerID`, MAX(`o`.`OrderID`) AS `LastOrderID` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID` HAVING COUNT(*) > 5 @@ -1324,14 +1365,14 @@ INNER JOIN ( await base.Join_GroupBy_Aggregate_with_another_join(isAsync); AssertSql( - $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `t`.`c` AS `LastOrderID`, `o0`.`OrderID` -FROM `Customers` AS `c` + @"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `t`.`LastOrderID`, `o0`.`OrderID` +FROM (`Customers` AS `c` INNER JOIN ( - SELECT `o`.`CustomerID`, MAX(`o`.`OrderID`) AS `c` + SELECT `o`.`CustomerID`, MAX(`o`.`OrderID`) AS `LastOrderID` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID` HAVING COUNT(*) > 5 -) AS `t` ON `c`.`CustomerID` = `t`.`CustomerID` +) AS `t` ON `c`.`CustomerID` = `t`.`CustomerID`) INNER JOIN `Orders` AS `o0` ON `c`.`CustomerID` = `o0`.`CustomerID`"); } @@ -1340,13 +1381,13 @@ INNER JOIN `Orders` AS `o0` ON `c`.`CustomerID` = `o0`.`CustomerID`"); await base.Join_GroupBy_Aggregate_in_subquery(isAsync); AssertSql( - $@"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate`, `t0`.`CustomerID`, `t0`.`Address`, `t0`.`City`, `t0`.`CompanyName`, `t0`.`ContactName`, `t0`.`ContactTitle`, `t0`.`Country`, `t0`.`Fax`, `t0`.`Phone`, `t0`.`PostalCode`, `t0`.`Region` + @"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate`, `t0`.`CustomerID`, `t0`.`Address`, `t0`.`City`, `t0`.`CompanyName`, `t0`.`ContactName`, `t0`.`ContactTitle`, `t0`.`Country`, `t0`.`Fax`, `t0`.`Phone`, `t0`.`PostalCode`, `t0`.`Region` FROM `Orders` AS `o` INNER JOIN ( - SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `t`.`CustomerID` AS `CustomerID0`, `t`.`c` + SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` INNER JOIN ( - SELECT `o0`.`CustomerID`, MAX(`o0`.`OrderID`) AS `c` + SELECT `o0`.`CustomerID` FROM `Orders` AS `o0` GROUP BY `o0`.`CustomerID` HAVING COUNT(*) > 5 @@ -1360,14 +1401,14 @@ WHERE `o`.`OrderID` < 10400"); await base.Join_GroupBy_Aggregate_on_key(isAsync); AssertSql( - $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `t`.`c` AS `LastOrderID` + @"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `t`.`LastOrderID` FROM `Customers` AS `c` INNER JOIN ( - SELECT `o`.`CustomerID`, MAX(`o`.`OrderID`) AS `c` + SELECT `o`.`CustomerID` AS `Key`, MAX(`o`.`OrderID`) AS `LastOrderID` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID` HAVING COUNT(*) > 5 -) AS `t` ON `c`.`CustomerID` = `t`.`CustomerID`"); +) AS `t` ON `c`.`CustomerID` = `t`.`Key`"); } public override async Task GroupBy_with_result_selector(bool isAsync) @@ -1375,7 +1416,7 @@ INNER JOIN ( await base.GroupBy_with_result_selector(isAsync); AssertSql( - $@"SELECT SUM(`o`.`OrderID`) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, MAX(`o`.`OrderID`) AS `Max`, AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) AS `Avg` + $@"SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `Sum`, MIN(`o`.`OrderID`) AS `Min`, MAX(`o`.`OrderID`) AS `Max`, AVG(CDBL(`o`.`OrderID`)) AS `Avg` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -1385,7 +1426,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_Sum_constant(isAsync); AssertSql( - $@"SELECT SUM(1) + $@"SELECT IIF(SUM(1) IS NULL, 0, SUM(1)) FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -1395,7 +1436,7 @@ GROUP BY `o`.`CustomerID`"); await base.GroupBy_Sum_constant_cast(isAsync); AssertSql( - $@"SELECT SUM(1) + $@"SELECT IIF(SUM(1) IS NULL, 0, SUM(1)) FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -1429,7 +1470,7 @@ ORDER BY `t`.`CustomerID`"); END ), `c`.`CustomerID` FROM `Customers` AS `c` -WHERE `c`.`CustomerID` LIKE 'A' & '%'", +WHERE `c`.`CustomerID` LIKE 'A%'", // $@"{AssertSqlHelper.Declaration("@_outer_CustomerID='ALFKI' (Size = 5)")} @@ -1475,7 +1516,7 @@ ORDER BY `o`.`CustomerID`"); await base.GroupBy_Key_as_part_of_element_selector(isAsync); AssertSql( - $@"SELECT `o`.`OrderID` AS `Key`, AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) AS `Avg`, MAX(`o`.`OrderDate`) AS `Max` + $@"SELECT `o`.`OrderID` AS `Key`, AVG(CDBL(`o`.`OrderID`)) AS `Avg`, MAX(`o`.`OrderDate`) AS `Max` FROM `Orders` AS `o` GROUP BY `o`.`OrderID`"); } @@ -1485,7 +1526,7 @@ GROUP BY `o`.`OrderID`"); await base.GroupBy_composite_Key_as_part_of_element_selector(isAsync); AssertSql( - $@"SELECT `o`.`OrderID`, `o`.`CustomerID`, AVG(IIf(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`))) AS `Avg`, MAX(`o`.`OrderDate`) AS `Max` + $@"SELECT `o`.`OrderID`, `o`.`CustomerID`, AVG(CDBL(`o`.`OrderID`)) AS `Avg`, MAX(`o`.`OrderDate`) AS `Max` FROM `Orders` AS `o` GROUP BY `o`.`OrderID`, `o`.`CustomerID`"); } @@ -1543,15 +1584,10 @@ ORDER BY `o0`.`CustomerID`"); await base.GroupBy_with_aggregate_through_navigation_property(isAsync); AssertSql( - $@"SELECT `c`.`OrderID`, `c`.`CustomerID`, `c`.`EmployeeID`, `c`.`OrderDate` -FROM `Orders` AS `c` -ORDER BY `c`.`EmployeeID`", - // - $@"SELECT [i.Customer0].`CustomerID`, [i.Customer0].`Region` -FROM `Customers` AS [i.Customer0]", - // - $@"SELECT [i.Customer0].`CustomerID`, [i.Customer0].`Region` -FROM `Customers` AS [i.Customer0]"); + @"SELECT MAX(`c`.`Region`) AS `max` +FROM `Orders` AS `o` +LEFT JOIN `Customers` AS `c` ON `o`.`CustomerID` = `c`.`CustomerID` +GROUP BY `o`.`EmployeeID`"); } public override async Task GroupBy_Shadow(bool isAsync) @@ -1559,10 +1595,13 @@ FROM `Customers` AS [i.Customer0]"); await base.GroupBy_Shadow(isAsync); AssertSql( - $@"SELECT `e`.`EmployeeID`, `e`.`City`, `e`.`Country`, `e`.`FirstName`, `e`.`ReportsTo`, `e`.`Title` + @"SELECT ( + SELECT TOP 1 `e0`.`Title` + FROM `Employees` AS `e0` + WHERE ((`e0`.`Title` = 'Sales Representative') AND (`e0`.`EmployeeID` = 1)) AND ((`e`.`Title` = `e0`.`Title`) OR ((`e`.`Title` IS NULL) AND (`e0`.`Title` IS NULL)))) FROM `Employees` AS `e` WHERE (`e`.`Title` = 'Sales Representative') AND (`e`.`EmployeeID` = 1) -ORDER BY `e`.`Title`"); +GROUP BY `e`.`Title`"); } public override async Task GroupBy_Shadow2(bool isAsync) @@ -1570,10 +1609,22 @@ ORDER BY `e`.`Title`"); await base.GroupBy_Shadow2(isAsync); AssertSql( - $@"SELECT `e`.`EmployeeID`, `e`.`City`, `e`.`Country`, `e`.`FirstName`, `e`.`ReportsTo`, `e`.`Title` -FROM `Employees` AS `e` -WHERE (`e`.`Title` = 'Sales Representative') AND (`e`.`EmployeeID` = 1) -ORDER BY `e`.`Title`"); + @"SELECT `t0`.`EmployeeID`, `t0`.`City`, `t0`.`Country`, `t0`.`FirstName`, `t0`.`ReportsTo`, `t0`.`Title` +FROM ( + SELECT `e`.`Title` + FROM `Employees` AS `e` + WHERE (`e`.`Title` = 'Sales Representative') AND (`e`.`EmployeeID` = 1) + GROUP BY `e`.`Title` +) AS `t` +LEFT JOIN ( + SELECT `t1`.`EmployeeID`, `t1`.`City`, `t1`.`Country`, `t1`.`FirstName`, `t1`.`ReportsTo`, `t1`.`Title` + FROM ( + SELECT `e0`.`EmployeeID`, `e0`.`City`, `e0`.`Country`, `e0`.`FirstName`, `e0`.`ReportsTo`, `e0`.`Title`, ROW_NUMBER() OVER(PARTITION BY `e0`.`Title` ORDER BY `e0`.`EmployeeID`) AS `row` + FROM `Employees` AS `e0` + WHERE (`e0`.`Title` = 'Sales Representative') AND (`e0`.`EmployeeID` = 1) + ) AS `t1` + WHERE `t1`.`row` <= 1 +) AS `t0` ON `t`.`Title` = `t0`.`Title`"); } public override async Task GroupBy_Shadow3(bool isAsync) @@ -1581,10 +1632,13 @@ ORDER BY `e`.`Title`"); await base.GroupBy_Shadow3(isAsync); AssertSql( - $@"SELECT `e`.`EmployeeID`, `e`.`City`, `e`.`Country`, `e`.`FirstName`, `e`.`ReportsTo`, `e`.`Title` + @"SELECT ( + SELECT TOP 1 `e0`.`Title` + FROM `Employees` AS `e0` + WHERE (`e0`.`EmployeeID` = 1) AND (`e`.`EmployeeID` = `e0`.`EmployeeID`)) FROM `Employees` AS `e` WHERE `e`.`EmployeeID` = 1 -ORDER BY `e`.`EmployeeID`"); +GROUP BY `e`.`EmployeeID`"); } public override async Task Select_GroupBy_SelectMany(bool isAsync) @@ -1604,7 +1658,7 @@ ORDER BY `o`.`OrderID`"); AssertSql( $@"SELECT COUNT(*) FROM ( - SELECT SUM(`o`.`OrderID`) AS `c` + SELECT `o`.`CustomerID` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID` ) AS `t`"); @@ -1615,16 +1669,16 @@ FROM ( await base.MinMax_after_GroupBy_aggregate(isAsync); AssertSql( - $@"SELECT MIN(`t`.`c`) + @"SELECT MIN(`t`.`c`) FROM ( - SELECT SUM(`o`.`OrderID`) AS `c` + SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `c` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID` ) AS `t`", // - $@"SELECT MAX(`t`.`c`) + @"SELECT MAX(`t`.`c`) FROM ( - SELECT SUM(`o`.`OrderID`) AS `c` + SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `c` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID` ) AS `t`"); @@ -1678,14 +1732,26 @@ END"); { await base.Count_after_GroupBy_without_aggregate(isAsync); - AssertSql($@" "); + AssertSql( + @"SELECT COUNT(*) +FROM ( + SELECT `o`.`CustomerID` + FROM `Orders` AS `o` + GROUP BY `o`.`CustomerID` +) AS `t`"); } public override async Task LongCount_after_GroupBy_without_aggregate(bool isAsync) { await base.LongCount_after_GroupBy_without_aggregate(isAsync); - AssertSql($@" "); + AssertSql( + @"SELECT COUNT(*) +FROM ( + SELECT `o`.`CustomerID` + FROM `Orders` AS `o` + GROUP BY `o`.`CustomerID` +) AS `t`"); } public override async Task GroupBy_based_on_renamed_property_simple(bool isAsync) @@ -1703,12 +1769,12 @@ GROUP BY `c`.`City`"); await base.GroupBy_based_on_renamed_property_complex(isAsync); AssertSql( - $@"SELECT `t`.`City` AS `Key`, COUNT(*) AS `Count` + @"SELECT `t`.`Renamed` AS `Key`, COUNT(*) AS `Count` FROM ( - SELECT DISTINCT `c`.`City`, `c`.`CustomerID` + SELECT DISTINCT `c`.`City` AS `Renamed`, `c`.`CustomerID` FROM `Customers` AS `c` ) AS `t` -GROUP BY `t`.`City`"); +GROUP BY `t`.`Renamed`"); } public override async Task GroupBy_with_group_key_access_thru_navigation(bool isAsync) @@ -1716,7 +1782,7 @@ GROUP BY `t`.`City`"); await base.GroupBy_with_group_key_access_thru_navigation(isAsync); AssertSql( - $@"SELECT `o0`.`CustomerID` AS `Key`, SUM(`o`.`OrderID`) AS `Aggregate` + $@"SELECT `o0`.`CustomerID` AS `Key`, IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `Aggregate` FROM `Order Details` AS `o` INNER JOIN `Orders` AS `o0` ON `o`.`OrderID` = `o0`.`OrderID` GROUP BY `o0`.`CustomerID`"); @@ -1727,9 +1793,9 @@ GROUP BY `o0`.`CustomerID`"); await base.GroupBy_with_group_key_access_thru_nested_navigation(isAsync); AssertSql( - $@"SELECT `c`.`Country` AS `Key`, SUM(`o`.`OrderID`) AS `Aggregate` -FROM `Order Details` AS `o` -INNER JOIN `Orders` AS `o0` ON `o`.`OrderID` = `o0`.`OrderID` + $@"SELECT `c`.`Country` AS `Key`, IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) AS `Aggregate` +FROM (`Order Details` AS `o` +INNER JOIN `Orders` AS `o0` ON `o`.`OrderID` = `o0`.`OrderID`) LEFT JOIN `Customers` AS `c` ON `o0`.`CustomerID` = `c`.`CustomerID` GROUP BY `c`.`Country`"); } @@ -1800,9 +1866,9 @@ GROUP BY `t`.`CustomerID`"); await base.GroupBy_with_grouping_key_using_Like(isAsync); AssertSql( - $@"SELECT IIF(`o`.`CustomerID` LIKE 'A' & '%', 1, 0) AS `Key`, COUNT(*) AS `Count` + $@"SELECT IIF(`o`.`CustomerID` LIKE 'A%', TRUE, FALSE) AS `Key`, COUNT(*) AS `Count` FROM `Orders` AS `o` -GROUP BY IIF(`o`.`CustomerID` LIKE 'A' & '%', 1, 0)"); +GROUP BY IIF(`o`.`CustomerID` LIKE 'A%', TRUE, FALSE)"); } public override async Task GroupBy_with_grouping_key_DateTime_Day(bool isAsync) @@ -1820,7 +1886,7 @@ GROUP BY DATEPART('d', `o`.`OrderDate`)"); await base.GroupBy_with_cast_inside_grouping_aggregate(isAsync); AssertSql( - $@"SELECT `o`.`CustomerID` AS `Key`, COUNT(*) AS `Count`, SUM(CAST(`o`.`OrderID` AS bigint)) AS `Sum` + $@"SELECT `o`.`CustomerID` AS `Key`, COUNT(*) AS `Count`, IIF(SUM(CLNG(`o`.`OrderID`)) IS NULL, 0, SUM(CLNG(`o`.`OrderID`))) AS `Sum` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } @@ -1854,7 +1920,7 @@ GROUP BY `o`.`CustomerID`"); await base.Group_by_with_arithmetic_operation_inside_aggregate(isAsync); AssertSql( - $@"SELECT `o`.`CustomerID` AS `Key`, SUM(`o`.`OrderID` + CAST(LEN(`o`.`CustomerID`) AS int)) AS `Sum` + $@"SELECT `o`.`CustomerID` AS `Key`, IIF(SUM(`o`.`OrderID` + CLNG(LEN(`o`.`CustomerID`))) IS NULL, 0, SUM(`o`.`OrderID` + CLNG(LEN(`o`.`CustomerID`)))) AS `Sum` FROM `Orders` AS `o` GROUP BY `o`.`CustomerID`"); } diff --git a/test/EFCore.Jet.FunctionalTests/Query/NorthwindIncludeQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/NorthwindIncludeQueryJetTest.cs index 8786474..f2e72a7 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/NorthwindIncludeQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/NorthwindIncludeQueryJetTest.cs @@ -25,14 +25,15 @@ namespace EntityFrameworkCore.Jet.FunctionalTests.Query await base.Include_list(async); AssertSql( - $@"SELECT `p`.`ProductID`, `p`.`Discontinued`, `p`.`ProductName`, `p`.`SupplierID`, `p`.`UnitPrice`, `p`.`UnitsInStock`, `t`.`OrderID`, `t`.`ProductID`, `t`.`Discount`, `t`.`Quantity`, `t`.`UnitPrice`, `t`.`OrderID0`, `t`.`CustomerID`, `t`.`EmployeeID`, `t`.`OrderDate` + @"SELECT `p`.`ProductID`, `p`.`Discontinued`, `p`.`ProductName`, `p`.`SupplierID`, `p`.`UnitPrice`, `p`.`UnitsInStock`, `t`.`OrderID`, `t`.`ProductID`, `t`.`Discount`, `t`.`Quantity`, `t`.`UnitPrice`, `t`.`OrderID0`, `t`.`CustomerID`, `t`.`EmployeeID`, `t`.`OrderDate` FROM `Products` AS `p` LEFT JOIN ( SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice`, `o0`.`OrderID` AS `OrderID0`, `o0`.`CustomerID`, `o0`.`EmployeeID`, `o0`.`OrderDate` FROM `Order Details` AS `o` INNER JOIN `Orders` AS `o0` ON `o`.`OrderID` = `o0`.`OrderID` ) AS `t` ON `p`.`ProductID` = `t`.`ProductID` -ORDER BY `p`.`ProductID`, `t`.`OrderID`, `t`.`ProductID`, `t`.`OrderID0`"); +WHERE ((`p`.`ProductID` MOD 17) = 5) AND (`p`.`UnitPrice` < 20.0) +ORDER BY `p`.`ProductID`, `t`.`OrderID`, `t`.`ProductID`"); } public override async Task Include_reference(bool async) @@ -40,9 +41,10 @@ ORDER BY `p`.`ProductID`, `t`.`OrderID`, `t`.`ProductID`, `t`.`OrderID0`"); await base.Include_reference(async); AssertSql( - $@"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate`, `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` + @"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate`, `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Orders` AS `o` -LEFT JOIN `Customers` AS `c` ON `o`.`CustomerID` = `c`.`CustomerID`"); +LEFT JOIN `Customers` AS `c` ON `o`.`CustomerID` = `c`.`CustomerID` +WHERE (`o`.`CustomerID` IS NOT NULL) AND (`o`.`CustomerID` LIKE 'F%')"); } public override async Task Include_when_result_operator(bool async) @@ -50,11 +52,11 @@ LEFT JOIN `Customers` AS `c` ON `o`.`CustomerID` = `c`.`CustomerID`"); await base.Include_when_result_operator(async); AssertSql( - $@"SELECT CASE + @"SELECT CASE WHEN EXISTS ( SELECT 1 - FROM `Customers` AS `c`) THEN True - ELSE False + FROM `Customers` AS `c`) THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) END"); } @@ -63,10 +65,11 @@ END"); await base.Include_collection(async); AssertSql( - $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` + @"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Customers` AS `c` LEFT JOIN `Orders` AS `o` ON `c`.`CustomerID` = `o`.`CustomerID` -ORDER BY `c`.`CustomerID`, `o`.`OrderID`"); +WHERE `c`.`CustomerID` LIKE 'F%' +ORDER BY `c`.`CustomerID`"); } public override async Task Include_collection_with_last(bool async) @@ -74,14 +77,14 @@ ORDER BY `c`.`CustomerID`, `o`.`OrderID`"); await base.Include_collection_with_last(async); AssertSql( - $@"SELECT `t`.`CustomerID`, `t`.`Address`, `t`.`City`, `t`.`CompanyName`, `t`.`ContactName`, `t`.`ContactTitle`, `t`.`Country`, `t`.`Fax`, `t`.`Phone`, `t`.`PostalCode`, `t`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` + @"SELECT `t`.`CustomerID`, `t`.`Address`, `t`.`City`, `t`.`CompanyName`, `t`.`ContactName`, `t`.`ContactTitle`, `t`.`Country`, `t`.`Fax`, `t`.`Phone`, `t`.`PostalCode`, `t`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM ( SELECT TOP 1 `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` ORDER BY `c`.`CompanyName` DESC ) AS `t` LEFT JOIN `Orders` AS `o` ON `t`.`CustomerID` = `o`.`CustomerID` -ORDER BY `t`.`CompanyName` DESC, `t`.`CustomerID`, `o`.`OrderID`"); +ORDER BY `t`.`CompanyName` DESC, `t`.`CustomerID`"); } public override async Task Include_collection_skip_no_order_by(bool async) @@ -112,15 +115,13 @@ ORDER BY `t`.`CustomerID`, `o`.`OrderID`"); if (SupportsOffset) { AssertSql( - $@"{AssertSqlHelper.Declaration("@__p_0='10'")} - -SELECT `t`.`CustomerID`, `t`.`Address`, `t`.`City`, `t`.`CompanyName`, `t`.`ContactName`, `t`.`ContactTitle`, `t`.`Country`, `t`.`Fax`, `t`.`Phone`, `t`.`PostalCode`, `t`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` + $@"SELECT `t`.`CustomerID`, `t`.`Address`, `t`.`City`, `t`.`CompanyName`, `t`.`ContactName`, `t`.`ContactTitle`, `t`.`Country`, `t`.`Fax`, `t`.`Phone`, `t`.`PostalCode`, `t`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM ( - SELECT TOP {AssertSqlHelper.Parameter("@__p_0")} `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` + SELECT TOP 10 `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` ) AS `t` LEFT JOIN `Orders` AS `o` ON `t`.`CustomerID` = `o`.`CustomerID` -ORDER BY `t`.`CustomerID`, `o`.`OrderID`"); +ORDER BY `t`.`CustomerID`"); } } @@ -152,11 +153,12 @@ ORDER BY `t`.`CustomerID`, `o`.`OrderID`"); await base.Include_reference_and_collection(async); AssertSql( - $@"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate`, `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o0`.`OrderID`, `o0`.`ProductID`, `o0`.`Discount`, `o0`.`Quantity`, `o0`.`UnitPrice` -FROM `Orders` AS `o` -LEFT JOIN `Customers` AS `c` ON `o`.`CustomerID` = `c`.`CustomerID` + @"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate`, `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o0`.`OrderID`, `o0`.`ProductID`, `o0`.`Discount`, `o0`.`Quantity`, `o0`.`UnitPrice` +FROM (`Orders` AS `o` +LEFT JOIN `Customers` AS `c` ON `o`.`CustomerID` = `c`.`CustomerID`) LEFT JOIN `Order Details` AS `o0` ON `o`.`OrderID` = `o0`.`OrderID` -ORDER BY `o`.`OrderID`, `o0`.`OrderID`, `o0`.`ProductID`"); +WHERE (`o`.`CustomerID` IS NOT NULL) AND (`o`.`CustomerID` LIKE 'F%') +ORDER BY `o`.`OrderID`, `c`.`CustomerID`, `o0`.`OrderID`"); } public override async Task Include_references_multi_level(bool async) @@ -164,10 +166,11 @@ ORDER BY `o`.`OrderID`, `o0`.`OrderID`, `o0`.`ProductID`"); await base.Include_references_multi_level(async); AssertSql( - $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice`, `o0`.`OrderID`, `o0`.`CustomerID`, `o0`.`EmployeeID`, `o0`.`OrderDate`, `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` -FROM `Order Details` AS `o` -INNER JOIN `Orders` AS `o0` ON `o`.`OrderID` = `o0`.`OrderID` -LEFT JOIN `Customers` AS `c` ON `o0`.`CustomerID` = `c`.`CustomerID`"); + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice`, `o0`.`OrderID`, `o0`.`CustomerID`, `o0`.`EmployeeID`, `o0`.`OrderDate`, `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` +FROM (`Order Details` AS `o` +INNER JOIN `Orders` AS `o0` ON `o`.`OrderID` = `o0`.`OrderID`) +LEFT JOIN `Customers` AS `c` ON `o0`.`CustomerID` = `c`.`CustomerID` +WHERE (`o`.`OrderID` MOD 23) = 13"); } public override async Task Include_multiple_references_multi_level(bool async) @@ -175,11 +178,12 @@ LEFT JOIN `Customers` AS `c` ON `o0`.`CustomerID` = `c`.`CustomerID`"); await base.Include_multiple_references_multi_level(async); AssertSql( - $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice`, `o0`.`OrderID`, `o0`.`CustomerID`, `o0`.`EmployeeID`, `o0`.`OrderDate`, `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `p`.`ProductID`, `p`.`Discontinued`, `p`.`ProductName`, `p`.`SupplierID`, `p`.`UnitPrice`, `p`.`UnitsInStock` -FROM `Order Details` AS `o` -INNER JOIN `Orders` AS `o0` ON `o`.`OrderID` = `o0`.`OrderID` -LEFT JOIN `Customers` AS `c` ON `o0`.`CustomerID` = `c`.`CustomerID` -INNER JOIN `Products` AS `p` ON `o`.`ProductID` = `p`.`ProductID`"); + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice`, `o0`.`OrderID`, `o0`.`CustomerID`, `o0`.`EmployeeID`, `o0`.`OrderDate`, `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `p`.`ProductID`, `p`.`Discontinued`, `p`.`ProductName`, `p`.`SupplierID`, `p`.`UnitPrice`, `p`.`UnitsInStock` +FROM ((`Order Details` AS `o` +INNER JOIN `Orders` AS `o0` ON `o`.`OrderID` = `o0`.`OrderID`) +LEFT JOIN `Customers` AS `c` ON `o0`.`CustomerID` = `c`.`CustomerID`) +INNER JOIN `Products` AS `p` ON `o`.`ProductID` = `p`.`ProductID` +WHERE (`o`.`OrderID` MOD 23) = 13"); } public override async Task Include_multiple_references_multi_level_reverse(bool async) @@ -187,11 +191,12 @@ INNER JOIN `Products` AS `p` ON `o`.`ProductID` = `p`.`ProductID`"); await base.Include_multiple_references_multi_level_reverse(async); AssertSql( - $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice`, `p`.`ProductID`, `p`.`Discontinued`, `p`.`ProductName`, `p`.`SupplierID`, `p`.`UnitPrice`, `p`.`UnitsInStock`, `o0`.`OrderID`, `o0`.`CustomerID`, `o0`.`EmployeeID`, `o0`.`OrderDate`, `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` -FROM `Order Details` AS `o` -INNER JOIN `Products` AS `p` ON `o`.`ProductID` = `p`.`ProductID` -INNER JOIN `Orders` AS `o0` ON `o`.`OrderID` = `o0`.`OrderID` -LEFT JOIN `Customers` AS `c` ON `o0`.`CustomerID` = `c`.`CustomerID`"); + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice`, `p`.`ProductID`, `p`.`Discontinued`, `p`.`ProductName`, `p`.`SupplierID`, `p`.`UnitPrice`, `p`.`UnitsInStock`, `o0`.`OrderID`, `o0`.`CustomerID`, `o0`.`EmployeeID`, `o0`.`OrderDate`, `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` +FROM ((`Order Details` AS `o` +INNER JOIN `Products` AS `p` ON `o`.`ProductID` = `p`.`ProductID`) +INNER JOIN `Orders` AS `o0` ON `o`.`OrderID` = `o0`.`OrderID`) +LEFT JOIN `Customers` AS `c` ON `o0`.`CustomerID` = `c`.`CustomerID` +WHERE (`o`.`OrderID` MOD 23) = 13"); } public override async Task Include_references_and_collection_multi_level(bool async) @@ -199,12 +204,13 @@ LEFT JOIN `Customers` AS `c` ON `o0`.`CustomerID` = `c`.`CustomerID`"); await base.Include_references_and_collection_multi_level(async); AssertSql( - $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice`, `o0`.`OrderID`, `o0`.`CustomerID`, `o0`.`EmployeeID`, `o0`.`OrderDate`, `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o1`.`OrderID`, `o1`.`CustomerID`, `o1`.`EmployeeID`, `o1`.`OrderDate` -FROM `Order Details` AS `o` -INNER JOIN `Orders` AS `o0` ON `o`.`OrderID` = `o0`.`OrderID` -LEFT JOIN `Customers` AS `c` ON `o0`.`CustomerID` = `c`.`CustomerID` + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice`, `o0`.`OrderID`, `o0`.`CustomerID`, `o0`.`EmployeeID`, `o0`.`OrderDate`, `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o1`.`OrderID`, `o1`.`CustomerID`, `o1`.`EmployeeID`, `o1`.`OrderDate` +FROM ((`Order Details` AS `o` +INNER JOIN `Orders` AS `o0` ON `o`.`OrderID` = `o0`.`OrderID`) +LEFT JOIN `Customers` AS `c` ON `o0`.`CustomerID` = `c`.`CustomerID`) LEFT JOIN `Orders` AS `o1` ON `c`.`CustomerID` = `o1`.`CustomerID` -ORDER BY `o`.`OrderID`, `o`.`ProductID`, `o0`.`OrderID`, `o1`.`OrderID`"); +WHERE ((`o`.`OrderID` MOD 23) = 13) AND (`o`.`UnitPrice` < 10.0) +ORDER BY `o`.`OrderID`, `o`.`ProductID`, `o0`.`OrderID`, `c`.`CustomerID`"); } public override async Task Include_multi_level_reference_and_collection_predicate(bool async) @@ -220,7 +226,7 @@ FROM ( WHERE `o`.`OrderID` = 10248 ) AS `t` LEFT JOIN `Orders` AS `o0` ON `t`.`CustomerID0` = `o0`.`CustomerID` -ORDER BY `t`.`OrderID`, `o0`.`OrderID`"); +ORDER BY `t`.`OrderID`, `t`.`CustomerID0`"); } public override async Task Include_multi_level_collection_and_then_include_reference_predicate(bool async) @@ -239,7 +245,7 @@ LEFT JOIN ( FROM `Order Details` AS `o0` INNER JOIN `Products` AS `p` ON `o0`.`ProductID` = `p`.`ProductID` ) AS `t0` ON `t`.`OrderID` = `t0`.`OrderID` -ORDER BY `t`.`OrderID`, `t0`.`OrderID`, `t0`.`ProductID`, `t0`.`ProductID0`"); +ORDER BY `t`.`OrderID`, `t0`.`OrderID`, `t0`.`ProductID`"); } public override async Task Include_collection_alias_generation(bool async) @@ -247,10 +253,11 @@ ORDER BY `t`.`OrderID`, `t0`.`OrderID`, `t0`.`ProductID`, `t0`.`ProductID0`"); await base.Include_collection_alias_generation(async); AssertSql( - $@"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate`, `o0`.`OrderID`, `o0`.`ProductID`, `o0`.`Discount`, `o0`.`Quantity`, `o0`.`UnitPrice` + @"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate`, `o0`.`OrderID`, `o0`.`ProductID`, `o0`.`Discount`, `o0`.`Quantity`, `o0`.`UnitPrice` FROM `Orders` AS `o` LEFT JOIN `Order Details` AS `o0` ON `o`.`OrderID` = `o0`.`OrderID` -ORDER BY `o`.`OrderID`, `o0`.`OrderID`, `o0`.`ProductID`"); +WHERE (`o`.`CustomerID` IS NOT NULL) AND (`o`.`CustomerID` LIKE 'F%') +ORDER BY `o`.`OrderID`, `o0`.`OrderID`"); } public override async Task Include_collection_order_by_collection_column(bool async) @@ -266,7 +273,7 @@ FROM ( WHERE `c`.`CustomerID` = `o`.`CustomerID` ORDER BY `o`.`OrderDate` DESC) AS `c` FROM `Customers` AS `c` - WHERE `c`.`CustomerID` LIKE 'W' & '%' + WHERE `c`.`CustomerID` LIKE 'W%' ORDER BY ( SELECT TOP 1 `o`.`OrderDate` FROM `Orders` AS `o` @@ -282,10 +289,11 @@ ORDER BY `t`.`c` DESC, `t`.`CustomerID`, `o0`.`OrderID`"); await base.Include_collection_order_by_key(async); AssertSql( - $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` + @"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Customers` AS `c` LEFT JOIN `Orders` AS `o` ON `c`.`CustomerID` = `o`.`CustomerID` -ORDER BY `c`.`CustomerID`, `o`.`OrderID`"); +WHERE `c`.`CustomerID` LIKE 'F%' +ORDER BY `c`.`CustomerID`"); } public override async Task Include_collection_order_by_non_key(bool async) @@ -293,10 +301,11 @@ ORDER BY `c`.`CustomerID`, `o`.`OrderID`"); await base.Include_collection_order_by_non_key(async); AssertSql( - $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` + @"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Customers` AS `c` LEFT JOIN `Orders` AS `o` ON `c`.`CustomerID` = `o`.`CustomerID` -ORDER BY `c`.`City`, `c`.`CustomerID`, `o`.`OrderID`"); +WHERE `c`.`CustomerID` LIKE 'F%' +ORDER BY `c`.`PostalCode`, `c`.`CustomerID`"); } public override async Task Include_collection_order_by_non_key_with_take(bool async) @@ -304,16 +313,14 @@ ORDER BY `c`.`City`, `c`.`CustomerID`, `o`.`OrderID`"); await base.Include_collection_order_by_non_key_with_take(async); AssertSql( - $@"{AssertSqlHelper.Declaration("@__p_0='10'")} - -SELECT `t`.`CustomerID`, `t`.`Address`, `t`.`City`, `t`.`CompanyName`, `t`.`ContactName`, `t`.`ContactTitle`, `t`.`Country`, `t`.`Fax`, `t`.`Phone`, `t`.`PostalCode`, `t`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` + $@"SELECT `t`.`CustomerID`, `t`.`Address`, `t`.`City`, `t`.`CompanyName`, `t`.`ContactName`, `t`.`ContactTitle`, `t`.`Country`, `t`.`Fax`, `t`.`Phone`, `t`.`PostalCode`, `t`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM ( - SELECT TOP {AssertSqlHelper.Parameter("@__p_0")} `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` + SELECT TOP 10 `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` ORDER BY `c`.`ContactTitle` ) AS `t` LEFT JOIN `Orders` AS `o` ON `t`.`CustomerID` = `o`.`CustomerID` -ORDER BY `t`.`ContactTitle`, `t`.`CustomerID`, `o`.`OrderID`"); +ORDER BY `t`.`ContactTitle`, `t`.`CustomerID`"); } public override async Task Include_collection_order_by_non_key_with_skip(bool async) @@ -333,7 +340,7 @@ FROM ( SKIP {AssertSqlHelper.Parameter("@__p_0")} ) AS `t` LEFT JOIN `Orders` AS `o` ON `t`.`CustomerID` = `o`.`CustomerID` -ORDER BY `t`.`ContactTitle`, `t`.`CustomerID`, `o`.`OrderID`"); +ORDER BY `t`.`ContactTitle`, `t`.`CustomerID`"); } } @@ -349,7 +356,7 @@ FROM ( ORDER BY `c`.`CompanyName` DESC ) AS `t` LEFT JOIN `Orders` AS `o` ON `t`.`CustomerID` = `o`.`CustomerID` -ORDER BY `t`.`CompanyName` DESC, `t`.`CustomerID`, `o`.`OrderID`"); +ORDER BY `t`.`CompanyName` DESC, `t`.`CustomerID`"); } public override async Task Include_collection_order_by_subquery(bool async) @@ -373,7 +380,7 @@ FROM ( ORDER BY `o`.`EmployeeID`) ) AS `t` LEFT JOIN `Orders` AS `o0` ON `t`.`CustomerID` = `o0`.`CustomerID` -ORDER BY `t`.`c`, `t`.`CustomerID`, `o0`.`OrderID`"); +ORDER BY `t`.`c`, `t`.`CustomerID`"); } public override async Task Include_collection_principal_already_tracked(bool async) @@ -392,7 +399,7 @@ FROM ( WHERE `c`.`CustomerID` = 'ALFKI' ) AS `t` LEFT JOIN `Orders` AS `o` ON `t`.`CustomerID` = `o`.`CustomerID` -ORDER BY `t`.`CustomerID`, `o`.`OrderID`"); +ORDER BY `t`.`CustomerID`"); } public override async Task Include_collection_with_filter(bool async) @@ -404,7 +411,7 @@ ORDER BY `t`.`CustomerID`, `o`.`OrderID`"); FROM `Customers` AS `c` LEFT JOIN `Orders` AS `o` ON `c`.`CustomerID` = `o`.`CustomerID` WHERE `c`.`CustomerID` = 'ALFKI' -ORDER BY `c`.`CustomerID`, `o`.`OrderID`"); +ORDER BY `c`.`CustomerID`"); } public override async Task Include_collection_with_filter_reordered(bool async) @@ -416,7 +423,7 @@ ORDER BY `c`.`CustomerID`, `o`.`OrderID`"); FROM `Customers` AS `c` LEFT JOIN `Orders` AS `o` ON `c`.`CustomerID` = `o`.`CustomerID` WHERE `c`.`CustomerID` = 'ALFKI' -ORDER BY `c`.`CustomerID`, `o`.`OrderID`"); +ORDER BY `c`.`CustomerID`"); } public override async Task Include_collection_then_include_collection(bool async) @@ -424,14 +431,15 @@ ORDER BY `c`.`CustomerID`, `o`.`OrderID`"); await base.Include_collection_then_include_collection(async); AssertSql( - $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `t`.`OrderID`, `t`.`CustomerID`, `t`.`EmployeeID`, `t`.`OrderDate`, `t`.`OrderID0`, `t`.`ProductID`, `t`.`Discount`, `t`.`Quantity`, `t`.`UnitPrice` + @"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `t`.`OrderID`, `t`.`CustomerID`, `t`.`EmployeeID`, `t`.`OrderDate`, `t`.`OrderID0`, `t`.`ProductID`, `t`.`Discount`, `t`.`Quantity`, `t`.`UnitPrice` FROM `Customers` AS `c` LEFT JOIN ( SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate`, `o0`.`OrderID` AS `OrderID0`, `o0`.`ProductID`, `o0`.`Discount`, `o0`.`Quantity`, `o0`.`UnitPrice` FROM `Orders` AS `o` LEFT JOIN `Order Details` AS `o0` ON `o`.`OrderID` = `o0`.`OrderID` ) AS `t` ON `c`.`CustomerID` = `t`.`CustomerID` -ORDER BY `c`.`CustomerID`, `t`.`OrderID`, `t`.`OrderID0`, `t`.`ProductID`"); +WHERE `c`.`CustomerID` LIKE 'F%' +ORDER BY `c`.`CustomerID`, `t`.`OrderID`, `t`.`OrderID0`"); } public override async Task Include_collection_then_include_collection_then_include_reference(bool async) @@ -439,7 +447,7 @@ ORDER BY `c`.`CustomerID`, `t`.`OrderID`, `t`.`OrderID0`, `t`.`ProductID`"); await base.Include_collection_then_include_collection_then_include_reference(async); AssertSql( - $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `t0`.`OrderID`, `t0`.`CustomerID`, `t0`.`EmployeeID`, `t0`.`OrderDate`, `t0`.`OrderID0`, `t0`.`ProductID`, `t0`.`Discount`, `t0`.`Quantity`, `t0`.`UnitPrice`, `t0`.`ProductID0`, `t0`.`Discontinued`, `t0`.`ProductName`, `t0`.`SupplierID`, `t0`.`UnitPrice0`, `t0`.`UnitsInStock` + @"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `t0`.`OrderID`, `t0`.`CustomerID`, `t0`.`EmployeeID`, `t0`.`OrderDate`, `t0`.`OrderID0`, `t0`.`ProductID`, `t0`.`Discount`, `t0`.`Quantity`, `t0`.`UnitPrice`, `t0`.`ProductID0`, `t0`.`Discontinued`, `t0`.`ProductName`, `t0`.`SupplierID`, `t0`.`UnitPrice0`, `t0`.`UnitsInStock` FROM `Customers` AS `c` LEFT JOIN ( SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate`, `t`.`OrderID` AS `OrderID0`, `t`.`ProductID`, `t`.`Discount`, `t`.`Quantity`, `t`.`UnitPrice`, `t`.`ProductID0`, `t`.`Discontinued`, `t`.`ProductName`, `t`.`SupplierID`, `t`.`UnitPrice0`, `t`.`UnitsInStock` @@ -450,7 +458,8 @@ LEFT JOIN ( INNER JOIN `Products` AS `p` ON `o0`.`ProductID` = `p`.`ProductID` ) AS `t` ON `o`.`OrderID` = `t`.`OrderID` ) AS `t0` ON `c`.`CustomerID` = `t0`.`CustomerID` -ORDER BY `c`.`CustomerID`, `t0`.`OrderID`, `t0`.`OrderID0`, `t0`.`ProductID`, `t0`.`ProductID0`"); +WHERE `c`.`CustomerID` LIKE 'F%' +ORDER BY `c`.`CustomerID`, `t0`.`OrderID`, `t0`.`OrderID0`, `t0`.`ProductID`"); } public override async Task Include_collection_when_projection(bool async) @@ -561,12 +570,12 @@ ORDER BY `t1`.`CustomerID`, `t1`.`CustomerID0`, `o`.`OrderID`, `o0`.`OrderID`"); await base.Include_collection_on_join_clause_with_order_by_and_filter(async); AssertSql( - $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o`.`OrderID`, `o0`.`OrderID`, `o0`.`CustomerID`, `o0`.`EmployeeID`, `o0`.`OrderDate` -FROM `Customers` AS `c` -INNER JOIN `Orders` AS `o` ON `c`.`CustomerID` = `o`.`CustomerID` + @"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o`.`OrderID`, `o0`.`OrderID`, `o0`.`CustomerID`, `o0`.`EmployeeID`, `o0`.`OrderDate` +FROM (`Customers` AS `c` +INNER JOIN `Orders` AS `o` ON `c`.`CustomerID` = `o`.`CustomerID`) LEFT JOIN `Orders` AS `o0` ON `c`.`CustomerID` = `o0`.`CustomerID` WHERE `c`.`CustomerID` = 'ALFKI' -ORDER BY `c`.`City`, `c`.`CustomerID`, `o`.`OrderID`, `o0`.`OrderID`"); +ORDER BY `c`.`City`, `c`.`CustomerID`, `o`.`OrderID`"); } public override async Task Include_collection_on_additional_from_clause2(bool async) @@ -574,11 +583,9 @@ ORDER BY `c`.`City`, `c`.`CustomerID`, `o`.`OrderID`, `o0`.`OrderID`"); await base.Include_collection_on_additional_from_clause2(async); AssertSql( - $@"{AssertSqlHelper.Declaration("@__p_0='5'")} - -SELECT `t`.`CustomerID`, `t`.`Address`, `t`.`City`, `t`.`CompanyName`, `t`.`ContactName`, `t`.`ContactTitle`, `t`.`Country`, `t`.`Fax`, `t`.`Phone`, `t`.`PostalCode`, `t`.`Region` + $@"SELECT `t`.`CustomerID`, `t`.`Address`, `t`.`City`, `t`.`CompanyName`, `t`.`ContactName`, `t`.`ContactTitle`, `t`.`Country`, `t`.`Fax`, `t`.`Phone`, `t`.`PostalCode`, `t`.`Region` FROM ( - SELECT TOP {AssertSqlHelper.Parameter("@__p_0")} `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` + SELECT TOP 5 `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` ORDER BY `c`.`CustomerID` ) AS `t`, @@ -647,10 +654,11 @@ ORDER BY `t1`.`CustomerID`, `t1`.`CustomerID0`, `o`.`OrderID`"); await base.Include_multiple_references(async); AssertSql( - $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice`, `o0`.`OrderID`, `o0`.`CustomerID`, `o0`.`EmployeeID`, `o0`.`OrderDate`, `p`.`ProductID`, `p`.`Discontinued`, `p`.`ProductName`, `p`.`SupplierID`, `p`.`UnitPrice`, `p`.`UnitsInStock` -FROM `Order Details` AS `o` -INNER JOIN `Orders` AS `o0` ON `o`.`OrderID` = `o0`.`OrderID` -INNER JOIN `Products` AS `p` ON `o`.`ProductID` = `p`.`ProductID`"); + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice`, `o0`.`OrderID`, `o0`.`CustomerID`, `o0`.`EmployeeID`, `o0`.`OrderDate`, `p`.`ProductID`, `p`.`Discontinued`, `p`.`ProductName`, `p`.`SupplierID`, `p`.`UnitPrice`, `p`.`UnitsInStock` +FROM (`Order Details` AS `o` +INNER JOIN `Orders` AS `o0` ON `o`.`OrderID` = `o0`.`OrderID`) +INNER JOIN `Products` AS `p` ON `o`.`ProductID` = `p`.`ProductID` +WHERE (`o`.`OrderID` MOD 23) = 13"); } public override async Task Include_reference_alias_generation(bool async) @@ -658,9 +666,10 @@ INNER JOIN `Products` AS `p` ON `o`.`ProductID` = `p`.`ProductID`"); await base.Include_reference_alias_generation(async); AssertSql( - $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice`, `o0`.`OrderID`, `o0`.`CustomerID`, `o0`.`EmployeeID`, `o0`.`OrderDate` + @"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice`, `o0`.`OrderID`, `o0`.`CustomerID`, `o0`.`EmployeeID`, `o0`.`OrderDate` FROM `Order Details` AS `o` -INNER JOIN `Orders` AS `o0` ON `o`.`OrderID` = `o0`.`OrderID`"); +INNER JOIN `Orders` AS `o0` ON `o`.`OrderID` = `o0`.`OrderID` +WHERE (`o`.`OrderID` MOD 23) = 13"); } public override async Task Include_duplicate_reference(bool async) @@ -778,18 +787,18 @@ WHERE `o`.`CustomerID` = 'ALFKI'"); await base.Include_collection_dependent_already_tracked(async); AssertSql( - $@"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` + @"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Orders` AS `o` WHERE `o`.`CustomerID` = 'ALFKI'", // - $@"SELECT `t`.`CustomerID`, `t`.`Address`, `t`.`City`, `t`.`CompanyName`, `t`.`ContactName`, `t`.`ContactTitle`, `t`.`Country`, `t`.`Fax`, `t`.`Phone`, `t`.`PostalCode`, `t`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` + @"SELECT `t`.`CustomerID`, `t`.`Address`, `t`.`City`, `t`.`CompanyName`, `t`.`ContactName`, `t`.`ContactTitle`, `t`.`Country`, `t`.`Fax`, `t`.`Phone`, `t`.`PostalCode`, `t`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM ( SELECT TOP 2 `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` WHERE `c`.`CustomerID` = 'ALFKI' ) AS `t` LEFT JOIN `Orders` AS `o` ON `t`.`CustomerID` = `o`.`CustomerID` -ORDER BY `t`.`CustomerID`, `o`.`OrderID`"); +ORDER BY `t`.`CustomerID`"); } public override async Task Include_reference_dependent_already_tracked(bool async) @@ -797,13 +806,14 @@ ORDER BY `t`.`CustomerID`, `o`.`OrderID`"); await base.Include_reference_dependent_already_tracked(async); AssertSql( - $@"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` -FROM `Orders` AS `o` -WHERE `o`.`CustomerID` = 'ALFKI'", + @"SELECT TOP 2 `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` +FROM `Customers` AS `c` +WHERE `c`.`CustomerID` = 'ALFKI'", // - $@"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate`, `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` + @"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate`, `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Orders` AS `o` -LEFT JOIN `Customers` AS `c` ON `o`.`CustomerID` = `c`.`CustomerID`"); +LEFT JOIN `Customers` AS `c` ON `o`.`CustomerID` = `c`.`CustomerID` +WHERE `o`.`CustomerID` = 'ALFKI'"); } public override async Task Include_with_complex_projection(bool async) @@ -821,15 +831,15 @@ LEFT JOIN `Customers` AS `c` ON `o`.`CustomerID` = `c`.`CustomerID`"); await base.Include_with_complex_projection_does_not_change_ordering_of_projection(async); AssertSql( - $@"SELECT `c`.`CustomerID` AS `Id`, ( + @"SELECT `c`.`CustomerID` AS `Id`, ( SELECT COUNT(*) - FROM `Orders` AS `o` - WHERE `c`.`CustomerID` = `o`.`CustomerID`) AS `TotalOrders` + FROM `Orders` AS `o0` + WHERE `c`.`CustomerID` = `o0`.`CustomerID`) AS `TotalOrders` FROM `Customers` AS `c` WHERE (`c`.`ContactTitle` = 'Owner') AND (( SELECT COUNT(*) - FROM `Orders` AS `o0` - WHERE `c`.`CustomerID` = `o0`.`CustomerID`) > 2) + FROM `Orders` AS `o` + WHERE `c`.`CustomerID` = `o`.`CustomerID`) > 2) ORDER BY `c`.`CustomerID`"); } @@ -838,16 +848,14 @@ ORDER BY `c`.`CustomerID`"); await base.Include_with_take(async); AssertSql( - $@"{AssertSqlHelper.Declaration("@__p_0='10'")} - -SELECT `t`.`CustomerID`, `t`.`Address`, `t`.`City`, `t`.`CompanyName`, `t`.`ContactName`, `t`.`ContactTitle`, `t`.`Country`, `t`.`Fax`, `t`.`Phone`, `t`.`PostalCode`, `t`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` + $@"SELECT `t`.`CustomerID`, `t`.`Address`, `t`.`City`, `t`.`CompanyName`, `t`.`ContactName`, `t`.`ContactTitle`, `t`.`Country`, `t`.`Fax`, `t`.`Phone`, `t`.`PostalCode`, `t`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM ( - SELECT TOP {AssertSqlHelper.Parameter("@__p_0")} `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` + SELECT TOP 10 `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` - ORDER BY `c`.`City` DESC + ORDER BY `c`.`ContactName` DESC ) AS `t` LEFT JOIN `Orders` AS `o` ON `t`.`CustomerID` = `o`.`CustomerID` -ORDER BY `t`.`City` DESC, `t`.`CustomerID`, `o`.`OrderID`"); +ORDER BY `t`.`ContactName` DESC, `t`.`CustomerID`"); } public override async Task Include_with_skip(bool async) @@ -908,7 +916,7 @@ FROM ( WHERE `c`.`CustomerID` = `o`.`CustomerID` ORDER BY `o`.`OrderDate` DESC) AS `c` FROM `Customers` AS `c` - WHERE `c`.`CustomerID` LIKE 'W' & '%' + WHERE `c`.`CustomerID` LIKE 'W%' ORDER BY ( SELECT TOP 1 `o`.`OrderDate` FROM `Orders` AS `o` @@ -931,10 +939,8 @@ ORDER BY `t`.`c` DESC, `t`.`CustomerID`, `t0`.`OrderID`, `t0`.`OrderID0`, `t0`.` $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Customers` AS `c` LEFT JOIN `Orders` AS `o` ON `c`.`CustomerID` = `o`.`CustomerID` -ORDER BY CASE - WHEN `c`.`CustomerID` LIKE 'S' & '%' THEN 1 - ELSE 2 -END, `c`.`CustomerID`, `o`.`OrderID`"); +WHERE `c`.`CustomerID` LIKE 'F%' +ORDER BY IIF(`c`.`CustomerID` LIKE 'S%', 1, 2), `c`.`CustomerID`"); } public override async Task Include_reference_distinct_is_server_evaluated(bool async) @@ -960,10 +966,10 @@ LEFT JOIN `Customers` AS `c` ON `t`.`CustomerID` = `c`.`CustomerID`"); FROM ( SELECT DISTINCT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` - WHERE `c`.`CustomerID` LIKE 'A' & '%' + WHERE `c`.`CustomerID` LIKE 'A%' ) AS `t` LEFT JOIN `Orders` AS `o` ON `t`.`CustomerID` = `o`.`CustomerID` -ORDER BY `t`.`CustomerID`, `o`.`OrderID`"); +ORDER BY `t`.`CustomerID`"); } public override async Task Include_collection_OrderBy_object(bool async) @@ -975,7 +981,7 @@ ORDER BY `t`.`CustomerID`, `o`.`OrderID`"); FROM `Orders` AS `o` LEFT JOIN `Order Details` AS `o0` ON `o`.`OrderID` = `o0`.`OrderID` WHERE `o`.`OrderID` < 10250 -ORDER BY `o`.`OrderID`, `o0`.`OrderID`, `o0`.`ProductID`"); +ORDER BY `o`.`OrderID`, `o0`.`OrderID`"); } public override async Task Include_collection_OrderBy_empty_list_contains(bool async) @@ -987,21 +993,21 @@ ORDER BY `o`.`OrderID`, `o0`.`OrderID`, `o0`.`ProductID`"); SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE `c`.`CustomerID` LIKE 'A' & '%' +WHERE `c`.`CustomerID` LIKE 'A%' ORDER BY (SELECT 1), `c`.`CustomerID` SKIP {AssertSqlHelper.Parameter("@__p_1")}", // $@"{AssertSqlHelper.Declaration("@__p_1='1'")} -SELECT [c.Orders].`OrderID`, [c.Orders].`CustomerID`, [c.Orders].`EmployeeID`, [c.Orders].`OrderDate` -FROM `Orders` AS [c.Orders] +SELECT `c.Orders].`OrderID`, `c.Orders].`CustomerID`, `c.Orders].`EmployeeID`, `c.Orders].`OrderDate` +FROM `Orders` AS `c.Orders] INNER JOIN ( SELECT `c0`.`CustomerID`, False AS `c` FROM `Customers` AS `c0` - WHERE `c0`.`CustomerID` LIKE 'A' & '%' + WHERE `c0`.`CustomerID` LIKE 'A%' ORDER BY `c`, `c0`.`CustomerID` SKIP {AssertSqlHelper.Parameter("@__p_1")} -) AS `t` ON [c.Orders].`CustomerID` = `t`.`CustomerID` +) AS `t` ON `c.Orders].`CustomerID` = `t`.`CustomerID` ORDER BY `t`.`c`, `t`.`CustomerID`"); } @@ -1014,21 +1020,21 @@ ORDER BY `t`.`c`, `t`.`CustomerID`"); SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE `c`.`CustomerID` LIKE 'A' & '%' +WHERE `c`.`CustomerID` LIKE 'A%' ORDER BY (SELECT 1), `c`.`CustomerID` SKIP {AssertSqlHelper.Parameter("@__p_1")}", // $@"{AssertSqlHelper.Declaration("@__p_1='1'")} -SELECT [c.Orders].`OrderID`, [c.Orders].`CustomerID`, [c.Orders].`EmployeeID`, [c.Orders].`OrderDate` -FROM `Orders` AS [c.Orders] +SELECT `c.Orders].`OrderID`, `c.Orders].`CustomerID`, `c.Orders].`EmployeeID`, `c.Orders].`OrderDate` +FROM `Orders` AS `c.Orders] INNER JOIN ( SELECT `c0`.`CustomerID`, True AS `c` FROM `Customers` AS `c0` - WHERE `c0`.`CustomerID` LIKE 'A' & '%' + WHERE `c0`.`CustomerID` LIKE 'A%' ORDER BY `c`, `c0`.`CustomerID` SKIP {AssertSqlHelper.Parameter("@__p_1")} -) AS `t` ON [c.Orders].`CustomerID` = `t`.`CustomerID` +) AS `t` ON `c.Orders].`CustomerID` = `t`.`CustomerID` ORDER BY `t`.`c`, `t`.`CustomerID`"); } @@ -1043,7 +1049,7 @@ SELECT `t`.`CustomerID`, `t`.`Address`, `t`.`City`, `t`.`CompanyName`, `t`.`Cont FROM ( SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, IIF(`c`.`CustomerID` IN ('ALFKI'), 1, 0) AS `c` FROM `Customers` AS `c` - WHERE `c`.`CustomerID` LIKE 'A' & '%' + WHERE `c`.`CustomerID` LIKE 'A%' ORDER BY IIF(`c`.`CustomerID` IN ('ALFKI'), 1, 0) SKIP {AssertSqlHelper.Parameter("@__p_1")} ) AS `t` @@ -1062,7 +1068,7 @@ SELECT `t`.`CustomerID`, `t`.`Address`, `t`.`City`, `t`.`CompanyName`, `t`.`Cont FROM ( SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, IIF(`c`.`CustomerID` NOT IN ('ALFKI'), 1, 0) AS `c` FROM `Customers` AS `c` - WHERE `c`.`CustomerID` LIKE 'A' & '%' + WHERE `c`.`CustomerID` LIKE 'A%' ORDER BY IIF(`c`.`CustomerID` NOT IN ('ALFKI'), 1, 0) SKIP {AssertSqlHelper.Parameter("@__p_1")} ) AS `t` @@ -1079,7 +1085,8 @@ ORDER BY `t`.`c`, `t`.`CustomerID`, `o`.`OrderID`"); $@"SELECT IIF(`e0`.`EmployeeID` IS NOT NULL, TRUE, FALSE), `e`.`EmployeeID`, `e`.`City`, `e`.`Country`, `e`.`FirstName`, `e`.`ReportsTo`, `e`.`Title`, `e0`.`EmployeeID`, `e0`.`City`, `e0`.`Country`, `e0`.`FirstName`, `e0`.`ReportsTo`, `e0`.`Title` FROM `Employees` AS `e` LEFT JOIN `Employees` AS `e0` ON `e`.`ReportsTo` = `e0`.`EmployeeID` -WHERE (`e`.`EmployeeID` = 1) OR (`e`.`EmployeeID` = 2)"); +WHERE `e`.`EmployeeID` IN (1, 2) +ORDER BY `e`.`EmployeeID`"); } private void AssertSql(params string[] expected) diff --git a/test/EFCore.Jet.FunctionalTests/Query/NorthwindJoinQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/NorthwindJoinQueryJetTest.cs index ca1c525..44188db 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/NorthwindJoinQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/NorthwindJoinQueryJetTest.cs @@ -41,7 +41,7 @@ INNER JOIN `Orders` AS `o` ON `c`.`CustomerID` = `o`.`CustomerID`"); $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Customers` AS `c` INNER JOIN `Orders` AS `o` ON `c`.`CustomerID` = `o`.`CustomerID` -WHERE `c`.`CustomerID` LIKE 'F' & '%'"); +WHERE `c`.`CustomerID` LIKE 'F%'"); } public override async Task Join_select_many(bool isAsync) @@ -53,7 +53,7 @@ WHERE `c`.`CustomerID` LIKE 'F' & '%'"); FROM `Customers` AS `c` INNER JOIN `Orders` AS `o` ON `c`.`CustomerID` = `o`.`CustomerID`, `Employees` AS `e` -WHERE `c`.`CustomerID` LIKE 'F' & '%'"); +WHERE `c`.`CustomerID` LIKE 'F%'"); } public override async Task Client_Join_select_many(bool isAsync) @@ -207,7 +207,7 @@ WHERE `t`.`CustomerID` = 'ALFKI'"); $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Customers` AS `c` INNER JOIN `Orders` AS `o` ON (`c`.`CustomerID` = `o`.`CustomerID`) AND (`c`.`CustomerID` = `o`.`CustomerID`) -WHERE `c`.`CustomerID` LIKE 'F' & '%'"); +WHERE `c`.`CustomerID` LIKE 'F%'"); } public override async Task Join_complex_condition(bool isAsync) @@ -244,7 +244,7 @@ INNER JOIN `Customers` AS `c1` ON `c`.`CustomerID` = `c1`.`CustomerID`"); $@"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate`, `o0`.`OrderID`, `o0`.`CustomerID`, `o0`.`EmployeeID`, `o0`.`OrderDate` FROM `Orders` AS `o` INNER JOIN `Orders` AS `o0` ON `o`.`CustomerID` = `o0`.`CustomerID` -WHERE (`o`.`CustomerID` IS NOT NULL) AND (`o`.`CustomerID` LIKE 'F' & '%')"); +WHERE (`o`.`CustomerID` IS NOT NULL) AND (`o`.`CustomerID` LIKE 'F%')"); } public override async Task GroupJoin_simple(bool isAsync) @@ -255,7 +255,7 @@ WHERE (`o`.`CustomerID` IS NOT NULL) AND (`o`.`CustomerID` LIKE 'F' & '%')"); $@"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Customers` AS `c` INNER JOIN `Orders` AS `o` ON `c`.`CustomerID` = `o`.`CustomerID` -WHERE `c`.`CustomerID` LIKE 'F' & '%'"); +WHERE `c`.`CustomerID` LIKE 'F%'"); } public override async Task GroupJoin_simple2(bool isAsync) @@ -286,7 +286,7 @@ INNER JOIN `Orders` AS `o` ON `c`.`CustomerID` = `o`.`CustomerID`"); $@"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Customers` AS `c` INNER JOIN `Orders` AS `o` ON `c`.`CustomerID` = `o`.`CustomerID` -WHERE `c`.`CustomerID` LIKE 'F' & '%' +WHERE `c`.`CustomerID` LIKE 'F%' ORDER BY `c`.`City`"); } @@ -314,7 +314,7 @@ INNER JOIN ( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Customers` AS `c` LEFT JOIN `Orders` AS `o` ON `c`.`CustomerID` = `o`.`CustomerID` -WHERE `c`.`CustomerID` LIKE 'F' & '%'"); +WHERE `c`.`CustomerID` LIKE 'F%'"); } public override async Task GroupJoin_DefaultIfEmpty_multiple(bool isAsync) @@ -326,7 +326,7 @@ WHERE `c`.`CustomerID` LIKE 'F' & '%'"); FROM (`Customers` AS `c` LEFT JOIN `Orders` AS `o` ON `c`.`CustomerID` = `o`.`CustomerID`) LEFT JOIN `Orders` AS `o0` ON `c`.`CustomerID` = `o0`.`CustomerID` -WHERE `c`.`CustomerID` LIKE 'F' & '%'"); +WHERE `c`.`CustomerID` LIKE 'F%'"); } public override async Task GroupJoin_DefaultIfEmpty2(bool isAsync) @@ -339,7 +339,7 @@ FROM `Employees` AS `e` LEFT JOIN ( SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Orders` AS `o` - WHERE (`o`.`CustomerID` IS NOT NULL) AND (`o`.`CustomerID` LIKE 'F' & '%') + WHERE (`o`.`CustomerID` IS NOT NULL) AND (`o`.`CustomerID` LIKE 'F%') ) AS `t` ON `e`.`EmployeeID` = `t`.`EmployeeID`"); } @@ -451,7 +451,7 @@ LEFT JOIN ( FROM `Orders` AS `o` WHERE `o`.`OrderID` > 5 ) AS `t` ON `c`.`CustomerID` = `t`.`CustomerID` -WHERE `c`.`CustomerID` LIKE 'F' & '%'"); +WHERE `c`.`CustomerID` LIKE 'F%'"); } public override async Task GroupJoin_SelectMany_subquery_with_filter_orderby_and_DefaultIfEmpty(bool isAsync) @@ -481,7 +481,7 @@ INNER JOIN ( FROM `Orders` AS `o` ORDER BY `o`.`OrderID` ) AS `t` - WHERE `t`.`CustomerID` IS NOT NULL AND (`t`.`CustomerID` LIKE 'A' & '%') + WHERE `t`.`CustomerID` IS NOT NULL AND (`t`.`CustomerID` LIKE 'A%') ) AS `t0` ON `c`.`CustomerID` = `t0`.`CustomerID`"); } diff --git a/test/EFCore.Jet.FunctionalTests/Query/NorthwindMiscellaneousQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/NorthwindMiscellaneousQueryJetTest.cs index 38b0d9a..8d750af 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/NorthwindMiscellaneousQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/NorthwindMiscellaneousQueryJetTest.cs @@ -237,7 +237,7 @@ WHERE (`o`.`OrderID` = 10248) AND (`o`.`ProductID` = 11)"); AssertSql( $@"SELECT `c`.`CustomerID` FROM `Customers` AS `c` -WHERE False = True"); +WHERE FALSE"); } public override async Task Entity_equality_null_composite_key(bool isAsync) @@ -247,7 +247,7 @@ WHERE False = True"); AssertSql( $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` FROM `Order Details` AS `o` -WHERE False = True"); +WHERE FALSE"); } public override async Task Entity_equality_not_null(bool isAsync) @@ -314,7 +314,7 @@ WHERE ( AssertSql( $@"SELECT `c`.`CustomerID` FROM `Customers` AS `c` -WHERE False = True"); +WHERE FALSE"); } public override async Task Entity_equality_orderby(bool isAsync) @@ -886,7 +886,7 @@ ORDER BY `c`.`CustomerID`"); ELSE False END AS `hasOrders` FROM `Customers` AS `c` -WHERE `c`.`CustomerID` LIKE 'A' & '%' +WHERE `c`.`CustomerID` LIKE 'A%' ORDER BY `c`.`CustomerID`"); } @@ -907,7 +907,7 @@ ORDER BY `e`.`EmployeeID` - `e`.`EmployeeID`"); AssertSql( $@"SELECT `p`.`ProductID`, `p`.`Discontinued`, `p`.`ProductName`, `p`.`SupplierID`, `p`.`UnitPrice`, `p`.`UnitsInStock` FROM `Products` AS `p` -ORDER BY IIF(`p`.`UnitsInStock` > 0, 1, 0), `p`.`ProductID`"); +ORDER BY IIF(`p`.`UnitsInStock` > 0, TRUE, FALSE), `p`.`ProductID`"); } public override async Task OrderBy_ternary_conditions(bool isAsync) @@ -1306,7 +1306,7 @@ FROM ( AssertSql( $@"SELECT IIF(EXISTS ( SELECT 1 - FROM `Customers` AS `c`), 1, 0) + FROM `Customers` AS `c`), TRUE, FALSE) FROM (SELECT COUNT(*) FROM MSysAccessStorage)"); } @@ -1319,7 +1319,7 @@ FROM (SELECT COUNT(*) FROM MSysAccessStorage)"); WHEN EXISTS ( SELECT 1 FROM `Customers` AS `c` - WHERE `c`.`ContactName` IS NOT NULL AND (`c`.`ContactName` LIKE 'A' & '%')) THEN True + WHERE `c`.`ContactName` IS NOT NULL AND (`c`.`ContactName` LIKE 'A%')) THEN True ELSE False END"); } @@ -1334,7 +1334,7 @@ FROM `Customers` AS `c` WHERE NOT (EXISTS ( SELECT 1 FROM `Orders` AS `o` - WHERE `o`.`CustomerID` IS NOT NULL AND (`o`.`CustomerID` LIKE 'A' & '%')))"); + WHERE `o`.`CustomerID` IS NOT NULL AND (`o`.`CustomerID` LIKE 'A%')))"); } public override async Task Any_nested_negated2(bool isAsync) @@ -1347,7 +1347,7 @@ FROM `Customers` AS `c` WHERE ((`c`.`City` <> 'London') OR `c`.`City` IS NULL) AND NOT (EXISTS ( SELECT 1 FROM `Orders` AS `o` - WHERE `o`.`CustomerID` IS NOT NULL AND (`o`.`CustomerID` LIKE 'A' & '%')))"); + WHERE `o`.`CustomerID` IS NOT NULL AND (`o`.`CustomerID` LIKE 'A%')))"); } public override async Task Any_nested_negated3(bool isAsync) @@ -1360,7 +1360,7 @@ FROM `Customers` AS `c` WHERE NOT (EXISTS ( SELECT 1 FROM `Orders` AS `o` - WHERE `o`.`CustomerID` IS NOT NULL AND (`o`.`CustomerID` LIKE 'A' & '%'))) AND ((`c`.`City` <> 'London') OR `c`.`City` IS NULL)"); + WHERE `o`.`CustomerID` IS NOT NULL AND (`o`.`CustomerID` LIKE 'A%'))) AND ((`c`.`City` <> 'London') OR `c`.`City` IS NULL)"); } public override async Task Any_nested(bool isAsync) @@ -1373,7 +1373,7 @@ FROM `Customers` AS `c` WHERE EXISTS ( SELECT 1 FROM `Orders` AS `o` - WHERE `o`.`CustomerID` IS NOT NULL AND (`o`.`CustomerID` LIKE 'A' & '%'))"); + WHERE `o`.`CustomerID` IS NOT NULL AND (`o`.`CustomerID` LIKE 'A%'))"); } public override async Task Any_nested2(bool isAsync) @@ -1386,7 +1386,7 @@ FROM `Customers` AS `c` WHERE ((`c`.`City` <> 'London') OR `c`.`City` IS NULL) AND EXISTS ( SELECT 1 FROM `Orders` AS `o` - WHERE `o`.`CustomerID` IS NOT NULL AND (`o`.`CustomerID` LIKE 'A' & '%'))"); + WHERE `o`.`CustomerID` IS NOT NULL AND (`o`.`CustomerID` LIKE 'A%'))"); } public override async Task Any_nested3(bool isAsync) @@ -1399,7 +1399,7 @@ FROM `Customers` AS `c` WHERE EXISTS ( SELECT 1 FROM `Orders` AS `o` - WHERE `o`.`CustomerID` IS NOT NULL AND (`o`.`CustomerID` LIKE 'A' & '%')) AND ((`c`.`City` <> 'London') OR `c`.`City` IS NULL)"); + WHERE `o`.`CustomerID` IS NOT NULL AND (`o`.`CustomerID` LIKE 'A%')) AND ((`c`.`City` <> 'London') OR `c`.`City` IS NULL)"); } public override void Any_with_multiple_conditions_still_uses_exists() @@ -1425,7 +1425,7 @@ WHERE (`c`.`City` = 'London') AND EXISTS ( // WHEN NOT EXISTS ( // SELECT 1 // FROM `Customers` AS `c` -// WHERE NOT (`c`.`ContactName` LIKE 'A' & '%')) +// WHERE NOT (`c`.`ContactName` LIKE 'A%')) // THEN True ELSE False //END"); } @@ -1994,7 +1994,7 @@ SELECT CASE ORDER BY `c`.`CustomerID` SKIP {AssertSqlHelper.Parameter("@__p_0")} FETCH NEXT {AssertSqlHelper.Parameter("@__p_1")} ROWS ONLY ) AS `t` - WHERE NOT (`t`.`CustomerID` LIKE 'B' & '%')) THEN True + WHERE NOT (`t`.`CustomerID` LIKE 'B%')) THEN True ELSE False END"); } @@ -2014,7 +2014,7 @@ SELECT CASE FROM `Customers` AS `c` ORDER BY `c`.`CustomerID` ) AS `t` - WHERE NOT (`t`.`CustomerID` LIKE 'A' & '%')) THEN True + WHERE NOT (`t`.`CustomerID` LIKE 'A%')) THEN True ELSE False END"); } @@ -2037,7 +2037,7 @@ SELECT CASE ORDER BY `c`.`CustomerID` SKIP {AssertSqlHelper.Parameter("@__p_0")} FETCH NEXT {AssertSqlHelper.Parameter("@__p_1")} ROWS ONLY ) AS `t` - WHERE `t`.`CustomerID` LIKE 'C' & '%') THEN True + WHERE `t`.`CustomerID` LIKE 'C%') THEN True ELSE False END"); } @@ -2057,7 +2057,7 @@ SELECT CASE FROM `Customers` AS `c` ORDER BY `c`.`CustomerID` ) AS `t` - WHERE `t`.`CustomerID` LIKE 'B' & '%') THEN True + WHERE `t`.`CustomerID` LIKE 'B%') THEN True ELSE False END"); } @@ -2165,7 +2165,7 @@ ORDER BY `e`.`Title`, `e`.`EmployeeID`"); AssertSql( $@"SELECT `c`.`City` FROM `Customers` AS `c` -WHERE `c`.`CustomerID` LIKE 'A' & '%' +WHERE `c`.`CustomerID` LIKE 'A%' ORDER BY `c`.`Country`, `c`.`City`"); } @@ -2189,7 +2189,7 @@ END"); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE `c`.`CustomerID` LIKE 'A' & '%' +WHERE `c`.`CustomerID` LIKE 'A%' ORDER BY CASE WHEN EXISTS ( SELECT 1 @@ -2294,7 +2294,7 @@ WHERE `o`.`OrderID` < 10300"); FROM `Orders` AS `o` WHERE `c`.`CustomerID` = `o`.`CustomerID`) AS `Count` FROM `Customers` AS `c` -WHERE `c`.`CustomerID` LIKE 'A' & '%'"); +WHERE `c`.`CustomerID` LIKE 'A%'"); } public override async Task Select_DTO_with_member_init_distinct_in_subquery_translated_to_server(bool isAsync) @@ -2338,7 +2338,7 @@ INNER JOIN `Customers` AS `c` ON `t`.`CustomerID` = `c`.`CustomerID`"); // FROM `Orders` AS `o` // WHERE `o`.`OrderID` < 10300 //) AS `t` -//WHERE `c`.`CustomerID` LIKE 'A' & '%'"); +//WHERE `c`.`CustomerID` LIKE 'A%'"); } public override async Task Select_correlated_subquery_filtered(bool isAsync) @@ -2348,7 +2348,7 @@ INNER JOIN `Customers` AS `c` ON `t`.`CustomerID` = `c`.`CustomerID`"); AssertSql( $@"SELECT `c`.`CustomerID` FROM `Customers` AS `c` -WHERE `c`.`CustomerID` LIKE 'A' & '%' +WHERE `c`.`CustomerID` LIKE 'A%' ORDER BY `c`.`CustomerID`", // $@"{AssertSqlHelper.Declaration("@_outer_CustomerID='ALFKI' (Size = 5)")} @@ -2441,7 +2441,7 @@ FROM `Customers` AS `c`, AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -ORDER BY IIf(`c`.`Region` IS NULL, NULL, `c`.`Region`), `c`.`CustomerID`"); +ORDER BY IIF(`c`.`Region` IS NULL, NULL, `c`.`Region`), `c`.`CustomerID`"); } public override async Task Select_null_coalesce_operator(bool isAsync) @@ -2450,7 +2450,7 @@ ORDER BY IIf(`c`.`Region` IS NULL, NULL, `c`.`Region`), `c`.`CustomerID`"); // issue #16038 // AssertSql( -// $@"SELECT `c`.`CustomerID`, `c`.`CompanyName`, IIf(`c`.`Region` IS NULL, NULL, `c`.`Region`) AS `Region` +// $@"SELECT `c`.`CustomerID`, `c`.`CompanyName`, IIF(`c`.`Region` IS NULL, NULL, `c`.`Region`) AS `Region` //FROM `Customers` AS `c` //ORDER BY `Region`, `c`.`CustomerID`"); } @@ -2516,7 +2516,7 @@ ORDER BY (`c`.`Region` = 'ASK') AND `c`.`Region` IS NOT NULL"); await base.Projection_null_coalesce_operator(isAsync); AssertSql( - $@"SELECT `c`.`CustomerID`, `c`.`CompanyName`, IIf(`c`.`Region` IS NULL, NULL, `c`.`Region`) AS `Region` + $@"SELECT `c`.`CustomerID`, `c`.`CompanyName`, IIF(`c`.`Region` IS NULL, 'ZZ', `c`.`Region`) AS `Region` FROM `Customers` AS `c`"); } @@ -2527,7 +2527,7 @@ FROM `Customers` AS `c`"); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE IIf(`c`.`CompanyName` IS NULL, NULL, `c`.`CompanyName`) = 'The Big Cheese'"); +WHERE IIF(`c`.`CompanyName` IS NULL, NULL, `c`.`CompanyName`) = 'The Big Cheese'"); } public override async Task Take_skip_null_coalesce_operator(bool isAsync) @@ -2543,9 +2543,9 @@ SELECT DISTINCT `t0`.`CustomerID`, `t0`.`Address`, `t0`.`City`, `t0`.`CompanyNam FROM ( SELECT `t`.`CustomerID`, `t`.`Address`, `t`.`City`, `t`.`CompanyName`, `t`.`ContactName`, `t`.`ContactTitle`, `t`.`Country`, `t`.`Fax`, `t`.`Phone`, `t`.`PostalCode`, `t`.`Region`, `t`.`c` FROM ( - SELECT TOP {AssertSqlHelper.Parameter("@__p_0")} `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, IIf(`c`.`Region` IS NULL, NULL, `c`.`Region`) AS `c` + SELECT TOP {AssertSqlHelper.Parameter("@__p_0")} `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, IIF(`c`.`Region` IS NULL, NULL, `c`.`Region`) AS `c` FROM `Customers` AS `c` - ORDER BY IIf(`c`.`Region` IS NULL, NULL, `c`.`Region`) + ORDER BY IIF(`c`.`Region` IS NULL, NULL, `c`.`Region`) ) AS `t` ORDER BY `t`.`c` SKIP {AssertSqlHelper.Parameter("@__p_1")} @@ -2560,7 +2560,7 @@ FROM ( // AssertSql( // $@"{AssertSqlHelper.Declaration("@__p_0='5'")} -//SELECT TOP @__p_0 `c`.`CustomerID`, `c`.`CompanyName`, IIf(`c`.`Region` IS NULL, NULL, `c`.`Region`) AS `Region` +//SELECT TOP @__p_0 `c`.`CustomerID`, `c`.`CompanyName`, IIF(`c`.`Region` IS NULL, NULL, `c`.`Region`) AS `Region` //FROM `Customers` AS `c` //ORDER BY `Region`"); } @@ -2576,9 +2576,9 @@ FROM ( SELECT `t`.`CustomerID`, `t`.`CompanyName`, `t`.`c` AS `Region` FROM ( - SELECT TOP {AssertSqlHelper.Parameter("@__p_0")} `c`.`CustomerID`, `c`.`CompanyName`, IIf(`c`.`Region` IS NULL, NULL, `c`.`Region`) AS `c` + SELECT TOP {AssertSqlHelper.Parameter("@__p_0")} `c`.`CustomerID`, `c`.`CompanyName`, IIF(`c`.`Region` IS NULL, NULL, `c`.`Region`) AS `c` FROM `Customers` AS `c` - ORDER BY IIf(`c`.`Region` IS NULL, NULL, `c`.`Region`) + ORDER BY IIF(`c`.`Region` IS NULL, NULL, `c`.`Region`) ) AS `t` ORDER BY `t`.`c` SKIP {AssertSqlHelper.Parameter("@__p_1")}"); @@ -2595,9 +2595,9 @@ SKIP {AssertSqlHelper.Parameter("@__p_1")}"); SELECT `t`.`CustomerID`, `t`.`CompanyName`, `t`.`Region` FROM ( - SELECT TOP {AssertSqlHelper.Parameter("@__p_0")} `c`.`CustomerID`, `c`.`CompanyName`, `c`.`Region`, IIf(`c`.`Region` IS NULL, NULL, `c`.`Region`) AS `c` + SELECT TOP {AssertSqlHelper.Parameter("@__p_0")} `c`.`CustomerID`, `c`.`CompanyName`, `c`.`Region`, IIF(`c`.`Region` IS NULL, NULL, `c`.`Region`) AS `c` FROM `Customers` AS `c` - ORDER BY IIf(`c`.`Region` IS NULL, NULL, `c`.`Region`) + ORDER BY IIF(`c`.`Region` IS NULL, NULL, `c`.`Region`) ) AS `t` ORDER BY `t`.`c` SKIP {AssertSqlHelper.Parameter("@__p_1")}"); @@ -2614,9 +2614,9 @@ SKIP {AssertSqlHelper.Parameter("@__p_1")}"); SELECT `t`.`CustomerID`, `t`.`Address`, `t`.`City`, `t`.`CompanyName`, `t`.`ContactName`, `t`.`ContactTitle`, `t`.`Country`, `t`.`Fax`, `t`.`Phone`, `t`.`PostalCode`, `t`.`Region` FROM ( - SELECT TOP {AssertSqlHelper.Parameter("@__p_0")} `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, IIf(`c`.`Region` IS NULL, NULL, `c`.`Region`) AS `c` + SELECT TOP {AssertSqlHelper.Parameter("@__p_0")} `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, IIF(`c`.`Region` IS NULL, NULL, `c`.`Region`) AS `c` FROM `Customers` AS `c` - ORDER BY IIf(`c`.`Region` IS NULL, NULL, `c`.`Region`) + ORDER BY IIF(`c`.`Region` IS NULL, NULL, `c`.`Region`) ) AS `t` ORDER BY `t`.`c` SKIP {AssertSqlHelper.Parameter("@__p_1")}"); @@ -2629,7 +2629,7 @@ SKIP {AssertSqlHelper.Parameter("@__p_1")}"); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -ORDER BY IIf(`c`.`Region` IS NULL, NULL, `c`.`Region`)"); +ORDER BY IIF(`c`.`Region` IS NULL, 'ZZ', `c`.`Region`)"); } public override async Task DateTime_parse_is_inlined(bool isAsync) @@ -2720,7 +2720,7 @@ LEFT JOIN `Customers` AS `c` ON `o`.`CustomerID` = `c`.`CustomerID`"); await base.Select_bitwise_or(async); AssertSql( - $@"SELECT `c`.`CustomerID`, IIF(`c`.`CustomerID` = 'ALFKI', 1, 0) BOR IIF(`c`.`CustomerID` = 'ANATR', 1, 0) AS `Value` + $@"SELECT `c`.`CustomerID`, IIF(`c`.`CustomerID` = 'ALFKI', TRUE, FALSE) BOR IIF(`c`.`CustomerID` = 'ANATR', TRUE, FALSE) AS `Value` FROM `Customers` AS `c` ORDER BY `c`.`CustomerID`"); } @@ -2730,7 +2730,7 @@ ORDER BY `c`.`CustomerID`"); await base.Select_bitwise_or_multiple(async); AssertSql( - $@"SELECT `c`.`CustomerID`, (IIF(`c`.`CustomerID` = 'ALFKI', 1, 0) BOR IIF(`c`.`CustomerID` = 'ANATR', 1, 0)) BOR IIF(`c`.`CustomerID` = 'ANTON', 1, 0) AS `Value` + $@"SELECT `c`.`CustomerID`, (IIF(`c`.`CustomerID` = 'ALFKI', TRUE, FALSE) BOR IIF(`c`.`CustomerID` = 'ANATR', TRUE, FALSE)) BOR IIF(`c`.`CustomerID` = 'ANTON', TRUE, FALSE) AS `Value` FROM `Customers` AS `c` ORDER BY `c`.`CustomerID`"); } @@ -2740,7 +2740,7 @@ ORDER BY `c`.`CustomerID`"); await base.Select_bitwise_and(async); AssertSql( - $@"SELECT `c`.`CustomerID`, IIF(`c`.`CustomerID` = 'ALFKI', 1, 0) BAND IIF(`c`.`CustomerID` = 'ANATR', 1, 0) AS `Value` + $@"SELECT `c`.`CustomerID`, IIF(`c`.`CustomerID` = 'ALFKI', TRUE, FALSE) BAND IIF(`c`.`CustomerID` = 'ANATR', TRUE, FALSE) AS `Value` FROM `Customers` AS `c` ORDER BY `c`.`CustomerID`"); } @@ -2750,7 +2750,7 @@ ORDER BY `c`.`CustomerID`"); await base.Select_bitwise_and_or(async); AssertSql( - $@"SELECT `c`.`CustomerID`, (IIF(`c`.`CustomerID` = 'ALFKI', 1, 0) BAND IIF(`c`.`CustomerID` = 'ANATR', 1, 0)) BOR IIF(`c`.`CustomerID` = 'ANTON', 1, 0) AS `Value` + $@"SELECT `c`.`CustomerID`, (IIF(`c`.`CustomerID` = 'ALFKI', TRUE, FALSE) BAND IIF(`c`.`CustomerID` = 'ANATR', TRUE, FALSE)) BOR IIF(`c`.`CustomerID` = 'ANTON', TRUE, FALSE) AS `Value` FROM `Customers` AS `c` ORDER BY `c`.`CustomerID`"); } @@ -2762,7 +2762,7 @@ ORDER BY `c`.`CustomerID`"); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE ((IIF(`c`.`CustomerID` = 'ALFKI', 1, 0) BOR IIF(`c`.`CustomerID` = 'ANATR', 1, 0)) = True) OR (`c`.`CustomerID` = 'ANTON')"); +WHERE ((IIF(`c`.`CustomerID` = 'ALFKI', TRUE, FALSE) BOR IIF(`c`.`CustomerID` = 'ANATR', TRUE, FALSE)) = True) OR (`c`.`CustomerID` = 'ANTON')"); } public override async Task Where_bitwise_and_with_logical_and(bool isAsync) @@ -2772,7 +2772,7 @@ WHERE ((IIF(`c`.`CustomerID` = 'ALFKI', 1, 0) BOR IIF(`c`.`CustomerID` = 'ANATR' AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE ((IIF(`c`.`CustomerID` = 'ALFKI', 1, 0) BAND IIF(`c`.`CustomerID` = 'ANATR', 1, 0)) = True) AND (`c`.`CustomerID` = 'ANTON')"); +WHERE ((IIF(`c`.`CustomerID` = 'ALFKI', TRUE, FALSE) BAND IIF(`c`.`CustomerID` = 'ANATR', TRUE, FALSE)) = True) AND (`c`.`CustomerID` = 'ANTON')"); } public override async Task Where_bitwise_or_with_logical_and(bool isAsync) @@ -2782,7 +2782,7 @@ WHERE ((IIF(`c`.`CustomerID` = 'ALFKI', 1, 0) BAND IIF(`c`.`CustomerID` = 'ANATR AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE ((IIF(`c`.`CustomerID` = 'ALFKI', 1, 0) BOR IIF(`c`.`CustomerID` = 'ANATR', 1, 0)) = True) AND (`c`.`Country` = 'Germany')"); +WHERE ((IIF(`c`.`CustomerID` = 'ALFKI', TRUE, FALSE) BOR IIF(`c`.`CustomerID` = 'ANATR', TRUE, FALSE)) = True) AND (`c`.`Country` = 'Germany')"); } public override async Task Where_bitwise_and_with_logical_or(bool isAsync) @@ -2792,7 +2792,7 @@ WHERE ((IIF(`c`.`CustomerID` = 'ALFKI', 1, 0) BOR IIF(`c`.`CustomerID` = 'ANATR' AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE ((IIF(`c`.`CustomerID` = 'ALFKI', 1, 0) BAND IIF(`c`.`CustomerID` = 'ANATR', 1, 0)) = True) OR (`c`.`CustomerID` = 'ANTON')"); +WHERE ((IIF(`c`.`CustomerID` = 'ALFKI', TRUE, FALSE) BAND IIF(`c`.`CustomerID` = 'ANATR', TRUE, FALSE)) = True) OR (`c`.`CustomerID` = 'ANTON')"); } public override async Task Select_bitwise_or_with_logical_or(bool async) @@ -2800,7 +2800,7 @@ WHERE ((IIF(`c`.`CustomerID` = 'ALFKI', 1, 0) BAND IIF(`c`.`CustomerID` = 'ANATR await base.Select_bitwise_or_with_logical_or(async); AssertSql( - $@"SELECT `c`.`CustomerID`, IIF(((IIF(`c`.`CustomerID` = 'ALFKI', 1, 0) BOR IIF(`c`.`CustomerID` = 'ANATR', 1, 0)) = True) OR (`c`.`CustomerID` = 'ANTON'), 1, 0) AS `Value` + $@"SELECT `c`.`CustomerID`, IIF(((IIF(`c`.`CustomerID` = 'ALFKI', TRUE, FALSE) BOR IIF(`c`.`CustomerID` = 'ANATR', TRUE, FALSE)) = True) OR (`c`.`CustomerID` = 'ANTON'), TRUE, FALSE) AS `Value` FROM `Customers` AS `c` ORDER BY `c`.`CustomerID`"); } @@ -2810,7 +2810,7 @@ ORDER BY `c`.`CustomerID`"); await base.Select_bitwise_and_with_logical_and(async); AssertSql( - $@"SELECT `c`.`CustomerID`, IIF(((IIF(`c`.`CustomerID` = 'ALFKI', 1, 0) BAND IIF(`c`.`CustomerID` = 'ANATR', 1, 0)) = True) AND (`c`.`CustomerID` = 'ANTON'), 1, 0) AS `Value` + $@"SELECT `c`.`CustomerID`, IIF(((IIF(`c`.`CustomerID` = 'ALFKI', TRUE, FALSE) BAND IIF(`c`.`CustomerID` = 'ANATR', TRUE, FALSE)) = True) AND (`c`.`CustomerID` = 'ANTON'), TRUE, FALSE) AS `Value` FROM `Customers` AS `c` ORDER BY `c`.`CustomerID`"); } @@ -2860,7 +2860,7 @@ WHERE (`o`.`OrderID` < 10400) AND ((`o`.`OrderDate` IS NOT NULL AND (DATEPART('m // $@"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Orders` AS `o` -WHERE False = True"); +WHERE FALSE"); } public override async Task Parameter_extraction_short_circuits_3(bool isAsync) @@ -3055,7 +3055,7 @@ WHERE `o`.`OrderDate` IS NOT NULL"); AssertSql( $@"{AssertSqlHelper.Declaration("@__millisecondsPerDay_0='86400000'")} -SELECT DATEADD(millisecond, IIf(CAST((CAST(DATEPART(millisecond, `o`.`OrderDate`) AS bigint) MOD {AssertSqlHelper.Parameter("@__millisecondsPerDay_0")}) IS NULL, NULL, CDBL(CAST((CAST(DATEPART(millisecond, `o`.`OrderDate`) AS bigint) MOD 1{AssertSqlHelper.Parameter("@__millisecondsPerDay_0")}))) AS int), DATEADD('d', IIf(CAST((CAST(DATEPART(millisecond, `o`.`OrderDate`) AS bigint) / {AssertSqlHelper.Parameter("@__millisecondsPerDay_0")}) IS NULL, NULL, CDBL(CAST((CAST(DATEPART(millisecond, `o`.`OrderDate`) AS bigint) / {AssertSqlHelper.Parameter("@__millisecondsPerDay_0")}))) AS int), `o`.`OrderDate`)) AS `OrderDate` +SELECT DATEADD(millisecond, IIF(CAST((CAST(DATEPART(millisecond, `o`.`OrderDate`) AS bigint) MOD {AssertSqlHelper.Parameter("@__millisecondsPerDay_0")}) IS NULL, NULL, CDBL(CAST((CAST(DATEPART(millisecond, `o`.`OrderDate`) AS bigint) MOD 1{AssertSqlHelper.Parameter("@__millisecondsPerDay_0")}))) AS int), DATEADD('d', IIF(CAST((CAST(DATEPART(millisecond, `o`.`OrderDate`) AS bigint) / {AssertSqlHelper.Parameter("@__millisecondsPerDay_0")}) IS NULL, NULL, CDBL(CAST((CAST(DATEPART(millisecond, `o`.`OrderDate`) AS bigint) / {AssertSqlHelper.Parameter("@__millisecondsPerDay_0")}))) AS int), `o`.`OrderDate`)) AS `OrderDate` FROM `Orders` AS `o` WHERE `o`.`OrderDate` IS NOT NULL"); } @@ -3288,9 +3288,9 @@ FROM ( SELECT DISTINCT `t`.`ProductID`, `t`.`Discontinued`, `t`.`ProductName`, `t`.`SupplierID`, `t`.`UnitPrice`, `t`.`UnitsInStock` FROM ( - SELECT TOP {AssertSqlHelper.Parameter("@__p_0")} `p`.`ProductID`, `p`.`Discontinued`, `p`.`ProductName`, `p`.`SupplierID`, `p`.`UnitPrice`, `p`.`UnitsInStock`, IIf(`p`.`UnitPrice` IS NULL, NULL, `p`.`UnitPrice`) AS `c` + SELECT TOP {AssertSqlHelper.Parameter("@__p_0")} `p`.`ProductID`, `p`.`Discontinued`, `p`.`ProductName`, `p`.`SupplierID`, `p`.`UnitPrice`, `p`.`UnitsInStock`, IIF(`p`.`UnitPrice` IS NULL, NULL, `p`.`UnitPrice`) AS `c` FROM `Products` AS `p` - ORDER BY IIf(`p`.`UnitPrice` IS NULL, NULL, `p`.`UnitPrice`) + ORDER BY IIF(`p`.`UnitPrice` IS NULL, NULL, `p`.`UnitPrice`) ) AS `t`"); } @@ -3305,9 +3305,9 @@ FROM ( SELECT DISTINCT `t`.`ProductID`, `t`.`Discontinued`, `t`.`ProductName`, `t`.`SupplierID`, `t`.`UnitPrice`, `t`.`UnitsInStock` FROM ( - SELECT `p`.`ProductID`, `p`.`Discontinued`, `p`.`ProductName`, `p`.`SupplierID`, `p`.`UnitPrice`, `p`.`UnitsInStock`, IIf(`p`.`UnitPrice` IS NULL, NULL, `p`.`UnitPrice`) AS `c` + SELECT `p`.`ProductID`, `p`.`Discontinued`, `p`.`ProductName`, `p`.`SupplierID`, `p`.`UnitPrice`, `p`.`UnitsInStock`, IIF(`p`.`UnitPrice` IS NULL, NULL, `p`.`UnitPrice`) AS `c` FROM `Products` AS `p` - ORDER BY IIf(`p`.`UnitPrice` IS NULL, NULL, `p`.`UnitPrice`) + ORDER BY IIF(`p`.`UnitPrice` IS NULL, NULL, `p`.`UnitPrice`) SKIP {AssertSqlHelper.Parameter("@__p_0")} FETCH NEXT {AssertSqlHelper.Parameter("@__p_1")} ROWS ONLY ) AS `t`"); } @@ -3323,9 +3323,9 @@ FROM ( SELECT DISTINCT TOP {AssertSqlHelper.Parameter("@__p_0")} `t`.`ProductID`, `t`.`Discontinued`, `t`.`ProductName`, `t`.`SupplierID`, `t`.`UnitPrice`, `t`.`UnitsInStock` FROM ( - SELECT `p`.`ProductID`, `p`.`Discontinued`, `p`.`ProductName`, `p`.`SupplierID`, `p`.`UnitPrice`, `p`.`UnitsInStock`, IIf(`p`.`UnitPrice` IS NULL, NULL, `p`.`UnitPrice`) AS `c` + SELECT `p`.`ProductID`, `p`.`Discontinued`, `p`.`ProductName`, `p`.`SupplierID`, `p`.`UnitPrice`, `p`.`UnitsInStock`, IIF(`p`.`UnitPrice` IS NULL, NULL, `p`.`UnitPrice`) AS `c` FROM `Products` AS `p` - ORDER BY IIf(`p`.`UnitPrice` IS NULL, NULL, `p`.`UnitPrice`) + ORDER BY IIF(`p`.`UnitPrice` IS NULL, NULL, `p`.`UnitPrice`) SKIP {AssertSqlHelper.Parameter("@__p_0")} FETCH NEXT {AssertSqlHelper.Parameter("@__p_1")} ROWS ONLY ) AS `t`"); } @@ -3506,7 +3506,7 @@ FROM ( SELECT DISTINCT `c`.`CustomerID` FROM `Customers` AS `c` ) AS `t` -WHERE `t`.`CustomerID` LIKE 'A' & '%'"); +WHERE `t`.`CustomerID` LIKE 'A%'"); } public override async Task Anonymous_complex_distinct_where(bool isAsync) @@ -3542,7 +3542,7 @@ FROM ( SELECT DISTINCT `c`.`CustomerID` + `c`.`City` AS `c` FROM `Customers` AS `c` ) AS `t` -WHERE `t`.`c` IS NOT NULL AND (`t`.`c` LIKE 'A' & '%')"); +WHERE `t`.`c` IS NOT NULL AND (`t`.`c` LIKE 'A%')"); } public override async Task Anonymous_complex_orderby(bool isAsync) @@ -3610,7 +3610,7 @@ FROM ( SELECT DISTINCT `c`.`CustomerID` FROM `Customers` AS `c` ) AS `t` -WHERE `t`.`CustomerID` LIKE 'A' & '%'"); +WHERE `t`.`CustomerID` LIKE 'A%'"); } public override async Task DTO_complex_distinct_where(bool isAsync) @@ -3646,7 +3646,7 @@ FROM ( SELECT DISTINCT `c`.`CustomerID` + `c`.`City` AS `c` FROM `Customers` AS `c` ) AS `t` -WHERE `t`.`c` IS NOT NULL AND (`t`.`c` LIKE 'A' & '%')"); +WHERE `t`.`c` IS NOT NULL AND (`t`.`c` LIKE 'A%')"); } public override async Task DTO_complex_orderby(bool isAsync) @@ -3748,7 +3748,7 @@ WHERE ( AssertSql( $@"{AssertSqlHelper.Declaration("@__p_0='10'")} -SELECT AVG(IIf(`t`.`OrderID` IS NULL, NULL, CDBL(`t`.`OrderID`))) +SELECT AVG(CDBL(`t`.`OrderID`)) FROM ( SELECT TOP {AssertSqlHelper.Parameter("@__p_0")} `o`.`OrderID` FROM `Orders` AS `o` @@ -3866,7 +3866,7 @@ FROM ( AssertSql( $@"{AssertSqlHelper.Declaration("@__p_0='10'")} -SELECT AVG(IIf(`t`.`OrderID` IS NULL, NULL, CDBL(`t`.`OrderID`))) +SELECT AVG(IIF(`t`.`OrderID` IS NULL, NULL, CDBL(`t`.`OrderID`))) FROM ( SELECT `o`.`OrderID` FROM `Orders` AS `o` @@ -3992,7 +3992,7 @@ FROM ( await base.Select_distinct_average(isAsync); AssertSql( - $@"SELECT AVG(IIf(`t`.`OrderID` IS NULL, NULL, CDBL(`t`.`OrderID`))) + $@"SELECT AVG(CDBL(`t`.`OrderID`)) FROM ( SELECT DISTINCT `o`.`OrderID` FROM `Orders` AS `o` @@ -4091,7 +4091,7 @@ ORDER BY `c`.`CustomerID`"); $@"SELECT `c`.`CustomerID` FROM `Customers` AS `c`, `Orders` AS `o` -WHERE False = True"); +WHERE FALSE"); } public override async Task Comparing_entity_to_null_using_Equals(bool isAsync) @@ -4101,7 +4101,7 @@ WHERE False = True"); AssertSql( $@"SELECT `c`.`CustomerID` FROM `Customers` AS `c` -WHERE `c`.`CustomerID` LIKE 'A' & '%' +WHERE `c`.`CustomerID` LIKE 'A%' ORDER BY `c`.`CustomerID`"); } @@ -4116,7 +4116,7 @@ FROM `Orders` AS `o`, `Orders` AS `o0` LEFT JOIN `Customers` AS `c` ON `o`.`CustomerID` = `c`.`CustomerID` LEFT JOIN `Customers` AS `c0` ON `o0`.`CustomerID` = `c0`.`CustomerID` -WHERE (`o`.`CustomerID` IS NOT NULL AND (`o`.`CustomerID` LIKE 'A' & '%')) AND ((`c`.`CustomerID` = `c0`.`CustomerID`) OR (`c`.`CustomerID` IS NULL AND `c0`.`CustomerID` IS NULL)) +WHERE (`o`.`CustomerID` IS NOT NULL AND (`o`.`CustomerID` LIKE 'A%')) AND ((`c`.`CustomerID` = `c0`.`CustomerID`) OR (`c`.`CustomerID` IS NULL AND `c0`.`CustomerID` IS NULL)) ORDER BY `o`.`OrderID`, `o0`.`OrderID`"); } @@ -4130,7 +4130,7 @@ FROM `Orders` AS `o`, `Orders` AS `o0` LEFT JOIN `Customers` AS `c` ON `o`.`CustomerID` = `c`.`CustomerID` LEFT JOIN `Customers` AS `c0` ON `o0`.`CustomerID` = `c0`.`CustomerID` -WHERE (`o`.`CustomerID` IS NOT NULL AND (`o`.`CustomerID` LIKE 'A' & '%')) AND ((`c`.`CustomerID` = `c0`.`CustomerID`) OR (`c`.`CustomerID` IS NULL AND `c0`.`CustomerID` IS NULL)) +WHERE (`o`.`CustomerID` IS NOT NULL AND (`o`.`CustomerID` LIKE 'A%')) AND ((`c`.`CustomerID` = `c0`.`CustomerID`) OR (`c`.`CustomerID` IS NULL AND `c0`.`CustomerID` IS NULL)) ORDER BY `o`.`OrderID`, `o0`.`OrderID`"); } @@ -4142,7 +4142,7 @@ ORDER BY `o`.`OrderID`, `o0`.`OrderID`"); $@"SELECT `c`.`CustomerID` AS `Id1`, `o`.`OrderID` AS `Id2` FROM `Customers` AS `c`, `Orders` AS `o` -WHERE False = True"); +WHERE FALSE"); } public override async Task Comparing_non_matching_collection_navigations_using_Equals(bool isAsync) @@ -4153,7 +4153,7 @@ WHERE False = True"); $@"SELECT `c`.`CustomerID` AS `Id1`, `o`.`OrderID` AS `Id2` FROM `Customers` AS `c`, `Orders` AS `o` -WHERE False = True"); +WHERE FALSE"); } public override async Task Comparing_collection_navigation_to_null(bool isAsync) @@ -4187,7 +4187,7 @@ ORDER BY `o`.`OrderID`, `o`.`ProductID`"); AssertSql( $@"SELECT `c`.`CustomerID` FROM `Customers` AS `c` -WHERE `c`.`CustomerID` LIKE 'A' & '%'"); +WHERE `c`.`CustomerID` LIKE 'A%'"); } public override async Task Compare_two_collection_navigations_with_different_query_sources(bool isAsync) @@ -4233,7 +4233,7 @@ WHERE ((`c`.`CustomerID` = 'ALFKI') AND (`c0`.`CustomerID` = 'ALFKI')) AND (`c`. AssertSql( $@"SELECT `c`.`CustomerID` FROM `Customers` AS `c` -WHERE `c`.`CustomerID` LIKE 'A' & '%' +WHERE `c`.`CustomerID` LIKE 'A%' ORDER BY `c`.`CustomerID`"); } @@ -4244,7 +4244,7 @@ ORDER BY `c`.`CustomerID`"); AssertSql( $@"SELECT `c`.`CustomerID` FROM `Customers` AS `c` -WHERE `c`.`CustomerID` LIKE 'A' & '%' +WHERE `c`.`CustomerID` LIKE 'A%' ORDER BY `c`.`CustomerID` DESC"); } @@ -4398,7 +4398,7 @@ WHERE EXISTS ( WHERE `c`.`CustomerID` = `o`.`CustomerID` ORDER BY `o`.`OrderDate`) AS `OrderDate` FROM `Customers` AS `c` -WHERE (`c`.`CustomerID` LIKE 'A' & '%') AND ( +WHERE (`c`.`CustomerID` LIKE 'A%') AND ( SELECT TOP 1 `o0`.`OrderID` FROM `Orders` AS `o0` WHERE `c`.`CustomerID` = `o0`.`CustomerID` @@ -4416,7 +4416,7 @@ WHERE (`c`.`CustomerID` LIKE 'A' & '%') AND ( WHERE `c`.`CustomerID` = `o`.`CustomerID` ORDER BY `o`.`OrderDate`) AS `A` FROM `Customers` AS `c` -WHERE (`c`.`CustomerID` LIKE 'A' & '%') AND ((( +WHERE (`c`.`CustomerID` LIKE 'A%') AND ((( SELECT TOP 1 `o0`.`OrderID` FROM `Orders` AS `o0` WHERE `c`.`CustomerID` = `o0`.`CustomerID` @@ -4464,7 +4464,7 @@ WHERE ( // AssertSql( // $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` //FROM `Customers` AS `c` -//WHERE `c`.`CustomerID` LIKE 'A' & '%' AND (( +//WHERE `c`.`CustomerID` LIKE 'A%' AND (( // SELECT TOP 1 `o`.`OrderID` // FROM `Orders` AS `o` // WHERE `o`.`OrderID` < 10300 diff --git a/test/EFCore.Jet.FunctionalTests/Query/NorthwindNavigationsQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/NorthwindNavigationsQueryJetTest.cs index efdc4d8..fdcd5b2 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/NorthwindNavigationsQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/NorthwindNavigationsQueryJetTest.cs @@ -121,7 +121,7 @@ SELECT `t1`.`CustomerID`, `t1`.`OrderID`, `t1`.`c` FROM ( SELECT TOP {AssertSqlHelper.Parameter("@__p_0")} `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` - WHERE `c`.`CustomerID` LIKE 'F' & '%' + WHERE `c`.`CustomerID` LIKE 'F%' ORDER BY `c`.`CustomerID` ) AS `t` LEFT JOIN ( @@ -146,7 +146,7 @@ SELECT `t1`.`CustomerID`, `t1`.`OrderID`, `t1`.`c` FROM ( SELECT TOP {AssertSqlHelper.Parameter("@__p_0")} `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` - WHERE `c`.`CustomerID` LIKE 'F' & '%' + WHERE `c`.`CustomerID` LIKE 'F%' ORDER BY `c`.`CustomerID` ) AS `t` LEFT JOIN ( @@ -338,7 +338,7 @@ FROM `Orders` AS `o`, `Orders` AS `o0` LEFT JOIN `Customers` AS `c` ON `o`.`CustomerID` = `c`.`CustomerID` LEFT JOIN `Customers` AS `c0` ON `o0`.`CustomerID` = `c0`.`CustomerID` -WHERE ((`o`.`CustomerID` IS NOT NULL AND (`o`.`CustomerID` LIKE 'A' & '%')) AND (`o0`.`CustomerID` IS NOT NULL AND (`o0`.`CustomerID` LIKE 'A' & '%'))) AND ((`c`.`CustomerID` = `c0`.`CustomerID`) OR (`c`.`CustomerID` IS NULL AND `c0`.`CustomerID` IS NULL))"); +WHERE ((`o`.`CustomerID` IS NOT NULL AND (`o`.`CustomerID` LIKE 'A%')) AND (`o0`.`CustomerID` IS NOT NULL AND (`o0`.`CustomerID` LIKE 'A%'))) AND ((`c`.`CustomerID` = `c0`.`CustomerID`) OR (`c`.`CustomerID` IS NULL AND `c0`.`CustomerID` IS NULL))"); } public override async Task Select_Where_Navigation_Null(bool isAsync) @@ -383,7 +383,7 @@ WHERE `e0`.`EmployeeID` IS NULL"); $@"SELECT `c`.`CustomerID`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Customers` AS `c` LEFT JOIN `Orders` AS `o` ON `c`.`CustomerID` = `o`.`CustomerID` -WHERE `c`.`CustomerID` LIKE 'A' & '%' +WHERE `c`.`CustomerID` LIKE 'A%' ORDER BY `c`.`CustomerID`, `o`.`OrderID`"); } @@ -397,7 +397,7 @@ ORDER BY `c`.`CustomerID`, `o`.`OrderID`"); FROM `Orders` AS `o` WHERE `c`.`CustomerID` = `o`.`CustomerID`) AS `Count` FROM `Customers` AS `c` -WHERE `c`.`CustomerID` LIKE 'A' & '%' +WHERE `c`.`CustomerID` LIKE 'A%' ORDER BY `c`.`CustomerID`"); } @@ -409,7 +409,7 @@ ORDER BY `c`.`CustomerID`"); $@"SELECT `c`.`CustomerID`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Customers` AS `c` LEFT JOIN `Orders` AS `o` ON `c`.`CustomerID` = `o`.`CustomerID` -WHERE `c`.`CustomerID` LIKE 'A' & '%' +WHERE `c`.`CustomerID` LIKE 'A%' ORDER BY `c`.`CustomerID`, `o`.`OrderID`"); } @@ -615,7 +615,7 @@ END AS `all`, ( FROM `Order Details` AS `o2` WHERE `o3`.`OrderID` = `o2`.`OrderID`) AS `collection2` FROM `Orders` AS `o3` -WHERE `o3`.`CustomerID` IS NOT NULL AND (`o3`.`CustomerID` LIKE 'A' & '%')"); +WHERE `o3`.`CustomerID` IS NOT NULL AND (`o3`.`CustomerID` LIKE 'A%')"); } public override async Task Collection_select_nav_prop_sum(bool isAsync) @@ -686,7 +686,7 @@ LEFT JOIN ( ) AS `t` WHERE `t`.`row` <= 1 ) AS `t0` ON `c`.`CustomerID` = `t0`.`CustomerID0` -WHERE `c`.`CustomerID` LIKE 'A' & '%' +WHERE `c`.`CustomerID` LIKE 'A%' ORDER BY `c`.`CustomerID`"); } @@ -701,7 +701,7 @@ ORDER BY `c`.`CustomerID`"); LEFT JOIN `Customers` AS `c` ON `o`.`CustomerID` = `c`.`CustomerID` WHERE `o`.`CustomerID` = 'ALFKI') FROM `Customers` AS `c0` -WHERE `c0`.`CustomerID` LIKE 'A' & '%'"); +WHERE `c0`.`CustomerID` LIKE 'A%'"); } public override async Task Collection_select_nav_prop_single_or_default_then_nav_prop_nested(bool isAsync) @@ -715,7 +715,7 @@ WHERE `c0`.`CustomerID` LIKE 'A' & '%'"); LEFT JOIN `Customers` AS `c` ON `o`.`CustomerID` = `c`.`CustomerID` WHERE `o`.`OrderID` = 10643) FROM `Customers` AS `c0` -WHERE `c0`.`CustomerID` LIKE 'A' & '%'"); +WHERE `c0`.`CustomerID` LIKE 'A%'"); } public override async Task Collection_select_nav_prop_first_or_default_then_nav_prop_nested_using_property_method(bool isAsync) @@ -729,7 +729,7 @@ WHERE `c0`.`CustomerID` LIKE 'A' & '%'"); LEFT JOIN `Customers` AS `c` ON `o`.`CustomerID` = `c`.`CustomerID` WHERE `o`.`CustomerID` = 'ALFKI') FROM `Customers` AS `c0` -WHERE `c0`.`CustomerID` LIKE 'A' & '%'"); +WHERE `c0`.`CustomerID` LIKE 'A%'"); } public override async Task Collection_select_nav_prop_first_or_default_then_nav_prop_nested_with_orderby(bool isAsync) @@ -744,7 +744,7 @@ WHERE `c0`.`CustomerID` LIKE 'A' & '%'"); WHERE `o`.`CustomerID` = 'ALFKI' ORDER BY `o`.`CustomerID`) FROM `Customers` AS `c0` -WHERE `c0`.`CustomerID` LIKE 'A' & '%'"); +WHERE `c0`.`CustomerID` LIKE 'A%'"); } public override async Task Navigation_fk_based_inside_contains(bool isAsync) @@ -880,7 +880,7 @@ LEFT JOIN ( ) AS `t` WHERE `t`.`row` <= 1 ) AS `t0` ON `c`.`CustomerID` = `t0`.`CustomerID` -WHERE `c`.`CustomerID` LIKE 'A' & '%' +WHERE `c`.`CustomerID` LIKE 'A%' ORDER BY `c`.`CustomerID`"); } diff --git a/test/EFCore.Jet.FunctionalTests/Query/NorthwindQueryFiltersQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/NorthwindQueryFiltersQueryJetTest.cs index dd9533d..8022956 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/NorthwindQueryFiltersQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/NorthwindQueryFiltersQueryJetTest.cs @@ -226,7 +226,7 @@ INNER JOIN ( FROM `Order Details` AS `o0` WHERE `o0`.`Quantity` > {AssertSqlHelper.Parameter("@__ef_filter___quantity_1")} ) AS `t1` ON `t0`.`OrderID` = `t1`.`OrderID` -WHERE (({AssertSqlHelper.Parameter("@__ef_filter__TenantPrefix_0")} = '') OR ((`c`.`CompanyName` IS NOT NULL) AND (LEFT(`c`.`CompanyName`, LEN({AssertSqlHelper.Parameter("@__ef_filter__TenantPrefix_0")})) = {AssertSqlHelper.Parameter("@__ef_filter__TenantPrefix_0")}))) AND (`t1`.`Discount` < IIf(10 IS NULL, NULL, CSNG(10)))"); +WHERE (({AssertSqlHelper.Parameter("@__ef_filter__TenantPrefix_0")} = '') OR ((`c`.`CompanyName` IS NOT NULL) AND (LEFT(`c`.`CompanyName`, LEN({AssertSqlHelper.Parameter("@__ef_filter__TenantPrefix_0")})) = {AssertSqlHelper.Parameter("@__ef_filter__TenantPrefix_0")}))) AND (`t1`.`Discount` < IIF(10 IS NULL, NULL, CSNG(10)))"); } [ConditionalFact] diff --git a/test/EFCore.Jet.FunctionalTests/Query/NorthwindSelectQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/NorthwindSelectQueryJetTest.cs index 7f48a60..fa6ee2e 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/NorthwindSelectQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/NorthwindSelectQueryJetTest.cs @@ -99,7 +99,7 @@ WHERE `e`.`EmployeeID` = 1"); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` -WHERE `c`.`CustomerID` LIKE 'A' & '%' +WHERE `c`.`CustomerID` LIKE 'A%' ORDER BY `c`.`CustomerID`"); } @@ -297,7 +297,7 @@ OUTER APPLY ( FROM `Orders` AS `o` WHERE (`c`.`CustomerID` = `o`.`CustomerID`) AND (`o`.`OrderID` < 10500) ) AS `t` -WHERE `c`.`CustomerID` LIKE 'A' & '%' +WHERE `c`.`CustomerID` LIKE 'A%' ORDER BY `c`.`CustomerID`, `t`.`OrderID`"); } @@ -311,7 +311,7 @@ ORDER BY `c`.`CustomerID`, `t`.`OrderID`"); FROM `Orders` AS `o` WHERE (`c`.`CustomerID` = `o`.`CustomerID`) AND (`o`.`OrderID` < 10500)) AS `OrderDates` FROM `Customers` AS `c` -WHERE `c`.`CustomerID` LIKE 'A' & '%'"); +WHERE `c`.`CustomerID` LIKE 'A%'"); } public override void Select_nested_collection_multi_level3() @@ -324,7 +324,7 @@ WHERE `c`.`CustomerID` LIKE 'A' & '%'"); FROM `Orders` AS `o` WHERE (`o`.`OrderID` < 10500) AND (`c`.`CustomerID` = `o`.`CustomerID`)) AS `OrderDates` FROM `Customers` AS `c` -WHERE `c`.`CustomerID` LIKE 'A' & '%'"); +WHERE `c`.`CustomerID` LIKE 'A%'"); } public override void Select_nested_collection_multi_level4() @@ -340,7 +340,7 @@ WHERE `c`.`CustomerID` LIKE 'A' & '%'"); FROM `Orders` AS `o0` WHERE (`c`.`CustomerID` = `o0`.`CustomerID`) AND (`o0`.`OrderID` < 10500)) AS `Order` FROM `Customers` AS `c` -WHERE `c`.`CustomerID` LIKE 'A' & '%'"); +WHERE `c`.`CustomerID` LIKE 'A%'"); } public override void Select_nested_collection_multi_level5() @@ -362,7 +362,7 @@ WHERE `c`.`CustomerID` LIKE 'A' & '%'"); FROM `Orders` AS `o1` WHERE (`c`.`CustomerID` = `o1`.`CustomerID`) AND (`o1`.`OrderID` < 10500)) AS `Order` FROM `Customers` AS `c` -WHERE `c`.`CustomerID` LIKE 'A' & '%'"); +WHERE `c`.`CustomerID` LIKE 'A%'"); } public override void Select_nested_collection_multi_level6() @@ -378,7 +378,7 @@ WHERE `c`.`CustomerID` LIKE 'A' & '%'"); FROM `Orders` AS `o0` WHERE (`c`.`CustomerID` = `o0`.`CustomerID`) AND (`o0`.`OrderID` < 10500)) AS `Order` FROM `Customers` AS `c` -WHERE `c`.`CustomerID` LIKE 'A' & '%'"); +WHERE `c`.`CustomerID` LIKE 'A%'"); } public override async Task Select_nested_collection_count_using_anonymous_type(bool isAsync) @@ -391,7 +391,7 @@ WHERE `c`.`CustomerID` LIKE 'A' & '%'"); FROM `Orders` AS `o` WHERE `c`.`CustomerID` = `o`.`CustomerID`) AS `Count` FROM `Customers` AS `c` -WHERE `c`.`CustomerID` LIKE 'A' & '%'"); +WHERE `c`.`CustomerID` LIKE 'A%'"); } public override async Task New_date_time_in_anonymous_type_works(bool isAsync) @@ -401,7 +401,7 @@ WHERE `c`.`CustomerID` LIKE 'A' & '%'"); AssertSql( $@"SELECT 1 FROM `Customers` AS `c` -WHERE `c`.`CustomerID` LIKE 'A' & '%'"); +WHERE `c`.`CustomerID` LIKE 'A%'"); } public override async Task Select_non_matching_value_types_int_to_long_introduces_explicit_cast(bool isAsync) @@ -908,7 +908,7 @@ LEFT JOIN `Orders` AS `o` ON `c`.`CustomerID` = `o`.`CustomerID`"); await base.Cast_on_top_level_projection_brings_explicit_Cast(isAsync); AssertSql( - $@"SELECT IIF(`o`.`OrderID` IS NULL, NULL, CDBL(`o`.`OrderID`)) + $@"SELECT CDBL(`o`.`OrderID`) FROM `Orders` AS `o`"); } @@ -930,7 +930,7 @@ FROM `Orders` AS `o`"); FROM (`Customers` AS `c` INNER JOIN `Orders` AS `o` ON `c`.`CustomerID` = `o`.`CustomerID`) INNER JOIN `Order Details` AS `o0` ON `o`.`OrderID` = `o0`.`OrderID` -WHERE IIF(`o0`.`Discount` IS NULL, NULL, CDBL(`o0`.`Discount`)) >= 0.25"); +WHERE CDBL(`o0`.`Discount`) >= 0.25"); } public override async Task SelectMany_without_result_selector_naked_collection_navigation(bool isAsync) @@ -1046,7 +1046,7 @@ LEFT JOIN ( FROM `Orders` AS `o` WHERE `o`.`OrderID` > 11000 ) AS `t` ON `c`.`CustomerID` = `t`.`CustomerID` -WHERE `c`.`CustomerID` LIKE 'A' & '%' +WHERE `c`.`CustomerID` LIKE 'A%' ORDER BY `c`.`CustomerID`"); } @@ -1062,7 +1062,7 @@ LEFT JOIN ( FROM `Orders` AS `o` WHERE `o`.`OrderID` > 11000 ) AS `t` ON `c`.`CustomerID` = `t`.`CustomerID` -WHERE `c`.`CustomerID` LIKE 'A' & '%' +WHERE `c`.`CustomerID` LIKE 'A%' ORDER BY `c`.`CustomerID`"); } @@ -1170,7 +1170,7 @@ FROM `Customers` AS `c`"); FROM `Orders` AS `o` WHERE `c`.`CustomerID` = `o`.`CustomerID`) AS `Count` FROM `Customers` AS `c` -WHERE `c`.`CustomerID` LIKE 'A' & '%'"); +WHERE `c`.`CustomerID` LIKE 'A%'"); } public override async Task LastOrDefault_member_access_in_projection_translates_to_server(bool isAsync) @@ -1184,7 +1184,7 @@ WHERE `c`.`CustomerID` LIKE 'A' & '%'"); WHERE `c`.`CustomerID` = `o`.`CustomerID` ORDER BY `o`.`OrderID`) AS `OrderDate` FROM `Customers` AS `c` -WHERE `c`.`CustomerID` LIKE 'A' & '%'"); +WHERE `c`.`CustomerID` LIKE 'A%'"); } public override async Task Projection_with_parameterized_constructor(bool async) @@ -1646,7 +1646,7 @@ LEFT JOIN ( WHERE `t1`.`row` <= 1 ) AS `t0` ON `c`.`CustomerID` = `t0`.`CustomerID` LEFT JOIN `Order Details` AS `o2` ON `t0`.`OrderID` = `o2`.`OrderID` -WHERE `c`.`CustomerID` LIKE 'F' & '%' +WHERE `c`.`CustomerID` LIKE 'F%' ORDER BY `c`.`CustomerID`, `t`.`OrderID`, `t`.`OrderID0`, `t`.`ProductID`, `t0`.`OrderID`, `o2`.`OrderID`"); } @@ -1660,7 +1660,7 @@ SELECT `t`.`CustomerID`, `t0`.`CustomerID`, `t0`.`Address`, `t0`.`City`, `t0`.`C FROM ( SELECT TOP(@__p_0) `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` - WHERE `c`.`CustomerID` LIKE 'F' & '%' + WHERE `c`.`CustomerID` LIKE 'F%' ORDER BY `c`.`CustomerID` ) AS `t` OUTER APPLY ( @@ -1685,7 +1685,7 @@ ORDER BY `t`.`CustomerID`, `t0`.`OrderID`"); FROM ( SELECT TOP 1 `o`.`OrderID`, `o`.`OrderDate` FROM `Orders` AS `o` - WHERE (`o`.`CustomerID` IS NOT NULL) AND (`o`.`CustomerID` LIKE 'F' & '%') + WHERE (`o`.`CustomerID` IS NOT NULL) AND (`o`.`CustomerID` LIKE 'F%') ) AS `t` OUTER APPLY ( SELECT `t1`.`OrderID`, `p`.`ProductID`, `p`.`Discontinued`, `p`.`ProductName`, `p`.`SupplierID`, `p`.`UnitPrice`, `p`.`UnitsInStock`, `t1`.`UnitPrice` AS `UnitPrice0`, `t1`.`ProductID` AS `ProductID0` @@ -1710,7 +1710,7 @@ ORDER BY `t`.`OrderID`, `t0`.`OrderID` DESC, `t0`.`ProductID0`"); FROM ( SELECT TOP 1 `c`.`CustomerID` FROM `Customers` AS `c` - WHERE `c`.`CustomerID` LIKE 'F' & '%' + WHERE `c`.`CustomerID` LIKE 'F%' ORDER BY `c`.`CustomerID` ) AS `t` OUTER APPLY ( @@ -1757,7 +1757,7 @@ ORDER BY `t`.`CustomerID`"); FROM `Orders` AS `o` WHERE (`c`.`CustomerID` = `o`.`CustomerID`) AND (`o`.`OrderID` < 11000)), `c`.`City`, 'test' & IIF(`c`.`City` IS NULL, '', `c`.`City`) FROM `Customers` AS `c` -WHERE `c`.`CustomerID` LIKE 'F' & '%'"); +WHERE `c`.`CustomerID` LIKE 'F%'"); } public override async Task MemberInit_in_projection_without_arguments(bool async) @@ -1768,7 +1768,7 @@ WHERE `c`.`CustomerID` LIKE 'F' & '%'"); @"SELECT `c`.`CustomerID`, `o`.`OrderID` FROM `Customers` AS `c` LEFT JOIN `Orders` AS `o` ON `c`.`CustomerID` = `o`.`CustomerID` -WHERE `c`.`CustomerID` LIKE 'F' & '%' +WHERE `c`.`CustomerID` LIKE 'F%' ORDER BY `c`.`CustomerID`"); } @@ -1784,7 +1784,7 @@ LEFT JOIN ( FROM `Orders` AS `o` LEFT JOIN `Order Details` AS `o0` ON `o`.`OrderID` = `o0`.`OrderID` ) AS `t` ON `c`.`CustomerID` = `t`.`CustomerID` -WHERE `c`.`CustomerID` LIKE 'F' & '%' +WHERE `c`.`CustomerID` LIKE 'F%' ORDER BY `c`.`CustomerID`, `t`.`OrderID`, `t`.`OrderID0`"); } diff --git a/test/EFCore.Jet.FunctionalTests/Query/NorthwindSetOperationsQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/NorthwindSetOperationsQueryJetTest.cs index 56cd1d0..256f4c5 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/NorthwindSetOperationsQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/NorthwindSetOperationsQueryJetTest.cs @@ -275,11 +275,11 @@ FROM ( FROM ( SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` - WHERE `c`.`CompanyName` IS NOT NULL AND (`c`.`CompanyName` LIKE 'A' & '%') + WHERE `c`.`CompanyName` IS NOT NULL AND (`c`.`CompanyName` LIKE 'A%') UNION SELECT `c0`.`CustomerID`, `c0`.`Address`, `c0`.`City`, `c0`.`CompanyName`, `c0`.`ContactName`, `c0`.`ContactTitle`, `c0`.`Country`, `c0`.`Fax`, `c0`.`Phone`, `c0`.`PostalCode`, `c0`.`Region` FROM `Customers` AS `c0` - WHERE `c0`.`CompanyName` IS NOT NULL AND (`c0`.`CompanyName` LIKE 'B' & '%') + WHERE `c0`.`CompanyName` IS NOT NULL AND (`c0`.`CompanyName` LIKE 'B%') ) AS `t`"); } @@ -296,7 +296,7 @@ FROM ( SELECT `p`.`ProductName` AS `ContactName` FROM `Products` AS `p` ) AS `t` -WHERE `t`.`ContactName` IS NOT NULL AND (`t`.`ContactName` LIKE 'C' & '%') +WHERE `t`.`ContactName` IS NOT NULL AND (`t`.`ContactName` LIKE 'C%') ORDER BY `t`.`ContactName`"); } diff --git a/test/EFCore.Jet.FunctionalTests/Query/NorthwindWhereQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/NorthwindWhereQueryJetTest.cs index 4c3f427..521dcc5 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/NorthwindWhereQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/NorthwindWhereQueryJetTest.cs @@ -740,7 +740,7 @@ WHERE CONVERT(date, `o`.`OrderDate`) = {AssertSqlHelper.Parameter("@__myDatetime AssertSql( $@"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Orders` AS `o` -WHERE DATEPART('yyyy', DATEADD('yyyy', CAST(-1 AS int), `o`.`OrderDate`)) = 1997"); +WHERE DATEPART('yyyy', DATEADD('yyyy', -1, `o`.`OrderDate`)) = 1997"); } public override async Task Where_datetime_year_component(bool isAsync) @@ -770,7 +770,7 @@ WHERE DATEPART('m', `o`.`OrderDate`) = 4"); AssertSql( $@"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Orders` AS `o` -WHERE DATEPART(dayofyear, `o`.`OrderDate`) = 68"); +WHERE DATEPART('y', `o`.`OrderDate`) = 68"); } public override async Task Where_datetime_day_component(bool isAsync) diff --git a/test/EFCore.Jet.FunctionalTests/Query/NullSemanticsQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/NullSemanticsQueryJetTest.cs index c4e9135..dc22e0e 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/NullSemanticsQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/NullSemanticsQueryJetTest.cs @@ -869,7 +869,7 @@ WHERE `e`.`StringA` IN ('Foo', 'Bar')", // $@"SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`StringA` LIKE 'A' & '%'"); +WHERE `e`.`StringA` LIKE 'A%'"); } public override async Task Where_nested_conditional_search_condition_in_result(bool async) diff --git a/test/EFCore.Jet.FunctionalTests/Query/QueryBugsTest.cs b/test/EFCore.Jet.FunctionalTests/Query/QueryBugsTest.cs index e709803..737130b 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/QueryBugsTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/QueryBugsTest.cs @@ -4084,22 +4084,22 @@ WHERE (`t`.`Name` <> 'Bar') OR `t`.`Name` IS NULL"); $@"SELECT AVG(`p`.`Price`) FROM `Prices` AS `p`", // - $@"SELECT AVG(IIf(`p`.`IntColumn` IS NULL, NULL, CDBL(`p`.`IntColumn`))) + $@"SELECT AVG(IIF(`p`.`IntColumn` IS NULL, NULL, CDBL(`p`.`IntColumn`))) FROM `Prices` AS `p`", // - $@"SELECT AVG(IIf(`p`.`NullableIntColumn` IS NULL, NULL, CDBL(`p`.`NullableIntColumn`))) + $@"SELECT AVG(IIF(`p`.`NullableIntColumn` IS NULL, NULL, CDBL(`p`.`NullableIntColumn`))) FROM `Prices` AS `p`", // - $@"SELECT AVG(IIf(`p`.`LongColumn` IS NULL, NULL, CDBL(`p`.`LongColumn`))) + $@"SELECT AVG(IIF(`p`.`LongColumn` IS NULL, NULL, CDBL(`p`.`LongColumn`))) FROM `Prices` AS `p`", // - $@"SELECT AVG(IIf(`p`.`NullableLongColumn` IS NULL, NULL, CDBL(`p`.`NullableLongColumn`))) + $@"SELECT AVG(IIF(`p`.`NullableLongColumn` IS NULL, NULL, CDBL(`p`.`NullableLongColumn`))) FROM `Prices` AS `p`", // - $@"SELECT IIf(AVG(`p`.`FloatColumn`) IS NULL, NULL, CSNG(AVG(`p`.`FloatColumn`))) + $@"SELECT IIF(AVG(`p`.`FloatColumn`) IS NULL, NULL, CSNG(AVG(`p`.`FloatColumn`))) FROM `Prices` AS `p`", // - $@"SELECT IIf(AVG(`p`.`NullableFloatColumn`) IS NULL, NULL, CSNG(AVG(`p`.`NullableFloatColumn`))) + $@"SELECT IIF(AVG(`p`.`NullableFloatColumn`) IS NULL, NULL, CSNG(AVG(`p`.`NullableFloatColumn`))) FROM `Prices` AS `p`", // $@"SELECT AVG(`p`.`DoubleColumn`) @@ -4990,7 +4990,7 @@ WHERE @@ROWCOUNT = 1 AND `Id` = scope_identity();"); var result = context.InventoryPools.Sum(p => (decimal)p.Quantity); AssertSql( - $@"SELECT SUM(IIf(`i`.`Quantity` IS NULL, NULL, CCUR(`i`.`Quantity`))) + $@"SELECT SUM(IIF(`i`.`Quantity` IS NULL, NULL, CCUR(`i`.`Quantity`))) FROM `InventoryPools` AS `i`"); } } diff --git a/test/EFCore.Jet.FunctionalTests/Scaffolding/JetDatabaseModelFactoryTest.cs b/test/EFCore.Jet.FunctionalTests/Scaffolding/JetDatabaseModelFactoryTest.cs index 402409c..a082297 100644 --- a/test/EFCore.Jet.FunctionalTests/Scaffolding/JetDatabaseModelFactoryTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Scaffolding/JetDatabaseModelFactoryTest.cs @@ -880,7 +880,7 @@ CREATE TABLE DefaultValues ( IgnoredDefault20 numeric NOT NULL DEFAULT 0.0, IgnoredDefault21 real NOT NULL DEFAULT 0.0, IgnoredDefault22 smallmoney NOT NULL DEFAULT 0.0, - IgnoredDefault23 real NOT NULL DEFAULT IIf(0 IS NULL, NULL, CSNG(0)), + IgnoredDefault23 real NOT NULL DEFAULT IIF(0 IS NULL, NULL, CSNG(0)), IgnoredDefault24 float NOT NULL DEFAULT 0.0E0, IgnoredDefault25 date NOT NULL DEFAULT '0001-01-01', IgnoredDefault26 datetime NOT NULL DEFAULT #1900-01-01 00:00:00#, diff --git a/test/EFCore.Jet.IntegrationTests/Model_MainTests/Test.cs b/test/EFCore.Jet.IntegrationTests/Model_MainTests/Test.cs index d8c0bc4..f4ce496 100644 --- a/test/EFCore.Jet.IntegrationTests/Model_MainTests/Test.cs +++ b/test/EFCore.Jet.IntegrationTests/Model_MainTests/Test.cs @@ -108,7 +108,7 @@ namespace EntityFrameworkCore.Jet.IntegrationTests.Model_MainTests //[TestMethod] public void OrderBy_correlated_subquery_lol() { - // After the issue IIf => true or false has been removed + // After the issue IIF => true or false has been removed // The generated query is below. // The query does not work in Access // diff --git a/test/Northwind.sql b/test/Northwind.sql index 39ee09235837c63b806a2fa5efc22c967532ec6a..7b5b51625898dc462dc94372c31af20d497963a4 100644 GIT binary patch delta 112 zcmbQx)4(_Zh#OiMTbNpyTUc6HTi9CITR2)cTew=dTX Date: Thu, 8 Dec 2022 00:06:08 +0800 Subject: [PATCH 3/8] raw string literals not supported in net6 --- ...orthwindFunctionsQueryJetTest.Functions.cs | 54 +++++++------------ 1 file changed, 18 insertions(+), 36 deletions(-) diff --git a/test/EFCore.Jet.FunctionalTests/Query/NorthwindFunctionsQueryJetTest.Functions.cs b/test/EFCore.Jet.FunctionalTests/Query/NorthwindFunctionsQueryJetTest.Functions.cs index 6ec3357..af3c40c 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/NorthwindFunctionsQueryJetTest.Functions.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/NorthwindFunctionsQueryJetTest.Functions.cs @@ -744,11 +744,9 @@ WHERE CDBL(`o`.`Discount`)^3.0 > 0.004999999888241291"); await base.Where_math_square(async); AssertSql( - """ -SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` + $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` FROM `Order Details` AS `o` -WHERE CDBL(`o`.`Discount`)^2.0 > 0.05000000074505806 -"""); +WHERE CDBL(`o`.`Discount`)^2.0 > 0.05000000074505806"); } public override async Task Where_math_round(bool isAsync) @@ -1213,53 +1211,37 @@ WHERE CDBL(CLNG(LEN(`c`.`CustomerID`)))^2.0 = 25.0"); await base.Convert_ToBoolean(async); AssertSql( - """ -SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` + $@"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Orders` AS `o` -WHERE `o`.`CustomerID` = 'ALFKI' AND CONVERT(bit, CONVERT(bit, `o`.`OrderID` % 3)) = CAST(1 AS bit) -""", +WHERE `o`.`CustomerID` = 'ALFKI' AND CONVERT(bit, CONVERT(bit, `o`.`OrderID` % 3)) = CAST(1 AS bit)", // - """ -SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` + $@"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Orders` AS `o` -WHERE `o`.`CustomerID` = 'ALFKI' AND CONVERT(bit, CONVERT(tinyint, `o`.`OrderID` % 3)) = CAST(1 AS bit) -""", +WHERE `o`.`CustomerID` = 'ALFKI' AND CONVERT(bit, CONVERT(tinyint, `o`.`OrderID` % 3)) = CAST(1 AS bit)", // - """ -SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` + $@"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Orders` AS `o` -WHERE `o`.`CustomerID` = 'ALFKI' AND CONVERT(bit, CONVERT(decimal(18, 2), `o`.`OrderID` % 3)) = CAST(1 AS bit) -""", +WHERE `o`.`CustomerID` = 'ALFKI' AND CONVERT(bit, CONVERT(decimal(18, 2), `o`.`OrderID` % 3)) = CAST(1 AS bit)", // - """ -SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` + $@"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Orders` AS `o` -WHERE `o`.`CustomerID` = 'ALFKI' AND CONVERT(bit, CONVERT(float, `o`.`OrderID` % 3)) = CAST(1 AS bit) -""", +WHERE `o`.`CustomerID` = 'ALFKI' AND CONVERT(bit, CONVERT(float, `o`.`OrderID` % 3)) = CAST(1 AS bit)", // - """ -SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` + $@"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Orders` AS `o` -WHERE `o`.`CustomerID` = 'ALFKI' AND CONVERT(bit, CAST(CONVERT(float, `o`.`OrderID` % 3) AS real)) = CAST(1 AS bit) -""", +WHERE `o`.`CustomerID` = 'ALFKI' AND CONVERT(bit, CAST(CONVERT(float, `o`.`OrderID` % 3) AS real)) = CAST(1 AS bit)", // - """ -SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` + $@"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Orders` AS `o` -WHERE `o`.`CustomerID` = 'ALFKI' AND CONVERT(bit, CONVERT(smallint, `o`.`OrderID` % 3)) = CAST(1 AS bit) -""", +WHERE `o`.`CustomerID` = 'ALFKI' AND CONVERT(bit, CONVERT(smallint, `o`.`OrderID` % 3)) = CAST(1 AS bit)", // - """ -SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` + $@"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Orders` AS `o` -WHERE `o`.`CustomerID` = 'ALFKI' AND CONVERT(bit, CONVERT(int, `o`.`OrderID` % 3)) = CAST(1 AS bit) -""", +WHERE `o`.`CustomerID` = 'ALFKI' AND CONVERT(bit, CONVERT(int, `o`.`OrderID` % 3)) = CAST(1 AS bit)", // - """ -SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` + $@"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Orders` AS `o` -WHERE `o`.`CustomerID` = 'ALFKI' AND CONVERT(bit, CONVERT(bigint, `o`.`OrderID` % 3)) = CAST(1 AS bit) -"""); +WHERE `o`.`CustomerID` = 'ALFKI' AND CONVERT(bit, CONVERT(bigint, `o`.`OrderID` % 3)) = CAST(1 AS bit)"); } public override async Task Convert_ToByte(bool isAsync) From fbd8398d951da40117e8901d1adf04a2f6e01f64 Mon Sep 17 00:00:00 2001 From: Christopher Jolly Date: Sun, 19 Feb 2023 13:22:36 +0800 Subject: [PATCH 4/8] Timespan needs to map to a DbType of DateTime not Time --- src/EFCore.Jet/Storage/Internal/JetTimeSpanTypeMapping.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/EFCore.Jet/Storage/Internal/JetTimeSpanTypeMapping.cs b/src/EFCore.Jet/Storage/Internal/JetTimeSpanTypeMapping.cs index 18f61b1..18fff5a 100644 --- a/src/EFCore.Jet/Storage/Internal/JetTimeSpanTypeMapping.cs +++ b/src/EFCore.Jet/Storage/Internal/JetTimeSpanTypeMapping.cs @@ -15,7 +15,7 @@ namespace EntityFrameworkCore.Jet.Storage.Internal public JetTimeSpanTypeMapping( [NotNull] string storeType, [NotNull] IJetOptions options) - : base(storeType, options, System.Data.DbType.Time, typeof(TimeSpan)) + : base(storeType, options, System.Data.DbType.DateTime, typeof(TimeSpan)) { _options = options; } From ae722d90330305c221a0101f141d3b11254a2c90 Mon Sep 17 00:00:00 2001 From: Christopher Jolly Date: Sun, 19 Feb 2023 13:23:56 +0800 Subject: [PATCH 5/8] Ignore DateOnly and TimeOnly field in Gears Of War. No support yet --- .../Query/GearsOfWarQueryJetFixture.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/EFCore.Jet.FunctionalTests/Query/GearsOfWarQueryJetFixture.cs b/test/EFCore.Jet.FunctionalTests/Query/GearsOfWarQueryJetFixture.cs index fde72a6..59094c8 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/GearsOfWarQueryJetFixture.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/GearsOfWarQueryJetFixture.cs @@ -17,6 +17,14 @@ namespace EntityFrameworkCore.Jet.FunctionalTests.Query base.OnModelCreating(modelBuilder, context); modelBuilder.Entity().Property(g => g.Location).HasColumnType("varchar(100)"); + + // No support yet for DateOnly/TimeOnly (#24507) + modelBuilder.Entity( + b => + { + b.Ignore(m => m.Date); + b.Ignore(m => m.Time); + }); } } } From 51037ec385bb4e8f157d61d815368c213f5e6a23 Mon Sep 17 00:00:00 2001 From: Christopher Jolly Date: Sun, 19 Feb 2023 13:26:40 +0800 Subject: [PATCH 6/8] Use GenGUID function for DefaultValueSql instead of the undefined newid --- .../BatchingTest.cs | 2 +- ...orthwindFunctionsQueryJetTest.Functions.cs | 2 +- .../StoreGeneratedFixupJetTest.cs | 34 +++++++++---------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/test/EFCore.Jet.FunctionalTests/BatchingTest.cs b/test/EFCore.Jet.FunctionalTests/BatchingTest.cs index 40da03a..9f529b6 100644 --- a/test/EFCore.Jet.FunctionalTests/BatchingTest.cs +++ b/test/EFCore.Jet.FunctionalTests/BatchingTest.cs @@ -231,7 +231,7 @@ namespace EntityFrameworkCore.Jet.FunctionalTests modelBuilder.Entity( b => { - b.Property(e => e.Id).HasDefaultValueSql("NEWID()"); + b.Property(e => e.Id).HasDefaultValueSql("GenGUID()"); b.Property(e => e.Version).IsConcurrencyToken().ValueGeneratedOnAddOrUpdate(); }); } diff --git a/test/EFCore.Jet.FunctionalTests/Query/NorthwindFunctionsQueryJetTest.Functions.cs b/test/EFCore.Jet.FunctionalTests/Query/NorthwindFunctionsQueryJetTest.Functions.cs index af3c40c..d5f9a46 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/NorthwindFunctionsQueryJetTest.Functions.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/NorthwindFunctionsQueryJetTest.Functions.cs @@ -1173,7 +1173,7 @@ WHERE (`o`.`OrderID` = 11077) AND (SGN(`o`.`Discount`) > 0)"); AssertSql( $@"SELECT `o`.`OrderID`, `o`.`ProductID`, `o`.`Discount`, `o`.`Quantity`, `o`.`UnitPrice` FROM `Order Details` AS `o` -WHERE (NEWID() <> '00000000-0000-0000-0000-000000000000') OR NEWID() IS NULL"); +WHERE (GenGUID() <> '00000000-0000-0000-0000-000000000000') OR GenGUID() IS NULL"); } public override async Task Where_string_to_upper(bool isAsync) diff --git a/test/EFCore.Jet.FunctionalTests/StoreGeneratedFixupJetTest.cs b/test/EFCore.Jet.FunctionalTests/StoreGeneratedFixupJetTest.cs index 623c6e5..1771e8e 100644 --- a/test/EFCore.Jet.FunctionalTests/StoreGeneratedFixupJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/StoreGeneratedFixupJetTest.cs @@ -83,117 +83,117 @@ namespace EntityFrameworkCore.Jet.FunctionalTests b => { b.Property(e => e.Id1).ValueGeneratedOnAdd(); - b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("newid()"); + b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("GenGUID()"); }); modelBuilder.Entity( b => { b.Property(e => e.Id1).ValueGeneratedOnAdd(); - b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("newid()"); + b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("GenGUID()"); }); modelBuilder.Entity( b => { b.Property(e => e.Id1).ValueGeneratedOnAdd(); - b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("newid()"); + b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("GenGUID()"); }); modelBuilder.Entity( b => { b.Property(e => e.Id1).ValueGeneratedOnAdd(); - b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("newid()"); + b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("GenGUID()"); }); modelBuilder.Entity( b => { b.Property(e => e.Id1).ValueGeneratedOnAdd(); - b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("newid()"); + b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("GenGUID()"); }); modelBuilder.Entity( b => { b.Property(e => e.Id1).ValueGeneratedOnAdd(); - b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("newid()"); + b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("GenGUID()"); }); modelBuilder.Entity( b => { b.Property(e => e.Id1).ValueGeneratedOnAdd(); - b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("newid()"); + b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("GenGUID()"); }); modelBuilder.Entity( b => { b.Property(e => e.Id1).ValueGeneratedOnAdd(); - b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("newid()"); + b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("GenGUID()"); }); modelBuilder.Entity( b => { b.Property(e => e.Id1).ValueGeneratedOnAdd(); - b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("newid()"); + b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("GenGUID()"); }); modelBuilder.Entity( b => { b.Property(e => e.Id1).ValueGeneratedOnAdd(); - b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("newid()"); + b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("GenGUID()"); }); modelBuilder.Entity( b => { b.Property(e => e.Id1).ValueGeneratedOnAdd(); - b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("newid()"); + b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("GenGUID()"); }); modelBuilder.Entity( b => { b.Property(e => e.Id1).ValueGeneratedOnAdd(); - b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("newid()"); + b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("GenGUID()"); }); modelBuilder.Entity( b => { b.Property(e => e.Id1).ValueGeneratedOnAdd(); - b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("newid()"); + b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("GenGUID()"); }); modelBuilder.Entity( b => { b.Property(e => e.Id1).ValueGeneratedOnAdd(); - b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("newid()"); + b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("GenGUID()"); }); modelBuilder.Entity( b => { b.Property(e => e.Id1).ValueGeneratedOnAdd(); - b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("newid()"); + b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("GenGUID()"); }); modelBuilder.Entity( b => { b.Property(e => e.Id1).ValueGeneratedOnAdd(); - b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("newid()"); + b.Property(e => e.Id2).ValueGeneratedOnAdd().HasDefaultValueSql("GenGUID()"); }); modelBuilder.Entity(b => b.Property(e => e.Id).ValueGeneratedOnAdd()); - modelBuilder.Entity(b => b.Property(e => e.Id).ValueGeneratedOnAdd().HasDefaultValueSql("newid()")); + modelBuilder.Entity(b => b.Property(e => e.Id).ValueGeneratedOnAdd().HasDefaultValueSql("GenGUID()")); } } } From a9789216d20fed3ee8ba9b6d4d88c02f431476ac Mon Sep 17 00:00:00 2001 From: Christopher Jolly Date: Sun, 19 Feb 2023 14:23:44 +0800 Subject: [PATCH 7/8] Dual table: Auto detect the dual table name on model load. Use that table for any queries. Also allow a custom override name to be set --- src/EFCore.Jet.Data/JetConfiguration.cs | 20 ++++++++----------- .../Sql/Internal/JetQuerySqlGenerator.cs | 2 +- .../Internal/JetDatabaseModelFactory.cs | 16 ++++++++++++++- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/EFCore.Jet.Data/JetConfiguration.cs b/src/EFCore.Jet.Data/JetConfiguration.cs index 314976e..b868819 100644 --- a/src/EFCore.Jet.Data/JetConfiguration.cs +++ b/src/EFCore.Jet.Data/JetConfiguration.cs @@ -33,8 +33,8 @@ namespace EntityFrameworkCore.Jet.Data } } - public static DataAccessProviderType DefaultDataAccessProviderType { get; set; } = DataAccessProviderType.Odbc; - + public static DataAccessProviderType DefaultDataAccessProviderType { get; set; } = DataAccessProviderType.Odbc; + // The SQL statement // // (SELECT COUNT(*) FROM MSysRelationships) @@ -57,17 +57,13 @@ namespace EntityFrameworkCore.Jet.Data /// /// The DUAL table or query /// - public static string DUAL { get; set; } = DUALForAccdb; + public static string CustomDualTableName = ""; + //MSysRelationships + //MSysAccessStorage + //#Dual + //(SELECT COUNT(*) FROM MSysAccessStorage) - /// - /// The dual table for accdb - /// - public const string DUALForMdb = "(SELECT COUNT(*) FROM MSysRelationships)"; - - /// - /// The dual table for accdb - /// - public const string DUALForAccdb = "(SELECT COUNT(*) FROM MSysAccessStorage)"; + public static string DetectedDualTableName = "#Dual"; /// /// Gets or sets a value indicating whether show SQL statements. diff --git a/src/EFCore.Jet/Query/Sql/Internal/JetQuerySqlGenerator.cs b/src/EFCore.Jet/Query/Sql/Internal/JetQuerySqlGenerator.cs index 7032ff8..25357d2 100644 --- a/src/EFCore.Jet/Query/Sql/Internal/JetQuerySqlGenerator.cs +++ b/src/EFCore.Jet/Query/Sql/Internal/JetQuerySqlGenerator.cs @@ -224,7 +224,7 @@ namespace EntityFrameworkCore.Jet.Query.Sql.Internal protected override void GeneratePseudoFromClause() { Sql.AppendLine() - .Append("FROM " + JetConfiguration.DUAL); + .Append("FROM " + "(SELECT COUNT(*) FROM `" + (string.IsNullOrEmpty(JetConfiguration.CustomDualTableName) ? JetConfiguration.DetectedDualTableName : JetConfiguration.CustomDualTableName) + "`)"); } private void GenerateList( diff --git a/src/EFCore.Jet/Scaffolding/Internal/JetDatabaseModelFactory.cs b/src/EFCore.Jet/Scaffolding/Internal/JetDatabaseModelFactory.cs index f0c08a4..4845c95 100644 --- a/src/EFCore.Jet/Scaffolding/Internal/JetDatabaseModelFactory.cs +++ b/src/EFCore.Jet/Scaffolding/Internal/JetDatabaseModelFactory.cs @@ -105,7 +105,21 @@ namespace EntityFrameworkCore.Jet.Scaffolding.Internal table.Database = databaseModel; databaseModel.Tables.Add(table); } - + + var tableNames = databaseModel.Tables.Select(t => t.Name).ToList(); + if (tableNames.Contains("MSysAccessStorage")) + { + JetConfiguration.DetectedDualTableName = "MSysAccessStorage"; + } + else if (tableNames.Contains("MSysRelationships")) + { + JetConfiguration.DetectedDualTableName = "MSysRelationships"; + } + else if (tableNames.Contains("#Dual")) + { + JetConfiguration.DetectedDualTableName = "#Dual"; + } + return databaseModel; } finally From dd223df6fec37325d4c3cae9c398a98fdaacf0df Mon Sep 17 00:00:00 2001 From: Christopher Jolly Date: Sun, 19 Feb 2023 14:40:11 +0800 Subject: [PATCH 8/8] update to alpha 2 --- Version.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Version.props b/Version.props index 01b3ab1..7b0a7df 100644 --- a/Version.props +++ b/Version.props @@ -10,7 +10,7 @@ --> 6.0.0 alpha - 1 + 2