1. 13 Jul, 2023 8 commits
    • Yuchen Pei's avatar
      MDEV-29502 Fix some issues with spider direct aggregate · eb06eeba
      Yuchen Pei authored
      The direct aggregate mechanism sems to be only intended to work when
      otherwise a full table scan query will be executed from the spider
      node and the aggregation done at the spider node too. Typically this
      happens in sub_select(). In the test spider.direct_aggregate_part
      direct aggregate allows to send COUNT statements directly to the data
      nodes and adds up the results at the spider node, instead of iterating
      over the rows one by one at the spider node.
      
      By contrast, the group by handler (GBH) typically sends aggregated
      queries directly to data nodes, in which case DA does not improve the
      situation here.
      
      That is why we should fix it by disabling DA when GBH is used.
      
      There are other reasons supporting this change. First, the creation of
      GBH results in a call to change_to_use_tmp_fields() (as opposed to
      setup_copy_fields()) which causes the spider DA function
      spider_db_fetch_for_item_sum_funcs() to work on wrong items. Second,
      the spider DA function only calls direct_add() on the items, and the
      follow-up add() needs to be called by the sql layer code. In
      do_select(), after executing the query with the GBH, it seems that the
      required add() would not necessarily be called.
      
      Disabling DA when GBH is used does fix the bug. There are a few
      other things included in this commit to improve the situation with
      spider DA:
      
      1. Add a session variable that allows user to disable DA completely,
      this will help as a temporary measure if/when further bugs with DA
      emerge.
      
      2. Move the increment of direct_aggregate_count to the spider DA
      function. Currently this is done in rather bizarre and random
      locations.
      
      3. Fix the spider_db_mbase_row creation so that the last of its row
      field (sentinel) is NULL. The code is already doing a null check, but
      somehow the sentinel field is on an invalid address, causing the
      segfaults. With a correct implementation of the row creation, we can
      avoid such segfaults.
      eb06eeba
    • Yuchen Pei's avatar
      MDEV-29502 Remove spider_db_handler::need_lock_before_set_sql_for_exec · 39a9467d
      Yuchen Pei authored
      This function trivially returns false
      39a9467d
    • Yuchen Pei's avatar
      MDEV-29502 Clean up spider_db_seek_next() a bit · 75394613
      Yuchen Pei authored
      Also moved spider_conn_before_query() and spider_conn_after_query() to
      be used by more places
      
      And clean up other functions in the same file (spd_db_conn.cc).
      75394613
    • Yuchen Pei's avatar
      MDEV-31117 clean up spider connection info parsing · c163b8c6
      Yuchen Pei authored
      Spider connection string is a comma-separated parameter definitions,
      where each definition is of the form "<param_title> <param_value>",
      where <param_value> is quote delimited on both ends, with backslashes
      acting as an escaping prefix.
      
      The code however treated param title the same way as param value when
      assigning, and have nonsensical fields like delim_title_len and
      delim_title. We remove these.
      
      We also clean up the spider comment connection string parsing,
      including:
      
      - Factoring out some code from the parsing function
      - Rewriting the struct `st_spider_param_string_parse`, including
        replacing its messy methods with cleaner ones
      - And any necessary changes caused by the above changes
      c163b8c6
    • Yuchen Pei's avatar
      MDEV-31524 Fixing spider table param / variable overriding · 239a9304
      Yuchen Pei authored
      The existing (incorrect) overriding mechanism is:
      
      Non-minus-one var value overrides table param overrides default value.
      
      Before MDEV-27169, unspecified var value is -1. So if the user sets
      both the var to be a value other than -1 and the table param, the var
      value will prevail, which is incorrect.
      
      After MDEV-27169, unspecified var value is default value. So if the
      user does not set the var but sets the table param, the default value
      will prevail, which is even more incorrect.
      
      This patch fixes it so that table param, if specified, always
      overrides var value, and the latter if not specified or set to -1,
      falls back to the default value
      
      We achieve this by replacing all such overriding in spd_param.cc with
      macros that override in the correct way, and removing all the
      "overriding -1" lines involving table params in
      spider_set_connect_info_default() except for those table params not
      defined as sysvar/thdvar in spd_params.cc
      
      We also introduced macros for non-overriding sysvar and thdvar, so
      that the code is cleaner and less error-prone
      
      In server versions where MDEV-27169 has not been applied, we also
      backport the patch, that is, replacing -1 default values with real
      default values
      
      In server versions where MDEV-28006 has not been applied, we do the
      same for udf params
      239a9304
    • Yuchen Pei's avatar
      MDEV-31421 Fix spider test cleanup · 5467a185
      Yuchen Pei authored
      This fixes mdev_26541.test, and the new clean_up_spider.inc will be
      useful for other tests where part of deinit_spider does not apply,
      e.g. those testing spider initialisation only.
      5467a185
    • Yuchen Pei's avatar
      Adding .ccls-cache/ to .gitignore · 5941a8b5
      Yuchen Pei authored
      generated by the language server ccls
      5941a8b5
    • Yuchen Pei's avatar
  2. 28 Jun, 2023 3 commits
    • Yuchen Pei's avatar
      MDEV-29447 MDEV-26285 MDEV-31338 Refactor spider_db_mbase_util::open_item_func · ba61aa5f
      Yuchen Pei authored
      spider_db_mbase_util::open_item_func() is a monster function.
      It is difficult to maintain while it is expected that we need to
      modify it when a new SQL function or a new func_type is added.
      
      We split the function into two distinct functions: one handles the
      case of str != NULL and the other handles the case of str == NULL.
      
      This refactoring was done in a conservative way because we do not
      have comprehensive tests on the function.
      
      It also fixes MDEV-29447 and MDEV-31338 where field items that are
      arguments of a func item may be used before created / initialised.
      
      Note this commit is adapted from a patch by Nayuta for MDEV-26285.
      ba61aa5f
    • Yuchen Pei's avatar
      MDEV-30435 MDEV-30981 Fix ubsan errors w.r.t. memcpy in spd_trx.cc · 72a25dce
      Yuchen Pei authored
      Extract the indexed string memcopy pattern in spd_trx.cc to a static
      inline function.
      
      Also updated the ubsan check in mdev_26541.test (h/t roel).
      72a25dce
    • Yuchen Pei's avatar
      MDEV-30542 Fixing spider/bugfix.self_reference_multi · 24faa5de
      Yuchen Pei authored
      The server needs to have a unique name
      24faa5de
  3. 27 Jun, 2023 1 commit
  4. 20 Jun, 2023 1 commit
  5. 16 Jun, 2023 1 commit
  6. 15 Jun, 2023 1 commit
  7. 14 Jun, 2023 1 commit
    • Sergei Petrunia's avatar
      MDEV-31479: Inconsistency between MRR and SQL layer costs can cause poor query plan · 0e2e70c4
      Sergei Petrunia authored
      (Same as
      TODO-3938: best_access_path shows negative costs for mrr=on)
      
      best_access_path() assumes that quick select cost includes
      (quick->rows/TIME_FOR_COMPARE) as a cost of checking the attached
      part of the WHERE condition.
      
      It calls adjust_quick_cost() to subtract addition from quick's cost.
      
      The problem was that DS-MRR cost formula didn't include this cost.
      For very large tables, adjust_quick_cost() would produce a negative
      cost which would cause assert in debug build or bad query plan choice
      in release builds.
      Approved-by: default avatarMonty <monty@mariadb.org>
      0e2e70c4
  8. 09 Jun, 2023 1 commit
    • Thirunarayanan Balathandayuthapani's avatar
      MDEV-31442 page_cleaner thread aborts while releasing the tablespace · 841e905f
      Thirunarayanan Balathandayuthapani authored
      After further I/O on a tablespace has been stopped
      (for example due to DROP TABLE or an operation that
      rebuilds a table), page cleaner thread tries to
      flush the pending writes for the tablespace and
      releases the tablespace reference even though it was not
      acquired.
      
      fil_space_t::flush(): Don't release the tablespace when it is
      being stopped and closed
      
      Thanks to Marko Mäkelä for suggesting this patch.
      841e905f
  9. 08 Jun, 2023 5 commits
  10. 07 Jun, 2023 3 commits
  11. 05 Jun, 2023 2 commits
  12. 03 Jun, 2023 8 commits
    • Marko Mäkelä's avatar
      MDEV-31234 fixup: Allow innodb_undo_log_truncate=ON after upgrade · 3b4b512d
      Marko Mäkelä authored
      trx_purge_truncate_history(): Relax a condition that would prevent
      undo log truncation if the undo log tablespaces were "contaminated"
      by the bug that commit e0084b9d fixed.
      That is, trx_purge_truncate_rseg_history() would have invoked
      flst_remove() on TRX_RSEG_HISTORY but not reduced TRX_RSEG_HISTORY_SIZE.
      
      To avoid any regression with normal operation, we implement this
      fixup during slow shutdown only. The condition on the history list
      being empty is necessary: without it, in the test
      innodb.undo_truncate_recover there may be much fewer than the
      expected 90,000 calls to row_purge() before the truncation.
      That is, we would truncate the undo tablespace before actually having
      processed all undo log records in it.
      
      To truncate such "contaminated" or "bloated" undo log tablespaces
      (when using innodb_undo_tablespaces=2 or more)
      you can execute the following SQL:
      
      BEGIN;INSERT mysql.innodb_table_stats VALUES('','',DEFAULT,0,0,0);ROLLBACK;
      SET GLOBAL innodb_undo_log_truncate=ON, innodb_fast_shutdown=0;
      SHUTDOWN;
      
      The first line creates a dummy InnoDB transaction, to ensure that there
      will be some history to be purged during shutdown and that the undo
      tablespaces will be truncated.
      3b4b512d
    • Marko Mäkelä's avatar
      MDEV-31234 fixup: Free some UNDO pages earlier · 48d6a5f6
      Marko Mäkelä authored
      trx_purge_truncate_rseg_history(): Add a parameter to specify if
      the entire rollback segment is safe to be freed. If not, we may
      still be able to invoke trx_undo_truncate_start() and free some pages.
      48d6a5f6
    • Marko Mäkelä's avatar
      MDEV-31234 InnoDB does not free UNDO after the fix of MDEV-30671 · 318012a8
      Marko Mäkelä authored
      trx_purge_truncate_history(): Only call trx_purge_truncate_rseg_history()
      if the rollback segment is safe to process. This will avoid leaking undo
      log pages that are not yet ready to be processed. This fixes a regression
      that was introduced in
      commit 0de3be8c (MDEV-30671).
      
      trx_sys_t::any_active_transactions(): Separately count XA PREPARE
      transactions.
      
      srv_purge_should_exit(): Terminate slow shutdown if the history size
      does not change and XA PREPARE transactions exist in the system.
      This will avoid a hang of the test innodb.recovery_shutdown.
      
      Tested by: Matthias Leich
      318012a8
    • Sergei Golubchik's avatar
      eb472f77
    • Sergei Golubchik's avatar
      Revert "MDEV-30473 : Do not allow GET_LOCK() / RELEASE_LOCK() in cluster" · 0fd54c98
      Sergei Golubchik authored
      This reverts commit 844ddb11.
      
      This fixes MDEV-30967, MDEV-31325, MDEV-31388
      0fd54c98
    • Igor Babaev's avatar
      MDEV-31240 Crash with condition pushable into derived and containing outer reference · 8f3bf593
      Igor Babaev authored
      This bug could affect queries containing a subquery over splittable derived
      tables and having an outer references in its WHERE clause. If such subquery
      contained an equality condition whose left part was a reference to a column
      of the derived table and the right part referred only to outer columns
      then the server crashed in the function st_join_table::choose_best_splitting()
      The crashing code was added in the commit ce7ffe61
      that made the code of the function sensitive to presence of the flag
      OUTER_REF_TABLE_BIT in the KEYUSE_EXT::needed_in_prefix fields.
      
      The field needed_in_prefix of the KEYUSE_EXT structure should not contain
      table maps with OUTER_REF_TABLE_BIT or RAND_TABLE_BIT.
      
      Note that this fix is quite conservative: for affected queries it just
      returns the query plans that were used before the above mentioned commit.
      In fact the equalities causing crashes should be pushed into derived tables
      without any usage of split optimization.
      
      Approved by Sergei Petrunia <sergey@mariadb.com>
      8f3bf593
    • Igor Babaev's avatar
      MDEV-31224 Crash with EXPLAIN EXTENDED for multi-table update of system table · aa713f5a
      Igor Babaev authored
      EXPLAIN EXTENDED should always print the field item used in the left part
      of an equality expression from the SET clause of an update statement as a
      reference to table column.
      
      Approved by Oleksandr Byelkin <sanja@mariadb.com>
      aa713f5a
    • Daniel Bartholomew's avatar
      bump the VERSION · 54324e54
      Daniel Bartholomew authored
      54324e54
  13. 01 Jun, 2023 2 commits
  14. 24 May, 2023 2 commits
  15. 23 May, 2023 1 commit
    • Marko Mäkelä's avatar
      MDEV-31234 fixup: Allow innodb_undo_log_truncate=ON after upgrade · 9c35f9c9
      Marko Mäkelä authored
      trx_purge_truncate_history(): Relax a condition that would prevent
      undo log truncation if the undo log tablespaces were "contaminated"
      by the bug that commit e0084b9d fixed.
      That is, trx_purge_truncate_rseg_history() would have invoked
      flst_remove() on TRX_RSEG_HISTORY but not reduced TRX_RSEG_HISTORY_SIZE.
      
      To avoid any regression with normal operation, we implement this
      fixup during slow shutdown only. The condition on the history list
      being empty is necessary: without it, in the test
      innodb.undo_truncate_recover there may be much fewer than the
      expected 90,000 calls to row_purge() before the truncation.
      That is, we would truncate the undo tablespace before actually having
      processed all undo log records in it.
      
      To truncate such "contaminated" or "bloated" undo log tablespaces
      (when using innodb_undo_tablespaces=2 or more)
      you can execute the following SQL:
      
      BEGIN;INSERT mysql.innodb_table_stats VALUES('','',DEFAULT,0,0,0);ROLLBACK;
      SET GLOBAL innodb_undo_log_truncate=ON, innodb_fast_shutdown=0;
      SHUTDOWN;
      
      The first line creates a dummy InnoDB transaction, to ensure that there
      will be some history to be purged during shutdown and that the undo
      tablespaces will be truncated.
      9c35f9c9