An error occurred fetching the project authors.
  1. 29 Sep, 2024 1 commit
  2. 26 Sep, 2024 1 commit
  3. 21 May, 2024 1 commit
    • Alexander Barkov's avatar
      Backporting bugs fixes fixed by MDEV-31340 from 11.5 · 310fd6ff
      Alexander Barkov authored
      The patch for MDEV-31340 fixed the following bugs:
      
      MDEV-33084 LASTVAL(t1) and LASTVAL(T1) do not work well with lower-case-table-names=0
      MDEV-33085 Tables T1 and t1 do not work well with ENGINE=CSV and lower-case-table-names=0
      MDEV-33086 SHOW OPEN TABLES IN DB1 -- is case insensitive with lower-case-table-names=0
      MDEV-33088 Cannot create triggers in the database `MYSQL`
      MDEV-33103 LOCK TABLE t1 AS t2 -- alias is not case sensitive with lower-case-table-names=0
      MDEV-33108 TABLE_STATISTICS and INDEX_STATISTICS are case insensitive with lower-case-table-names=0
      MDEV-33109 DROP DATABASE MYSQL -- does not drop SP with lower-case-table-names=0
      MDEV-33110 HANDLER commands are case insensitive with lower-case-table-names=0
      MDEV-33119 User is case insensitive in INFORMATION_SCHEMA.VIEWS
      MDEV-33120 System log table names are case insensitive with lower-cast-table-names=0
      
      Backporting the fixes from 11.5 to 10.5
      310fd6ff
  4. 18 Apr, 2024 1 commit
    • Alexander Barkov's avatar
      MDEV-31340 Remove MY_COLLATION_HANDLER::strcasecmp() · fd247cc2
      Alexander Barkov authored
      This patch also fixes:
        MDEV-33050 Build-in schemas like oracle_schema are accent insensitive
        MDEV-33084 LASTVAL(t1) and LASTVAL(T1) do not work well with lower-case-table-names=0
        MDEV-33085 Tables T1 and t1 do not work well with ENGINE=CSV and lower-case-table-names=0
        MDEV-33086 SHOW OPEN TABLES IN DB1 -- is case insensitive with lower-case-table-names=0
        MDEV-33088 Cannot create triggers in the database `MYSQL`
        MDEV-33103 LOCK TABLE t1 AS t2 -- alias is not case sensitive with lower-case-table-names=0
        MDEV-33109 DROP DATABASE MYSQL -- does not drop SP with lower-case-table-names=0
        MDEV-33110 HANDLER commands are case insensitive with lower-case-table-names=0
        MDEV-33119 User is case insensitive in INFORMATION_SCHEMA.VIEWS
        MDEV-33120 System log table names are case insensitive with lower-cast-table-names=0
      
      - Removing the virtual function strnncoll() from MY_COLLATION_HANDLER
      
      - Adding a wrapper function CHARSET_INFO::streq(), to compare
        two strings for equality. For now it calls strnncoll() internally.
        In the future it will turn into a virtual function.
      
      - Adding new accent sensitive case insensitive collations:
          - utf8mb4_general1400_as_ci
          - utf8mb3_general1400_as_ci
        They implement accent sensitive case insensitive comparison.
        The weight of a character is equal to the code point of its
        upper case variant. These collations use Unicode-14.0.0 casefolding data.
      
        The result of
           my_charset_utf8mb3_general1400_as_ci.strcoll()
        is very close to the former
           my_charset_utf8mb3_general_ci.strcasecmp()
      
        There is only a difference in a couple dozen rare characters, because:
          - the switch from "tolower" to "toupper" comparison, to make
            utf8mb3_general1400_as_ci closer to utf8mb3_general_ci
          - the switch from Unicode-3.0.0 to Unicode-14.0.0
        This difference should be tolarable. See the list of affected
        characters in the MDEV description.
      
        Note, utf8mb4_general1400_as_ci correctly handles non-BMP characters!
        Unlike utf8mb4_general_ci, it does not treat all BMP characters
        as equal.
      
      - Adding classes representing names of the file based database objects:
      
          Lex_ident_db
          Lex_ident_table
          Lex_ident_trigger
      
        Their comparison collation depends on the underlying
        file system case sensitivity and on --lower-case-table-names
        and can be either my_charset_bin or my_charset_utf8mb3_general1400_as_ci.
      
      - Adding classes representing names of other database objects,
        whose names have case insensitive comparison style,
        using my_charset_utf8mb3_general1400_as_ci:
      
        Lex_ident_column
        Lex_ident_sys_var
        Lex_ident_user_var
        Lex_ident_sp_var
        Lex_ident_ps
        Lex_ident_i_s_table
        Lex_ident_window
        Lex_ident_func
        Lex_ident_partition
        Lex_ident_with_element
        Lex_ident_rpl_filter
        Lex_ident_master_info
        Lex_ident_host
        Lex_ident_locale
        Lex_ident_plugin
        Lex_ident_engine
        Lex_ident_server
        Lex_ident_savepoint
        Lex_ident_charset
        engine_option_value::Name
      
      - All the mentioned Lex_ident_xxx classes implement a method streq():
      
        if (ident1.streq(ident2))
           do_equal();
      
        This method works as a wrapper for CHARSET_INFO::streq().
      
      - Changing a lot of "LEX_CSTRING name" to "Lex_ident_xxx name"
        in class members and in function/method parameters.
      
      - Replacing all calls like
          system_charset_info->coll->strcasecmp(ident1, ident2)
        to
          ident1.streq(ident2)
      
      - Taking advantage of the c++11 user defined literal operator
        for LEX_CSTRING (see m_strings.h) and Lex_ident_xxx (see lex_ident.h)
        data types. Use example:
      
        const Lex_ident_column primary_key_name= "PRIMARY"_Lex_ident_column;
      
        is now a shorter version of:
      
        const Lex_ident_column primary_key_name=
          Lex_ident_column({STRING_WITH_LEN("PRIMARY")});
      fd247cc2
  5. 16 Feb, 2024 1 commit
  6. 11 Jan, 2024 1 commit
  7. 15 Aug, 2023 1 commit
    • Nikita Malyavin's avatar
      MDEV-29013 ER_KEY_NOT_FOUND/lock timeout upon online alter with long unique · 6e0f4560
      Nikita Malyavin authored
      1. ER_KEY_NOT_FOUND
      general replcation problem, already fixed earlier.
      test added.
      
      2. ER_LOCK_WAIT_TIMEOUT
      This is a long unique specific problem.
      
      Sometimes, lookup_handler is created for to->file. To properly free it,
      ha_reset should be called. It is usually done by calling
      close_thread_table, but ALTER TABLE makes it differently. Hence, a single
      ha_reset call is added to mysql_alter_table.
      
      Also, event_mem_root is removed. Normally, no per-event data should be
      allocated on thd->mem_root, that would mean a leak. And otherwise,
      lookup_handler is lazily allocated, but its lifetime matches statement,
      not event.
      6e0f4560
  8. 11 Aug, 2023 1 commit
    • Anel Husakovic's avatar
      MDEV-31618: Server crashes in... · 80439e69
      Anel Husakovic authored
      MDEV-31618: Server crashes in process_i_s_table_temporary_tables/get_all_tables after alter in rename query
      
      Any TMP_TABLE_SHARE must always have at least one TABLE instance.
      So whenever a temporary TABLE that is marked for reopen is closed,
      reopen it at once if its TMP_TABLE_SHARE list of tables becomes empty.
      80439e69
  9. 08 Mar, 2023 1 commit
  10. 27 Feb, 2023 1 commit
    • Monty's avatar
      Added detection of memory overwrite with multi_malloc · 57c526ff
      Monty authored
      This patch also fixes some bugs detected by valgrind after this
      patch:
      
      - Not enough copy_func elements was allocated by Create_tmp_table() which
        causes an memory overwrite in Create_tmp_table::add_fields()
        I added an ASSERT() to be able to detect this also without valgrind.
        The bug was that TMP_TABLE_PARAM::copy_fields was not correctly set
        when calling create_tmp_table().
      - Aria::empty_bits is not allocated if there is no varchar/char/blob
        fields in the table.  Fixed code to take this into account.
        This cannot cause any issues as this is just a memory access
        into other Aria memory and the content of the memory would not be used.
      - Aria::last_key_buff was not allocated big enough. This may have caused
        issues with rtrees and ma_extra(HA_EXTRA_REMEMBER_POS) as they
        would use the same memory area.
      - Aria and MyISAM didn't take extended key parts into account, which
        caused problems when copying rec_per_key from engine to sql level.
      - Mark asan builds with 'asan' in version strihng to detect these in
        not_valgrind_build.inc.
        This is needed to not have main.sp-no-valgrind fail with asan.
      57c526ff
  11. 10 Aug, 2022 1 commit
  12. 12 Jul, 2022 1 commit
  13. 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
  14. 14 Mar, 2022 1 commit
    • Sergei Golubchik's avatar
      MDEV-27753 Incorrect ENGINE type of table after crash for CONNECT table · bfed2c7d
      Sergei Golubchik authored
      whenever possible, partitioning should use the full
      partition plugin name, not the one byte legacy code.
      
      Normally, ha_partition can get the engine plugin from
      table_share->default_part_plugin.
      
      But in some cases, e.g. in DROP TABLE, the table isn't
      opened, table_share is NULL, and ha_partition has to parse
      the frm, much like dd_frm_type() does.
      
      temporary_tables.cc, sql_table.cc:
      
      When dropping a table, it must be deleted in the engine
      first, then frm file. Because frm can be the only true
      source of metadata that the engine might need for DROP.
      
      table.cc:
      
      when opening a partitioned table, if the engine for
      partitions is not found, do not fallback to MyISAM.
      bfed2c7d
  15. 27 Jan, 2022 1 commit
    • Sachin's avatar
      MDEV-11675 Lag Free Alter On Slave · 0c5d1342
      Sachin authored
      This commit implements two phase binloggable ALTER.
      When a new
      
            @@session.binlog_alter_two_phase = YES
      
      ALTER query gets logged in two parts, the START ALTER and the COMMIT
      or ROLLBACK ALTER. START Alter is written in binlog as soon as
      necessary locks have been acquired for the table. The timing is
      such that any concurrent DML:s that update the same table are either
      committed, thus logged into binary log having done work on the old
      version of the table, or will be queued for execution on its new
      version.
      
      The "COMPLETE" COMMIT or ROLLBACK ALTER are written at the very point
      of a normal "single-piece" ALTER that is after the most of
      the query work is done. When its result is positive COMMIT ALTER is
      written, otherwise ROLLBACK ALTER is written with specific error
      happened after START ALTER phase.
      Replication of two-phase binloggable ALTER is
      cross-version safe. Specifically the OLD slave merely does not
      recognized the start alter part, still being able to process and
      memorize its gtid.
      
      Two phase logged ALTER is read from binlog by mysqlbinlog to produce
      BINLOG 'string', where 'string' contains base64 encoded
      Query_log_event containing either the start part of ALTER, or a
      completion part. The Query details can be displayed with `-v` flag,
      similarly to ROW format events.  Notice, mysqlbinlog output containing
      parts of two-phase binloggable ALTER is processable correctly only by
      binlog_alter_two_phase server.
      
      @@log_warnings > 2 can reveal details of binlogging and slave side
      processing of the ALTER parts.
      
      The current commit also carries fixes to the following list of
      reported bugs:
      MDEV-27511, MDEV-27471, MDEV-27349, MDEV-27628, MDEV-27528.
      
      Thanks to all people involved into early discussion of the feature
      including Kristian Nielsen, those who helped to design, implement and
      test: Sergei Golubchik, Andrei Elkin who took the burden of the
      implemenation completion, Sujatha Sivakumar, Brandon
      Nesterenko, Alice Sherepa, Ramesh Sivaraman, Jan Lindstrom.
      0c5d1342
  16. 20 Apr, 2021 1 commit
    • Monty's avatar
      Fix all warnings given by UBSAN · 031f1171
      Monty authored
      The easiest way to compile and test the server with UBSAN is to run:
      ./BUILD/compile-pentium64-ubsan
      and then run mysql-test-run.
      After this commit, one should be able to run this without any UBSAN
      warnings. There is still a few compiler warnings that should be fixed
      at some point, but these do not expose any real bugs.
      
      The 'special' cases where we disable, suppress or circumvent UBSAN are:
      - ref10 source (as here we intentionally do some shifts that UBSAN
        complains about.
      - x86 version of optimized int#korr() methods. UBSAN do not like unaligned
        memory access of integers.  Fixed by using byte_order_generic.h when
        compiling with UBSAN
      - We use smaller thread stack with ASAN and UBSAN, which forced me to
        disable a few tests that prints the thread stack size.
      - Verifying class types does not work for shared libraries. I added
        suppression in mysql-test-run.pl for this case.
      - Added '#ifdef WITH_UBSAN' when using integer arithmetic where it is
        safe to have overflows (two cases, in item_func.cc).
      
      Things fixed:
      - Don't left shift signed values
        (byte_order_generic.h, mysqltest.c, item_sum.cc and many more)
      - Don't assign not non existing values to enum variables.
      - Ensure that bool and enum values are properly initialized in
        constructors.  This was needed as UBSAN checks that these types has
        correct values when one copies an object.
        (gcalc_tools.h, ha_partition.cc, item_sum.cc, partition_element.h ...)
      - Ensure we do not called handler functions on unallocated objects or
        deleted objects.
        (events.cc, sql_acl.cc).
      - Fixed bugs in Item_sp::Item_sp() where we did not call constructor
        on Query_arena object.
      - Fixed several cast of objects to an incompatible class!
        (Item.cc, Item_buff.cc, item_timefunc.cc, opt_subselect.cc, sql_acl.cc,
         sql_select.cc ...)
      - Ensure we do not do integer arithmetic that causes over or underflows.
        This includes also ++ and -- of integers.
        (Item_func.cc, Item_strfunc.cc, item_timefunc.cc, sql_base.cc ...)
      - Added JSON_VALUE_UNITIALIZED to json_value_types and ensure that
        value_type is initialized to this instead of to -1, which is not a valid
        enum value for json_value_types.
      - Ensure we do not call memcpy() when second argument could be null.
      - Fixed that Item_func_str::make_empty_result() creates an empty string
        instead of a null string (safer as it ensures we do not do arithmetic
        on null strings).
      
      Other things:
      
      - Changed struct st_position to an OBJECT and added an initialization
        function to it to ensure that we do not copy or use uninitialized
        members. The change to a class was also motived that we used "struct
        st_position" and POSITION randomly trough the code which was
        confusing.
      - Notably big rewrite in sql_acl.cc to avoid using deleted objects.
      - Changed in sql_partition to use '^' instead of '-'. This is safe as
        the operator is either 0 or 0x8000000000000000ULL.
      - Added check for select_nr < INT_MAX in JOIN::build_explain() to
        avoid bug when get_select() could return NULL.
      - Reordered elements in POSITION for better alignment.
      - Changed sql_test.cc::print_plan() to use pointers instead of objects.
      - Fixed bug in find_set() where could could execute '1 << -1'.
      - Added variable have_sanitizer, used by mtr.  (This variable was before
        only in 10.5 and up).  It can now have one of two values:
        ASAN or UBSAN.
      - Moved ~Archive_share() from ha_archive.cc to ha_archive.h and marked
        it virtual. This was an effort to get UBSAN to work with loaded storage
        engines. I kept the change as the new place is better.
      - Added in CONNECT engine COLBLK::SetName(), to get around a wrong cast
        in tabutil.cpp.
      - Added HAVE_REPLICATION around usage of rgi_slave, to get embedded
        server to compile with UBSAN. (Patch from Marko).
      - Added #ifdef for powerpc64 to avoid a bug in old gcc versions related
        to integer arithmetic.
      
      Changes that should not be needed but had to be done to suppress warnings
      from UBSAN:
      
      - Added static_cast<<uint16_t>> around shift to get rid of a LOT of
        compiler warnings when using UBSAN.
      - Had to change some '/' of 2 base integers to shift to get rid of
        some compile time warnings.
      
      Reviewed by:
      - Json changes: Alexey Botchkov
      - Charset changes in ctype-uca.c: Alexander Barkov
      - InnoDB changes & Embedded server: Marko Mäkelä
      - sql_acl.cc changes: Vicențiu Ciorbaru
      - build_explain() changes: Sergey Petrunia
      031f1171
  17. 03 Jul, 2020 2 commits
  18. 14 Jun, 2020 1 commit
    • Monty's avatar
      MDEV-11412 Ensure that table is truly dropped when using DROP TABLE · 5bcb1d65
      Monty authored
      The used code is largely based on code from Tencent
      
      The problem is that in some rare cases there may be a conflict between .frm
      files and the files in the storage engine. In this case the DROP TABLE
      was not able to properly drop the table.
      
      Some MariaDB/MySQL forks has solved this by adding a FORCE option to
      DROP TABLE. After some discussion among MariaDB developers, we concluded
      that users expects that DROP TABLE should always work, even if the
      table would not be consistent. There should not be a need to use a
      separate keyword to ensure that the table is really deleted.
      
      The used solution is:
      - If a .frm table doesn't exists, try dropping the table from all storage
        engines.
      - If the .frm table exists but the table does not exist in the engine
        try dropping the table from all storage engines.
      - Update storage engines using many table files (.CVS, MyISAM, Aria) to
        succeed with the drop even if some of the files are missing.
      - Add HTON_AUTOMATIC_DELETE_TABLE to handlerton's where delete_table()
        is not needed and always succeed. This is used by ha_delete_table_force()
        to know which handlers to ignore when trying to drop a table without
        a .frm file.
      
      The disadvantage of this solution is that a DROP TABLE on a non existing
      table will be a bit slower as we have to ask all active storage engines
      if they know anything about the table.
      
      Other things:
      - Added a new flag MY_IGNORE_ENOENT to my_delete() to not give an error
        if the file doesn't exist. This simplifies some of the code.
      - Don't clear thd->error in ha_delete_table() if there was an active
        error. This is a bug fix.
      - handler::delete_table() will not abort if first file doesn't exists.
        This is bug fix to handle the case when a drop table was aborted in
        the middle.
      - Cleaned up mysql_rm_table_no_locks() to ensure that if_exists uses
        same code path as when it's not used.
      - Use non_existing_Table_error() to detect if table didn't exists.
        Old code used different errors tests in different position.
      - Table_triggers_list::drop_all_triggers() now drops trigger file if
        it can't be parsed instead of leaving it hanging around (bug fix)
      - InnoDB doesn't anymore print error about .frm file out of sync with
        InnoDB directory if .frm file does not exists. This change was required
        to be able to try to drop an InnoDB file when .frm doesn't exists.
      - Fixed bug in mi_delete_table() where the .MYD file would not be dropped
        if the .MYI file didn't exists.
      - Fixed memory leak in Mroonga when deleting non existing table
      - Fixed memory leak in Connect when deleting non existing table
      
      Bugs fixed introduced by the original version of this commit:
      MDEV-22826 Presence of Spider prevents tables from being force-deleted from
                 other engines
      5bcb1d65
  19. 23 May, 2020 2 commits
    • Monty's avatar
      Fixed deadlock with LOCK TABLES and ALTER TABLE · be647ff1
      Monty authored
      MDEV-21398 Deadlock (server hang) or assertion failure in
      Diagnostics_area::set_error_status upon ALTER under lock
      
      This failure could only happen if one locked the same table
      multiple times and then did an ALTER TABLE on the table.
      
      Major change is to change all instances of
      table->m_needs_reopen= true;
      to
      table->mark_table_for_reopen();
      
      The main fix for the problem was to ensure that we mark all
      instances of the table in the locked_table_list and when we
      reopen the tables, we first close all tables before reopening
      and locking them.
      
      Other things:
      - Don't call thd->locked_tables_list.reopen_tables if there
        are no tables marked for reopen. (performance)
      be647ff1
    • Monty's avatar
      Change THD->transaction to a pointer to enable multiple transactions · d1d47264
      Monty authored
      All changes (except one) is of type
      thd->transaction.  -> thd->transaction->
      
      thd->transaction points by default to 'thd->default_transaction'
      This allows us to 'easily' have multiple active transactions for a
      THD object, like when reading data from the mysql.proc table
      d1d47264
  20. 19 Apr, 2020 1 commit
  21. 15 Apr, 2020 1 commit
  22. 24 Mar, 2020 2 commits
    • Monty's avatar
      Clean up and speed up interfaces for binary row logging · 91ab42a8
      Monty authored
      MDEV-21605 Clean up and speed up interfaces for binary row logging
      MDEV-21617 Bug fix for previous version of this code
      
      The intention is to have as few 'if' as possible in ha_write() and
      related functions. This is done by pre-calculating once per statement the
      row_logging state for all tables.
      
      Benefits are simpler and faster code both when binary logging is disabled
      and when it's enabled.
      
      Changes:
      - Added handler->row_logging to make it easy to check it table should be
        row logged. This also made it easier to disabling row logging for system,
        internal and temporary tables.
      - The tables row_logging capabilities are checked once per "statements
        that updates tables" in THD::binlog_prepare_for_row_logging() which
        is called when needed from THD::decide_logging_format().
      - Removed most usage of tmp_disable_binlog(), reenable_binlog() and
        temporary saving and setting of thd->variables.option_bits.
      - Moved checks that can't change during a statement from
        check_table_binlog_row_based() to check_table_binlog_row_based_internal()
      - Removed flag row_already_logged (used by sequence engine)
      - Moved binlog_log_row() to a handler::
      - Moved write_locked_table_maps() to THD::binlog_write_table_maps() as
        most other related binlog functions are in THD.
      - Removed binlog_write_table_map() and binlog_log_row_internal() as
        they are now obsolete as 'has_transactions()' is pre-calculated in
        prepare_for_row_logging().
      - Remove 'is_transactional' argument from binlog_write_table_map() as this
        can now be read from handler.
      - Changed order of 'if's in handler::external_lock() and wsrep_mysqld.h
        to first evaluate fast and likely cases before more complex ones.
      - Added error checking in ha_write_row() and related functions if
        binlog_log_row() failed.
      - Don't clear check_table_binlog_row_based_result in
        clear_cached_table_binlog_row_based_flag() as it's not needed.
      - THD::clear_binlog_table_maps() has been replaced with
        THD::reset_binlog_for_next_statement()
      - Added 'MYSQL_OPEN_IGNORE_LOGGING_FORMAT' flag to open_and_lock_tables()
        to avoid calculating of binary log format for internal opens. This flag
        is also used to avoid reading statistics tables for internal tables.
      - Added OPTION_BINLOG_LOG_OFF as a simple way to turn of binlog temporary
        for create (instead of using THD::sql_log_bin_off.
      - Removed flag THD::sql_log_bin_off (not needed anymore)
      - Speed up THD::decide_logging_format() by remembering if blackhole engine
        is used and avoid a loop over all tables if it's not used
        (the common case).
      - THD::decide_logging_format() is not called anymore if no tables are used
        for the statement. This will speed up pure stored procedure code with
        about 5%+ according to some simple tests.
      - We now get annotated events on slave if a CREATE ... SELECT statement
        is transformed on the slave from statement to row logging.
      - In the original code, the master could come into a state where row
        logging is enforced for all future events if statement could be used.
        This is now partly fixed.
      
      Other changes:
      - Ensure that all tables used by a statement has query_id set.
      - Had to restore the row_logging flag for not used tables in
        THD::binlog_write_table_maps (not normal scenario)
      - Removed injector::transaction::use_table(server_id_type sid, table tbl)
        as it's not used.
      - Cleaned up set_slave_thread_options()
      - Some more DBUG_ENTER/DBUG_RETURN, code comments and minor indentation
        changes.
      - Ensure we only call THD::decide_logging_format_low() once in
        mysql_insert() (inefficiency).
      - Don't annotate INSERT DELAYED
      - Removed zeroing pos_in_table_list in THD::open_temporary_table() as it's
        already 0
      91ab42a8
    • Monty's avatar
      Improve update handler (long unique keys on blobs) · 4ef43755
      Monty authored
      MDEV-21606 Improve update handler (long unique keys on blobs)
      MDEV-21470 MyISAM and Aria start_bulk_insert doesn't work with long unique
      MDEV-21606 Bug fix for previous version of this code
      MDEV-21819 2 Assertion `inited == NONE || update_handler != this'
      
      - Move update_handler from TABLE to handler
      - Move out initialization of update handler from ha_write_row() to
        prepare_for_insert()
      - Fixed that INSERT DELAYED works with update handler
      - Give an error if using long unique with an autoincrement column
      - Added handler function to check if table has long unique hash indexes
      - Disable write cache in MyISAM and Aria when using update_handler as
        if cache is used, the row will not be inserted until end of statement
        and update_handler would not find conflicting rows.
      - Removed not used handler argument from
        check_duplicate_long_entries_update()
      - Syntax cleanups
        - Indentation fixes
        - Don't use single character indentifiers for arguments
      4ef43755
  23. 10 Mar, 2020 1 commit
  24. 10 Dec, 2019 1 commit
  25. 18 Jun, 2019 1 commit
    • Michael Widenius's avatar
      MDEV-19595 fixed · 8acbf9c1
      Michael Widenius authored
      The test cases for the MDEV found several independent bugs
      in MariaDB server and Aria:
      - If a temporary table was marked as crashed, it could never
        be deleted.
      - Opening of a crashed temporary table gave an error message
        but the error was never forwarded to the caller which caused
        an assert() in my_ok()
      - init_read_record() did mmap of all temporary tables, which is
        probably not a good idea as this area can potentially be
        very big. Changed code to only mmap internal temporary tables.
      - mmap-ed tables where not unmapped in case of repair/optimize
        which caused bad data in table and crashes if the original
        table files where replaced with new ones (as the old mmap
        was still in place). Fixed by removing the mmap in case
        of repair.
      - Cleaned up usage of code that disabled mmap in Aria
      8acbf9c1
  26. 20 May, 2019 1 commit
    • Sujatha's avatar
      MDEV-19076: rpl_parallel_temptable result mismatch '-33 optimistic' · 5a2110e7
      Sujatha authored
      Problem:
      ========
      The test now fails with the following trace:
      
      CURRENT_TEST: rpl.rpl_parallel_temptable
      --- /mariadb/10.4/mysql-test/suite/rpl/r/rpl_parallel_temptable.result
      +++ /mariadb/10.4/mysql-test/suite/rpl/r/rpl_parallel_temptable.reject
      @@ -194,7 +194,6 @@
       30    conservative
       31    conservative
       32    optimistic
      -33    optimistic
      
      Analysis:
      =========
      The part of test which fails with result content mismatch is given below.
      
      CREATE TEMPORARY TABLE t4 (a INT PRIMARY KEY) ENGINE=InnoDB;
      INSERT INTO t4 VALUES (32);
      INSERT INTO t4 VALUES (33);
      INSERT INTO t1 SELECT a, "optimistic" FROM t4;
      
      slave_parallel_mode=optimistic
      
      The expectation of the above test script is, INSERT FROM SELECT should read both
      32, 33 and populate table 't1'. But this expectation fails occasionally.
      
      All three INSERT statements are handed over to three different slave parallel
      workers. Temporary tables are not safe for parallel replication. They were
      designed to be visible to one thread only, so have no table locking.  Thus there
      is no protection against two conflicting transactions committing in parallel and
      things like that.
      
      So anything that uses temporary tables will be serialized with anything before
      it, when using parallel replication by using a "wait_for_prior_commit" function
      call. This will ensure that the each transaction is executed sequentially.
      
      But there exists a code path in which the above wait doesn't happen.  Because of
      this at times INSERT from SELECT doesn't wait for the INSERT (33) to complete
      and it completes its executes and enters commit stage.  Hence only row 32 is
      found in those cases resulting in test failure.
      
      The wait needs to be added within "open_temporary_table" call. The code looks
      like this within "open_temporary_table".
      
      Each thread tries to open temporary table in 3 different ways:
      
      case 1: Find a temporary table which is already in use by using
               find_temporary_table(tl) && wait_for_prior_commit()
      case 2: If above failed then try to look for temporary table which is marked for
              free for reuse. This internally calls "wait_for_prior_commit()" if table
              is found.
               find_and_use_tmp_table(tl, &table)
      case 3: If none of the above open a new table handle from table share.
               if (!table && (share= find_tmp_table_share(tl)))
               { table= open_temporary_table(share, tl->get_table_name(), true); }
      
      At present the "wait_for_prior_commit" happens only in case 1 & 2.
      
      Fix:
      ====
      On slave add a call for "wait_for_prior_commit" for case 3.
      
      The above wait on slave will solve the issue. A more detailed fix would be to
      mark temporary tables as not safe for parallel execution on the master side.
      In order to do that, on the master side, mark the Gtid_log_event specific flag
      FL_TRANSACTIONAL to be false all the time. So that they are not scheduled
      parallely.
      5a2110e7
  27. 14 May, 2019 1 commit
  28. 03 Apr, 2019 2 commits
    • Sergey Vojtovich's avatar
      Fix inplace ALTER TABLE to not register tmp table · 38e151d1
      Sergey Vojtovich authored
      Do not register intermediate tables created by inplace ALTER TABLE in
      THD::temporary_tables.
      
      Regular ALTER TABLE doesn't create .frm for temporary and discoverable
      tables anymore. For inplace ALTER TABLE moved .frm creation to
      create_table_for_inplace_alter().
      
      Removed open_in_engine argument of create_and_open_tmp_table() and
      open_temporary_table(): it became unused after this patch.
      
      Part of MDEV-17805 - Remove InnoDB cache for temporary tables.
      38e151d1
    • Sergey Vojtovich's avatar
      Removed redundant SE lock for tmp tables · 1dac55cf
      Sergey Vojtovich authored
      CREATE TEMPORARY TABLE locks SE plugin 6 times. 5 of these locks are
      released by the end of the statement. And only 1 acquired by
      init_from_binary_frm_image() / plugin_lock() remains.
      
      The lock removed in this patch was clearly redundant.
      
      Part of MDEV-17805 - Remove InnoDB cache for temporary tables.
      1dac55cf
  29. 12 Mar, 2019 1 commit
    • Sergei Golubchik's avatar
      MDEV-17070 Table corruption or Assertion `table->file->stats.records > 0 ||... · 69abd437
      Sergei Golubchik authored
      MDEV-17070 Table corruption or Assertion `table->file->stats.records > 0 || error' or Assertion `!is_set() || (m_status == DA_OK_BULK && is_bulk_op())' failed upon actions on temporary table
      
      This was caused by a combination of factors:
      * MyISAM/Aria temporary tables historically never saved the state
        to disk (MYI/MAI), because the state never needed to persist
      * certain ALTER TABLE operations modify the original TABLE structure
        and if they fail, the original table has to be reopened to
        revert all changes (m_needs_reopen=1)
      
      as a result, when ALTER fails and MyISAM/Aria temp table gets reopened,
      it reads the stale state from the disk.
      
      As a fix, MyISAM/Aria tables now *always* write the state to disk
      on close, *unless* HA_EXTRA_PREPARE_FOR_DROP was done first. And
      the server now always does HA_EXTRA_PREPARE_FOR_DROP before dropping
      a temporary table.
      69abd437
  30. 28 Feb, 2019 1 commit
  31. 20 Dec, 2018 3 commits
  32. 16 Nov, 2018 1 commit
    • Marko Mäkelä's avatar
      MDEV-17726: A better fix · ab812c10
      Marko Mäkelä authored
      THD::close_temporary_tables(): Revert the change.
      
      ha_innobase::delete_table(): Move the work-around inside
      a debug assertion, and check thd_kill_level() instead of thd_killed(),
      because the latter would not hold for KILL_CONNECTION.
      ab812c10
  33. 15 Nov, 2018 1 commit
    • Marko Mäkelä's avatar
      MDEV-17726 Assertion `sqlcom != SQLCOM_TRUNCATE' failed in... · c6838cc6
      Marko Mäkelä authored
      MDEV-17726 Assertion `sqlcom != SQLCOM_TRUNCATE' failed in ha_innobase::delete_table after truncating temporary table
      
      THD::close_temporary_tables(): Assign lex->sql_command so that
      the debug assertion will not fail in ha_innobase::delete_table().
      
      Alternatively, we could ensure that thd_killed() holds inside
      ha_innobase::delete_table().
      
      There should be no impact for the non-debug build. The thd_sql_command()
      inside ha_innobase::delete_table() only affects the treatment of
      persistent FOREIGN KEY metadata. There is no persistent metadata
      nor foreign key constraints for temporary tables.
      
      No test case was added, because the failure is nondeterministic.
      c6838cc6
  34. 02 Oct, 2018 1 commit