1. 16 Oct, 2008 2 commits
    • vasil's avatar
      branches/zip: · 2453a49a
      vasil authored
      Fix Mantis issue#61:
      
      In row_undo_ins_parse_undo_rec(): if we find that a table has no indexes
      (dict_table_get_first_index() returns NULL) do not try to call
      trx_undo_rec_get_row_ref() with a NULL pointer because that would lead to
      a crash. Instead, print a warning and set node->table to NULL just like
      it is done if the .ibd file is missing.
      
      Approved by:	Heikki (via IM)
      2453a49a
    • marko's avatar
      branches/zip: Skip the undo log size check on REDUNDANT and COMPACT tables. · bb4b3f40
      marko authored
      In ROW_FORMAT=DYNAMIC and ROW_FORMAT=COMPRESSED, column prefix indexes
      require that prefixes of externally stored columns be written to the
      undo log. This may make the undo log record bigger than the record on
      the B-tree page.  The maximum size of an undo log record is the page
      size.  That must be checked for, in dict_index_add_to_cache().
      
      dict_index_add_to_cache(): Skip the undo log size check for REDUNDANT
      and COMPACT tables. These tables store prefixes of externally stored
      columns locally within the clustered index record.  There are no special
      considerations for the undo log record size.
      
      innodb-index.test: Ensure that the check exists for ROW_FORMAT=DYNAMIC,
      but not for ROW_FORMAT=COMPACT.
      
      This fixes issue #99.  rb://28 approved by Sunny.
      bb4b3f40
  2. 15 Oct, 2008 4 commits
    • marko's avatar
      branches/zip: When the server crashes while freeing an externally stored · 8ec95fc7
      marko authored
      column of a compressed table, the BTR_EXTERN_LEN field in the BLOB pointer
      will be written as 0.  Tolerate this in the functions that deal with
      externally stored columns.  This fixes Issue #80 and was posted at rb://26.
      
      Note that the clustered index record is always deleted or purged last,
      after any secondary index records referring to it have been deleted.
      
      btr_free_externally_stored_field(): On an uncompressed table, zero out
      the BTR_EXTERN_LEN, so that half-deleted BLOBs can be detected after
      crash recovery.
      
      btr_copy_externally_stored_field_prefix(): Return 0 if the BLOB has been
      half-deleted.
      
      row_upd_ext_fetch(): Assert that the externally stored column exists.
      
      row_ext_cache_fill(): Allow btr_copy_externally_stored_field_prefix()
      to return 0.
      
      row_sel_sec_rec_is_for_blob(): Return FALSE if the BLOB has been half-deleted.
      This is correct, because the clustered index record would have been deleted
      or purged last, after any secondary index records referring to it had been
      deleted.
      8ec95fc7
    • marko's avatar
      branches/zip: Introduce UNIV_ZIP_COPY for invoking page_zip_copy_recs() · f644f6af
      marko authored
      more often in B-tree operations.
      f644f6af
    • marko's avatar
      branches/zip: When invoking page_zip_copy_recs(), update the lock table · 05c33d6d
      marko authored
      and the adaptive hash index.  This should fix Issue #95 and Issue #87.
      
      page_zip_copy_recs(): Copy PAGE_MAX_TRX_ID as well, to have similar behavior
      to page_copy_rec_list_start() and page_copy_rec_list_end().
      
      btr_root_raise_and_insert(), btr_page_split_and_insert(), btr_lift_page_up():
      Update the lock table and the adaptive hash index.
      05c33d6d
    • marko's avatar
      branches/zip: row_create_table_for_mysql(), row_create_index_for_mysql(): · 344481d5
      marko authored
      Note that the dictionary object will be freed.
      344481d5
  3. 14 Oct, 2008 2 commits
  4. 13 Oct, 2008 4 commits
  5. 11 Oct, 2008 2 commits
  6. 10 Oct, 2008 1 commit
    • marko's avatar
      branches/zip: Fix some locking issues, mainly in fast index creation. · 41953325
      marko authored
      This should hopefully address Issue #85.
      
      ha_innobase::add_index(): Lock the data dictionary before invoking
      row_merge_rename_indexes() or row_merge_drop_indexes(), because neither
      function will commit the transaction.
      
      ha_innobase::final_drop_index(): Commit the transactions before
      unlocking the data dictionary.
      
      row_merge_drop_index(), row_merge_drop_indexes(), row_merge_rename_tables(),
      row_merge_rename_indexes(): Note and assert that the data dictionary must
      have been exclusively locked by the caller, because the transaction will
      not be committed.
      
      row_drop_database_for_mysql(): Commit the transaction immediately after
      dropping each table.  When MySQL is holding open handles to some tables,
      it can otherwise occur than the data dictionary is unlocked while the
      transaction has not been committed.  This bug was introduced in r2739,
      which changed the semantics of row_drop_table_for_mysql().
      
      row_drop_database_for_mysql(): Postpone mem_free(table_name), so that
      an error printout will not dereference freed memory.
      41953325
  7. 09 Oct, 2008 1 commit
    • marko's avatar
      branches/zip: Merge revisions 2722:2744 from branches/5.1: · 77a22984
      marko authored
        ------------------------------------------------------------------------
        r2742 | inaam | 2008-10-08 22:02:15 +0300 (Wed, 08 Oct 2008) | 11 lines
      
        branches/5.1:
      
        Fix Bug#39939 DROP TABLE/DISCARD TABLESPACE takes long time in
        buf_LRU_invalidate_tablespace()
      
        Improve implementation of buf_LRU_invalidate_tablespace by attempting
        hash index drop in batches instead of doing it one by one.
      
        Reviewed by: Heikki, Sunny, Marko
        Approved by: Heikki
        ------------------------------------------------------------------------
        r2744 | marko | 2008-10-09 10:53:09 +0300 (Thu, 09 Oct 2008) | 5 lines
      
        branches/5.1: ha_innobase::delete_all_rows(): In response to a user asking
        <http://forums.innodb.com/read.php?4,215,215> why DELETE FROM t is not
        mapped to TRUNCATE TABLE t as it is in MyISAM, note in a comment that
        DELETE is transactional while TRUNCATE is not.
        ------------------------------------------------------------------------
      77a22984
  8. 08 Oct, 2008 3 commits
    • marko's avatar
      branches/zip: mysql-test/patches/innodb_file_per_table.diff: · c39985b0
      marko authored
      @@GLOBAL.innodb_file_per_table can be 0 or 1, while
      SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
      WHERE VARIABLE_NAME='innodb_file_per_table'
      can be 'OFF' or 'ON'.  For some reason, MySQL evaluates
      (0 = 'OFF') to 1 and (1 = 'ON') to 0.  Thus, the test would
      fail if innodb_file_per_table is set.
      c39985b0
    • marko's avatar
      branches/zip: page_copy_rec_list_end(): Remove the call · d546c0cf
      marko authored
      page_zip_validate_low(new_page_zip, new_page, TRUE) because it would
      cause bogus failures in btr_compress(), as noted in Issue #79.
      d546c0cf
    • marko's avatar
      branches/zip: Do not release the data dictionary latch while holding locks · a9a21fb9
      marko authored
      to the data dictionary records.  This should fix Issue #83.
      
      row_drop_table_for_mysql_no_commit(): Rename back to
      row_drop_table_for_mysql().  Commit the transaction if the data
      dictionary was not locked when the function was called.  Otherwise,
      neither commit the transaction nor unlock the data dictionary.
      
      row_merge_drop_table(): Let row_drop_table_for_mysql() take care of
      locking the data dictionary.
      
      dict_create_or_check_foreign_constraint_tables(),
      trx_rollback_active(), row_create_table_for_mysql(),
      row_create_index_for_mysql(), row_table_add_foreign_constraints():
      Explicitly commit the transaction, because row_drop_table_for_mysql()
      would no longer commit it, given that the data dictionary will be
      locked during the calls.
      
      Approved by Sunny (over IM). rb://23
      a9a21fb9
  9. 07 Oct, 2008 6 commits
    • marko's avatar
      branches/zip: Improve page_zip_validate() instrumentation. · 278a68a0
      marko authored
      btr_lift_page_up(): Invoke page_zip_validate() on every page whose level
      is adjusted.
      
      btr_compress(): Invoke page_zip_validate() on merge_page at the end.
      
      page_zip_copy_recs(): Relax the page_zip_validate(...) to
      page_zip_validate_low(..., sloppy = TRUE) to avoid bogus assertion failures.
      
      page_copy_rec_list_end(), page_delete_rec_list_start():
      Invoke page_zip_validate_low(sloppy = TRUE).
      278a68a0
    • marko's avatar
      branches/zip: mysql-test/patches/information_schema.diff: · f52d978e
      marko authored
      Add patches to other mysql-test results that fail because of the added
      INFORMATION_SCHEMA tables: information_schema_db.result, mysqlshow.result.
      f52d978e
    • vasil's avatar
      branches/zip: · aed42707
      vasil authored
      Rename type_bit_innodb.diff to bug32625.diff since an equivalent patch has
      been submitted to MySQL as Bug#32625 Make test type_bit_innodb more robust.
      aed42707
    • marko's avatar
      branches/zip: Add some more patches to mysql-test. · 2eda3b44
      marko authored
      type_bit_innodb.diff: Ignore the reported duplicate value.  The reported
      value depends on the internal workings of the merge sort in
      fast index creation.  In the built-in InnoDB of MySQL 5.1, the records
      are copied to a new temporary table in the order they were selected from
      the original table.
      
      information_schema.diff: Account for the INFORMATION_SCHEMA tables that
      were added in the InnoDB plugin.
      
      innodb_file_per_table.diff: In the InnoDB plugin, innodb_file_per_table
      is a settable global variable.
      2eda3b44
    • marko's avatar
      branches/zip: Patch the mysql-test suite, so that it will not fail · a25e07ba
      marko authored
      because innodb_lock_wait_timeout is a settable session variable as of r2716.
      
      mysql-test/patches/innodb_lock_wait_timeout.diff: New file.
      a25e07ba
    • calvin's avatar
      Delete the recently added files from MySQL source tree, for · 0eed3f2e
      calvin authored
      Windows plugin. Instead, we will commit diff only.
      0eed3f2e
  10. 06 Oct, 2008 5 commits
    • marko's avatar
      branches/zip: Improve the diagnostics of issue #79. · 80e6e2c2
      marko authored
      page_zip_fail_func(): Display the timestamp.
      
      page_zip_validate_low(): Display information about ignored min_rec_flag
      differences.
      80e6e2c2
    • marko's avatar
      branches/zip: Relax the page_zip_validate() check during crash recovery: · 5f3fbb7b
      marko authored
      ignore intermittent differences in the "predefined minimum record" flag.
      
      page_zip_validate_low(): Renamed from page_zip_validate(), with an
      additional parameter: ibool sloppy.  Ignore REC_INFO_MIN_REC_FLAG when
      sloppy == TRUE.
      
      page_zip_validate(): Wrapper for page_zip_validate_low().  Pass
      sloppy = recv_recovery_is_on().
      
      recv_recover_page(): After applying the changes from the redo log to a
      compressed B-tree page, invoke page_zip_validate_low() in strict mode.
      5f3fbb7b
    • vasil's avatar
      branches/zip: · 9daa40cc
      vasil authored
      Add more ChangeLog entries from the merge
      of 2702:2722 from branches/5.1 (r2723).
      9daa40cc
    • vasil's avatar
      branches/zip: · e32f35c5
      vasil authored
      Add entry for Bug#37788 InnoDB Plugin: AUTO_INCREMENT wrong for compressed tables
      in the ChangeLog
      e32f35c5
    • vasil's avatar
      branches/zip: · 51871e26
      vasil authored
      Add entry for Bug#39830 Table autoinc value not updated on first insert
      in the ChangeLog.
      51871e26
  11. 05 Oct, 2008 1 commit
  12. 04 Oct, 2008 4 commits
    • sunny's avatar
      branches/zip: Fix the handler class method return type. Change ulong to ulint · f1591a52
      sunny authored
      so that it conforms to InnoDB's internal error/return code type.
      f1591a52
    • sunny's avatar
      branches/zip: Simplify the autoinc initialization code. This removes the · 0eff3d3c
      sunny authored
      non-determinism related to reading the table's autoinc value for the first
      time. This change has also reduced the sizeof dict_table_t by sizeof(ibool)
      bytes because we don't need the dict_table_t::autoinc_inited field anymore.
      
      This also fixes Bug#39830 Table autoinc value not updated on first insert.
      rb://16
      0eff3d3c
    • sunny's avatar
      branches/zip: Check column value against the col max value before updating · b5020016
      sunny authored
      the table's global autoinc counter value. This is part of simplifying the
      AUTOINC sub-system. We extract the type info from MySQL data structures at
      runtime.
      
      This fixes Bug#37788 InnoDB Plugin: AUTO_INCREMENT wrong for compressed tables
      b5020016
    • sunny's avatar
      branches/zip: Merge revisions 2702:2722 from branches/5.1: · cb0cacc2
      sunny authored
        ------------------------------------------------------------------------
        r2702 | sunny | 2008-09-30 11:41:56 +0300 (Tue, 30 Sep 2008) | 13 lines
        Changed paths:
           M /branches/5.1/handler/ha_innodb.cc
        
        branches/5.1: Since handler::get_auto_increment() doesn't allow us
        to return the cause of failure we have to inform MySQL using the
        sql_print_warning() function to return the cause for autoinc failure.
        Previously we simply printed the error code, this patch prints the
        text string representing the following two error codes:
        
        DB_LOCK_WAIT_TIMEOUT
        DB_DEADLOCK.
        
        Bug#35498 Cannot get table test/table1 auto-inccounter value in ::info
        
        Approved by Marko.
        
        ------------------------------------------------------------------------
        r2709 | vasil | 2008-10-01 10:13:13 +0300 (Wed, 01 Oct 2008) | 10 lines
        Changed paths:
           M /branches/5.1/include/lock0lock.h
           M /branches/5.1/lock/lock0lock.c
           A /branches/5.1/mysql-test/innodb_bug38231.result
           A /branches/5.1/mysql-test/innodb_bug38231.test
           M /branches/5.1/row/row0mysql.c
        
        branches/5.1:
        
        Fix Bug#38231 Innodb crash in lock_reset_all_on_table() on TRUNCATE + LOCK / UNLOCK
        
        In TRUNCATE TABLE and discard tablespace: do not remove table-level S
        and X locks and do not assert on such locks not being wait locks.
        Leave such locks alone.
        
        Approved by:	Heikki (rb://14)
        
        ------------------------------------------------------------------------
        r2710 | vasil | 2008-10-01 14:13:58 +0300 (Wed, 01 Oct 2008) | 6 lines
        Changed paths:
           M /branches/5.1/include/sync0sync.ic
        
        branches/5.1:
        
        Silence a compilation warning in UNIV_DEBUG.
        
        Approved by:	Marko (via IM)
        
        ------------------------------------------------------------------------
        r2719 | vasil | 2008-10-03 18:17:28 +0300 (Fri, 03 Oct 2008) | 49 lines
        Changed paths:
           M /branches/5.1/handler/ha_innodb.cc
           A /branches/5.1/mysql-test/innodb_bug39438-master.opt
           A /branches/5.1/mysql-test/innodb_bug39438.result
           A /branches/5.1/mysql-test/innodb_bug39438.test
        
        branches/5.1:
        
        Fix Bug#39438 Testcase for Bug#39436 crashes on 5.1 in fil_space_get_latch
        
        In ha_innobase::info() - do not try to get the free space for a tablespace
        which has been discarded with ALTER TABLE ... DISCARD TABLESPACE or if the
        .ibd file is missing for some other reason.
        
        ibd_file_missing and tablespace_discarded are manipulated only in
        row_discard_tablespace_for_mysql() and in row_import_tablespace_for_mysql()
        and the manipulation is protected/surrounded by
        row_mysql_lock_data_dictionary()/row_mysql_unlock_data_dictionary() thus we
        do the same in ha_innobase::info() when checking the values of those members
        to avoid race conditions. I have tested the code-path with UNIV_DEBUG and
        UNIV_SYNC_DEBUG.
        
        Looks like it is not possible to avoid mysqld printing warnings in the
        mysql-test case and thus this test innodb_bug39438 must be added to the
        list of exceptional test cases that are allowed to print warnings. For this,
        the following patch must be applied to the mysql source tree:
        
          --- cut ---
          === modified file 'mysql-test/lib/mtr_report.pl'
          --- mysql-test/lib/mtr_report.pl	2008-08-12 10:26:23 +0000
          +++ mysql-test/lib/mtr_report.pl	2008-10-01 11:57:41 +0000
          @@ -412,7 +412,10 @@
           
                           # When trying to set lower_case_table_names = 2
                           # on a case sensitive file system. Bug#37402.
          -                /lower_case_table_names was set to 2, even though your the file system '.*' is case sensitive.  Now setting lower_case_table_names to 0 to avoid future problems./
          +                /lower_case_table_names was set to 2, even though your the file system '.*' is case sensitive.  Now setting lower_case_table_names to 0 to avoid future problems./ or
          +
          +                # this test is expected to print warnings
          +                ($testname eq 'main.innodb_bug39438')
           		)
                       {
                         next;                       # Skip these lines
          
          --- cut ---
        
        The mysql-test is currently somewhat disabled (see inside
        innodb_bug39438.test), after the above patch has been applied to the mysql
        source tree, the test can be enabled.
        
        rb://20
        
        Reviewed by:	Inaam, Calvin
        Approved by:	Heikki
        
        ------------------------------------------------------------------------
        r2720 | vasil | 2008-10-03 19:52:39 +0300 (Fri, 03 Oct 2008) | 8 lines
        Changed paths:
           M /branches/5.1/handler/ha_innodb.cc
        
        branches/5.1:
        
        Print a warning if an attempt is made to get the free space for a table
        whose .ibd file is missing or the tablespace has been discarded. This is a
        followup to r2719.
        
        Suggested by:	Inaam
        
        ------------------------------------------------------------------------
        r2721 | sunny | 2008-10-04 02:08:23 +0300 (Sat, 04 Oct 2008) | 6 lines
        Changed paths:
           M /branches/5.1/handler/ha_innodb.cc
        
        branches/5.1: We need to send the messages to the client because
        handler::get_auto_increment() doesn't allow a way to return the
        specific error for why it failed.
        
        rb://18
        
        ------------------------------------------------------------------------
        r2722 | sunny | 2008-10-04 02:48:04 +0300 (Sat, 04 Oct 2008) | 18 lines
        Changed paths:
           M /branches/5.1/dict/dict0mem.c
           M /branches/5.1/handler/ha_innodb.cc
           M /branches/5.1/include/dict0mem.h
           M /branches/5.1/include/row0mysql.h
           M /branches/5.1/mysql-test/innodb-autoinc.result
           M /branches/5.1/mysql-test/innodb-autoinc.test
           M /branches/5.1/row/row0mysql.c
        
        branches/5.1: This bug has always existed but was masked by other errors. The
        fix for bug# 38839 triggered this bug. When the offset and increment are > 1
        we need to calculate the next value taking into consideration the two
        variables. Previously we simply assumed they were 1 particularly offset was
        never used. MySQL does its own calculation and that's probably why it seemed
        to work in the past. We would return what we thought was the correct next
        value and then MySQL would recalculate the actual value from that and return
        it to the caller (e.g., handler::write_row()). Several new tests have been
        added that try and catch some edge cases. The tests exposed a wrap around
        error in MySQL next value calculation which was filed as bug#39828. The tests
        will need to be updated once MySQL fix that bug.
        
        One good side effect of this fix is that dict_table_t size has been
        reduced by 8 bytes because we have moved the autoinc_increment field to
        the row_prebuilt_t structure. See review-board for a detailed discussion.
        
        rb://3
        
        ------------------------------------------------------------------------
      cb0cacc2
  13. 03 Oct, 2008 3 commits
    • vasil's avatar
      branches/zip: · de7fedd3
      vasil authored
      ChangeLog:
      Use "Fix Bug#NNNNN bug summary text" for bugfixes, as for other entries
      in the file.
      de7fedd3
    • marko's avatar
      branches/zip: innodb-index.test: Make the pattern for temporary table names · 495e9466
      marko authored
      more generic.  The previous pattern could fail if other test cases were run
      before this one.  Since r2716, the MySQL server is not restarted for this test.
      495e9466
    • marko's avatar
      branches/zip: Make innodb_lock_wait_timeout a settable session variable · be56c647
      marko authored
      (Bug #36285, rb://9).
      
      innodb-index.test, innodb-index.result: Set innodb_lock_wait_timeout as
      a session variable instead of relying on the global value.
      
      innodb-index-master.opt: Remove.
      
      innodb-timeout.test: Test that setting the innodb_lock_wait_timeout
      works as advertised.
      
      thd_lock_wait_timeout(): New function, to retrieve the lock wait timeout
      for a given MySQL client connection (thd), or the global value (thd==NULL).
      
      srv_lock_wait_timeout, innobase_lock_wait_timeout: Remove.
      
      Replace MYSQL_SYSVAR_LONG(lock_wait_timeout)
      with MYSQL_THDVAR_ULONG(lock_wait_timeout).  
      be56c647
  14. 01 Oct, 2008 2 commits