1. 11 Mar, 2021 4 commits
    • Marko Mäkelä's avatar
      MDEV-25110 [FATAL] InnoDB: Trying to write ... outside the bounds · a8650b64
      Marko Mäkelä authored
      In commit 118e258a (part of MDEV-23855)
      we inadvertently broke crash recovery, reintroducing MDEV-11556.
      
      fil_system_t::extend_to_recv_size(): Extend all open tablespace files
      to the recovered size.
      
      recv_sys_t::apply(): Invoke fil_system.extend_to_recv_size() at the
      start of each batch. In this way, any fil_space_t::recv_size
      changes that were parsed after the file was opened will be applied.
      a8650b64
    • Marko Mäkelä's avatar
      MDEV-25031 Not applying INSERT_*_REDUNDANT due to corruption on page · 549a70d7
      Marko Mäkelä authored
      page_apply_insert_redundant(): Replace a too strict condition
      hdr_c > pextra_size. It turns out that page_cur_insert_rec_low()
      is not even computing the extra_size of cur->rec when it is trying
      to reuse header bytes of the preceding record.
      549a70d7
    • David CARLIER's avatar
      a6cd4612
    • Krunal Bauskar's avatar
      MDEV-24949: Enabling idle flushing (possible regression from MDEV-23855) · f11b6087
      Krunal Bauskar authored
      - Currently page cleaner thread will stop flushing if
        dirty_pct < innodb_max_dirty_pages_pct_lwm.
      
      - If the server is not performing any activity then said resources/time
        could be used to flush the pending dirty pages and keep buffer pool
        clean for the next burst of the cycle. This flushing is called idle flushing.
      
      - flushing logic underwent a complete revamp in 10.5.7/8
        and as part of the revamp idle flushing logic got removed.
      
      - New proposed logic of idle flushing is based on updated logic of the
        page cleaner that will enable idle flushing if
        - buf page cleaner is idle
        - there are dirty pages (< innodb_max_dirty_pages_pct_lwm)
        - server is not performing any activity
      
        Logic will kickstart the idle flushing bounded by innodb_io_capacity.
      
      (Thanks to Marko Makela for reviewing the patch and idea
       right from the its inception).
      f11b6087
  2. 10 Mar, 2021 3 commits
  3. 09 Mar, 2021 1 commit
  4. 08 Mar, 2021 5 commits
  5. 05 Mar, 2021 8 commits
  6. 04 Mar, 2021 5 commits
    • Marko Mäkelä's avatar
      fixup 58b56f14: Remove dead code · 7759991a
      Marko Mäkelä authored
      row_prebuilt_t::m_no_prefetch: Remove (it was always false).
      row_prebuilt_t::m_read_virtual_key: Remove (it was always false).
      
      Only ha_innopart ever set these fields.
      7759991a
    • Marko Mäkelä's avatar
      MDEV-25051 Race condition between persistent statistics and RENAME TABLE or TRUNCATE · 978e48c9
      Marko Mäkelä authored
      innobase_rename_table(): Invoke dict_stats_wait_bg_to_stop_using_table()
      to ensure that dict_stats_update() cannot be accessing the table name
      that we will be modifying. If we are executing RENAME rather than TRUNCATE,
      reset the flag at the end so that persistent statistics can be calculated
      again.
      
      The race condition was encountered with ASAN and rr.
      Sorry, there is no test case, like there is for nothing related to
      dict_stats_wait_bg_to_stop_using_table(). The entire code is an ugly
      work-around for the failure of dict_stats_process_entry_from_recalc_pool()
      to acquire MDL.
      
      Note: It appears that an ALTER TABLE that is not rebuilding the table
      will fail to reset the flag that blocks the processing of statistics.
      978e48c9
    • Vicențiu Ciorbaru's avatar
      Merge branch '10.2' into 10.3 · e9b8b76f
      Vicențiu Ciorbaru authored
      e9b8b76f
    • Vicențiu Ciorbaru's avatar
      MDEV-25032: Window functions without column references get removed from ORDER BY · 5da6ffe2
      Vicențiu Ciorbaru authored
      row_number() over () window function can be used without any column in the OVER
      clause. Additionally, the item doesn't reference any tables, as it's not
      effectively referencing any table. Rather it is specifically built based
      on the end temporary table used for window function computation.
      
      This caused remove_const function to wrongly drop it from the ORDER
      list. Effectively, we shouldn't be dropping any window function from the
      ORDER clause, so adjust remove_const to account for that.
      
      Reviewed by: Sergei Petrunia sergey@mariadb.com
      5da6ffe2
    • Igor Babaev's avatar
      MDEV-22786 Crashes with nested table value constructors · 08d8bce5
      Igor Babaev authored
      The bug caused crashes of the server when processing queries with nested
      table value constructors (TVC) . It happened because the grammar rules to
      parse TVC used the same global lists for both nested TVC and nesting TVC.
      As a result invalid select trees were constructed for queries with nested
      TVC and this led to crashes at the prepare stage.
      This patch provides its own lists structures for each TVC nest level.
      
      Besides the patch fixes a bug in the function wrap_tvc() that missed
      inheritance of the SELECT_LEX::exclude_from_table_unique_test for
      selects that wrapped TVCs. This inheritance is critical for specifications
      of derived tables that employ nested TVCs.
      
      Approved by dmitry.shulga@mariadb.com
      08d8bce5
  7. 03 Mar, 2021 6 commits
  8. 02 Mar, 2021 4 commits
    • Monty's avatar
      MDEV-24532 Table corruption ER_NO_SUCH_TABLE_IN_ENGINE .. on table with foreign key · 676987c4
      Monty authored
      When doing a truncate on an Innodb under lock tables, InnoDB would rename
      the old table to #sql-... and recreate a new 't1' table. The table lock
      would still be on the #sql-table.
      
      When doing ALTER TABLE, Innodb would do the changes on the #sql table
      (which would disappear on close).
      When the SQL layer, as part of inline alter table, would close the
      original t1 table (#sql in InnoDB) and then reopen the t1 table, Innodb
      would notice that this does not match it's own (old) t1 table and
      generate an error.
      
      Fixed by adding code in truncate table that if we are under lock tables
      and truncating an InnoDB table, we would close, reopen and lock the
      table after truncate. This will remove the #sql table and ensure that
      lock tables is using the new empty table.
      
      Reviewer: Marko Mäkelä
      676987c4
    • Monty's avatar
      MDEV-23843 Assertions in Diagnostics_area upon table operations under FTWRL · 82efe4a1
      Monty authored
      Fixed binary logging in ANALYZE TABLE to work as optimize table
      82efe4a1
    • Dmitry Shulga's avatar
      MDEV-25006: Failed assertion on executing EXPLAIN DELETE statement as a prepared statement · fc774316
      Dmitry Shulga authored
      Attempt to execute EXPLAIN statement on multi-table DELETE statement
      leads to firing firing of the assertion
        DBUG_ASSERT(! is_set());
      in the method Diagnostics_area::set_eof_status.
      
      For example, above mentioned assertion failure happens
      in case any of the following statements
        EXPLAIN DELETE FROM t1.* USING t1
        EXPLAIN DELETE b FROM t1 AS a JOIN t1 AS b
      are executed in prepared statement mode provided the table t1
      does exist.
      
      This assertion is hit by the reason that a status of
      Diagnostics_area is set twice. The first time it is set from
      the function do_select() when the method multi_delete::send_eof()
      called. The second time it is set when the method
      Explain_query::send_explain() calls the method select_send::send_eof
      (this method invokes the method Diagnostics_area::set_eof_status that
      finally hits assertion)
      
      The second invocation for a setter method of the class Diagnostics_area
      is correct and run to send a response containing explain data.
      
      But first invocation of a setter method of the class Diagnostics_area
      is wrong since the function do_select() shouldn't be called at all
      for handling of the EXPLAIN statement.
      
      The reason by that the function do_select() is called during handling of
      the EXPLAIN statement is that the flag SELECT_DESCRIBE not set in the
      data member JOIN::select_options. The flag SELECT_DESCRIBE
      if is copied from values select_lex->options.
      
      During parsing of EXPLAIN statement this flag is set but latter reset
      from the function reinit_stmt_before_use() that is called on
      execution of prepared statement.
        void reinit_stmt_before_use(THD *thd, LEX *lex)
        {
          ...
          for (; sl; sl= sl->next_select_in_list())
          {
            if (sl->changed_elements & TOUCHED_SEL_COND)
            {
              /* remove option which was put by mysql_explain_union() */
              sl->options&= ~SELECT_DESCRIBE;
            ...
            }
         ...
        }
      
      So, to fix the issue the flag SELECT_DESCRIBE is set forcibly at the
      mysql_select() function in case thd->lex->describe set,
      that is in case EXPLAIN being executed.
      fc774316
    • Marko Mäkelä's avatar
      MDEV-25026 Various code paths are accessing freed pages · 01b44c05
      Marko Mäkelä authored
      The test case encryption.innodb_encrypt_freed was failing in
      MemorySanitizer builds.
      
      recv_recover_page(): Mark non-recovered pages as freed.
      
      fil_crypt_rotate_page(): Before comparing the block->frame contents,
      check if the block was marked as freed.
      
      Other places: Whenever using BUF_GET_POSSIBLY_FREED, check the
      block->page.status before accessing the page frame.
      
      (Both uses of BUF_GET_IF_IN_POOL should be correct now.)
      01b44c05
  9. 01 Mar, 2021 4 commits
    • Igor Babaev's avatar
      MDEV-24919 Crash with subselect formed by table value constructor and · 0f81ca6a
      Igor Babaev authored
                 used in set function
      
      If a subselect is formed by a table value constructor (TVC) then the
      following transformation is applied at the prepare stage:
        VALUES (v1), ... (vn) => SELECT * FROM (VALUES (v1), ... (vn)) tvc_x.
      The transformation is performed by the function wrap_tvc() that resets
      THD::LEX::current select to the top level select of the result of the
      transformation. After the call of wrap_tvc() in the function
      Item_subselect::wrap_tvc_into_select() the field THD::LEX::current must be
      reset to the same select as before the call. It was not done. As a result
      if the subselect formed by a TVC was an argument of a set function then
      an assertion was hit in the function Item_sum::check_sum_func().
      
      Approved by Oleksandr Byelkin <sanja@mariadb.com>
      0f81ca6a
    • Monty's avatar
      Fixed typo in comment · c25e6f91
      Monty authored
      c25e6f91
    • Monty's avatar
      Fixed unit test to not 'bail out' if some tests are not compiled. · 3f15d3ba
      Monty authored
      Before the changes two things could happen:
      - "path required name explain_filename path" error
      - unit test never finishead (as it tried to execute just /bin/sh as
        a test case)
      3f15d3ba
    • Monty's avatar
      MDEV-24958 Server crashes in my_strtod ... with DEFAULT(blob) · 41540957
      Monty authored
      Fixes also:
      MDEV-24942 Server crashes in _ma_rec_pack... with DEFAULT() on BLOB
      
      This was caused by two different bugs, both related to that the default
      value for the blob was not calculated before it was used:
      - There where now Item_default_value::..result() wrappers, which is
        needed as item in HAVING uses these.  This causes crashes when
        using a reference to a DEFAULT(blob_field) in HAVING. It also
        caused wrong results when used with other fields with default value
        expressions that are not constants.
      - create_tmp_field() did not take into account that blob fields with
        default expressions are not yet initialized. Fixed by treating
        Item_default_value(blob) like a normal item expression.
      41540957