Commit graph

18 commits

Author SHA1 Message Date
unknown
cbad9e2c69 test case fixed to pass w/o innodb 2005-09-25 15:44:05 +02:00
unknown
ec0f18c28f Fix group_min_max.test - myisam may return slightly row count estimate on amd64 2005-08-31 13:23:24 +04:00
unknown
64e6d7b193 Fix for BUG#12672.
mysql-test/r/group_min_max.result:
  Test for BUG#12672.
mysql-test/t/group_min_max.test:
  Test for BUG#12672.
sql/opt_range.cc:
  Some storage managers like InnoDB always retrieve the value of
  the primary key (if any) with any other key. For such storage
  managers the optimizer marks an index as covering if that index
  and the primary key contain all query fields. This is good for
  reading data from an index, but not for lookup. The patch detects
  such cases and tests whether an index is really a covering index
  by itself, without the primary key. If yes, then that index can
  be used for the index skip algorithm of the GROUP_MIN_MAX
  access method.
2005-08-29 17:13:42 +03:00
unknown
d87c2dd6bf Fix for BUG#11044 - "SELECT DISTINCT on indexed column returns inconsistent results"
The problem was that when there was no MIN or MAX function, after finding the
group prefix based on the DISTINCT or GROUP BY attributes we did not search further
for a key in the group that satisfies the equi-join conditions on attributes that
follow the group attributes. Thus we ended up with the wrong rows, and subsequent
calls to select_cond->val_int() in evaluate_join_record() were filtering those
rows. Hence - the query result set was empty.

The problem occured both for GROUP BY queries without MIN/MAX and for queries
with DISTINCT (which were internally executed as GROUP BY queries).


mysql-test/r/group_min_max.result:
  Added test result for BUG#11044. Notice that the group by query is
  equivalent to the distinct query and both are executed via the same
  algorithm.
mysql-test/t/group_min_max.test:
  Added test for BUG#11044. Notice that the group by query is
  equivalent to the distinct query and both are executed via the
  same algorithm.
sql/opt_range.cc:
  * Use the extended prefix in QUICK_GROUP_MIN_MAX_SELECT::get_next()
    to find keys that satisfy equality conditions in the case when there is
    no MIN or MAX function.
  * Corrected some method comments.
  * Corrected debug printout of cost information.
2005-06-14 12:52:44 +03:00
unknown
78422442df Preparatory (and the most problematic) patch for Bug#7306
"the server side preparedStatement error for LIMIT placeholder",
which moves all uses of LIMIT clause from PREPARE to OPTIMIZE
and later steps.
After-review fixes.


mysql-test/r/group_min_max.result:
  Test results fixed for EXPLAINs when using GROUP_MIN_MAX access plan.
sql/item_subselect.cc:
  Move setting of the internal LIMIT used for IN/ALL/ANY/EXISTS 
  subqueries to one place: Item_exists_subselect::fix_length_and_dec().
  This implies that unit->select_limit_cnt is not set until the item is 
  fixed. This is OK, as now LIMIT values are not used until JOIN::optimize.
sql/mysql_priv.h:
  setup_tables no longer needs a special flag for the case when
  it's called from JOIN::reinit() (we don't need to call setup_tables
  between two executions of a correlated subquery).
sql/opt_range.cc:
  Fix a glitch in GROUP_MIN_MAX access plan: we should use table metadata,
  not field data, to evaluate max_used_key_length, which is then
  used for explain.
sql/sp.cc:
  - setup_tables signature changed.
sql/sql_base.cc:
  - setup_tables no longer needs a special mode for subqueries.
    Unused checks were removed.
sql/sql_delete.cc:
  - setup_tables signature changed
sql/sql_help.cc:
  - setup_tables signature changed
sql/sql_insert.cc:
  - setup_tables signature changed
sql/sql_lex.cc:
  Consolidate setting of internal LIMIT for IN/ALL/ANY/EXISTS subqeries
  in one place, and hence remove it from st_select_lex::test_limit().
sql/sql_lex.h:
  Cleanup signature of st_select_lex_unit::init_prepare_fake_select_lex().
sql/sql_load.cc:
  - setup_tables signature changed
sql/sql_olap.cc:
  - setup_tables signature changed
sql/sql_parse.cc:
  - st_select_lex_unit::set_limit() signature changed
sql/sql_select.cc:
  Move setting of JOIN::select_limit from JOIN::prepare
  to JOIN::optimize. At prepare, limit is unknown yet.
  Remove excessive cleanups from JOIN::reinit which were overwriting
  join->join_tab[i]->table->used_keys. This fixes the bug which was triggered
  by the change in item_subselect.cc.
