Details
-
Bug
-
Status: Confirmed (View Workflow)
-
Major
-
Resolution: Unresolved
-
11.8, 12.3, 13.0, 11.8.8
-
None
-
None
Description
-
- Affected version
- MariaDB `11.8.8-MariaDB-debug`
- Source revision: `46a8eb42a520193686d9a16d4cea4b3e002917e4`
-
- Summary
The server aborts while executing an `UPDATE` against a view. The assigned expression contains a scalar subquery with tuple `IN`, derived tables, `NATURAL JOIN`, and a join-cache execution path.
The failing assertion is:
```text
mariadbd: /home/mysql/mariadb/sql/sql_join_cache.cc:2175:
enum_nested_loop_state JOIN_CACHE::join_records(bool):
Assertion `join_tab->cached_pfs_batch_update == join_tab->pfs_batch_update()' failed.
```
The stack includes:
```text
JOIN_CACHE::join_records(bool)
sub_select_cache(...)
sub_select(...)
join_tab_execution_startup(...)
evaluate_join_record(...)
do_select(...)
subselect_single_select_engine::exec()
Item_subselect::exec()
Item_singlerow_subselect::val_bool()
multi_update::send_data(...)
Sql_cmd_update::execute_inner(...)
```
This suggests that the cached join-tab PFS batch-update capability becomes inconsistent with the runtime handler state during join-cache execution.
-
- Steps to reproduce
Run the following SQL against a debug build:
```sql
SET GLOBAL TRANSACTION READ WRITE;
SET SESSION TRANSACTION READ WRITE;
DROP DATABASE IF EXISTS test_sqlright1;
CREATE DATABASE IF NOT EXISTS test_sqlright1;
USE test_sqlright1;
CREATE TABLE v1099(c1100 INT);
CREATE TABLE v0 (v1 INT);
INSERT INTO v0 (v1) VALUES (98);
CREATE VIEW v2 AS
SELECT *
FROM v0
WHERE EXISTS (SELECT DISTINCT v1, 78);
INSERT INTO v0 (v1)
VALUES
(
(
SELECT DISTINCT -128
FROM (
SELECT 'x', v1, 86 AS v9
FROM (
SELECT 'x' + 22 / 31 AS v12
FROM v0 AS v13
NATURAL JOIN v2 AS v11
NATURAL JOIN v0
) AS v8,
v0 AS v10
NATURAL JOIN v2
GROUP BY v1, v1
) AS v3
NATURAL JOIN v0 AS v4
NATURAL JOIN v2 AS v5,
v0 AS v6,
v0 AS v7
NATURAL JOIN v0
)
),
(-1);
UPDATE v2
SET v1 = (
(
SELECT v1 * -32768 + v1
FROM v2
WHERE (v1, v1) IN (
SELECT v1, v1
FROM (
SELECT 85 + 19 / 10 AS v15
FROM v0 AS v16
NATURAL JOIN v0 AS v17,
v2 AS v18
NATURAL JOIN v2,
v0 AS v19
) AS v14,
v2
)
)
OR CASE
WHEN v1 = 24 THEN v1
WHEN 80 = -1 THEN -1
ELSE 7 / 0
END
);
```
-
- Actual result
The server aborts:
```text
Assertion `join_tab->cached_pfs_batch_update == join_tab->pfs_batch_update()' failed.
got signal 6
JOIN_CACHE::join_records(bool)
sub_select_cache(...)
sub_select(...)
join_tab_execution_startup(...)
Sql_cmd_update::execute_inner(...)
Query: UPDATE v2 SET v1 = ...
```
After replay:
```text
server_ready 1
client_rc 0
server_alive_after 0
```
Attachments
Issue Links
- relates to
-
MDEV-22104 Assertion `m_psi_batch_mode == PSI_BATCH_MODE_NONE' failed in handler::ha_close with derived_merge=off
-
- In Review
-