into dsl-hkibras1-ff5dc300-70.dhcp.inet.fi:/home/elkin/MySQL/TEAM/FIXES/5.0/bug27716-multi_upd_no_binlog
mysql-test/r/innodb.result:
Auto merged
mysql-test/t/innodb.test:
Auto merged
sql/sql_update.cc:
Auto merged
into pilot.(none):/data/msvensson/mysql/bug28497/my50-bug28497
client/mysqltest.c:
Auto merged
mysql-test/r/mysqltest.result:
Auto merged
mysql-test/t/mysqltest.test:
Auto merged
- Add funtion "query_get_value to allow reading a fields value
into a $variable
client/mysqltest.c:
- Add function "let $var= query_get_value(<query>,<colname>,<row>)"
making it possible to read a value from a specific field in a query
into a $variable.
mysql-test/r/mysqltest.result:
Add test cases for "query_get_value"
mysql-test/t/mysqltest.test:
Add test cases for "query_get_value"
Implementation of mysql_multi_update did not call multi_update::send_error method in some cases
(see the test reported on bug page and test cases in changeset).
Fixed with deploying the method, ::send_error() is refined to get binlogging code which works whenever
there is modified non-transactional table.
thd->no_trans_update.stmt flag is set in to TRUE to ease testing though being the beginning of relative
bug#27417 fix (addresses a part of those issues).
Eliminating two minor issues (small bugs) in multi_update methods.
This patch for multi-update also addresses a part of the issues reported in bug#13270,bug#23333.
mysql-test/r/innodb.result:
result changed
mysql-test/r/multi_update.result:
results changed
mysql-test/t/innodb.test:
regression test for the bug combining transactional and non-transaction tables
mysql-test/t/multi_update.test:
regression tests added - erred query must be binlogged
sql/sql_update.cc:
making a call to multi_update::send_error when mysql_select return an error;
deploying binlogging inside of ::send_error;
refining multi_update::send_eof() to mark binlogging work done when its call to ::do_updates() errs
and the query is binlogged with the error. ::send_error() will be called after all but
do not do anything;
thd->no_trans_update.stmt is corrected to be set to TRUE according to the existed code pattern.
Although this part relates to another bugs (bug#27417 etc) it is needed here for testing;
Eliminating a separate issue in multi_update::do_updates where
either one of the class members trans_safe, transactional_tables was
set after the per-table loop whereas both should be calculated during
looping.
Eliminating a separate issue in ::send_eof() where thd->no_trans_update.all won't be set TRUE when
amoung others there'd be at least one modified transactional table.
Binlogging is done to satisfy to general character bug#13270,bug#23333 so that those won't have
fixes specific for multi-update.
into gleb.loc:/home/uchum/work/bk/mysql-5.0-opt
mysql-test/r/view.result:
Merge with bug #27827 fix.
mysql-test/t/view.test:
Merge with bug #27827 fix.
The end_update() function uses the Item::save_org_in_field() function to
save original values of items into the group buffer. But for the
Item_func_set_user_var this method was mapped to the save_in_field method.
The latter function wrongly decides to use the result_field. This leads to
saving incorrect value in the grouping buffer and wrong result of the whole
query.
The can_use_result_field argument of the bool type is added to the
Item_func_set_user_var::save_in_field() function. If it is set to FALSE
then the item's result field won't be used. Otherwise it will be detected
whether the result field will be used (old behaviour).
Two wrapping functions for the function above are added to the
Item_func_set_user_var class:
the save_in_field(Field *field, bool no_conversions) - it calls the above
function with the can_use_result_field set to TRUE.
the save_org_in_field(Field *field) - same, but the can_use_result_field
is set to FALSE.
mysql-test/t/user_var.test:
Added a test case for the bug#28494: Grouping by Item_func_set_user_var
produces incorrect result.
mysql-test/r/user_var.result:
Added a test case for the bug#28494: Grouping by Item_func_set_user_var
produces incorrect result.
sql/item_func.cc:
Bug#28494: Grouping by Item_func_set_user_var produces incorrect result.
The can_use_result_field argument of the bool type is added to the
Item_func_set_user_var::save_in_field() function. If it is set to FALSE
then the item's result field won't be used. Otherwise it will be detected
whether the result field will be used (old behaviour).
sql/item_func.h:
Bug#28494: Grouping by Item_func_set_user_var produces incorrect result.
The can_use_result_field argument of the bool type is added to the
Item_func_set_user_var::save_in_field() function.
Two wrapping functions for the function above are added to the
Item_func_set_user_var class:
the save_in_field(Field *field, bool no_conversions) - it calls the above
function with the can_use_result_field set to TRUE.
the save_org_in_field(Field *field) - same, but the can_use_result_field
is set to FALSE.
ON conditions from JOIN expression were ignored at CHECK OPTION
check when updating a multi-table view with CHECK OPTION.
The st_table_list::prep_check_option function has been
modified to to take into account ON conditions at CHECK OPTION check
It was also changed to build the check option condition only once
for any update used in PS/SP.
sql/table.h:
Fixed bug #27827.
The st_table_list::check_option_processed variable has been added
to build the check option condition only once for any update used
in PS/SP.
sql/table.cc:
Fixed bug #27827.
The st_table_list::prep_check_option function has been
modified to to take into account ON conditions at CHECK OPTION check
It was also changed to build the check option condition only once
for any update used in PS/SP.
mysql-test/t/view.test:
Updated test case for bug #27827.
mysql-test/r/view.result:
Updated test case for bug #27827.
Setting a key_cache_block_size which is not a power of 2
could corrupt MyISAM tables.
A couple of computations in the key cache code use bit
operations which do only work if key_cache_block_size
is a power of 2.
Replaced bit operations by arithmetic operations
to make key cache able to handle block sizes that are
not a power of 2.
include/keycache.h:
Bug#28478 - Improper key_cache_block_size corrupts MyISAM tables
Removed element 'key_cache_shift' from KEY_CACHE after
the changes in mf_keycache.c made it unused.
mysql-test/r/key_cache.result:
Bug#28478 - Improper key_cache_block_size corrupts MyISAM tables
Added test result
mysql-test/t/key_cache.test:
Bug#28478 - Improper key_cache_block_size corrupts MyISAM tables
Added test
mysys/mf_keycache.c:
Bug#28478 - Improper key_cache_block_size corrupts MyISAM tables
Replaced bit operations by arithmetic operations
to make key cache able to handle block sizes that are
not a power of 2.
- Update tests to be independent how the mysqld was started
mysql-test/r/mysqltest.result:
Update result file
mysql-test/t/mysqltest.test:
The purpose of these three test is to check that "sync_with_master"
detects illegal parameters, the parameter checking is done before
sending any command to the server and the "save_master_pos" can be
removed in two cases to make the tests independent of mysqld.
The thirs test is removed since it's a syntax check that is done
after the command has been executed and is done for all comands in
mysqltest - it's tested elsewhere and is not specific to "sync_with_master"
When the same VIEW was created at the master side twice,
malformed (truncated after the word 'AS') query string
was forwarded to client side, so error messages on the
master and client was different, and replication was
broken.
The mysql_register_view function call failed
too early: fields of `view' output argument of this
function was not filled yet with correct data required
for query replication.
The mysql_register_view function also copied pointers to
local buffers into a memory allocated by the caller.
sql/sql_view.cc:
Fixed bug #28244.
Checking of existence of VIEW .frm file has been
moved down to the place, when `view' argument is
completely filled with proper data.
view->query.str and view->query.md5 pointers has been
set to the NULL before return from the mysql_register_view
function.
mysql-test/t/rpl_view.test:
Updated test case for bug #28244.
mysql-test/r/rpl_view.result:
Updated test case for bug #28244.
mysql-test/r/binlog.result:
transaction ids increased by one due to have_log_bin.inc
mysql-test/t/binlog.test:
transaction ids for ps-protocol increased by one due to have_log_bin.inc
Problem:
HASH indexes on VARCHAR columns with binary collations did not ignore trailing spaces from strings before comparisons. This could result in duplicate records being successfully inserted into a MEMORY table with unique key constraints.
As a direct consequence of the above, internal MEMORY tables used for GROUP BY calculation in testcases for bug #27643 contained duplicate rows which resulted in duplicate key errors when converting those temporary tables to MyISAM. Additionally, that error was incorrectly converted to the 'table is full' error.
Solution:
- ignore trailing spaces in VARCHAR fields with binary collations when calculating hashes.
- return a proper error from create_myisam_from_heap() when conversion fails.
mysql-test/r/ctype_ucs2_def.result:
Added a testcase for bug #27643.
mysql-test/r/heap_hash.result:
Added a testcase for bug #27643.
mysql-test/t/ctype_ucs2_def.test:
Added a testcase for bug #27643.
mysql-test/t/heap_hash.test:
Added a testcase for bug #27643.
sql/sql_select.cc:
Return an appropriate error instead of 'table is full' when conversion from MEMORY to MyISAM fails.
strings/ctype-bin.c:
Added my_hash_sort_8bit_bin() which ignores trailing spaces when calculating hashes, and is now used for VARCHAR columns instead of my_hash_sort_bin().
strings/ctype-mb.c:
Ignore trailing spaces when calculating a string hash in my_hash_sort_mb_bin().
strings/ctype-ucs2.c:
Ignore trailing spaces when calculating a string hash in my_hash_sort_ucs2_bin().
into pippilotta.erinye.com:/shared/home/df/mysql/build/mysql-5.0-build-work-nn
mysql-test/t/blackhole.test:
Auto merged
mysql-test/t/mysqltest.test:
Auto merged
mysql-test/t/sp_trans.test:
Auto merged
mysql-test/r/mix_innodb_myisam_binlog.result:
have_log_bin.inc increases transaction count by onw
mysql-test/t/binlog.test:
test obviously requires binlog
mysql-test/t/blackhole.test:
test requires binlog for now
mysql-test/t/ctype_cp932_binlog.test:
test requires binlog
mysql-test/t/ctype_cp932_notembedded.test:
test requires binlog for now
mysql-test/t/ctype_ucs_binlog.test:
test requires binlog
mysql-test/t/drop_temp_table.test:
test requires binlog for now
mysql-test/t/flush_block_commit_notembedded.test:
test requires binlog for now
mysql-test/t/insert_select-binlog.test:
test requires binlog
mysql-test/t/mix_innodb_myisam_binlog.test:
test requires binlog
mysql-test/t/mysqlbinlog-cp932.test:
test requires binlog
mysql-test/t/mysqlbinlog.test:
test requires binlog
mysql-test/t/mysqlbinlog2.test:
test requires binlog
mysql-test/t/mysqltest.test:
test requires binlog for now
mysql-test/t/sp_trans.test:
test requires binlog for now
mysql-test/t/user_var-binlog.test:
test requires binlog for now
mysqld crashed when a long-running explain query was killed from
another connection.
When the current thread caught a kill signal executing the function
best_extension_by_limited_search it just silently returned to
the calling function greedy_search without initializing elements of
the join->best_positions array.
However, the greedy_search function ignored thd->killed status
after a calls to the best_extension_by_limited_search function, and
after several calls the greedy_search function used an uninitialized
data from the join->best_positions[idx] to search position in the
join->best_ref array.
That search failed, and greedy_search tried to call swap_variables
function with NULL argument - that caused a crash.
sql/sql_select.cc:
Fixed bug #28598.
choose_plan(), greedy_search(), best_extension_by_limited_search()
and find_best() functions have been changed to return TRUE in case
of fatal error.
mysql-test/t/kill.test:
Updated test case for bug #28598.
mysql-test/r/kill.result:
Updated test case for bug #28598.
ENUM fields internally store their values as integers and may use integer
values as indexes to their values. Invalid values are mapped to zero value.
When storing an empty string the ENUM field fails to find an appropriate value
and tries to convert the provided string to integer. The conversion also
fails and error is returned even if the thd->count_cuted_fields is set to
CHECK_FIELD_IGNORE. This makes the range optimizer wrongly decide that an
impossible range is present.
Now the Field_enum::store() returns error while storing an empty string only
if the thd->count_cuted_fields isn't set to CHECK_FIELD_IGNORE.
sql/field.cc:
Bug#28729: Field_enum wrongly reported an error while storing an empty string.
Now the Field_enum::store() returns error while storing an empty string only
if the thd->count_cuted_fields isn't set to CHECK_FIELD_IGNORE.
mysql-test/r/type_enum.result:
Added a test case for the bug#28729: Field_enum wrongly reported an error
while storing an empty string.
mysql-test/t/type_enum.test:
Added a test case for the bug#28729: Field_enum wrongly reported an error
while storing an empty string.
mysql-test/r/auto_increment.result:
result fix
mysql-test/r/create.result:
result fix
mysql-test/r/insert.result:
result fix
mysql-test/r/insert_select.result:
result fix
mysql-test/r/insert_update.result:
result fix
mysql-test/r/key.result:
result fix
mysql-test/r/null.result:
result fix
mysql-test/r/null_key.result:
result fix
mysql-test/r/ps_2myisam.result:
result fix
mysql-test/r/ps_3innodb.result:
result fix
mysql-test/r/ps_4heap.result:
result fix
mysql-test/r/ps_5merge.result:
result fix
mysql-test/r/ps_6bdb.result:
result fix
mysql-test/r/ps_7ndb.result:
result fix
mysql-test/r/strict.result:
result fix
mysql-test/r/view.result:
result fix
mysql-test/r/warnings.result:
result fix
mysql-test/t/strict.test:
test fix
test comments correction
mysql-test/r/binlog_killed.result:
changed
mysql-test/t/binlog_killed.test:
wrong comments (but important ones) left;
little refinement in result calc
The result of the CHECK OPTION condition evaluation over an
updated record and records of merged tables was arbitrary and
dependant on the order of records in the merged tables during
the execution of SELECT statement.
The CHECK OPTION expression was evaluated over expired record
buffers (with arbitrary data in the fields).
Rowids of tables used in the CHECK OPTION expression were
added to temporary table rows. The multi_update::do_updates()
method was modified to restore necessary record buffers
before evaluation of the CHECK OPTION condition.
sql/sql_class.h:
Fixed bug #29716.
The multi_update::unupdatable_check_opt_tables variable
has been added.
sql/sql_update.cc:
Fixed bug #29716.
Rowids of tables used in the CHECK OPTION expression were
added to temporary table rows. The multi_update::do_updates()
method was modified to restore necessary record buffers
before evaluation of the CHECK OPTION condition.
mysql-test/t/view.test:
Updated test case for bug #28716.
mysql-test/r/view.result:
Updated test case for bug #28716.
Integer values with 10 digits may or may not fit into an int column
(e.g. 2147483647 vs 6147483647).
Thus when creating a temp table column for such an int we must
use bigint instead.
Fixed to use bigint.
Also subsituted a "magic number" with a named constant.
mysql-test/r/analyse.result:
Bug #28492: Adjusted the results after having fixed the bug
mysql-test/r/metadata.result:
Bug #28492: test case
mysql-test/r/olap.result:
Bug #28492: Adjusted the results after having fixed the bug
mysql-test/r/sp.result:
Bug #28492: Adjusted the results after having fixed the bug
mysql-test/r/view.result:
Bug #28492: Adjusted the results after having fixed the bug
mysql-test/t/metadata.test:
Bug #28492: test case
sql/field.h:
Bug #28492: Replaced a magic number with a constant
sql/sql_select.cc:
Bug #28492: Treat integers with 10 and more digits as
bigint.
combining the final result variable in such way that either option of the test execution
will yield zero.
mysql-test/r/binlog_killed.result:
results changed
mysql-test/t/binlog_killed.test:
there are two options for the test passing:
1. no rows inserted and the INSERT gets killed, then there is no INSERT query in binlog
2. all rows inserted, then INSERT gets to binlog and error_code is zero
type assertion.
The bug was introduced by the patch for bug #16377.
The "+ INTERVAL" (Item_date_add_interval) function detects its result type
by the type of its first argument. But in some cases it returns STRING
as the result type. This happens when, for example, the first argument is a
DATE represented as string. All this makes the get_datetime_value()
function misinterpret such result and return wrong DATE/DATETIME value.
To avoid such cases in the fix for #16377 the code that detects correct result
field type on the first execution was added to the
Item_date_add_interval::get_date() function. Due to this the result
field type of the Item_date_add_interval item stored by the send_fields()
function differs from item's result field type at the moment when
the item is actually sent. It causes an assertion failure.
Now the get_datetime_value() detects that the DATE value is returned by
some item not only by checking the result field type but also by comparing
the returned value with the 100000000L constant - any DATE value should be
less than this value.
Removed result field type adjusting code from the
Item_date_add_interval::get_date() function.
sql/item_cmpfunc.cc:
Bug#28450: The Item_date_add_interval in select list may fail the field
type assertion.
Now the get_datetime_value() detects that the DATE value is returned by
some item not only by checking the result field type but also by comparing
the returned value with the 100000000L constant - any DATE value should be
less than this value.
mysql-test/r/func_date_add.result:
Added a test case for the bug#28450: The Item_date_add_interval in select list may fail the field
type assertion.
sql/item_timefunc.cc:
Bug#28450: The Item_date_add_interval in select list may fail the field
type assertion.
Removed result field type adjusting code from the
Item_date_add_interval::get_date() function.
mysql-test/t/func_date_add.test:
Added a test case for the bug#28450: The Item_date_add_interval in select list may fail the field
type assertion.
tests refining, see binlog_killed.test file for details
mysql-test/r/binlog_killed.result:
results changed
mysql-test/t/binlog_killed.test:
killer conn waits for the first row to appear;
log-disabling kill query since prey's id is not deterministic;
correcting pattern to search in binlog for insert query;
Refining the tests since pb revealed the older version's fragality - the error from SF() due to killed
may be different on different env:s.
DBUG_ASSERT instead of assert.
mysql-test/r/binlog_killed.result:
new result file
mysql-test/t/binlog_killed.test:
regression for bug#22725 simplified. tests for bug27563, BUG#27565 made inactive.
sql/sql_insert.cc:
DBUG_ASSERT
longer showing SP names.
SHOW CREATE VIEW uses Item::print() methods to reconstruct the
statement text from the parse tree.
The print() method for stored procedure calls needs allocate
space to print the function's quoted name.
It was incorrectly calculating the length of the buffer needed
(was too short).
Fixed to reflect the actual space needed.
mysql-test/r/sp.result:
Bug #28605: test case
mysql-test/t/sp.test:
Bug #28605: test case
sql/item_func.cc:
Bug #28605: fixed the string length calculation
The reason for the bug was that replaying of a query on slave could not be possible since its event
was recorded with the killed error. Due to the specific of handling INSERT, which per-row-while-loop is
unbreakable to killing, the query on transactional table should have not appeared in binlog unless
there was a call to a stored routine that got interrupted with killing (and then there must be an error
returned out of the loop).
The offered solution added the following rule for binlogging of INSERT that accounts the above
specifics:
For INSERT on transactional-table if the error was not set the only raised flag
is harmless and is ignored via masking out on time of creation of binlog event.
For both table types the combination of raised error and KILLED flag indicates that there
was potentially partial execution on master and consistency is under the question.
In that case the code continues to binlog an event with an appropriate killed error.
The fix relies on the specified behaviour of stored routine that must propagate the error
to the top level query handling if the thd->killed flag was raised in the routine execution.
The patch adds an arg with the default killed-status-unset value to Query_log_event::Query_log_event.
sql/log_event.cc:
killed_status as the value of thd->killed can be passed as an arg to the constructor.
if the value is different from the default the arg is set to the current thd->killed value.
A caller might need to masquerade thd->killed with THD::NOT_KILLED.
So far only mysql_insert() uses such explicit way to tell the constructor about killing status.
sql/log_event.h:
default arg to the constructor with meaning of killed status of the query.
if the arg is not explicitly provided the status of thd->killed will be snapshot
inside of the constuctor, which is potentially incorrect (see bug#27571)
sql/sql_class.h:
extending killed_state with no-state member.
sql/sql_insert.cc:
ignore the KILLED flag incl KILL_BAD_DATA when the INSERT query event
is created without an `error';
sql/sql_update.cc:
Suggestion how to fix bug#27571 as comments.
mysql-test/r/binlog_killed.result:
new result file
mysql-test/t/binlog_killed.test:
regression tests also apply for bug27563, BUG#27565
- check multi update as well as update
- this bug is not present in 5.0, but execution patch is wrong, so there are probably other bugs
mysql-test/r/ndb_basic.result:
Bug #28719: multi pk update ignore corrupts data
- add test + backport some tests from 5.1
mysql-test/t/ndb_basic.test:
Bug #28719: multi pk update ignore corrupts data
- add test + backport some tests from 5.1
into polly.local:/home/kaa/src/maint/mysql-5.0-maint
sql/field.cc:
Auto merged
sql/field.h:
Auto merged
sql/item_cmpfunc.cc:
Auto merged
sql/mysql_priv.h:
Auto merged
sql/mysqld.cc:
Auto merged
strings/strtod.c:
Auto merged
When storing a large number to a FLOAT or DOUBLE field with fixed length, it could be incorrectly truncated if the field's length was greater than 31.
This patch also does some code cleanups to be able to reuse code which is common between Field_float::store() and Field_double::store().
include/m_string.h:
Added declarations for log_10 and log_01 from strtod.c
mysql-test/r/type_float.result:
Added the testcase for bug #28121 "INSERT or UPDATE into DOUBLE(200,0) field being truncated to 31 digits"
mysql-test/t/type_float.test:
Added the testcase for bug #28121 "INSERT or UPDATE into DOUBLE(200,0) field being truncated to 31 digits"
sql/field.cc:
Moved common code from Field_float::store() and Field_double:store() to Field_real::truncate()
Fixed the algorithm to not truncate large input numbers if the field length is greater than 31.
Fixed rounding to not depend on FLT_MAX/DBL_MAX constants.
sql/field.h:
Moved not_fixed member from Field_double to Field_real to allow code reuse between Field_float::store() and Field_double::store()
Added truncate() method to Field_real which is used by both Field_float and Field_double
sql/init.cc:
log_10[] and log_01[] are now defined as statical arrays in strtod.c, no need to pre-computed them.
sql/item_cmpfunc.cc:
log_01[] now starts from 1e0, not from 1e-1 for consistency.
sql/mysql_priv.h:
Moved log_10[] and log_01[] from mysqld.cc to libmystrings.
sql/mysqld.cc:
Moved log_10[] and log_01[] from mysqld.cc to libmystrings.
strings/strtod.c:
Define and use log_10[] and log_01[] as static arrays of constants instead of values pre-computed at startup.