From bfb61c80b0cb9ec66bb823cf152a6a118de33665 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Thu, 19 Feb 2026 12:35:17 +0000 Subject: [PATCH 1/2] Optimize boolean filter SQL generation for non-nullable bool fields --- .../Boolean/QueryableBooleanEqualsHandler.cs | 8 ++ .../QueryableBooleanNotEqualsHandler.cs | 8 ++ ...nTests.Create_BooleanEqual_Expression.snap | 8 +- ...reate_BooleanEqual_Expression_NET10_0.snap | 8 +- ...sts.Create_BooleanNotEqual_Expression.snap | 8 +- ...te_BooleanNotEqual_Expression_NET10_0.snap | 8 +- ....Create_ObjectBooleanEqual_Expression.snap | 8 +- ...ObjectBooleanEqual_Expression_NET10_0.snap | 8 +- .../Expression/ExecutorBuilder.cs | 7 +- .../QueryableFilterVisitorBooleanTests.cs | 88 +++++++++++++++++++ 10 files changed, 122 insertions(+), 37 deletions(-) diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Boolean/QueryableBooleanEqualsHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Boolean/QueryableBooleanEqualsHandler.cs index fd514bfc847..632deb1fa80 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Boolean/QueryableBooleanEqualsHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Boolean/QueryableBooleanEqualsHandler.cs @@ -21,6 +21,14 @@ public override Expression HandleOperation( object? parsedValue) { var property = context.GetInstance(); + + if (parsedValue is bool boolValue && property.Type == typeof(bool)) + { + return boolValue + ? property + : FilterExpressionBuilder.Not(property); + } + return FilterExpressionBuilder.Equals(property, parsedValue); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Boolean/QueryableBooleanNotEqualsHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Boolean/QueryableBooleanNotEqualsHandler.cs index b4b67941817..662df22aebb 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Boolean/QueryableBooleanNotEqualsHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Boolean/QueryableBooleanNotEqualsHandler.cs @@ -21,6 +21,14 @@ public override Expression HandleOperation( object? parsedValue) { var property = context.GetInstance(); + + if (parsedValue is bool boolValue && property.Type == typeof(bool)) + { + return boolValue + ? FilterExpressionBuilder.Not(property) + : property; + } + return FilterExpressionBuilder.NotEquals(property, parsedValue); } diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanEqual_Expression.snap index bcaee35acb1..9016e04fe0d 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanEqual_Expression.snap @@ -13,11 +13,9 @@ true Result: true SQL: --------------- -.param set @__p_0 1 - SELECT "d"."Id", "d"."Bar" FROM "Data" AS "d" -WHERE "d"."Bar" = @__p_0 +WHERE "d"."Bar" --------------- false Result: @@ -35,9 +33,7 @@ false Result: false SQL: --------------- -.param set @__p_0 0 - SELECT "d"."Id", "d"."Bar" FROM "Data" AS "d" -WHERE "d"."Bar" = @__p_0 +WHERE NOT ("d"."Bar") --------------- diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanEqual_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanEqual_Expression_NET10_0.snap index 5df6d05dcd2..9016e04fe0d 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanEqual_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanEqual_Expression_NET10_0.snap @@ -13,11 +13,9 @@ true Result: true SQL: --------------- -.param set @p 1 - SELECT "d"."Id", "d"."Bar" FROM "Data" AS "d" -WHERE "d"."Bar" = @p +WHERE "d"."Bar" --------------- false Result: @@ -35,9 +33,7 @@ false Result: false SQL: --------------- -.param set @p 0 - SELECT "d"."Id", "d"."Bar" FROM "Data" AS "d" -WHERE "d"."Bar" = @p +WHERE NOT ("d"."Bar") --------------- diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanNotEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanNotEqual_Expression.snap index 939efa45efc..958c64fd6e2 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanNotEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanNotEqual_Expression.snap @@ -13,11 +13,9 @@ true Result: true SQL: --------------- -.param set @__p_0 1 - SELECT "d"."Id", "d"."Bar" FROM "Data" AS "d" -WHERE "d"."Bar" <> @__p_0 +WHERE NOT ("d"."Bar") --------------- false Result: @@ -35,9 +33,7 @@ false Result: false SQL: --------------- -.param set @__p_0 0 - SELECT "d"."Id", "d"."Bar" FROM "Data" AS "d" -WHERE "d"."Bar" <> @__p_0 +WHERE "d"."Bar" --------------- diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanNotEqual_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanNotEqual_Expression_NET10_0.snap index 5e926877578..958c64fd6e2 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanNotEqual_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanNotEqual_Expression_NET10_0.snap @@ -13,11 +13,9 @@ true Result: true SQL: --------------- -.param set @p 1 - SELECT "d"."Id", "d"."Bar" FROM "Data" AS "d" -WHERE "d"."Bar" <> @p +WHERE NOT ("d"."Bar") --------------- false Result: @@ -35,9 +33,7 @@ false Result: false SQL: --------------- -.param set @p 0 - SELECT "d"."Id", "d"."Bar" FROM "Data" AS "d" -WHERE "d"."Bar" <> @p +WHERE "d"."Bar" --------------- diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectBooleanEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectBooleanEqual_Expression.snap index 9631408fff9..5fc63f7d6af 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectBooleanEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectBooleanEqual_Expression.snap @@ -30,12 +30,10 @@ true Result: true SQL: --------------- -.param set @__p_0 1 - SELECT "d"."Id", "d"."FooId" FROM "Data" AS "d" INNER JOIN "Foo" AS "f" ON "d"."FooId" = "f"."Id" -WHERE "f"."BarBool" = @__p_0 +WHERE "f"."BarBool" --------------- false Result: @@ -55,10 +53,8 @@ false Result: false SQL: --------------- -.param set @__p_0 0 - SELECT "d"."Id", "d"."FooId" FROM "Data" AS "d" INNER JOIN "Foo" AS "f" ON "d"."FooId" = "f"."Id" -WHERE "f"."BarBool" = @__p_0 +WHERE NOT ("f"."BarBool") --------------- diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectBooleanEqual_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectBooleanEqual_Expression_NET10_0.snap index aa9671ed017..5fc63f7d6af 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectBooleanEqual_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectBooleanEqual_Expression_NET10_0.snap @@ -30,12 +30,10 @@ true Result: true SQL: --------------- -.param set @p 1 - SELECT "d"."Id", "d"."FooId" FROM "Data" AS "d" INNER JOIN "Foo" AS "f" ON "d"."FooId" = "f"."Id" -WHERE "f"."BarBool" = @p +WHERE "f"."BarBool" --------------- false Result: @@ -55,10 +53,8 @@ false Result: false SQL: --------------- -.param set @p 0 - SELECT "d"."Id", "d"."FooId" FROM "Data" AS "d" INNER JOIN "Foo" AS "f" ON "d"."FooId" = "f"."Id" -WHERE "f"."BarBool" = @p +WHERE NOT ("f"."BarBool") --------------- diff --git a/src/HotChocolate/Data/test/Data.Filters.Tests/Expression/ExecutorBuilder.cs b/src/HotChocolate/Data/test/Data.Filters.Tests/Expression/ExecutorBuilder.cs index 2bd54d930e0..9f08c551294 100644 --- a/src/HotChocolate/Data/test/Data.Filters.Tests/Expression/ExecutorBuilder.cs +++ b/src/HotChocolate/Data/test/Data.Filters.Tests/Expression/ExecutorBuilder.cs @@ -13,6 +13,11 @@ public ExecutorBuilder(IFilterInputType inputType) } public Func Build(IValueNode filter) + { + return BuildExpression(filter).Compile(); + } + + public Expression> BuildExpression(IValueNode filter) { var visitorContext = new QueryableFilterContext(_inputType, true); var visitor = new FilterVisitor( @@ -22,7 +27,7 @@ public Func Build(IValueNode filter) if (visitorContext.TryCreateLambda(out Expression>? where)) { - return where.Compile(); + return where; } throw new InvalidOperationException(); diff --git a/src/HotChocolate/Data/test/Data.Filters.Tests/Expression/QueryableFilterVisitorBooleanTests.cs b/src/HotChocolate/Data/test/Data.Filters.Tests/Expression/QueryableFilterVisitorBooleanTests.cs index fa280768bd5..d4646101cba 100644 --- a/src/HotChocolate/Data/test/Data.Filters.Tests/Expression/QueryableFilterVisitorBooleanTests.cs +++ b/src/HotChocolate/Data/test/Data.Filters.Tests/Expression/QueryableFilterVisitorBooleanTests.cs @@ -1,3 +1,4 @@ +using System.Linq.Expressions; using HotChocolate.Language; namespace HotChocolate.Data.Filters.Expressions; @@ -40,6 +41,93 @@ public void Create_BooleanNotEqual_Expression() Assert.False(func(b)); } + [Fact] + public void Create_BooleanEqual_Expression_True_Uses_Direct_Property() + { + // arrange + var value = Utf8GraphQLParser.Syntax.ParseValueLiteral("{ bar: { eq: true }}"); + var tester = CreateProviderTester(new FooFilterInput()); + + // act + var expr = tester.BuildExpression(value); + + // assert - the in-memory context wraps with NotNullAndAlso(x, condition), + // so the body is AndAlso(x != null, condition). The right side should be + // a direct property access (MemberExpression), not an Equal comparison. + var andAlso = Assert.IsAssignableFrom(expr.Body); + Assert.Equal(ExpressionType.AndAlso, andAlso.NodeType); + Assert.IsAssignableFrom(andAlso.Right); + } + + [Fact] + public void Create_BooleanEqual_Expression_False_Uses_Not() + { + // arrange + var value = Utf8GraphQLParser.Syntax.ParseValueLiteral("{ bar: { eq: false }}"); + var tester = CreateProviderTester(new FooFilterInput()); + + // act + var expr = tester.BuildExpression(value); + + // assert - right side of AndAlso should be Not(property) + var andAlso = Assert.IsAssignableFrom(expr.Body); + Assert.Equal(ExpressionType.AndAlso, andAlso.NodeType); + var not = Assert.IsType(andAlso.Right); + Assert.Equal(ExpressionType.Not, not.NodeType); + Assert.IsAssignableFrom(not.Operand); + } + + [Fact] + public void Create_BooleanNotEqual_Expression_True_Uses_Not() + { + // arrange + var value = Utf8GraphQLParser.Syntax.ParseValueLiteral("{ bar: { neq: true }}"); + var tester = CreateProviderTester(new FooFilterInput()); + + // act + var expr = tester.BuildExpression(value); + + // assert - right side of AndAlso should be Not(property) + var andAlso = Assert.IsAssignableFrom(expr.Body); + Assert.Equal(ExpressionType.AndAlso, andAlso.NodeType); + var not = Assert.IsType(andAlso.Right); + Assert.Equal(ExpressionType.Not, not.NodeType); + Assert.IsAssignableFrom(not.Operand); + } + + [Fact] + public void Create_BooleanNotEqual_Expression_False_Uses_Direct_Property() + { + // arrange + var value = Utf8GraphQLParser.Syntax.ParseValueLiteral("{ bar: { neq: false }}"); + var tester = CreateProviderTester(new FooFilterInput()); + + // act + var expr = tester.BuildExpression(value); + + // assert - right side of AndAlso should be direct property access + var andAlso = Assert.IsAssignableFrom(expr.Body); + Assert.Equal(ExpressionType.AndAlso, andAlso.NodeType); + Assert.IsAssignableFrom(andAlso.Right); + } + + [Fact] + public void Create_NullableBooleanEqual_Expression_Uses_Equality() + { + // arrange + var value = Utf8GraphQLParser.Syntax.ParseValueLiteral("{ bar: { eq: true }}"); + var tester = CreateProviderTester(new FooNullableFilterInput()); + + // act + var expr = tester.BuildExpression(value); + + // assert - nullable bool should still use Equal (not optimized). + // The body is AndAlso(x != null, condition) where condition is Equal. + var andAlso = Assert.IsAssignableFrom(expr.Body); + Assert.Equal(ExpressionType.AndAlso, andAlso.NodeType); + Assert.Equal(ExpressionType.Equal, andAlso.Right.NodeType); + } + [Fact] public void Create_NullableBooleanEqual_Expression() { From e089ca9eb124c0f87b6b3a56fc20236d4e42337d Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Thu, 19 Feb 2026 22:22:28 +0000 Subject: [PATCH 2/2] updated snapshots --- ...terVisitorBooleanTests.Create_BooleanEqual_Expression.snap | 4 ++-- ...VisitorBooleanTests.Create_BooleanNotEqual_Expression.snap | 4 ++-- ...sitorObjectTests.Create_ObjectBooleanEqual_Expression.snap | 4 ++-- ...VisitorBooleanTests.Create_BooleanNotEqual_Expression.snap | 4 ++-- ...itorExecutableTests.Create_BooleanNotEqual_Expression.snap | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanEqual_Expression.snap index 36e47ae5381..e3a938c05c9 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanEqual_Expression.snap @@ -13,7 +13,7 @@ true Result: true SQL: --------------- -select d.id, d.data from public.mt_doc_queryablefiltervisitorbooleantests_foo as d where CAST(d.data ->> 'Bar' as boolean) = :p0; +select d.id, d.data from public.mt_doc_queryablefiltervisitorbooleantests_foo as d where (d.data ->> 'Bar' is not null and CAST(d.data ->> 'Bar' as boolean) = True); --------------- false Result: @@ -31,5 +31,5 @@ false Result: false SQL: --------------- -select d.id, d.data from public.mt_doc_queryablefiltervisitorbooleantests_foo as d where CAST(d.data ->> 'Bar' as boolean) = :p0; +select d.id, d.data from public.mt_doc_queryablefiltervisitorbooleantests_foo as d where (d.data ->> 'Bar' is null or CAST(d.data ->> 'Bar' as boolean) = False); --------------- diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanNotEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanNotEqual_Expression.snap index 64779948f97..b25d223aa71 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanNotEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanNotEqual_Expression.snap @@ -13,7 +13,7 @@ true Result: true SQL: --------------- -select d.id, d.data from public.mt_doc_queryablefiltervisitorbooleantests_foo as d where CAST(d.data ->> 'Bar' as boolean) != :p0; +select d.id, d.data from public.mt_doc_queryablefiltervisitorbooleantests_foo as d where (d.data ->> 'Bar' is null or CAST(d.data ->> 'Bar' as boolean) = False); --------------- false Result: @@ -31,5 +31,5 @@ false Result: false SQL: --------------- -select d.id, d.data from public.mt_doc_queryablefiltervisitorbooleantests_foo as d where CAST(d.data ->> 'Bar' as boolean) != :p0; +select d.id, d.data from public.mt_doc_queryablefiltervisitorbooleantests_foo as d where (d.data ->> 'Bar' is not null and CAST(d.data ->> 'Bar' as boolean) = True); --------------- diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectBooleanEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectBooleanEqual_Expression.snap index bb5668801ec..c5e47738707 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectBooleanEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectBooleanEqual_Expression.snap @@ -20,7 +20,7 @@ true Result: true SQL: --------------- -select d.id, d.data from public.mt_doc_queryablefiltervisitorobjecttests_bar as d where CAST(d.data -> 'Foo' ->> 'BarBool' as boolean) = :p0; +select d.id, d.data from public.mt_doc_queryablefiltervisitorobjecttests_bar as d where (d.data -> 'Foo' ->> 'BarBool' is not null and CAST(d.data -> 'Foo' ->> 'BarBool' as boolean) = True); --------------- false Result: @@ -40,5 +40,5 @@ false Result: false SQL: --------------- -select d.id, d.data from public.mt_doc_queryablefiltervisitorobjecttests_bar as d where CAST(d.data -> 'Foo' ->> 'BarBool' as boolean) = :p0; +select d.id, d.data from public.mt_doc_queryablefiltervisitorobjecttests_bar as d where (d.data -> 'Foo' ->> 'BarBool' is null or CAST(d.data -> 'Foo' ->> 'BarBool' as boolean) = False); --------------- diff --git a/src/HotChocolate/Raven/test/Data.Raven.Filters.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanNotEqual_Expression.snap b/src/HotChocolate/Raven/test/Data.Raven.Filters.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanNotEqual_Expression.snap index 0cbddaf5ad7..432dc53f119 100644 --- a/src/HotChocolate/Raven/test/Data.Raven.Filters.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanNotEqual_Expression.snap +++ b/src/HotChocolate/Raven/test/Data.Raven.Filters.Tests/__snapshots__/QueryableFilterVisitorBooleanTests.Create_BooleanNotEqual_Expression.snap @@ -13,7 +13,7 @@ true Result: true SQL: --------------- -from 'Foos' where Bar != $p0 +from 'Foos' where Bar = $p0 --------------- false Result: @@ -31,5 +31,5 @@ false Result: false SQL: --------------- -from 'Foos' where Bar != $p0 +from 'Foos' where Bar = $p0 --------------- diff --git a/src/HotChocolate/Raven/test/Data.Raven.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanNotEqual_Expression.snap b/src/HotChocolate/Raven/test/Data.Raven.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanNotEqual_Expression.snap index f6f472c7ca3..bf16ff659fc 100644 --- a/src/HotChocolate/Raven/test/Data.Raven.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanNotEqual_Expression.snap +++ b/src/HotChocolate/Raven/test/Data.Raven.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanNotEqual_Expression.snap @@ -13,7 +13,7 @@ true Result: true SQL: --------------- -from 'Foos' where Bar != $p0 +from 'Foos' where Bar = $p0 --------------- false Result: @@ -31,5 +31,5 @@ false Result: false SQL: --------------- -from 'Foos' where Bar != $p0 +from 'Foos' where Bar = $p0 ---------------