1. 18 May, 2018 5 commits
    • Andrei Elkin's avatar
      MDEV-15373 engine gtid_slave_pos table name disobeys lower-case-table-names · 9df656db
      Andrei Elkin authored
      Replicated transaction extra gtid statement on slave failed to specify
      an engine gtid_slave_pos name correctly. In case  lower-case-table-names > 0
      the InnoDB table name was generated to reproduce the lower-case-table-names=0 version
      which is of mixed cases.
      In rpl.rpl_mdev12179 test run this triggered a failure to DROP table which
      was due to the innodb table handle was not closed:
       InnoDB: Waited XYZ seconds for ref-count on table: `mysql`.`gtid_slave_pos_innodb`
      on windows.
      The closing issue was caused by having the table registered twice in the table cache,
      for its lower- and mixed- case name versions. The DROP-table handler closed only
      only one of the cache item to leave the 2nd one active.
      (On Linux a failure occurs earlier at attempt to open an expected lower-cased table:
      
        Last_Error: Error during XID COMMIT: failed to update GTID state in mysql.gtid_slave_pos: 1146: Table 'mysql.gtid_slave_pos_InnoDB' doesn't exist
      
      but the table's name as the message shows is not in the right case).
      
      Fixed with consulting lower-case-table-names when the engine gtid-slave-pos table
      is created.
      Note the lower-case-table-names=a-value created table will not recognized when next
      the lower case option changes to a different value.
      In 10.4 a follow-up patch is going to lowercase gtid-slave-pos autocreated table
      at once at their origination, and a warning is issued in the 10.3 current patch.
      9df656db
    • Alexander Barkov's avatar
      MDEV-15975 PL/SQL parser does not understand historical queries · 2a33d248
      Alexander Barkov authored
      Merging the following features from sql_yacc.yy to sql_yacc_ora.yy:
      
      - system versioning
      - column compression
      - table value constructor
      - spatial predicate WITHIN
      - DELETE_DOMAIN_ID
      2a33d248
    • sachin's avatar
      MDEV-14853 Grant does not work correctly when table contains... · 395c8ca7
      sachin authored
      SYSTEM_INVISIBLE or COMPLETELY_INVISIBLE
      
      This commit does multiple things to solve this mdev
      1st add field into the parameter of check_column_grant_in_table_ref, so that
      we can find out field invisibility.
      2nd If field->invisible >= INVISIBLE_SYSTEM skip access check and simple
      grant access.
      395c8ca7
    • Alexander Barkov's avatar
      ff0e9b2f
    • Alexander Barkov's avatar
      sql_yacc_ora.yy: mering MDEV-13384 "window" seems like a reserved column name... · fdcc9514
      Alexander Barkov authored
      sql_yacc_ora.yy: mering MDEV-13384 "window" seems like a reserved column name but it's not listed as one
      
      Merging MDEV-13384 changes from sql_yacc.yy to sql_yacc_ora.yy
      fdcc9514
  2. 17 May, 2018 16 commits
  3. 16 May, 2018 17 commits
    • Monty's avatar
      MDEV-14669 Assertion `file->trn == trn' failed in ha_maria::start_stmt · c2352c45
      Monty authored
      Can't repeat issue so I just added the test case
      c2352c45
    • Alexander Barkov's avatar
      Token precedence cleanup in *.yy · 48d70388
      Alexander Barkov authored
      We'll be fixing soon shift-reduce conflicts introduced in the new
      10.3 syntax (see MDEV-15818 for details) by defining precedence for
      a number of tokens (e.g. TIMESTAMP, TRANSACTION_SYM, TEXT_STRING)
      and adding "%prec" directives.
      
      Before doing this, it's better to have the existing precedences set properly,
      for easier readability and maintainability.
      
      Details:
      - Changing precedence of NOT to its proper position (between AND and IS).
        It was wrong. It worked fine only because the relevant grammar reside
        in different separate rules (expr and predicate).
      
      - Moving NOT2_SYM and BINARY to the same line with NEG and ~
        It worked fine because operators !, BINARY, ~ do not conflict
        to each other.
      
      - Fixing associativity of NOT_SYM, NOT2_SYM, BINARY, COLLATE_SYM
        from "right" to "left". They are not dyadic (operate on a single expression
        only). So "%left" or "%right" is needed only to set precedence,
        while associativity does not matter.
        Note, it would be better to use "%precedence" for these tokens
        instead of "%left" though, but we use an old version of Bison on windows,
        which may not support %precedence yet.
      
      This patch does not change behavior. The generated sql_yacc.cc and
      sql_yacc_ora.cc are exactly the same before and after this change.
      48d70388
    • Marko Mäkelä's avatar
      MDEV-13779 InnoDB fails to shut down purge workers, causing hang · a4e78007
      Marko Mäkelä authored
      srv_purge_coordinator_thread(): Wait for all purge worker threads
      to actually exit. An analysis of a core dump of a hung 10.3 server
      revealed that one srv_worker_thread did not exit, even though the
      purge coordinator had exited. This caused kill_server_thread and
      mysqld_main to wait indefinitely. The main InnoDB shutdown was
      never called, because unireg_end() was never called.
      a4e78007
    • Alexander Barkov's avatar
    • Thirunarayanan Balathandayuthapani's avatar
      MDEV-13626 Merge InnoDB test cases from MySQL 5.7 · ebc24950
      Thirunarayanan Balathandayuthapani authored
      Imported the following test case from mysql to MariaDB
      
      1) innodb.alter_kill
      2) innodb.alter_foreign_crash
      3) innodb.alter_rename_files
      4) innodb.analyze_table
      5) Appended the case in innodb-online-alter-gis
      ebc24950
    • Shaohua Wang's avatar
      BUG#22385442 - INNODB: DIFFICULT TO FIND FREE BLOCKS IN THE BUFFER POOL · a54b581d
      Shaohua Wang authored
      Problem:
      We keep pinning pages in dict_stats_analyze_index_below_cur(),
      but doesn't release these pages. When we have a relative small
      buffer pool size, and big innodb_stats_persistent_sample_pages,
      there will be no free pages for use.
      
      Solution:
      Use a separate mtr in dict_stats_analyze_index_below_cur(),
      and commit mtr before return.
      Reviewed-by: default avatarJimmy Yang <jimmy.yang@oracle.com>
      RB: 11362
      a54b581d
    • Thirunarayanan Balathandayuthapani's avatar
    • Marko Mäkelä's avatar
      Bug#21628087 innodb_log_checkpoint_now not fully compatible with WL#7142 · 0ba299da
      Marko Mäkelä authored
      In debug builds of MySQL, there is an configuration variable
      that allows an InnoDB log checkpoint to be initiated:
      
      SET GLOBAL innodb_log_checkpoint_now=ON;
      
      Setting this variable while a table-rebuilding ALTER TABLE is executing
      may result in an infinite loop.
      
      checkpoint_now_set(): Account for log_sys->append_on_checkpoint->size().
      Note that this function contains race conditions, because it is accessing
      fields of log_sys without holding log_sys->mutex. We think that this is
      acceptable, because this variable only exists for debugging purposes, in
      debug builds of MySQL.
      
      RB: 9947
      Reviewed-by: default avatarSunny Bains <sunny.bains@oracle.com>
      0ba299da
    • Thirunarayanan Balathandayuthapani's avatar
      Move the test case from innodb.alter_page_size · be465cfb
      Thirunarayanan Balathandayuthapani authored
      to innodb.innodb-online-alter-gis
      be465cfb
    • Annamalai Gurusami's avatar
      Bug #19077964 ASSERT PAGE_SIZE.EQUALS_TO SPACE_PAGE_SIZE BTR_COPY_BLOB_PREFIX · 21e02b2c
      Annamalai Gurusami authored
      Problem:
      
      The function row_build_index_entry_low() takes a dtuple_t object ('row') and
      dict_index_t object ('index') as input and returns a new dtuple_t object
      ('entry') as output.  The dtuple_t object 'row' that is given as input might
      have been constructed from a different dict_index_t object (!= index).  So
      when accessing the externally stored data of the given 'row' we need to make
      use of the correct index object.
      
      Solution:
      
      Store the page size information in the associated row_ext_t object.
      
      rb#6086 approved by Vasil and Jimmy.
      21e02b2c
    • Thirunarayanan Balathandayuthapani's avatar
    • Annamalai Gurusami's avatar
      Bug #20476395 DICT_LOAD_FOREIGNS() FAILED IN COMMIT_INPLACE_ALTER_TABLE · a1f392a9
      Annamalai Gurusami authored
      Problem:
      
      Suppose there are two tables in the database related through a foreign key
      constraint - the parent table and the child table.  Suppose there is an ALTER
      TABLE on the child table which gets interrupted in such a way that the child
      table is not available any more.
      
      After crash recovery, an ALTER TABLE on the parent table identifies that its
      foreign keys cannot be loaded.  This results in an error and a debug assert.
      
      Solution:
      
      Remove the debug assert and change error to a warning.
      
      rb#8658 approved by Marko.
      a1f392a9
    • Thirunarayanan Balathandayuthapani's avatar
      Adjust the tests for MariaDB. · 91659983
      Thirunarayanan Balathandayuthapani authored
      New added test case: alter_kill in innodb suite.
      91659983
    • Marko Mäkelä's avatar
      Bug#19330255 WL#7142 - CRASH DURING ALTER TABLE LEADS TO DATA DICTIONARY INCONSISTENCY · ac2410f6
      Marko Mäkelä authored
      The server crashes on a SELECT because of space id mismatch. The
      mismatch happens if the server crashes during an ALTER TABLE.
      
      There are actually two cases of inconsistency, and three fixes needed
      for the InnoDB problems.
      
      We have dictionary data (tablespace or table name) in 3 places:
      
      (a) The *.frm file is for the old table definition.
      (b) The InnoDB data dictionary is for the new table definition.
      (c) The file system did not rename the tablespace files yet.
      
      In this fix, we will not care if the *.frm file is in sync with the
      InnoDB data dictionary and file system. We will concentrate on the
      mismatch between (b) and (c).
      
      Two scenarios have been mentioned in this bug report. The simpler one
      first:
      
      1. The changes to SYS_TABLES were committed, and MLOG_FILE_RENAME2
      records were written in a single mini-transaction commit.
      The files were not yet renamed in the file system.
      2a. The server is killed, without making a log checkpoint.
      3a. The server refuses to start up, because replaying MLOG_FILE_RENAME2
      fails.
      
      I failed to repeat this myself. I repeated step 3a with a saved
      dataset. The problem seems to be that MLOG_FILE_RENAME2 replay is
      incorrectly being skipped when there is no page-redo log or
      MLOG_FILE_NAME record for the old name of the tablespace.
      
      FIX#1: Recover the id-to-name mapping also from MLOG_FILE_RENAME2
      records when scanning the redo log. It is not necessary to write
      MLOG_FILE_NAME records in addition to MLOG_FILE_RENAME2 records for
      renaming tablespace files.
      
      The scenario in the original Description involves a log checkpoint:
      1. The changes to SYS_TABLES were committed, and MLOG_FILE_RENAME2
      records were written in a single mini-transaction commit.
      2. A log checkpoint and a server kill was injected.
      3. Crash recovery will see no records (other than the MLOG_CHECKPOINT).
      4. dict_check_tablespaces_and_store_max_id() will emit a message about
      a non-found table #sql-ib22*.
      5. A mismatch is triggering the assertion failure.
      
      In my test, at step 4 the SYS_TABLES root page (0:8) contains these 3
      records right before the page supremum:
      * delete-marked (committed) name=#sql-ib21* record, with space=10.
      * name=#sql-ib22*, space=9.
      * name=t1, space=10.
      space=10 is the rebuilt table (#sql-ib21*.ibd in the file system).
      space=9 is the old table (t1.ibd in the file system).
      
      The function dict_check_tablespaces_and_store_max_id() will enter
      t1.ibd with space_id=10 into the fil_system cache without noticing
      that t1.ibd contains space_id=9, because it invokes
      fil_open_single_table_tablespace() with validate=false.
      
      In MySQL 5.6, the space_id from all *.ibd files are being read when
      the redo log checkpoint LSN disagrees with the FIL_PAGE_FILE_FLUSH_LSN
      in the system tablespace. This field is only updated during a clean
      shutdown, after performing the final log checkpoint.
      
      FIX#2: dict_check_tablespaces_and_store_max_id() should pass
      validate=true to fil_open_single_table_tablespace() when a non-clean
      shutdown is detected, forcing the first page of each *.ibd file to be
      read. (We do not want to slow down startup after a normal shutdown.)
      
      With FIX#2, the SELECT would fail to find the table. This would
      introduce a regression, because before WL#7142, a copy of the table
      was accessible after recovery.
      
      FIX#3: Maintain a list of MLOG_FILE_RENAME2 records that have been
      written to the redo log, but not performed yet in the file system.
      When performing a checkpoint, re-emit these records to the redo
      log. In this way, a mismatch between (b) and (c) should be impossible.
      
      fil_name_process(): Refactored from fil_name_parse(). Adds an item to
      the id-to-filename mapping.
      
      fil_name_parse(): Parses and applies a MLOG_FILE_NAME,
      MLOG_FILE_DELETE or MLOG_FILE_RENAME2 record. This implements FIX#1.
      
      fil_name_write_rename(): A wrapper function for writing
      MLOG_FILE_RENAME2 records.
      
      fil_op_replay_rename(): Apply MLOG_FILE_RENAME2 records. Replaces
      fil_op_log_parse_or_replay(), whose logic was moved to fil_name_parse().
      
      fil_tablespace_exists_in_mem(): Return fil_space_t* instead of bool.
      
      dict_check_tablespaces_and_store_max_id(): Add the parameter
      "validate" to implement FIX#2.
      
      log_sys->append_on_checkpoint: Extra log records to append in case of
      a checkpoint. Needed for FIX#3.
      
      log_append_on_checkpoint(): New function, to update
      log_sys->append_on_checkpoint.
      
      mtr_write_log(): New function, to append mtr_buf_t to the redo log.
      
      fil_names_clear(): Append the data from log_sys->append_on_checkpoint
      if needed.
      
      ha_innobase::commit_inplace_alter_table(): Add any MLOG_FILE_RENAME2
      records to log_sys->append_on_checkpoint(), and remove them once the
      files have been renamed in the file system.
      
      mtr_buf_copy_t: A helper functor for copying a mini-transaction log.
      
      rb#6282 approved by Jimmy Yang
      ac2410f6
    • Marko Mäkelä's avatar
      MDEV-16168: Resurrect the record MLOG_UNDO_INIT · 66360506
      Marko Mäkelä authored
      While the record type MLOG_UNDO_INIT feels redundant, it does save
      redo log volume, and subtle changes to redo log volume appear to
      make a big difference for the log_sys.mutex contention.
      
      trx_undo_parse_page_init(): Allow type==0, which is what we write
      since MDEV-12288. Parse type in a simpler way; it always was written
      as a single byte.
      
      trx_undo_page_init(): Write a MLOG_UNDO_INIT record.
      66360506
    • Varun Gupta's avatar
      MDEV-14695: Assertion `n < m_size' failed in Bounds_checked_array<Element_type>::operator · 6f4534e6
      Varun Gupta authored
      In this issue we hit the assert because we are adding addition fields to the field JOIN::all_fields list. This
      is done because  HEAP tables can't index BIT fields so  we need to use an additional hidden field for grouping because later it will be
      converted to a LONG field. Original field will remain of the BIT type and will be returned. This happens when we convert DISTINCT to
      GROUP BY.
      
      The solution is to take into account the number of such hidden fields that would be added to the field
      JOIN::all_fields list while calculating the size of the ref_pointer_array.
      6f4534e6
    • Alexey Botchkov's avatar
      MDEV-15813 ASAN use-after-poison in hp_hashnr upon HANDLER READ on a versioned HEAP table. · a639eff5
      Alexey Botchkov authored
      Check index capabilities before executing HANDLER READ command.
      a639eff5
  4. 15 May, 2018 2 commits
    • Elena Stepanova's avatar
      d9f9cd1a
    • Marko Mäkelä's avatar
      MDEV-16159 Use atomic memory access for purge_sys · cd15e764
      Marko Mäkelä authored
      Thanks to Sergey Vojtovich for feedback and many ideas.
      
      purge_state_t: Remove. The states are replaced with
      purge_sys_t::enabled() and purge_sys_t::paused() as follows:
      PURGE_STATE_INIT, PURGE_STATE_EXIT, PURGE_STATE_DISABLED: !enabled().
      PURGE_STATE_RUN, PURGE_STATE_STOP: paused() distinguishes these.
      
      purge_sys_t::m_paused: Renamed from purge_sys_t::n_stop.
      Protected by atomic memory access only, not purge_sys_t::latch.
      
      purge_sys_t::m_enabled: An atomically updated Boolean that
      replaces purge_sys_t::state.
      
      purge_sys_t::running: Remove, because it duplicates
      srv_sys.n_threads_active[SRV_PURGE].
      
      purge_sys_t::running(): Accessor for srv_sys.n_threads_active[SRV_PURGE].
      
      purge_sys_t::stop(): Renamed from trx_purge_stop().
      
      purge_sys_t::resume(): Renamed from trx_purge_run().
      Do not acquire latch; solely rely on atomics.
      
      purge_sys_t::is_initialised(), purge_sys_t::m_initialised: Remove.
      
      purge_sys_t::create(), purge_sys_t::close(): Instead of invoking
      is_initialised(), check whether event is NULL.
      
      purge_sys_t::event: Move before latch, so that fields that are
      protected by latch can reside on the same cache line with latch.
      
      srv_start_wait_for_purge_to_start(): Merge to the only caller srv_start().
      cd15e764