sql/sql_union.cc:
  Class st_select_lex_unit was changed to avoid calls to 
   st_select_lex_unit::set_limit from places where it may be unknown.
  Now unit->select_limit_cnt is set at ::exec(). 
  st_select_lex_unit::init_prepare_fake_select_lex(): 
   - move out set_limit functionality
   - remove a few lines of dead code.
  st_select_lex_unit::prepare():
    - now we don't call set_limit at the time of prepare, so the value  
      of unit->select_limit_cnt may be unknown here. Use sl->select_limit
      instead.
  st_select_lex_unit::exec():
    - cleanup
    - call set_limit explicitly as it has been moved out of 
     init_prepare_fake_select_lex.
sql/sql_update.cc:
  - setup_tables signature changed
2005-05-30 20:54:37 +04:00
unknown
44819149ad portablity fix 2005-05-19 05:54:31 +03:00
unknown
3e2988d00f Fixes to merge from 4.1
client/mysqldump.c:
  Temporarily disable unused (and broken) code.
mysql-test/r/group_min_max.result:
  Update results
mysql-test/r/mysqldump.result:
  Update results
mysql-test/r/subselect.result:
  Update results
mysql-test/t/group_min_max.test:
  Ignore number of rows in output of most explain results
sql/sql_insert.cc:
  Fix reference to max_unique_length
2005-05-18 15:40:34 -07:00
unknown
2380fc937b Merge bk-internal.mysql.com:/home/bk/mysql-5.0
into mishka.local:/home/my/mysql-5.0


mysql-test/r/group_min_max.result:
  Auto merged
mysql-test/r/view.result:
  Auto merged
mysql-test/t/view.test:
  Auto merged
2005-05-13 13:36:02 +03:00
unknown
b21cf962e3 concurrent-insert can now be set to 2 for concurrent inserts when there is holes in the data file
myisam_max_extra_sort_file_size is depricated
Ensure that myisam_data_pointer_size is honoured when creating new MyISAM files
Changed default value of myisam_data_pointer_size from 4 to 6 to get rid of 'table-is-full' errors



include/myisam.h:
  Change type of myisam_block_size and myisam_concurrent_insert to make them changeable in mysqld.cc
  Removed not used varaible myisam_max_extra_temp_length
include/thr_lock.h:
  Added extra parameter to get_status
myisam/mi_create.c:
  Ensure that myisam_data_pointer_size is honoured
myisam/mi_dynrec.c:
  If 'append_insert_at_end' is set, only write at end of myisam record file
myisam/mi_locking.c:
  Add extra argument to 'mi_get_status' to allow thr_lock to signal that we want to do a concurrent insert
  If this is used, we will append new insert rows at end of data file.
  Change mi_check_status() to allow concurrent_inserts even if there are holes in the file when myisam_concurent_insert=2
myisam/mi_static.c:
  Change behavior of myisam_concurrent_insert so that setting this to 2 allows inserts even if there is a hole in the data file.
  Default value is 2 for MyISAM direct usage but will be set to 1 (old default) by mysqld.cc
myisam/mi_statrec.c:
  If 'append_insert_at_end' is set, only write at end of myisam record file
myisam/mi_write.c:
  If 'append_insert_at_end' is set, only write at end of myisam record file
myisam/myisamdef.h:
  Support for insert-at-end even if there is holes in data file
mysql-test/r/gis-rtree.result:
  Test result changed because default value for myisam_data_pointer_size is changed from 4 -> 6
mysql-test/r/group_min_max.result:
  Test result changed because default value for myisam_data_pointer_size is changed from 4 -> 6
mysql-test/r/index_merge.result:
  Test result changed because default value for myisam_data_pointer_size is changed from 4 -> 6
mysql-test/r/index_merge_ror.result:
  Test result changed because default value for myisam_data_pointer_size is changed from 4 -> 6
mysql-test/r/merge.result:
  Test result changed because default value for myisam_data_pointer_size is changed from 4 -> 6
mysql-test/r/myisam.result:
  Test of concurrent_insert=2
mysql-test/r/null.result:
  Test result changed because default value for myisam_data_pointer_size is changed from 4 -> 6
mysql-test/r/preload.result:
  Test result changed because default value for myisam_data_pointer_size is changed from 4 -> 6
mysql-test/r/ps_1general.result:
  Test result changed because default value for myisam_data_pointer_size is changed from 4 -> 6
