Fix bc-version overflow and pathless-row identity in bounded retrieval

Catalog matching compared an Int32 -BCVersion against a bigint range bound.
PowerShell coerces the right operand to the left operand's type, so a bound
wider than Int32 threw a conversion error and failed the whole domain catalog
rather than the single row. Metadata validation already accepts such bounds,
so compare as bigint on both sides.

The shared pager built its oversized-row message with $row.path, which
throws under Set-StrictMode -Version Latest when a row carries no path,
replacing the explicit bound failure with a property-lookup error. Resolve the
path defensively for dictionary and object rows so the offset-based fallback
is reachable.

Both paths gain regression coverage that fails without these fixes.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
Jesper Schulz-Wedde 2026-09-11 12:06:55 +02:00
parent 6a89831c5c
commit 524c2d979e
3 changed files with 43 additions and 4 deletions

View file

@ -142,12 +142,15 @@ foreach ($path in $paths) {
$target = $context[$field]
$matched = $false
if ($field -eq 'bc-version') {
# Compare as bigint on both sides: metadata validation accepts bounds
# wider than Int32, and an int left operand would coerce them down.
$targetVersion = [bigint]$target
if ($values.Count -eq 1 -and $values[0] -match '^(\d+)\.\.(\d+)?$') {
$matched = $target -ge [bigint]::Parse($Matches[1]) -and
(-not $Matches[2] -or $target -le [bigint]::Parse($Matches[2]))
$matched = $targetVersion -ge [bigint]::Parse($Matches[1]) -and
(-not $Matches[2] -or $targetVersion -le [bigint]::Parse($Matches[2]))
}
else {
$matched = @($values | Where-Object { [bigint]::Parse($_) -eq $target }).Count -gt 0
$matched = @($values | Where-Object { [bigint]::Parse($_) -eq $targetVersion }).Count -gt 0
}
}
else {