Technical Advisory 88047

On this page Carat arrow pointing down

Publication date: September 29, 2022

Description

In CockroachDB v22.1.0 to v22.1.7, querying a REGIONAL BY ROW or partitioned multi-region table with an inverted index could produce incorrect results if the query has a LIMIT of less than 100,000 and uses the inverted index. In this case, it is possible that the optimizer will erroneously discard the predicate over the inverted index and therefore return some rows that do not match the predicate.

Statement

This is resolved in CockroachDB by #88079.

The fix has been applied to the maintenance release of CockroachDB v22.1.8.

This public issue is tracked by #88047.

Mitigation

Users of CockroachDB v22.1.0 to v22.1.7 are encouraged to upgrade to v22.1.8 or a later version.

To determine whether your queries may be affected by this issue on v22.1.0 to v22.1.7, you should examine the query plans of any LIMIT queries over REGIONAL BY ROW or partitioned multi-region tables with inverted indexes by using EXPLAIN (OPT). If the resulting plan shows locality-optimized-search, these queries may produce incorrect results.

For example:

icon/buttons/copy
EXPLAIN(OPT)
  SELECT * FROM t88047
WHERE json_col->'loc' @> '{"state":"NY"}'
  LIMIT 2
----
index-join t88047
 └── locality-optimized-search
      ├── scan t88047@t88047_inv_idx
      │    ├── constraint: /11: [/'ap-southeast-2' - /'ap-southeast-2']
      │    └── limit: 2
      └── scan t88047@t88047_inv_idx
           ├── constraint: /18
           │    ├── [/'ca-central-1' - /'ca-central-1']
           │    └── [/'us-east-1' - /'us-east-1']
           └── limit: 2

Note that this query plan is incorrect: it should contain an "inverted constraint" with the JSON predicate, but it does not, which is why the query may return incorrect results. To mitigate this problem for affected queries on v22.1.0 to v22.1.7, either remove inverted indexes from all REGIONAL BY ROW and partitioned multi-region tables, or set the session setting locality_optimized_partitioned_index_scan or cluster setting sql.defaults.locality_optimized_partitioned_index_scan.enabled to false, which disables locality-optimized-search.

The best mitigation, however, is to upgrade to v22.1.8 as soon as possible.

Impact

Some queries over REGIONAL BY ROW or partitioned multi-region tables with a LIMIT clause could produce incorrect results if the scanned index is INVERTED and uses an inverted constraint with JSONB operators, ARRAY operators, or operators on spatial data. Versions affected include v22.1.0-alpha.1 to v22.1.7.

Please reach out to the support team if more information or assistance is needed.


Yes No
On this page

Yes No