1. 18 Sep, 2008 5 commits
    • marko's avatar
      branches/zip: Map current_thd to NULL in the Windows plugin, and use · ea6b2cea
      marko authored
      ha_thd() whenever possible.
      
      EQ_CURRENT_THD(thd): New predicate, for use in assertions.
      
      innobase_drop_database(): Tolerate current_thd == NULL, so that the
      Windows plugin will work.  In the Windows plugin, it will be
      impossible to skip foreign key checks in this function.  However,
      DROP DATABASE will drop each table (that MySQL knows about) individually
      before calling this function.  Thus, the foreign key checks can be disabled
      also in the Windows plugin, unless some .frm files are missing.
      ea6b2cea
    • marko's avatar
      branches/zip: When creating an index in innodb_strict_mode, check that · 3b2f5c05
      marko authored
      the maximum record size will never exceed the B-tree page size limit.
      For uncompressed tables, there should always be enough space for two
      records in an empty B-tree page.  For compressed tables, there should
      be enough space for storing two node pointer records or one data
      record in an empty page in uncompressed format.
      
      dict_build_table_def_step(): Remove the inaccurate check for table row
      size.
      
      dict_index_too_big_for_tree(): New function: check if the index
      records would be too big for a B-tree page.
      
      dict_index_add_to_cache(): Add the parameter "strict".  Invoke
      dict_index_too_big_for_tree() if it is set.
      
      trx_is_strict(), thd_is_strict(): New functions, for determining if
      innodb_strict_mode is enabled for the current transaction.
      
      dict_create_index_step(): Pass the new parameter strict of
      dict_index_add_to_cache() as trx_is_strict(trx).  All other callers
      pass it as FALSE.
      
      innodb.test: Enable innodb_strict_mode before attempting to create a
      table with a too big record size.
      
      innodb-zip.test: Remove the test of inserting random data.  Add tests
      for checking that the maximum record lengths are enforced at table
      creation time.
      3b2f5c05
    • marko's avatar
    • marko's avatar
    • marko's avatar
      branches/zip: ChangeLog: Remove reference to Mantis. This file is for the · 2fe45fb9
      marko authored
      general public, and Mantis is for our internal use only.
      
      Thanks to Vasil for pointing this out.
      2fe45fb9
  2. 17 Sep, 2008 7 commits
    • marko's avatar
      branches/zip: Merge r2617:r2630 from branches/5.1: · 7a4d2a59
      marko authored
      bug#39483 InnoDB hang on adaptive hash because of out of order ::open()
      call by MySQL
      
      Forward port of r2629
      
      Under some conditions MySQL calls ::open with search_latch leading
      to a deadlock as we try to acquire dict_sys->mutex inside ::open
      breaking the latching order. The fix is to release search_latch.
      
      Reviewed by: Heikki
      7a4d2a59
    • marko's avatar
      branches/zip: innobase_convert_from_id(), innobase_convert_from_table_id(): · 39147158
      marko authored
      Add the parameter struct charset_info_st* cs, so that the call
      thd_charset(current_thd) can be avoided.  The macro current_thd has no
      defined value in the Windows plugin.
      39147158
    • marko's avatar
      branches/zip: Non-functional change: Move the declarations of the · dc32dbdb
      marko authored
      functions innobase_convert_from_table_id(), innobase_convert_from_id(),
      innobase_casedn_str(), and innobase_get_charset() to ha_prototypes.h.
      dc32dbdb
    • marko's avatar
      branches/zip: HASH_INSERT: Add a type conversion that is needed to keep · 37c90941
      marko authored
      the Microsoft Visual C compiler happy.  This fix was from Calvin.
      37c90941
    • marko's avatar
      branches/zip: Add the ChangeLog entry for r2631. · 6a89d1d3
      marko authored
      6a89d1d3
    • marko's avatar
      branches/zip: Add some tests for innodb_strict_mode. · a5db78f7
      marko authored
      ha_innodb.cc: Declare strict_mode as PLUGIN_VAR_OPCMDARG, because we
      do want to be able to disable innodb_strict_mode.  This is a non-functional
      change, because PLUGIN_VAR_NOCMDARG seems to accept an argument as well.
      
      innodb-zip.test: Do not store innodb_strict_mode.  It is a session variable.
      Add a test case for innodb_strict_mode=off.
      a5db78f7
    • marko's avatar
      branches/zip: Prevent infinite B-tree page splits by ensuring that · 1a360822
      marko authored
      there will always be enough space for two node pointer records in an
      empty B-tree page.  This was reported as Mantis issue #73.
      
      page_zip_rec_needs_ext(): Add the parameter n_fields, for accurate
      estimation of the compressed size of the data dictionary information.
      Given that this function is only invoked for records on leaf pages,
      require that there be enough space for one record in the compressed
      page.  We check elsewhere that there will be enough room for two node
      pointer records on higher-level pages.
      
      btr_cur_optimistic_insert(): Ensure that there will be enough room for
      two node pointer records on an empty non-leaf page.  The rule for
      leaf-page records will be enforced by the callers of
      page_zip_rec_needs_ext().
      
      btr_cur_pessimistic_insert(): Remove the insufficient check that the
      leaf page record should be compressible by itself.  Instead, now we
      require that two node pointer records fit on a non-leaf page, and one
      record will fit in uncompressed form on the leaf page.
      
      page_zip_write_header(), page_zip_write_rec(): Re-enable the debug
      assertions that were violated by the insufficient check in
      btr_cur_pessimistic_insert().
      
      innodb_bug36172.test: Use a larger compressed page size.
      1a360822
  3. 16 Sep, 2008 2 commits
    • marko's avatar
      branches/zip: Minor cleanup. · 5983048f
      marko authored
      btr_search_drop_page_hash_index(): Add const qualifiers to the local
      variables page, rec, and index, to ensure that they are not modified
      by this function.
      
      page_get_infimum_offset(), page_get_supremum_offset(): New functions.
      
      page_get_infimum_rec(), page_get_supremum_rec(): Replaced by
      const-preserving macros that invoke the accessor functions.
      5983048f
    • marko's avatar
      branches/zip: btr0btr.c: Add more UNIV_BTR_DEBUG checks. This should · 855c2aa8
      marko authored
      help in tracking down issue #63 (memory corruption).  UNIV_BTR_DEBUG
      is currently enabled in univ.i.
      
      btr_root_fseg_validate(): New function, for validating a file segment
      header on a B-tree root page.
      
      btr_root_block_get(), btr_free_but_not_root(),
      btr_root_raise_and_insert(), btr_discard_only_page_on_level():
      Check PAGE_BTR_SEG_LEAF and PAGE_BTR_SEG_TOP on the root page with
      btr_root_fseg_validate().
      
      btr_root_raise_and_insert(): Move the assertion
      dict_index_get_page(index) == page_get_page_no(root)
      inside UNIV_BTR_DEBUG.  It was previously enabled by UNIV_DEBUG.
      
      btr_free_root(): Check PAGE_BTR_SEG_TOP on the root page with
      btr_root_fseg_validate().
      855c2aa8
  4. 15 Sep, 2008 2 commits
    • vasil's avatar
      branches/zip: · 46b312cd
      vasil authored
      Add a test case to check that mysqld does not crash when running ANALYZE TABLE
      with different values for innodb_stats_sample_pages.
      
      Suggested by:	Marko
      Approved by:	Marko
      46b312cd
    • vasil's avatar
      branches/zip: · 733e615e
      vasil authored
      Limit the number of the pages that are sampled so it is never greater
      than the total number of pages in the index.
      
      The parameter that specifies the number of pages to test is global for
      all tables. By limiting it this way we allow the user to set it "high"
      to suit "large" tables and to avoid unnecessary work for "small" tables
      (e.g. doing 100 dives in a table that has 5 pages, obviously testing
      some pages more than once).
      
      Suggested by:	Ken
      Approved by:	Marko
      733e615e
  5. 13 Sep, 2008 1 commit
    • inaam's avatar
      branches/zip · 489abd22
      inaam authored
      Add missing semicolon. Introduced in r2602 which was obviously not
      compiled with UNIV_DEBUG.
      489abd22
  6. 12 Sep, 2008 1 commit
    • vasil's avatar
      branches/zip: · 4a4f1ef3
      vasil authored
      Update the ChangeLog which has not been updated for a long time, phew!
      4a4f1ef3
  7. 10 Sep, 2008 1 commit
  8. 09 Sep, 2008 2 commits
    • vasil's avatar
      branches/zip: · 10436b05
      vasil authored
      Merge 2605:2617 from branches/5.1:
      
        ------------------------------------------------------------------------
        r2609 | sunny | 2008-08-24 01:19:05 +0300 (Sun, 24 Aug 2008) | 12 lines
        Changed paths:
           M /branches/5.1/handler/ha_innodb.cc
           M /branches/5.1/mysql-test/innodb-autoinc.result
           M /branches/5.1/mysql-test/innodb-autoinc.test
        
        branches/5.1: Fix for MySQL Bug#38839. Reset the statement level last
        value field in prebuilt. This field tracks the last value in an autoincrement
        interval. We use this value to check whether we need to update a table's
        AUTOINC counter, if the value written to a table is less than this value
        then we avoid updating the table's AUTOINC value in order to reduce
        mutex contention. If it's not reset (e.g., after a DELETE statement) then
        there is the possibility of missing updates to the table's AUTOINC counter
        resulting in a subsequent duplicate row error message under certain 
        conditions (see the test case for details).
        
        Bug #38839 - auto increment does not work properly with InnoDB after update
        
        ------------------------------------------------------------------------
        r2617 | vasil | 2008-09-09 15:46:17 +0300 (Tue, 09 Sep 2008) | 47 lines
        Changed paths:
           M /branches/5.1/mysql-test/innodb.result
        
        branches/5.1:
        
        Merge a change from MySQL (fix the failing innodb test):
        
          ------------------------------------------------------------
          revno: 2646.12.1
          committer: Mattias Jonsson <mattiasj@mysql.com>
          branch nick: wl4176_2-51-bugteam
          timestamp: Mon 2008-08-11 20:02:03 +0200
          message:
            Bug#20129: ALTER TABLE ... REPAIR PARTITION ... complains that
            partition is corrupt
            
            The main problem was that ALTER TABLE t ANALYZE/CHECK/OPTIMIZE/REPAIR
            PARTITION took another code path (over mysql_alter_table instead of
            mysql_admin_table) which differs in two ways:
            1) alter table opens the tables in a different way than admin tables do
               resulting in returning with error before it tried the command
            2) alter table does not start to send any diagnostic rows to the client
               which the lower admin functions continue to use -> resulting in
               assertion crash
            
            The fix:
            Remapped ALTER TABLE t ANALYZE/CHECK/OPTIMIZE/REPAIR PARTITION to use
            the same code path as ANALYZE/CHECK/OPTIMIZE/REPAIR TABLE t.
            Adding check in mysql_admin_table to setup the partition list for
            which partitions that should be used.
            
            
            Partitioned tables will still not work with
            REPAIR TABLE/PARTITION USE_FRM, since that requires moving partitions
            to tables, REPAIR TABLE t USE_FRM, and check that the data still
            fulfills the partitioning function and then move the table back to
            being a partition.
            
            NOTE: I have removed the following functions from the handler
            interface:
            analyze_partitions, check_partitions, optimize_partitions,
            repair_partitions
            Since they are not longer needed.
            THIS ALTERS THE STORAGE ENGINE API
        
        I have verified that OPTIMIZE TABLE actually rebuilds the table
        and calls ANALYZE.
        
        Approved by:	Heikki
      10436b05
    • marko's avatar
      branches/zip: ha_innobase::prepare_drop_index(): When there is a · 31ef5d07
      marko authored
      foreign key constraint, find a truly equivalent index for it.
      If none is available, refuse to drop the index.  MySQL can drop
      an index when creating a "stronger" index.
      
      This was reported as Mantis issue #70 and MySQL Bug #38786.
      
      innodb-index.test: Add a test case.
      
      dict_foreign_find_equiv_index(): New function, to replace the
      incorrectly written function dict_table_find_equivalent_index().
      
      dict_table_replace_index_in_foreign_list(): Simplify the implementation.
      31ef5d07
  9. 04 Sep, 2008 1 commit
  10. 29 Aug, 2008 1 commit
    • marko's avatar
      branches/zip: Clean up: do not assign index->id as a special case · 2c7e2c30
      marko authored
      in fast index creation.  In r1399, we wrote undo log records about
      creating indexes.  The special undo log records were deemed
      unnecessary later, but this special handling was not removed then.
      
      row_merge_create_index(): Do not assign index->id.
      
      dict_build_index_def_step(): Unconditionally assign index->id.
      2c7e2c30
  11. 27 Aug, 2008 1 commit
  12. 22 Aug, 2008 1 commit
  13. 21 Aug, 2008 3 commits
    • marko's avatar
      branches/zip: thd_is_select(): Add the missing UNIV_INTERN to the definition. · 1cda7bd8
      marko authored
      This function was introduced in r2606, when merging r2603 from branches/5.1.
      1cda7bd8
    • vasil's avatar
      branches/zip: · e7f9daa5
      vasil authored
      Merge 2537:2605 from branches/5.1:
      
        ------------------------------------------------------------------------
        r2545 | vasil | 2008-07-25 17:24:23 +0300 (Fri, 25 Jul 2008) | 37 lines
        Changed paths:
           M /branches/5.1/handler/ha_innodb.cc
        
        branches/5.1:
        
        Fix Bug#38185 ha_innobase::info can hold locks even when called with HA_STATUS_NO_LOCK
        
        The fix is to call fsp_get_available_space_in_free_extents() from
        ha_innobase::info() only if HA_STATUS_NO_LOCK is not present in the flag
        *AND*
        change get_schema_tables_record() in MySQL's sql/sql_show.cc to call
        ::info() *without* HA_STATUS_NO_LOCK whenever a user issues SELECT FROM
        information_schema.tables;
        
        Without the change to sql/sql_show.cc this patch would lead to Bug#32440
        resurfacing. I.e. delete_length would never be updated in ::info() and
        will remain 0 forever, resulting in the free space not being shown
        anywhere.
        
        This is the change to sql/sql_show.cc for reference, it needs to be
        committed to the MySQL repo before or at the same time with this change
        to ha_innodb.cc:
        
         --- patch begins here ---
         --- sql/sql_show.cc.orig	2008-07-23 09:32:14.000000000 +0300
         +++ sql/sql_show.cc	2008-07-23 09:32:19.000000000 +0300
         @@ -3549,8 +3549,7 @@ static int get_schema_tables_record(THD 
          
              if(file)
              {
         -      file->info(HA_STATUS_VARIABLE | HA_STATUS_TIME | HA_STATUS_AUTO |
         -                 HA_STATUS_NO_LOCK);
         +      file->info(HA_STATUS_VARIABLE | HA_STATUS_TIME | HA_STATUS_AUTO);
                enum row_type row_type = file->get_row_type();
                switch (row_type) {
                case ROW_TYPE_NOT_USED:
         --- patch ends here ---
        
        Approved by:	Heikki
        
        ------------------------------------------------------------------------
        r2603 | marko | 2008-08-21 16:25:05 +0300 (Thu, 21 Aug 2008) | 10 lines
        Changed paths:
           M /branches/5.1/handler/ha_innodb.cc
           M /branches/5.1/include/ha_prototypes.h
           M /branches/5.1/row/row0sel.c
        
        branches/5.1: Identify SELECT statements by thd_sql_command() == SQLCOM_SELECT
        instead of parsing the query string.  This fixes MySQL Bug #37885 without
        us having to implement lexical analysis of SQL comments in yet another place.
        
        thd_is_select(): A new predicate.
        
        row_search_for_mysql(): Use thd_is_select().
        
        Approved by Heikki.
        
        ------------------------------------------------------------------------
      e7f9daa5
    • marko's avatar
      branches/zip: Minor cleanup. · 157b8eeb
      marko authored
      dict_table_get_referenced_constraint(), dict_table_get_foreign_constraint():
      Simplify the iteration loop.
      
      dict_table_find_equivalent_index(): Correct the function comment.
      157b8eeb
  14. 20 Aug, 2008 1 commit
  15. 18 Aug, 2008 3 commits
    • marko's avatar
      branches/zip: Introduce UNIV_LRU_DEBUG for debugging the LRU buffer pool · 3d3bd987
      marko authored
      cache, especially buf_pool->LRU_old and bpage->old.
      
      buf_LRU_old_adjust_len(), buf_LRU_remove_block(): Check that blocks in
      buf_pool->LRU_old have the "old" flag set and the blocks preceding
      buf_pool->LRU_old have the "old" flag clear.
      
      buf_LRU_add_block_low(), buf_relocate(): Check that buf_pool->LRU_old
      is the first block in the LRU list whose "old" flag is set.
      
      buf_LRU_free_block(): When replacing a control block in the LRU list
      with a control block for a compressed page, assert that the "old"
      flags in the neighboring LRU list entries grow monotonically.
      
      buf_page_set_old(): Assert that the "old" flags in the neighboring LRU
      list entries grow monotonically.
      3d3bd987
    • marko's avatar
      branches/zip: buf_page_set_old(): Add the assertion ut_ad(bpage->in_LRU_list). · 81ec8249
      marko authored
      Adjust the callers where necessary:
      buf_LRU_add_block_to_end_low() and buf_LRU_add_block_low().
      81ec8249
    • marko's avatar
      branches/zip: flst_write_addr(), flst_read_addr(): Assert that no · 012b1cc7
      marko authored
      file list link is written or read below FIL_PAGE_DATA.  This has
      helped diagnose issue#63.
      012b1cc7
  16. 09 Aug, 2008 1 commit
  17. 08 Aug, 2008 1 commit
    • marko's avatar
      branches/zip: buf_LRU_free_block(): When buf_page_is_old(b), we incremented · c976021e
      marko authored
      buf_pool->LRU_old_len.  However, we forgot to check if buf_pool->LRU_old
      happens to point to b's successor in the LRU list.  If it does, we must
      assign buf_pool->LRU_old = b.  The following invariants hold:
      
      In the LRU list, the "old" flag should grow monotonically, i.e., it is 0
      for the first few items and 1 from thereafter.
      
      If buf_pool->LRU_old != NULL, it must point to the first item with old=1
      in the LRU list, and there must be buf_pool->LRU_old_len old items in the list.
      
      This should fix Mantis issue#50 and issue#68.
      c976021e
  18. 07 Aug, 2008 2 commits
    • vasil's avatar
      branches/zip: · 48216724
      vasil authored
      The cardinality of every index (the number of different key values) is
      calculated when the table is opened, at SHOW TABLE STATUS,
      ANALYZE TABLE and on other circumstances (like when the table has
      changed too much). Note that if the mysql client is running with the
      auto-rehash setting turned on (default) this causes all tables to be
      opened when it starts.
      
      Previously InnoDB sampled 8 random pages from the index to get an
      estimate of the cardinality. Now the number of sampled pages can be
      changed via the global parameter innodb_stats_sample_pages which can
      be tuned at runtime. The default value for this parameter is 8.
      
      If the value of this parameter is changed, there may be serious problems:
      
      - small values (say, 1) can cause an error in table stats;
      - values much larger than 8 (say, 100), can cause a big slowdown in
        table opening time, SHOW TABLE status, etc.
      - query plans may be different from the old ones.
      
      Approved by:	Heikki
      48216724
    • vasil's avatar
      branches/zip: · a97b0cc3
      vasil authored
      Fix Mantis issue#66.
      
      Do not try to dereference the MySQL thread object if it is NULL.
      
      Approved by:	Sunny (via IM)
      a97b0cc3
  19. 06 Aug, 2008 4 commits
    • marko's avatar
      branches/zip: Correct some typos in comments. · 0ce4e51d
      marko authored
      0ce4e51d
    • marko's avatar
      branches/zip: Fix terminology that was introduced in r2569: · 046c1d91
      marko authored
      replace rbmode and "rollback mode"
      with rb_ctx and "rollback context".
      Suggested by Sunny.
      046c1d91
    • marko's avatar
      branches/zip: In the rollback of incomplete transactions after crash · 8a73d356
      marko authored
      recovery, tolerate clustered index records whose externally stored
      columns have not been written.  This should remove the assertion failures
      that were reported as Mantis issue#58, issue#62, issue#64.
      
      trx_is_recv(): New function: TRUE if this transaction is rolling back
      an incomplete transaction in crash recovery.
      
      enum trx_rbmode: Rollback modes: no rollback, normal rollback, crash recovery.
      
      btr_cur_pessimistic_delete(), btr_free_externally_stored_field(),
      btr_rec_free_externally_stored_fields():
      Replace the ibool parameter with enum trx_rbmode.
      
      btr_free_externally_stored_field(): If field_ref is zero, return
      but assert ut_a(rbmode == RB_RECOVERY).  Unless InnoDB has crashed
      while inserting a clustered index record, field_ref should not be zero.
      
      btr_rec_free_updated_extern_fields(): Add the parameter enum trx_rbmode.
      
      btr_cur_pessimistic_update(): Pass the rbmode parameter to
      btr_rec_free_updated_extern_fields().
      
      row_undo_ins(), row_undo_mod_upd_del_sec(): If row_build_index_entry()
      fails, assert trx_is_recv() and skip this secondary index.
      
      row_undo_mod_upd_del_sec(): Empty the heap at the end of each loop
      iteration in order to conserve memory and to reduce the number of
      low-level memory allocations.
      8a73d356
    • marko's avatar
      branches/zip: Improve the diagnostics for tracking down issue#63 and issue#65. · 94a7cee3
      marko authored
      buf_flush_init_for_writing(), buf_LRU_block_remove_hashed_page():
      Dump the page frame featuring the incorrect FIL_PAGE_TYPE along with the
      page_zip->data that might contain an earlier version of the page.
      94a7cee3