When converting DISTINCT to GROUP BY where the columns are from the covering
index and they are quoted twice in the SELECT list the optimizer is creating
improper processing sequence. This is because of the fact that the columns
of the covering index are not recognized as such and treated as non-index
columns.
Generally speaking duplicate columns can safely be removed from the GROUP
BY/DISTINCT list because this will not add or remove new rows in the
resulting set. Duplicates can be removed even if they are not consecutive
(as is the case for ORDER BY, where the duplicate columns can be removed
only if they are consecutive).
So we can safely transform "SELECT DISTINCT a,a FROM ... ORDER BY a" to
"SELECT a,a FROM ... GROUP BY a ORDER BY a" instead of
"SELECT a,a FROM .. GROUP BY a,a ORDER BY a". We can even transform
"SELECT DISTINCT a,b,a FROM ... ORDER BY a,b" to
"SELECT a,b,a FROM ... GROUP BY a,b ORDER BY a,b".
The fix to this bug consists of checking for duplicate columns in the SELECT
list when constructing the GROUP BY list in transforming DISTINCT to GROUP
BY and skipping the ones that are already in.
mysql-test/r/distinct.result:
test case for the bug without loose index scan
mysql-test/r/group_min_max.result:
test case for the bug
mysql-test/t/distinct.test:
test case for the bug without loose index scan
mysql-test/t/group_min_max.test:
test case for the bug
sql/sql_select.cc:
duplicates check and removal
into mysql.com:/home/dlenev/mysql-5.0-bg12472
sql/mysql_priv.h:
Auto merged
sql/sql_base.cc:
Auto merged
sql/sql_insert.cc:
Auto merged
sql/sql_table.cc:
Auto merged
mysql-test/r/sp.result:
Manual merge.
mysql-test/t/sp.test:
Manual merge.
or implicitly uses stored function gives "Table not locked" error'
CREATE TABLE ... SELECT ... statement which was explicitly or implicitly
(through view) using stored function gave "Table not locked" error.
The actual bug resides in the current locking scheme of CREATE TABLE SELECT
code, which first opens and locks tables of the SELECT statement itself,
and then, having SELECT tables locked, creates the .FRM, opens the .FRM and
acquires lock on it. This scheme opens a possibility for a deadlock, which
was present and ignored since version 3.23 or earlier. This scheme also
conflicts with the invariant of the prelocking algorithm -- no table can
be open and locked while there are tables locked in prelocked mode.
The patch makes an exception for this invariant when doing CREATE TABLE ...
SELECT, thus extending the possibility of a deadlock to the prelocked mode.
We can't supply a better fix in 5.0.
mysql-test/r/sp.result:
Added tests for bugs#12472/#15137 'CREATE TABLE ... SELECT ... which
explicitly or implicitly uses stored function gives "Table not locked" error'
mysql-test/t/sp.test:
Added tests for bugs#12472/#15137 'CREATE TABLE ... SELECT ... which
explicitly or implicitly uses stored function gives "Table not locked" error'
sql/mysql_priv.h:
Added flag which can be passed to open_table() routine in order to ignore
set of locked tables and prelocked mode.
We don't need declaration of create_table_from_items() any longer as it was
moved into sql_insert.cc and made static.
sql/sql_base.cc:
open_table():
Added flag which allows open table ignoring set of locked tables and
prelocked mode.
sql/sql_insert.cc:
Moved create_table_from_items() from sql_table.cc to sql_insert.cc as it was
not used outside of sql_insert.cc and contains code which is specific for
CREATE TABLE ... SELECT.
Also now when we are executing CREATE TABLE ... SELECT ... statement which
SELECT part requires execution in prelocked mode we ignore set of locked
tables in order to get access to the table we just have created.
We probably don't want to do this if we are under real LOCK TABLES since
it will widen window for deadlock too much.
sql/sql_table.cc:
Moved create_table_from_items() routine into sql_insert.cc, since it was not
used anywhere outside of this file and contains logic which is specific for
CREATE TABLE ... SELECT statement.
test rpl_err_ignoredtables.
sql/log_event.cc:
Clearing tables to lock list in the event of errors.
Adding asserts to catch failing to clear the list of tables to lock.
Releasing allocated memory if the table will not be replicated.
sql/rpl_rli.h:
Adding assert to ensure post-condition of clear_tables_to_lock().
Minor rewrites.
into neptunus.(none):/home/msvensson/mysql/mysql-5.0-maint
client/mysqltest.c:
Auto merged
mysql-test/mysql-test-run.pl:
Auto merged
sql/mysql_priv.h:
Auto merged
mysql-test/r/ndb_partition_key.result:
New test case to ensure path in code is tested
mysql-test/r/partition.result:
New test case for bug
mysql-test/t/ndb_partition_key.test:
New test case to ensure path in code is tested
mysql-test/t/partition.test:
New test case for bug
sql/sql_partition.cc:
Use stack variable, not variable on lex object, caused havoc when doing a create index.
sql/sql_table.cc:
Editorial changes + added a comment to a path in code I didn't remember myself what it was good for.
load_file() string-function should return NULL rather than throw an error if
the file doesn't exist, as per the manual.
mysql-test/t/outfile.test:
expect NULL rather than error if file given to load_file() doesn't exist
mysql-test/t/func_str.test:
show that load_file() will return NULL rather than throw an error
if file doesn't exist
mysql-test/r/outfile.result:
expect NULL rather than error if file given to load_file() doesn't exist
mysql-test/r/func_str.result:
expect NULL rather than error if file given to load_file() doesn't exist
sql/item_strfunc.cc:
load_file() should return NULL as per the docs if file not found,
rather than throw an error
into mysql.com:/usr_rh9/home/elkin.rh9/MySQL/Merge/5.0-bug19136
sql/item_func.cc:
Auto merged
sql/sql_select.cc:
Auto merged
mysql-test/r/rpl_user_variables.result:
manual merge use local
mysql-test/t/rpl_user_variables.test:
manual merge use version 5.0's "show binlog events from 98"
A query with a group by and having clauses could return a wrong
result set if the having condition contained a constant conjunct
evaluated to FALSE.
It happened because the pushdown condition for table with
grouping columns lost its constant conjuncts.
Pushdown conditions are always built by the function make_cond_for_table
that ignores constant conjuncts. This is apparently not correct when
constant false conjuncts are present.
mysql-test/r/having.result:
Added a test case for bug #14927.
mysql-test/t/having.test:
Added a test case for bug #14927.
sql/sql_lex.cc:
Fixed bug #14927.
Initialized fields for having conditions in st_select_lex::init_query().
sql/sql_lex.h:
Fixed bug #14927.
Added a field to restore having condititions for execution in SP and PS.
sql/sql_prepare.cc:
Fixed bug #14927.
Added code to restore havinf conditions for execution in SP and PS.
sql/sql_select.cc:
Fixed bug #14927.
Performed evaluation of constant expressions in having clauses.
If the having condition contains a constant conjunct that is always false
an empty result set is returned after the optimization phase.
In this case the corresponding EXPLAIN command now returns
"Impossible HAVING" in the last column.
hog memory".
During each invocation of stored function or trigger some objects which
lifetime is one function call (e.g. sp_rcontext) were allocated on
arena/memroot of calling statement. This led to consumption of fixed amount
of memory for each function/trigger invocation and so statements which
involve lot of them were hogging memory. This in its return led to OOM
crashes or freezes.
This fix introduces new memroot and arena for objects which lifetime is
whole duration of function call. So all memory consumed by such objects
is freed at the end of function call.
sql/sp_head.cc:
sp_head::execute_function():
Introduced new memroot and arena for objects which lifetime is whole
duration of function call (e.g. sp_rcontext, sp_cursor). We can't
use caller's arena/memroot for those objects because in this case
some fixed amount of memory will be consumed for each function/trigger
invocation and so statements which involve lot of them will hog memory.
Got rid of param_values array to avoid excessive juggling with arenas.
The bug was as follows: When merge_key_fields() encounters "t.key=X OR t.key=Y" it will
try to join them into ref_or_null access via "t.key=X OR NULL". In order to make this
inference it checks if Y<=>NULL, ignoring the fact that value of Y may be not yet known.
The fix is that the check if Y<=>NULL is made only if value of Y is known (i.e. it is a
constant).
TODO: When merging to 5.0, replace used_tables() with const_item() everywhere in merge_key_fields().
mysql-test/r/innodb_mysql.result:
Testcase for BUG16798
mysql-test/t/innodb_mysql.test:
Testcase for BUG16798
sql/sql_select.cc:
BUG#16798: Inapplicable ref_or_null query plan and bad query result on random occasions
In merge_key_fields() don't call val->is_null() if the value of val is not known.
after merge.
Concurrent read and update of privilege structures (like simultaneous
run of SHOW GRANTS and ADD USER) could result in server crash.
Ensure that proper locking of ACL structures is done.
No test case is provided because this bug can't be reproduced
deterministically.
sql/sql_acl.cc:
Ensure that access to ACL data is protected by acl_cache->lock mutex.
Use system_charset_info for host names consistently.
Remove check_acl_user(). Use find_acl_user() instead.
sql/sql_acl.h:
Remove check_acl_user() declaration.
sql/sql_parse.cc:
Use is_acl_user() instead of check_acl_user().
into mysql.com:/home/tomash/src/mysql_ab/mysql-5.0-merge
mysql-test/r/func_misc.result:
Manual merge of the fix for bug#16501.
mysql-test/t/func_misc.test:
Manual merge of the fix for bug#16501.
sql/item_func.cc:
Manual merge of the fix for bug#16501.
sql/sql_acl.cc:
For the fix of bug#16372, use local version, since the fix for 5.0 is
different, and will go in separate ChangeSet.
(Fixes core dump in rpl_failed_optimize.test)
Ensure we end active transcations if we do an admin command (like optimize, repair etc)
mysql-test/extra/rpl_tests/rpl_failed_optimize.test:
Added extra test + drop of table at end of test
mysql-test/lib/mtr_report.pl:
Fail if mysqld asserts or prints stack
mysql-test/mysql-test-run.sh:
Fail if mysqld asserts or prints stack
mysql-test/r/exampledb.result:
Cleanup of events_tests (as this caused a lot of problems if it didn't work)
mysql-test/r/innodb.result:
Extra test to see that we can do an optimize table on an active transaction
mysql-test/r/rpl_failed_optimize.result:
Added extra test + drop of table at end of test
mysql-test/t/exampledb.test:
Cleanup of events_tests (as this caused a lot of problems if it didn't work)
mysql-test/t/innodb.test:
Extra test to see that we can do an optimize table on an active transaction
sql/handler.cc:
Don't use row level logging on optimize or repair table.
sql/log.cc:
Simplify code (no logic changes)
sql/mysql_priv.h:
Added prototype
sql/sql_base.cc:
Better name for define
sql/sql_class.cc:
Indentation fix
sql/sql_parse.cc:
Make end_active_trans() global
sql/sql_table.cc:
Ensure we end active transcations if we do an admin command (like optimize, repair etc)
fixed memleak in ndbcluster_end
mysql-test/mysql-test-run.pl:
do not install ndb slave if no slaves
sql/ha_ndbcluster.cc:
fixed memleak in ndbcluster_end
The reason of the bug is in that `get_var_with_binlog' performs missed
assingment of
the variables as side-effect. Doing that it eventually calls
`free_underlaid_joins' to pass as an argument `thd->lex->select_lex' of the lex
which belongs to the user query, not
to one which is emulated i.e SET @var1:=NULL.
`get_var_with_binlog' is refined to supply a temporary lex to sql_set_variables's stack.
mysql-test/r/rpl_user_variables.result:
results changed
mysql-test/t/rpl_user_variables.test:
a problematic query to be binlogged is added
sql/item_func.cc:
BUG#19136: Crashing log-bin and uninitialized user variables
The reason of the bug is in that how `get_var_with_binlog' performs missed
assingment of the variables: `free_underlaid_joins' gets as an argument `thd->lex->select_lex'
which belongs to the user query, not to one which is emulated i.e SET @var1:=NULL.
`get_var_with_binlog' is refined to supply a temporary lex to sql_set_variables's stack.
into ua141d10.elisa.omakaista.fi:/home/my/bk/mysql-5.0
mysql-test/r/date_formats.result:
Auto merged
mysql-test/t/date_formats.test:
Auto merged
sql/item_timefunc.cc:
Merged from 4.1
into poseidon.ndb.mysql.com:/home/tomas/mysql-5.1-new-ndb
mysql-test/t/disabled.def:
Auto merged
sql/ha_ndbcluster.cc:
Auto merged
sql/ha_ndbcluster_binlog.cc:
Auto merged
support-files/mysql.spec.sh:
Auto merged
into mysql.com:/home/my/mysql-5.1
mysql-test/lib/mtr_report.pl:
Auto merged
mysql-test/mysql-test-run.sh:
Auto merged
mysql-test/r/subselect.result:
Auto merged
sql/mysql_priv.h:
Auto merged
sql/sql_select.cc:
Auto merged
sql/sql_test.cc:
Auto merged
sql/sql_view.cc:
Auto merged
sql/sql_lex.cc:
manual merge
mysql-test-run now fails in case of warnings
mysql-test/lib/mtr_report.pl:
Fail if find warnings
mysql-test/mysql-test-run.sh:
Fail if find warnings
sql/sql_lex.cc:
Initalize st_lex properly
sql/sql_view.cc:
Fixed problem with unaligned memory (wrong free)