1. 29 Jan, 2018 7 commits
    • Marko Mäkelä's avatar
      MDEV-15090 Reduce the overhead of writing undo log records · f74023b9
      Marko Mäkelä authored
      Remove unnecessary repeated lookups for undo pages.
      
      trx_undo_assign(), trx_undo_assign_low(), trx_undo_seg_create(),
      trx_undo_create(): Return the undo log block to the caller.
      f74023b9
    • Marko Mäkelä's avatar
      MDEV-15090 Reduce the overhead of writing undo log records · 5d3c3b49
      Marko Mäkelä authored
      Inside InnoDB, each mini-transaction that generates any redo log records
      will acquire log_sys->mutex during mtr_t::commit() in order to copy the
      records into the global log_sys->buf for writing into the redo log file.
      
      For single-row transactions, this incurs quite a bit of overhead.
      We would use two mini-transactions for writing a record into a
      freshly updated undo log page. (Only if the undo record will
      not fit in that page, then we will have to commit and restart
      the mini-transaction.)
      
      trx_undo_assign(): Assign undo log for a persistent transaction,
      or return the already assigned one.
      
      trx_undo_assign_low(): Assign undo log for an operation on a
      persistent or temporary table.
      
      trx_undo_create(), trx_undo_reuse_cached(): Remove redundant parameters.
      Merge the logic from trx_undo_mark_as_dict_operation().
      5d3c3b49
    • Marko Mäkelä's avatar
      4981f95f
    • Michael Widenius's avatar
      Fixed failing tests rpl_semi_sync_skip_repl.test · a7e12fd4
      Michael Widenius authored
      Removed not used have_semisync_plugin.inc
      a7e12fd4
    • Alexander Barkov's avatar
    • Alexander Barkov's avatar
      MDEV-15107 Add virtual Field::sp_prepare_and_store_item(), make sp_rcontext... · b12430ad
      Alexander Barkov authored
      MDEV-15107 Add virtual Field::sp_prepare_and_store_item(), make sp_rcontext symmetric for scalar and ROW
      
      After MDEV-14212, the Virtual_tmp_table instance that stores a ROW
      variable elements is accessible from the underlying Field_row
      (rather than Item_field_row).
      
      This patch makes some further changes by moving the code from
      sp_instr_xxx, sp_rcontext, Item_xxx to Virtual_tmp_table and Field_xxx.
      
      The data type specific code (scalar vs ROW) now resides in
      a new virtual method Field_xxx::sp_prepare_and_store_item().
      The the code in sp_rcontext::set_variable() and sp_eval_expr()
      is now symmetric for scalar and ROW values.
      The code in sp_rcontext::set_variable_row_field(), sp_rcontext::set_variable_row_field(), sp_rcontext::set_variable_row()
      is now symmetric for ROW elements (i.e. scalar and ROW elements inside a ROW).
      
      Rationale:
      
      Prepare the code to implement these tasks soon easier:
      
      - MDEV-12252 ROW data type for stored function return values
      - MDEV-12307 ROW data type for built-in function return values
      - MDEV-6121 Data type: Array
      - MDEV-10593 sql_mode=ORACLE: TYPE .. AS OBJECT: basic functionality
      - ROW with ROW fields (no MDEV yet)
      
      Details:
      
      1. Moving the code in sp_eval_expr() responsible to backup/restore
         thd->count_cuted_fields, thd->abort_on_warning,
         thd->transaction.stmt.modified_non_trans_table
         into a new helper class Sp_eval_expr_state, to reuse it easier.
         Fixing sp_eval_expr() to use this new class.
      
      2. Moving sp_eval_expr() and sp_prepare_func_item() from public functions
         to methods in THD, so they can be reused in *.cc files easier without
         a need to include "sp_head.h".
      
         Splitting sp_prepare_func_item() into two parts.
         Adding a new function sp_fix_func_item(), which fixes
         the underlying items, but does not do check_cols() for them.
         Reusing sp_fix_func_item() in Field_row::sp_prepare_and_store_item().
      
      3. Moving the code to find ROW fields by name from Item to Virtual_tmp_table
      
         Moving the code searching for ROW fields by their names
         from Item_field_row::element_index_by_name() to a new method
         Item_field_row to Virtual_tmp_table::sp_find_field_by_name().
      
         Adding wrapper methods sp_rcontext::find_row_field_by_name() and
         find_row_field_by_name_or_error(), to search for a ROW variable
         fields by the variable offset and its field name.
      
         Changing Item_splocal_row_field_by_name::fix_fields() to do
         use sp_rcontext::find_row_field_by_name_or_error().
         Removing virtual Item::element_index_by_name().
      
      4. Splitting sp_rcontext::set_variable()
      
         Adding a new virtual method Field::sp_prepare_and_store_item().
         Spliting the two branches of the code in sp_rcontext::set_variable()
         into two virtual implementations of Field::sp_prepare_and_store_item(),
         (for Field and for Field_row).
      
         Moving the former part of sp_rcontext::set_variable() with the loop
         doing set_null() for all ROW fields into a new method
         Virtual_tmp_table::set_all_fields_to_null() and using it in
         Field_row::sp_prepare_and_store_item().
      
         Moving the former part of sp_rcontext::set_variable() with the loop
         doing set_variable_row_field() into a new method
         Virtual_tmp_table::set_all_fields_from_item() and using it in
         Field_row::sp_prepare_and_store_item().
         The loop in the new method now uses sp_prepare_and_store_item()
         instead of set_variable_row_field(), because saving/restoring
         THD flags is now done on the upper level. No needs to save/restore
         on every iteration.
      
      5. Fixing sp_eval_expr() to simply do two things:
         - backup/restore THD flags
         - call result_field->sp_prepare_and_store_item()
         So now sp_eval_expr() can be used for both scalar and ROW variables.
         Reusing it in sp_rcontext::set_variable*().
      
      6. Moving the loop in sp_rcontext::set_variable_row() into a
         new method Virtual_tmp_table::sp_set_all_fields_from_item_list().
      
         Changing the loop body to call field->sp_prepare_and_store_item()
         instead of doing set_variable_row_field(). This removes
         saving/restoring of the THD flags from every interation.
         Instead, adding the code to save/restore the flags around
         the entire loop in set_variable_row(), using Sp_eval_expr_state.
         So now saving/restoring is done only once for the entire ROW
         (a slight performance improvement).
      
      7. Removing the code in sp_instr_set::exec_core() that sets
         a variable to NULL if the value evaluation failed.
         sp_rcontext::set_variable() now makes sure to reset
         the variable properly by effectively calling sp_eval_expr(),
         which calls virtual Field::sp_prepare_and_store_item().
      
         Removing the similar code from sp_instr_set_row_field::exec_core()
         and sp_instr_set_row_field_by_name::exec_core().
      
         Removing the method sp_rcontext::set_variable_row_field_to_null(),
         as it's not used any more.
      
      8. Removing the call for sp_prepare_func_item() from
         sp_rcontext::set_variable_row_field(), as it was duplicate:
         it was done inside sp_eval_expr(). Now it's done inside
         virtual Field::sp_prepare_and_store_item().
      
      9. Moving the code from sp_instr_set_row_field_by_name::exec_core()
         into sp_rcontext::set_variable_row_field_by_name(), for symmetry
         with other sp_instr_set*::exec_core()/sp_rcontext::set_variable*() pairs.
         Now sp_instr_set_row_field_by_name::exec_core() calls
         sp_rcontext::set_variable_row_field_by_name().
      
      10. Misc:
         - Adding a helper private method sp_rcontext::virtual_tmp_table_for_row(),
           reusing it in a new sp_rcontext methods.
         - Removing Item_field_row::get_row_field(), as it's not used any more.
         - Removing the "Item *result_item" from sp_eval_expr(),
           as it's not needed any more.
      b12430ad
    • Alexey Botchkov's avatar
      MDEV-11084 Select statement with partition selection against MyISAM table opens all partitions. · b4a2baff
      Alexey Botchkov authored
              Now we don't open partitions if it was explicitly cpecified.
              ha_partition::m_opened_partition bitmap added to track
              partitions that were actually opened.
      b4a2baff
  2. 28 Jan, 2018 2 commits
    • Marko Mäkelä's avatar
      Remove trx_mod_tables_t::vers_by_trx · 041a32ab
      Marko Mäkelä authored
      Only invoke set_versioned() on trx_id versioned tables.
      
      dict_table_t::versioned_by_id(): New accessor, to determine if
      a table is system versioned by transaction ID.
      041a32ab
    • Monty's avatar
      Added TRASH_FREED_MEMORY compilation option · ffcedfab
      Monty authored
      One can use -DTRASH_FREED_MEMORY to enable TRASH
      macros. Useful to do when one suspects that there
      is accesses to freed memory.
      
      Extended my_free() to TRASH freed memory
      ffcedfab
  3. 27 Jan, 2018 4 commits
  4. 26 Jan, 2018 12 commits
  5. 25 Jan, 2018 3 commits
    • Marko Mäkelä's avatar
      MDEV-15061 TRUNCATE must honor InnoDB table locks · 92d233a5
      Marko Mäkelä authored
      Traditionally, DROP TABLE and TRUNCATE TABLE discarded any locks that
      may have been held on the table. This feels like an ACID violation.
      Probably most occurrences of it were prevented by meta-data locks (MDL)
      which were introduced in MySQL 5.5.
      
      dict_table_t::n_foreign_key_checks_running: Reduce the number of
      non-debug checks.
      
      lock_remove_all_on_table(), lock_remove_all_on_table_for_trx(): Remove.
      
      ha_innobase::truncate(): Acquire an exclusive InnoDB table lock
      before proceeding. DROP TABLE and DISCARD/IMPORT were already doing
      this.
      
      row_truncate_table_for_mysql(): Convert the already started transaction
      into a dictionary operation, and do not invoke lock_remove_all_on_table().
      
      row_mysql_table_id_reassign(): Do not call lock_remove_all_on_table().
      This function is only used in ALTER TABLE...DISCARD/IMPORT TABLESPACE,
      which is already holding an exclusive InnoDB table lock.
      
      TODO: Make n_foreign_key_checks running a debug-only variable.
      This would require two fixes:
      (1) DROP TABLE: Exclusively lock the table beforehand, to prevent
      the possibility of concurrently running foreign key checks (which
      would acquire a table IS lock and then record S locks).
      (2) RENAME TABLE: Find out if n_foreign_key_checks_running>0 actually
      constitutes a potential problem.
      92d233a5
    • Galina Shalygina's avatar
      Bug fix · f1ff69cf
      Galina Shalygina authored
      Wrong conversion
      f1ff69cf
    • Jan Lindström's avatar
      MDEV-15063: InnoDB assertion failure !is_owned() at dict0defrag_bg.cc:327 · 859d100d
      Jan Lindström authored
      Probem was that dict_sys mutex was owned when calling function
      dict_stats_save_defrag_stats() that assumes we do not own
      dict_sys mutex.
      859d100d
  6. 24 Jan, 2018 10 commits
  7. 23 Jan, 2018 2 commits