1. 30 Oct, 2020 5 commits
  2. 29 Oct, 2020 16 commits
  3. 28 Oct, 2020 12 commits
  4. 27 Oct, 2020 7 commits
    • Eugene Kosov's avatar
      MDEV-23991 dict_table_stats_lock() has unnecessarily long scope · afc9d00c
      Eugene Kosov authored
      Patch removes dict_index_t::stats_latch. Table/index statistics now
      protected with dict_sys->mutex. That way statistics computation can
      happen in parallel in several threads and dict_sys->mutex will be locked
      only for a short period of time.
      
      This patch is a joint work with Marko Mäkelä
      
      dict_index_t::lock: make mutable which allows to pass const pointer
      when only lock is touched in an object
      
      btr_height_get()
      btr_get_size(): make index argument const for better type safety
      
      btr_estimate_number_of_different_key_vals(): now returns computed values
      instead of setting fields in dict_index_t directly
      
      remove everything related to dict_index_t::stats_latch
      
      dict_stats_index_set_n_diff(): now returns computed values instead
      of setting fields in dict_index_t directly
      
      dict_stats_analyze_index():  now returns computed values instead
      of setting fields in dict_index_t directly
      
      Reviewed by: Marko Mäkelä
      afc9d00c
    • Sergei Golubchik's avatar
      INET6 type plugin -> Beta · 2cec0523
      Sergei Golubchik authored
      2cec0523
    • Anel Husakovic's avatar
      MDEV-24018: SIGSEGV in Item_func_nextval::update_table on SELECT SETVAL · e183aec1
      Anel Husakovic authored
      Reviewed-by: wlad@mariadb.com
      e183aec1
    • Marko Mäkelä's avatar
      MDEV-16952 Introduce SET GLOBAL innodb_max_purge_lag_wait · 42e1815a
      Marko Mäkelä authored
      Let us introduce a dummy variable innodb_max_purge_lag_wait
      for waiting that the InnoDB history list length is below
      the user-specified limit. Specifically,
      
      SET GLOBAL innodb_max_purge_lag_wait=0;
      
      should wait for all history to be purged. This could be useful
      when upgrading from an older version to MariaDB 10.3 or later,
      to avoid hitting MDEV-15912.
      
      Note: the history cannot be purged if there exist transactions
      that may see old versions.
      
      Reviewed by: Vladislav Vaintroub
      42e1815a
    • Alexey Botchkov's avatar
      MDEV-22524 SIGABRT in safe_mutex_unlock with · 8761571a
      Alexey Botchkov authored
      session_track_system_variables and max_relay_log_size.
      
      lock LOCK_global_system_variables around the get_one_variable() call
      in the Session_sysvars_tracker::store_variable().
      8761571a
    • Thirunarayanan Balathandayuthapani's avatar
      MDEV-23693 Failing assertion: my_atomic_load32_explicit(&lock->lock_word,... · bc540b87
      Thirunarayanan Balathandayuthapani authored
      MDEV-23693 Failing assertion: my_atomic_load32_explicit(&lock->lock_word, MY_MEMORY_ORDER_RELAXED) == X_LOCK_DECR
      
      InnoDB frees the block lock during buffer pool shrinking when other
      thread is yet to release the block lock.  While shrinking the
      buffer pool, InnoDB allows the page to be freed unless it is buffer
      fixed. In some cases, InnoDB releases the latch after unfixing the
      block.
      
      Fix:
      ====
      - InnoDB should unfix the block after releases the latch.
      
      - Add more assertion to check buffer fix while accessing the page.
      
      - Introduced block_hint structure to store buf_block_t pointer
      and allow accessing the buf_block_t pointer only by passing a
      functor. It returns original buf_block_t* pointer if it is valid
      or nullptr if the pointer become stale.
      
      - Replace buf_block_is_uncompressed() with
      buf_pool_t::is_block_pointer()
      
      This change is motivated by a change in mysql-5.7.32:
      mysql/mysql-server@46e60de444a8fbd876cc6778a7e64a1d3426a48d
      Bug #31036301 ASSERTION FAILURE: SYNC0RW.IC:429:LOCK->LOCK_WORD
      bc540b87
    • Dmitry Shulga's avatar
      MDEV-22805: SIGSEGV in check_fields on UPDATE · 97b10b7f
      Dmitry Shulga authored
      For debug build of MariaDB server running of the following test case
      will hit the assert `thd->lex->sql_command == SQLCOM_UPDATE' in the function
      check_fields() on attempt to execute the UPDATE statement.
      
        CREATE TABLE t1 (a INT);
        UPDATE t1 FOR PORTION OF APPTIME FROM (SELECT 1 FROM t1) TO 2 SET a = 1;
      
      Stack trace to the fired assert statement
        DBUG_ASSERT(thd->lex->sql_command == SQLCOM_UPDATE)
      listed below:
        mysql_execute_command() ->
          mysql_multi_update_prepare() -->
            Multiupdate_prelocking_strategy::handle_end() -->
              check_fiels()
      
      It's worth to note that this stack trace looks like a multi update
      statement is being executed. The fired assert is checked inside the
      function check_fields() in case table->has_period() returns the value
      true that in turns happens when temporal period specified in the UPDATE
      statement. Condition specified in the DEBUG_ASSERT statement returns
      the false value since the data member thd->lex->sql_command have the
      value SQLCOM_UPDATE_MULTI. So, the main question is why a program control
      flow go to the path prescribed for handling MULTI update statement
      despite of the fact that the ordinary UPDATE statement being executed.
      
      The answer is a way that SQL grammar rules written.
      
      When the statement
        UPDATE t1 FOR PORTION OF APPTIME FROM (SELECT 1 FROM t1) TO 2 SET a = 1;
      being parsed an action for the rule 'table_primary_ident' (part of this action
      is listed below to simplify description) is  invoked to handle the table
      name 't1' specified in the clause 'SELECT 1 FROM t1'.
      
      table_primary_ident:
        table_ident opt_use_partition opt_for_system_time_clause
        opt_table_alias_clause opt_key_definition
        {
          SELECT_LEX *sel= Select;
          sel->table_join_options= 0;
          if (!($$= Select->add_table_to_list(thd, $1, $4,
      
      This action calls the method st_select_lex::add_table_to_list()
      to add the table name 't1' to the list of tables being used by the statement.
      
      Later, an action for the following grammar rule
      update_table_list:
        table_ident opt_use_partition for_portion_of_time_clause
        opt_table_alias_clause opt_key_definition
        {
          SELECT_LEX *sel= Select;
          sel->table_join_options= 0;
          if (!($$= Select->add_table_to_list(thd, $1, $4,
      
      is invoked to handle the clause 't1 FOR PORTION OF APPTIME FROM ... TO 2'.
      This action also calls the method st_select_lex::add_table_to_list()
      to add the table name 't1' to the list of tables being used by the statement.
      
      In result the table name 't1' contained twice in this list.
      
      Presence of duplicate names for the table 't1' in a list of table used by
      a statement leads to the fact that the function unique_table() called
      from the function mysql_update() returns the value true that forces
      implementation of the function mysql_update() to return the value 2 as
      a signal to fall through the case boundary of the switch statement placed
      in the function mysql_execute_statement() and start handling of the case
      for sql_command SQLCOM_UPDATE_MULTI. The compound statement block for the
      case SQLCOM_UPDATE_MULTI invokes the function mysql_multi_update_prepare()
      that executes the statement
        set thd->lex->sql_command= SQLCOM_UPDATE_MULTI;
      and after that calls the method
        Multiupdate_prelocking_strategy::handle_end(). Finally, this method
      invokes the check_field() function and assert is fired.
      
      The above analysis shows that update for a table that simultaneously specified
      both as a destination table of UPDATE statement and as a table taking part in
      subquery is actually treated by MariaDB server as multi-update statement.
      Taking into account that multi-update statement for temporal period
      table is not supported yet by MariaDB, correct way to fix the bug is to return
      the error ER_NOT_SUPPORTED_YET for this case.
      97b10b7f