1. 22 Mar, 2021 3 commits
    • Marko Mäkelä's avatar
      MDEV-23076 Misleading "InnoDB: using atomic writes" · 56274bd5
      Marko Mäkelä authored
      As suggested by Vladislav Vaintroub, let us remove misleading
      and malformatted startup messages.
      
      Even if the global variable srv_use_atomic_writes were set, we would
      still invoke my_test_if_atomic_write() to check if writes are atomic
      with a particular page size.
      
      When using the default innodb_page_size=16k, page writes should be
      atomic on NTFS when using ROW_FORMAT=COMPRESSED and KEY_BLOCK_SIZE<=4.
      
      Disabling srv_use_atomic_writes when innodb_file_per_table=OFF does
      not make sense, because that is a dynamic parameter.
      
      We also correct the documentation string of innodb_use_atomic_writes
      and remove the duplicate variable innobase_use_atomic_writes.
      56274bd5
    • Marko Mäkelä's avatar
      MDEV-22653: Remove the useless parameter innodb_simulate_comp_failures · 0f8caadc
      Marko Mäkelä authored
      The debug parameter innodb_simulate_comp_failures injected compression
      failures for ROW_FORMAT=COMPRESSED tables, breaking the pre-existing
      logic that I had implemented in the InnoDB Plugin for MySQL 5.1 to prevent
      compressed page overflows. A much better check is already achieved by
      defining UNIV_ZIP_COPY at the compilation time.
      (Only UNIV_ZIP_DEBUG is part of cmake -DWITH_INNODB_EXTRA_DEBUG=ON.)
      0f8caadc
    • Dmitry Shulga's avatar
  2. 21 Mar, 2021 2 commits
  3. 19 Mar, 2021 4 commits
  4. 18 Mar, 2021 8 commits
    • Igor Babaev's avatar
      MDEV-25112 MIN/MAX aggregation over an indexed column may return wrong result · b34bb81e
      Igor Babaev authored
      If a query with implicit grouping contains in MIN/MAX set function in the
      select list over a column that is a part of an index then the query
      might be subject to MIN/MAX optimization. With this optimization the
      server performs a look-up into an index, fetches a value of the column C
      used in the MIN/MAX function and substitute the MIN/MAX expression for this
      value. This allows to eliminate the table containing C from further join
      processing. In order the optimization to be applied the WHERE condition
      must be a conjunction of simple equality/inequality predicates or/and
      BETWEEN predicates.
      The bug fixed in the patch resulted in fetching a wrong value from the
      index used for MIN/MAX optimization. It may happened when a BETWEEN
      predicate containing the MIN/MAX value followed a strict inequality.
      
      Approved by dmitry.shulga@mariadb.com
      b34bb81e
    • Marko Mäkelä's avatar
      MDEV-10682 Race condition between ANALYZE and STATS_AUTO_RECALC · c557e954
      Marko Mäkelä authored
      ha_innobase::info_low(): While collecting statistics for
      ANALYZE TABLE, ensure that dict_stats_process_entry_from_recalc_pool()
      is not executing on the same table.
      
      We observed result differences for the test innodb.innodb_stats because
      dict_stats_empty_index() was being invoked by the background statistics
      calculation while ha_innobase::analyze() was executing
      dict_stats_analyze_index_level().
      c557e954
    • Marko Mäkelä's avatar
      MDEV-25121: innodb_flush_method=O_DIRECT fails on compressed tables · 6505662c
      Marko Mäkelä authored
      Tests with 4096-byte sector size confirm that it is
      safe to use O_DIRECT with page_compressed tables.
      That had been disabled on Linux, in an attempt to fix MDEV-21584
      which had been filed for the O_DIRECT problems earlier.
      
      The fil_node_t::block_size was being set mostly correctly until
      commit 10dd290b (MDEV-17380)
      introduced a regression in MariaDB Server 10.4.4.
      
      fil_node_t::read_page0(): Initialize fil_node_t::block_size.
      This will probably make similar code in fil_space_extend_must_retry()
      redundant, but we play it safe and will not remove that code.
      
      Thanks to Vladislav Vaintroub for testing this on Microsoft Windows
      using an old-fashioned rotational hard disk with 4KiB sector size.
      
      Reviewed by: Vladislav Vaintroub
      6505662c
    • Vladislav Vaintroub's avatar
      MDEV-21584 - portability fix · 00f620b2
      Vladislav Vaintroub authored
      This patch implements OS_DATA_FILE_NO_O_DIRECT on Windows.
      00f620b2
    • Marko Mäkelä's avatar
      Cleanup: Remove unused OS_DATA_TEMP_FILE · 14a8b700
      Marko Mäkelä authored
      This had been originally added in
      mysql/mysql-server@192bb153b675fe09037a53e456a79eee7211e3a7
      with the motivation to disable O_DIRECT for the dedicated tablespace
      for temporary tables. In MariaDB Server,
      commit 5eb53955 (MDEV-12227)
      should be a better solution.
      
      The code became orphaned later in
      mysql/mysql-server@c61244c0e6c58727cffebfb312ac415a463fa0fe
      and it had been applied to MariaDB Server 10.2.2 in
      commit 2e814d47 and
      commit fec844ac.
      
      Thanks to Vladislav Vaintroub for spotting this.
      14a8b700
    • Jan Lindström's avatar
      MDEV-24916 : Assertion `current_stmt_binlog_format == BINLOG_FORMAT_STMT ||... · c9ba6689
      Jan Lindström authored
      MDEV-24916 : Assertion `current_stmt_binlog_format == BINLOG_FORMAT_STMT || current_stmt_binlog_format == BINLOG_FORMAT_ROW' failed in THD::is_current_stmt_binlog_format_row
      
      Store old value of binlog format before wsrep code so that
      if we bail out because wsrep is not ready for connections
      we can restore binlog format correctly.
      c9ba6689
    • Jan Lindström's avatar
      MDEV-18874 : Galera test MW-286 causes Mutex = TTASEventMutex<GenericPolicy>]:... · f4e14f0e
      Jan Lindström authored
      MDEV-18874 : Galera test MW-286 causes Mutex = TTASEventMutex<GenericPolicy>]: Assertion `!is_owned()' failed. assertion
      
      MDEV-24649 galera.galera_bf_lock_wait MTR failed with sigabrt: Assertion `!is_ow
      ned()' failed in sync0policy.ic on MutexDebug with Mutex = TTASEventMutex<GenericPolicy>
      
      Bug was fixed as part of MDEV-23328, this just adds test cases to
      regression set.
      f4e14f0e
    • Daniel Black's avatar
      mariadb.pc: plugindir is used · 69740581
      Daniel Black authored
      As evidenced by converstation on Zulip,
      knowing where to install a plugin is important too.
      69740581
  5. 17 Mar, 2021 1 commit
  6. 16 Mar, 2021 1 commit
    • Julius Goryavsky's avatar
      MDEV-21039: Server fails to start with unknown mysqld_safe options · bf303e82
      Julius Goryavsky authored
      Adding any unknown option to the "[mysqld_safe]" section makes
      mysqld impossible to start with mysqld_multi. For example, after
      adding the unknown option "numa_interleave" to the "[mysqld_safe]"
      section, mysqld_multi exits with the following diagnostics:
      
      [ERROR] /usr/local/mysql/bin/mysqld: unknown option '--numa_interleave'
      
      To get rid of this behavior, this patch adds the passing of the default
      group suffix from mysqld_multi to the mysqld_safe side.
      bf303e82
  7. 15 Mar, 2021 3 commits
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. 05 Mar, 2021 1 commit
  14. 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
  15. 03 Mar, 2021 2 commits
  16. 02 Mar, 2021 1 commit
    • 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