Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

inverted: fix intersection of SpanExpressions in some cases #118256

Merged
merged 1 commit into from
Jan 26, 2024

Commits on Jan 26, 2024

  1. inverted: fix intersection of SpanExpressions in some cases

    This commit fixes the logic for intersecting two SpanExpressions in some
    cases. In particular, consider the following example:
    - left expr is `ARRAY['str1'] <@ t.links` which translates to
    a SpanExpression in which only FactoredUnionSpans is set to the span
    containing `str1`
    - right expr is `ARRAY ['str1'] && t.links OR ...` which translates to
    a SpanExpression in which FactoredUnionSpans is set to exactly same span
    containing `str1` plus some other stuff in children expressions.
    
    In other words, we have `a AND (a OR b)`.
    
    When intersecting SpanExpressions, we intersect their
    FactoredUnionSpans, and then we update FactoredUnionSpans of expressions
    to subtract the shared ones. Previously, in the example above this would
    result in making the left expression empty, so it would be pruned.
    However, that is incorrect - we have the equivalent of `left AND right`,
    so we must ensure that `left` expression is satisfied, and previously
    this wouldn't be the case. The fix is that if one of the children
    expressions became empty, then intersection of two children is also
    empty, so instead of promoting non-empty child we now nil non-empty
    child out. In the example above, previously we would get `a OR b`, and
    now we'll correctly get `a`.
    
    Release note (bug fix): Previously, in some cases CockroachDB could
    incorrectly evaluate queries that scanned an inverted index and had
    a `WHERE` filter in which two sides of the `AND` expression had
    "similar" expressions (e.g.
    `ARRAY['str1'] <@ col AND (ARRAY['str1'] && col OR ...)`), and this is
    now fixed. The bug has been present since pre-22.2 version.
    yuzefovich committed Jan 26, 2024
    Configuration menu
    Copy the full SHA
    970f45d View commit details
    Browse the repository at this point in the history