1. 05 Mar, 2021 9 commits
  2. 04 Mar, 2021 4 commits
  3. 03 Mar, 2021 6 commits
  4. 02 Mar, 2021 9 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
    • Marko Mäkelä's avatar
      MDEV-24973 Performance schema duplicates rarely executed code for mutex operations · 80ac9ec1
      Marko Mäkelä authored
      The PERFORMANCE_SCHEMA wrapper for mutex and rw-lock operations is
      causing a lot of unlikely code to be inlined in each invocation.
      The impact of this may have been emphasized in MariaDB 10.6, because
      InnoDB now uses the common implementation of mutexes and condition
      variables (MDEV-21452).
      
      By default, we build with cmake -DPLUGIN_PERFSCHEMA enabled,
      but at runtime no instrumentation will be enabled. Similar to
      commit eba2d10a
      we had better avoid inlining the rarely executed code in order to reduce
      the code size and to improve the efficiency of the instruction cache.
      
      This change was extensively tested by Axel Schwenke with and without
      --enable-performance-schema (with no individual instruments enabled).
      Removing the inline functions did not cause any performance regression
      in either case. There seemed to be a tiny improvement, possibly due
      to reduced code size and better instruction cache hit rate.
      80ac9ec1
    • Marko Mäkelä's avatar
      Merge 10.5 into 10.6 · 33aec68a
      Marko Mäkelä authored
      33aec68a
    • Marko Mäkelä's avatar
      MDEV-24811 Assertion find(table) failed with innodb_evict_tables_on_commit_debug · 18535a40
      Marko Mäkelä authored
      lock_release_try(): Implement innodb_evict_tables_on_commit_debug.
      Before releasing any locks, collect the identifiers of tables to
      be evicted. After releasing all locks, look up for the tables and
      evict them if it is safe to do so.
      
      trx_t::commit_tables(): Remove the eviction logic.
      
      trx_t::commit_in_memory(): Invoke release_locks() only after
      commit_tables().
      18535a40
    • Marko Mäkelä's avatar
      8513007c
    • Marko Mäkelä's avatar
      MDEV-24789: Reduce lock_sys mutex contention further · 8d16da14
      Marko Mäkelä authored
      lock_sys_t::deadlock_check(): Assume that only lock_sys.wait_mutex
      is being held by the caller.
      
      lock_sys_t::rd_lock_try(): New function.
      
      lock_sys_t::cancel(trx_t*): Kill an active transaction that may be
      holding a lock.
      
      lock_sys_t::cancel(trx_t*, lock_t*): Cancel a waiting lock request.
      
      lock_trx_handle_wait(): Avoid acquiring mutexes in some cases,
      and in never acquire lock_sys.latch in exclusive mode.
      This function is only invoked in a semi-consistent read
      (locking a clustered index record only if it matches the search condition).
      Normally, lock_wait() will take care of lock waits.
      
      lock_wait(): Invoke the new function lock_sys_t::cancel() at the end,
      to avoid acquiring exclusive lock_sys.latch.
      
      lock_rec_other_trx_holds_expl(): Use LockGuard instead of LockMutexGuard.
      
      lock_release_autoinc_locks(): Explicitly acquire table->lock_mutex,
      in case only a shared lock_sys.latch is being held. Deadlock::report()
      will still hold exclusive lock_sys.latch while invoking
      lock_cancel_waiting_and_release().
      
      lock_cancel_waiting_and_release(): Acquire trx->mutex in this function,
      instead of expecting the caller to do so.
      
      lock_unlock_table_autoinc(): Only acquire shared lock_sys.latch.
      
      lock_table_has_locks(): Do not acquire lock_sys.latch at all.
      
      Deadlock::check_and_resolve(): Only acquire shared lock_sys.latchm
      for invoking lock_sys_t::cancel(trx, wait_lock).
      
      innobase_query_caching_table_check_low(),
      row_drop_tables_for_mysql_in_background(): Do not acquire lock_sys.latch.
      8d16da14
    • 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
  5. 01 Mar, 2021 11 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
    • Monty's avatar
      MDEV-24710 Uninitialized value upon CREATE .. SELECT ... VALUE... · 6983ce70
      Monty authored
      The failure happened for group by queries when all tables where marked as
      'const tables' (tables with 0-1 matching rows) and no row matched the
      where clause and there was in addition a direct reference to a field.
      
      In this case the field would not be properly reset and the query would
      return 'random data' that happended to be in table->record[0].
      
      Fixed by marking all const tables as null tables in this particular case.
      
      Sergei also provided an extra test case for the code.
      
      @reviewer Sergei Petrunia <psergey@askmonty.org>
      6983ce70
    • Monty's avatar
      Fixed printing of wring filname "maria_open" in maria.maria-recovery2.test · 43a0a813
      Monty authored
      eprintf() was missing a va_start(), which caused wrong filename to be
      printed when printing recovery trace.
      
      Added also missing new line when printing "Table is crashed" to trace file
      43a0a813
    • Alexey Botchkov's avatar
      MDEV-24965 With ALTER USER ...IDENTIFIED BY command, password doesn't replaced... · a18b39e3
      Alexey Botchkov authored
      MDEV-24965 With ALTER USER ...IDENTIFIED BY command, password doesn't replaced by asterisks in audit log.
      
      Test result fixed.
      a18b39e3
    • Sergei Golubchik's avatar
      MDEV-24858 SIGABRT in DbugExit from my_malloc in Query_cache::init_cache Regression · 1f1f61a9
      Sergei Golubchik authored
      disable warnings, as they're different on 32bit platforms
      
      Closes #1757
      1f1f61a9
    • Nayuta Yanagisawa's avatar
      MDEV-24858 SIGABRT in DbugExit from my_malloc in Query_cache::init_cache Regression · 6976bb94
      Nayuta Yanagisawa authored
      Add missing DBUG_RETURN to my_malloc.
      6976bb94
    • Jan Lindström's avatar
      MDEV-20715 : Implement system variable to disallow local GTIDs in Galera · ebb2db59
      Jan Lindström authored
      Added a new wsrep_mode feature DISALLOW_LOCAL_GTID for this.
      Nodes can have GTIDs for local transactions in the following scenarios:
      
      A DDL statement is executed with wsrep_OSU_method=RSU set.
      A DML statement writes to a non-InnoDB table.
      A DML statement writes to an InnoDB table with wsrep_on=OFF set.
      
      If user has set wsrep_mode=DISALLOW_LOCAL_GTID these operations
      produce a error ERROR HY000: Galera replication not supported
      ebb2db59
    • Sergei Golubchik's avatar
      mtr --gdb: fix for --rr and for a warning · dd9e5827
      Sergei Golubchik authored
      use _RR_TRACE_DIR=dir instead of -o dir, as the former can store
      multiple traces in dir (if, e.g., the test restarts mysqld)
      
      suppress uninitialized warning when $exe is undefined (--manual-XXX)
      dd9e5827
  6. 26 Feb, 2021 1 commit