1. 15 Aug, 2023 23 commits
    • Sergei Golubchik's avatar
    • Sergei Golubchik's avatar
      don't copy stmt IO_CACHE to trx IO_CACHE at the stmt end · 332f41aa
      Sergei Golubchik authored
      instead use only one (trx) IO_CACHE and truncate it if the
      statement is rolled back.
      
      don't use binlog_cache_mngr to accumulate the data,
      use binlog_cache_data instead.
      
      (binlog_cache_data owns one IO_CACHE, binlog_cache_mngr owns
      two binlog_cache_data's, trx and stmt).
      332f41aa
    • Sergei Golubchik's avatar
      don't do DROP SYSTEM VERSIONING online · 3099a756
      Sergei Golubchik authored
      because ALTER TABLE ... DROP SYSTEM VERSIONING
      is not just a change in the table structure, it also deletes
      all historical rows
      3099a756
    • Sergei Golubchik's avatar
      Online alter: set read_set early, before row reads · 32c3d775
      Sergei Golubchik authored
      also
      
      * don't modify write_set
      * backup/restore rpl_write_set
      32c3d775
    • Sergei Golubchik's avatar
      df0771c6
    • Sergei Golubchik's avatar
      online alter always uses ALGORITHM=COPY, LOCK=NONE · a5776aa3
      Sergei Golubchik authored
      so any other value of ALGORITHM or LOCK disables online alter
      a5776aa3
    • Sergei Golubchik's avatar
      remove handler::open_read_view() · d767ed5c
      Sergei Golubchik authored
      ht->start_consistent_snapshot() is also not a way,
      because some engines (e.g. rocksdb) only do it readonly.
      instead, downgrade the lock after reading the first row
      (which implicitly opens a read view).
      d767ed5c
    • Sergei Golubchik's avatar
      cleanup · 0b67af5a
      Sergei Golubchik authored
      no functional changes here
      0b67af5a
    • Sergei Golubchik's avatar
      a8a22b7a
    • Sergei Golubchik's avatar
      tests: move around, add new · 6c57e29b
      Sergei Golubchik authored
      two new tests:
      * alter table times out because of a long concurrent trx
      * alter table adds a column in the middle
      6c57e29b
    • Nikita Malyavin's avatar
      MDEV-16329 [5/5] ALTER ONLINE TABLE · ab4bfad2
      Nikita Malyavin authored
      * Log rows in online_alter_binlog.
      * Table online data is replicated within dedicated binlog file
      * Cached data is written on commit.
      * Versioning is fully supported.
      * Works both wit and without binlog enabled.
      
      * For now savepoints setup is forbidden while ONLINE ALTER goes on.
        Extra support is required. We can simply log the SAVEPOINT query events
        and replicate them together with row events. But it's not implemented
        for now.
      
      * Cache flipping:
      
        We want to care for the possible bottleneck in the online alter binlog
        reading/writing in advance.
      
        IO_CACHE does not provide anything better that sequential access,
        besides, only a single write is mutex-protected, which is not suitable,
        since we should write a transaction atomically.
      
        To solve this, a special layer on top Event_log is implemented.
        There are two IO_CACHE files underneath: one for reading, and one for
        writing.
      
        Once the read cache is empty, an exclusive lock is acquired (we can wait
        for a currently active transaction finish writing), and flip() is emitted,
        i.e. the write cache is reopened for read, and the read cache is emptied,
        and reopened for writing.
      
        This reminds a buffer flip that happens in accelerated graphics
        (DirectX/OpenGL/etc).
      
        Cache_flip_event_log is considered non-blocking for a single reader and a
        single writer in this sense, with the only lock held by reader during flip.
      
        An alternative approach by implementing a fair concurrent circular buffer
        is described in MDEV-24676.
      
      * Cache managers:
        We have two cache sinks: statement and transactional.
        It is important that the changes are first cached per-statement and
        per-transaction.
        If a statement fails, then only statement data is rolled back. The
        transaction moves along, however.
      
        Turns out, there's no guarantee that TABLE well persist in
        thd->open_tables to the transaction commit moment.
        If an error occurs, tables from statement are purged.
        Therefore, we can't store te caches in TABLE. Ideally, it should be
        handlerton, but we cut the corner and store it in THD in a list.
      ab4bfad2
    • Nikita Malyavin's avatar
      MDEV-16329 [4/5] Refactor MYSQL_BIN_LOG: extract Event_log ancestor · d2d0995c
      Nikita Malyavin authored
      Event_log is supposed to be a basic logging class that can write events in
      a single file.
      
      MYSQL_BIN_LOG in comparison will have:
      * rotation support
      * index files
      * purging
      * gtid and transactional information handling.
      * is dedicated for a general-purpose binlog
      d2d0995c
    • Nikita Malyavin's avatar
      MDEV-16329 [3/5] use binlog_cache_data directly in most places · 6427e343
      Nikita Malyavin authored
      * Eliminate most usages of THD::use_trans_table. Only 3 left, and they are
        at quite high levels, and really essential.
      * Eliminate is_transactional argument when possible. Lots of places are
        left though, because of some WSREP error handling in
        MYSQL_BIN_LOG::set_write_error.
      * Remove junk binlog functions from THD
      * binlog_prepare_pending_rows_event is moved to log.cc inside MYSQL_BIN_LOG
        and is not anymore template. Instead it accepls event factory with a type
        code, and a callback to a constructing function in it.
      6427e343
    • Nikita Malyavin's avatar
      MDEV-16329 [2/5] refactor binlog and cache_mngr · 429f635f
      Nikita Malyavin authored
      pump up binlog and cache manager to level of binlog_log_row_internal
      429f635f
    • Nikita Malyavin's avatar
      0dfbb05c
    • Nikita Malyavin's avatar
      rpl: repack table_def · f5e50137
      Nikita Malyavin authored
      1. Change m_size to uint. This removes some implicit conversions.
        See unpack_row, for instance:
        uint max_cols= MY_MIN(tabledef->size(), cols->n_bits);
      2. Improve table_def memory layout by reordering columns
      f5e50137
    • Nikita Malyavin's avatar
      Copy_field: add const to arguments · af83d06d
      Nikita Malyavin authored
      af83d06d
    • Sergei Golubchik's avatar
      rename tests · 25110260
      Sergei Golubchik authored
      alter_table_online -> alter_table_locknone
      gis-alter_table_online -> gis-alter_table
      25110260
    • Sergei Golubchik's avatar
    • Sergei Golubchik's avatar
      cleanup: remove vcol_info->stored_in_db · 275684d8
      Sergei Golubchik authored
      it was redundant, duplicating vcol_type == VCOL_GENERATED_STORED.
      
      Note that VCOL_DEFAULT is not "stored", "stored vcol" means that after
      rnd_next or index_read/etc the field value is already in the record[0]
      and does not need to be calculated separately
      275684d8
    • Sergei Golubchik's avatar
      Fix recalculation of vcols in binlog_row_image=minimal · 9545eb96
      Sergei Golubchik authored
      unpack_row() must calculate all stored and indexed vcols
      (in fill_extra_persistent_columns()).
      
      Also Update and Delete row events must mark in read_set
      all columns needed for calculating all stored and indexed vcols.
      
      If it's done properly in do_apply_event(), it no longer needs
      to be repeated per row.
      9545eb96
    • Sergei Golubchik's avatar
      cleanup: clarify ha_innobase::column_bitmaps_signal() · e499b25c
      Sergei Golubchik authored
      it was created to handle the case of the concurrent
      inplace add index. So it should only work in that case,
      otherwise it's doing server's job (marks virtual column dependencies)
      and hides server's bugs. And it was redundant.
      e499b25c
    • Sergei Golubchik's avatar
      allow random_bytes() in virtual columns · eaa87eb8
      Sergei Golubchik authored
      eaa87eb8
  2. 12 Aug, 2023 1 commit
  3. 11 Aug, 2023 11 commits
    • Sergei Golubchik's avatar
      bump the VERSION · 66f0f2f2
      Sergei Golubchik authored
      66f0f2f2
    • Sergei Golubchik's avatar
      cleanup: remove useless check · 4e87081b
      Sergei Golubchik authored
      create_table_impl() doesn't need to search for a temporary table
      when the table_name is like #sql-xxx
      4e87081b
    • 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
    • Anel Husakovic's avatar
      MDEV-28351: Assertion `this->file->children_attached' failed in ha_myisammrg::info · de57da73
      Anel Husakovic authored
      - Fix MSAN uninitialized value error, obtained by calling handlerton's
      `info()`, and referencing uninitialized `errkey`.
      - Reviewer: serg@mariadb.com
      de57da73
    • Anel Husakovic's avatar
      MDEV-31618: Server crashes in process_i_s_table_temporary_tables/get_all_tables · 82d9d72f
      Anel Husakovic authored
      - Pre-open temporary table on sequence creation.
      - Without this patch, if rename alter is done on the temporary sequence,
        and after that `create replace`, since table is not preopened and
        alter rename marked the table as reopen, and such table is deleted in
        the `find_temporary_table()` leaving the share without the table, that
        causes `show tables` to fail
      - Closes PR #2685
      - Reviewer: <serg@mariadb.com>
      82d9d72f
    • Sergei Golubchik's avatar
      MDEV-12459 post-review fixes · 62decb5e
      Sergei Golubchik authored
      * IS_USER_TEMP_TABLE() was misleading, name didn't match the code
      * list of temp tables was rescanned number_of_databases times
      * some temporary tables were not shown (from nonexistent databases)
      * some temporary tables were shown more than once (e.g. after self-joins)
      * sys.table_exists() - avoid querying I_S twice
      * fix handling of temporary MERGE tables - it's pointless to fully open
        them, they're not in thd->temporary_tables, so they simply fail to
        open and are skipped. Relax the assertion instead.
      62decb5e
    • Anel Husakovic's avatar
      MDEV-28343: sys.create_synonym_db fails with ER_VIEW_SELECT_TMPTABLE when... · 1fb4828b
      Anel Husakovic authored
      MDEV-28343: sys.create_synonym_db fails with ER_VIEW_SELECT_TMPTABLE when schema contains temporary tables
      
      - MDEV-28342 raised the error in case temporary table shadows base table
      - Now we are allowed to shadow base tables with temporary tables and
      `sys.create_synonym_db()` can easily check for existance of temporary table and
      ignore view creation, since it is not supported to create view from
      temporary table.
      Reviewed-by: default avatar&lt;monty@mariadb.org&gt;, <vicentiu@mariadb.org>
      1fb4828b
    • Monty's avatar
      MDEV-28351 Assertion `this->file->children_attached' failed in ha_myisammrg::info · 91bfc76f
      Monty authored
      Reviewed-by: <vicentiu@mariadb.org>
      91bfc76f
    • Anel Husakovic's avatar
      MDEV-12459 Patch sysschema · 1923ff8e
      Anel Husakovic authored
      This commit updates sysschema to work with the new behaviour of show
      tables and information_schema.tables table showing temporary tables for
      current connection.
      Co-authored-by: default avatarMonty <monty@mariadb.org>
      Reviewer: <vicentiu@mariadb.org>
      1923ff8e
    • Anel Husakovic's avatar
      MDEV-12459 Get temporary tables visible to the IS.tables for current connection · 0b7d1748
      Anel Husakovic authored
      Additionally fixes the bugs uncovered in:
        - `MDEV-28332: Alter on temporary table causes ER_TABLE_EXISTS_ERROR note`
          Since there is no `warning` issued by shadowing of base table, this MDEV
          is irrelevant. Keeping for review purposes and for future development
          in case shadowing is going to be implemented
        - `MDEV-28334: SHOW TABLE STATUS shows all temporary tables ignoring database and conditions`
        - `MDEV-28453: SHOW commands are inconsistent for temporary tables`
      
      Reviewed by: <monty@mariadb.org>,
                   <vicentiu@mariadb.org>
      0b7d1748
    • Anel Husakovic's avatar
      Cosmetic fixes · 1c052e90
      Anel Husakovic authored
      Reviewer: <vicentiu@mariadb.org>
      1c052e90
  4. 10 Aug, 2023 1 commit
    • Dmitry Shulga's avatar
      MDEV-31799 Unexpected ER_TRG_NO_SUCH_ROW_IN_TRG and server crash after ALTER TABLE · f329fe1c
      Dmitry Shulga authored
      This bug report was caused by implementation of the task MDEV-5816
      (Stored programs: validation of stored program statements).
      Changing metadata of a table that has a trigger on AFTER UPDATE or AFTER DELETE
      resulted in unexpected output of the error ER_TRG_NO_SUCH_ROW_IN_TR.
      It was caused by the fact that characteristics of the trigger dependent on
      changed table's metadata wasn't set in a new lex object created on re-parsing
      of a failing trigger statement.
      
      To fix the bug the data member lex->trg_chistics.action_time and
      lex->trg_chistics.event must be set into real values of the trigger
      whose statement being re-parsed.
      f329fe1c
  5. 02 Aug, 2023 4 commits