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

Assertion `n < width` fails in `Bitmap<64>::bit_mask()` during temporary key generation

    XMLWordPrintable

Details

    • Hide
      ## Affected version

      - MariaDB `11.8.8-MariaDB-debug`
      - Source revision: `46a8eb42a520193686d9a16d4cea4b3e002917e4`

      ## Summary

      The server aborts with a debug assertion while optimizing a SELECT over nested views and derived tables with multiple `NATURAL JOIN`s. The failing assertion is:

      ```text
      mariadbd: /home/mysql/mariadb/sql/sql_bitmap.h:77:
      ulonglong Bitmap<64>::bit_mask(uint) const [width = 64]:
      Assertion `n < width' failed.
      ```

      The stack goes through temporary key construction:

      ```text
      TABLE::add_tmp_key(unsigned int, unsigned int, unsigned int (*)(unsigned char*), unsigned char*, bool)
      sort_and_filter_keyuse(...)
      make_join_statistics(...)
      JOIN::optimize_inner()
      JOIN::optimize()
      mysql_select()
      ```

      This suggests that optimizer temporary-key generation receives an out-of-range field/key part index after view/derived-table expansion.

      ## 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 TEXT NOT NULL CHECK (v1 IN ('x', 'x', v6 ^ v6)),
        v2 INT,
        v3 INT,
        v4 INT,
        v5 TEXT,
        v6 INT
      );

      CREATE VIEW v10 AS
      SELECT *
      FROM (
        SELECT *
        FROM v0
        GROUP BY 11433428.000000 + -1
      ) AS v8
      NATURAL JOIN v0 AS v9
      NATURAL JOIN v0 AS v7
      WHERE v6 NOT IN (21) AND v6 NOT IN (55);

      CREATE VIEW v16 AS
      SELECT v6
      FROM (
        SELECT *
        FROM v0 AS v15
        NATURAL JOIN v10
        GROUP BY v1
        HAVING v3 = v3
      ) AS v11
      NATURAL JOIN v10 AS v12
      NATURAL JOIN v10 AS v13
      NATURAL JOIN v10 AS v14
      NATURAL JOIN v10
      WHERE 'x' = v4
      ORDER BY v3, v2 DESC, v2 ASC;

      SELECT 34672723.000000
      FROM (
        SELECT 127 + v2 AS v24
        FROM v16 AS v25
        NATURAL JOIN v0 AS v22
        NATURAL JOIN v16 AS v23
        NATURAL JOIN v16
      ) AS v17
      JOIN v10 AS v18
      NATURAL JOIN v16 AS v19,
      v0 AS v20,
      v16 AS v21
      JOIN v10;
      ```

      ## Actual result

      The server aborts:

      ```text
      Assertion `n < width' failed.
      got signal 6
      TABLE::add_tmp_key(...)
      sort_and_filter_keyuse(...)
      make_join_statistics(...)
      Query: SELECT 34672723.000000 FROM ...
      ```

      After replay:

      ```text
      server_ready 1
      client_rc 0
      server_alive_after 0
      ```
      Show
      ## Affected version - MariaDB `11.8.8-MariaDB-debug` - Source revision: `46a8eb42a520193686d9a16d4cea4b3e002917e4` ## Summary The server aborts with a debug assertion while optimizing a SELECT over nested views and derived tables with multiple `NATURAL JOIN`s. The failing assertion is: ```text mariadbd: /home/mysql/mariadb/sql/sql_bitmap.h:77: ulonglong Bitmap<64>::bit_mask(uint) const [width = 64]: Assertion `n < width' failed. ``` The stack goes through temporary key construction: ```text TABLE::add_tmp_key(unsigned int, unsigned int, unsigned int (*)(unsigned char*), unsigned char*, bool) sort_and_filter_keyuse(...) make_join_statistics(...) JOIN::optimize_inner() JOIN::optimize() mysql_select() ``` This suggests that optimizer temporary-key generation receives an out-of-range field/key part index after view/derived-table expansion. ## 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 TEXT NOT NULL CHECK (v1 IN ('x', 'x', v6 ^ v6)),   v2 INT,   v3 INT,   v4 INT,   v5 TEXT,   v6 INT ); CREATE VIEW v10 AS SELECT * FROM (   SELECT *   FROM v0   GROUP BY 11433428.000000 + -1 ) AS v8 NATURAL JOIN v0 AS v9 NATURAL JOIN v0 AS v7 WHERE v6 NOT IN (21) AND v6 NOT IN (55); CREATE VIEW v16 AS SELECT v6 FROM (   SELECT *   FROM v0 AS v15   NATURAL JOIN v10   GROUP BY v1   HAVING v3 = v3 ) AS v11 NATURAL JOIN v10 AS v12 NATURAL JOIN v10 AS v13 NATURAL JOIN v10 AS v14 NATURAL JOIN v10 WHERE 'x' = v4 ORDER BY v3, v2 DESC, v2 ASC; SELECT 34672723.000000 FROM (   SELECT 127 + v2 AS v24   FROM v16 AS v25   NATURAL JOIN v0 AS v22   NATURAL JOIN v16 AS v23   NATURAL JOIN v16 ) AS v17 JOIN v10 AS v18 NATURAL JOIN v16 AS v19, v0 AS v20, v16 AS v21 JOIN v10; ``` ## Actual result The server aborts: ```text Assertion `n < width' failed. got signal 6 TABLE::add_tmp_key(...) sort_and_filter_keyuse(...) make_join_statistics(...) Query: SELECT 34672723.000000 FROM ... ``` 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:
            3 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.