mysql-test/r/range.result:
  Test result changed because default value for myisam_data_pointer_size is changed from 4 -> 6
mysql-test/r/variables.result:
  concurrent_insert is now a integer, not a boolean
  myisam_extra_sort_file_size is deleted
mysql-test/r/view.result:
  Test result changed because default value for myisam_data_pointer_size is changed from 4 -> 6
mysql-test/t/index_merge.test:
  Test result changed because default value for myisam_data_pointer_size is changed from 4 -> 6
mysql-test/t/myisam.test:
  Test of concurrent_insert=2
mysql-test/t/ps_1general.test:
  Drop test table
mysql-test/t/variables.test:
  concurrent_insert is now a integer, not a boolean
  myisam_extra_sort_file_size is deleted
mysql-test/t/view.test:
  Drop tables that may be left from previous tests
mysys/thr_lock.c:
  Extra paramter to get_status to signal if concurrent_insert was used
sql/mysqld.cc:
  concurrent-insert can now be set to 2 for concurrent inserts when there is holes in the data file
  myisam_max_extra_sort_file_size is depricated
sql/set_var.cc:
  concurrent-insert is now an integer, not a bool
  myisam_max_extra_sort_file_size is deleted
2005-05-13 12:08:08 +03:00
unknown
51e862786b Fix for bug #9798: Rollup crash with InnoDB in setup_sum_funcs().
sql/opt_range.cc:
  Fix for bug #9798: Rollup crash with InnoDB in setup_sum_funcs().
  Disable mix/max group by optimization for queries with rollup for now.
  Note: the actual bug was hidden; if this optimization works with rollup
  queries we will have to change some code:
  
  the problem is that we call the join->make_sum_func_list() function against 
  changed thd->mem_root (see SQL_SELECT::test_quick_select()) which creates some
  items for rollup, then we free that mem_root, then we try to reuse (free) those
  items.
2005-05-09 11:43:52 +05:00
unknown
7a703d6ace Fix for BUG#8532.
The problem was in that the code that analyses the applicability of the
QUICK_GROUP_MIN_MAX access method for DISTINC queries assumed that there
are no duplicate column references in the DISTINCT clause, and it added
non-exiting key parts for the duplicate column references. 

The solution adds a test to check whether the select list already contained
a field with the same name. If such field was already present, then it was
already decided to use its key part for index access. In this such case we
must skip the duplicate field instead of counting it as a new field.


mysql-test/r/group_min_max.result:
  Added test results for BUG#8532.
mysql-test/t/group_min_max.test:
  Added tests for BUG#8532.
sql/opt_range.cc:
  The problem was in that the code that analyses the applicability of the
  QUICK_GROUP_MIN_MAX access method for DISTINC queries assumed that there
  are no duplicate column references in the DISTINCT clause, and it added
  non-exiting key parts for the duplicate column references. 
  
  The solution adds a test to check whether the select list already contained
  a field with the same name. If such field was already present, then it was
  already decided to use its key part for index access. In this such case we
  must skip the duplicate field instead of counting it as a new field.
2005-02-28 16:20:02 +02:00
unknown
acf76e3b88 First stage of table definition cache
Split TABLE to TABLE and TABLE_SHARE (TABLE_SHARE is still allocated as part of table, will be fixed soon)
Created Field::make_field() and made Field_num::make_field() to call this
Added 'TABLE_SHARE->db' that points to database name; Changed all usage of table_cache_key as database name to use this instead
Changed field->table_name to point to pointer to alias. This allows us to change alias for a table by just updating one pointer.
Renamed TABLE_SHARE->real_name to table_name
Renamed TABLE->table_name to alias
Renamed TABLE_LIST->real_name to table_name


include/myisam.h:
  Added const before names
mysql-test/r/group_min_max.result:
  Make results repeatable
mysql-test/t/group_min_max.test:
  Make results repeatable
sql/field.cc:
  Created Field::make_field() and made Field_num::make_field() to call this
  Use TABLE_SHARE
  Use sql_strmake() instead of sql_memdup() to simplify code
sql/field.h:
  Changed table_name to be pointer to table_name. This allows us to change alias for all fields by just changing one pointer.
  Use TABLE_SHARE
sql/field_conv.cc:
  Use TABLE_SHARE
sql/filesort.cc:
  Use TABLE_SHARE
sql/ha_berkeley.cc:
  Use TABLE_SHARE
sql/ha_heap.cc:
  Use TABLE_SHARE
