The greedy optimizer tracks the current level of nested joins and the position
inside these by setting and maintaining a state that's global for the whole FROM
clause.
This state was correctly maintained inside the selection of the next partial plan
table (in best_extension_by_limited_search()).
greedy_search() also moves the current position by adding the last partial match
table when there's not enough tables in the partial plan found by
best_extension_by_limited_search().
This may require update of the global state variables that describe the current
position in the plan if the last table placed by greedy_search is not a top-level
join table.
Fixed by updating the state after placing the partial plan table in greedy_search()
in the same way this is done on entering the best_extension_by_limited_search().
Fixed the signature of the function called to update the state :
check_interleaving_with_nj
mysql-test/r/greedy_optimizer.result:
Bug #38795: test case
mysql-test/t/greedy_optimizer.test:
Bug #38795: test case
sql/sql_select.cc:
Bug #38795: correctly update current position when placing
the next partial plan table in greedy_search().
consisting of pos-review fixes and improvements.
mysql-test/r/distinct.result:
Adjusted to account for pre-sorting of tables before optimiziation.
mysql-test/r/func_group.result:
Adjusted to account for pre-sorting of tables before optimiziation.
mysql-test/r/greedy_optimizer.result:
- Adjusted to account for pre-sorting of tables before optimiziation.
- Removed unnecessary test.
- More comments.
mysql-test/r/select.result:
- Adjusted to account for pre-sorting of tables before optimiziation.
mysql-test/t/greedy_optimizer.test:
- Adjusted to account for pre-sorting of tables before optimiziation.
- Removed unnecessary test.
- More comments.
sql/mysql_priv.h:
Moved function print_plan() to sql_test.cc
sql/sql_select.cc:
- Simplified the recursion in best_extension_by_limited_search()
and aligned it with its pseudo-code.
- Renamed functions to better reflect their semantics.
- Post-review changes of function specifications.
- Moved function print_plan() to sql_test.cc.
sql/sql_test.cc:
Moved function print_plan() to sql_test.cc
mysql-test/r/subselect.result:
Table pre-sorting before optimization makes the optimizer select a different plan, this change fixes the plan.
sql/mysql_priv.h:
Added new status variable last_query_cost that contains the cost of the last compiled query.
sql/mysqld.cc:
* Added new system variable 'plan_search_depth' to control the exhaustiveness of the search for an optimal query plan.
* Added new system variable 'heuristic' to control the use of query optimization heuristic.
* Added new status variable 'last_query_cost' that contains the cost of the last compiled query.
sql/set_var.cc:
* Added new system variable 'plan_search_depth' to control the exhaustiveness of the search for an optimal query plan.
* Added new system variable 'heuristic' to control the use of query optimization heuristic.
sql/sql_class.h:
* Added new system variable 'plan_search_depth' to control the exhaustiveness of the search for an optimal query plan.
* Added new system variable 'heuristic' to control the use of query optimization heuristic.
sql/sql_select.cc:
Added a combined greedy/exhaustive query optimization algorithm.
* The greedy search algorithm is implemented in function 'greedy_search'.
* The exhaustive search with controlled search depth is implemented in function 'find_best_limited_depth', a modification of 'find_best'.
* The selection of the best access path and its cost computation is factored out from 'find_best' into function 'best_access_path'.
* In addition:
- added pre-sorting for the query tables before they get optimized
- factored out the optimization of STRAIGHT_JOIN into a separate procedure
sql/sql_select.h:
Added new field to st_position to support the greedy optimizer.
Added a comment to class JOIN.
sql/sql_show.cc:
Added a case to 'mysqld_show' to print double status variables.
sql/structs.h:
Added a new type of status variables SHOW_DOUBLE
BitKeeper/etc/logging_ok:
Logging to logging@openlogging.org accepted