1. 21 Jul, 2021 1 commit
  2. 20 Jul, 2021 9 commits
    • Igor Babaev's avatar
      MDEV-25565 Crash on 2-nd execution of SP/PS for query calculating window functions · 4c387945
      Igor Babaev authored
                 from view
      
      A crash of the server happened when executing a stored procedure whose the
      only query calculated window functions over a mergeable view specified
      as a select from non-mergeable view. The crash could be reproduced if
      the window specifications of the window functions were identical and both
      contained PARTITION lists and ORDER BY lists. A crash also happened on
      the second execution of the prepared statement created for such query.
      If to use derived tables or CTE instead of views the problem still
      manifests itself crashing the server.
      
      When optimizing the window specifications of a window function the
      server can substitute the partition lists and the order lists for
      the corresponding lists from another window specification in the case
      when the lists are identical. This substitution is not permanent and should
      be rolled back before the second execution. It was not done and this
      ultimately led to a crash when resolving the column names at the second
      execution of SP/PS.
      4c387945
    • Igor Babaev's avatar
      MDEV-26025 Server crashes while executing query with CTE in PS/SP · 872422dc
      Igor Babaev authored
      This bug appeared after the patch for bug MDEV-23886. Due to this bug
      execution of queries with CTEs used the same CTE at least twice via
      prepared statements or with stored procedures caused crashes of the server.
      It happened because the select created for any of not the first usage of
      a CTE erroneously was not included into all_selects_list.
      This patch corrects the patch applied to fix the bug MDEV-26108.
      
      Approved by Oleksandr Byelkin <sanja@mariadb.com>
      872422dc
    • Eugene Kosov's avatar
      7da1cfb0
    • Eugene Kosov's avatar
      MDEV-25361 innochecksum must not report errors for freed pages · 1918bdf3
      Eugene Kosov authored
      Store and maintain xdes pages always. And doesn't verify checksums for
      freed pages.
      
      innochecksum can work only with the first space file of multiple ones.
      Tell about it and abort in case of not the first file.
      1918bdf3
    • Jagdeep Sidhu's avatar
      Fix switch case statement in trx_flush_log_if_needed_low() · 5f8651ac
      Jagdeep Sidhu authored
      In commit 2e814d47 on MariaDB 10.2
      the switch case statement in trx_flush_log_if_needed_low() regressed.
      
      Since 10.2 this code was refactored to have switches in descending
      order, so value of 3 for innodb_flush_log_at_trx_commit is behaving
      the same as value of 2, that is no FSYNC is being enforced during
      COMMIT phase. The switch should however not be empty and cases 2 and 3
      should not have the identical contents.
      
      As per documentation, setting innodb_flush_log_at_trx_commit to 3
      should do FSYNC to disk if innodb_flush_log_at_trx_commit is set to 3.
      This fixes the regression so that the switch statement again does
      what users expect the setting should do.
      
      All new code of the whole pull request, including one or several files
      that are either new files or modified ones, are contributed under the
      BSD-new license. I am contributing on behalf of my employer Amazon Web
      Services, Inc.
      5f8651ac
    • Vladislav Vaintroub's avatar
      fix libmariadb compilation, on GCC. · 1cfcf32c
      Vladislav Vaintroub authored
      1cfcf32c
    • Sergei Golubchik's avatar
      MDEV-20787 Script dgcov.pl does not work · ce2a2bff
      Sergei Golubchik authored
      When building with `make` gcov files use full path names,
      when building with `ninja` gcov files use paths relative to the source root
      
      in gcov_one_file() the current directory is somewhere under CMakeFiles/,
      so if a file exists in the specified location, this location
      must've been a full path name.
      ce2a2bff
    • Sergei Golubchik's avatar
      MDEV-20787 Script dgcov.pl does not work · 6638cf2e
      Sergei Golubchik authored
      For every file.gcda file, gcov <7.x created file.cc.gcda.gcov.
      While gcov 7.x and 8.x create file.cc.gcov
      And sometimes otherfile.h.gcov or otherfile.ic.gcov, for included files.
      
      (gcov 9.x+ creates .json.gz files, see MDEV-26102)
      
      So, we use `gcov -l` that will create file.cc.gcda##file.cc.gcov,
      file.cc.gcda##otherfile.h.gcov, etc. And we search and parse all
      those file.cc.gcda*.gcov files.
      6638cf2e
    • Vladislav Vaintroub's avatar
      Update libmariadb · 0151590d
      Vladislav Vaintroub authored
      0151590d
  3. 19 Jul, 2021 3 commits
    • Igor Babaev's avatar
      MDEV-26135 Assertion failure when executing PS with a hanging recursive CTE · f0533497
      Igor Babaev authored
      The bug affected execution of queries with With clauses containing so-called
      hanging recursive CTEs in PREPARE mode. A CTE is hanging if it's not used
      in the query. Preparation of a prepared statement from a query with a
      hanging CTE caused a leak in the server and execution of this prepared
      statement led to an assert failure of the server built in the debug mode.
      This happened because the units specifying recursive CTEs erroneously were
      not cleaned up if those CTEs were hanging.
      The patch enforces cleanup of hanging recursive CTEs in the same way as
      other hanging CTEs.
      
      Approved by dmitry.shulga@mariadb.com
      f0533497
    • Sergei Golubchik's avatar
      fix mysqld_safe --help · b7886f55
      Sergei Golubchik authored
      put defaults* options first (and together).
      list --defaults-group-suffix too
      b7886f55
    • Dmitry Shulga's avatar
      MDEV-26145: Incorrect metadata is sent on running query with union in PS mode · bab989ab
      Dmitry Shulga authored
      Test cases like the following one produce different result sets if it's run
      with and without th option --ps-protocol.
      
      CREATE TABLE t1(a INT);
      --enable_metadata
      (SELECT MAX(a) FROM t1) UNION (SELECT MAX(a) FROM t1);
      --disable_metadata
      DROP TABLE t1;
      
      Result sets differ in metadata for the query
        (SELECT MAX(a) FROM t1) UNION (SELECT MAX(a) FROM t1);
      
      The reason for different content of query metadata is that for queries
      with union the items being created on JOIN preparing phase is placed into
      item_list from SELECT_LEX_UNIT whereas for queries without union item_list
      from SELECT_LEX is used instead.
      bab989ab
  4. 16 Jul, 2021 1 commit
    • Nikita Malyavin's avatar
      MDEV-23597 Assertion `marked_for_read()' failed while evaluating DEFAULT · c47e4aab
      Nikita Malyavin authored
      The columns that are part of DEFAULT expression were not read-marked
      in statements like UPDATE...SET b=DEFAULT.
      
      The problem is `F(DEFAULT)` expression depends of the left-hand side of an
      assignment. However, setup_fields accepts only right-hand side value.
      Neither Item::fix_fields does.
      
      Suchwise, b=DEFAULT(b) works fine, because Item_default_field has
      information on what field it is default of:
          if (thd->mark_used_columns != MARK_COLUMNS_NONE)
            def_field->default_value->expr->update_used_tables();
      
      in Item_default_value::fix_fields().
      
      It is not reasonable to pass a left-hand side to Item:fix_fields, because
      the case is rare, so the rewrite
        b= F(DEFAULT)  ->  b= F(DEFAULT(b))
      
      is made instead.
      
      Both UPDATE and multi-UPDATE are affected, however any form of INSERT
      is not: it marks all the fields in DEFAULT expressions for read in
      TABLE::mark_default_fields_for_write().
      c47e4aab
  5. 15 Jul, 2021 2 commits
  6. 14 Jul, 2021 1 commit
    • Nayuta Yanagisawa's avatar
      MDEV-25985 Spider handle ">=" as ">" in some cases · 0f6e170c
      Nayuta Yanagisawa authored
      The function spider_db_append_key_where_internal() converts
      HA_READ_AFTER_KEY to '>'. The conversion seems to be correct for
      single-column indexes because HA_READ_AFTER_KEY means "read the
      key after the provided value."
      
      However, how about multi-column indexes? Assume that there is a
      multi-column index on c1 and c2 and we search with the condition
      'c1 >= 100 AND c2 > 200'. The key_range.flag corresponds to the
      search condition could be HA_READ_AFTER_KEY. In such a case,
      we could not simply convert HA_READ_AFTER_KEY to '>'.
      
      The correct conversion is to convert HA_READ_AFTER_KEY to '>'
      only for the last column in key_part_map and to convert
      HA_READ_AFTER_KEY to '>=' for the other column.
      
      The similar discussion also applies to the conversion from
      key_range.flag to a sign of inequality.
      0f6e170c
  7. 13 Jul, 2021 1 commit
  8. 12 Jul, 2021 6 commits
    • Nikita Malyavin's avatar
      MDEV-18249 ASSERT_COLUMN_MARKED_FOR_READ failed in ANALYZE TABLE · 191cae2d
      Nikita Malyavin authored
      The problem is the same as in MDEV-18166: columns in virtual field
      expression are not marked for read, while the field itself does.
      
      field->register_field_in_read_map() should be called for read-marking all
      fields.
      
      The test is reproduced only in 10.4+, however the fix is applicable to
      10.2+.
      191cae2d
    • Nikita Malyavin's avatar
      follow-up MDEV-18166: rename marking functions · f64a4f67
      Nikita Malyavin authored
      Reformulate mark_columns_used_by_index* function family in a more laconic
      way:
      
      mark_columns_used_by_index -> mark_index_columns
      mark_columns_used_by_index_for_read_no_reset -> mark_index_columns_for_read
      mark_columns_used_by_index_no_reset -> mark_index_columns_no_reset
      static mark_index_columns -> do_mark_index_columns
      f64a4f67
    • Nikita Malyavin's avatar
      [2/2] MDEV-18166 ASSERT_COLUMN_MARKED_FOR_READ failed on tables with vcols · 0f6a5b43
      Nikita Malyavin authored
      Several different test cases were failing under the same reason: the
      fields in a vcol expression were not marked during marking columns of a key
      contatining virtual column for read.
      
      Fix: make marking columns of a key for read a special case where
      register_field_in_read_map() is done instead of plain bitmap_set_bit().
      
      Some test cases are only reproducible in 10.4+, but the fix is applicable
      to 10.2+
      0f6a5b43
    • Nikita Malyavin's avatar
      [1/2] MDEV-18166 ASSERT_COLUMN_MARKED_FOR_READ failed on tables with vcols · 7d9ba57d
      Nikita Malyavin authored
      This is a 10.2+ part of a jira task
      
      The two bugs regarding virtual column marking have been fixed:
      
      1. UPDATE of a partitioned table, where the optimizer has chosen a
       secondary index to make a filesort;
      2. INSERT into a table with a nonblob field generated from a blob, with
       binlog enabled and binlog_row_image=noblob.
      
      3. DELETE from a view on a table with virtual column.
      
      Generally the assertion happens from update_virtual_fields() call
      
      These bugs are root-caused by missing field marking for dependant fields
      of a virtual column.
      
      Therefore a fix is: mark all the fields involved in the vcol expression by
      calling field->register_field_in_read_map() instead just setting a single
      bit.
      
      3 was reproducible only on 10.4+, however the problem might has just been
      invisible in the earlier versions. The fix is applicable to 10.2-10.3 as
      well.
      7d9ba57d
    • Nikita Malyavin's avatar
      MDEV-17890 Server crash on DELETE with YEAR field with truncated expr · 0e9ba176
      Nikita Malyavin authored
      The failing reason was inconsistent truncation rules: the value of virtual
      column could have been evaluated to '2000' sometimes instead of '0000' for
      value 'a'.
      
      The reason why `c YEAR AS ('aaaa')` was not evaluated same is that len=4 is
      a special case insidew Field_year::store.
      
      The correct fix is: always evaluate a bad value to 0000 instead 2000.
      The truncated values should be evaluated as usual.
      
      $support_virtual_index is finally changed to 1 in gcol.gcol_ins_upd_innodb,
      which is also enough for testing.
      
      The test from original bug report is also added.
      0e9ba176
    • Robert Bindar's avatar
      MDEV-21206 Can't link zlib library during DBD::mysql installation · b0827168
      Robert Bindar authored
      mysql_config should never return -lzlib as linking flag.
      Clients trying to link against mariadb that use the output of
      mysql_config experience linking error because we return -lzlib
      when we don't ship any libzlib.a in our binary tarballs, bundled
      zlib static library is already linked.
      b0827168
  9. 09 Jul, 2021 3 commits
  10. 08 Jul, 2021 1 commit
    • Igor Babaev's avatar
      MDEV-26095 Infinite recursion when processing embedded recursive CTE · 83e442fc
      Igor Babaev authored
                 with missing RECURSIVE
      
      If a table reference r used inthe specification of a CTE whose definition
      is contained in the WITH clause where RECURSIVE is omitted then this table
      reference cannot be considered as a recursive table reference even if it is
      used in the query that specifies CTE whose name is r. It can be considered
      only as a reference to an embedding CTE or to a temporary table or to
      a base table/view. If there is no such object with name r then an error
      message must be reported.
      This patch fixes the code that actually in some cases resolved r as a
      reference to the CTE whose specification contained r if its name was r
      in spite of the fact that r was not considered as a recursive CTE.
      This happened in the cases when the definition of r was used in the
      specification of another CTE. Such wrong name resolution for r led to an
      infinite recursive invocations of the parser that ultimately crashed the
      server.
      This bug is a result of the fix for mdev-13780 that was not quite correct.
      
      Approved by Oleksandr Byelkin <sanja@mariadb.com>
      83e442fc
  11. 06 Jul, 2021 3 commits
    • Sergei Golubchik's avatar
      MDEV-25802 mtr: race condition if the test quickly restarts twice · 621fae3c
      Sergei Golubchik authored
      part II
      
      need to tell SafeProcess not to collect the exited mysqld
      in sleep_until_file_created(), so that it would be found in the
      later wait_any_timeout() in run_testcase()
      
      Removed a strange condition in SafeProcess::wait_one()
      that treated return value of -1 from waitpid() as "process exists"
      instead of as "no such child process" (see `perldoc -f waitpid`)
      621fae3c
    • Sergei Golubchik's avatar
      MDEV-25802 mtr: race condition if the test quickly restarts twice · 1223cfe1
      Sergei Golubchik authored
      expect file is always removed before starting a server.
      So if it exists here, it means the server started successfully,
      mysqltest continued executing the test, created a new expect file,
      and shut down the server. All while we were waiting for the server
      to start.
      
      In other words, if the expect file exists, the server did actually start.
      Even if it isn't running now.
      
      This fixes occasional failures of innodb.log_corruption (in 10.6)
      1223cfe1
    • Sergei Golubchik's avatar
      MDEV-25857 MTR should report at least last test that was executed in case of... · 6a466db0
      Sergei Golubchik authored
      MDEV-25857 MTR should report at least last test that was executed in case of shutdown and not-completed
      
      * return a success/failure value from mysqld_start()
        and don't error out / exit in mysqld_start(), the caller will do
      * pass the correct $mysqld object into check_expected_crash_and_restart()
        instead of searching for it inside. Search in the caller
      * so that when a failed restart changes $mysqld->{proc}, mtr would
        still detect it as a failed mysqld (by updating $proc to match)
      
      also: log the server command line into the server error log
      6a466db0
  12. 05 Jul, 2021 1 commit
  13. 03 Jul, 2021 3 commits
  14. 02 Jul, 2021 5 commits
    • Sergei Golubchik's avatar
      MDEV-26081 set role crashes when a hostname cannot be resolved · 7c02e871
      Sergei Golubchik authored
      host can be NULL
      7c02e871
    • Eugene Kosov's avatar
      submodules.cmake: add missing --depth=1 · ffe744e7
      Eugene Kosov authored
      ffe744e7
    • Marko Mäkelä's avatar
      MDEV-26077 Assertion err != DB_DUPLICATE_KEY or unexpected ER_TABLE_EXISTS_ERROR · 2bf6f2c0
      Marko Mäkelä authored
      This is a backport of 161e4bfa.
      
      trans_rollback_to_savepoint(): Only release metadata locks (MDL)
      if the storage engines agree, after the changes were already rolled back.
      
      Ever since commit 3792693f
      and mysql/mysql-server@55ceedbc3feb911505dcba6cee8080d55ce86dda
      we used to cheat here and always release MDL if the binlog is disabled.
      
      MDL are supposed to prevent race conditions between DML and DDL also
      when no replication is in use. MDL are supposed to be a superset of
      InnoDB table locks: InnoDB table lock may only exist if the thread
      also holds MDL on the table name.
      
      In the included test case, ROLLBACK TO SAVEPOINT would wrongly release
      the MDL on both tables and let ALTER TABLE proceed, even though the DML
      transaction is actually holding locks on the table.
      
      Until commit 1bd681c8 (MDEV-25506)
      in MariaDB 10.6, InnoDB would often work around the locking violation
      in a blatantly non-ACID way: If locks exist on a table that is being
      dropped (in this case, actually a partition of a table that is being
      rebuilt by ALTER TABLE), InnoDB could move the table (or partition)
      into a queue, to be dropped after the locks and references had been
      released. If the lock is not released and the original copy of the
      table not dropped quickly enough, a name conflict could occur on
      a subsequent ALTER TABLE.
      
      The scenario of commit 3792693f
      is unaffected by this fix, because mysqldump
      would use non-locking reads, and the transaction would not be holding
      any InnoDB locks during the execution of ROLLBACK TO SAVEPOINT.
      MVCC reads inside InnoDB are only covered by MDL and page latches,
      not by any table or record locks.
      
      FIXME: It would be nice if storage engines were specifically asked
      which MDL can be released, instead of only offering a choice
      between all or nothing. InnoDB should be able to release any
      locks for tables that are no longer in trx_t::mod_tables, except
      if another transaction had converted some implicit record locks
      to explicit ones, before the ROLLBACK TO SAVEPOINT had been completed.
      
      Reviewed by: Sergei Golubchik
      2bf6f2c0
    • Marko Mäkelä's avatar
      MDEV-25129 fixup: Adjust test result · 5a2b6258
      Marko Mäkelä authored
      Fixup for commit 768c5188
      5a2b6258
    • Daniel Black's avatar
      MDEV-25129 postfix for windows · c22f7f23
      Daniel Black authored
      C:\projects\server\sql\sql_show.cc(7913): error C2220: warning treated as error - no 'object' file generated [C:\projects\server\win_build\sql\sql.vcxproj]
      C:\projects\server\sql\sql_show.cc(7913): warning C4267: 'initializing': conversion from 'size_t' to 'uint', possible loss of data [C:\projects\server\win_build\sql\sql.vcxproj]
      
      caused by 768c5188
      c22f7f23