Commit graph

67809 commits

Author SHA1 Message Date
Igor Babaev
2f9734172f Fixed LP bug #898073.
The tables from the same semi-join or outer join nest cannot use
join buffers if in the join sequence of the query execution plan
they are separated by a table that is planned to be joined without
usage of a join buffer.
2011-11-30 10:22:53 -08:00
unknown
3a7f28793f Merge the fix of bug lp:825051 2011-11-30 08:28:40 +02:00
unknown
264aaf111d Added test suite for the LP BUG#885162 (fixed by the patch for LP BUG#859375 and LP BUG#887458). 2011-11-29 23:09:06 +02:00
unknown
625cdb8078 Fixed bug lp:825051
The cause of the wrong result was that Item_ref_null_helper::get_date()
didn't use a method of the *_result() family, and fetched the data
for the field from the current row instead of result_field. Changed to
use the correct *_result() method, like to all other similar methods
of Item_ref_null_helper.
2011-11-29 23:06:39 +02:00
Alexey Botchkov
cdde6187d1 bug 857066 Wrong result with ST_DISJOINT when using an index.
DISJOINT can't be properly optimized with the RTree keys in MyISAM also.

per-file comments:
  storage/myisam/rt_index.c
bug 857066 Wrong result with ST_DISJOINT when using an index.
        don't optimize DISJOINT with the RTree keys.
2011-11-29 15:27:52 +04:00
Alexey Botchkov
18d9f8d429 bug 857066 Wrong result with ST_DISJOINT when using an index
the ST_DISJOINT can't be properly optimized with the RTree key
        at the moment.

per-file comments:
  storage/maria/ma_rt_index.c
bug 857066 Wrong result with ST_DISJOINT when using an index
        disabled optimization for the DISJOINT case.
2011-11-29 02:11:13 +04:00
unknown
62e7ab3ac7 Fix bugs lp:833777, lp:894397
Analysis:
lp:894397 was a consequence of a prior incorrect fix of lp:833777
which didn't take into account that even when all tables are
constant there may be correlated conditions, and the where clause
is not equivalent to the constant conditions.

Solution:
When there are constant tables only, evaluate only the conditions
that reference outer fields, because the constant conditions are
already checked, and the where clause doesn't have other conditions
than constant ones, and outer referencing ones. The fix for
lp:894397 also fixes lp:833777.
2011-11-28 15:24:07 +02:00
unknown
5412e82c01 Fixed LP BUG#747278
The problem was that when we have single row subquery with no rows
Item_cache(es) which represent result row was not null and being
requested via element_index() returned random value.

The fix is setting all Item_cache(es) in NULL before executing the
query (reset() method) which guaranty NULL value of whole query
or its elements requested in any way if no rows was found.

set_null() method was added to Item_cache to guaranty correct NULL
value in case of reseting the cache.
2011-11-28 12:42:14 +02:00
Igor Babaev
17b4e4a194 Set new default values for the optimizer switch flags 'derived_merge'
and 'derived_with_keys'. Now they are set on by default.
2011-11-26 14:23:00 -08:00
Sergey Petrunya
d84ea521c5 Merge 2011-11-26 12:27:52 +04:00
Sergey Petrunya
8325848b6e Subquery code cleanups:
- Make functions that operate on SJ_TMP_TABLE be member functions
- Make Loose_scan_opt data members private
2011-11-25 23:54:36 +04:00
Sergey Petrunya
fa366521cf Remove garbage comment 2011-11-25 22:54:13 +04:00
Sergey Petrunya
b796833e8d Update test results 2011-11-25 21:45:58 +04:00
Sergey Petrunya
aa98fe3a7a Update test results 2011-11-25 15:48:56 +04:00
Sergey Petrunya
69e7b18876 Remove garbage comments 2011-11-25 14:57:27 +04:00
Sergey Petrunya
3a9edc5f77 Merge 2011-11-25 14:28:43 +04:00
Igor Babaev
962bff5dca Currently innodb_plugin does not support ICP. Part2. 2011-11-24 22:56:02 -08:00
Sergey Petrunya
f84dbf4b20 Semi-join optimizations code cleanup part 2:
- Make EXPLAIN display "Start temporary" at the start of the fanout (it used to display
  at the first table whose rowid gets into temp. table which is not that useful for
  the user)
