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

Assertion `dbl_records <= s->records' failed with optimizer_use_condition_selectivity=1

Details

    Description

      CREATE TABLE t1 (a INT);
      INSERT INTO t1 VALUES (1),(2);
       
      CREATE TABLE t2 (id INT PRIMARY KEY);
      INSERT INTO t2 VALUES (2),(3);
       
      SET optimizer_switch = 'derived_with_keys=off';
      SET optimizer_use_condition_selectivity = 1;
       
      SELECT t1.* FROM t1 JOIN (SELECT id, COUNT(*) FROM t2 GROUP BY id) sq ON sq.id = t1.a;
       
      # Cleanup
      DROP TABLE t1, t2;
      

      11.0 aac88fc2

      mariadbd: /data/src/11.0/sql/sql_select.cc:7858: double apply_selectivity_for_table(JOIN_TAB*, uint): Assertion `dbl_records <= s->records' failed.
      230531 14:32:58 [ERROR] mysqld got signal 6 ;
       
      0x559068d6a7c0 "dbl_records <= s->records", file=file@entry=0x559068d65ae0 "/data/src/11.0/sql/sql_select.cc", line=line@entry=7858, function=function@entry=0x559068d6a680 "double apply_selectivity_for_table(JOIN_TAB*, uint)") at ./assert/assert.c:92
      #9  0x00007fc7e8a53df2 in __GI___assert_fail (assertion=0x559068d6a7c0 "dbl_records <= s->records", file=0x559068d65ae0 "/data/src/11.0/sql/sql_select.cc", line=7858, function=0x559068d6a680 "double apply_selectivity_for_table(JOIN_TAB*, uint)") at ./assert/assert.c:101
      #10 0x0000559066de65fd in apply_selectivity_for_table (s=0x629000271640, use_cond_selectivity=1) at /data/src/11.0/sql/sql_select.cc:7858
      #11 0x0000559066deeb58 in best_access_path (join=0x62900026ca70, s=0x629000271640, remaining_tables=2, join_positions=0x629000271c88, idx=1, disable_jbuf=false, record_count=2, pos=0x629000272550, loose_scan_pos=0x629000272690) at /data/src/11.0/sql/sql_select.cc:9346
      #12 0x0000559066df82c9 in get_costs_for_tables (join=0x62900026ca70, remaining_tables=2, idx=1, record_count=2, trace_one_table=0x7fc7e0f6b2e0, pos=0x629000271c48, store_position=0x7fc7e0f6b200, allowed_tables=0x7fc7e0f6b240, stop_on_eq_ref=false) at /data/src/11.0/sql/sql_select.cc:11059
      #13 0x0000559066df9580 in best_extension_by_limited_search (join=0x62900026ca70, remaining_tables=2, idx=1, record_count=2, read_time=0.010348410000000001, search_depth=61, use_cond_selectivity=1, processed_eq_ref_tables=0x7fc7e0f6b600) at /data/src/11.0/sql/sql_select.cc:11316
      #14 0x0000559066dfafce in best_extension_by_limited_search (join=0x62900026ca70, remaining_tables=3, idx=0, record_count=1, read_time=0, search_depth=62, use_cond_selectivity=1, processed_eq_ref_tables=0x7fc7e0f6b8d0) at /data/src/11.0/sql/sql_select.cc:11541
      #15 0x0000559066df3ff5 in greedy_search (join=0x62900026ca70, remaining_tables=3, search_depth=62, use_cond_selectivity=1) at /data/src/11.0/sql/sql_select.cc:10287
      #16 0x0000559066df1ae9 in choose_plan (join=0x62900026ca70, join_tables=3, emb_sjm_nest=0x0) at /data/src/11.0/sql/sql_select.cc:9808
      #17 0x0000559066dd84d3 in make_join_statistics (join=0x62900026ca70, tables_list=..., keyuse_array=0x62900026cdd8) at /data/src/11.0/sql/sql_select.cc:6097
      #18 0x0000559066db3dda in JOIN::optimize_inner (this=0x62900026ca70) at /data/src/11.0/sql/sql_select.cc:2579
      #19 0x0000559066dace47 in JOIN::optimize (this=0x62900026ca70) at /data/src/11.0/sql/sql_select.cc:1907
      #20 0x0000559066dceab3 in mysql_select (thd=0x62b00007e218, tables=0x6290000e69b8, fields=..., conds=0x0, og_num=0, order=0x0, group=0x0, having=0x0, proc_param=0x0, select_options=2164525824, result=0x6290000ea068, unit=0x62b000082660, select_lex=0x6290000e6350) at /data/src/11.0/sql/sql_select.cc:5146
      #21 0x0000559066d9e6e8 in handle_select (thd=0x62b00007e218, lex=0x62b000082588, result=0x6290000ea068, setup_tables_done_option=0) at /data/src/11.0/sql/sql_select.cc:618
      #22 0x0000559066cc3ac4 in execute_sqlcom_select (thd=0x62b00007e218, all_tables=0x6290000e69b8) at /data/src/11.0/sql/sql_parse.cc:6279
      #23 0x0000559066cb1eeb in mysql_execute_command (thd=0x62b00007e218, is_called_from_prepared_stmt=false) at /data/src/11.0/sql/sql_parse.cc:3949
      #24 0x0000559066cce574 in mysql_parse (thd=0x62b00007e218, rawbuf=0x6290000e6238 "SELECT t1.* FROM t1 JOIN (SELECT id, COUNT(*) FROM t2 GROUP BY id) sq ON sq.id = t1.a", length=85, parser_state=0x7fc7e0f6da20) at /data/src/11.0/sql/sql_parse.cc:8014
      #25 0x0000559066ca4460 in dispatch_command (command=COM_QUERY, thd=0x62b00007e218, packet=0x629000258219 "SELECT t1.* FROM t1 JOIN (SELECT id, COUNT(*) FROM t2 GROUP BY id) sq ON sq.id = t1.a", packet_length=85, blocking=true) at /data/src/11.0/sql/sql_parse.cc:1894
      #26 0x0000559066ca1183 in do_command (thd=0x62b00007e218, blocking=true) at /data/src/11.0/sql/sql_parse.cc:1407
      #27 0x00005590671691a4 in do_handle_one_connection (connect=0x608000002d38, put_in_cache=true) at /data/src/11.0/sql/sql_connect.cc:1416
      #28 0x0000559067168b65 in handle_one_connection (arg=0x608000002cb8) at /data/src/11.0/sql/sql_connect.cc:1318
      #29 0x0000559067d5d4bc in pfs_spawn_thread (arg=0x617000005b98) at /data/src/11.0/storage/perfschema/pfs.cc:2201
      #30 0x00007fc7e8aa7fd4 in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:442
      #31 0x00007fc7e8b285bc in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81
      

      Reproducible with at least InnoDB, MyISAM, Aria.
      Not reproducible on 10.11.

      The failure started happening on 11.0 after

      commit 10a974adc9b250431cac44555c7aa9354e5840df
      Merge: f74bb51b30d e8c7222ba3a
      Author: Sergei Petrunia
      Date:   Wed Feb 15 12:03:12 2023 +0300
       
          Merge 11.0-selectivity into 11.0
      

      Attachments

        Activity

          monty Michael Widenius added a comment - - edited

          MDEV-31375 Assertion `dbl_records <= s->records' failed with optimizer_use_condition_selectivity=1
          The reason for the crash was that the 'best splitting' optimization
          predicted less rows to be found than what opt_range did.
          This code in apply_selectivity_for_table(), when using use_cond_selectivity=1,
          was not prepared for this case which caused an assert in debug builds.
          Production builds is not affected.

          The fix is to choose the smaller of the two row counts. It will have a
          minimum on costs when using use_cond_selectivity=1 and should not cause
          any problems in production.

          monty Michael Widenius added a comment - - edited MDEV-31375 Assertion `dbl_records <= s->records' failed with optimizer_use_condition_selectivity=1 The reason for the crash was that the 'best splitting' optimization predicted less rows to be found than what opt_range did. This code in apply_selectivity_for_table(), when using use_cond_selectivity=1, was not prepared for this case which caused an assert in debug builds. Production builds is not affected. The fix is to choose the smaller of the two row counts. It will have a minimum on costs when using use_cond_selectivity=1 and should not cause any problems in production.

          Pushed to 11.0

          monty Michael Widenius added a comment - Pushed to 11.0

          People

            monty Michael Widenius
            elenst Elena Stepanova
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Git Integration

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