1. 18 Dec, 2009 1 commit
    • Mats Kindahl's avatar
      WL#5151: Conversion between different types · 99184f54
      Mats Kindahl authored
               when replicating
      
      The function create_virtual_tmp_table does not
      set db_low_byte_first in the same way as
      create_tmp_table does, causing copying from
      the virtual table to a real table to get strange
      values for SET types on big-endian machines.
      
      
      mysql-test/extra/rpl_tests/type_conversions.test:
        Adding tests for converting between different-sized sets.
      sql/sql_select.cc:
        Settng dh_low_byte_first for tables created
        with create_virtual_tmp_table.
      99184f54
  2. 16 Dec, 2009 2 commits
  3. 15 Dec, 2009 1 commit
    • Mats Kindahl's avatar
      BUG#49618: Field length stored incorrectly in binary log · a2d92f11
      Mats Kindahl authored
                 for InnoDB
      
      The class Field_bit_as_char stores the metadata for the
      field incorrecly because bytes_in_rec and bit_len are set
      to (field_length + 7 ) / 8 and 0 respectively, while
      Field_bit has the correct values field_length / 8 and
      field_length % 8.
      
      Solved the problem by re-computing the values for the
      metadata based on the field_length instead of using the
      bytes_in_rec and bit_len variables.
      
      To handle compatibility with old server, a table map
      flag was added to indicate that the bit computation is
      exact. If the flag is clear, the slave computes the
      number of bytes required to store the bit field and
      compares that instead, effectively allowing replication
      *without conversion* from any field length that require
      the same number of bytes to store.
      
      mysql-test/suite/rpl/t/rpl_typeconv_innodb.test:
        Adding test to check compatibility for bit field
        replication when using InnoDB.
      sql/field.cc:
        Extending compatible_field_size() with flags from
        table map to allow fields to check master info.
      sql/field.h:
        Extending compatible_field_size() with flags from
        table map to allow fields to check master info.
      sql/log.cc:
        Removing table map flags since they are not used
        outside table map class.
      sql/log_event.cc:
        Removing flags parameter from table map constructor
        since it is not used and does not have to be exposed.
      sql/log_event.h:
        Adding flag to denote that bit length for bit field type
        is exact and not potentially rounded to even bytes.
      sql/rpl_utility.cc:
        Adding fields to table_def to store table map flags.
      sql/rpl_utility.h:
        Removing obsolete comment and adding flags to store
        table map flags from master.
      a2d92f11
  4. 14 Dec, 2009 2 commits
    • Mats Kindahl's avatar
      WL#5151: Conversion between different types when replicating · ce6dd1ee
      Mats Kindahl authored
      Fixing minor error when printing SQL types from master and cleaning some code.
      
      Updating result files.
      ce6dd1ee
    • Mats Kindahl's avatar
      WL#5151: Conversion between different types when replicating · 2ef051a8
      Mats Kindahl authored
      Row-based replication requires the types of columns on the
      master and slave to be approximately the same (some safe
      conversions between strings are allowed), but does not
      allow safe conversions between fields of similar types such
      as TINYINT and INT.
      
      This patch implement type conversions between similar fields
      on the master and slave.
      
      The conversions are controlled using a new variable
      SLAVE_TYPE_CONVERSIONS of type SET('ALL_LOSSY','ALL_NON_LOSSY').
      
      Non-lossy conversions are any conversions that do not run the
      risk of losing any information, while lossy conversions can
      potentially truncate the value. The column definitions are
      checked to decide if the conversion is acceptable.
      
      If neither conversion is enabled, it is required that the
      definitions of the columns are identical on master and slave.
      
      Conversion is done by creating an internal conversion table,
      unpacking the master data into it, and then copy the data to
      the real table on the slave.
      
      .bzrignore:
        New files added
      client/Makefile.am:
        New files added
      client/mysqlbinlog.cc:
        Functions in rpl_utility.cc is now needed by mysqlbinlog.cc.
      libmysqld/Makefile.am:
        New files added
      mysql-test/extra/rpl_tests/check_type.inc:
        Test include file to check a single type conversion.
      mysql-test/extra/rpl_tests/rpl_extraSlave_Col.test:
        Switching to use INT instead of TEXT for column that should not have matching types.
      mysql-test/extra/rpl_tests/rpl_row_basic.test:
        Adding code to enable type conversions for BIT tests since InnoDB
        cannot handle them properly due to incorrect information stored as
        metadata.
      mysql-test/extra/rpl_tests/type_conversions.test:
        Test file to check a set of type conversions
        with current settings of slave_type_conversions.
      mysql-test/suite/rpl/t/rpl_typeconv.test:
        Test file to test conversions from master to slave with
        all possible values for slave_type_conversions.
        
        The test also checks that the slave_type_conversions
        variable works as expected.
      sql/field.cc:
        Changing definition of compatible_field_size to both check if 
        two field with identical base types are compatible and give an
        order between them if they are compatible.
        
        This only implement checking on the slave, so it will not affect
        replication from an old master to a new slave.
      sql/field.h:
        Changing prototypes for functions:
        - compatible_field_size()
        - init_for_tmp_table()
        - row_pack_length()
      sql/log_event.cc:
        Changing compability checks to build a conversion table if the fields
        are compatible, but does not have the same base type.
      sql/log_event_old.cc:
        Changing compability checks to build a conversion table if the fields
        are compatible, but does not have the same base type.
      sql/mysql_priv.h:
        Adding global option variable for SLAVE_TYPE_CONVERSIONS
      sql/mysqld.cc:
        Adding SLAVE_TYPE_CONVERSIONS global server variable.
      sql/rpl_record.cc:
        Changing unpack_row to use the conversion table if present.
      sql/rpl_rli.h:
        Removing function get_tabledef and replacing it with get_table_data().
        This function retrieve data for table opened for replication, not just
        table definition.
      sql/rpl_utility.cc:
        Function table_def::compatible_with is changed to compare table on master
        and slave for compatibility and generate a conversions table if they are
        compatible.
        
        Computing real type of fields from metadata for ENUM and SET types.
        Computing pack_length correctly for ENUM, SET, and BLOB types.
        
        Adding optimization to not check compatibility if no
        slave type conversions are enabled.
      sql/rpl_utility.h:
        Changing prototypes since implementation has changed.
        
        Modifying table_def::type() to return real type instead of stored type.
      sql/set_var.cc:
        Adding SLAVE_TYPE_CONVERSIONS variable.
      sql/set_var.h:
        Adding SLAVE_TYPE_CONVERSIONS variable.
      sql/share/errmsg.txt:
        Adding error messages for slave type conversions.
      sql/sql_class.h:
        Adding SLAVE_TYPE_CONVERSIONS variable.
      sql/sql_select.cc:
        Correcting create_virtual_tmp_table() to compute null bit positions
        correctly in the presence of bit fields.
      2ef051a8
  5. 21 Oct, 2009 1 commit
  6. 20 Oct, 2009 1 commit
  7. 19 Oct, 2009 2 commits
  8. 18 Oct, 2009 1 commit
  9. 17 Oct, 2009 1 commit
  10. 16 Oct, 2009 10 commits
  11. 15 Oct, 2009 8 commits
  12. 14 Oct, 2009 10 commits
    • Jorgen Loland's avatar
      merge · d9ea1943
      Jorgen Loland authored
      d9ea1943
    • Jorgen Loland's avatar
      Followup patch for BUG#47280 · 08965b75
      Jorgen Loland authored
      Temporary tables may set join->group to 0 even though there is 
      grouping. Also need to test if sum_func_count>0 when JOIN::exec() 
      decides whether to present results in a grouped manner.
      
      sql/sql_select.cc:
        Temporary tables may set join->group to 0 even though there is 
        grouping. Also need to test if sum_func_count>0 when JOIN::exec() 
        decides whether to present results in a grouped manner.
      08965b75
    • Georgi Kodinov's avatar
      merge · d7f8581c
      Georgi Kodinov authored
      d7f8581c
    • Georgi Kodinov's avatar
      merge · fd914752
      Georgi Kodinov authored
      fd914752
    • Georgi Kodinov's avatar
      version change · 5649f3ce
      Georgi Kodinov authored
      5649f3ce
    • Georgi Kodinov's avatar
      merge · d3350778
      Georgi Kodinov authored
      d3350778
    • Georgi Kodinov's avatar
      merged main to mysql-5.0-bugteam · a92e6d3b
      Georgi Kodinov authored
      a92e6d3b
    • Georgi Kodinov's avatar
      merged 5.1-main · 752287f6
      Georgi Kodinov authored
      752287f6
    • He Zhenxing's avatar
      Attempt to fix Windows testcase output issue · ec03ebdf
      He Zhenxing authored
      ec03ebdf
    • Jorgen Loland's avatar
      Bug#47280 - strange results from count(*) with order by multiple · 3ab5751a
      Jorgen Loland authored
                  columns without where/group
                           
      Simple SELECT with implicit grouping used to return many rows if
      the query was ordered by the aggregated column in the SELECT
      list. This was incorrect because queries with implicit grouping
      should only return a single record.
                                    
      The problem was that when JOIN:exec() decided if execution needed
      to handle grouping, it was assumed that sum_func_count==0 meant
      that there were no aggregate functions in the query. This
      assumption was not correct in JOIN::exec() because the aggregate
      functions might have been optimized away during JOIN::optimize().
                        
      The reason why queries without ordering behaved correctly was
      that sum_func_count is only recalculated if the optimizer chooses
      to use temporary tables (which it does in the ordered case).
      Hence, non-ordered queries were correctly treated as grouped.
                        
      The fix for this bug was to remove the assumption that
      sum_func_count==0 means that there is no need for grouping. This
      was done by introducing variable "bool implicit_grouping" in the
      JOIN object.
      
      mysql-test/r/func_group.result:
        Add test for BUG#47280
      mysql-test/t/func_group.test:
        Add test for BUG#47280
      sql/opt_sum.cc:
        Improve comment for opt_sum_query()
      sql/sql_class.h:
        Add comment for variables in TMP_TABLE_PARAM
      sql/sql_select.cc:
        Introduce and use variable implicit_grouping instead of (!group_list && sum_func_count) in places that need to test if grouping is required. Also added comments for: optimization of aggregate fields for implicitly grouped queries  (JOIN::optimize) and choice of end_select method (JOIN::execute)
      sql/sql_select.h:
        Add variable implicit_grouping, which will be TRUE for queries that contain aggregate functions but no GROUP BY clause. Also added comment to sort_and_group variable.
      3ab5751a