sql/ha_innodb.cc:
  Use TABLE_SHARE
sql/ha_myisam.cc:
  Use TABLE_SHARE
sql/ha_myisammrg.cc:
  Use TABLE_SHARE
  Change some pointer handling to use const char*
sql/ha_ndbcluster.cc:
  Use TABLE_SHARE
sql/handler.cc:
  Use TABLE_SHARE
sql/item.cc:
  Use TABLE_SHARE
sql/item_func.cc:
  Use TABLE_SHARE
sql/item_subselect.cc:
  Use TABLE_SHARE
sql/item_sum.cc:
  Use TABLE_SHARE
sql/key.cc:
  Use TABLE_SHARE
sql/lock.cc:
  Use TABLE_SHARE
sql/log_event.cc:
  real_name -> table_name
sql/mysql_priv.h:
  Use TABLE_SHARE
sql/opt_range.cc:
  Use TABLE_SHARE
sql/opt_sum.cc:
  Use TABLE_SHARE
sql/records.cc:
  Use TABLE_SHARE
sql/repl_failsafe.cc:
  real_name -> table_name
sql/slave.cc:
  Use TABLE_SHARE
sql/sp.cc:
  Use TABLE_SHARE
sql/sp_head.cc:
  real_name -> table_name
sql/sql_acl.cc:
  Use TABLE_SHARE
  removed unnecessary assert
  fixed indentation
  changed some char * -> const char*
sql/sql_acl.h:
  changed some char* -> const char*
sql/sql_base.cc:
  Use TABLE_SHARE
sql/sql_cache.cc:
  Use TABLE_SHARE
sql/sql_class.cc:
  Use TABLE_SHARE
sql/sql_db.cc:
  real_name -> table_name
sql/sql_delete.cc:
  Use TABLE_SHARE
sql/sql_derived.cc:
  Use TABLE_SHARE
sql/sql_handler.cc:
  Use TABLE_SHARE
sql/sql_help.cc:
  Use TABLE_SHARE
sql/sql_insert.cc:
  Use TABLE_SHARE
sql/sql_load.cc:
  Use TABLE_SHARE
sql/sql_parse.cc:
  Use TABLE_SHARE
sql/sql_rename.cc:
  real_name -> table_name
sql/sql_select.cc:
  Use TABLE_SHARE
  table->blob_fields now points to field offsets, not fields
  tmp_table->table_name now points to alias name
sql/sql_show.cc:
  Use TABLE_SHARE
sql/sql_table.cc:
  Use TABLE_SHARE
sql/sql_test.cc:
  Use TABLE_SHARE
sql/sql_trigger.cc:
  Use TABLE_SHARE
sql/sql_udf.cc:
  Use TABLE_SHARE
sql/sql_union.cc:
  real_name -> table_name
sql/sql_update.cc:
  Use TABLE_SHARE
sql/sql_view.cc:
  Use TABLE_SHARE
