1. 22 Apr, 2024 2 commits
    • Alexander Barkov's avatar
      MDEV-21034 GREATEST() and LEAST() malfunction for NULL · 24abbb9b
      Alexander Barkov authored
      There is a convention that Item::val_int() and Item::val_real() return
      SQL NULL doing effectively what this code does:
        null_value= true;
        return 0; // Always return 0 for SQL NULL
      
      This is done to optimize boolean value evaluation:
      if Item::val_int() or Item::val_real() returned 1 -
      that always means TRUE and never can means SQL NULL.
      This convention helps to avoid unnecessary testing
      Item::null_value after getting a non-zero return value.
      
      Item_func_min_max did not follow this convention.
      It could return a non-zero value together with null_value==true.
      This made evaluate_join_record() erroneously misinterpret
      SQL NULL as TRUE in this call:
      
        select_cond_result= MY_TEST(select_cond->val_int());
      
      Fixing Item_func_min_max to follow the convention.
      24abbb9b
    • Markus Staab's avatar
      Remove unnecessary whitespace in mysqldump · 361b7903
      Markus Staab authored
      361b7903
  2. 20 Apr, 2024 2 commits
    • Kristian Nielsen's avatar
      MDEV-19415: use-after-free on charsets_dir from slave connect · 57f6a1ca
      Kristian Nielsen authored
      The slave IO thread sets MYSQL_SET_CHARSET_DIR. The code for this option
      however is not thread-safe in sql-common/client.c. The value set is
      temporarily written to mysys global variable `charsets-dir` and can be seen
      by other threads running in parallel, which can result in use-after-free
      error.
      
      Problem was visible as random failures of test cases in suite multi_source
      with Valgrind or MSAN.
      
      Work-around by not setting this option for slave connect, it is redundant
      anyway as it is just setting the default value.
      Signed-off-by: default avatarKristian Nielsen <knielsen@knielsen-hq.org>
      57f6a1ca
    • Kristian Nielsen's avatar
      MDEV-30232: rpl.rpl_gtid_crash fails sporadically in BB · 0c249ad7
      Kristian Nielsen authored
      The root cause of the failure is a bug in the Linux network stack:
      
        https://lore.kernel.org/netdev/87sf0ldk41.fsf@urd.knielsen-hq.org/T/#u
      
      If the slave does a connect(2) at the exact same time that kill -9 of the
      master process closes the listening socket, the FIN or RST packet is lost in
      the kernel, and the slave ends up timing out waiting for the initial
      communication from the server. This timeout defaults to
      --slave-net-timeout=120, which causes include/master_gtid_wait.inc to time
      out first and fail the test.
      
      Work-around this problem by reducing the --slave-net-timeout for this test
      case. If this problem turns up in other tests, we can consider reducing the
      default value for all tests.
      Signed-off-by: default avatarKristian Nielsen <knielsen@knielsen-hq.org>
      0c249ad7
  3. 19 Apr, 2024 3 commits
  4. 18 Apr, 2024 2 commits
    • Vladislav Vaintroub's avatar
      MDEV-16944 postfix. Fix a typo · 2e84560d
      Vladislav Vaintroub authored
      2e84560d
    • mariadb-DebarunBanerjee's avatar
      MDEV-32489 Change buffer index fails to delete the records · 5928e04d
      mariadb-DebarunBanerjee authored
      When the change buffer records for a page span across multiple change
      buffer leaf pages or the starting record is at the beginning of a page
      with a left sibling, ibuf_delete_recs deletes only the records in first
      page and fails to move to subsequent pages.
      
      Subsequently a slow shutdown hangs trying to delete those left over
      records.
      
      Fix-A: Position the cursor to an user record in B-tree and exit only
      when all records are exhausted.
      
      Fix-B: Make sure we call ibuf_delete_recs during slow shutdown for
      pages with IBUF entries to cleanup any previously left over records.
      5928e04d
  5. 17 Apr, 2024 11 commits
    • Brandon Nesterenko's avatar
      MDEV-27512: Assertion !thd->transaction_rollback_request failed in rows_event_stmt_cleanup · 0ad52e4d
      Brandon Nesterenko authored
      If replicating an event in ROW format, and InnoDB detects a deadlock
      while searching for a row, the row event will error and rollback in
      InnoDB and indicate that the binlog cache also needs to be cleared,
      i.e. by marking thd->transaction_rollback_request. In the normal
      case, this will trigger an error in Rows_log_event::do_apply_event()
      and cause a rollback. During the Rows_log_event::do_apply_event()
      cleanup of a successful event application, there is a DBUG_ASSERT in
      log_event_server.cc::rows_event_stmt_cleanup(), which sets the
      expectation that thd->transaction_rollback_request cannot be set
      because the general rollback (i.e. not the InnoDB rollback) should
      have happened already. However, if the replica is configured to skip
      deadlock errors, the rows event logic will clear the error and
      continue on, as if no error happened. This results in
      thd->transaction_rollback_request being set while in
      rows_event_stmt_cleanup(), thereby triggering the assertion.
      
      This patch fixes this in the following ways:
       1) The assertion is invalid, and thereby removed.
       2) The rollback case is forced in rows_event_stmt_cleanup() if
      transaction_rollback_request is set.
      
      Note the differing behavior between transactions which are skipped
      due to deadlock errors and other errors. When a transaction is
      skipped due to an ignored deadlock error, the entire transaction is
      rolled back and skipped (though note MDEV-33930 which allows
      statements in the same transaction after the deadlock-inducing one
      to commit). When a transaction is skipped due to ignoring a
      different error, only the erroring statements are rolled-back and
      skipped - the rest of the transaction will execute as normal. The
      effect of this can be seen in the test results. The added test case
      to rpl_skip_error.test shows that only statements which are ignored
      due to non-deadlock errors are ignored in larger transactions. A
      diff between rpl_temporary_error2_skip_all.result and
      rpl_temporary_error2.result shows that all statements in the errored
      transaction are rolled back (diff pasted below):
      
      : diff rpl_temporary_error2.result rpl_temporary_error2_skip_all.result
      49c49
      < 2	1
      ---
      > 2	NULL
      51c51
      < 4	1
      ---
      > 4	NULL
      53c53
      < * There will be two rows in t2 due to the retry.
      ---
      > * There will be one row in t2 because the ignored deadlock does not retry.
      57d56
      < 1
      59c58
      < 1
      ---
      > 0
      
      Reviewed By:
      ============
      Andrei Elkin <andrei.elkin@mariadb.com>
      0ad52e4d
    • Vladislav Vaintroub's avatar
      MDEV-16944 Fix file sharing issues on Windows in mysqltest · 061adae9
      Vladislav Vaintroub authored
      On Windows systems, occurrences of ERROR_SHARING_VIOLATION due to
      conflicting share modes between processes accessing the same file can
      result in CreateFile failures.
      
      mysys' my_open() already incorporates a workaround by implementing
      wait/retry logic on Windows.
      
      But this does not help if files are opened using shell redirection like
      mysqltest traditionally did it, i.e via
      
      --echo exec "some text" > output_file
      
      In such cases, it is cmd.exe, that opens the output_file, and it
      won't do any sharing-violation retries.
      
      This commit addresses the issue by introducing a new built-in command,
      'write_line', in mysqltest. This new command serves as a brief alternative
      to 'write_file', with a single line output, that also resolves variables
      like "exec" would.
      
      Internally, this command will use my_open(), and therefore retry-on-error
      logic.
      
      Hopefully this will eliminate the very sporadic "can't open file because
      it is used by another process" error on CI.
      061adae9
    • Vladislav Vaintroub's avatar
      Remove duplicate key "Language" from .clang-format · b48de973
      Vladislav Vaintroub authored
      Latest Visual Studio complains about invalid format, it breaks formatting
      in the IDE
      b48de973
    • Vladislav Vaintroub's avatar
      Do not run maria_recover_encrypted with embedded. · 173847b7
      Vladislav Vaintroub authored
      It uses shutdown/restart etc, features not compatible the embedded.
      
      also add have_debug.inc , since it uses debug_dbug variable
      173847b7
    • Vladislav Vaintroub's avatar
      Fix LTO (aka interprocedural optimization) build with MSVC · e87a175b
      Vladislav Vaintroub authored
      Also, disable MSVC LTO for static client libraries - they won't be usable
      for end-users.
      e87a175b
    • mariadb-DebarunBanerjee's avatar
      MDEV-33431 Latching order violation reported fil_system.sys_space.latch and... · 040069f4
      mariadb-DebarunBanerjee authored
      MDEV-33431 Latching order violation reported fil_system.sys_space.latch and ibuf_pessimistic_insert_mutex
      
      Issue:
      ------
      The actual order of acquisition of the IBUF pessimistic insert mutex
      (SYNC_IBUF_PESS_INSERT_MUTEX) and IBUF header page latch
      (SYNC_IBUF_HEADER) w.r.t space latch (SYNC_FSP) differs from the order
      defined in sync0types.h. It was not discovered earlier as the path to
      ibuf_remove_free_page was not covered by the mtr test. Ideal order and
      one defined in sync0types.h is as follows.
      SYNC_IBUF_HEADER -> SYNC_IBUF_PESS_INSERT_MUTEX -> SYNC_FSP
      
      In ibuf_remove_free_page, we acquire space latch earlier and we have
      the order as follows resulting in the assert with innodb_sync_debug=on.
      SYNC_FSP -> SYNC_IBUF_HEADER -> SYNC_IBUF_PESS_INSERT_MUTEX
      
      Fix:
      ---
      We do maintain this order in other places and there doesn't seem to be
      any real issue here. To reduce impact in GA versions, we avoid doing
      extensive changes in mutex ordering to match the current
      SYNC_IBUF_PESS_INSERT_MUTEX order. Instead we relax the ordering check
      for IBUF pessimistic insert mutex using SYNC_NO_ORDER_CHECK.
      040069f4
    • Vladislav Vaintroub's avatar
      MDEV-33840 tpool- switch to longer maintainence timer interval, if pool is idle · f6e9600f
      Vladislav Vaintroub authored
      Previous solution, that would entirely switch timer off, turned out
      to be deadlock prone.
      
      This patch fixed previous attempt to switch between long/short interval
      periods in MDEV-24295. Now, initial state of the timer is fixed (it is ON).
      Also, avoid switching timer to longer periods if there is any activity in
      the pool.
      f6e9600f
    • Vladislav Vaintroub's avatar
      2ba79aba
    • Marko Mäkelä's avatar
      Merge 10.4 into 10.5 · 3a3fe300
      Marko Mäkelä authored
      3a3fe300
    • Marko Mäkelä's avatar
      Tests: remove a duplicated check · 9164c2b8
      Marko Mäkelä authored
      This fixes up the merge commit 9b182756
      9164c2b8
    • Jan Lindström's avatar
      MDEV-33895 : Galera test failure on galera_sr.MDEV-25718 · 4aeba259
      Jan Lindström authored
      Test was waiting INSERT-clause to make rollback but
      wait_condition was too tight. State could be
      Freeing items or Rollback. Fixed wait_condition
      to expect one of them.
      4aeba259
  6. 16 Apr, 2024 3 commits
    • Sergei Golubchik's avatar
      MDEV-33889 Read only server throws error when running a create temporary table as select statement · 41e7ceb0
      Sergei Golubchik authored
      create_partitioning_metadata() should only mark transaction r/w
      if it actually did anything (that is, the table is partitioned).
      
      otherwise it's a no-op, called even for temporary tables and
      it shouldn't do anything at all
      41e7ceb0
    • Oleksandr Byelkin's avatar
      Merge branch '10.4' into 10.5 · 9b182756
      Oleksandr Byelkin authored
      9b182756
    • Oleksandr Byelkin's avatar
      MDEV-33861 main.query_cache fails with embedded after enabling WITH_PROTECT_STATEMENT_MEMROOT · 50998a6c
      Oleksandr Byelkin authored
      Synopsis: If SELECT returned answer from Query Cache it is not really executed.
      
      The reason for firing of assertion
        DBUG_ASSERT((mem_root->flags & ROOT_FLAG_READ_ONLY) == 0);
      is that in case the query_cache is on and the same query run by different
      stored routines the following use case can take place:
      First, lets say that bodies of routines used by the test case are the same
      and contains the only query 'SELECT * FROM t1';
        call p1() -- a result set is stored in query cache for further use.
        call p2() -- the same query is run against the table t1, that result in
                     not running the actual query but using its cached result.
                     On finishing execution of this routine, its memory root is
                     marked for read only since every SP instruction that this
                     routine contains has been executed.
        INSERT INT t1 VALUE (1); -- force following invalidation of query cache
        call p2() -- query the table t1 will result in assertion failure since its
                     execution would require allocation on the memory root that
                     has been already marked as read only memory root
      
      The root cause of firing the assertion is that memory root of the stored
      routine 'p2' was marked as read only although actual execution of the query
      contained inside hadn't been performed.
      
      To fix the issue, mark a SP instruction as not yet run in case its execution
      doesn't result in real query processing and a result set got from query cache
      instead.
      
      Note that, this issue relates server built in debug mode AND with the protect
      statement memory root feature turned on. It doesn't affect server built
      in release mode.
      50998a6c
  7. 15 Apr, 2024 5 commits
  8. 14 Apr, 2024 3 commits
  9. 13 Apr, 2024 6 commits
    • Sergei Golubchik's avatar
      feedback plugin: abort sending the report on server shutdown · 8bc32410
      Sergei Golubchik authored
      network timeouts might be rather large and feedback plugin
      waits forever for the sender thread to exit.
      
      an alternative could've been to use GNU-specific pthread_timedjoin_np(),
      where _np mean "not portable".
      8bc32410
    • Sergei Golubchik's avatar
      Fixed random failure in main.kill_processlist-6619 (take 3) · 6a4ac4c7
      Sergei Golubchik authored
      followup for 81f75ca8
      
      improve over take 2. It's technically possible, though unlikely,
      to see THD after it already reset the info to NULL, but has not
      changed the command to COM_SLEEP yet (see THD::mark_connection_idle()).
      
      Let's wait for "Sleep", not for NULL.
      6a4ac4c7
    • Sergei Golubchik's avatar
      galera/suite.pm: perl warning · 69b5fdf3
      Sergei Golubchik authored
      Unescaped left brace in regex is passed through in regex
      69b5fdf3
    • Tony Chen's avatar
      Minor improvements to options error handling · 79706fd3
      Tony Chen authored
      - Add additional MTRs for more coverage on invalid options
      - Updating a few error messages to be more informative
      - Use the exit code from handle_options() when there is an error processing
        user options
      
      All new code of the whole pull request, including one or several files that are
      either new files or modified ones, are contributed under the BSD-new license. I
      am contributing on behalf of my employer Amazon Web Services, Inc.
      79706fd3
    • Tony Chen's avatar
      MDEV-33469 Fix behavior on invalid arguments · 47d75cdd
      Tony Chen authored
      When passing in an invalid value (e.g. incorrect data type) for a variable, the
      server startup will fail with misleading error messages.
      
      The behavior **before** this change:
      
      For server options:
      - The error message will indicate that the argument is being adjusted to a valid value
      - Server startup still fails
      
      For plugin options:
      - The error message will indicate that the argument is being adjusted to a valid value
      - The plugin is still disabled
      - Server startup fails with a message that it does not recognize the plugin option
      
      The behavior **after** this change:
      
      For server options:
      - Output that an invalid argument was provided
      - Exit server startup
      
      For plugin options:
      - Output that an invalid argument was provided
      - Disable the plugin
      - Attempt to continue server startup
      
      All new code of the whole pull request, including one or several files that are
      either new files or modified ones, are contributed under the BSD-new license. I
      am contributing on behalf of my employer Amazon Web Services, Inc.
      47d75cdd
    • Tony Chen's avatar
      Simplify MTR for handling multiple invalid options · dd639985
      Tony Chen authored
      In 69a4d6ae, an MTR test was added to verify that we handled multiple invalid
      options.  However, the logic to perform this test relied on a non-trivial regex
      to filter out the noise in the logs.
      
      Instead, we now just simply search for what we expect to be in the logs.
      
      All new code of the whole pull request, including one or several files that are
      either new files or modified ones, are contributed under the BSD-new license. I
      am contributing on behalf of my employer Amazon Web Services, Inc.
      dd639985
  10. 12 Apr, 2024 1 commit
    • Vlad Lesin's avatar
      MDEV-33802 Weird read view after ROLLBACK of other transactions. · d7fc975c
      Vlad Lesin authored
      In the case if some unique key fields are nullable, there can be
      several records with the same key fields in unique index with at least
      one key field equal to NULL, as NULL != NULL.
      
      When transaction is resumed after waiting on the record with at least one
      key field equal to NULL, and stored in persistent cursor record is
      deleted, persistent cursor can be restored to the record with all key
      fields equal to the stored ones, but with at least one field equal to
      NULL. And such record is wrongly treated as a record with the same unique
      key as stored in persistent cursor record one, what is wrong as
      NULL != NULL.
      
      The fix is to check if at least one unique field is NULL in restored
      persistent cursor position, and, if so, then don't treat the record as
      one with the same unique key as in the stored record key.
      
      dict_index_t::nulls_equal was removed, as it was initially developed for
      never existed in MariaDB "intrinsic tables", and there is no code, which
      would set it to "true".
      
      Reviewed by Marko Mäkelä.
      d7fc975c
  11. 11 Apr, 2024 2 commits
    • Brandon Nesterenko's avatar
      MDEV-10684: rpl.rpl_domain_id_filter_restart fails in buildbot · a6aecbb0
      Brandon Nesterenko authored
      The test failure in rpl.rpl_domain_id_filter_restart is caused by
      MDEV-33887. That is, the test uses master_pos_wait() (called
      indirectly by sync_slave_with_master) to try and wait for the
      replica to catch up to the master. However, the waited on
      transaction is ignored by the configured
        CHANGE MASTER TO IGNORE_DOMAIN_IDS=()
      As MDEV-33887 reports, due to the IO thread updating the binlog
      coordinates and the SQL thread updating the GTID state, if the
      replica is stopped in-between these updates, the replica state will
      be inconsistent. That is, the test expects that the GTID state will
      be updated, so upon restart, the replica will be up-to-date.
      However, if the replica is stopped before the SQL thread updates its
      GTID state, then upon restart, the replica will fetch the previously
      ignored event, which is no longer ignored upon restart, and execute
      it. This leads to the sporadic extra row in t2.
      
      This patch changes master_pos_wait() to use master_gtid_wait() to
      ensure the replica state is consistent with the master state.
      a6aecbb0
    • Marko Mäkelä's avatar
      Fix g++-14 -Wtemplate-id-cdtor · 04be12a8
      Marko Mäkelä authored
      04be12a8