1. 29 Jan, 2018 2 commits
    • Alexander Barkov's avatar
      MDEV-15112 Inconsistent evaluation of spvariable=0 in strict mode · 8317ce73
      Alexander Barkov authored
      The patch for MDEV-15107 fixed this problem. Adding tests only.
      8317ce73
    • 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
  2. 28 Jan, 2018 1 commit
    • 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 6 commits
  5. 25 Jan, 2018 1 commit
  6. 24 Jan, 2018 6 commits
    • Monty's avatar
      Fix for MDEV-12730 · 7fc25cfb
      Monty authored
      Assertion `count > 0' failed in rpl_parallel_thread_pool::
      get_thread, rpl.rpl_parallel failed in buildbot
      
      The reason for this is that one thread can call
      rpl_parallel_resize_pool_if_no_slaves() while
      another thread calls at the same time
      rpl_parallel_activate_pool(). If rpl_parallel_active_pool() is
      called before rpl_parallel_resize_pool_if_no_slaves() has
      finished, pool->count will be set to 0 even if there exists
      active slave threads.
      
      Added a mutex lock in rpl_parallel_activate_pool() to protect against this scenario, which seams to fix this issue.
      7fc25cfb
    • Monty's avatar
      Merge remote-tracking branch 'origin/10.2' into bb-10.2-ext · 071f5283
      Monty authored
      Conflicts:
      	mysql-test/r/sp.result
      	mysql-test/t/sp.test
      071f5283
    • Monty's avatar
      MDEV-15057 Crash when using an unknown identifier as an SP parameter · 0dbe3dbe
      Monty authored
      It crashed because we accessed lex->current_select when
      it was a NULL, which is the case for SP parameters or
      local variables.
      0dbe3dbe
    • Marko Mäkelä's avatar
      Merge 10.2 into bb-10.2-ext · 62740e02
      Marko Mäkelä authored
      62740e02
    • Marko Mäkelä's avatar
    • Marko Mäkelä's avatar
      MDEV-15016: multiple page cleaner threads use a lot of CPU · ac3e7f78
      Marko Mäkelä authored
      While the bug was reported as a regression of
      MDEV-11025 Make number of page cleaner threads variable dynamic
      in MariaDB Server 10.3, the code that MariaDB Server 10.2
      inherited from MySQL 5.7.4 (WL#6642) looks prone to similar errors.
      
      pc_flush_slot(): If there is no work to do, reset the is_requested
      signal, to avoid potential busy-waiting in
      buf_flush_page_cleaner_worker(). If the coordinator thread has shut
      down, avoid resetting the is_requested event, to avoid a potential
      hang at shutdown if there are multiple worker threads.
      ac3e7f78
  7. 23 Jan, 2018 4 commits
  8. 22 Jan, 2018 7 commits
    • Marko Mäkelä's avatar
      MDEV-12173 "[Warning] Trying to access missing tablespace" · 29eeb527
      Marko Mäkelä authored
      ibuf_merge_or_delete_for_page(): Invoke fil_space_acquire_silent()
      instead of fil_space_acquire() in order to avoid displaying
      a useless message.
      
      We know perfectly well that a tablespace can be dropped while a
      change buffer merge is pending, because change buffer merges skip
      any transactional locks.
      29eeb527
    • Marko Mäkelä's avatar
      89ae5d7f
    • Marko Mäkelä's avatar
      30f1d2f6
    • Marko Mäkelä's avatar
      MDEV-15029 XA COMMIT and XA ROLLBACK operate on freed transaction object · d04e1d4b
      Marko Mäkelä authored
      innobase_commit_by_xid(), innobase_rollback_by_xid(): Decrement
      the reference count before freeing the transaction object to the pool.
      Failure to do so might corrupt the transaction bookkeeping
      if trx_create_low() returns the same object to another thread
      before we are done with it.
      
      trx_sys_close(): Detach the recovered XA PREPARE transactions from
      trx_sys->rw_trx_list before freeing them.
      d04e1d4b
    • Sergei Petrunia's avatar
      MDEV-13352: Server crashes in st_join_table::remove_duplicates · 9b4dfdaa
      Sergei Petrunia authored
      join_tab->distinct=true means "Before doing record read with this
      join_tab, call join_tab->remove_duplicates() to eliminate duplicates".
      remove_duplicates() assumes that
      - there is a temporary table $T with rows that are to be de-duplicated
      - there is a previous join_tab (e.g. with join_tab->fields) which was
      used to populate the temp.table $T.
      
      When the query has "Impossible WHERE" and window function, then the above
      conditions are not met (but we still might need a window function
      computation step when the query has implicit grouping).
      
      The fix is to not add remove_duplicates step if the select execution is
      degenerate (and we'll have at most one row in the output anyway).
      9b4dfdaa
    • Marko Mäkelä's avatar
      Merge 10.2 into bb-10.2-ext · c425dcd8
      Marko Mäkelä authored
      c425dcd8
    • Marko Mäkelä's avatar
      MDEV-14941 Timeouts on persistent statistics tables caused by MDEV-14511 · 4f8555f1
      Marko Mäkelä authored
      MDEV-14511 tried to avoid some consistency problems related to InnoDB
      persistent statistics. The persistent statistics are being written by
      an InnoDB internal SQL interpreter that requires the InnoDB data dictionary
      cache to be locked.
      
      Before MDEV-14511, the statistics were written during DDL in separate
      transactions, which could unnecessarily reduce performance (each commit
      would require a redo log flush) and break atomicity, because the statistics
      would be updated separately from the dictionary transaction.
      
      However, because it is unacceptable to hold the InnoDB data dictionary
      cache locked while suspending the execution for waiting for a
      transactional lock (in the mysql.innodb_index_stats or
      mysql.innodb_table_stats tables) to be released, any lock conflict
      was immediately be reported as "lock wait timeout".
      
      To fix MDEV-14941, an attempt to reduce these lock conflicts by acquiring
      transactional locks on the user tables in both the statistics and DDL
      operations was made, but it would still not entirely prevent lock conflicts
      on the mysql.innodb_index_stats and mysql.innodb_table_stats tables.
      
      Fixing the remaining problems would require a change that is too intrusive
      for a GA release series, such as MariaDB 10.2.
      
      Thefefore, we revert the change MDEV-14511. To silence the
      MDEV-13201 assertion, we use the pre-existing flag trx_t::internal.
      4f8555f1
  9. 21 Jan, 2018 3 commits
  10. 18 Jan, 2018 4 commits
    • Igor Babaev's avatar
      Fixed mdev-14969 Non-recursive Common Table Expressions used in view · 30289a27
      Igor Babaev authored
      caused an error
      
      The function subselect_single_select_engine::print() did not print
      the WITH clause attached to a subselect with single select engine.
      As a result views using suqueries with attached WITH clauses lost
      these clauses when saved in frm files.
      30289a27
    • Marko Mäkelä's avatar
      MDEV-14985 innodb_undo_log_truncate may be blocked if transactions were recovered at startup · 6c09a654
      Marko Mäkelä authored
      The field trx_rseg_t::trx_ref_count that was added in WL#6965 in
      MySQL 5.7.5 is being incremented twice if a recovered transaction
      includes both undo log partitions insert_undo and update_undo.
      
      This reference count is being used in trx_purge(), which invokes
      trx_purge_initiate_truncate() to try to truncate an undo tablespace
      file. Because of the double-increment, the trx_ref_count would never
      reach 0.
      
      It is possible that after the failed truncation attempt, the undo
      tablespace would be disabled for logging any new transactions until
      the server is restarted (hopefully after committing or rolling back
      all transactions, so that no transactions would be recovered
      on the next startup).
      
      trx_resurrect_insert(), trx_resurrect_update(): Do not increment
      trx_ref_count. Instead, let the caller do that.
      
      trx_lists_init_at_db_start(): Increment rseg->trx_ref_count only
      once for each recovered transaction. Adjust comments.
      Finally, if innodb_force_recovery prevents the undo log scan,
      do not bother iterating the empty lists.
      6c09a654
    • Monty's avatar
      cc915cd5
    • Monty's avatar
      Fixed MDEV-14326 engine ARIA with row_format=FIXED is broken · 50de7d13
      Monty authored
      The problem was that max_size was acciently set to 1 in some
      cases.
      
      Other things:
      - Adjust max_rows if min_rows > max_rows.
      - Removed not used variable varchar_length
      - Adjusted max_pack_length (safety fix)
      50de7d13
  11. 17 Jan, 2018 2 commits
    • Marko Mäkelä's avatar
      Merge 10.2 into bb-10.2-ext · c6cd64f3
      Marko Mäkelä authored
      c6cd64f3
    • Marko Mäkelä's avatar
      Follow-up fix to MDEV-14585 Automatically remove #sql- tables in InnoDB dictionary during recovery · 656f66de
      Marko Mäkelä authored
      If InnoDB is killed while ALTER TABLE...ALGORITHM=COPY is in progress,
      after recovery there could be undo log records some records that were
      inserted into an intermediate copy of the table. Due to these undo log
      records, InnoDB would resurrect locks at recovery, and the intermediate
      table would be locked while we are trying to drop it. This would cause
      a call to row_rename_table_for_mysql(), either from
      row_mysql_drop_garbage_tables() or from the rollback of a RENAME
      operation that was part of the ALTER TABLE.
      
      row_rename_table_for_mysql(): Do not attempt to parse FOREIGN KEY
      constraints when renaming from #sql-something to #sql-something-else,
      because it does not make any sense.
      
      row_drop_table_for_mysql(): When deferring DROP TABLE due to locks,
      do not rename the table if its name already starts with the #sql-
      prefix, which is what row_mysql_drop_garbage_tables() uses.
      Previously, the too strict prefix #sql-ib was used, and some
      tables were renamed unnecessarily.
      656f66de