sql/table.cc:
  Split TABLE to TABLE and TABLE_SHARE
  Changed blob_field to be field offsets instead of pointer to fields
  Only initialize table->s->default_values with default record (not all table->record[#])
  Some indentation changes
sql/table.h:
  Split TABLE to TABLE and TABLE_SHARE
sql/tztime.cc:
  real_name -> table_name
sql/unireg.cc:
  Use TABLE_SHARE
sql/unireg.h:
  Use TABLE_SHARE
2005-01-06 13:00:13 +02:00
unknown
a1fba2dacc After merge fixes
Fixed compiler warnings
Fix core dump when sending SIGHUP to mysqld


mysql-test/r/drop_temp_table.result:
  After merge fixes
mysql-test/r/grant.result:
  After merge fixes
mysql-test/r/group_min_max.result:
  After merge fixes
mysql-test/r/innodb.result:
  After merge fixes
mysql-test/r/insert_select.result:
  After merge fixes
mysql-test/r/rpl_charset.result:
  After merge fixes
mysql-test/r/rpl_create_database.result:
  After merge fixes
mysql-test/r/rpl_loaddata_rule_m.result:
  After merge fixes
mysql-test/t/rpl_charset.test:
  After merge fixes
mysql-test/t/rpl_create_database.test:
  After merge fixes
sql-common/client.c:
  After merge fixes
sql/item.cc:
  After merge fixes
sql/mysqld.cc:
  Fix core dump when sending SIGHUP to mysqld
sql/sql_acl.cc:
  Better comment
sql/sql_derived.cc:
  Fixed comment
  Added missing DBUG_RETURN
sql/sql_insert.cc:
  Fixed compiler warnings
  After merge fixes
sql/sql_lex.cc:
  After merge fixes
  Removed compiler warnings
sql/sql_parse.cc:
  After merge fixes
sql/sql_select.cc:
  More debugging
sql/sql_table.cc:
  Added missing DBUG_VOID_RETURN
sql/sql_update.cc:
  Fixed compiler warning
sql/sql_view.cc:
  Added missing DBUG_RETURN
  Fixed compiler warnings
  Added flag to signal that the view is a derived table
2004-12-06 17:15:54 +02:00
unknown
de691e1705 Minor fixes of the patch for BUG#6303
mysql-test/r/group_min_max.result:
  Test results for BUG#6303
mysql-test/t/group_min_max.test:
  Ucommented tests for BUG#6303
sql/opt_range.cc:
  Comment fix
2004-11-01 10:12:39 +02:00
unknown
53eb9871ad A fix (bug #6142: SELECT DISTINCT on key field crashes server)
sql/opt_range.cc:
  A fix (bug #6142: SELECT DISTINCT on key field crashes server)
  Code clean-up.
2004-10-20 21:01:52 +05:00
unknown
662b24f81e After merge adjustment of tests due to changes in cost estimates.
BitKeeper/etc/ignore:
  Added server-tools/instance-manager/mysqlmanager to the ignore list
2004-10-11 20:10:07 +03:00
unknown
4f1d7b7dae Implementation of the last review comments for WL#1724
"Min/Max Optimization for Queries with Group By Clause"


mysql-test/r/group_min_max.result:
  Added new test
mysql-test/t/group_min_max.test:
  Added new test & comments
sql/item.h:
  Remove processor methods that are no longer used.
sql/item_sum.cc:
  Remove processor methods that are no longer used.
sql/item_sum.h:
  Remove processor methods that are no longer used.
sql/opt_range.cc:
  - the test procedure no longer needs to build lists and to traverse the expression trees
  - all usable indexes are tested and the bes one is chosen
  - added/edited function comments
sql/sql_select.cc:
  Modified make_sum_func_list() so it can be reused in the test for MIN/MAX optimization.
sql/sql_select.h:
  Modified make_sum_func_list() so it can be reused in the test for MIN/MAX optimization.
2004-09-10 04:45:15 +03:00
unknown
d945033292 WL#1724 "Min/Max Optimization for Queries with Group By Clause"
- after-review changes
- merged with the source tree from 204-08-27


mysql-test/r/distinct.result:
  Different plans due to group-by optimization.
sql/ha_myisam.cc:
  More general interface to key_copy.
sql/handler.cc:
  More general interface to key_copy.
sql/item.cc:
  New method to collect all Item_field objects. Used by Item::walk.
sql/item.h:
  Several methods to collect different kinds of items from expression trees.
  Used by Item::walk.
sql/item_sum.cc:
  Added helper to collect Item_sum objects.
sql/item_sum.h:
  Methods to collect and test Item_sum objects.
sql/key.cc:
  More general interface to key_copy and key_restore.
sql/mysql_priv.h:
  More general interface to key_copy and key_restore.
sql/opt_range.cc:
  Complete implementaion of WL#1724 "Min/Max Optimization for Queries with Group By Clause".
sql/opt_range.h:
  Complete implementaion of WL#1724 "Min/Max Optimization for Queries with Group By Clause".
sql/opt_sum.cc:
  simple_pred is re-used in opt_range.cc
sql/sql_acl.cc:
  More general interface to key_copy and key_restore.
sql/sql_handler.cc:
  More general interface to key_copy.
sql/sql_insert.cc:
  More general interface to key_copy.
sql/sql_select.cc:
  Changes to hook the new QUICK_GROUP_MIN_MAX_SELECT due to two differences from all other
  quick selects:
  1)
  This quick select may be created (and used) even if there is no WHERE clause.
  Several places assumed that a QUICK_SELECT is constructed only if there is a WHERE clause,
  which had to be changed so that QUICK_GROUP_MIN_MAX can be used.
  2)
  Unlike all other quick selects, this QUICK_GROUP_MIN_MAX_SELECT operates for GROUP BY queries.
  Since for the caller the quick select already produces one result tuple per group, there is
  no need to call end_send_group, instead we have to call end_send as for a regular quick select.
sql/sql_select.h:
  simple_pred is re-used in opt_range.cc
2004-08-27 16:37:13 +03:00