- Updated test results (all checked)
2011-11-25 05:56:58 +04:00
unknown
81f22df467 Added valgrind suppression for an error due to
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=577135
2011-11-24 23:47:50 +02:00
unknown
dc1b1d39a1 Fix bug lp:894326
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
2011-11-24 23:15:40 +02:00
Igor Babaev
adb4e64eaf Currently innodb_plugin does not support ICP. 2011-11-24 12:19:37 -08:00
unknown
6fbf8f1926 Fix for LP BUG#859375 and LP BUG#887458.
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.
2011-11-24 15:12:10 +02:00
Alexey Botchkov
7b08d99627 fixes to make compilers happy.
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.
2011-11-24 16:26:13 +04:00
unknown
fd3295e0ac Fix bug lp:893486
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.
2011-11-23 23:13:51 +02:00
Sergey Petrunya
694ce95557 Semi-join optimizations code cleanup:
- Break down POSITION/advance_sj_state() into four classes 
  representing potential semi-join strategies.

- Treat all strategies uniformly (before, DuplicateWeedout 
  was special as it was the catch-all strategy. Now, we're 
  still relying on it to be the catch-all, but are able to 
  function,e.g. with firstmatch=on,duplicate_weedout=off.

- Update test results (checked)
2011-11-23 04:25:52 +04:00
Alexey Botchkov
12e60c4989 Small fixes to make compilers happy. 2011-11-22 17:57:33 +04:00
Alexey Botchkov
ae0ebd8a6b Windows has no 'nearbyint' in libraries.
So removed.
2011-11-22 17:32:05 +04:00
unknown
eabcd6205c Merge default materialization=on. 2011-11-22 12:06:46 +02:00
unknown
3e7bcc80c1 Correct test file. 2011-11-21 22:16:01 +02:00
unknown
b9d6bff883 Fix test to pass on 32-bit machines by reducing
the depth of subquery nestedness to less than 31
(sizeof(ulong)-1).
2011-11-21 22:01:47 +02:00
Igor Babaev
76d03e7af5 Merge. 2011-11-21 11:21:30 -08:00
Igor Babaev
b2e5a3f603 Fixed LP bug #887496.
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.
2011-11-21 09:06:35 -08:00
unknown
f8dbbc010f Fix bug lp:833777
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.
2011-11-21 18:00:55 +02:00
unknown
e9a6502f26 Merge enabling materialization=on by default. 2011-11-21 17:48:25 +02:00
Igor Babaev
0693f4d916 Corrected the patch that made the optimizer switch for index condition pushdown
set to 'on' by default.
2011-11-21 07:00:14 -08:00
unknown
f0d9908fc3 Merge enabling of materialization=on by default with main tree. 2011-11-21 16:56:32 +02:00
Igor Babaev
af3d1da31d Made the optimizer switch for index condition pushdown set to 'on' by default. 2011-11-21 05:16:16 -08:00
Igor Babaev
3c496ea9ad Fixed LP bug #892725.
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.
2011-11-20 04:53:07 -08:00
Alexey Botchkov
5a4c91003a Fix for bug #809849 spatial operations must be KILL-able.
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.
2011-11-20 12:30:43 +04:00
Igor Babaev
8ea398292e Fixed LP bug #891995.
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.
2011-11-18 13:32:21 -08:00
Igor Babaev
6ed9c13643 Fixed LP bug #891953.
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.
2011-11-18 09:35:51 -08:00
Alexey Botchkov
fbb22ca4a7 unused variable removed. 2011-11-18 18:15:06 +04:00
Alexey Botchkov
47022d2ee2 GCALC_CHECK_WITH_FLOAT disabled.
That's not a good option for an onrdinary user.
2011-11-18 17:56:42 +04:00
Igor Babaev
3433cf3e4f Fixed LP bug #800184.
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.
2011-11-18 04:41:25 -08:00
Igor Babaev
e31887b592 Merge. 2011-11-17 08:00:22 -08:00
Alexey Botchkov
9cde33f9ef small fixes to make compiler happy. 2011-11-17 18:03:47 +04:00
Alexey Botchkov
b525abefb2 test results updated. 2011-11-17 17:12:58 +04:00
Igor Babaev
6bb5bc2044 Corrected the fix for bug 891052. 2011-11-17 03:24:20 -08:00
Alexey Botchkov
b2b035134f merging. 2011-11-17 14:27:00 +04:00
Igor Babaev
fdeaedb43b Fixed LP bug #891052.
Some optimizer switches were missing in the help lists of mysqld.
2011-11-17 01:00:46 -08:00