cockroachdb / cockroachdb/cockroach

opt: choosing topk plan for select for update skip locked causes all rows to be locked

Open
#173,245 9 comments 0 reactions 1 assignee Claimed by @michae2 View on GitHub
A-sql-optimizer C-performance O-community T-sql-queries
Dominant language
Go
Stars
32.5k
Forks
4.1k
PR merge metrics
PR metrics pending

Description

**To Reproduce**

# cockroachdb shell 1
```
root@127.0.0.1:26257/defaultdb> CREATE DATABASE skiplocked_repro;
CREATE DATABASE
root@127.0.0.1:26257/defaultdb> USE skiplocked_repro;
SET
root@127.0.0.1:26257/skiplocked_repro> CREATE TABLE versions (version INT8 NULL, commited_at STRING NULL);
CREATE TABLE
root@127.0.0.1:26257/skiplocked_repro> INSERT INTO versions (version, commited_at) VALUES (2, 'b'), (1, 'a');
INSERT 0 2
root@127.0.0.1:26257/skiplocked_repro> BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN
root@127.0.0.1:26257/skiplocked_repro OPEN> SELECT * FROM versions WHERE version > 0 ORDER BY version FOR UPDATE SKIP LOCKED LIMIT 1;
version | commited_at
----------+--------------
1 | a
(1 row)
```

# cockroachdb shell 2

```
root@127.0.0.1:26257/defaultdb> USE skiplocked_repro;
SET
root@127.0.0.1:26257/skiplocked_repro> BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN
root@127.0.0.1:26257/skiplocked_repro OPEN> SELECT * FROM versions WHERE version > 0 ORDER BY version FOR UPDATE SKIP LOCKED LIMIT 1;
version | commited_at
----------+--------------
(0 rows)
```

**Expected behavior**

In postgres, 2nd shell will return a record:

# postgres shell 1
```
postgres=# CREATE DATABASE skiplocked_repro;
CREATE DATABASE
postgres=# \c skiplocked_repro
You are now connected to database "skiplocked_repro" as user "postgres".
skiplocked_repro=# CREATE TABLE versions (version BIGINT, commited_at TEXT);
CREATE TABLE
skiplocked_repro=# INSERT INTO versions (version, commited_at) VALUES (2, 'b'), (1, 'a');
INSERT 0 2
skiplocked_repro=# BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN
skiplocked_repro=*# SELECT * FROM versions WHERE version > 0 ORDER BY version FOR UPDATE SKIP LOCKED LIMIT 1;
version | commited_at
---------+-------------
1 | a
(1 row)
```

# postgres shell 2

```
postgres=# \c skiplocked_repro
You are now connected to database "skiplocked_repro" as user "postgres".
skiplocked_repro=# BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN
skiplocked_repro=*# SELECT * FROM versions WHERE version > 0 ORDER BY version FOR UPDATE SKIP LOCKED LIMIT 1;
version | commited_at
---------+-------------
2 | b
(1 row)
```

**Environment:**
- CockroachDB v26.2.2
- PostgreSQL 18.4

Jira issue: CRDB-66561

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.