1. 27 Oct, 2020 5 commits
    • Eugene Kosov's avatar
      MDEV-23991 dict_table_stats_lock() has unnecessarily long scope · afc9d00c
      Eugene Kosov authored
      Patch removes dict_index_t::stats_latch. Table/index statistics now
      protected with dict_sys->mutex. That way statistics computation can
      happen in parallel in several threads and dict_sys->mutex will be locked
      only for a short period of time.
      
      This patch is a joint work with Marko Mäkelä
      
      dict_index_t::lock: make mutable which allows to pass const pointer
      when only lock is touched in an object
      
      btr_height_get()
      btr_get_size(): make index argument const for better type safety
      
      btr_estimate_number_of_different_key_vals(): now returns computed values
      instead of setting fields in dict_index_t directly
      
      remove everything related to dict_index_t::stats_latch
      
      dict_stats_index_set_n_diff(): now returns computed values instead
      of setting fields in dict_index_t directly
      
      dict_stats_analyze_index():  now returns computed values instead
      of setting fields in dict_index_t directly
      
      Reviewed by: Marko Mäkelä
      afc9d00c
    • Marko Mäkelä's avatar
      MDEV-16952 Introduce SET GLOBAL innodb_max_purge_lag_wait · 42e1815a
      Marko Mäkelä authored
      Let us introduce a dummy variable innodb_max_purge_lag_wait
      for waiting that the InnoDB history list length is below
      the user-specified limit. Specifically,
      
      SET GLOBAL innodb_max_purge_lag_wait=0;
      
      should wait for all history to be purged. This could be useful
      when upgrading from an older version to MariaDB 10.3 or later,
      to avoid hitting MDEV-15912.
      
      Note: the history cannot be purged if there exist transactions
      that may see old versions.
      
      Reviewed by: Vladislav Vaintroub
      42e1815a
    • Alexey Botchkov's avatar
      MDEV-22524 SIGABRT in safe_mutex_unlock with · 8761571a
      Alexey Botchkov authored
      session_track_system_variables and max_relay_log_size.
      
      lock LOCK_global_system_variables around the get_one_variable() call
      in the Session_sysvars_tracker::store_variable().
      8761571a
    • Thirunarayanan Balathandayuthapani's avatar
      MDEV-23693 Failing assertion: my_atomic_load32_explicit(&lock->lock_word,... · bc540b87
      Thirunarayanan Balathandayuthapani authored
      MDEV-23693 Failing assertion: my_atomic_load32_explicit(&lock->lock_word, MY_MEMORY_ORDER_RELAXED) == X_LOCK_DECR
      
      InnoDB frees the block lock during buffer pool shrinking when other
      thread is yet to release the block lock.  While shrinking the
      buffer pool, InnoDB allows the page to be freed unless it is buffer
      fixed. In some cases, InnoDB releases the latch after unfixing the
      block.
      
      Fix:
      ====
      - InnoDB should unfix the block after releases the latch.
      
      - Add more assertion to check buffer fix while accessing the page.
      
      - Introduced block_hint structure to store buf_block_t pointer
      and allow accessing the buf_block_t pointer only by passing a
      functor. It returns original buf_block_t* pointer if it is valid
      or nullptr if the pointer become stale.
      
      - Replace buf_block_is_uncompressed() with
      buf_pool_t::is_block_pointer()
      
      This change is motivated by a change in mysql-5.7.32:
      mysql/mysql-server@46e60de444a8fbd876cc6778a7e64a1d3426a48d
      Bug #31036301 ASSERTION FAILURE: SYNC0RW.IC:429:LOCK->LOCK_WORD
      bc540b87
    • mkaruza's avatar
      MDEV-22707: galera got stuck after flush tables · 6a614d69
      mkaruza authored
      Deadlock is possible between applier thread and local committing thread with active FLUSH TABLE.
      Applier thread should skip table share checks and locks when opening table.
      Reviewed-by: default avatarJan Lindström <jan.lindstrom@mariadb.com>
      6a614d69
  2. 26 Oct, 2020 3 commits
    • Sachin Agarwal's avatar
      Bug #31228694 FTS QUERY WITH LIMIT HIT AN ASSERT · 1ff8588c
      Sachin Agarwal authored
      Problem:
      1. The server terminates abnormally when phrase search doesn't
      filter out doc_ids correctly. This problem has been fixed in bug
      2. Wrong query result: It's a regression from the bug #22709692 fix.
      This fix optimize full-text search query with limit clause.
      when FTS expression involves only union operation, we fetch only
      number of doc_ids specified with the limit clause.
      Fulltext phrase search is not an union operation and we consider
      phrase search with plugin parser a union operation.
      In phrase search with limit clause, we fetch limited doc_ids for
      each token and if any of the selected doc_id does not contain all
      tokens in correct order then we do not include that row_id in the
      result set.
      Therefore phrase search gets fewer number of rows than the qualified
      rows exist in the table.
      
      Fix:
      Added a condition that phrase search with plugin parser is not a
      union operation.
      
      RB: 24925
      Reviewed by : Annamalai Gurusami <annamalai.gurusami@oracle.com>
      
      This is a cherry-pick of
      mysql/mysql-server@5549920b7a33ef33034461d973a9ecb17ce49799
      without a test case, because the test case depends on an n-gram
      tokenizer that will be missing from MariaDB until MDEV-10267 is added.
      1ff8588c
    • Sachin Agarwal's avatar
      Bug #30933728 INNODB FTS PHRASE SEARCH HIT AN ASSERT · e391417f
      Sachin Agarwal authored
      Problem:
      In Full-text phrase search, we filter out row that do not contain
      all the tokens in the phrase.
      If we do not filter out doc_id that doesn't appear in all the
      token's doc_id lists then we hit an assert.
      
      Fix:
      if any of the token has last doc_id equal to ith doc_id of the first
      token doc_id list then filter out rest of the higher doc_ids.
      
      RB: 24909
      Reviewed by : Annamalai Gurusami <annamalai.gurusami@oracle.com>
      
      This is a cherry-pick of
      mysql/mysql-server@5aa075277dfe84a17a0331c57a6fe9b91dafb4cf
      but without a test case, because the test case depends on an n-gram
      tokenizer that will be missing from MariaDB until MDEV-10267 is added.
      e391417f
    • Oleksandr Byelkin's avatar
  3. 25 Oct, 2020 3 commits
    • Sergei Golubchik's avatar
      remove disable_abort_on_error from precedence.test · 2fdc5036
      Sergei Golubchik authored
      was left over from testing
      2fdc5036
    • Thirunarayanan Balathandayuthapani's avatar
      MDEV-23370 innodb_fts.innodb_fts_misc failed in buildbot, server crashed in... · 3ba8f619
      Thirunarayanan Balathandayuthapani authored
      MDEV-23370 innodb_fts.innodb_fts_misc failed in buildbot, server crashed in dict_table_autoinc_destroy
      
      This issue is caused by MDEV-22456 ad6171b9. Fix involves the backported version of 10.4 patch
      MDEV-22778 5f2628d1 and few parts of
      MDEV-17441 (e9a5f288).
      
      dict_table_t::stats_latch_created: Removed
      
      dict_table_t::stats_latch: make value member and always lock it for
      simplicity even for stats cloned table.
      
      zip_pad_info_t::mutex_created: Removed
      
      zip_pad_info_t::mutex: make member value instead of pointer
      
      os0once.h: Removed
      
      dict_table_remove_from_cache_low(): Ensure that fts_free() is always
      called, even if dict_mem_table_free() is deferred until
      btr_search_lazy_free().
      
      InnoDB would always zip_pad_info_t::mutex and
      dict_table_t::autoinc_mutex, even for tables are not in
      ROW_FORMAT=COMPRESSED nor include any AUTO_INCREMENT column.
      3ba8f619
    • Marko Mäkelä's avatar
      MDEV-23720 Change innodb_log_optimize_ddl=OFF by default · 987df9b3
      Marko Mäkelä authored
      MariaDB 10.2.2 inherited from MySQL 5.7 a perceived optimization
      of ALTER TABLE, which skips the writing of redo log records.
      In MDEV-16809 we introduced a parameter that allows the redo log to
      be written, so that Mariabackup would not be impacted, but we kept
      the MySQL 5.7 behaviour enabled by default (innodb_log_optimize_ddl=ON).
      
      As noted in MDEV-19747 (Deprecate and ignore innodb_log_optimize_ddl,
      implemented in MariaDB 10.5.1), omitting the redo log writes can
      actually reduce performance, because we will have to wait for the data
      pages to be written out. When the redo log file is configured to be
      large enough, it actually can be much faster to write the redo log and
      avoid the extra page flushing.
      
      When the redo log is omitted (innodb_log_optimize_ddl=ON), also
      Mariabackup may have to perform a lot of extra work, to re-copy the
      entire data file if it is possible that any log was omitted during
      the backup.
      
      Starting with MariaDB 10.5.1, the parameter innodb_log_optimize_ddl
      is deprecated and ignored. We hereby deprecate (but will not ignore)
      the parameter in earlier versions as well.
      987df9b3
  4. 24 Oct, 2020 2 commits
  5. 23 Oct, 2020 20 commits
    • Varun Gupta's avatar
      MDEV-23867: insert... select crash in compute_window_func · b94e8e4b
      Varun Gupta authored
      There are 2 issues here:
      
      Issue #1: memory allocation.
      An IO_CACHE that uses encryption uses a larger buffer (it needs space for the encrypted data,
      decrypted data, IO_CACHE_CRYPT struct to describe encryption parameters etc).
      
      Issue #2: IO_CACHE::seek_not_done
      When IO_CACHE objects are cloned, they still share the file descriptor.
      This means, operation on one IO_CACHE may change the file read position
      which will confuse other IO_CACHEs using it.
      
      The fix of these issues would be:
      Allocate the buffer to also include the extra size needed for encryption.
      Perform seek again after one IO_CACHE reads the file.
      b94e8e4b
    • Vicențiu Ciorbaru's avatar
      MDEV-23941: strings/json_lib.c:893:12: style: Suspicious condition · 5a9df155
      Vicențiu Ciorbaru authored
      The characters parsed are always ascii characters, hence one byte. This
      means that the code did not have "incorrect" logic because the boolean
      condition, if true, would also evaluate to the value of 1.
      
      The condition however is semantically wrong, assuming a length is equal
      to the condition outcome. Change paranthesis to make it also read
      according to the intent.
      5a9df155
    • Sergei Golubchik's avatar
    • Sergei Golubchik's avatar
      precedence bugfixing · 05a878c1
      Sergei Golubchik authored
      fix printing precedence for BETWEEN, LIKE/ESCAPE, REGEXP, IN
      don't use precedence for printing CASE/WHEN/THEN/ELSE/END
      
      fix parsing precedence of BETWEEN, LIKE/ESCAPE, REGEXP, IN
      support predicate arguments for IN, BETWEEN, SOUNDS LIKE, LIKE/ESCAPE,
      REGEXP
      
      use %nonassoc for unary operators
      
      fix parsing of IS TRUE/FALSE/UNKNOWN/NULL
      
      remove parser_precedence test as superseded by the precedence test
      05a878c1
    • Sergei Golubchik's avatar
      cleanup: remove redundant BANG_PRECEDENCE · 7f974e5a
      Sergei Golubchik authored
      prefix unary operators don't need to have different precedence,
      the syntax unambiguously specifies in what order they apply
      7f974e5a
    • Sergei Golubchik's avatar
      cleanup: remove redundant ADDINTERVAL_PRECEDENCE · 8c83e6ea
      Sergei Golubchik authored
      expression between INTERVAL and the unit doesns not need any
      precedence rules, there's no ambiguity there
      8c83e6ea
    • Sergei Golubchik's avatar
      A fairly exhastive test for operator precedence · 9ad4e0d6
      Sergei Golubchik authored
      some results are incorrect
      9ad4e0d6
    • Sergei Golubchik's avatar
    • Sergei Golubchik's avatar
      MDEV-23656 view: removal of parentheses results in wrong result · 2cd5df8c
      Sergei Golubchik authored
      Item_ref should have the precedence of the item it's referencing
      2cd5df8c
    • Sergei Golubchik's avatar
      MDEV-23492 performance_schema_digests_size changing from default to 5000 when... · 15f03c20
      Sergei Golubchik authored
      MDEV-23492 performance_schema_digests_size changing from default to 5000 when enabling performance_schema
      
      max allowed value limit should be larger than any auto-sized value
      15f03c20
    • Sergei Golubchik's avatar
      .gitignore · 1cabfe2c
      Sergei Golubchik authored
      1cabfe2c
    • Sergei Golubchik's avatar
      compilation failure with new C/C · e864e6b1
      Sergei Golubchik authored
      define symbols as C/C does to avoid "macro redefined" warnings
      e864e6b1
    • Dmitry Shulga's avatar
      MDEV-23926: Follow-up patch · 4654501e
      Dmitry Shulga authored
      This patch removes unnecessary #ifdefs in cmake macros CHECK_C_SOURCE_COMPILES.
      4654501e
    • Dmitry Shulga's avatar
      MDEV-23926: Follow-up patch · 58da04b2
      Dmitry Shulga authored
      This patch fixes incorrect argument type passed
      to the last parameter of getgrouplist() in cmake
      macros CHECK_C_SOURCE_COMPILES()
      58da04b2
    • Dmitry Shulga's avatar
      MDEV-23564: CMAKE failing due to deprecated Apple GSS method · 79f6f0c4
      Dmitry Shulga authored
      Some GSS-API functions like gss_import_name(), gss_release_buffer()
      used in plugin/auth_gssapi and libmariadb/plugins/auth are marked
      as deprecated in MacOS starting from  version 10.14+. It results in
      extra warnings output on server building.
      
      To eliminate extra warnings the flag '-Wno-deprecated-declarations'
      has been added to compiler invocation string for those source
      files that invoke deprecated GSS-API functions.
      79f6f0c4
    • Dmitry Shulga's avatar
    • Dmitry Shulga's avatar
      MDEV-23926: Follow-up patch to cleanup plugin/auth_pam/CMakeLists.txt code · 5e7cde41
      Dmitry Shulga authored
      This patch moves definitions of macros variables
         HAVE_PAM_SYSLOG, HAVE_PAM_EXT_H, HAVE_PAM_APPL_H, HAVE_STRNDUP
      from command line (in the form -Dmacros) to the auto-generated
      header file config_auth_pam.h
      5e7cde41
    • Dmitry Shulga's avatar
      MDEV-23926: Fix warnings generated during compilation of... · 6dc14453
      Dmitry Shulga authored
      MDEV-23926: Fix warnings generated during compilation of plugin/auth_pam/mapper/pam_user_map.c on MacOS
      
      Compiler warnings like one listed below are generated during server build on MacOS:
      
      [88%] Building C object plugin/auth_pam/CMakeFiles/pam_user_map.dir/mapper/pam_user_map.c.o
      mariadb/server-10.2/plugin/auth_pam/mapper/pam_user_map.c:87:41: error: passing
      'gid_t *' (aka 'unsigned int *') to parameter of type 'int *' converts between pointers to integer types
      with different sign [-Werror,-Wpointer-sign]
        if (getgrouplist(user, user_group_id, loc_groups, &ng) < 0)
           ^~~~~~~~~~
      /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/unistd.h:650:43: note:
        passing argument to parameter here
        int getgrouplist(const char *, int, int *, int *);
            ^
      
      In case MariaDB server is build with -DCMAKE_BUILD_TYPE=Debug it results in
      build error.
      
      The reason of compiler warnings is that declaration of the Posix C API function
      getgrouplist() on MacOS differs from declaration of getgrouplist() proposed
      by Posix.
      
      To suppress this compiler warning cmake configure was adapted to detect what
      kind of getgrouplist() function is declared on the build platform and
      set the macros HAVE_POSIX_GETGROUPLIST in case the building platform supports
      Posix compatible interface for the getgrouplist() function. Depending on
      whether this macros is set the compatible type of arguments is used to pass
      parameter values to the function.
      6dc14453
    • Vlad Lesin's avatar
      MDEV-20755 InnoDB: Database page corruption on disk or a failed file read of... · 985ede92
      Vlad Lesin authored
      MDEV-20755 InnoDB: Database page corruption on disk or a failed file read of tablespace upon prepare of mariabackup incremental backup
      
      The problem:
      
      When incremental backup is taken, delta files are created for innodb tables
      which are marked as new tables during innodb ddl tracking. When such
      tablespace is tried to be opened during prepare in
      xb_delta_open_matching_space(), it is "created", i.e.
      xb_space_create_file() is invoked, instead of opening, even if
      a tablespace with the same name exists in the base backup directory.
      
      xb_space_create_file() writes page 0 header the tablespace.
      This header does not contain crypt data, as mariabackup does not have
      any information about crypt data in delta file metadata for
      tablespaces.
      
      After delta file is applied, recovery process is started. As the
      sequence of recovery for different pages is not defined, there can be
      the situation when crypt data redo log event is executed after some
      other page is read for recovery. When some page is read for recovery, it's
      decrypted using crypt data stored in tablespace header in page 0, if
      there is no crypt data, the page is not decryped and does not pass corruption
      test.
      
      This causes error for incremental backup --prepare for encrypted
      tablespaces.
      
      The error is not stable because crypt data redo log event updates crypt
      data on page 0, and recovery for different pages can be executed in
      undefined order.
      
      The fix:
      
      When delta file is created, the corresponding write filter copies only
      the pages which LSN is greater then some incremental LSN. When new file
      is created during incremental backup, the LSN of all it's pages must be
      greater then incremental LSN, so there is no need to create delta for
      such table, we can just copy it completely.
      
      The fix is to copy the whole file which was tracked during incremental backup
      with innodb ddl tracker, and copy it to base directory during --prepare
      instead of delta applying.
      
      There is also DBUG_EXECUTE_IF() in innodb code to avoid writing redo log
      record for crypt data updating on page 0 to make the test case stable.
      
      Note:
      
      The issue is not reproducible in 10.5 as optimized DDL's are deprecated
      in 10.5. But the fix is still useful because it allows to decrease
      data copy size during backup, as delta file contains some extra info.
      The test case should be removed for 10.5 as it will always pass.
      985ede92
    • Alexey Botchkov's avatar
      MDEV-19443 server_audit plugin doesn't log proxy users. · cc1646da
      Alexey Botchkov authored
      PROXY_USER event added.
      cc1646da
  6. 22 Oct, 2020 1 commit
  7. 21 Oct, 2020 5 commits
    • Marko Mäkelä's avatar
      Merge 10.1 into 10.2 · 620ea816
      Marko Mäkelä authored
      620ea816
    • Dmitry Shulga's avatar
      MDEV-23925: Fixed warnings generated during compilation of mysys_ssl/openssl.c on MacOS · a1b6691f
      Dmitry Shulga authored
      Compiler warnings like one listed below are generated during server build on MacOS:
      In file included from server-10.2-MDEV-23564/mysys_ssl/openssl.c:33:
      In file included from /usr/local/include/openssl/evp.h:16:
      In file included from /usr/local/include/openssl/bio.h:20:
      /usr/local/include/openssl/crypto.h:206:10: warning: 'CRYPTO_cleanup_all_ex_data' macro redefined [-Wmacro-redefined]
                 ^
        /mariadb/server-10.2-MDEV-23564/include/ssl_compat.h:46:9: note: previous definition is here
                ^
      
      In case MariaDB serer is build with -DCMAKE_BUILD_TYPE=Debug it results in
      build error.
      
      The reason of compiler warnings is that header file <ssl_compat.h>
      included before the openssl system header files. File ssl_compat.h
      contains some macros with the same names as SSL API functions declared
      in the openssl system header files. It resulted in duplicate
      symbols that produces compiler warnings.
      
      To fix the issue the header file ssl_compat.h should be included
      after a line where openssl system header is included.
      a1b6691f
    • Daniel Black's avatar
      MDEV-23887: check_linker_flags correct for old cmake compatibility · b4c225ac
      Daniel Black authored
      It was only from CMake-3.14.0 that CMAKE_REQUIRED_LINK_OPTIONS
      was used in CHECK_CXX_SOURCE_COMPILES. Without this, it could be
      the case (as was on OSX) that a flag was never checked in
      CHECK_CXX_SOURCE_COMPILES, the CHECK successfully passed, but
      failed at link time.
      
      As such we use CMAKE_REQUIRED_LIBRARIES to include the flags to check
      as its compatible enough with the cmake versions for non-Windows
      compilers/linkers.
      
      Tested on x86_64 with:
      * 3.11.4
      * 3.17.4
      
      Corrects: 7473e184
      
      In the future:
      * cmake >=3.14.0 can use CMAKE_REQUIRED_LINK_OPTIONS
      * cmake >=3.18.0 can use CHECK_LINKER_FLAG (with policy CMP0057 NEW)
      (e.g: commit c7ac2deff9a2c965887dcc67cbf2a3a7c3e0123d)
      
      CMAKE_REQUIRED_LIBRARIES suggested by serg@mariadb.com
      
      Reviewed-by: anel@mariadb.org
      b4c225ac
    • Marko Mäkelä's avatar
      InnoDB 5.6.50 · 65b7f72b
      Marko Mäkelä authored
      The only applicable InnoDB change to MariaDB that was made
      between MySQL 5.6.49 and MySQL 5.6.50 is MDEV-23999.
      65b7f72b
    • Marko Mäkelä's avatar
      MDEV-23999 Potential stack overflow in InnoDB fulltext search · c7552969
      Marko Mäkelä authored
      fts_query_t::nested_sub_exp: Keep track of nested
      fts_ast_visit_sub_exp() calls.
      
      fts_ast_visit_sub_exp(): Return DB_OUT_OF_MEMORY if the
      maximum recursion depth is exceeded.
      
      This is motivated by a change in MySQL 5.6.50:
      mysql/mysql-server@e2a46b4834a0030e5380d45789772cb6beab6e92
      Bug #29929684 USING MANY NESTED ARGUMENTS WITH BOOLEAN FTS CAN LEAD
      TO TERMINATE SERVER
      c7552969
  8. 20 Oct, 2020 1 commit
    • Marko Mäkelä's avatar
      Revert MDEV-23484 Rollback unnecessarily acquires dict_operation_lock · 0049d5b5
      Marko Mäkelä authored
      In row_undo_ins_remove_clust_rec() and similar places,
      an assertion !node->trx->dict_operation_lock_mode could fail,
      because an online ALTER is not allowed to run at the same time
      while DDL operations on the table are being rolled back.
      
      This race condition would be fixed by always acquiring an InnoDB
      table lock in ha_innobase::prepare_inplace_alter_table() or
      prepare_inplace_alter_table_dict(), or by ensuring that recovered
      transactions are protected by MDL that would block concurrent DDL
      until the rollback has been completed.
      
      This reverts commit 15093639
      and commit 22c4a751.
      0049d5b5