1. 14 Feb, 2011 2 commits
    • unknown's avatar
      MWL#89 · 1be11803
      unknown authored
      Adjusted test results.
      1be11803
    • unknown's avatar
      LP BUG#715027 · 4b8c407b
      unknown authored
      Adjusted test results of EXPLAIN EXTENDED where complex
      and conditions are flattened as a result of calling
      fix_fields instead of quick_fix_field.
      4b8c407b
  2. 13 Feb, 2011 1 commit
    • unknown's avatar
      Fix LP BUG#715027 · 2aeb4170
      unknown authored
      Analysis:
      Before calling:
        write_record= (select->skip_record(thd) > 0);
      the function find_all_keys needs to restore the original read/write
      sets of the table that is sorted if the condition select->cond
      contains a subquery.
      
      This didn't happen in this test case because the flag "with_subselect"
      was not set properly for select->cond.
      
      The reason for the flag not being set properly, was that this condition
      was rewritten by add_cond_and_fix() inside make_join_select() by:
      
            /* Add conditions added by add_not_null_conds(). */
            if (tab->select_cond)
              add_cond_and_fix(thd, &tmp, tab->select_cond);
      
      However, the function add_cond_and_fix() called the shortcut method
      Item::quick_fix_field() that didn't update the "with_subselect"
      property.
      
      Solution:
      Call the complete Item::fix_fields() to update all Item properties,
      including "with_subselect".
      2aeb4170
  3. 11 Feb, 2011 1 commit
    • unknown's avatar
      Fix LP BUG#715034 · cd349466
      unknown authored
      Analysis:
      The failed assert is a result of calling Item_sum_distinct::clear()
      on an incomplete object for which Item_sum_distinct::setup() was
      not yet called.
      
      The reason is that JOIN::exec for the outer query calls JOIN::reinit()
      for all its subqueries, which in turn calls clear() for all aggregate
      functions of the subqueries. The call stack is:
      mysql_explain_union -> mysql_select -> JOIN::exec -> select_desribe ->
      mysql_explain_union -> mysql_select -> JOIN::reinit
      
      This assert doesn't fail in the main 5.3 because constant subqueries
      are being executed during the optimize phase of the outer query,
      thus the Unique object is created before calling JOIN::exec for the
      outer query, and Item_sum_distinct::clear() actually cleans the
      Unique object.
      
      Solution:
      The best solution is the obvious one - substitute the assert with
      a test whether Item_sum_distinct::tree is NULL.
      cd349466
  4. 10 Feb, 2011 3 commits
    • unknown's avatar
      Fix LP BUG#714999 · ac6653aa
      unknown authored
      Analysis:
      The crash in EXPLAIN resulted from an attempt to print the
      name of the internal temporary table created to compute
      distinct for the innermost subquery of the test case.
      Such tables do not have a corresponding TABLE_LIST (table
      reference), hence the crash. The reason for this was that
      the subquery was executed as part of constant condition
      evaluation before EXPLAIN attempts to print the table name.
      During the subquery execution, the subquery JOIN_TAB and
      its table are substituted by a temporary table in
      make_simple_join.
      
      Solution:
      Similar to the analogous case for other Items than the
      IS NULL function, do not evaluate expensive constant
      conditions.
      ac6653aa
    • unknown's avatar
      MWL#89 · 6a66bf31
      unknown authored
      Fixed LP BUG#714808 Assertion `outer_lookup_keys <= outer_record_count'
      
      Analysis:
      
      The function best_access_path() computes the number or records as
      follows:
      
      ...
            if (rec < MATCHING_ROWS_IN_OTHER_TABLE)
              rec= MATCHING_ROWS_IN_OTHER_TABLE; // Fix for small tables
      ...
                    if (table->quick_keys.is_set(key))
                      records= (double) table->quick_rows[key];
                    else
                    {
                      /* quick_range couldn't use key! */
                      records= (double) s->records/rec;
                    }
      
      Above MATCHING_ROWS_IN_OTHER_TABLE == 10, and s->records == 1,
      thus we get an estimated 0.1 records. As a result JOIN::get_partial_join_cost()
      for the outer query computes outer_record_count == 0.1 records, which is
      meaningless in this context.
      
      Solution:
      Round row count estimates that are < 1 to 1.
      6a66bf31
    • unknown's avatar
      MWL#89 · ca373395
      unknown authored
      Fixed a memory leak found by valgrind. The memory leak was
      a result of JOINs corresponding to subselects in a global
      ORDER BY of a UNION not being cleaned up because the
      fake_select of the UNION didn't point down to the subquery
      select.
      ca373395
  5. 03 Feb, 2011 1 commit
    • unknown's avatar
      MWL#89 · 648e6046
      unknown authored
      Adjusted test cases in accordance with the implementation.
      648e6046
  6. 24 Jan, 2011 2 commits
    • unknown's avatar
      MWL#89 · fd6a0799
      unknown authored
      - fixed incorrect query plans that resulted from emptying the
        keyuse array with the access methods of the non-modified query
        plan.
      - fixed compiler warning.
      fd6a0799
    • unknown's avatar
      Fix of problem with WHERE/HAVING consist of alone outer reference field by wrapping it. · 481cd2db
      unknown authored
      sql/item.cc:
        Wrapper added.
      sql/item.h:
        Wrapper added.
      sql/mysql_priv.h:
        Wrap function added.
      sql/sql_base.cc:
        Wrap function added.
        Fix of problem with WHERE consist of alone outer reference field by wrapping it.
      sql/sql_select.cc:
        Fix of problem with HAVING consist of alone outer reference field by wrapping it.
      481cd2db
  7. 18 Jan, 2011 1 commit
    • unknown's avatar
      Fix LP BUG#704337 · 2038256b
      unknown authored
      Analysis:
      The cause for the failing assert was that between preparation
      and execution of a DELETE prepared statement, the server reverted
      back all changes of the item tree. Since the substitution of
      Item_in_subselect by an Item_in_optimizer was recorded via
      change_item_tree, thus the rollback of the item tree affected
      the substitution as well. As a result the execution of the PS
      called Item_in_subselect::val_int(), which was never supposed
      to be called.
      
      Solution:
      Replace change_item_tree with assignment. This is OK because
      the Item objects used for substitution are created in PS memory.
      2038256b
  8. 17 Jan, 2011 2 commits
    • unknown's avatar
      MWL#89 · 5c4e64a5
      unknown authored
      Fixed query plans with loose index scan degraded into index scan.
      
      Analysis:
      With MWL#89 subqueries are no longer executed and substituted during
      the optimization of the outer query. As a result subquery predicates
      that were previously executed and substituted by a constant before
      the range optimizer were present as regular subquery predicates during
      range optimization. The procedure check_group_min_max_predicates()
      had a naive test that ruled out all queries with subqueries in the
      WHERE clause. This resulted in worse plans with MWL#89.
      
      Solution:
      The solution is to refine the test in check_group_min_max_predicates()
      to check if each MIN/MAX argument is referred to by a subquery predicate.
      5c4e64a5
    • unknown's avatar
      Fix LP BUG#702345 · b1a6ecd6
      unknown authored
      Analysis:
      Close to its end JOIN::optimize() assigns having to tmp_having, and
      sets the having clause to NULL:
      
        tmp_having= having;
        if (select_options & SELECT_DESCRIBE)
        {
          error= 0;
          DBUG_RETURN(0);
        }
        having= 0;
      
      At the same time, this query detects an empty result set, and calls
      return_zero_rows(), which checks the HAVING clause as follows:
      
          if (having && having->val_int() == 0)
            send_row=0;
      
      However having has been already set to NULL, so return_zero_rows
      doesn't check the having clause, hence the wrong result.
      
      Solution:
      Check join->tmp_having in addition to join->having.
      
      There is no additional test case, because the failure was in
      the current regression test.
      b1a6ecd6
  9. 13 Jan, 2011 1 commit
  10. 11 Jan, 2011 1 commit
  11. 05 Jan, 2011 1 commit
    • Igor Babaev's avatar
      Fixed LP bug #697557. · cb4fa7f4
      Igor Babaev authored
      When stored in a key buffer any varchar field has a length prefix
      that always takes 2 bytes.
      cb4fa7f4
  12. 30 Dec, 2010 1 commit
  13. 29 Dec, 2010 2 commits
  14. 28 Dec, 2010 3 commits
  15. 27 Dec, 2010 3 commits
    • Igor Babaev's avatar
      Post-merge fixes. · 511b53ab
      Igor Babaev authored
      511b53ab
    • Igor Babaev's avatar
      Merge · 0dc5ef87
      Igor Babaev authored
      0dc5ef87
    • Igor Babaev's avatar
      Fixed LP bug #694443. · 18dc64ec
      Igor Babaev authored
      One of the hash functions employed by the BNLH join algorithm
      calculates the the value of hash index for key value utilizing
      every byte of the key buffer. To make this calculation valid
      one has to ensure that for any key value unused bytes of the 
      buffer are filled with with a certain filler. We choose 0 as
      a filler for these bytes.
      
      Added an optional boolean parameter with_zerofill to the function
      key_copy. If the value of the parameter is TRUE all unused bytes
      of the key buffer is filled with 0. 
      18dc64ec
  16. 26 Dec, 2010 1 commit
  17. 25 Dec, 2010 1 commit
  18. 24 Dec, 2010 2 commits
    • Igor Babaev's avatar
      Fixed LP bug#694092. · d9a81475
      Igor Babaev authored
      In some cases the function make_cond_for_index() was mistaken
      when detecting index only pushdown conditions for a table: 
      a pushdown condition that was not index only could be marked
      as such.
      It happened because the procedure erroneously used the markers
      for index only conditions that remained from the calls of
      this function that extracted the index conditions for other 
      tables.
      Fixed by erasing index only markers as soon as they are need
      anymore.
      d9a81475
    • Igor Babaev's avatar
      Merge: mwl#24+mwl#21 5.1->5.2 · 7d68e1ea
      Igor Babaev authored
      7d68e1ea
  19. 23 Dec, 2010 2 commits
    • unknown's avatar
      MWL#89 · 2e42948e
      unknown authored
        
      - Post-review fixes. Intermediate commit to address review point 1.6.
      - Fixed valgrind warnings
      2e42948e
    • Igor Babaev's avatar
      Post-review fixes. · 6f2db629
      Igor Babaev authored
      6f2db629
  20. 22 Dec, 2010 1 commit
    • Igor Babaev's avatar
      Fixed LP bug #670380. · a095346a
      Igor Babaev authored
      Lifted the limitation that hash join could not be used over 
      varchar fields with non-binary collation.
      a095346a
  21. 21 Dec, 2010 2 commits
  22. 20 Dec, 2010 2 commits
  23. 19 Dec, 2010 2 commits
  24. 17 Dec, 2010 2 commits