1. 02 Feb, 2011 5 commits
    • Dmitry Lenev's avatar
      Merged fix for bug #58650 "Failing assertion: · d98270e1
      Dmitry Lenev authored
      primary_key_no == -1 || primary_key_no == 0"
      with recent changes from mysql-5.5 tree.
      d98270e1
    • Dmitry Lenev's avatar
      Merged fix for bug #58650 "Failing assertion: · 5c3151e4
      Dmitry Lenev authored
      primary_key_no == -1 || primary_key_no == 0"
      into mysql-5.5 tree.
      5c3151e4
    • Dmitry Lenev's avatar
      Fix for bug #58650 "Failing assertion: primary_key_no == -1 || · e805a0fd
      Dmitry Lenev authored
      primary_key_no == 0".
      
      Attempt to create InnoDB table with non-nullable column of
      geometry type having an unique key with length 12 on it and
      with some other candidate key led to server crash due to
      assertion failure in both non-debug and debug builds.
      
      The problem was that such a non-candidate key could have
      been sorted as the first key in table/.FRM, before any legit
      candidate keys. This resulted in assertion failure in InnoDB
      engine which assumes that primary key should either be the
      first key in table/.FRM or should not exist at all.
      
      The reason behind such an incorrect sorting was an wrong
      value of Create_field::key_length member for geometry field
      (which was set to its pack_length == 12) which confused code
      in mysql_prepare_create_table(), so it would skip marking
      such key as a key with partial segments.
      
      This patch fixes the problem by ensuring that this member
      gets the same value of Create_field::key_length member as 
      for other blob fields (from which geometry field class is
      inherited), and as result unique keys on geometry fields
      are correctly marked as having partial segments.
      
      
      mysql-test/include/gis_keys.inc:
        Added test case for bug #58650 "Failing assertion:
        primary_key_no == -1 || primary_key_no == 0".
      mysql-test/r/gis.result:
        Added test case for bug #58650 "Failing assertion:
        primary_key_no == -1 || primary_key_no == 0".
      mysql-test/suite/innodb/r/innodb_gis.result:
        Added test case for bug #58650 "Failing assertion:
        primary_key_no == -1 || primary_key_no == 0".
      mysql-test/suite/innodb_plugin/r/innodb_gis.result:
        Added test case for bug #58650 "Failing assertion:
        primary_key_no == -1 || primary_key_no == 0".
      sql/field.cc:
        Changed Create_field::create_length_to_internal_length() to
        correctly set Create_field::key_length member for geometry
        fields. Similar to the blob types key_length for such fields
        should be the same as length and not field's packed length
        (which is always 12 for geometry).
        
        As result of this change code handling table creation now
        always correctly identifies btree/unique keys on geometry
        fields as partial keys, so such keys can't be erroneously
        treated as candidate keys and sorted in keys array in .FRM
        before legit candidate keys.
        
        This fixes bug #58650 "Failing assertion: primary_key_no ==
        -1 || primary_key_no == 0" in which incorrect candidate key
        sorting led to assertion failure in InnoDB code.
      e805a0fd
    • Tor Didriksen's avatar
      Bug #36022 please log more information about "Sort aborted" queries · c711ce67
      Tor Didriksen authored
      Write an additional warning message to the server log, 
      explaining why a sort operation is aborted.
      
      The output in mysqld.err will look something like:
      110127 15:07:54 [ERROR] mysqld: Sort aborted: Out of memory (Needed 24 bytes)
      110127 15:07:54 [ERROR] mysqld: Out of sort memory, consider increasing server sort buffer size
      110127 15:07:54 [ERROR] mysqld: Sort aborted: Out of sort memory, consider increasing server sort buffer size
      110127 15:07:54 [ERROR] mysqld: Sort aborted: Incorrect number of arguments for FUNCTION test.f1; expected 0, got 1
      
      If --log-warn=2 is enabled, we output information about host/user/query as well.
      
      
      include/my_sys.h:
        Update comment for ME_NOREFRESH
      mysql-test/include/mtr_warnings.sql:
        Remove global filtering of "Out of sort memory", let each individual test set it instead.
      mysql-test/r/filesort_debug.result:
        New test case.
      mysql-test/r/order_by.result:
        Ignore "Out of memory" for this test.
      mysql-test/t/filesort_debug.test:
        New test case.
      mysql-test/t/order_by.test:
        Ignore "Out of memory" for this test.
      sql/filesort.cc:
        Output an explanation using the error message from the THD Diagnostics_area.
      sql/protocol.cc:
        Do not DBUG_RETURN(function_call_with DBUG_RETURN)
        as it messes up the call stack in the debug output.
      sql/share/errmsg-utf8.txt:
        Change error message for "Out of sort memory"
      sql/unireg.h:
        Remove unused/confusing ERRMAPP macro.
      c711ce67
    • Tor Didriksen's avatar
      Backport of fix for Bug#52123 · b503d77d
      Tor Didriksen authored
      b503d77d
  2. 01 Feb, 2011 3 commits
    • Ole John Aske's avatar
      Fix for bug#58490, 'Incorrect result in multi level OUTER JOIN · ed74edad
      Ole John Aske authored
      in combination with IS NULL'
            
      As this bug is a duplicate of bug#49322, it also includes test cases
      covering this bugreport
            
      Qualifying an OUTER JOIN with the condition 'WHERE <column> IS NULL',
      where <column> is declared as 'NOT NULL' causes the
      'not_exists_optimize' to be enabled by the optimizer.
            
      In evaluate_join_record() the 'not_exists_optimize' caused
      'NESTED_LOOP_NO_MORE_ROWS' to be returned immediately
      when a matching row was found.
            
      However, as the 'not_exists_optimize' is derived from
      'JOIN_TAB::select_cond', the usual rules for condition guards
      also applies for 'not_exist_optimize'. It is therefore incorrect
      to check 'not_exists_optimize' without ensuring that all guards
      protecting it is 'open'.
            
      This fix uses the fact that 'not_exists_optimize' is derived from
      a 'is_null' predicate term in 'tab->select_cond'. Furthermore,
      'is_null' will evaluate to 'false' for any 'non-null' rows
      once all guards protecting the is_null is open.
            
      We can use this knowledge as an implicit guard check for the
      'not_exists_optimize' by moving 'if (...not_exists_optimize)'
      inside the handling of 'select_cond==false'. It will then
      not take effect before its guards are open.
            
      We also add an assert which requires that a
      'not_exists_optimize' always comes together with
      a select_cond. (containing 'is_null').
      ed74edad
    • Ole John Aske's avatar
      Merge · 4b8888f6
      Ole John Aske authored
      4b8888f6
    • Ole John Aske's avatar
      Fix for bug#57030: ('BETWEEN' evaluation is incorrect') · 59269b1d
      Ole John Aske authored
                  
      Root cause for this bug is that the optimizer try to detect&
      optimize the special case:
            
      '<field>  BETWEEN c1 AND c1' and handle this as the condition '<field>  = c1'
                  
      This was implemented inside add_key_field(.. *field, *value[]...)
      which assumed field to refer key Field, and value[] to refer a [low...high]
      constant pair. value[0] and value[1] was then compared for equality.
                  
      In a 'normal' BETWEEN condition of the form '<field>  BETWEEN val1 and val2' the
      BETWEEN operation is represented with an argementlist containing the
      values [<field>, val1, val2] - add_key_field() is then called with
      parameters field=<field>, *value=val1.
                  
      However, if the BETWEEN predicate specified:
                  
       1)  '<const1>  BETWEEN<const2>  AND<field>
                  
      the 'field' and 'value' arguments to add_key_field() had to be swapped.
      This was implemented by trying to cheat add_key_field() to handle it like:
                  
       2) '<const1>  GE<const2>  AND<const1>  LE<field>'
                  
      As we didn't really replace the BETWEEN operation with 'ge' and 'le',
      add_key_field() still handled it as a 'BETWEEN' and compared the (swapped)
      arguments<const1>  and<const2>  for equality. If they was equal, the
      condition 1) was incorrectly 'optimized' to:
                  
       3) '<field>  EQ <const1>'
                  
      This fix moves this optimization of '<field>  BETWEEN c1 AND c1' into
      add_key_fields() which then calls add_key_equal_fields() to collect 
      key equality / comparison for the key fields in the BETWEEN condition.
      59269b1d
  3. 31 Jan, 2011 9 commits
  4. 30 Jan, 2011 4 commits
  5. 29 Jan, 2011 5 commits
  6. 28 Jan, 2011 10 commits
    • Bjorn Munch's avatar
      Bug #59148 'INSTALL PLUGIN rpl_semi_sync_master' fails in release build with debug binaries · 74f773b4
      Bjorn Munch authored
      Do as mysqld_safe: if running mysqld-debug, plugins are in debug subdirs
      NB mtr --debug won't work in this context until 47141 is fixed
      Also moved read_plugin_defs; no point running this in all worker threads
      74f773b4
    • Mattias Jonsson's avatar
      merge · 70e3313e
      Mattias Jonsson authored
      70e3313e
    • Mattias Jonsson's avatar
      minor fix of copyright header · d83706bc
      Mattias Jonsson authored
      d83706bc
    • Mattias Jonsson's avatar
      merge · bede87d3
      Mattias Jonsson authored
      bede87d3
    • Alfranio Correia's avatar
      BUG#59338 Inconsistency in binlog for statements that don't change any rows STATEMENT SBR · 8ce9b992
      Alfranio Correia authored
      In SBR, if a statement does not fail, it is always written to the binary
      log, regardless if rows are changed or not. If there is a failure, a
      statement is only written to the binary log if a non-transactional (.e.g.
      MyIsam) engine is updated.
      
      INSERT ON DUPLICATE KEY UPDATE and INSERT IGNORE were not following the
      rule above and were not written to the binary log, if then engine was
      Innodb.
      
      mysql-test/extra/rpl_tests/rpl_insert_duplicate.test:
        Added test case.
      mysql-test/extra/rpl_tests/rpl_insert_ignore.test:
        Updated test case.
      mysql-test/include/commit.inc:
        Updated test case as the calls to the binary log have changed
        for INSERT ON DUPLICATE and INSERT IGNORE.
      mysql-test/r/commit_1innodb.result:
        Updated result file.
      mysql-test/suite/rpl/r/rpl_insert_duplicate.result:
        Added test case.
      mysql-test/suite/rpl/r/rpl_insert_ignore.result:
        Updated result file.
      mysql-test/suite/rpl/t/rpl_insert_duplicate.test:
        Added test case.
      mysql-test/suite/rpl/t/rpl_insert_ignore.test:
        Improved test case.
      8ce9b992
    • John H. Embretsen's avatar
      Null-merge from mysql-5.1 · cbf2f80d
      John H. Embretsen authored
      cbf2f80d
    • Jimmy Yang's avatar
      b448b5d5
    • Jimmy Yang's avatar
      df13ee2e
    • Jimmy Yang's avatar
      Fix Bug #59465 btr_estimate_number_of_different_key_vals use incorrect offset · 71e8043b
      Jimmy Yang authored
      for external_size
            
      rb://581 approved by Marko
      71e8043b
    • Alfranio Correia's avatar
      BUG#55675 rpl.rpl_log_pos fails sporadically with error binlog truncated in the middle · 235e10d9
      Alfranio Correia authored
      There are two calls to read_log_event() on master in mysql_binlog_send().
      Each call reads 19 bytes in this test case and the error of the second
      read_log_event() is reported to the slave.
      
      The second read_log_event() starts from position 94 (75 + 19) to 113
      (75 + 19 + 19). Usually, there are two events in the binary log:
      
          . 0   - 3   - Header
          . 4   - 105 - Format Descriptor Event
          . 106 - 304 - Query Event
      
      and both reads fail because operations are reading from invalid positions
      as expected.
      
      However, mysql_binlog_send() does not use the same IO_CACHE that is used to
      write into binary log (i.e. mysql_bin_log.log_file) for the hot binary log.
      It opens the binary log file directly by calling open_binlog() and creates a
      separated IO_CACHE. So there is a possibly that after a master has flushed
      the binary log file, the content has been cached by the filesystem, and has
      not updated the disk file. If this happens, then a slave will only see part
      of the file, and thus the second read_log_event() will report event truncated
      error.
      
      To fix the problem, if the first read_log_event() has failed, we ensure that
      the second one will try to read from the same position.
      235e10d9
  7. 27 Jan, 2011 4 commits