1. 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
  2. 15 Jul, 2021 2 commits
  3. 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
  4. 13 Jul, 2021 1 commit
  5. 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
  6. 09 Jul, 2021 3 commits
  7. 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
  8. 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
  9. 05 Jul, 2021 1 commit
  10. 03 Jul, 2021 3 commits
  11. 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
  12. 30 Jun, 2021 1 commit
    • Sergei Petrunia's avatar
      MDEV-25969: Condition pushdown into derived table doesn't work if select list uses SP · eb20c91b
      Sergei Petrunia authored
      Consider a query of the form:
      
        select ... from (select item2 as COL1) as T where COL1=123
      
      Condition pushdown into derived table will try to push "COL1=123" condition
      down into table T.
      The process of pushdown involves "substituting" the item, that is,
      replacing Item_field("T.COL1") with its "producing item" item2.
      In order to use item2, one needs to clone it (call Item::build_clone).
      
      If the item is not cloneable (e.g. Item_func_sp is not), the pushdown
      process will fail and nothing at all will be pushed.
      
      Fixed by introducing transform_condition_or_part() which will try to apply
      the transformation for as many parts of condition as possible. The parts of
      condition that couldn't be transformed are dropped.
      eb20c91b
  13. 29 Jun, 2021 2 commits
  14. 28 Jun, 2021 1 commit
  15. 27 Jun, 2021 1 commit
  16. 26 Jun, 2021 2 commits
    • Igor Babaev's avatar
      8b3f816c
    • Igor Babaev's avatar
      MDEV-20411 Procedure containing CTE incorrectly stored in mysql.proc · 12c80df4
      Igor Babaev authored
      If the first token of the body of a stored procedure was 'WITH' then
      the beginning of the body was determined incorrectly and that token was
      missing in the string representing the body of the SP in mysql.proc. As a
      resultnany call of such procedure failed as the string representing the
      body could not be parsed.
      
      The patch corrects the code of the functions get_tok_start() and
      get_cpp_tok_start() of the class Lex_input_stream to make them take into
      account look ahead tokens. The patch is needed only for 10.2 as this
      problem has neen resolved in 10.3+.
      12c80df4
  17. 25 Jun, 2021 1 commit
  18. 23 Jun, 2021 3 commits
  19. 22 Jun, 2021 2 commits