Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-40898

Assertion `cached_pfs_batch_update == pfs_batch_update()` fails in `JOIN_CACHE::join_records()`

    XMLWordPrintable

Details

    • Bug
    • Status: Confirmed (View Workflow)
    • Major
    • Resolution: Unresolved
    • 11.8, 12.3, 13.0, 11.8.8
    • 11.8, 12.3, 13.0
    • None
    • None

    Description

        1. Affected version
      • MariaDB `11.8.8-MariaDB-debug`
      • Source revision: `46a8eb42a520193686d9a16d4cea4b3e002917e4`
        1. 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.

        1. 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
      );
      ```

        1. 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

          Activity

            People

              psergei Sergei Petrunia
              v3rdant Xingwang Xiang
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

                Created:
                Updated:

                Git Integration

                  Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.