Skip to content

Commit 32e2b77

Browse files
MaceWindusdanylivviceroypenguin
authored
Regression tests for existing issues (part 2) (#4553)
* add issue test * Improved condition handling. * Added translation of DefaultValueExpression. * Another case for subquery optimization. * Fixed boolean columns usage. * Added better compatibility handler at the end of the query. Added two parsing steps to improve simple queries parsing speed. * Fixed found regressions. * Additional SqlCondtition Optimization/ * Fix query validation logic. * Cleanup. * Fixed wrong query query transformation. * Fix Values table generation. * regression tests part 2 * fix build * disable tests * enable test * Fixed test. * Better error handling. * Many subquery fixes. * Fix build. * Fixed comparer. * Fix build error. * Fixed test. * Fixed another bunch of tests. * Optimization fixes. * Fixed EnumerableBuilder. * Corrected test signature. * Server side-only detection fix. * Resetting column nesting level. * Fixed Noop Provider. * SqlProviderFlags fixes. * Fixed test. * SqlProviderFlags correction. * remove ActiveIssue * Update Source/LinqToDB/Linq/Builder/ExpressionBuilder.SqlBuilder.cs Co-authored-by: Stuart Turner <[email protected]> * address CR --------- Co-authored-by: Svyatoslav Danyliv <[email protected]> Co-authored-by: Stuart Turner <[email protected]>
1 parent 079dbbf commit 32e2b77

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+1494
-215
lines changed

Source/LinqToDB/DataProvider/Access/AccessODBCDataProvider.cs

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,22 +21,23 @@ public class AccessODBCDataProvider : DynamicDataProviderBase<OdbcProviderAdapte
2121
{
2222
public AccessODBCDataProvider() : base(ProviderName.AccessOdbc, _mappingSchemaInstance, OdbcProviderAdapter.GetInstance())
2323
{
24-
SqlProviderFlags.AcceptsTakeAsParameter = false;
25-
SqlProviderFlags.IsSkipSupported = false;
26-
SqlProviderFlags.IsInsertOrUpdateSupported = false;
27-
SqlProviderFlags.IsSubQuerySkipSupported = false;
28-
SqlProviderFlags.IsSupportsJoinWithoutCondition = false;
29-
SqlProviderFlags.TakeHintsSupported = TakeHints.Percent;
30-
SqlProviderFlags.IsCrossJoinSupported = false;
31-
SqlProviderFlags.IsDistinctSetOperationsSupported = false;
32-
SqlProviderFlags.IsParameterOrderDependent = true;
33-
SqlProviderFlags.IsUpdateFromSupported = false;
34-
SqlProviderFlags.IsWindowFunctionsSupported = false;
35-
SqlProviderFlags.IsColumnSubqueryWithParentReferenceSupported = false;
36-
SqlProviderFlags.DefaultMultiQueryIsolationLevel = IsolationLevel.Unspecified;
37-
SqlProviderFlags.IsOuterJoinSupportsInnerJoin = false;
38-
SqlProviderFlags.IsMultiTablesSupportsJoins = false;
39-
SqlProviderFlags.IsAccessBuggyLeftJoinConstantNullability = true;
24+
SqlProviderFlags.AcceptsTakeAsParameter = false;
25+
SqlProviderFlags.IsSkipSupported = false;
26+
SqlProviderFlags.IsInsertOrUpdateSupported = false;
27+
SqlProviderFlags.IsSubQuerySkipSupported = false;
28+
SqlProviderFlags.IsSubQueryOrderBySupported = false;
29+
SqlProviderFlags.IsSupportsJoinWithoutCondition = false;
30+
SqlProviderFlags.TakeHintsSupported = TakeHints.Percent;
31+
SqlProviderFlags.IsCrossJoinSupported = false;
32+
SqlProviderFlags.IsDistinctSetOperationsSupported = false;
33+
SqlProviderFlags.IsParameterOrderDependent = true;
34+
SqlProviderFlags.IsUpdateFromSupported = false;
35+
SqlProviderFlags.IsWindowFunctionsSupported = false;
36+
SqlProviderFlags.SupportedCorrelatedSubqueriesLevel = 1;
37+
SqlProviderFlags.DefaultMultiQueryIsolationLevel = IsolationLevel.Unspecified;
38+
SqlProviderFlags.IsOuterJoinSupportsInnerJoin = false;
39+
SqlProviderFlags.IsMultiTablesSupportsJoins = false;
40+
SqlProviderFlags.IsAccessBuggyLeftJoinConstantNullability = true;
4041

4142
SqlProviderFlags.IsCountDistinctSupported = false;
4243
SqlProviderFlags.IsAggregationDistinctSupported = false;

Source/LinqToDB/DataProvider/Access/AccessOleDbDataProvider.cs

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,22 +21,23 @@ public class AccessOleDbDataProvider : DynamicDataProviderBase<OleDbProviderAdap
2121
{
2222
public AccessOleDbDataProvider() : base(ProviderName.Access, MappingSchemaInstance, OleDbProviderAdapter.GetInstance())
2323
{
24-
SqlProviderFlags.AcceptsTakeAsParameter = false;
25-
SqlProviderFlags.IsSkipSupported = false;
26-
SqlProviderFlags.IsInsertOrUpdateSupported = false;
27-
SqlProviderFlags.IsSubQuerySkipSupported = false;
28-
SqlProviderFlags.IsSupportsJoinWithoutCondition = false;
29-
SqlProviderFlags.TakeHintsSupported = TakeHints.Percent;
30-
SqlProviderFlags.IsCrossJoinSupported = false;
31-
SqlProviderFlags.IsDistinctSetOperationsSupported = false;
32-
SqlProviderFlags.IsParameterOrderDependent = true;
33-
SqlProviderFlags.IsUpdateFromSupported = false;
34-
SqlProviderFlags.IsWindowFunctionsSupported = false;
35-
SqlProviderFlags.IsColumnSubqueryWithParentReferenceSupported = false;
36-
SqlProviderFlags.DefaultMultiQueryIsolationLevel = IsolationLevel.Unspecified;
37-
SqlProviderFlags.IsOuterJoinSupportsInnerJoin = false;
38-
SqlProviderFlags.IsMultiTablesSupportsJoins = false;
39-
SqlProviderFlags.IsAccessBuggyLeftJoinConstantNullability = true;
24+
SqlProviderFlags.AcceptsTakeAsParameter = false;
25+
SqlProviderFlags.IsSkipSupported = false;
26+
SqlProviderFlags.IsInsertOrUpdateSupported = false;
27+
SqlProviderFlags.IsSubQuerySkipSupported = false;
28+
SqlProviderFlags.IsSubQueryOrderBySupported = false;
29+
SqlProviderFlags.IsSupportsJoinWithoutCondition = false;
30+
SqlProviderFlags.TakeHintsSupported = TakeHints.Percent;
31+
SqlProviderFlags.IsCrossJoinSupported = false;
32+
SqlProviderFlags.IsDistinctSetOperationsSupported = false;
33+
SqlProviderFlags.IsParameterOrderDependent = true;
34+
SqlProviderFlags.IsUpdateFromSupported = false;
35+
SqlProviderFlags.IsWindowFunctionsSupported = false;
36+
SqlProviderFlags.SupportedCorrelatedSubqueriesLevel = 1;
37+
SqlProviderFlags.DefaultMultiQueryIsolationLevel = IsolationLevel.Unspecified;
38+
SqlProviderFlags.IsOuterJoinSupportsInnerJoin = false;
39+
SqlProviderFlags.IsMultiTablesSupportsJoins = false;
40+
SqlProviderFlags.IsAccessBuggyLeftJoinConstantNullability = true;
4041

4142
SqlProviderFlags.IsCountDistinctSupported = false;
4243
SqlProviderFlags.IsAggregationDistinctSupported = false;

Source/LinqToDB/DataProvider/ClickHouse/ClickHouseDataProvider.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,13 @@ protected ClickHouseDataProvider(string name, ClickHouseProvider provider)
4545
// as emulation doesn't work properly due to missing rowcount functionality
4646
SqlProviderFlags.IsInsertOrUpdateSupported = true;
4747

48-
SqlProviderFlags.IsUpdateFromSupported = false;
49-
SqlProviderFlags.IsCommonTableExpressionsSupported = true;
50-
SqlProviderFlags.IsSubQueryOrderBySupported = true;
51-
SqlProviderFlags.DoesNotSupportCorrelatedSubquery = true;
52-
SqlProviderFlags.IsAllSetOperationsSupported = true;
53-
SqlProviderFlags.IsNestedJoinsSupported = false;
54-
SqlProviderFlags.IsSupportedSimpleCorrelatedSubqueries = true;
48+
SqlProviderFlags.IsUpdateFromSupported = false;
49+
SqlProviderFlags.IsCommonTableExpressionsSupported = true;
50+
SqlProviderFlags.IsSubQueryOrderBySupported = true;
51+
SqlProviderFlags.SupportedCorrelatedSubqueriesLevel = 0;
52+
SqlProviderFlags.IsAllSetOperationsSupported = true;
53+
SqlProviderFlags.IsNestedJoinsSupported = false;
54+
SqlProviderFlags.IsSupportedSimpleCorrelatedSubqueries = true;
5555

5656
// unconfigured flags
5757
// 1. ClickHouse doesn't support correlated subqueries at all so this flag's value doesn't make difference

Source/LinqToDB/DataProvider/DB2/DB2DataProvider.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ protected DB2DataProvider(string name, DB2Version version)
2424
{
2525
Version = version;
2626

27-
SqlProviderFlags.AcceptsTakeAsParameter = false;
28-
SqlProviderFlags.AcceptsTakeAsParameterIfSkip = true;
29-
SqlProviderFlags.IsCommonTableExpressionsSupported = true;
30-
SqlProviderFlags.IsUpdateFromSupported = false;
31-
SqlProviderFlags.IsCrossJoinSupported = false;
32-
SqlProviderFlags.IsColumnSubqueryWithParentReferenceSupported = false;
33-
SqlProviderFlags.IsRecursiveCTEJoinWithConditionSupported = false;
27+
SqlProviderFlags.AcceptsTakeAsParameter = false;
28+
SqlProviderFlags.AcceptsTakeAsParameterIfSkip = true;
29+
SqlProviderFlags.IsCommonTableExpressionsSupported = true;
30+
SqlProviderFlags.IsUpdateFromSupported = false;
31+
SqlProviderFlags.IsCrossJoinSupported = false;
32+
SqlProviderFlags.SupportedCorrelatedSubqueriesLevel = 1;
33+
SqlProviderFlags.IsRecursiveCTEJoinWithConditionSupported = false;
3434

3535
// Requires:
3636
// DB2 LUW: 11.1+

Source/LinqToDB/DataProvider/DataProviderBase.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ protected DataProviderBase(string name, MappingSchema mappingSchema)
4343
IsSkipSupportedIfTake = false,
4444
TakeHintsSupported = null,
4545
IsSubQueryTakeSupported = true,
46+
IsDerivedTableTakeSupported = true,
4647
IsCorrelatedSubQueryTakeSupported = true,
4748
IsSupportsJoinWithoutCondition = true,
4849
IsSubQuerySkipSupported = true,

Source/LinqToDB/DataProvider/Firebird/FirebirdDataProvider.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ protected FirebirdDataProvider(string name, FirebirdVersion version)
4444
SqlProviderFlags.IsUpdateTakeSupported = true;
4545
SqlProviderFlags.IsUpdateSkipTakeSupported = true;
4646

47+
SqlProviderFlags.SupportedCorrelatedSubqueriesLevel = 1;
48+
4749
SetCharField("CHAR", (r,i) => r.GetString(i).TrimEnd(' '));
4850
SetCharFieldToType<char>("CHAR", DataTools.GetCharExpression);
4951

Source/LinqToDB/DataProvider/Firebird/FirebirdSqlExpressionConvertVisitor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ protected override IQueryElement VisitExprPredicate(SqlPredicate.Expr predicate)
170170
{
171171
if (predicate.ElementType == QueryElementType.ExprPredicate && predicate.Expr1 is SqlParameter p && p.Type.DataType != DataType.Boolean)
172172
{
173-
predicate = new SqlPredicate.ExprExpr(p, SqlPredicate.Operator.Equal, MappingSchema.GetSqlValue(p.Type, true), p.CanBeNull);
173+
predicate = new SqlPredicate.ExprExpr(p, SqlPredicate.Operator.Equal, MappingSchema.GetSqlValue(p.Type, true), DataOptions.LinqOptions.CompareNullsAsValues ? true : null);
174174
}
175175

176176
return base.VisitExprPredicate(predicate);

Source/LinqToDB/DataProvider/Informix/InformixDataProvider.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,15 @@ public abstract class InformixDataProvider : DynamicDataProviderBase<InformixPro
2323
protected InformixDataProvider(string name, InformixProvider provider)
2424
: base(name, GetMappingSchema(provider), InformixProviderAdapter.GetInstance(provider))
2525
{
26-
SqlProviderFlags.IsParameterOrderDependent = !Adapter.IsIDSProvider;
27-
SqlProviderFlags.IsSubQueryTakeSupported = false;
28-
SqlProviderFlags.IsInsertOrUpdateSupported = false;
29-
SqlProviderFlags.IsCommonTableExpressionsSupported = true;
30-
SqlProviderFlags.IsSubQueryOrderBySupported = true;
31-
SqlProviderFlags.IsUpdateFromSupported = false;
32-
SqlProviderFlags.RowConstructorSupport = RowFeature.Equality | RowFeature.In;
33-
SqlProviderFlags.IsExistsPreferableForContains = true;
26+
SqlProviderFlags.IsParameterOrderDependent = !Adapter.IsIDSProvider;
27+
SqlProviderFlags.IsSubQueryTakeSupported = false;
28+
SqlProviderFlags.IsInsertOrUpdateSupported = false;
29+
SqlProviderFlags.IsCommonTableExpressionsSupported = true;
30+
SqlProviderFlags.IsSubQueryOrderBySupported = false;
31+
SqlProviderFlags.IsUpdateFromSupported = false;
32+
SqlProviderFlags.RowConstructorSupport = RowFeature.Equality | RowFeature.In;
33+
SqlProviderFlags.IsExistsPreferableForContains = true;
34+
SqlProviderFlags.IsCorrelatedSubQueryTakeSupported = false;
3435

3536
SetCharField("CHAR", (r,i) => r.GetString(i).TrimEnd(' '));
3637
SetCharField("NCHAR", (r,i) => r.GetString(i).TrimEnd(' '));

Source/LinqToDB/DataProvider/MySql/MySqlDataProvider.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ protected MySqlDataProvider(string name, MySqlVersion version, MySqlProvider pro
4444
SqlProviderFlags.IsWindowFunctionsSupported = Version >= MySqlVersion.MySql80;
4545

4646
SqlProviderFlags.IsSubqueryWithParentReferenceInJoinConditionSupported = false;
47-
SqlProviderFlags.IsColumnSubqueryWithParentReferenceSupported = false;
48-
SqlProviderFlags.RowConstructorSupport = RowFeature.Equality | RowFeature.Comparisons | RowFeature.CompareToSelect | RowFeature.In;
47+
SqlProviderFlags.SupportedCorrelatedSubqueriesLevel = 1;
48+
SqlProviderFlags.RowConstructorSupport = RowFeature.Equality | RowFeature.Comparisons | RowFeature.CompareToSelect | RowFeature.In;
4949

5050
SqlProviderFlags.IsUpdateTakeSupported = true;
5151

Source/LinqToDB/DataProvider/Oracle/OracleDataProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ protected OracleDataProvider(string name, OracleProvider provider, OracleVersion
3939
SqlProviderFlags.IsNamingQueryBlockSupported = true;
4040
SqlProviderFlags.IsRowNumberWithoutOrderBySupported = false;
4141
SqlProviderFlags.IsSubqueryWithParentReferenceInJoinConditionSupported = false;
42-
SqlProviderFlags.IsColumnSubqueryWithParentReferenceSupported = false;
42+
SqlProviderFlags.SupportedCorrelatedSubqueriesLevel = 1;
4343
SqlProviderFlags.IsColumnSubqueryShouldNotContainParentIsNotNull = true;
4444
SqlProviderFlags.IsColumnSubqueryWithParentReferenceAndTakeSupported = version >= OracleVersion.v12;
4545

Source/LinqToDB/DataProvider/SQLite/SQLiteDataProvider.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ protected SQLiteDataProvider(string name, SQLiteProvider provider)
5050
SqlProviderFlags.IsUpdateTakeSupported = Provider == SQLiteProvider.System;
5151
SqlProviderFlags.IsUpdateSkipTakeSupported = Provider == SQLiteProvider.System;
5252

53+
SqlProviderFlags.SupportedCorrelatedSubqueriesLevel = null;
54+
5355
// 3.15.0
5456
SqlProviderFlags.RowConstructorSupport = RowFeature.Equality | RowFeature.Comparisons | RowFeature.UpdateLiteral |
5557
RowFeature.CompareToSelect | RowFeature.Between | RowFeature.Update;

Source/LinqToDB/DataProvider/SqlProviderHelper.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ public static class SqlProviderHelper
99
{
1010
internal static readonly ObjectPool<SqlQueryValidatorVisitor> ValidationVisitorPool = new(() => new SqlQueryValidatorVisitor(), v => v.Cleanup(), 100);
1111

12-
public static bool IsValidQuery(SelectQuery selectQuery, SelectQuery? parentQuery, SqlJoinedTable? fakeJoin, bool forColumn, SqlProviderFlags providerFlags, out string? errorMessage)
12+
public static bool IsValidQuery(SelectQuery selectQuery, SelectQuery? parentQuery, SqlJoinedTable? fakeJoin, int? columnSubqueryLevel, SqlProviderFlags providerFlags, out string? errorMessage)
1313
{
1414
using var visitor = ValidationVisitorPool.Allocate();
1515

16-
return visitor.Value.IsValidQuery(selectQuery, parentQuery, fakeJoin, forColumn, providerFlags, out errorMessage);
16+
return visitor.Value.IsValidQuery(selectQuery, parentQuery, fakeJoin, columnSubqueryLevel, providerFlags, out errorMessage);
1717
}
1818
}
1919
}

Source/LinqToDB/DataProvider/SqlServer/SqlServerDataProvider.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ protected SqlServerDataProvider(string name, SqlServerVersion version, SqlServer
6262
SqlProviderFlags.TakeHintsSupported = TakeHints.Percent | TakeHints.WithTies;
6363
SqlProviderFlags.IsCommonTableExpressionsSupported = true;
6464
SqlProviderFlags.IsRowNumberWithoutOrderBySupported = false;
65-
SqlProviderFlags.IsSubQueryTakeSupported = version > SqlServerVersion.v2005;
6665
SqlProviderFlags.IsCTESupportsOrdering = false;
6766
SqlProviderFlags.IsUpdateTakeSupported = true;
6867

Source/LinqToDB/DataProvider/Sybase/SybaseDataProvider.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ protected SybaseDataProvider(string name, SybaseProviderAdapter adapter)
4444
SqlProviderFlags.IsDerivedTableOrderBySupported = false;
4545
SqlProviderFlags.IsUpdateTakeSupported = true;
4646

47-
SqlProviderFlags.IsColumnSubqueryWithParentReferenceSupported = false;
48-
SqlProviderFlags.IsCorrelatedSubQueryTakeSupported = false;
49-
SqlProviderFlags.IsJoinDerivedTableWithTakeInvalid = true;
47+
SqlProviderFlags.SupportedCorrelatedSubqueriesLevel = 1;
48+
SqlProviderFlags.IsCorrelatedSubQueryTakeSupported = false;
49+
SqlProviderFlags.IsJoinDerivedTableWithTakeInvalid = true;
5050

5151
SetCharField("char", (r,i) => r.GetString(i).TrimEnd(' '));
5252
SetCharField("nchar", (r,i) => r.GetString(i).TrimEnd(' '));

Source/LinqToDB/ErrorHelper.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@
33
internal static class ErrorHelper
44
{
55
public const string Error_Correlated_Subqueries = "Provider does not support correlated subqueries.";
6+
public const string Error_Correlated_Subqueries_Level = "Provider does not support correlated subqueries in more than {0} level.";
67
public const string Error_OUTER_Joins = "Provider does not support CROSS/OUTER/LATERAL joins.";
8+
public const string Error_Squbquery_in_Column = "Provider does not support columns with subqueries.";
79
public const string Error_Take_in_Subquery = "Provider does not support Take value in subquery.";
810
public const string Error_Take_in_Correlated_Subquery = "Provider does not support Take value in correlated subquery.";
911
public const string Error_Join_Without_Condition = "Provider does not support JOIN without condition.";
1012
public const string Error_Join_ParentReference_Condition = "Provider does not support subqueries with JOIN which has reference to parent table in condition.";
1113
public const string Error_Skip_in_Subquery = "Provider does not support Skip value in subquery.";
1214
public const string Error_OrderBy_in_Subquery = "Provider does not support ORDER BY in subquery.";
15+
public const string Error_Take_in_Derived = "Provider does not support Take value in derived table.";
1316
public const string Error_OrderBy_in_Derived = "Provider does not support ORDER BY in derived table.";
1417
public const string Error_MutiTable_Insert = "Provider does not support multi-table insert.";
1518
public const string Error_SqlRow_in_Update = "Provider does not support SqlRow on the left-hand side of an UPDATE SET.";

Source/LinqToDB/Expressions/ConvertFromDataReaderExpression.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ namespace LinqToDB.Expressions
1313
using Mapping;
1414
using Reflection;
1515
using Tools;
16+
using Infrastructure;
1617

1718
sealed class ConvertFromDataReaderExpression : Expression
1819
{
@@ -342,7 +343,7 @@ public object GetRawValueSequential(DbDataReader dataReader, Type[] forTypes)
342343

343344
public override string ToString()
344345
{
345-
var result = $"ConvertFromDataReaderExpression<{_type.Name}>({_idx})";
346+
var result = $"ConvertFromDataReaderExpression[{_type.ShortDisplayName()}]({_idx})";
346347
if (CanBeNull == true || Type.IsNullable())
347348
result += "?";
348349
return result;

Source/LinqToDB/Linq/Builder/Attributes.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Linq.Expressions;
33

44
namespace LinqToDB.Linq.Builder
@@ -26,6 +26,7 @@ sealed class BuildsExpressionAttribute : Attribute
2626
public BuildsExpressionAttribute(ExpressionType type) { }
2727
public BuildsExpressionAttribute(ExpressionType type1, ExpressionType type2) { }
2828
public BuildsExpressionAttribute(ExpressionType type1, ExpressionType type2, ExpressionType type3) { }
29+
public BuildsExpressionAttribute(ExpressionType type1, ExpressionType type2, ExpressionType type3, ExpressionType type4) { }
2930
}
3031

3132
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = true)]

Source/LinqToDB/Linq/Builder/ContainsBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ public override IBuildContext Clone(CloningContext context)
187187

188188
if (useExists)
189189
{
190-
if (Builder.DataContext.SqlProviderFlags.DoesNotSupportCorrelatedSubquery)
190+
if (Builder.DataContext.SqlProviderFlags.SupportedCorrelatedSubqueriesLevel == 0)
191191
{
192192
return null;
193193
}

Source/LinqToDB/Linq/Builder/DefaultIfEmptyBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ public override Expression MakeExpression(Expression path, ProjectFlags flags)
173173
if (ExpressionEqualityComparer.Instance.Equals(newPath, path))
174174
return path;
175175

176-
if (flags.IsTraverse() || flags.IsRoot() || flags.IsTable() || flags.IsExtractProjection())
176+
if (flags.IsTraverse() || flags.IsRoot() || flags.IsTable() || flags.IsExtractProjection() || flags.IsAggregationRoot())
177177
return newPath;
178178

179179
if ((flags.IsSql() || flags.IsExpression()) && SequenceHelper.IsSpecialProperty(path, typeof(int?), NotNullPropName))

0 commit comments

Comments
 (0)