[DO NOT MERGE] fix: treat missing properties as null in FilterPredicate (#70)#71
Draft
McNultyyy wants to merge 10 commits into
Draft
[DO NOT MERGE] fix: treat missing properties as null in FilterPredicate (#70)#71McNultyyy wants to merge 10 commits into
McNultyyy wants to merge 10 commits into
Conversation
… round-trip (#64) ExprToString did not wrap TernaryExpression or CoalesceExpression in parentheses when they appeared as operands of higher-precedence binary, unary, BETWEEN, IN, or LIKE operators. When the SDK's transformed query was round-tripped through SimplifySdkQuery → re-parse, the missing parentheses produced a different AST — causing COUNT(expr) to evaluate the wrong condition and miscount documents. Added WrapIfLowPrecedence helper that wraps ternary/coalesce nodes in parens when they appear in operator positions that would otherwise re-parse with different associativity. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The EmulatorFlaky trait was blanket-excluding 12 tests from all emulator runs, creating a regression gap. The root cause was a single test (ConcurrentReadsOfNonExistent) overwhelming the emulator with 50 parallel requests. Instead of excluding the entire class, make the concurrency adaptive: - 50 concurrent reads for in-memory (fast, no resource constraints) - 10 concurrent reads for emulator targets (same assertion, lower volume) Changes: - Remove [Trait(TestTraits.Target, TestTraits.EmulatorFlaky)] from Issue18EdgeCaseIntegrationTests - Remove EmulatorFlaky constant from TestTraits.cs - Remove Target!=EmulatorFlaky filter from scripts/run-tests.ps1 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The Windows emulator can return 404 with substatus 0 during an intermediate startup state (between 403/1008 and fully ready). This was causing the EmulatorWarmup tool and EmulatorRetry to treat it as fatal, failing the parity workflow before tests even ran. Add 404/0 to the transient error set in both: - tests/EmulatorWarmup/Program.cs (warmup tool) - tests/.../EmulatorSession.cs (shared retry helper) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Documents how to publish beta/prerelease and stable packages via the existing release.yml workflow (tag push convention) for AI/LLM agent discoverability. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
String literal aliases (e.g. SELECT 'Settlement' AS Label, COUNT(1) ...) returned null on Linux because ProjectAggregateFields treated them as property paths via SelectToken. On Windows the bug was masked by ServiceInterop's native aggregate pipeline. The fix checks for non-identifier SqlExpr nodes in the else branch and evaluates them via EvaluateSqlExpression, matching the existing pattern used in the GROUP BY aggregate path. Covers string, numeric, boolean, and null literal aliases with integration tests. Bumps version to 4.0.19. Closes #67 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…gences ServiceInterop.dll is only available on Windows, causing fundamentally different code paths to execute. Adding a windows-latest integration test job ensures both paths are tested on every PR. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…it' into mcnultyyy/merge-prs-65-66-68
…ases-linux' into mcnultyyy/merge-prs-65-66-68
) In real Cosmos DB, FilterPredicate on patch operations treats missing properties as null, so 'FROM c WHERE c.prop = null' matches documents where the property is absent (e.g. due to NullValueHandling.Ignore). Add treatUndefinedAsNull parameter to the WHERE evaluation chain, passed as true only from the two FilterPredicate call sites. This preserves existing query semantics (undefined != null) while fixing the FilterPredicate behavior. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
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.
Motivation
When using
NullValueHandling.Ignorewith Newtonsoft.Json, properties set tonullare omitted from the serialized document entirely. In real Cosmos DB, FilterPredicate on patch operations treats these missing properties as null -- so a condition likeFROM c WHERE c.prop = nullcorrectly matches documents where the property is absent. The in-memory emulator was returningPreconditionFailedinstead, because itsEvaluateComparisonmethod short-circuits tofalsewhen either operand isUndefinedValue.Fixes: #70
Approach
Added a
treatUndefinedAsNullparameter through the WHERE expression evaluation chain (EvaluateWhereExpression->EvaluateComparison->EvaluateWhereExpressionIncludesUndefined->ComparisonIncludesUndefined). This parameter is passed astrueonly from the two FilterPredicate call sites inPatchItemCoreand its stream-based counterpart. When enabled,UndefinedValueis converted tonullbefore comparison.This preserves existing query semantics (where
undefined != nullper Cosmos DB spec) while fixing FilterPredicate behavior.Tests
Issue70FilterPredicateMissingPropertyTests.cs): 4 tests exercising the full SDK HTTP pipeline with a customNullValueHandling.IgnoreserializerPatchDeepDiveTests.cs): 5 tests usingInMemoryContainerdirectly to verify missing-property-equals-null behavior in filter predicatesAll tests tagged
[Trait(TestTraits.Target, TestTraits.InMemoryOnly)]since the Windows Cosmos DB Emulator v2.14.0 doesn't support FilterPredicate syntax (tracked in #53).Notes
mcnultyyy/merge-prs-65-66-68)