1. 06 May, 2022 1 commit
    • Hartmut Holzgraefe's avatar
      MDEV-27816 Set sql_mode before DROP IF EXISTS already · 9fe3bc2a
      Hartmut Holzgraefe authored
      Previously the correct SQL mode for a stored routine or
      package was only set before doing the CREATE part, this
      worked out for PROCEDUREs and FUNCTIONs, but with ORACLE
      mode specific PACKAGEs the DROP also only works in ORACLE
      mode.
      
      Moving the setting of the sql_mode a few lines up to happen
      right before the DROP statement is writen fixes this.
      9fe3bc2a
  2. 05 May, 2022 2 commits
  3. 04 May, 2022 2 commits
    • Sergei Golubchik's avatar
      test fixes for FreeBSD · 53193599
      Sergei Golubchik authored
      * FreeBSD returns errno 31 (EMLINK, Too many links),
        not 40 (ELOOP, Too many levels of symbolic links)
      * (`mysqlbinlog|mysql`) was just crazy, why did it ever work?
      * socket_ipv6.inc check (that checked whether ipv6 is supported)
        only worked correctly when ipv6 was supported
      * perfschema.socket_summary_by_instance was changing global variables
        and then skip-ing the test (because on missing ipv6)
      53193599
    • Vlad Lesin's avatar
      MDEV-17843 Assertion `page_rec_is_leaf(rec)' failed in lock_rec_queue_validate... · 2c381d8c
      Vlad Lesin authored
      MDEV-17843 Assertion `page_rec_is_leaf(rec)' failed in lock_rec_queue_validate upon SHOW ENGINE INNODB STATUS
      
      lock_validate() accumulates page ids under locked lock_sys->mutex, then
      releases the latch, and invokes lock_rec_block_validate() for each page.
      Some other thread has ability to add/remove locks and change pages
      between releasing the latch in lock_validate() and acquiring it in
      lock_rec_validate_page().
      
      lock_rec_validate_page() can invoke lock_rec_queue_validate() for
      non-locked supremum, what can cause ut_ad(page_rec_is_leaf(rec)) failure
      in lock_rec_queue_validate().
      
      The fix is to invoke lock_rec_queue_validate() only for locked records
      in lock_rec_validate_page().
      
      The error message in lock_rec_block_validate() is not necessary as
      BUF_GET_POSSIBLY_FREED mode is used to get block from buffer pool, and
      this is not error if a block was evicted.
      
      The test case would require new debug sync point. I think it's not
      necessary as the fixed code is debug-only.
      2c381d8c
  4. 03 May, 2022 1 commit
  5. 02 May, 2022 2 commits
    • Oleksandr Byelkin's avatar
      New CC 3.1 · 70555454
      Oleksandr Byelkin authored
      70555454
    • Alexander Barkov's avatar
      MDEV-28446 mariabackup prepare fails for incrementals if a new schema is... · 680ca152
      Alexander Barkov authored
      MDEV-28446 mariabackup prepare fails for incrementals if a new schema is created after full backup is taken
      
      When "mariabackup --target-dir=$basedir --incremental-dir=$incremental_dir"
      is running and is moving a new table file (e.g. `db1/t1.new`) from the
      incremental directory to the base directory, it needs to verify that the base
      backup database directory (e.g. `$basedir/db1`) really exists
      (or create it otherwise).
      
      The table `db1/t1` can come from a new database `db1` which
      was created during the base mariabackup execution time.
      
      In such case the directory `db1` exists only in the incremental directory,
      but does not exist in the base directory.
      680ca152
  6. 29 Apr, 2022 3 commits
    • Aleksey Midenkov's avatar
      MDEV-20077 compilation fix · 182b8a29
      Aleksey Midenkov authored
      182b8a29
    • Aleksey Midenkov's avatar
      MDEV-20077 Warning on full history partition is delayed until next DML statement · ddc416c6
      Aleksey Midenkov authored
      Moved LIMIT warning from vers_set_hist_part() to new call
      vers_check_limit() at table unlock phase. At that point
      read_partitions bitmap is already pruned by DML code (see
      prune_partitions(), find_used_partitions()) so we have to set
      corresponding bits for working history partition.
      
      Also we don't do my_error(ME_WARNING|ME_ERROR_LOG), because at that
      point it doesn't update warnings number, so command reports 0 warnings
      (but warning list is still updated). Instead we do
      push_warning_printf() and sql_print_warning() separately.
      
      Under LOCK TABLES external_lock(F_UNLCK) is not executed. There is
      start_stmt(), but no corresponding "stop_stmt()". So for that mode we
      call vers_check_limit() directly from close_thread_tables().
      
      Test result has been changed according to new LIMIT and warning
      printing algorithm. For convenience all LIMIT warnings are marked with
      "You see warning above ^".
      
      TODO MDEV-20345 fixed. Now vers_history_generating() contains
      fine-grained list of DML-commands that can generate history (and TODO
      mechanism worked well).
      ddc416c6
    • Aleksey Midenkov's avatar
      MDEV-28271 Assertion on TRUNCATE PARTITION for PARTITION BY SYSTEM_TIME · ea2f0997
      Aleksey Midenkov authored
      Like in MDEV-27217 vers_set_hist_part() for LIMIT depends on all
      partitions selected in read_partitions. That bugfix just disabled
      partition selection for DELETE with this check:
      
        if (table->pos_in_table_list &&
            table->pos_in_table_list->partition_names)
        {
          return HA_ERR_PARTITION_LIST;
        }
      
      ALTER TABLE TRUNCATE PARTITION is a different story. First, it doesn't
      update pos_in_table_list->partition_names, but
      thd->lex->alter_info.partition_names. But we cannot depend on that
      since alter_info will be stale for DML. Second, we should not disable
      TRUNCATE PARTITION for that to be consistent with TRUNCATE TABLE
      behavior.
      
      Now we don't do vers_set_hist_part() for ALTER TABLE as this command
      is not DML, so it does not produce history.
      ea2f0997
  7. 28 Apr, 2022 4 commits
  8. 27 Apr, 2022 4 commits
    • Marko Mäkelä's avatar
      MDEV-28422 Page split breaks a gap lock · 0806592a
      Marko Mäkelä authored
      btr_insert_into_right_sibling(): Inherit any gap lock from the
      left sibling to the right sibling before inserting the record
      to the right sibling and updating the node pointer(s).
      
      lock_update_node_pointer(): Update locks in case a node pointer
      will move.
      
      Based on mysql/mysql-server@c7d93c274fdc5c56e36458fa4000fa3a483ffffd
      0806592a
    • Marko Mäkelä's avatar
      c711abd1
    • Marko Mäkelä's avatar
      MDEV-28416 Incorrect AUTO_INCREMENT may be issued when close to UINT64_MAX · 44a27a26
      Marko Mäkelä authored
      ha_innobase::get_auto_increment(): In the overflow check, account
      for 64-bit unsigned integer wrap-around.
      
      Based on mysql/mysql-server@25ecfe7f49b5a649e96d462cb90602de9de3b919
      44a27a26
    • Marko Mäkelä's avatar
      MDEV-28415 ALTER TABLE on a large table hangs InnoDB · f21a8756
      Marko Mäkelä authored
      buf_flush_page(): Never wait for a page latch, even in checkpoint
      flushing (flush_type == BUF_FLUSH_LIST), to prevent a hang of the
      page cleaner threads when a large number of pages is latched.
      
      In mysql/mysql-server@9542f3015b00330ef537f6223565b28b82a5b325
      it was claimed that such a hang only affects CREATE FULLTEXT INDEX.
      Their fix was to retain buffer-fix but release exclusive latch
      on non-leaf pages, and subsequently write to those pages while
      they are not associated with the mini-transaction, which would
      trip a debug assertion in the MariaDB version of
      mtr_t::memo_modify_page() and cause potential corruption
      when using the default MariaDB setting innodb_log_optimize_ddl=OFF.
      
      This change essentially backports a small part of
      commit 7cffb5f6 (MDEV-23399)
      from MariaDB Server 10.5.7.
      f21a8756
  9. 26 Apr, 2022 8 commits
    • Sergei Golubchik's avatar
      MDEV-28020 CHECKSUM TABLE calculates different checksums · 39990135
      Sergei Golubchik authored
      Two bugs here:
      
      1. CHECKSUM TABLE asserted that all fields in the table are arranged
         sequentially in the record, but virtual columns are always at the
         end, violating this assertion
      2. virtual columns were not calculated for CHECKSUM, so CHECKSUM
         was using, essentially, garbage left from the previous statement.
         (that's why the test must use INSERT IGNORE to have this "previous
         statement" mark vcols not null)
      
      Fix: don't include virtual columns into the table CHECKSUM. Indeed,
      they cannot be included as the engine does not see virtual columns,
      so in-engine checksum cannot include them, meaning in-server checksum
      should not either
      39990135
    • Oleksandr Byelkin's avatar
      New C/C version · 44e7c312
      Oleksandr Byelkin authored
      *again* after 388032e9 has reverted 25ccf8f6 by mistake
      44e7c312
    • Andrei's avatar
      MDEV-27697. Removed a false assert. · 388032e9
      Andrei authored
      388032e9
    • Alexey Botchkov's avatar
      MDEV-25317 Assertion `scale <= precision' failed in decimal_bin_size And... · eca207c4
      Alexey Botchkov authored
      MDEV-25317 Assertion `scale <= precision' failed in decimal_bin_size And Assertion `scale >= 0 && precision > 0 && scale <= precision' failed in decimal_bin_size_inline/decimal_bin_size.
      
      Precision should be kept below DECIMAL_MAX_SCALE for computations.
      It can be bigger in Item_decimal. I'd fix this too but it changes the
      existing behaviour so problemmatic to ix.
      eca207c4
    • Andrei's avatar
      MDEV-27697. Two affected tests fixed. · 945245ae
      Andrei authored
      A result file is updated in one case and former error simulation got
      refined.
      945245ae
    • Sergei Petrunia's avatar
      MDEV-26047: MariaDB server crash at Item_subselect::init_expr_cache_tracker · 5100b20b
      Sergei Petrunia authored
      The cause of crash:
      remove_redundant_subquery_clauses() removes redundant item expressions.
      The primary goal of this is to remove the subquery items.
      The removal process unlinks the subquery from SELECT_LEX tree, but does
      not remove it from SELECT_LEX:::ref_pointer_array or from JOIN::all_fields.
      Then, setup_subquery_caches() tries to wrap the subquery item in an
      expression cache, which fails, the first reason for failure being that
      the item doesn't have a query plan.
      
      Solution: do not wrap eliminated items with expression cache.
      (also added an assert to check that we do not attempt to execute them).
      
      This may look like an incomplete fix: why don't we remove any mention
      of eliminated item everywhere? The difficulties here are:
      * items can be "un-removed" (see set_fake_select_as_master_processor)
      * it's difficult to remove an element from ref_pointer_array: Item_ref
      objects refer to elements of that array, so one can't shift elements in
      it. Replacing eliminated subselect with a dummy Item doesn't look like a
      good idea, either.
      5100b20b
    • Rucha Deodhar's avatar
      MDEV-20207: Assertion ! is_set() failed in Diagnostics_area::set_eof_status · 9b2d3666
      Rucha Deodhar authored
      upon HANDLER READ
      
      Analysis: The error state is not stored while checking condition and key
      name.
      Fix: Return true while checking condition and key name if error is reported
      because geometry object can't be created from the data in the index value
      for HANDLER READ.
      9b2d3666
    • Oleksandr Byelkin's avatar
      New CC version · 25ccf8f6
      Oleksandr Byelkin authored
      25ccf8f6
  10. 25 Apr, 2022 9 commits
    • Sergei Golubchik's avatar
      MDEV-6899 extra semicolon in show create event syntax · 3988dfff
      Sergei Golubchik authored
      to detect the end of SP definition correctly we need to know where
      the parser stopped parsing the SP. lip->get_cpp_ptr() shows the
      current parsing position, lip->get_cpp_tok_start() shows the start of
      the last parsed token. The actual value depends on whether
      the parser has performed a look-ahead. For example, in
      
        CREATE PROCEDURE ... BEGIN ... END ;
      
      the parser reads 'END' and knows that this ends the procedure definition,
      it does not need to read the next token for this. But in
      
        CREATE PROCEDURE ... SELECT 1 ;
      
      the parser cannot know that the procedure ends at '1'. It has to read
      the semicolon first (it could be '1 + 2' for example).
      
      In the first case, the "current parsing position" is after END, before
      the semicolon, in the second case it's *after* the semicolon. Note that
      SP definition in both cases ends before the semicolon.
      
      To be able to detect the end of SP deterministically, we need the parser
      to do the look-ahead always or never.
      
      The bug fix introduces a new parser token FORCE_LOOKAHEAD. Lexer never
      returns it, so this token can never match. But the parser cannot know
      it so it will have to perform a look-ahead to determine that the next
      token is not FORCE_LOOKAHEAD. This way we deterministically end
      SP parsing with a look-ahead.
      3988dfff
    • Sergei Golubchik's avatar
      7753eae1
    • Sergei Golubchik's avatar
      cleanup: main.create_select test · 1a94d2fd
      Sergei Golubchik authored
      1a94d2fd
    • Sergei Golubchik's avatar
      MDEV-28403 ASAN heap-use-after-free in String::copy / get_field_default_value · 9b7886bb
      Sergei Golubchik authored
      This reverts commit 5ba77222
      but keeps the test. A different fix for
      
      MDEV-21028 Server crashes in Query_arena::set_query_arena upon SELECT from view
      
      internal temporary tables should use THD as expr_area
      9b7886bb
    • Igor Babaev's avatar
      MDEV-27212 Crash in Item_equal::sort on second execution of stored procedure · c5e68b6d
      Igor Babaev authored
      This bug could cause a crash of the server at the second call of a stored
      procedure when it executed a query containing a mergeable derived table /
      view whose specification used another mergeable derived_table or view and a
      subquery with outer reference in the select list of the specification.
      Such queries could cause the same problem when they were executed for the
      second time in a prepared mode.
      The problem appeared due to a typo mistake in the legacy code of the function
      create_view_field() that prevented building Item_direct_view_ref wrapper
      for the mentioned outer reference at the second execution of the query and
      setting the depended_from field for the outer reference.
      
      Approved by Oleksandr Byelkin <sanja@mariadb.com>
      c5e68b6d
    • Andrei's avatar
      MDEV-27697 slave must recognize incomplete replication event group · 1bcdc3e9
      Andrei authored
      In cases of a faulty master or an incorrect binlog event producer, that slave is working with,
      sends an incomplete group of events slave must react with an error to not to log
      into the relay-log any new events that do not belong to the incomplete group.
      
      Fixed with extending received event properties check when slave connects to master
      in gtid mode.
      Specifically for the event that can be a part of a group its relay-logging is
      permitted only when its position within the group is validated.
      Otherwise slave IO thread stops with ER_SLAVE_RELAY_LOG_WRITE_FAILURE.
      1bcdc3e9
    • Marko Mäkelä's avatar
      MDEV-11415 merge fixup: Remove a redundant call · b208030e
      Marko Mäkelä authored
      In merge commit 921c5e93 the call
      log_free_check() was accidentally duplicated, causing a small
      performance regression on INSERT.
      b208030e
    • Alexander Barkov's avatar
    • Alexander Barkov's avatar
      MDEV-28405 main.information_schema_tables fails sporadically with... · 3fec38d9
      Alexander Barkov authored
      MDEV-28405 main.information_schema_tables fails sporadically with ER_NEED_REPREPARE or extra warning
      3fec38d9
  11. 24 Apr, 2022 1 commit
  12. 23 Apr, 2022 1 commit
    • Daniel Black's avatar
      MDEV-28263 mariadb-tzinfo-to-sql binlog fixes · a7923b37
      Daniel Black authored
      The --skip-write-binlog message was confusing that it only had
      an effect if the galera was enabled. There are uses beyond galera
      so we apply SET SESSION SQL_LOG_BIN=0 as implied by the option
      without being conditional on the wsrep status.
      
      Remove wsrep.mysql_tzinfo_to_sql_symlink{,_skip} tests as they offered
      no additional coverage beyond main.mysql_tzinfo_to_sql_symlink as no
      server testing was done.
      
      Introduced a variant of the galera.mariadb_tzinfo_to_sql as
      galera.mysql_tzinfo_to_sql, which does testing using the mysql client
      rather than directly importing into the server via mysqltest.
      
      Update man page and mysql_tzinfo_to_sql to having a --skip-write-binlog
      option.
      
      merge notes:
      10.4:
      - conflicts in tztime.cc can revert to this version of --help text.
      - tztime.cc - merge execute immediate @prep1, and leave %s%s trunc_tables, lock_tables
        after that.
      10.6:
      - Need to remove the not_embedded.inc in mysql_tzinfo_to_sql.test and
        replace it with no_protocol.inc
      - leave both mysql_tzinfo_to_sql.test and mariadb_tzinfo_to_sql.sql
        tests.
      - sql/tztime.cc - keep entirely 10.6 version.
      a7923b37
  13. 22 Apr, 2022 2 commits
    • Aleksey Midenkov's avatar
      MDEV-28254 Wrong position for row_start, row_end after adding column to implicit versioned table · 9286c9e6
      Aleksey Midenkov authored
      Implicit system-versioned table does not contain system fields in SHOW
      CREATE. Therefore after mysqldump recovery such table has system
      fields in the last place in frm image. The original table meanwhile
      does not guarantee these system fields on last place because adding
      new fields via ALTER TABLE places them last. Thus the order of fields
      may be different between master and slave, so row-based replication
      may fail.
      
      To fix this on ALTER TABLE we now place system-invisible fields always
      last in frm image. If the table was created via old revision and has
      an incorrect order of fields it can be fixed via any copy operation of
      ALTER TABLE, f.ex.:
      
        ALTER TABLE t1 FORCE;
      
      To check the order of fields in frm file one can use hexdump:
      
        hexdump -C t1.frm
      
      Note, the replication fails only when all 3 conditions are met:
      
        1. row-based or mixed mode replication;
        2. table has new fields added via ALTER TABLE;
        3. table was rebuilt on some, but not all nodes via mysqldump image.
      
      Otherwise it will operate properly even with incorrect order of
      fields.
      9286c9e6
    • Aleksey Midenkov's avatar
      MDEV-25546 LIMIT partitioning does not respect ROLLBACK · 88a9f13a
      Aleksey Midenkov authored
      vers_info->hist_part retained stale value after ROLLBACK. The
      algorithm in vers_set_hist_part() continued iteration from that value.
      
      The simplest solution is to process partitions each time from start
      for LIMIT in vers_set_hist_part().
      88a9f13a