1. 11 Sep, 2024 3 commits
    • Aleksey Midenkov's avatar
      alter_copy_bulk fix · b9ddb9da
      Aleksey Midenkov authored
      Related to FIXME here. Now check_bulk_buffer() returns false.
      
      3389                    if (auto t= trx->check_bulk_buffer(index->table)) {
      3390                            /* MDEV-25036 FIXME:
      3391                            row_ins_check_foreign_constraint() check
      3392                            should be done before buffering the insert
      3393                            operation. */
      3394                            ut_ad(index->table->skip_alter_undo
      3395                                  || !trx->check_foreigns);
      3396                            return t->bulk_insert_buffered(*entry, *index, trx);
      3397                    }
      b9ddb9da
    • Aleksey Midenkov's avatar
      MDEV-19191 Code annotations · 1213918f
      Aleksey Midenkov authored
      This commit is not intended to be pushed into main branch. Its mission
      is to simplify the review process. The comments here are in different
      style: // and without indentation. The reviewer may ask for some of
      them to be included into the task code. In that case they will be
      reformatted and moved to the task commit.
      1213918f
    • Aleksey Midenkov's avatar
      MDEV-19191 Partial support of foreign keys in partitioned tables · 84c5b979
      Aleksey Midenkov authored
      The patch adds the ability to run foreign keys in partitioned tables with
      limitations.
      
      Example:
      
        create or replace table t1 (id int primary key) engine innodb;
        create or replace table t2 (fk int references t1(id)) engine innodb
        partition by hash (fk) partitions 2;
      
      Limitations:
      
        1. Foreign keys cannot refer partitioned table even SYSTEM_TIME-partitioned
        still. create_foreign_keys() at InnoDB layer receives Foreign_key about
        referenced table T, but no such table exists in InnoDB layer, only partition
        tables T#P#p0, T#P#p1, ..., T#P#pn. Finding out it is SYSTEM_TIME partitioning
        and current partition at that point is impossible without modification of
        SYS_TABLES or opening TABLE object of referenced table. Both should be avoided
        as this is superseded by MDEV-12483.
      
        2. CASCADE and SET NULL actions are disabled in partitioned foreign table as
        these actions update row data and this is the subject of row placement into
        another partition but it cannot be done in InnoDB layer. DELETE CASCADE for
        SYSTEM_TIME partitioning requires the row to be moved from current to history
        partition.
      
      The task is basically divided into 3 parts:
      
        1. Remove prohibiting code, allow FKs to be created for partitions;
        2. Allow partitioned FKs at SQL layer for such functions as SHOW CREATE;
        3. Implement correct handling of FKs when partitioning configuration changes.
      
      1. Remove prohibiting code, allow FKs to be created for partitions
      
        In SYS_FOREIGN table foreign key records are unique by ID which was taken from
        constraint name or automatically generated. Normally foreign ID and constraint
        name are identical, but that's not the case for partitioned table as InnoDB
        holds foreign keys per dict_table_t object and each partition is a different
        table for InnoDB. So for each foreign key in SQL layer there is a set of foreign
        keys in InnoDB layer per each partition (except SYSTEM_TIME partitioning where
        we keep foreign keys only for current partition). To constitute unique foreign
        ID at InnoDB layer we concatenate constraint name with partition suffix, the one
        what is added to partition table name beginning with #P# and optionally
        containing #SP# for subpartitions. Constraint name and partitioning suffix are
        separated by \xFF character which is the safe character code non-clashing with
        identifier character set.
      
        When we return back foreign ID to SQL layer this partitioning suffix is stripped
        off the constraint name and SQL output receives the name similar to
        non-partitioned table.
      
        User may see a bit more truthful version of foreign ID in
        INFORMATION_SCHEMA.INNODB_SYS_FOREIGN with \xFF replaced by ':' and #P# or
        everything starting from #P# and ending by #SP# chopped out. So he may see
        corresponding partition name or subpartition name in ID of INNODB_SYS_FOREIGN.
      
      2. Allow partitioned FKs at SQL layer for such functions as SHOW CREATE
      
        Through standard handler interface get_foreign_key_list() foreign keys are
        returned to SQL layer. For SYSTEM_TIME partitioning from current partition, for
        any other partitioning from first read-marked partition.
      
      3. Implement correct handling of FKs when partitioning configuration changes
      
        ALTER operations such as ADD PARTITION, DROP PARTITION, REMOVE PARTITIONING,
        etc. are reflected into correct configuration of foreign keys in InnoDB.
        Handling of foreign key ID for temporary tables in ALTER was done based on
        MDEV-28933.
      84c5b979
  2. 10 Sep, 2024 10 commits
    • Aleksey Midenkov's avatar
      198bfb70
    • Aleksey Midenkov's avatar
      Cleanups · 51068844
      Aleksey Midenkov authored
      51068844
    • Aleksey Midenkov's avatar
      MDEV-28933 CREATE OR REPLACE fails to recreate same constraint name · 3537e7cf
      Aleksey Midenkov authored
      Use temporary constraint names for temporary tables. The constraints
      are not added to cache (skipped in dict_table_rename_in_cache()).
      
      The scheme for temporary constraint names is as follows:
      
          for old table: db_name/\xFFconstraint_name
          for new table: db_name/\xFF\xFFconstraint_name
      
      normalize_table_name_c_low(): wrong comparison "less than FN_REFLEN -
      1". Somewhere array of FN_REFLEN includes the trailing 0, somewhere
      array of FN_REFLEN + 1 includes trailing 0, but nowhere array of
      FN_REFLEN - 1 must include trailing 0.
      
      Change from original MDEV-28933 fix:
      
      As temporary FK is now required for any ALTER operation (especially
      partitioning operations) row_rename_table_for_mysql() does FK rename
      on both RENAME_FK and RENAME_ALTER_COPY (see do_rename_fk).
      3537e7cf
    • Aleksey Midenkov's avatar
      MDEV-28933 Moved RENAME_CONSTRAINT_IDS to include/sql_funcs.h · 6b1ebb7d
      Aleksey Midenkov authored
      All InnoDB internal SQL functions should be moved to sql_funcs.h
      6b1ebb7d
    • Aleksey Midenkov's avatar
      MDEV-25292 innodb part · 780aa41b
      Aleksey Midenkov authored
        Based on Marko Makela's patch 4a591d4:
      
        dict_get_referenced_table(): Let the caller convert names when needed.
      
        row_rename_table_for_mysql(): Specify the treatment of FOREIGN KEY
        constraints in a 4-valued enum parameter. In cases where FOREIGN KEY
        constraints cannot exist (partitioned tables, or internal tables of
        FULLTEXT INDEX), we can use the mode RENAME_IGNORE_FK.
        The mod RENAME_REBUILD is for any DDL operation that rebuilds the
        table inside InnoDB, such as TRUNCATE and native ALTER TABLE
        (or OPTIMIZE TABLE). The mode RENAME_ALTER_COPY is used solely
        during non-native ALTER TABLE in ha_innobase::rename_table().
        Normal ha_innobase::rename_table() will use the mode RENAME_FK.
      
        CREATE OR REPLACE will rename the old table (if one exists) along
        with its FOREIGN KEY constraints into a temporary name. The replacement
        table will be initially created with another temporary name.
        Unlike in ALTER TABLE, all FOREIGN KEY constraints must be renamed
        and not inherited as part of these operations, using the mode RENAME_FK.
      
        dict_get_referenced_table(): Let the callers convert names when needed.
      
        create_table_info_t::create_foreign_keys(): CREATE OR REPLACE creates
        the replacement table with a temporary name table, so for
        self-references foreign->referenced_table will be a table with
        temporary name and charset conversion must be skipped for it.
      780aa41b
    • Aleksey Midenkov's avatar
      is_partition(), is_temporary_name() fix · 3fb22596
      Aleksey Midenkov authored
      Return true for temporary partitions.
      3fb22596
    • Aleksey Midenkov's avatar
      MDEV-12483 create_foreign_key() split · 79459c7e
      Aleksey Midenkov authored
      79459c7e
    • Aleksey Midenkov's avatar
      Deprecated warning fix · 493773b8
      Aleksey Midenkov authored
      493773b8
    • Aleksey Midenkov's avatar
      WITHOUT_ABI_CHECK · 8a8420c3
      Aleksey Midenkov authored
      8a8420c3
    • Aleksey Midenkov's avatar
      Dtrace fix · cb6891e5
      Aleksey Midenkov authored
      When there are GCC-incompatible compiler flags dtrace fails like this:
      
      gcc: error: unrecognized command-line option ‘-fno-limit-debug-info’
      gcc: error: unrecognized command-line option ‘-mbranches-within-32B-boundaries’
      "gcc .dtrace-temp.3fd6bacf.c" failed
      Usage /usr/bin/dtrace [--help] [-h | -G] [-C [-I<Path>]] -s File.d [-o <File>]
      cb6891e5
  3. 05 Sep, 2024 1 commit
  4. 04 Sep, 2024 1 commit
  5. 29 Aug, 2024 7 commits
    • Marko Mäkelä's avatar
      Merge 11.2 into 11.4 · 44733aa8
      Marko Mäkelä authored
      44733aa8
    • Marko Mäkelä's avatar
      Merge 10.11 into 11.2 · e91a7994
      Marko Mäkelä authored
      e91a7994
    • Marko Mäkelä's avatar
      MDEV-34750 SET GLOBAL innodb_log_file_size is not crash safe · 984606d7
      Marko Mäkelä authored
      The recent commit 4ca355d8 (MDEV-33894)
      caused a serious regression for online InnoDB ib_logfile0 resizing,
      breaking crash-safety unless the memory-mapped log file interface is
      being used. However, the log resizing was broken also before this.
      
      To prevent such regressions in the future, we extend the test
      innodb.log_file_size_online with a kill and restart of the server
      and with some writes running concurrently with the log size change.
      When run enough many times, this test revealed all the bugs that
      are being fixed by the code changes.
      
      log_t::resize_start(): Do not allow the resized log to start before
      the current log sequence number. In this way, there is no need to
      copy anything to the first block of resize_buf. The previous logic
      regarding that was incorrect in two ways. First, we would have to
      copy from the last written buffer (buf or flush_buf). Second, we failed
      to ensure that the mini-transaction end marker bytes would be 1
      in the buffer. If the source ib_logfile0 had wrapped around an odd number
      of times, the end marker would be 0. This was occasionally observed
      when running the test innodb.log_file_size_online.
      
      log_t::resize_write_buf(): To adjust for the resize_start() change,
      do not write anything that would be before the resize_lsn.
      Take the buffer (resize_buf or resize_flush_buf) as a parameter.
      Starting with commit 4ca355d8
      we no longer swap buffers when rewriting the last log block.
      
      log_t::append(): Define as a static function; only some debug
      assertions need to refer to the log_sys object.
      
      innodb_log_file_size_update(): Wake up the buf_flush_page_cleaner()
      if needed, and wait for it to complete a batch while waiting for
      the log resizing to be completed. If the current LSN is behind the
      resize target LSN, we will write redundant FILE_CHECKPOINT records to
      ensure that the log resizing completes. If the buf_pool.flush_list is
      empty or the buf_flush_page_cleaner() is stuck for some reason, our wait
      will time out in 5 seconds, so that we can periodically check if the
      execution of SET GLOBAL innodb_log_file_size was aborted. Previously,
      we could get into a busy loop here while the buf_flush_page_cleaner()
      would remain idle.
      984606d7
    • Oleksandr Byelkin's avatar
      Merge branch '10.6' into 10.11 · 3a1ff739
      Oleksandr Byelkin authored
      3a1ff739
    • Oleksandr Byelkin's avatar
      Merge branch '10.5' into 10.6 · a4654ecc
      Oleksandr Byelkin authored
      a4654ecc
    • Oleksandr Byelkin's avatar
      MDEV-34833 Assertion failure in Item_float::do_build_clone (Item_static_float_func) · 03a5455c
      Oleksandr Byelkin authored
      Added missing method of Item_static_float_func
      03a5455c
    • Marko Mäkelä's avatar
      Merge 10.6 into 10.11 · cfcf27c6
      Marko Mäkelä authored
      cfcf27c6
  6. 28 Aug, 2024 6 commits
  7. 27 Aug, 2024 6 commits
  8. 26 Aug, 2024 6 commits