1. 31 Aug, 2020 1 commit
    • Marko Mäkelä's avatar
      MDEV-20386 WITH_MSAN fails due to inline asm · 31e6c96b
      Marko Mäkelä authored
      In commit 94d0bb4d (MDEV-20377)
      we replaced some inline assembler code with calls to GCC-style
      builtin functions. These functions would only be available if
      the target allows SSE4.2 instructions to be used. Hence, the
      cmake -DWITH_MSAN=ON build would fail unless the default x86 (IA-32)
      or AMD64 target was overridden.
      
      It turns out that the problem can be solved by overriding the default
      target architecture for specific functions with the help of GCC function
      attributes.
      
      ut_crc32c_8(), ut_crc32c_64(): Use the compiler-builtin intrinsic
      functions. For GCC before 5, the header file <nmmintrin.h> does not
      really work, and we must keep using the compiler built-in functions.
      
      For the Microsoft compiler, we will keep using <intrin.h> because
      we will also need the definition of the __cpuid() function.
      On GCC and clang, we prefer to invoke inline assembler for that.
      
      Curiously, the inline assembler in has_sse4_2() or crc32_pclmul()
      is not causing any trouble for MSAN. Also, the inline assembler
      in WolfSSL appears to be fine now. Something might have changed
      between clang-8 and clang-10 (10.0.1).
      31e6c96b
  2. 28 Aug, 2020 3 commits
    • Marko Mäkelä's avatar
      MDEV-23618 InnoDB lacks IA-32 CRC-32C acceleration on GCC 4 · 9ef36faa
      Marko Mäkelä authored
      When MDEV-22669 introduced CRC-32C acceleration to IA-32,
      it worked around a compiler bug by disabling the acceleration
      on GCC 4 for IA-32 altogether, even though the compiler bug
      only affects -fPIC builds that are targeting IA-32.
      
      Let us extend the solution fe5dbfe7
      and define HAVE_CPUID_INSTRUCTION that allows us to implement
      a necessary and sufficient work-around of the compiler bug.
      9ef36faa
    • Alexander Barkov's avatar
      MDEV-23568 Improve performance of my_{time|date|datetime}_to_str() · c14ecc75
      Alexander Barkov authored
      This patch improves functions my_xxx_to_str() using the idea
      introduced in this change in MySQL-8.0:
      
        commit 8d10f2fff6bbdea7f436b868ebb5fd811defc68a
        Author: Knut Anders Hatlen <knut.hatlen@oracle.com>
        Date:   Thu Oct 10 13:55:07 2019 +0200
          Bug#30472888: IMPROVE THE PERFORMANCE OF INTEGER HANDLING IN THE TEXT PROTOCOL
      
      The new way prints 2 digits at a time and demonstrates a very impressing query time reduce:
      10% to 38%, depending on the exact data type and the number of fractional digits:
      
        SELECT BENCHMARK(10*1000*1000,CONCAT(TIME'10:20:30'));
        SELECT BENCHMARK(10*1000*1000,CONCAT(TIME'10:20:30.123456'));
        SELECT BENCHMARK(10*1000*1000,CONCAT(DATE'2001-01-01'));
        SELECT BENCHMARK(10*1000*1000,CONCAT(TIMESTAMP'2001-01-01 10:20:30'));
        SELECT BENCHMARK(10*1000*1000,CONCAT(TIMESTAMP'2001-01-01 10:20:30.123456'));
      
      See MDEV for details on the benchmark results.
      c14ecc75
    • Brad Smith's avatar
  3. 27 Aug, 2020 1 commit
    • Marko Mäkelä's avatar
      MDEV-23585: Fix the 32-bit build on GCC 4 · fe5dbfe7
      Marko Mäkelä authored
      GCC before version 5 would fail to emit the CPUID instruction
      when targeting IA-32 in -fPIC mode. Therefore, we must add the
      CPUID instruction to the HAVE_CLMUL_INSTRUCTION check.
      
      This means that the PCLMUL accelerated crc32() function will
      not be available on i686 executables that are compiled with
      GCC 4. The limitation does not impact AMD64 builds or non-PIC
      x86 builds, or other compilers (clang, or GCC 5 or newer).
      fe5dbfe7
  4. 26 Aug, 2020 1 commit
  5. 27 Aug, 2020 2 commits
    • Marko Mäkelä's avatar
      MDEV-23585: Fix HAVE_CLMUL_INSTRUCTION · b47d61d0
      Marko Mäkelä authored
      MDEV-22641 in commit dec3f8ca
      refactored a SIMD implementation of CRC-32 for the ISO 3309 polynomial
      that uses the IA-32/AMD64 carry-less multiplication (pclmul)
      instructions. The code was previously only available in Mariabackup;
      it was changed to be a general replacement of the zlib crc32().
      
      There exist AMD64 systems where CMAKE_SYSTEM_PROCESSOR matches
      the pattern i[36]86 but not x86_64 or amd64. This would cause a
      link failure, because mysys/checksum.c would basically assume that
      the compiler support for instruction is always available on GCC-compatible
      compilers on AMD64.
      
      Furthermore, we were unnecessarily disabling the SIMD acceleration
      for 32-bit executables.
      
      Note: Until MDEV-22749 has been implemented, the PCLMUL instruction
      will not be used on Microsoft Windows.
      
      Closes: #1660
      b47d61d0
    • Marko Mäkelä's avatar
      Merge 10.4 into 10.5 · bb284e3f
      Marko Mäkelä authored
      bb284e3f
  6. 26 Aug, 2020 6 commits
  7. 25 Aug, 2020 11 commits
  8. 24 Aug, 2020 1 commit
  9. 23 Aug, 2020 1 commit
    • Kentoku SHIBA's avatar
      MDEV-22246 Result rows duplicated by spider engine · 2000d05c
      Kentoku SHIBA authored
      fix the following type mrr scan
      (select 0,`id`,`node` from `auto_test_remote`.`tbl_a` where (`id` <> 0) order by `id`)union all(select 1,`id`,`node` from `auto_test_remote`.`tbl_a` where (`id` <> 0) order by `id`) order by `id`
      2000d05c
  10. 24 Aug, 2020 3 commits
    • Alexander Barkov's avatar
      MDEV-23562 Assertion `time_type == MYSQL_TIMESTAMP_DATETIME' failed upon... · 329301d2
      Alexander Barkov authored
      MDEV-23562 Assertion `time_type == MYSQL_TIMESTAMP_DATETIME' failed upon SELECT from versioned table
      
      The code in vers_select_conds_t::init_from_sysvar() assumed that
      the value of the system_versioning_asof is DATETIME.
      But it also could be DATE after a query like this:
        SET system_versioning_asof = DATE(NOW());
      
      Fixing Sys_var_vers_asof::update() to convert the value
      of the assignment source to DATETIME if it returned DATE.
      
      Now vers_select_conds_t::init_from_sysvar() always gets a DATETIME value.
      329301d2
    • Alexander Barkov's avatar
    • Alexander Barkov's avatar
      MDEV-23551 Performance degratation in temporal literals in 10.4 · 04ce2935
      Alexander Barkov authored
      Problem:
      
      Queries like this showed performance degratation in 10.4 over 10.3:
      
        SELECT temporal_literal FROM t1;
        SELECT temporal_literal + 1 FROM t1;
        SELECT COUNT(*) FROM t1 WHERE temporal_column = temporal_literal;
        SELECT COUNT(*) FROM t1 WHERE temporal_column = string_literal;
      
      Fix:
      
      Replacing the universal member "MYSQL_TIME cached_time" in
      Item_temporal_literal to data type specific containers:
      - Date in Item_date_literal
      - Time in Item_time_literal
      - Datetime in Item_datetime_literal
      
      This restores the performance, and make it even better in some cases.
      See benchmark results in MDEV.
      
      Also, this change makes futher separations of Date, Time, Datetime
      from each other, which will make it possible not to derive them from
      a too heavy (40 bytes) MYSQL_TIME, and replace them to smaller data
      type specific containers.
      04ce2935
  11. 23 Aug, 2020 1 commit
    • Kentoku SHIBA's avatar
      MDEV-22246 Result rows duplicated by spider engine · 65ee216c
      Kentoku SHIBA authored
      fix the following type mrr scan
      (select 0,`id`,`node` from `auto_test_remote`.`tbl_a` where (`id` <> 0) order by `id`)union all(select 1,`id`,`node` from `auto_test_remote`.`tbl_a` where (`id` <> 0) order by `id`) order by `id`
      65ee216c
  12. 24 Aug, 2020 1 commit
  13. 23 Aug, 2020 1 commit
  14. 22 Aug, 2020 3 commits
    • Alexander Barkov's avatar
      MDEV-23537 Comparison with temporal columns is slow in MariaDB · 2e5d86f4
      Alexander Barkov authored
      Implementing methods:
      - Field::val_time_packed()
      - Field::val_datetime_packed()
      - Item_field::val_datetime_packed(THD *thd);
      - Item_field::val_time_packed(THD *thd);
      to give a faster access to temporal packed longlong representation of a Field,
      which is used in temporal Arg_comparator's to DATE, TIME, DATETIME data types.
      
      The same idea is used in MySQL-5.6+.
      
      This improves performance.
      2e5d86f4
    • Alexander Barkov's avatar
      6708e67a
    • Alexander Barkov's avatar
      MDEV-23525 Wrong result of MIN(time_expr) and MAX(time_expr) with GROUP BY · ae33ebe5
      Alexander Barkov authored
      Problem:
      
      When calculatung MIN() and MAX() in a query with GROUP BY, like this:
      
        SELECT MIN(time_expr), MAX(time_expr) FROM t1 GROUP BY i;
      
      the code in Item_sum_min_max::update_field() erroneosly used
      string format comparison, therefore '100:20:30' was considered as
      smaller than '10:20:30'.
      
      Fix:
      
      1. Implementing low level "native" related methods in class Time:
           Time::Time(const Native &native)           - convert native to Time
           Time::to_native(Native *to, uint decimals) - convert Time to native
      
         The "native" binary representation for TIME is equal to
         the binary data format of Field_timef, which is used to
         store TIME when mysql56_temporal_format is ON (default).
      
      2. Implementing Type_handler_time_common "native" related methods:
      
        Type_handler_time_common::cmp_native()
        Type_handler_time_common::Item_val_native_with_conversion()
        Type_handler_time_common::Item_val_native_with_conversion_result()
        Type_handler_time_common::Item_param_val_native()
      
      3. Implementing missing "native representation" related methods
         in Field_time and Field_timef:
      
        Field_time::store_native()
        Field_time::val_native()
        Field_timef::store_native()
        Field_timef::val_native()
      
      4. Implementing missing "native" related methods in all Items
         that can have the TIME data type:
      
        Item_timefunc::val_native()
        Item_name_const::val_native()
        Item_time_literal::val_native()
        Item_cache_time::val_native()
        Item_handled_func::val_native()
      
      5. Marking Type_handler_time_common as "native ready".
         So now Item_sum_min_max::update_field() calculates
         values using min_max_update_native_field(),
         which uses native binary representation rather than string representation.
      
         Before this change, only the TIMESTAMP data type used native
         representation to calculate MIN() and MAX().
      
      Benchmarks (see more details in MDEV):
      
        This change not only fixes the wrong result, but also
        makes a "SELECT .. MAX.. GROUP BY .." query faster:
      
        # TIME(0)
        CREATE TABLE t1 (id INT, time_col TIME) ENGINE=HEAP;
        INSERT INTO t1 VALUES (1,'10:10:10'); -- repeat this 1m times
        SELECT id, MAX(time_col) FROM t1 GROUP BY id;
      
        MySQL80: 0.159 sec
        10.3:    0.108 sec
        10.4:    0.094 sec (fixed)
      
        # TIME(6):
        CREATE TABLE t1 (id INT, time_col TIME(6)) ENGINE=HEAP;
        INSERT INTO t1 VALUES (1,'10:10:10.999999'); -- repeat this 1m times
        SELECT id, MAX(time_col) FROM t1 GROUP BY id;
      
        My80: 0.154
        10.3: 0.135
        10.4: 0.093 (fixed)
      ae33ebe5
  15. 21 Aug, 2020 4 commits