1. 19 Apr, 2022 1 commit
    • Marko Mäkelä's avatar
      MDEV-28317 Assertion failures in row_undo_mod on recovery · 5aef0123
      Marko Mäkelä authored
      Starting with 10.3, an assertion would fail on the rollback of
      a recovered incomplete transaction if a table definition violates
      a FOREIGN KEY constraint.
      
      DICT_ERR_IGNORE_RECOVER_LOCK: Include also DICT_ERR_IGNORE_FK_NOKEY
      so that trx_resurrect_table_locks() will be able to load
      table definitions and resurrect IX locks. Previously, if the
      FOREIGN KEY constraints of a table were incomplete, the table
      would fail to load until rollback, and in 10.3 or later an assertion
      would fail that the rollback was not protected by a table IX lock.
      
      Thanks to commit 9de2e60d there
      will be no problems to enforce subsequent FOREIGN KEY operations
      even though a table with invalid REFERENCES clause was loaded.
      5aef0123
  2. 15 Apr, 2022 1 commit
  3. 14 Apr, 2022 6 commits
    • Sergei Golubchik's avatar
      MDEV-25638 Assertion `!result' failed in convert_const_to_int · c274853c
      Sergei Golubchik authored
      When fixing vcols, fix_fields might call convert_const_to_int().
      And that will try to read the field value (from record[0]).
      Mark the table as having no data to prevent that, because record[0]
      is not initialized yet.
      c274853c
    • Sergei Golubchik's avatar
      MDEV-26281 ASAN use-after-poison when complex conversion is involved in blob · 4681b6f2
      Sergei Golubchik authored
      the bug was that in_vector array in Item_func_in was allocated in the
      statement arena, not in the table->expr_arena.
      
      revert part of the 5acd391e. Instead, change the arena correctly
      in fix_all_session_vcol_exprs().
      
      Remove TABLE_ARENA, that was introduced in 5acd391e to force
      item tree changes to be rolled back (because they were allocated in the
      wrong arena and didn't persist. now they do)
      4681b6f2
    • Sergei Golubchik's avatar
      cc08c43e
    • Sergei Golubchik's avatar
      MDEV-26061 MariaDB server crash at Field::set_default · b5e16a6e
      Sergei Golubchik authored
      * Item_default_value::fix_fields creates a copy of its argument's field.
      * Field::default_value is changed when its expression is prepared in
        unpack_vcol_info_from_frm()
      
      This means we must unpack any vcol expression that includes DEFAULT(x)
      strictly after unpacking x->default_value.
      
      To avoid building and solving this dependency graph on every table open,
      we update Item_default_value::field->default_value after all vcols
      are unpacked and fixed.
      b5e16a6e
    • Alexander Barkov's avatar
      c05fd700
    • Daniel Black's avatar
      mtr: extend gdb backtace info · 66832e3a
      Daniel Black authored
      bt full - to include args and locals.
      
      set print sevenbit on
        - it is more useful to be able to see the exact bytes
          (in case something is dumped as a string and not hexadecimal digits)
      set print static-members off
        - there are many interesting (non-const) static members
      set frame-arguments all
        - even non-printables are useful to see.
      
      Let's make our bb logs give a little bit more detail on those
      hard to reproduce bugs.
      
      Tests on rhel7's gdb-7.6.1-120.el7
      66832e3a
  4. 11 Apr, 2022 3 commits
  5. 08 Apr, 2022 1 commit
    • Nayuta Yanagisawa's avatar
      MDEV-27065 Partitioning tables with custom data directories moves data back to default directory · 27b5d814
      Nayuta Yanagisawa authored
      The partitioning engine does not support the table-level DATA/INDEX
      DIRECTORY specification.
      
      If one create a non-partitioned table with the DATA/INDEX DIRECTORY
      option and then performs ALTER TABLE ... PARTITION BY on it, the
      DATA/INDEX DIRECTORY specification of the old schema is ignored.
      
      The behavior might be a bit surprising for users because the value
      of a usual table option applies to all the partitions. Thus, we raise
      a warning on such ALTER TABLE ... PARTITION BY.
      27b5d814
  6. 07 Apr, 2022 1 commit
  7. 06 Apr, 2022 2 commits
    • Oleg Smirnov's avatar
      MDEV-28077 'Wrong create options' error with 'big_tables' enabled · 53b580a9
      Oleg Smirnov authored
      The cause of the bug is overflow of uint16 KEY_PART_INFO::length and/or
      uint16 KEY_PART_INFO::store_length. The solution is to increase the size
      of those variables to the 'uint' type (which is 32-bit long)
      53b580a9
    • Oleg Smirnov's avatar
      MDEV-24560 SIGSEGV in st_join_table::cleanup · 85192553
      Oleg Smirnov authored
      If JOIN::create_postjoin_aggr_table encounters errors during execution
      then free_tmp_table() is then called twice for JOIN_TAB::aggr.
      The solution is to initialize JOIN_TAB::aggr only on successful completion
      of JOIN::create_postjoin_aggr_table
      85192553
  8. 03 Apr, 2022 1 commit
    • Daniel Black's avatar
      MDEV-26136: Correct AIX/macOS cast warning (my_time.h) · 75b9014f
      Daniel Black authored
      tv_usec is a (suseconds_t) so we cast to it. Prevents the AIX(gcc-10) warning:
      
      include/my_time.h: In function 'void my_timeval_trunc(timeval*, uint)':
      include/my_time.h:249:65: warning: conversion from 'long int' to 'suseconds_t' {aka 'int'} may change value [-Wconversion]
        249 |   tv->tv_usec-= my_time_fraction_remainder(tv->tv_usec, decimals);
            |
      
      macOS is: conversion from 'long int' to '__darwin_suseconds_t' {aka 'int'} may change value
      
      On Windows suseconds_t isn't defined so we use the existing
      long return type of my_time_fraction_remainder.
      
      Reviewed by Marko Mäkelä
      
      Closes: #2079
      75b9014f
  9. 30 Mar, 2022 3 commits
    • Vlad Lesin's avatar
      MDEV-27343 Useless warning "InnoDB: Allocated tablespace ID <id> for... · c1ab0e6f
      Vlad Lesin authored
      MDEV-27343 Useless warning "InnoDB: Allocated tablespace ID <id> for <tablename>, old maximum was 0" during backup stage
      
      mariabackup does not load dictionary during backup, but it loads
      tablespaces, that is why fil_system.max_assigned_id is not set with
      dict_check_tablespaces_and_store_max_id(). There is no sense to issue the
      warning during backup.
      c1ab0e6f
    • Marko Mäkelä's avatar
      Cleanup: Remove some unused functions · 35425cfc
      Marko Mäkelä authored
      35425cfc
    • Dmitry Shulga's avatar
      MDEV-19631: Assertion `0' failed in st_select_lex_unit::optimize or different... · bdba1d46
      Dmitry Shulga authored
      MDEV-19631: Assertion `0' failed in st_select_lex_unit::optimize or different plan upon 2nd execution of PS with EXPLAIN
      
      Second execution of a prepared statement for a query containing a constant
      subquery with union that can be optimized away, could result in server abnormal
      termination for debug build or incorrect result set output for release build.
      
      For example, the following test case crashes a server built with debug on second
      run of the statement EXECUTE stmt
        CREATE TABLE t1 (a INT);
        PREPARE stmt FROM 'EXPLAIN SELECT * FROM t1 HAVING 6 IN ( SELECT 6 UNION SELECT 5 )';
        EXECUTE stmt;
        EXECUTE stmt;
      
      The reason for incorrect result set output or abnormal server termination
      is careless working with the data member fake_select_lex->options inside
      the function mysql_explain_union(). Once the flag SELECT_DESCRIBE is set in
      the data member fake_select_lex->option before calling the methods
        SELECT_LEX_UNIT::prepare/SELECT_LEX_UNIT::execute
      the original value of the option is no longer restored.
      As a consequence, next time the prepared statement is re-executed we have
      the fake_select_lex with the flag SELECT_DESCRIBE set in the data member
      fake_select_lex->option, that is incorrect. In result, the method
        Item_subselect::assigned()
      is not invoked during evaluation of a constant condition (constant subquery
      with union) that being performed on OPTIMIZE phase of query handling.
      
      This leads to the fact that records in the temporary table are not deleted
      before calling
        table->file->ha_enable_indexes(HA_KEY_SWITCH_ALL)
      in the method st_select_lex_unit::optimize().
      In result table->file->ha_enable_indexes(HA_KEY_SWITCH_ALL) returns error
      and DBUG_ASSERT(0) is fired.
      
      Stack trace to the line where the error generated on re-enabling indexes
      for next subselect iteration is below:
      st_select_lex_unit::optimize (at sql_union.cc:954)
        handler::ha_enable_indexes (at handler.cc:4338)
          ha_heap::enable_indexes (at ha_heap.cc:519)
            heap_enable_indexes (at hp_clear.c:164)
      
      The code snippet to clarify raising the error is also listed:
      int heap_enable_indexes(HP_INFO *info)
      {
        int error= 0;
        HP_SHARE *share= info->s;
      
        if (share->data_length || share->index_length)
          error= HA_ERR_CRASHED; <<== set error the value HA_ERR_CRASHED
                                      since share->data_length != 0
      
      To fix this issue the original value of unit->fake_select_lex->options
      has to be saved before setting the flag SELECT_DESCRIBE and restored
      on return from invocation of SELECT_LEX_UNIT::prepare/SELECT_LEX_UNIT::execute
      bdba1d46
  10. 29 Mar, 2022 1 commit
  11. 28 Mar, 2022 2 commits
    • Marko Mäkelä's avatar
      MDEV-27931: buf_page_is_corrupted() wrongly claims corruption · 303448bc
      Marko Mäkelä authored
      In commit 437da7bc (MDEV-19534),
      the default value of the global variable srv_checksum_algorithm
      in innochecksum was changed from SRV_CHECKSUM_ALGORITHM_INNODB
      to implied 0 (innodb_checksum_algorithm=crc32). As a result,
      the function buf_page_is_corrupted() would by default invoke
      buf_calc_page_crc32() in innochecksum, and crc32_inited would hold.
      
      This would cause "innochecksum" to fail on a particular page.
      
      The actual problem is older, introduced in 2011 in
      mysql/mysql-server@17e497bdb793bc6b8360aa1c626dcd8bb5cfad1b
      (MySQL 5.6.3). It should affect the validation of pages of old
      data files that were written with innodb_checksum_algorithm=innodb.
      When using innodb_checksum_algorithm=crc32 (the default setting
      since MariaDB Server 10.2), some valid pages would be rejected
      only because exactly one of the two checksum fields accidentally
      matches the innodb_checksum_algorithm=crc32 value.
      
      buf_page_is_corrupted(): Simplify the logic of non-strict
      checksum validation, by always invoking buf_calc_page_crc32().
      Remove a bogus condition that if only one of the checksum fields
      contains the value returned by buf_calc_page_crc32(), the page
      is corrupted.
      303448bc
    • hongdongjian's avatar
      MDEV-28177: server_audit; Update the offset of dbName on the aarch64 platform. · 7af133cc
      hongdongjian authored
      On the aarch64 platform, MySQL 5.7.33 cannot install this version of the audit
      plugin, but X86_64 can run well。
      7af133cc
  12. 25 Mar, 2022 1 commit
    • Sachin Kumar's avatar
      MDEV-24667 LOAD DATA INFILE on temporary table not written to slave binlog · 9f4ba624
      Sachin Kumar authored
      Problem: In regular replication, when master binlogged using statement format
      slave might not have written an event to its binary log when the Query
      event aimed at a temporary table.
      Specifically this was observed with LOAD DATA INFILE.
      
      This effect was possible because unlike master slave holds temporary
      tables in its pool and the master side check of existence of a
      temporary table at the format bin-logging decision did not apply.
      
      Solution: replace THD::has_thd_temporary_tables() with
      THD::has_temporary_tables which allows to identify temporary table
      presence on either side.
      
      --
      Reviewed by Andrei Elkin.
      9f4ba624
  13. 24 Mar, 2022 1 commit
    • Brandon Nesterenko's avatar
      MDEV-14608: mysqlbinlog lastest backupfile size is 0 · 174f1734
      Brandon Nesterenko authored
      Problem:
      ========
      When using mariadb-binlog with --raw and --stop-never, events from
      the master's currently active log file should be written to their
      respective log file specified by --result-file, and shown on-disk.
      There is a bug where mariadb-binlog does not flush the result file
      to disk when new events are received
      
      Solution:
      ========
      Add a function call to flush mariadb-binlog’s result file after
      receiving an event in --raw mode.
      
      Reviewed By:
      ============
      Andrei Elkin <andrei.elkin@mariadb.com>
      174f1734
  14. 22 Mar, 2022 1 commit
  15. 21 Mar, 2022 2 commits
  16. 20 Mar, 2022 1 commit
  17. 18 Mar, 2022 1 commit
  18. 17 Mar, 2022 3 commits
  19. 16 Mar, 2022 1 commit
  20. 15 Mar, 2022 2 commits
    • Daniel Black's avatar
      MDEV-23915 ER_KILL_DENIED_ERROR not passed a thread id (part 2) · 57dbe878
      Daniel Black authored
      Per Marko's comment in JIRA, sql_kill is passing the thread id
      as long long. We change the format of the error messages to match,
      and cast the thread id to long long in sql_kill_user.
      57dbe878
    • Daniel Black's avatar
      MDEV-23915 ER_KILL_DENIED_ERROR not passed a thread id · 99837c61
      Daniel Black authored
      The 10.5 test error main.grant_kill showed up a incorrect
      thread id on a big endian architecture.
      
      The cause of this is the sql_kill_user function assumed the
      error was ER_OUT_OF_RESOURCES, when the the actual error was
      ER_KILL_DENIED_ERROR. ER_KILL_DENIED_ERROR as an error message
      requires a thread id to be passed as unsigned long, however a
      user/host was passed.
      
      ER_OUT_OF_RESOURCES doesn't even take a user/host, despite
      the optimistic comment. We remove this being passed as an
      argument to the function so that when MDEV-21978 is implemented
      one less compiler format warning is generated (which would
      have caught this error sooner).
      
      Thanks Otto for reporting and Marko for analysis.
      99837c61
  21. 14 Mar, 2022 1 commit
    • Alexander Barkov's avatar
      MDEV-23210 Assertion `(length % 4) == 0' failed in my_lengthsp_utf32 on ALTER... · 03c3dc63
      Alexander Barkov authored
      MDEV-23210 Assertion `(length % 4) == 0' failed in my_lengthsp_utf32 on ALTER TABLE, SELECT and INSERT
      
      Problem:
      Parse-time conversion from binary to tricky character sets like utf32
      produced ill-formed strings. So, later a chash happened in debug builds,
      or a wrong SHOW CREATE TABLE was returned in release builds.
      
      Fix:
      
      1. Backporting a few methods from 10.3:
        - THD::check_string_for_wellformedness()
        - THD::convert_string() overloads
        - THD::make_text_string_connection()
      
      2. Adding a new method THD::reinterpret_string_from_binary(),
         which makes sure to either returns a well-formed string
         (optionally prepending with zero bytes), or returns an error.
      03c3dc63
  22. 13 Mar, 2022 1 commit
  23. 10 Mar, 2022 1 commit
    • Daniel Black's avatar
      MDEV-28011: debian autobake cleanup · 6de482a6
      Daniel Black authored
      Travis is dead to us so we don't need all the conditions around it.
      
      Remove depends for no longer supported versions
      
      Debian Jessies, and Ubuntu Trusty, Xenial, Wily are all eol
      as far as we are concerned.
      
      The dependancy on an apt cache when running autobake broke the
      10.2 aarch64 packages (MDEV-28014). Lets reduce the risk here.
      6de482a6
  24. 08 Mar, 2022 1 commit
    • Haidong Ji's avatar
      MDEV-27978 fix wrong name in error when max_session_mem_used exceeded · 114476f2
      Haidong Ji authored
      Fixed typo in my_malloc_size_cb_func. There is no max-thread-mem-used
      sys variable in MariaDB, only max-session-mem-used. The relevant entry
      in sys_vars.cc is also fixed.
      
      Added a fallback case in case we could allocate the 256 bytes for the
      error message containing the exact setting.
      114476f2
  25. 03 Mar, 2022 1 commit
    • Marko Mäkelä's avatar
      MDEV-27993 Assertion failed in btr_page_reorganize_low() · a92f07f4
      Marko Mäkelä authored
      btr_cur_optimistic_insert(): Disregard DEBUG_DBUG injection to
      invoke btr_page_reorganize() if the page (and the table) is empty.
      Otherwise, an assertion would fail in btr_page_reorganize_low()
      because PAGE_MAX_TRX_ID is 0 in an empty secondary index leaf page.
      a92f07f4