fix: restore v1.14.2 behavior for audit items A, C, E, H, and N - #122
Merged
Merged
Conversation
IQueryKitConfiguration got MaxNestingDepth and MaxInputLength after v1.14.2. A class that implements the interface directly did not compile, and a library built against v1.14.2 failed with TypeLoadException. The limits are now on the new interface IQueryKitParseLimits, which QueryKitConfiguration implements. A configuration without this interface uses the default limits of 32 levels and 5000 characters.
v1.14.2 had the public method ArithmeticOperator.FromSymbol. Its removal broke the source and the binaries of callers. The method is back with the same body. It is marked obsolete, because QueryKit does not use it and the next major version removes it.
…lues is on After v1.14.2, each filter value became a field read that EF Core sends as a SQL parameter. This changed the expression text, the SQL text, and the in-list SQL. On SQL Server at compatibility level 120 or less, in-list filters failed. The new setting ParameterizeFilterValues is false by default. When it is false, filter values are the same constants and constructor calls as in v1.14.2. When it is true, filter values are parameters, as before this change.
v1.14.2 replaced a clause on a prevented or unknown property with (true == true). Main removed the clause, which changes the rows that an OR returns. The new setting IgnoredClauseBehavior has the default ReplaceWithTrue, which gives the v1.14.2 behavior again. The value Remove keeps the behavior of main.
In v1.14.2, the public ReplaceAliasesWithPropertyPaths replaced a query name also after a dot. Main skipped it, which changed the result for direct callers. The parser does not call this method, so filters do not change.
This was referenced Sep 30, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This PR restores the v1.14.2 behavior on main for the audit items A, C, E, H, and N. After this PR, main keeps only the security fixes B, I, M, and P as breaking changes. Each item returns later as its own PR, so each change can get a separate decision.
There is one commit for each item. Each commit has a test that shows the v1.14.2 behavior.
Restored items
IQueryKitConfiguration.MaxNestingDepthandMaxInputLengthmove to a new interface,IQueryKitParseLimits.QueryKitConfigurationimplements both interfaces.IQueryKitConfigurationis the same as in v1.14.2 again. A configuration that implements onlyIQueryKitConfigurationgets the default limits, so the limits of item B stay in force.ArithmeticOperator.FromSymbol. The method is back with the v1.14.2 signature and body. It has[Obsolete].ParameterizeFilterValues(defaultfalse) sends the values as query parameters.true == trueagain, the same as v1.14.2. The new settingIgnoredClauseBehaviorhas the valuesReplaceWithTrue(default) andRemove.Removekeeps the behavior of main.ReplaceAliasesWithPropertyPaths. The public method replaces a query name after a dot again. The parser does not call this method, so filters do not change.Item D (message text) stays as it is on main. This PR does not change B, I, M, P, or the bug fixes.
Tests
dotnet test: 370 unit tests and 274 integration tests passed.(x.Title != null) AndAlso x.Title.EndsWith("b").DateTimeOffsetvalue with an offset is sent in UTC, for examplenew DateTimeOffset(637922232030000000, 00:00:00)in place ofnew DateTimeOffset(637922304030000000, 02:00:00). The instant is the same.