1. 24 Nov, 2011 5 commits
    • unknown's avatar
    • unknown's avatar
      Fix bug lp:894326 · dc1b1d39
      unknown authored
      The patch also fixes an unrelated compiler warning.
      
      Analysis:
      The temporary table created during SJ-materialization
      might be used for sorting for a group by operation. The
      sort buffers for this internal temporary table were not
      cleared by the execution code after each subquery
      re-execution. This resulted in a memory leak detected
      by valgrind.
      
      Solution:
      Cleanup the sort buffers for the semijon tables as well.
      
      
      sql/item_subselect.cc:
        - Fix a compiler warning and add logic to revert to table
          scan partial match when there are more rows in the materialized
          subquery than there can be bits in the NULL bitmap index used
          for partial matching.
      sql/opt_subselect.cc:
        - Fixed a memory leak detected by valgrind
      dc1b1d39
    • Igor Babaev's avatar
      adb4e64e
    • unknown's avatar
      Fix for LP BUG#859375 and LP BUG#887458. · 6fbf8f19
      unknown authored
      Stop attempts to apply IN/ALL/ANY optimizations to so called "fake_select"
      (used for ordering and filtering results of union) in union subquery execution.
      6fbf8f19
    • Alexey Botchkov's avatar
      fixes to make compilers happy. · 7b08d996
      Alexey Botchkov authored
      per-file comments:
        mysql-test/t/gis-precise.test
              number-to-string conversion differs on Windows.
              Have to tolerate this while GIS data is stored in doubles.
        sql/spatial.cc
              prev_x initialization added.
      7b08d996
  2. 23 Nov, 2011 1 commit
    • unknown's avatar
      Fix bug lp:893486 · fd3295e0
      unknown authored
      Analysis:
      The bug is a result of an incomplete fix for bug lp:869036.
      That fix didn't take into account that there may be a case
      when ther are no NULLs in the materialized subquery, however
      all columns without NULLs may not be grouped in the only
      non-null index. This is the case when the left subquery expression
      has nullable columns.
      
      Solution:
      The patch handles two missing sub-cases of the case when there are
      no value (non-null matches) for any outer expression, and there are
      both NULLs and non-NUll values in the outer reference.
      a) If the materialized subquery contains no NULLs there cannot be a
         partial match, because there are no NULLs in those columns where
         the outer reference has no NULLs.
      b) If the materialized subquery contains NULLs, but there exists a
         column, such that its corresponding outer expression has no NULL,
         and this column also has no NULL. Then there cannot be a partial
         match either.
      fd3295e0
  3. 22 Nov, 2011 3 commits
  4. 21 Nov, 2011 9 commits
    • unknown's avatar
      Correct test file. · 3e7bcc80
      unknown authored
      3e7bcc80
    • unknown's avatar
      Fix test to pass on 32-bit machines by reducing · b9d6bff8
      unknown authored
      the depth of subquery nestedness to less than 31
      (sizeof(ulong)-1).
      b9d6bff8
    • Igor Babaev's avatar
      Merge. · 76d03e7a
      Igor Babaev authored
      76d03e7a
    • Igor Babaev's avatar
      Fixed LP bug #887496. · b2e5a3f6
      Igor Babaev authored
      This bug in the function Loose_scan_opt::check_ref_access_part1 could lead
      to choosing an invalid execution plan employing a loose scan access to a
      semi-join table even in the cases when such access could not be used at all.
      This could result in wrong answers for some queries with IN subqueries.
      b2e5a3f6
    • unknown's avatar
      Fix bug lp:833777 · f8dbbc01
      unknown authored
      Analysis:
      The optimizer distinguishes two kinds of 'constant' conditions:
      expensive ones, and non-expensive ones. The non-expensive conditions
      are evaluated inside make_join_select(), and if false, already the
      optimizer detects empty query results.
      
      In order to avoid arbitrarily expensive optimization, the evaluation of
      expensive constant conditions is delayed until execution. These conditions
      are attached to JOIN::exec_const_cond and evaluated in the beginning of
      JOIN::exec. The relevant execution logic is:
      
      JOIN::exec()
      {
        if (! join->exec_const_cond->val_int())
        {
          produce an empty result;
          stop execution
        }
        continue execution
        execute the original WHERE clause (that contains exec_const_cond)
       ...
      }
      
      As a result, when an expensive constant condition is
      TRUE, it is evaluated twice - once through
      JOIN::exec_const_cond, and once through JOIN::cond.
      When the expensive constant condition is a subquery,
      predicate, the subquery is evaluated twice. If we have
      many levels of subqueries, this logic results in a chain
      of recursive subquery executions that walk a perfect
      binary tree. The result is that for subquries with depth N,
      JOIN::exec is executed O(2^N) times.
      
      Solution:
      Notice that the second execution of the constant conditions
      happens inside do_select(), in the branch:
      if (join->table_count == join->const_tables) { ... }
      In this case exec_const_cond is equivalent to the whole WHERE
      clause, therefore the WHERE clause has already been checked in
      the beginnig of JOIN::exec, and has been found to be true.
      The bug is addressed by not evaluating the WHERE clause if there
      was exec_const_conds, and it was TRUE.
      f8dbbc01
    • unknown's avatar
      Merge enabling materialization=on by default. · e9a6502f
      unknown authored
      e9a6502f
    • Igor Babaev's avatar
      Corrected the patch that made the optimizer switch for index condition pushdown · 0693f4d9
      Igor Babaev authored
      set to 'on' by default.
      0693f4d9
    • unknown's avatar
    • Igor Babaev's avatar
  5. 20 Nov, 2011 2 commits
    • Igor Babaev's avatar
      Fixed LP bug #892725. · 3c496ea9
      Igor Babaev authored
      A non-first execution of a prepared statement missed a call of the
      TABLE_LIST::process_index_hints() method in the code of the function
      setup_tables().
      At some scenarios this could lead to the choice of a quite inefficient
      execution plan for the base query of the prepared statement.
      3c496ea9
    • Alexey Botchkov's avatar
      Fix for bug #809849 spatial operations must be KILL-able. · 5a4c9100
      Alexey Botchkov authored
        Checks for thd->killed state added to the long loops in geometry calculations.
      
      per-file comments:
        sql/gcalc_slicescan.cc
      Fix for bug #809849 spatial operations must be KILL-able.
              checks for TERMINATED_STATE added.
        sql/gcalc_slicescan.h
      Fix for bug #809849 spatial operations must be KILL-able.
              defines added to include checks for termination in the
              library.
        sql/gcalc_tools.cc
      Fix for bug #809849 spatial operations must be KILL-able.
              checks for TERMINATED_STATE added.
        sql/gcalc_tools.h
      Fix for bug #809849 spatial operations must be KILL-able.
              TERMINATED_STATE pointers added.
        sql/item_geofunc.cc
      Fix for bug #809849 spatial operations must be KILL-able.
        sql/item_geofunc.h
      Fix for bug #809849 spatial operations must be KILL-able.
      5a4c9100
  6. 18 Nov, 2011 5 commits
    • Igor Babaev's avatar
      Fixed LP bug #891995. · 8ea39829
      Igor Babaev authored
      This bug in the function setup_semijoin_dups_elimination() could 
      lead to invalid choice of the sequence of tables for which semi-join
      duplicate elimination was applied.
      8ea39829
    • Igor Babaev's avatar
      Fixed LP bug #891953. · 6ed9c136
      Igor Babaev authored
      Due to this bug the function SEL_IMERGE::or_sel_tree_with_checks()
      could build an inconsistent merge tree if one of the SEL_TREEs in the
      resulting index merge happened to contain a full key range.
      This could trigger an assertion failure.
      
      
      
      6ed9c136
    • Alexey Botchkov's avatar
      unused variable removed. · fbb22ca4
      Alexey Botchkov authored
      fbb22ca4
    • Alexey Botchkov's avatar
      GCALC_CHECK_WITH_FLOAT disabled. · 47022d2e
      Alexey Botchkov authored
      That's not a good option for an onrdinary user.
      47022d2e
    • Igor Babaev's avatar
      Fixed LP bug #800184. · 3433cf3e
      Igor Babaev authored
      The function key_and() erroneously called SEL_ARG::increment_use_count()
      when SEL_ARG::incr_refs() should had been called. This could lead to
      wrong values of use_count for some SEL_ARG trees.
      3433cf3e
  7. 17 Nov, 2011 6 commits
  8. 16 Nov, 2011 2 commits
    • unknown's avatar
      Fix bug lp:869036 · 42221aba
      unknown authored
      Apart from the fix, the patch also adds few more unrelated test
      cases for partial matching, and fixes few typos.
      
      Analysis:
      This bug uncovered that partial matching via rowid intersection
      didn't handle the case when:
      - the left IN argument has some NULLs,
      - there are no non-null value matches, and there is no non-null
        column,
      - the subquery columns that are not covered with the NULLs in
        the left IN argument contain at least one row, such that it
        has NULL values in all columns where the left IN operand has
        no NULLs.
      In this case there is a partial match.
      
      In addition the analysis of the related code uncovered incorrect
      handling of few other related cases.
      
      Solution:
      The solution for the bug is to check if there exists a row with
      NULLs in all columns other than the ones having NULL in the
      let IN operand.
      
      The check is implemented via checking whether the bitmaps that
      store NULL information in class Ordered_key have a non-empty
      intersection for the relevant columns.
      
      The intersection itself is implemented via the function
      bitmap_exists_intersection() in my_bitmap.c.
      42221aba
    • Igor Babaev's avatar
      Fixed LP bug #887479. · c05e5b9c
      Igor Babaev authored
      The function setup_semijoin_dups_elimination erroneously assumed
      that if join_cache_level is set to 3 or 4 then the type of the
      access to a table cannot be JT_REF or JT_EQ_REF. This could lead
      to wrong query result sets.
      c05e5b9c
  9. 15 Nov, 2011 2 commits
    • Igor Babaev's avatar
      Merge. · 4d358f48
      Igor Babaev authored
      4d358f48
    • Igor Babaev's avatar
      Fixed LP bug #889750. · b4b7d941
      Igor Babaev authored
      If the optimizer switch 'semijoin_with_cache' is set to 'off' then 
      join cache cannot be used to join inner tables of a semijoin.
      
      Also fixed a bug in the function check_join_cache_usage() that led
      to wrong output of the EXPLAIN commands for some test cases.
      b4b7d941
  10. 14 Nov, 2011 1 commit
    • unknown's avatar
      Fix bug lp:889744 · 147721bb
      unknown authored
      MariaDB 5.5 merges changes from MySQL 5.5 where all constant
      expressions are wrapped into an Item_cache. As a result, constant
      single-row subqueries were also wrapped in an Item_cache.
      When analyzing the where clause for constant expressions that
      can be evaluated during optimization, subqueries wrapped into
      an Item_cache did not appear as expensive, and were therefore
      evaluated during optimization. Such evaluation is against the
      current architecture of MariaDB 5.3 where subquries are executed
      during the execute phase.
      
      The patch adds the is_expensive() predicate to Item_cache.
      This makes Item_cache consistent with other wrapping Item
      classes that need to look at the properties of the wrapped
      object.
      147721bb
  11. 13 Nov, 2011 4 commits