1. 15 Mar, 2021 1 commit
    • Jan Lindström's avatar
      MDEV-24978 : SIGABRT in __libc_message · 30dea459
      Jan Lindström authored
      Keyvalue can be longer than REC_VERSION_56_MAX_INDEX_COL_LEN
      and this leads out-of-array reference. Use dynamic memory
      allocation using actual max length of key value.
      30dea459
  2. 12 Mar, 2021 2 commits
    • Vladislav Vaintroub's avatar
      update libmariadb · ba7d86a6
      Vladislav Vaintroub authored
      ba7d86a6
    • Varun Gupta's avatar
      MDEV-24519: Server crashes in Charset::set_charset upon SELECT · 390de205
      Varun Gupta authored
      The query causing the issue here has implicit grouping for we
      have to produce one row with special values for the aggregates
      (depending on each aggregate function), and NULL values for all
      non-aggregate fields.
      
      The subselect item where implicit grouping was being done,
      null_value for the subselect item was not being set for
      the case when the implicit grouping produces NULL values
      for the items in the select list of the subquery.
      This which was leading to the crash.
      
      The fix would be to set the null_value when all the values
      for the row column have NULL values.
      
      Further changes are
      
      1) etting null_value for Item_singlerow_subselect only
         after val_* functions have been called.
      2) Introduced a parameter null_value_inside to Item_cache that
         would store be set to TRUE if any of the arguments of the
         Item_cache are null.
      
      Reviewed And co-authored by Monty
      390de205
  3. 11 Mar, 2021 3 commits
    • Ian Gilfillan's avatar
      Update sponsors · 1f3f9031
      Ian Gilfillan authored
      1f3f9031
    • Igor Babaev's avatar
      MDEV-24597 Explicit column name error in CTE of UNION · 374ec82f
      Igor Babaev authored
      This bug manifested itself when executing queries with multiple reference
      to a CTE specified by a query expression with union and having its
      column names explicitly declared. In this case the server returned a bogus
      error message about unknown column name. It happened because while for the
      first reference to the CTE the names of the columns returned by the CTE
      specification were properly changed to match the CTE definition for the
      other references it was not done. This was a consequence  of not quite
      complete code of the function With_element::clone_parsed_spec() that forgot
      to set the reference to the CTE definition for unit structures representing
      non-first CTE references.
      
      Approved by dmitry.shulga@mariadb.com
      374ec82f
    • Igor Babaev's avatar
      MDEV-21104 Wrong result (extra rows and wrong values) with incremental BNLH · 90780bb5
      Igor Babaev authored
      This bug could affect multi-way join queries with embedded outer joins that
      contained a conjunctive IS NULL predicate over a non-nullable column from
      inner table of an outer join. The predicate could occur in WHERE condition
      or in ON condition. Due to this bug a wrong result set could be returned by
      the query. The bug manifested itself only when join buffers were employed
      for join operations.
      
      The problem appeared because
      - a bug in the function JOIN_CACHE::get_match_flag_by_pos that not always
        returned proper match flags for embedding outer joins stored together
        with table rows put a join buffer.
      - bug in the function JOIN_CACHE::join_matching_records that not always
        correctly determined that a row from the buffer could be skipped due
        to applied 'not_exists' optimization.
      Example:
        SELECT * FROM t1 LEFT JOIN ((t2 LEFT JOIN t3 ON c = d) JOIN t4) ON b = e
          WHERE e IS NULL;
      
      The patch introduces a new function that finds the match flag for a record
      from join buffer specifying the buffer where this flag has to be found.
      The function is called JOIN_CACHE::get_match_flag_by_pos_from_join_buffer().
      Now this function rather than JOIN_CACHE::get_match_flag_by_pos() is used
      in JOIN_CACHE::skip_if_matched() to check whether a record from the join
      buffer must be ignored when extending the record by null complements.
      Also the code of the function JOIN_CACHE::skip_if_not_needed_match() has
      been changed. The function checks whether a record from the join buffer
      still may produce some useful extensions.
      Also some clarifying comments has been added.
      
      Approved by monty@mariadb.com.
      90780bb5
  4. 10 Mar, 2021 2 commits
    • Marko Mäkelä's avatar
      MDEV-25101 Assertion !strcmp(field->name, "table_name") failed · 1af85581
      Marko Mäkelä authored
      btr_node_ptr_max_size(): Let us remove the debug assertion that was
      added in MDEV-14637. The assertion assumed that no additional
      indexes exist in mysql.innodb_index_stats or mysql.innodb_table_stats.
      The code path is working around an incorrect definition of a table,
      interpreting VARCHAR(64) as the more correct VARCHAR(199).
      
      No test case will be added, because MDEV-24579 proves that executing
      DDL on the statistics tables involves a race condition. The test
      case included the following:
      
      	ALTER TABLE mysql.innodb_index_stats ADD KEY (stat_name);
      	CREATE TABLE t (a INT) ENGINE=InnoDB STATS_PERSISTENT=1;
      1af85581
    • Alice Sherepa's avatar
      reenable tests from engines/funcs · ee12b055
      Alice Sherepa authored
      ee12b055
  5. 09 Mar, 2021 1 commit
    • Igor Babaev's avatar
      MDEV-25002 ON expressions cannot contain outer references · 4020e4ae
      Igor Babaev authored
      A bogus error message was issued for any outer references occurred in
      ON expressions used in subqueries. This prevented execution of queries
      containing subqueries as soon as they used outer references in their ON
      clauses. This happened because the Name_resolution_context structure
      created for any ON expression erroneously had the field outer_context set
      to NULL. The fields select_lex of this structure was not set correctly
      either.
      
      The idea of the fix was taken from mysql code of the function
      push_new_name_resolution_context().
      
      Approved by dmitry.shulga@mariadb.com
      4020e4ae
  6. 08 Mar, 2021 3 commits
    • Sergei Golubchik's avatar
      Correct the value of global memory_used · dc666780
      Sergei Golubchik authored
      As a special hack global memory_used isn't SHOW_LONG_STATUS
      but still relies on calc_sum_of_all_status() being called.
      
      followup for 63f91927
      dc666780
    • Sergei Golubchik's avatar
      2c0b3141
    • Julius Goryavsky's avatar
      MDEV-24853: Duplicate key generated during cluster configuration change · 7345d371
      Julius Goryavsky authored
      Incorrect processing of an auto-incrementing field in the
      WSREP-related code during applying transactions results in
      a duplicate key being created. This is due to the fact that
      at the beginning of the write_row() and update_row() functions,
      the values of the auto-increment parameters are used, which
      are read from the parameters of the current thread, but further
      along the code other values are used, which are read from global
      variables (when applying a transaction). This can happen when
      the cluster configuration has changed while applying a transaction
      (for example in the high_priority_service mode for Galera 4).
      Further during IST processing duplicating key is detected, and
      processing of the DB_DUPLICATE_KEY return code (inside innodb,
      in the write_row() handler) results in a call to the
      wsrep_thd_self_abort() function.
      7345d371
  7. 05 Mar, 2021 1 commit
  8. 04 Mar, 2021 3 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
      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
  9. 03 Mar, 2021 2 commits
  10. 02 Mar, 2021 2 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
    • 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
  11. 01 Mar, 2021 1 commit
    • 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
  12. 25 Feb, 2021 3 commits
    • Dmitry Shulga's avatar
      MDEV-24860: Incorrect behaviour of SET STATEMENT in case it is executed as a prepared statement · 259e5243
      Dmitry Shulga authored
      Running statements with SET STATEMENT FOR clause is handled incorrectly in
      case the whole statement is executed in prepared statement mode.
      For example, running of the following statement
        SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR CREATE TABLE t1 AS SELECT CONCAT('abc') AS c1;
      results in different definition of the table t1 depending on whether
      the statement is executed as a prepared or as a regular statement.
      
      In first case the column c1 is defined as
        `c1` varchar(3) DEFAULT NULL
      in the last case the column c1 is defined as
        `c1` varchar(3) NOT NULL
      
      Different definition for the column c1 arise due to the fact that
      a value of the data memeber Item_func_concat::maybe_null depends on
      whether strict mode is on or off. Below is definition of the method
      fix_fields() of the class Item_str_func that is base class for the
      class Item_func_concat that is created on parsing the
      SET STATEMENT FOR clause.
      
      bool Item_str_func::fix_fields(THD *thd, Item **ref)
      {
        bool res= Item_func::fix_fields(thd, ref);
        /*
          In Item_str_func::check_well_formed_result() we may set null_value
          flag on the same condition as in test() below.
        */
        maybe_null= maybe_null || thd->is_strict_mode();
        return res;
      }
      
      Although the clause SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR
      is parsed on PREPARE phase during processing of the prepared statement,
      real setting of the sql_mode system variable is done on EXECUTION phase.
      On the other hand, the method Item_str_func::fix_fields is called on PREPARE
      phase. In result, thd->is_strict_mode() returns true during calling the method
      Item_str_func::fix_fields(), the data member maybe_null is assigned the value
      true and column c1 is defined as DEFAULT NULL.
      
      To fix the issue the system variables listed in the SET STATEMENT FOR clause
      are set at the beginning of handling the PREPARE phase just right before
      calling  the function check_prepared_statement() and their original values
      restored immediate after return from this function.
      
      Additionally, to avoid code duplication the source code used in the function
      mysql_execute_command for setting variables, specified by SET STATEMENT
      clause, were extracted to the standalone functions
      run_set_statement_if_requested(). This new function is called from
      the function  mysql_execute_command() and the method
      Prepared_statement::prepare().
      259e5243
    • Varun Gupta's avatar
      0a95c922
    • Daniel Black's avatar
      MDEV-24728: Debian include client caching_sha2_password plugin · 577c970c
      Daniel Black authored
      Backport of 4bc31a90
      
      Include client libraries for auth caching_sha2_password and
      sha256_password in the libmariadb3 client library package.
      577c970c
  13. 24 Feb, 2021 1 commit
    • Daniel Black's avatar
      MDEV-23510: arm64 lf_hash alignment of pointers · 1635686b
      Daniel Black authored
      volatile != atomic.
      
      volatile has no memory barrier schemantics, its for mmaped IO
      so lets allow some optimizer gains and stop pretending it helps
      with memory atomicity.
      
      The MDEV lists a SEGV an assumption is made that an address was
      partially read. As C packs structs strictly in order and on arm64 the
      cache line size is 128 bits. A pointer (link - 64 bits), followed
      by a hashnr (uint32 - 32 bits), leaves the following key (uchar *
      64 bits), neither naturally aligned to any pointer and worse, split
      across a cache line which is the processors view of an atomic
      reservation of memory.
      
      lf_dynarray_lvalue is assumed to return a 64 bit aligned address.
      
      As a solution move the 32bit hashnr to the end so we don't get the
      *key pointer split across two cache lines.
      
      Tested by: Krunal Bauskar
      Reviewer: Marko Mäkelä
      1635686b
  14. 23 Feb, 2021 2 commits
  15. 22 Feb, 2021 13 commits
    • Sergei Golubchik's avatar
      fix binlog_xa_recover test · 3c021485
      Sergei Golubchik authored
      1. wait for the binlog thread to reach the certain state, don't use
         a debug_sync that's incorrectly placed to detect the state
      2. no need to do a (non-deterministic) `show binlog events` to verify
         what is guaranteed by the directly preceding line
      3c021485
    • Sergei Golubchik's avatar
      cleanup: renames, no need to create a new .inc file · bb98c6bf
      Sergei Golubchik authored
      if it's the whole content of a test anyway.
      bb98c6bf
    • Sergei Golubchik's avatar
      mtr fixes for old (5.10.1) perl · 7fe351ab
      Sergei Golubchik authored
      7fe351ab
    • Sergei Golubchik's avatar
      support for mtr --valgdb · 77c23c62
      Sergei Golubchik authored
      add a new "debugger" to mtr, that runs the executable
      under valgrind in gdb. valgrind pid is auto-detected,
      but the delay (sleep) and vgdb path are hard-coded for now
      77c23c62
    • Sergei Golubchik's avatar
      unify mtr handling of debuggers · feacc0aa
      Sergei Golubchik authored
      "debugger" is anything that wraps execution of a target
      binary (mysqld or mysqltest). Currently the list includes:
      gdb, ddd, dbx, lldb, valgrind, strace, ktrace, rr,
      devenv, windbg, vsjitdebugger.
      
      for every debugger xxx, mtr will recognize four options:
      --xxx, --boot-xxx, --manual-xxx, --client-xxx.
      They all support an optional "=string" argument. String
      being a semicolon-separated list of commands (e.g. for gdb)
      or one (not semicolon-separated) command line of options
      (e.g. for valgrind). Or both (e.g. --gdb='-quiet -nh;info files'
      
      In embedded both --xxx and --client-xxx work.
      
      Functionality changed/removed:
      * --rr-args is gone
      * --rr-dir is gone
      * --manual-debug is gone
      * --debugger={devenv|vc|windbg|vc_express|vsjitdebugger} is gone
      * --strace-option is gone
      * --stracer={strace|ktrace} is gone
      * --valgrind only enables it for the server, not for everything
      * --valgrind-all is gone
      * --valgrind-mysqltest is gone
      * --valgrind-mysqld is gone
      * --valgrind-options is gone
      * --valgrind-option is gone
      * --valgrind-path is gone
      * --callgrind is gone
      * one cannot combine --valgrind --gdb anymore
      * valgrind report doesn't add a fake test line to the output
      * vc and vcexpress on windows are no longer supported
      feacc0aa
    • Sergei Golubchik's avatar
      cleanup: remove dead code in mtr · 3b0b4e61
      Sergei Golubchik authored
      3b0b4e61
    • Sergei Golubchik's avatar
      cleanup: stat tables · c4f01334
      Sergei Golubchik authored
      don't allocate Column_statistics_collected objects that won't
      be used.
      
      minor style fixes (StringBuffer<>, etc)
      c4f01334
    • Sergei Golubchik's avatar
      MDEV-23753: SIGSEGV in Column_stat::store_stat_fields · 06a791aa
      Sergei Golubchik authored
      only collect persistent stats for columns explicitly listed
      by the user in the  ANALYZE TABLE PERSISTENT FOR COLUMNS (...)
      clause. The engine can extend table->read_set as much as
      it wants, it should not affect the collected statistics.
      
      Test case from the 3b94309a applies - it used to crash,
      because ha_partition extended table->read_set after the loop that
      initialized some objects based on bits in the read_set but before the
      loop that used these objects based on bits in the read_set.
      06a791aa
    • Sergei Golubchik's avatar
      Revert "MDEV-23753: SIGSEGV in Column_stat::store_stat_fields" · caad32ca
      Sergei Golubchik authored
      This reverts the commit 3b94309a but keeps the test
      
      Because the fix is a hack that isn't supposed to do anything,
      and relies on a side-effect of rnd_init inside ha_partition.
      
      A different fix is coming up.
      caad32ca
    • Sergei Golubchik's avatar
      a638f157
    • Daniel Bartholomew's avatar
      bump the VERSION · 6aa90974
      Daniel Bartholomew authored
      6aa90974
    • Thirunarayanan Balathandayuthapani's avatar
      MDEV-24863 AHI entries mismatch with the index while reloading the evicted tables. · d7fc4f52
      Thirunarayanan Balathandayuthapani authored
      - This is caused by commit ad6171b9
      (MDEV-22456). InnoDB reloads the evicted table again from dictionary.
      In that case, AHI entries and current index object mismatches
      happens. When index object mismatches then InnoDB should drop
      the page hash AHI entries for the block. In
      btr_search_drop_page_hash_index(), InnoDB should take exclusive
      lock on the AHI latch if index is already freed to avoid the
      freed memory access during buf_pool_resize()
      d7fc4f52
    • Jan Lindström's avatar
      374f4c3f