1. 21 Oct, 2009 1 commit
    • Mattias Jonsson's avatar
      WL#3352, minor code formatting fixes after code review · 9337f49d
      Mattias Jonsson authored
      sql/opt_range.cc:
        WL#3352 code review fixes
        
        Corrected indenting and added range_par parameter for easier reading/formatting.
      sql/partition_element.h:
        WL#3352, changed formatting of copyright header
      sql/sql_partition.cc:
        WL#3352, fixed indenting and changed MAX_VALUE to MAXVALUE
      sql/sql_partition.h:
        WL#3352, fixed copyright header and indenting of
        function header
      9337f49d
  2. 16 Oct, 2009 1 commit
  3. 01 Oct, 2009 1 commit
  4. 15 Sep, 2009 1 commit
  5. 30 Aug, 2009 1 commit
    • Alexey Kopytov's avatar
      Bug #46607: Assertion failed: (cond_type == Item::FUNC_ITEM) · 9620aec7
      Alexey Kopytov authored
                  results in server crash 
       
      check_group_min_max_predicates() assumed the input condition 
      item to be one of COND_ITEM, SUBSELECT_ITEM, or FUNC_ITEM. 
      Since a condition of the form "field" is also a valid condition 
      equivalent to "field <> 0", using such a condition in a query 
      where the loose index scan was chosen resulted in a debug 
      assertion failure. 
       
      Fixed by handling conditions of the FIELD_ITEM type in 
      check_group_min_max_predicates(). 
      
      mysql-test/r/group_min_max.result:
        Added a test case for bug #46607.
      mysql-test/t/group_min_max.test:
        Added a test case for bug #46607.
      sql/opt_range.cc:
        Handle conditions of the FUNC_ITEM type in 
        check_group_mix_max_predicates().
      9620aec7
  6. 28 Aug, 2009 1 commit
    • Staale Smedseng's avatar
      Bug #43414 Parenthesis (and other) warnings compiling MySQL · 2708ec4f
      Staale Smedseng authored
      with gcc 4.3.2
            
      This patch fixes a number of GCC warnings about variables used
      before initialized. A new macro UNINIT_VAR() is introduced for
      use in the variable declaration, and LINT_INIT() usage will be
      gradually deprecated. (A workaround is used for g++, pending a
      patch for a g++ bug.)
            
      GCC warnings for unused results (attribute warn_unused_result)
      for a number of system calls (present at least in later
      Ubuntus, where the usual void cast trick doesn't work) are
      also fixed.
      
      
      client/mysqlmanager-pwgen.c:
        A fix for warn_unused_result, adding fallback to use of
        srand()/rand() if /dev/random cannot be used. Also actually
        adds calls to rand() in the second branch so that it actually
        creates a random password.
      2708ec4f
  7. 26 Aug, 2009 2 commits
    • Mattias Jonsson's avatar
      Bug#20577: Partitions: use of to_days() function leads to selection failures · 591141d9
      Mattias Jonsson authored
      Problem was that the partition containing NULL values
      was pruned away, since '2001-01-01' < '2001-02-00' but
      TO_DAYS('2001-02-00') is NULL.
      
      Added the NULL partition for RANGE/LIST partitioning on TO_DAYS()
      function to be scanned too.
      
      Also fixed a bug that added ALLOW_INVALID_DATES to sql_mode
      (SELECT * FROM t WHERE date_col < '1999-99-99' on a RANGE/LIST
      partitioned table would add it).
      
      mysql-test/include/partition_date_range.inc:
        Bug#20577: Partitions: use of to_days() function leads to selection failures
        
        Added include file to decrease test code duplication
      mysql-test/r/partition_pruning.result:
        Bug#20577: Partitions: use of to_days() function leads to selection failures
        
        Added test results
      mysql-test/r/partition_range.result:
        Bug#20577: Partitions: use of to_days() function leads to selection failures
        
        Updated test result.
        This fix adds the partition containing NULL values to
        the list of partitions to be scanned.
      mysql-test/t/partition_pruning.test:
        Bug#20577: Partitions: use of to_days() function leads to selection failures
        
        Added test case
      sql/item.h:
        Bug#20577: Partitions: use of to_days() function leads to selection failures
        
        Added MONOTONIC_*INCREASE_NOT_NULL values to be used by TO_DAYS.
      sql/item_timefunc.cc:
        Bug#20577: Partitions: use of to_days() function leads to selection failures
        
        Calculate the number of days as return value even for invalid dates.
        This is so that pruning can be used even for invalid dates.
      sql/opt_range.cc:
        Bug#20577: Partitions: use of to_days() function leads to selection failures
        
        Fixed a bug that added ALLOW_INVALID_DATES to sql_mode
        (SELECT * FROM t WHERE date_col < '1999-99-99' on a RANGE/LIST
        partitioned table would add it).
      sql/partition_info.h:
        Bug#20577: Partitions: use of to_days() function leads to selection failures
        
        Resetting ret_null_part when a single partition is to be used, this
        to avoid adding the NULL partition.
      sql/sql_partition.cc:
        Bug#20577: Partitions: use of to_days() function leads to selection failures
        
        Always include the NULL partition if RANGE or LIST.
        Use the returned value for the function for pruning, even if
        it is marked as NULL, so that even '2000-00-00' can be
        used for pruning, even if TO_DAYS('2000-00-00') is NULL.
        
        Changed == to >= in get_next_partition_id_list to avoid
        crash if part_iter->part_nums is not correctly setup.
      591141d9
    • Mattias Jonsson's avatar
      Bug#46362: Endpoint should be set to false for TO_DAYS(DATE) · 39f20d3a
      Mattias Jonsson authored
      There were a problem since pruning uses the field
      for comparison (while evaluate_join_record uses longlong),
      resulting in pruning failures when comparing DATE to DATETIME.
      
      Fix was to always comparing DATE vs DATETIME as DATETIME,
      by adding ' 00:00:00' to the DATE string.
      
      And adding optimization for comparing with 23:59:59, so that
      DATETIME_col > '2001-02-03 23:59:59' ->
      TO_DAYS(DATETIME_col) > TO_DAYS('2001-02-03 23:59:59') instead
      of '>='.
      
      mysql-test/r/partition_pruning.result:
        Bug#46362: Endpoint should be set to false for TO_DAYS(DATE)
        
        Updated result-file
      mysql-test/t/partition_pruning.test:
        Bug#46362: Endpoint should be set to false for TO_DAYS(DATE)
        
        Added testcases.
      sql-common/my_time.c:
        Bug#46362: Endpoint should be set to false for TO_DAYS(DATE)
        
        removed duplicate assignment.
      sql/item.cc:
        Bug#46362: Endpoint should be set to false for TO_DAYS(DATE)
        
        Changed field_is_equal_to_item into field_cmp_to_item, to
        better handling DATE vs DATETIME comparision.
      sql/item.h:
        Bug#46362: Endpoint should be set to false for TO_DAYS(DATE)
        
        Updated comment
      sql/item_timefunc.cc:
        Bug#46362: Endpoint should be set to false for TO_DAYS(DATE)
        
        Added optimization (pruning) of DATETIME where time-part is
        23:59:59
      sql/opt_range.cc:
        Bug#46362: Endpoint should be set to false for TO_DAYS(DATE)
        
        Using the new stored_field_cmp_to_item for better pruning.
      39f20d3a
  8. 24 Aug, 2009 1 commit
    • Georgi Kodinov's avatar
      Bug #37044: Read overflow in opt_range.cc found during "make test" · 31abbbb0
      Georgi Kodinov authored
      The code was using a special global buffer for the value of IS NULL ranges.
      This was not always long enough to be copied by a regular memcpy. As a 
      result read buffer overflows may occur.
      Fixed by setting the null byte to 1 and setting the rest of the field disk image
      to NULL with a bzero (instead of relying on the buffer and memcpy()).
      31abbbb0
  9. 19 Aug, 2009 1 commit
  10. 16 Jul, 2009 1 commit
  11. 09 Jul, 2009 1 commit
  12. 12 Jun, 2009 1 commit
    • Georgi Kodinov's avatar
      Bug #45386: Wrong query result with MIN function in field list, · 131c9556
      Georgi Kodinov authored
      WHERE and GROUP BY clause
      
      Loose index scan may use range conditions on the argument of 
      the MIN/MAX aggregate functions to find the beginning/end of 
      the interval that satisfies the range conditions in a single go.
      These range conditions may have open or closed minimum/maximum 
      values. When the comparison returns 0 (equal) the code should 
      check the type of the min/max values of the current interval 
      and accept or reject the row based on whether the limit is 
      open or not.
      There was a wrong composite condition on checking this and it was
      not working in all cases.
      Fixed by simplifying the conditions and reversing the logic.
      
      mysql-test/r/group_min_max.result:
        Bug #45386: test case
      mysql-test/t/group_min_max.test:
        Bug #45386: test case
      sql/opt_range.cc:
        Bug #45386: fix the check whether to use the value if on the
        interval boundry
      131c9556
  13. 10 Jun, 2009 1 commit
    • Martin Hansson's avatar
      Bug#44821: select distinct on partitioned table returns wrong results · 5659973b
      Martin Hansson authored
      Range analysis did not request sorted output from the storage engine,
      which cause partitioned handlers to process one partition at a time
      while reading key prefixes in ascending order, causing values to be 
      missed. Fixed by always requesting sorted order during range analysis.
      This fix is introduced in 6.0 by the fix for bug no 41136.
      
      mysql-test/r/group_min_max.result:
        Bug#44821: Test result.
      mysql-test/t/group_min_max.test:
        Bug#44821: Test case
      sql/opt_range.cc:
        Bug#44821: Fix.
      5659973b
  14. 09 Jun, 2009 2 commits
    • Staale Smedseng's avatar
      Bug #43414 Parenthesis (and other) warnings compiling MySQL · eb545e64
      Staale Smedseng authored
      with gcc 4.3.2
            
      Compiling MySQL with gcc 4.3.2 and later produces a number of 
      warnings, many of which are new with the recent compiler
      versions.
            
      This bug will be resolved in more than one patch to limit the
      size of changesets. This is the first patch, fixing a number 
      of the warnings, predominantly "suggest using parentheses 
      around && in ||", and empty for and while bodies.
      eb545e64
    • Staale Smedseng's avatar
      Bug #43414 Parenthesis (and other) warnings compiling MySQL · 9d67536f
      Staale Smedseng authored
      with gcc 4.3.2
      
      Compiling MySQL with gcc 4.3.2 and later produces a number of 
      warnings, many of which are new with the recent compiler
      versions.
      
      This bug will be resolved in more than one patch to limit the
      size of changesets. This is the first patch, fixing a number 
      of the warnings, predominantly "suggest using parentheses 
      around && in ||", and empty for and while bodies.
      9d67536f
  15. 30 Apr, 2009 1 commit
  16. 11 Mar, 2009 1 commit
  17. 27 Feb, 2009 1 commit
    • Georgi Kodinov's avatar
      Bug #41610: key_infix_len can be overwritten causing some group by queries to · baf88385
      Georgi Kodinov authored
      return no rows
      
      The algorithm of determining the best key for loose index scan is doing a loop
      over the available indexes and selects the one that has the best cost.
      It retrieves the parameters of the current index into a set of variables.
      If the cost of using the current index is lower than the best cost so far it 
      copies these variables into another set of variables that contain the 
      information for the best index so far.
      After having checked all the indexes it uses these variables (outside of the 
      index loop) to create the table read plan object instance.
      The was a single omission : the key_infix/key_infix_len variables were used 
      outside of the loop without being preserved in the loop for the best index 
      so far.
      This causes these variables to get overwritten by the next index(es) checked.
      Fixed by adding variables to hold the data for the current index, passing 
      the new variables to the function that assigns values to them and copying 
      the new variables into the existing ones when selecting a new current best 
      index.
      To avoid further such problems moved the declarations of the variables used 
      to keep information about the current index inside the loop's compound 
      statement.
      
      mysql-test/r/group_min_max.result:
        Bug #41610: test case
      mysql-test/t/group_min_max.test:
        Bug #41610: test case
      sql/opt_range.cc:
        Bug #41610: copy the infix data for the current best index
      baf88385
  18. 23 Feb, 2009 1 commit
    • Sergey Petrunia's avatar
      - Backport @@optimizer_switch support from 6.0 · dbe898bb
      Sergey Petrunia authored
      - Add support for setting it as a server commandline argument
      - Add support for those switches:
        = no_index_merge
        = no_index_merge_union
        = no_index_merge_sort_union
        = no_index_merge_intersection
      
      mysql-test/r/index_merge_myisam.result:
        Testcases for index_merge related @@optimizer_switch flags.
      mysql-test/t/index_merge_myisam.test:
        Testcases for index_merge related @@optimizer_switch flags.
      sql/set_var.cc:
        - Backport @@optimizer_switch support from 6.0
        - Add support for setting it as a server commandline argument
      sql/sql_class.h:
        - Backport @@optimizer_switch support from 6.0
      sql/sql_select.h:
        - Backport @@optimizer_switch support from 6.0
      dbe898bb
  19. 10 Feb, 2009 1 commit
  20. 19 Dec, 2008 1 commit
    • Sergey Petrunia's avatar
      BUG#40974: Incorrect query results when using clause evaluated using range check · 8cecb71d
      Sergey Petrunia authored
      - QUICK_INDEX_MERGE_SELECT deinitializes its rnd_pos() scan when it reaches EOF, but we 
        need to make the deinitialization in QUICK_INDEX_MERGE_SELECT destructor also. This is because
        certain execution strategies can stop scanning without reaching EOF, then then try to do a full
        table scan on this table. Failure to deinitialize caused the full scan to use (already empty) 
        table->sort and produce zero records.
      
      mysql-test/r/index_merge.result:
        BUG#40974: Incorrect query results when using clause evaluated using range check
        - Testcase
      mysql-test/t/index_merge.test:
        BUG#40974: Incorrect query results when using clause evaluated using range check
        - Testcase
      8cecb71d
  21. 09 Dec, 2008 2 commits
    • Georgi Kodinov's avatar
      backported the fix for bug #34773 to 5.0 · e9e17dec
      Georgi Kodinov authored
      e9e17dec
    • Georgi Kodinov's avatar
      Bug #37936: ASSERT_COLUMN_MARKED_FOR_WRITE in Field_datetime::store , · d44d9aae
      Georgi Kodinov authored
      Field_varstring::store
            
      The code that temporary saved the bitmaps of the read set and the write set so that
      it can set it to all columns for debug purposes was not expecting that the
      table->read_set and table->write_set can be the same. And was always saving both in 
      sequence.
      As a result the original value was never restored.
      Fixed by saving & restoring the original value only once if the two sets are the
      same (in a special set of functions).
      
      mysql-test/r/select.result:
        Bug #37936: test case
      mysql-test/t/select.test:
        Bug #37936: test case
      sql/item_cmpfunc.cc:
        Bug #37936: don't save/restore twice if the read and write sets are the same
      sql/opt_range.cc:
        Bug #37936: don't save/restore twice if the read and write sets are the same
      sql/table.h:
        Bug #37936: Make a designated set of functions that save/restore
        both the read and the write sets in a single call.
      d44d9aae
  22. 10 Nov, 2008 1 commit
  23. 10 Oct, 2008 1 commit
    • Gleb Shchepa's avatar
      Bug #37894: Assertion in init_read_record_seq in handler.h line 1444 · efb3a353
      Gleb Shchepa authored
      Select with a "NULL NOT IN" condition containing complex
      subselect from the same table as in the outer select failed
      with an assertion.
      
      
      The failure was caused by a concatenation of circumstances:
      1) an inner select was optimized by make_join_statistics to use
         the QUICK_RANGE_SELECT access method (that implies an index
         scan of the table);
      2) a subselect was independent (constant) from the outer select;
      3) a condition was pushed down into inner select.
      
      During the evaluation of a constant IN expression an optimizer
      temporary changed the access method from index scan to table
      scan, but an engine handler was already initialized for index
      access by make_join_statistics. That caused an assertion.
      
      
      Unnecessary index initialization has been removed from
      the QUICK_RANGE_SELECT::init method (QUICK_RANGE_SELECT::reset
      reinvokes this initialization).
      
      
      mysql-test/r/subselect3.result:
        Added test case for bug #37894.
      mysql-test/t/subselect3.test:
        Added test case for bug #37894.
      sql/opt_range.cc:
        Bug #37894: Assertion in init_read_record_seq in handler.h line 1444
        
        Unnecessary index initialization has been removed from
        the QUICK_RANGE_SELECT::init method (QUICK_RANGE_SELECT::reset
        reinvokes this initialization).
      efb3a353
  24. 06 Oct, 2008 3 commits
    • Georgi Kodinov's avatar
      Bug#34773: query with explain extended and derived table / other table · 613a9e3d
      Georgi Kodinov authored
      crashes server
      
      When creating temporary table that contains aggregate functions a 
      non-reversible source transformation was performed to redirect aggregate
      function arguments towards temporary table columns.
      This caused EXPLAIN EXTENDED to fail because it was trying to resolve
      references to the (freed) temporary table.
      Fixed by preserving the original aggregate function arguments and
      using them (instead of the transformed ones) for EXPLAIN EXTENDED.
      
      mysql-test/r/explain.result:
        Bug#34773: test case
      mysql-test/t/explain.test:
        Bug#34773: test case
      sql/item.cc:
        Bug#34773: use accessor functions instead of public members
      sql/item_sum.cc:
        Bug#34773: 
         - Encapsulate the arguments into Item_sum and
           provide accessor and mutator methods 
         - print the orginal arguments (if present)
           in EXPLAIN EXTENDED
         - preserve the original arguments list.
      sql/item_sum.h:
        Bug#34773: 
         - Encapsulate the arguments into Item_sum and
           provide accessor and mutator methods 
         - print the orginal arguments (if present)
           in EXPLAIN EXTENDED
         - preserve the original arguments list.
      sql/opt_range.cc:
        Bug#34773: use accessor functions instead of public members
      sql/opt_sum.cc:
        Bug#34773: use accessor functions instead of public members
      sql/sql_select.cc:
        Bug#34773: use accessor functions instead of public members
      613a9e3d
    • Alexey Botchkov's avatar
    • Alexey Botchkov's avatar
      Bug#38083 Error-causing row inserted into partitioned table despite error · afcc4e58
      Alexey Botchkov authored
            
          problems are located in the sql_partition.cc where functions calculation
          partition_id don't expect error returned from item->val_int().
          Fixed by adding checks to these functions.
          Note  - it tries to fix more problems than just the reported bug.
            
      per-file comments:
      modified:
        mysql-test/r/partition.result
          Bug#38083 Error-causing row inserted into partitioned table despite error
              test result
        mysql-test/t/partition.test
          Bug#38083 Error-causing row inserted into partitioned table despite error
              test case
        sql/opt_range.cc
          Bug#38083 Error-causing row inserted into partitioned table despite error
              get_part_id() call fixed
        sql/partition_info.h
          Bug#38083 Error-causing row inserted into partitioned table despite error
              get_subpart_id_func interface changed. 
        sql/sql_partition.cc
          Bug#38083 Error-causing row inserted into partitioned table despite error
              various functions calculationg partition_id and subpart_id didn't expect
                  an error returned from item->val_int().  Error checks added.
      afcc4e58
  25. 01 Oct, 2008 1 commit
    • Georgi Kodinov's avatar
      Bug#37943: Reproducible mysqld crash/sigsegv in sel_trees_can_be_ored · 73be5f95
      Georgi Kodinov authored
                  
      When analyzing the possible index use cases the server was re-using an internal structure.
      This is wrong, as this internal structure gets updated during the analysis.
      Fixed by making a copy of the internal structure for every place it needs to be used.
      Also stopped the generation of empty SEL_TREE structures that unnecessary 
      complicate the analysis.
      
      mysql-test/r/index_merge.result:
        Bug#37943: test case
      mysql-test/t/index_merge.test:
        Bug#37943: test case
      sql/opt_range.cc:
        Bug#37943: 
         - Make copy constructors for SEL_TREE and sub-structures and use them when OR-ing trees.
         - don't generate empty SEL_TREEs. Return NULL instead.
      73be5f95
  26. 25 Aug, 2008 1 commit
    • Sergey Petrunia's avatar
      BUG#36639: subselect.test crashes on 64 bit pentium4 when compiled for valgrind, commit into 5.0 · b7700d89
      Sergey Petrunia authored
      - Use the compiler's default copy constructor for QUICK_RANGE_SELECT. 
        bcopy(this, copy, ...) call caused some odd action on gcc-4.1.2 on x86_64
      
      sql/opt_range.cc:
        BUG#36639: subselect.test crashes on 64 bit pentium4 when compiled for valgrind
        - Set QUICK_SELECT_DESC not to use MRR implementation (code moved to here
          from opt_range.h)
      sql/opt_range.h:
        BUG#36639: subselect.test crashes on 64 bit pentium4 when compiled for valgrind
        - Use the compiler's default copy constructor for QUICK_RANGE_SELECT. 
          bcopy(this, copy, ...) call caused some odd action on gcc-4.1.2 on x86_64
      b7700d89
  27. 23 Jul, 2008 1 commit
    • Georgi Kodinov's avatar
      Bug#37830 : ORDER BY ASC/DESC - no difference · 5cf6d460
      Georgi Kodinov authored
                        
      Range scan in descending order for c <= <col> <= c type of
      ranges was ignoring the DESC flag.
      However some engines like InnoDB have the primary key parts 
      as a suffix for every secondary key.
      When such primary key suffix is used for ordering ignoring 
      the DESC is not valid.
      But we generally would like to do this because it's faster.
                  
      Fixed by performing only reverse scan if the primary key is used.
      Removed some dead code in the process.
      
      mysql-test/r/innodb_mysql.result:
        Bug#37830 : test case
      mysql-test/t/innodb_mysql.test:
        Bug#37830 : test case
      sql/opt_range.cc:
        Bug#37830 : 
        - preserve and use used_key_parts to
          distinguish when a primary key suffix is used
        - removed some dead code
      sql/opt_range.h:
        Bug#37830 : 
        - preserve used_key_parts
        - dead code removed
      sql/sql_select.cc:
        Bug#37830 : Do only reverse order traversal
        if the primary key suffix is used.
      5cf6d460
  28. 16 Jul, 2008 1 commit
    • Georgi Kodinov's avatar
      Bug#37830 : ORDER BY ASC/DESC - no difference · b343292b
      Georgi Kodinov authored
                  
      Range scan in descending order for c <= <col> <= c type of
      ranges was ignoring the DESC flag.
      However some engines like InnoDB have the primary key parts 
      as a suffix for every secondary key.
      When such primary key suffix is used for ordering ignoring 
      the DESC is not valid.
      But we generally would like to do this because it's faster.
            
      Fixed by performing only reverse scan if the primary key is used.
      Removed some dead code in the process.
      
      mysql-test/r/innodb_mysql.result:
        Bug#37830 : test case
      mysql-test/t/innodb_mysql.test:
        Bug#37830 : test case
      sql/opt_range.cc:
        Bug#37830 : 
         - preserve and use used_key_parts to
           distinguish when a primary key suffix is used
         - removed some dead code
      sql/opt_range.h:
        Bug#37830 : 
          - preserve used_key_parts
          - dead code removed
      sql/sql_select.cc:
        Bug#37830 : Do only reverse order traversal
            if the primary key suffix is used.
      b343292b
  29. 15 Jul, 2008 1 commit
    • Sergey Petrunia's avatar
      BUG#35478: sort_union() returns bad data when sort_buffer_size is hit · 04037f54
      Sergey Petrunia authored
      - In QUICK_INDEX_MERGE_SELECT::read_keys_and_merge: when we got table->sort from Unique,
        tell init_read_record() not to use rr_from_cache() because a) rowids are already sorted
        and b) it might be that the the data is used by filesort(), which will need record rowids
        (which rr_from_cache() cannot provide).
      - Fully de-initialize the table->sort read in QUICK_INDEX_MERGE_SELECT::get_next(). This fixes BUG#35477.
      (bk trigger: file as fix for BUG#35478).
      
      sql/filesort.cc:
        BUG#35478: sort_union() returns bad data when sort_buffer_size is hit
        - make find_all_keys() use quick->get_next() instead of init_read_record(r)/r.read_record() calls
        - added dbug printout
      sql/mysql_priv.h:
        BUG#35478: sort_union() returns bad data when sort_buffer_size is hit
        - Added parameter to init_read_record
      sql/opt_range.cc:
        BUG#35478: sort_union() returns bad data when sort_buffer_size is hit
        - In QUICK_INDEX_MERGE_SELECT::read_keys_and_merge: when we got table->sort from Unique,
          tell init_read_record() not to use rr_from_cache() because a) rowids are already sorted
          and b) it might be that the the data is used by filesort(), which will need record rowids
          (which rr_from_cache() cannot provide).
        - Fully de-initialize the table->sort read in QUICK_INDEX_MERGE_SELECT::get_next().
      sql/records.cc:
        BUG#35478: sort_union() returns bad data when sort_buffer_size is hit
        - Added disable_rr_cache parameter to init_read_record
        - Added comment
      sql/sql_acl.cc:
        BUG#35478: sort_union() returns bad data when sort_buffer_size is hit
        - Added parameter to init_read_record
      sql/sql_delete.cc:
        BUG#35478: sort_union() returns bad data when sort_buffer_size is hit
        - Added parameter to init_read_record
      sql/sql_help.cc:
        BUG#35478: sort_union() returns bad data when sort_buffer_size is hit
        - Added parameter to init_read_record
      sql/sql_select.cc:
        BUG#35478: sort_union() returns bad data when sort_buffer_size is hit
        - Added parameter to init_read_record
      sql/sql_table.cc:
        BUG#35478: sort_union() returns bad data when sort_buffer_size is hit
        - Added parameter to init_read_record
      sql/sql_udf.cc:
        BUG#35478: sort_union() returns bad data when sort_buffer_size is hit
        - Added parameter to init_read_record
      sql/sql_update.cc:
        BUG#35478: sort_union() returns bad data when sort_buffer_size is hit
        - Added parameter to init_read_record
      04037f54
  30. 08 Apr, 2008 1 commit
  31. 28 Mar, 2008 1 commit
    • unknown's avatar
      Bug#26243 mysql command line crash after control-c · 17065f97
      unknown authored
      - Backported the 5.1 DBUG to 5.0.
      - Avoid memory cleanup race on Windows client for CTRL-C
      
      
      client/mysql.cc:
        Bug#26243 mysql command line crash after control-c
        - On Windows, the sigint handler shouldn't call mysql_end
        because the main thread will do so automatically.
        - Remove unnecessary signal call from the sigint handler.
        - Call my_end with proper value.
      dbug/dbug.c:
        Bug#26243 mysql command line crash after control-c
        - Backported the 5.1 DBUG library. The old version uses a non-thread 
        safe global variable 'static struct state *stack'.
      dbug/factorial.c:
        Bug#26243 mysql command line crash after control-c
        - Backported the 5.1 DBUG library. The old version uses a non-thread 
        safe global variable 'static struct state *stack'.
      dbug/user.r:
        Bug#26243 mysql command line crash after control-c
        - Backported the 5.1 DBUG library. The old version uses a non-thread 
        safe global variable 'static struct state *stack'.
      include/my_dbug.h:
        B...
      17065f97
  32. 10 Mar, 2008 1 commit
    • unknown's avatar
      Bug#34731: highest possible value for INT erroneously filtered by WHERE · 13e6025b
      unknown authored
      WHERE f1 < n ignored row if f1 was indexed integer column and
      f1 = TYPE_MAX ^ n = TYPE_MAX+1. The latter value when treated
      as TYPE overflowed (obviously). This was not handled, it is now.
      
      
      mysql-test/r/range.result:
        show that on an index int column, we no longer disregard
        a field val of TYPE_MAX in SELECT ... WHERE ... < TYPE_MAX+1
      mysql-test/t/range.test:
        show that on an index int column, we no longer disregard
        a field val of TYPE_MAX in SELECT ... WHERE ... < TYPE_MAX+1
      sql/opt_range.cc:
        Handle overflowing of int-types in range-optimizer.
        Unfortunately requires re-indentation of entire block.
        Overflow (err == 1) was handled, but only if
        field->cmp_type() != value->result_type(), which it
        just wasn't in our case.
      13e6025b
  33. 13 Dec, 2007 1 commit
    • unknown's avatar
      BUG#32198: Comparison of DATE with DATETIME still not using indexes correctly · 4c56d1af
      unknown authored
      - Make conditions like "date_col $CMP$ 'datetime-const'" range-sargable
      
      
      mysql-test/r/range.result:
        BUG#32198: Comparison of DATE with DATETIME still not using indexes correctly
        - Testcase
      mysql-test/t/range.test:
        BUG#32198: Comparison of DATE with DATETIME still not using indexes correctly
        - Testcase
      sql/field.cc:
        BUG#32198: Comparison of DATE with DATETIME still not using indexes correctly
        - Added comments
      4c56d1af
  34. 12 Dec, 2007 1 commit
    • unknown's avatar
      Bug#12713 "Error in a stored function called from a SELECT doesn't · c9d5e4f3
      unknown authored
      cause ROLLBACK of statement", part 1. Review fixes.
      
      Do not send OK/EOF packets to the client until we reached the end of 
      the current statement.
      This is a consolidation, to keep the functionality that is shared by all 
      SQL statements in one place in the server.
      Currently this functionality includes:
      - close_thread_tables()
      - log_slow_statement().
      
      After this patch and the subsequent patch for Bug#12713, it shall also include:
      - ha_autocommit_or_rollback()
      - net_end_statement()
      - query_cache_end_of_result().
      
      In future it may also include:
      - mysql_reset_thd_for_next_command().
      
      
      include/mysql_com.h:
        Rename now unused members of NET: no_send_ok, no_send_error, report_error.
        These were server-specific variables related to the client/server
        protocol. They have been made obsolete by this patch.
        
        Previously the same members of NET were used to store the error message
        both on the client and on the server. 
        The error message was stored in net.last_error (client: mysql->net.last_error,
        server: thd->net.last_error).
        The error code was stored in net.last_errno (client: mysql->net.last_errno,
        server: thd->net.last_errno).
        The server error code and message are now stored elsewhere 
        (in the Diagnostics_area), thus NET members are no longer used by the
        server.
        Rename last_error to client_last_error, last_errno to client_last_errno
        to avoid potential bugs introduced by merges.
      include/mysql_h.ic:
        Update the ABI file to reflect a rename. 
        Renames do not break the binary compatibility.
      libmysql/libmysql.c:
        Rename last_error to client_last_error, last_errno to client_last_errno.
        This is necessary to ensure no unnoticed bugs introduced by merged
        changesets.
        
        Remove net.report_error, net.no_send_ok, net.no_send_error.
      libmysql/manager.c:
        Rename net.last_errno to net.client_last_errno.
      libmysqld/lib_sql.cc:
        Rename net.last_errno to net.client_last_errno.
        
        Update the embedded implementation of the client-server protocol to
        reflect the refactoring of protocol.cc.
      libmysqld/libmysqld.c:
        Rename net.last_errno to net.client_last_errno.
      mysql-test/r/events.result:
        Update to reflect the change in mysql_rm_db(). Now we drop stored
        routines and events for a given database name only if there
        is a directory for this database name. ha_drop_database() and
        query_cache_invalidate() are called likewise. 
        Previously we would attempt to drop routines/events even if database
        directory was not found (it worked, since routines and events are stored
        in tables). This fixes Bug 29958 "Weird message on DROP DATABASE if mysql.proc
        does not exist".
        The change was done because the previous code used to call send_ok()
        twice, which led to an assertion failure when asserts against it were
        added by this patch.
      mysql-test/r/grant.result:
        Fix the patch for Bug 16470, now FLUSH PRIVILEGES produces an error 
        if mysql.procs_priv is missing.
        This fixes the assert that send_ok() must not called after send_error()
        (the original patch for Bug 16470 was prone to this).
      mysql-test/suite/rpl/r/rpl_row_tabledefs_2myisam.result:
        Produce a more detailed error message.
      mysql-test/suite/rpl/r/rpl_row_tabledefs_3innodb.result:
        Produce a more detailed error message.
      mysql-test/t/grant.test:
        Update the test, now FLUSH PRIVILEGES returns an error if mysql.procs_priv
        is missing.
      server-tools/instance-manager/mysql_connection.cc:
        Rename net.last_errno to net.client_last_errno.
      sql/ha_ndbcluster_binlog.cc:
        Add asserts. 
        
        Use getters to access statement status information.
        
        Add a comment why run_query() is broken. Reset the diagnostics area
        in the end of run_query() to fulfill the invariant that the diagnostics_area
        is never assigned twice per statement (see the comment in the code
        when this can happen). We still do not clear thd->is_fatal_error and
        thd->is_slave_error, which may lead to bugs, I consider the whole affair
        as something to be dealt with separately.
      sql/ha_partition.cc:
        fatal_error() doesn't set an error by itself. Perhaps we should
        remove this method altogether and instead add a flag to my_error 
        to set thd->is_fatal_error property.
        
        Meanwhile, this change is a part of inspection made to the entire source
        code with the goal to ensure that fatal_error()
        is always accompanied by my_error().
      sql/item_func.cc:
        There is no net.last_error anymore. Remove the obsolete assignment.
      sql/log_event.cc:
        Use getters to access statement error status information.
      sql/log_event_old.cc:
        Use getters to access statement error status information.
      sql/mysqld.cc:
        Previously, if a continue handler for an error was found, my_message_sql() 
        would not set an error in THD. Since the current statement
        must be aborted in any case, find_handler() had a hack to assign 
        thd->net.report_error to 1.
        
        Remove this hack. Set an error in my_message_sql() even if the continue
        handler is found. The error will be cleared anyway when the handler
        is executed. This is one action among many in this patch to ensure the 
        invariant that whenever thd->is_error() is TRUE, we have a message in 
        thd->main_da.message().
      sql/net_serv.cc:
        Use a full-blown my_error() in net_serv.cc to report an error,
        instead of just setting net->last_errno. This ensures the invariant that
        whenever thd->is_error() returns TRUE, we have a message in 
        thd->main_da.message().
        
        Remove initialization of removed NET members.
      sql/opt_range.cc:
        Use my_error() instead of just raising thd->net.report_error. 
        This ensures the invariant that whenever thd->is_error() returns TRUE, 
        there is a message in thd->main_da.message().
      sql/opt_sum.cc:
        Move invocation of fatal_error() right next to the place where
        we set the error message. That makes it easier to track that whenever
        fatal_error() is called, there is a message in THD.
      sql/protocol.cc:
        Rename send_ok() and send_eof() to net_send_ok() and net_send_eof() 
        respectively. These functions write directly to the network and are not 
        for use anywhere outside the client/server protocol code. 
        
        Remove the code that was responsible for cases when either there is 
        no error code, or no error message, or both.
        Instead the calling code ensures that they are always present. Asserts
        are added to enforce the invariant.
        
        Instead of a direct access to thd->server_status and thd->total_warn_count
        use function parameters, since these from now on don't always come directly
        from THD.
        
        Introduce net_end_statement(), the single-entry-point replacement API for 
        send_ok(), send_eof() and net_send_error().
        
        Implement Protocol::end_partial_result_set to use in select_send::abort()
        when there is a continue handler.
      sql/protocol.h:
        Update declarations.
      sql/repl_failsafe.cc:
        Use getters to access statement status information in THD.
        Rename net.last_error to net.client_last_error.
      sql/rpl_record.cc:
        Set an error message in prepare_record() if there is no default
        value for the field -- later we do print this message to the client.
      sql/rpl_rli.cc:
        Use getters to access statement status information in THD.
      sql/slave.cc:
        In create_table_from_dump() (a common function that is used in 
        LOAD MASTER TABLE SQL statement and COM_LOAD_MASTER_DATA), instead of hacks
        with no_send_ok, clear the diagnostics area when mysql_rm_table() succeeded.
        
        Update has_temporary_error() to work correctly when no error is set.
        This is the case when Incident_log_event is executed: it always returns
        an error but does not set an error message.
        
        Use getters to access error status information.
      sql/sp_head.cc:
        Instead of hacks with no_send_error, work through the diagnostics area 
        interface to suppress sending of OK/ERROR packets to the client.
        
        Move query_cache_end_of_result before log_slow_statement(), similarly
        to how it's done in dispatch_command().
      sql/sp_rcontext.cc:
        Remove hacks with assignment of thd->net.report_error, they are not
        necessary any more (see the changes in mysqld.cc).
      sql/sql_acl.cc:
        Use getters to access error status information in THD.
      sql/sql_base.cc:
        Access thd->main_da.sql_errno() only if there is an error. This fixes
        a bug when auto-discovery, that was effectively disabled under pre-locking.
      sql/sql_binlog.cc:
        Remove hacks with no_send_ok/no_send_error, they are not necessary 
        anymore: the caller is responsible for network communication.
      sql/sql_cache.cc:
        Disable sending of OK/ERROR/EOF packet in the end of dispatch_command
        if the response has been served from the query cache. This raises the 
        question whether we should store EOF packet in the query cache at all,
        or generate it anew for each statement (we should generate it anew), but
        this is to be addressed separately.
      sql/sql_class.cc:
        Implement class Diagnostics_area. Please see comments in sql_class.h
        for details.
        
        Fix a subtle coding mistake in select_send::send_data: when on slave, 
        an error in Item::send() was ignored.
        The problem became visible due to asserts that the diagnostics area is
        never double assigned.
        
        Remove initialization of removed NET members.
        
        In select_send::abort() do not call select_send::send_eof(). This is
        not inheritance-safe. Even if a stored procedure continue handler is
        found, the current statement is aborted, not succeeded.
        Instead introduce a Protocol API to send the required response, 
        Protocol::end_partial_result_set().
        
        This simplifies implementation of select_send::send_eof(). No need
        to add more asserts that there is no error, there is an assert inside
        Diagnostics_area::set_ok_status() already.
        
        Leave no trace of no_send_* in the code.
      sql/sql_class.h:
        Declare class Diagnostics_area. 
        
        Remove the hack with no_send_ok from
        Substatement_state.
        
        Provide inline implementations of send_ok/send_eof.
        
        Add commetns.
      sql/sql_connect.cc:
        Remove hacks with no_send_error. 
        
        Since now an error in THD is always set if net->error, it's not necessary
        to check both net->error and thd->is_error() in the do_command loop.
        
        Use thd->main_da.message() instead of net->last_errno.
        
        Remove the hack with is_slave_error in sys_init_connect. Since now we do not
        reset the diagnostics area in net_send_error (it's reset at the beginning
        of the next statement), we can access it safely even after 
        execute_init_command.
      sql/sql_db.cc:
        Update the code to satisfy the invariant that the diagnostics area is never
        assigned twice.
        Incidentally, this fixes Bug 29958 "Weird message on DROP DATABASE if 
        mysql.proc does not exist".
      sql/sql_delete.cc:
        Change multi-delete to abort in abort(), as per select_send protocol.
        Fixes the merge error with the test for Bug 29136
      sql/sql_derived.cc:
        Use getters to access error information.
      sql/sql_insert.cc:
        Use getters to access error information.
      sql-common/client.c:
        Rename last_error to client_last_error, last_errno to client_last_errno.
      sql/sql_parse.cc:
        Remove hacks with no_send_error. Deploy net_end_statement().
        
        The story of COM_SHUTDOWN is interesting. Long story short, the server 
        would become on its death's door, and only no_send_ok/no_send_error assigned
        by send_ok()/net_send_error() would hide its babbling from the client.
        
        First of all, COM_QUIT does not require a response. So, the comment saying
        "Let's send a response to possible COM_QUIT" is not only groundless 
        (even mysqladmin shutdown/mysql_shutdown() doesn't send COM_QUIT after 
        COM_SHUTDOWN), it's plainly incorrect.
        
        Secondly, besides this additional 'OK' packet to respond to a hypothetical
        COM_QUIT, there was the following code in dispatch_command():
        
        if (thd->killed)
          thd->send_kill_message();
        if (thd->is_error()
          net_send_error(thd);
        
        This worked out really funny for the thread through which COM_SHUTDOWN
        was delivered: we would get COM_SHUTDOWN, say okay, say okay again, 
        kill everybody, get the kill signal ourselves, and then attempt to say 
        "Server shutdown in progress" to the client that is very likely long gone.
        
        This all became visible when asserts were added that the Diagnostics_area
        is not assigned twice.
        
        Move query_cache_end_of_result() to the end of dispatch_command(), since
        net_send_eof() has been moved there. This is safe, query_cache_end_of_result()
        is a no-op if there is no started query in the cache.
        
        Consistently use select_send interface to call abort() or send_eof()
        depending on the operation result.
        
        Remove thd->fatal_error() from reset_master(), it was a no-op. 
        in hacks with no_send_error woudl save us
        from complete breakage of the client/server protocol.
        
        Consistently use select_send::abort() whenever there is an error, 
        and select_send::send_eof() in case of success.
        The issue became visible due to added asserts.
      sql/sql_partition.cc:
        Always set an error in THD whenever there is a call to fatal_error().
      sql/sql_prepare.cc:
        Deploy class Diagnostics_area.
        Remove the unnecessary juggling with the protocol in 
        Select_fetch_protocol_binary::send_eof(). EOF packet format is 
        protocol-independent.
      sql/sql_select.cc:
        Call fatal_error() directly in opt_sum_query.
        Call my_error() whenever we call thd->fatal_error().
      sql/sql_servers.cc:
        Use getters to access error information in THD.
      sql/sql_show.cc:
        Use getters to access error information in THD.
        
        Add comments.
        
        Call my_error() whenever we call fatal_error().
      sql/sql_table.cc:
        Replace hacks with no_send_ok with the interface of the diagnostics area.
        
        Clear the error if ENOENT error in ha_delete_table().
      sql/sql_update.cc:
        Introduce multi_update::abort(), which is the proper way to abort a
        multi-update. This fixes the merge conflict between this patch and
        the patch for Bug 29136.
      sql/table.cc:
        Use a getter to access error information in THD.
      sql/tztime.cc:
        Use a getter to access error information in THD.
      c9d5e4f3
  35. 27 Nov, 2007 1 commit
    • unknown's avatar
      Fixed bug #32403: query causes a crash due to stack and · f95a0ca6
      unknown authored
                        memory corruptions.
      
      The right pointer field of the SEL_ARG structure was not
      initialized in the constructor and sometimes that led to
      server crashes.
      
      There is no testcase because the bug occurs only when
      uninitialized memory has particular values, which can't be
      re-created in the test suite.
      
      
      sql/opt_range.cc:
        Fixed bug #32403.
        
        The eq_tree function requires that SEL_ARG::left and
        SEL_ARG::right are equal to null pointer if SEL_ARG
        type is MAYBE_KEY, but SEL_ARG::right was not initialized
        and contained garbage.
      f95a0ca6