- Change && to ||
- Check for return value != 0 in "ndb->init()"
mysql-test/r/ndb_cache_multi2.result:
Update test result
mysql-test/t/ndb_cache_multi2.test:
Update test case
- add printouts for what server the queries are from
- Run the query from "while" once on server1 to cache it
sql/ha_ndbcluster.cc:
&& => ||, to call both the function "thd->store_global()" and "ndb->init()"
ndb_init returns 0 on sucess. Fail if not zero.
To quote Timour review lines:
The actual cause of the bug is that sql_base.cc:setup_wild()
sets "select_lex->with_wild = 0" (in the end of the function) once
it expands all wild-cards, and wild-card expansion is done during
the prepare phase. During this phase we replace all "*" with the
corresponding items, which for views happen to be references to
references. When we do execute, select_lex->with_wild = 0, and
all "*" are already replaced by the corresponding items, which
in the case of views need to be dereferenced first.
Fixed by refining the assert. Regression test for the bug is rpl_row_view01,
as was reported.
sql/item.cc:
Refined asssert, suggested by Evgen, due to BUG#17265 prepared statement for select with ps-protocol
does not hold the former.
The problem was that error flag was not reset.
mysql-test/r/sp-security.result:
Results for test case for BUG#7787.
mysql-test/t/sp-security.test:
A test case for BUG#7787.
sql/sp.cc:
Reset errors after sp_find_routine().
into neptunus.(none):/home/msvensson/mysql/mysql-5.0
sql/sp_head.cc:
Auto merged
mysql-test/r/mysqldump.result:
Merge
mysql-test/t/mysqldump.test:
Merge
symptom). sys_var::check_set() was wrong. mysqlbinlog makes use of such SET SQL_MODE=N
(where N is interpreted like if SQL_MODE was a field of type SET), so
this bug affected recovery from binlogs if the server was running with certain SQL_MODE values,
for example the default values on Windows (STRICT_TRANS_TABLES); to work around this bug people
had to edit mysqlbinlog's output.
mysql-test/r/sql_mode.result:
result update
mysql-test/t/sql_mode.test:
test for various numeric SQL_MODE values
sql/set_var.cc:
For a set, it does not make sense to test if the supplied argument exceeds the number of elements in the set
(such test would make sense for an enum), but rather to check if it exceeds 2^this (to verify
that only reasonable bits are set).
if the function, invoked in a non-binlogged caller (e.g. SELECT, DO), failed half-way on the master,
slave would stop and complain that error code between him and master mismatch.
To solve this, when a stored function is invoked in a non-binlogged caller (e.g. SELECT, DO), we binlog the function
call as SELECT instead of as DO (see revision comment of sp_head.cc for more).
And: minor wording change in the help text.
This cset will cause conflicts in 5.1, I'll merge.
mysql-test/r/rpl_sp.result:
result update
mysql-test/t/rpl_sp-slave.opt:
bug just fixed so option not needed
mysql-test/t/rpl_sp.test:
test for more half-failed functions with DO and SELECT, to test the bug of this changeset.
cleanup at the end.
sql/mysqld.cc:
function -> stored function (change suggested by Paul)
sql/sp_head.cc:
When a function updates data and is called from a non-binlogged statement (SELECT, DO), we binlog it
as SELECT myfunc(), and not DO myfunc() like before.
problem was: when a connection disconnects having an open transaction affecting MyISAM and InnoDB, the ROLLBACK event stored in the binary log
contained a non-zero error code (1053 because of the disconnection), so when slave applied the transaction, slave complained that its ROLLBACK succeeded
(error_code=0) while master's had 1053, so slave stopped. But internally generated binlog events such as this ROLLBACK
should always have 0 as error code, as is true in 4.1 and was accidentally broken in 5.0,
so that there is no false alarm.
mysql-test/r/mix_innodb_myisam_binlog.result:
result update
mysql-test/t/mix_innodb_myisam_binlog.test:
test for BUG#16559
sql/log.cc:
Internally generated binlog events should always have an error code of zero (like in 4.1; in 5.0 this was accidentally broken).
necessary implementation in the server
mysql_upgrade script added
client/mysqlcheck.c:
--check-upgrade option added
include/my_base.h:
errcode added
include/myisam.h:
option added
scripts/Makefile.am:
mysql_upgrade script added
sql/handler.cc:
checks for old types/bugs added
sql/handler.h:
declarations regarding checks for upgrade
sql/lex.h:
sym added
sql/share/errmsg.txt:
error message added
sql/slave.cc:
now ha_repair is for public use
sql/sql_table.cc:
upgrade in ha_repair implemented
sql/sql_yacc.yy:
CHECK ... FOR UPGRADE added to syntax
trigger starts trigger".
In short, the deadlock/crash happened when execution of statement, which used
stored functions or activated triggers, coincided with alteration of the
tables used by these functions or triggers (in highly concurrent environment).
Bug was caused by the incorrect handling of tables from prelocked set in
open_tables() functions in situations when refresh happened. This fix replaces
old smart but not very robust way of handling tables after refresh (which was
closing only old tables), with new one which simply closes all tables opened so
far and restarts open_tables().
Also fixed handling of temporary tables in close_tables_for_reopen().
No test case present since bug manifests itself only in concurrent environment.
sql/mysql_priv.h:
In order to handle correctly case when table list completely consists from tables
from prelocked set close_tables_for_reopen() have to accept table list as in/out
parameter.
sql/sql_base.cc:
open_tables():
Removed part of comment which was out of date.
Changed handling of case when refresh happens during opening of tables, now
instead of having code which decides for each table if it should be closed
we simply close all tables. Old code also incorrectly handled tables from
prelocked set in this situation which resulted in bug #16593 "Deadlock or
crash in stress test for case where triggers starting trigger".
close_tables_for_reopen():
Now we correctly handle the case when table list completely consists from
tables from prelocked set. Also now we simply close all tables instead
leaving temporary tables non-closed (such approach allows easily handle
correctly tables from prelocked set).
sql/sql_prepare.cc:
In order to handle correctly case when table list completely consists from tables
from prelocked set close_tables_for_reopen() have to accept table list as in/out
parameter.
sql/sql_update.cc:
In order to handle correctly case when table list completely consists from tables
from prelocked set close_tables_for_reopen() have to accept table list as in/out
parameter.
- Detect that connection to server has been broken in "net_clear". Since
net_clear is always called before we send command to server, we can be sure
that server has not received the command.
mysql-test/r/wait_timeout.result:
Update test result
mysql-test/t/wait_timeout-master.opt:
Decrease wait_timeout value to avoid unneccessary sleeps
mysql-test/t/wait_timeout.test:
Test that same error message is returned when disconnected regardless of connection is socket or TCP
Decrease sleep times
sql/net_serv.cc:
Make "net_clear" detect if connection with server has been broken by
performing a select. If the select returns that there are data to read but
no data can be read, that means the connection is broken. Signal disconnected
to "write" functions by setting error to 2.
If item->cached_table is set, find_field_in_tables() returns found field
even if it doesn't belong to current select. Because Item_field::fix_fields
doesn't expect such behaviour, reported bug occurs.
Item_field::fix_fields() was modifed to detect when find_field_in_tables()
can return field from outer select and process such fields accordingly.
In order to ease this code which was searching and processing outed fields was
moved into separate function called Item_field::fix_outer_field().
sql/item_subselect.h:
Fixed bug #15706: find_field_in_tables() returns field from outer select
Item_field::fix_outer_field() was marked as friend to Item_subselect class.
sql/item.h:
Fixed bug #15706: find_field_in_tables() returns field from outer select
fix_outer_field() function is added to the Item_field class.
sql/item.cc:
Fixed bug #15706: find_field_in_tables() returns field from outer select
Item_ref::fix_fields() and Item_field::fix_fields() were modifed to detect when
find_field_in_tables() can return field from outer select and process such
fields accordingly.
In order to ease this, code Item_field::fix_fields() which was searching and
processing outer fields was moved into separate function called
Item_field::fix_outer_field().
To the Item_field::fix_field() added a loop for finding context for found field.
mysql-test/t/disabled.def:
Fixed bug #15706: find_field_in_tables() returns field from outer select
Enable subselect test
The Item_func_if::fix_length_and_dec() function when calculating length of
result doesn't take into account unsigned_flag. But it is taken when
calculating length of temporary field. This result in creating field that
shorter than needed. Due to this, in the reported query 40.0 converted to 9.99.
The function Item_func_if::fix_length_and_dec() now adds 1 to the max_length if
the unsigned_flag isn't set.
sql/item_cmpfunc.cc:
Fixed bug#16272: IF function with decimal args can produce wrong result
The function Item_func_if::fix_length_and_dec() now adds 1 to the max_length if
the unsigned_flag isn't set.
mysql-test/r/func_if.result:
Added test case for bug#16272: IF function with decimal args can produce wrong result
mysql-test/t/func_if.test:
Added test case for bug#16272: IF function with decimal args can produce wrong result
Backporting character_set_filesystem from 5.0 to 5.1.
sql/mysqld.cc:
Backporting character_set_filesystem from 5.0 to 5.1.
sql/set_var.cc:
Backporting character_set_filesystem from 5.0 to 5.1.
sql/set_var.h:
Backporting character_set_filesystem from 5.0 to 5.1.
sql/sql_class.cc:
Backporting character_set_filesystem from 5.0 to 5.1.
sql/sql_class.h:
Backporting character_set_filesystem from 5.0 to 5.1.
sql/sql_yacc.yy:
Backporting character_set_filesystem from 5.0 to 5.1.
mysql-test/t/variables.test:
Backporting character_set_filesystem from 5.0 to 5.1.
mysql-test/r/variables.result:
Backporting character_set_filesystem from 5.0 to 5.1.
A subquery transformation changes the HAVING clause of the embedding query if the subquery contains
a GROUP BY clause. Yet the split_sum_func2 function was not applied to the modified HAVING clause.
This could result in wrong answers.
mysql-test/r/subselect.result:
Added a test case for bug #16603.
mysql-test/t/subselect.test:
Added a test case for bug #16603.
Bug #17257 ndb, update fails for inner joins if tables do not have Primary Key
change: the allocated area by setValue may not be around for later, store hidden key in special member variable instead
mysql-test/r/ndb_basic.result:
Bug #17249 delete statement with join where clause fails when table do not have pk
Bug #17257 update fails for inner joins if tables do not have Primary Key
mysql-test/t/ndb_basic.test:
Bug #17249 delete statement with join where clause fails when table do not have pk
Bug #17257 update fails for inner joins if tables do not have Primary Key
sql/ha_ndbcluster.cc:
Bug #17249 delete statement with join where clause fails when table do not have pk
Bug #17257 update fails for inner joins if tables do not have Primary Key
change: the allocated area by setValue may not be around for later, store hidden key in special member variable instead
sql/ha_ndbcluster.h:
Bug #17249 delete statement with join where clause fails when table do not have pk
Bug #17257 update fails for inner joins if tables do not have Primary Key
change: the allocated area by setValue may not be around for later, store hidden key in special member variable instead
internal charset to one associated with currently being handled query.
To note such a query can come from interactive client either.
There was a discussion within replication team and Monty who's suggestion won.
It avoids straightforward parsing of all `set' queries that could affect client side
character set.
According to the idea, mysql client does not parse `set' queries but rather cares of
`charset new_cs_name' command.
This command is generated by mysqlbinlog in form of exclaiming comment (Lars' suggestion)
so that enlightened clients like `mysql' knows what to do with it.
Interactive human can switch between many multi-byte charsets during the session
providing the command explicitly.
To note that setting new internal mysql's charset does not
trigger sending any `SET' sql statement to the server.
client/mysql.cc:
BUG#16217 revealed the problem of switching between charsets in mysql client.
Such switching is necessary in a case when being scanned query consists of
multi-byte chars and internal charset was initialized differently. mysql finds
`/' escape and misiterprete it
while in fact one could be a part of a multi-byte symbol like the bug page reported.
This patch extends mysql `charset' command, '\C' shortcut.
mysql-test/r/ctype_ucs_binlog.result:
comment line generated by mysqlbinlog for processing of logs with multi-byte chars.
mysql-test/r/mysql.result:
results are altered due to #16217
mysql-test/r/mysqlbinlog.result:
Results are altered due to #16217
mysql-test/r/mysqlbinlog2.result:
commeted command for mysql client due to multi-byte binlog
mysql-test/r/rpl_charset.result:
commented command for mysql due to multi-byte binlogs
mysql-test/r/rpl_timezone.result:
commented command for mysql client due to multi-byte binlogs
mysql-test/r/user_var-binlog.result:
commented command for mysql client due to multi-byte binlogs
mysql-test/t/mysql.test:
Main test for mysql client is extended to check `charset' command.
mysql-test/t/mysqlbinlog.test:
Checking how /*! \C cs_name */ are added to the output of mysqlbinlog.
The exclaiming comment is for further processing by mysql client.
The added part mimics the failure to recover tables from binlog - see BUG#16217.
sql/log_event.cc:
Sending into output instructions for mysql client to switch internally
to appropriate charset.
mysql client is supposed to be invoked with --default-character-set=
"to default character set of the server created the binlog".
Check if AGGREGATE was given with a stored (non-UDF) function, and return
error in that case.
Also made udf_example/udf_test work again, by adding a missing *_init()
function. (_init() functions required unless --allow_suspicious_udfs is
given to the server, since March 2005 - it seems udf_example wasn't updated
at the time.)
mysql-test/r/sp-error.result:
Updated results for BUG#16896.
mysql-test/t/sp-error.test:
Added test case for BUG#16896.
sql/share/errmsg.txt:
New error message: ER_SP_NO_AGGREGATE
sql/sql_yacc.yy:
Check if AGGREGATE was used when creating a stored function (i.e. not an UDF).
sql/udf_example.cc:
Added myfunc_int_init() function to make it work when the server is running without
--allow_suspicious_udfs.
- Pass "in_comment" variable on to new lex in sp_head::reset_lex
- Add testcases for dumping and reloading trigger without BEGIN/END
mysql-test/r/mysqldump.result:
Update test result
mysql-test/t/mysqldump.test:
Add test for dumping trigger without begin/end, and test that the output from mysqldump can be reloaded.
sql/sp_head.cc:
If already in a comment before parsing a substatement, set in_comment in the new lex as well.
This will handle cases where the comment starts before the substatement, which is common in
output from mysqldump to mask away syntax not supported by earlier versions of MySQL.
Ex:
/*!50003 CREATE TRIGGER `tr1` BEFORE INSERT ON `t1` FOR EACH ROW
set new.created=now() */;
^=== sp_head::reset_lex is called when already in comment
and possibly server crash in mysqld v5.0.
Reported MyISAM table was created in mysqld 4.1 and contains varchar field.
When binary files of that table was moved to 5.0, mysqld treats that varchar
field as a string field.
In order to make grouping server calculates group buffer, and because
that field is string server assumes it has fixed length and doesn't add
space for length, but later that field is converted to varchar field.
Due to this, when field values were actually copied, additional space for
length bytes is taken and buffer overrun occurs, which may lead to server crash.
The calc_group_buffer() function now reserves additional space for length
bytes for VAR_STRING fields, like for VARCHAR fields.
sql/sql_select.cc:
Fixed bug#16752 Binary table files created in mysqld v4.1 caused buffer overrun and possibly server crash in mysqld v5.0.
The calc_group_buffer() function now reserves additional space for length
bytes for VAR_STRING fields, like for VARCHAR fields.