cockroachdb / cockroachdb/cockroach
opt: choosing topk plan for select for update skip locked causes all rows to be locked
- 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
Assessment
This issue has not been assessed yet.