diff --git a/Docs/manual.texi b/Docs/manual.texi index f16750d1e9e..8b75074376d 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -121,20 +121,20 @@ for that version. * Tutorial:: MySQL Tutorial * MySQL Database Administration:: MySQL Database Administration * MySQL Optimisation:: MySQL Optimisation -* Reference:: MySQL language reference -* Table types:: MySQL table types -* Clients:: MySQL client tools and APIs +* Reference:: MySQL Language Reference +* Table types:: MySQL Table Types +* Clients:: MySQL Client Tools and APIs * Extending MySQL:: Extending MySQL * Problems:: Problems -* Contrib:: Contributed programs +* Contrib:: Contributed Programs * Credits:: Contributors to MySQL -* News:: MySQL change history -* Porting:: Comments on porting to other systems +* News:: MySQL Change History +* Porting:: Porting to Other Systems * Environment variables:: MySQL environment variables -* Regexp:: Description of MySQL regular expression syntax +* Regexp:: MySQL Regular Expression Syntax * GPL license:: GNU General Public License * LGPL license:: GNU Lesser General Public License -* Function Index:: SQL command, type and function index +* Function Index:: SQL Command, Type and Function Index * Concept Index:: Concept Index @end menu @@ -11453,7 +11453,7 @@ perl} indicates the command to use. @node Tutorial, MySQL Database Administration, Installing, Top -@chapter Introduction to MySQL: A MySQL Tutorial +@chapter Tutorial Introduction to MySQL @cindex tutorial @cindex terminal monitor, defined @@ -23430,7 +23430,7 @@ check @code{Slave_open_temp_tables} variable to see if it is 0, then issue with @code{SLAVE START} and see if you have better luck next time. There will be a cleaner solution, but it has to wait until version 4.0. -In earlier versions temporary tables are not being replicated properly - we +In earlier versions temporary tables are not replicated properly - we recommend that you either upgrade, or execute @code{SET SQL_LOG_BIN=0} on your clients before all queries with temp tables. @item @@ -23503,11 +23503,6 @@ and @code{FLUSH SLAVE} commands. In Version 3.23.26 we have renamed them to what they do. The old @code{FLUSH} variants still work, though, for compatibility. -@item -Starting in Version 3.23.21, you can use @code{LOAD TABLE FROM MASTER} for -network backup and to set up replication initially. We have recently -received a number of bug reports concerning it that we are investigating, so -we recommend that you use it only in testing until we make it more stable. @item Starting in Version 3.23.23, you can change masters and adjust log position with @code{CHANGE MASTER TO}. @@ -23521,6 +23516,39 @@ with a different name on the slave. @item Starting in Version 3.23.28, you can use @code{PURGE MASTER LOGS TO 'log-name'} to get rid of old logs while the slave is running. +@item +Due to the non-transactional nature of MyISAM tables, it is possible to have +a query that will only partially update a table and return an error code. This +can happen, for example, on a multi-row insert that has one row violating a +key constraint, or if a long update query is killed after updating some of the +rows. If that happens on the master, the slave thread will exit and wait for +the DBA to decide what to do about it unless the error code is legitimate and +the query execution results in the same error code. If this error code +validation behaviour is not desirable, some ( or all) errors could be masked +out with @code{slave-skip-errors} option starting in Version 3.23.47. +@item +While individual tables can be excluded from replication with +@code{replicate-do-table}/@code{replicate-ignore-table} or +@code{replicate-wild-do-table}/@code{replicate-wild-ignore-table}, there +are currently some design deficiencies that in some rather rare cases +produce unexpected results. The replication protocol does not inform the +slave explicitly which tables are going to be modified by the query - so +the slave has to parse the query to know this. To avoid redundant +parsing for queries that will end up actually being executed, table +exclusion is currently implemented by sending the query to the standard +MySQL parser, which will short-circuit the query and report success if +it detects that the table should be ignored. In addition to several +inefficiencies, this approach is also more bug prone, and there are two +known bugs as of Version 3.23.49 - because the parser automatically opens +the table when parsing some queries the ignored table has to exist on +the slave. The other bug is that if the ignored table gets partially +updated, the slave thread will not notice that the table actually should +have been ignored and will suspend the replication process. While the +above bugs are conceptually very simple to fix, we have not yet found a way +to do this without a sigficant code change that would compromize the stability +status of 3.23 branch. There exists a workaround for both if in the rare case +it happens to affect your application - use @code{slave-skip-errors}. + @end itemize @@ -45552,7 +45580,7 @@ return a big result row! @node Can not connect to server, Blocked host, Gone away, Common errors -@appendixsubsec @code{Can't connect to [local] MySQL server} error +@appendixsubsec @code{Can't connect to [local] MySQL server} Error A MySQL client on Unix can connect to the @code{mysqld} server in two different ways: Unix sockets, which connect through a file in the file @@ -46636,7 +46664,7 @@ the original table. @node Problems with mysql.sock, Timezone problems, Temporary files, Administration Issues -@appendixsubsec How to Protect or change the MySQL socket file @file{/tmp/mysql.sock} +@appendixsubsec How to Protect or Change the MySQL Socket File @file{/tmp/mysql.sock} @cindex @code{mysql.sock}, protection @cindex deletion, @code{mysql.sock} @@ -47011,7 +47039,7 @@ Post the test file using @code{mysqlbug} to @email{mysql@@lists.mysql.com}. @end enumerate @node Problems with float, , No matching rows, Query Issues -@appendixsubsec Problems with floating point comparison +@appendixsubsec Problems with Floating Point Comparison Floating point numbers cause confusion sometimes, because these numbers are not stored as exact values inside computer architecture. What one @@ -48590,7 +48618,7 @@ Development on the embedded @code{mysqld} version. @node News, Porting, Credits, Top -@appendix MySQL change history +@appendix MySQL Change History @cindex ChangeLog @cindex changes, log @@ -54666,7 +54694,7 @@ Fixed @code{DISTINCT} with calculated columns. @node Porting, Environment variables, News, Top -@appendix Comments on Porting to Other Systems +@appendix Porting to Other Systems @cindex porting, to other systems @@ -54746,8 +54774,8 @@ will ensure that your thread installation has even a remote chance to work! @menu * Debugging server:: Debugging a MySQL server * Debugging client:: Debugging a MySQL client -* The DBUG package:: The DBUG package -* Locking methods:: Locking methods +* The DBUG package:: The DBUG Package +* Locking methods:: Locking ethods * RTS-threads:: Comments about RTS threads * Thread packages:: Differences between different thread packages @end menu @@ -54802,7 +54830,7 @@ problems that may be unique to your environment. @node Compiling for debugging, Making trace files, Debugging server, Debugging server -@appendixsubsec Compiling MYSQL for debugging +@appendixsubsec Compiling MYSQL for Debugging If you have some very specific problem, you can always try to debug MySQL. To do this you must configure MySQL with the @@ -54856,7 +54884,7 @@ default compiled with support for trace files. @node Making trace files, Using gdb on mysqld, Compiling for debugging, Debugging server -@appendixsubsec Creating trace files +@appendixsubsec Creating Trace Files If the @code{mysqld} server doesn't start or if you can cause the @code{mysqld} server to crash quickly, you can try to create a trace @@ -54990,7 +55018,7 @@ setting the @code{DBI_TRACE} environment variable. @node Using stack trace, Using log files, Using gdb on mysqld, Debugging server -@appendixsubsec Using a stack trace +@appendixsubsec Using a Stack Trace On some operating systems, the error log will contain a stack trace if @code{mysqld} dies unexpectedly. You can use this to find out where (and @@ -55059,7 +55087,7 @@ repeat the problem! @xref{Bug reports}. @node Using log files, Reproduceable test case, Using stack trace, Debugging server -@appendixsubsec Using log files to find cause of errors in mysqld +@appendixsubsec Using Log Files to Find Cause of Errors in mysqld Note that before starting @code{mysqld} with @code{--log} you should check all your tables with @code{myisamchk}. @@ -55110,7 +55138,7 @@ messages but instead try to find out why @code{mysqld} died. @node Reproduceable test case, , Using log files, Debugging server -@appendixsubsec Making a test case when you experience table corruption +@appendixsubsec Making a Test Case When You Experience Table Corruption If you get corrupted tables or if @code{mysqld} always fails after some update commands, you can test if this bug is reproducible by doing the @@ -55199,7 +55227,7 @@ MySQL installation with new MySQL library. @node The DBUG package, Locking methods, Debugging client, Porting -@appendixsec The DBUG package. +@appendixsec The DBUG Package @cindex DBUG package @@ -55622,7 +55650,7 @@ variables to modify the behavior of MySQL. @xref{Option files}. @node Regexp, GPL license, Environment variables, Top -@appendix Description of MySQL regular expression syntax +@appendix MySQL Regular Expression Syntax @cindex regex @cindex regular expression syntax, described @@ -56213,8 +56241,10 @@ Public License instead of this License. @node LGPL license, Function Index, GPL license, Top @appendix GNU LESSER GENERAL PUBLIC LICENSE -@cindex LGPL, Lesser General Public License +@cindex LGPL, Library General Public License @cindex LGPL, GNU Library General Public License +@cindex LGPL, Lesser General Public License +@cindex LGPL, GNU Lesser General Public License @center Version 2.1, February 1999 diff --git a/heap/hp_rnext.c b/heap/hp_rnext.c index 4e5cb7e37c2..7a6b6846169 100644 --- a/heap/hp_rnext.c +++ b/heap/hp_rnext.c @@ -23,6 +23,12 @@ int heap_rnext(HP_INFO *info, byte *record) byte *pos; HP_SHARE *share=info->s; DBUG_ENTER("heap_rnext"); + + if (!(info->s->records)) + { + my_errno=HA_ERR_END_OF_FILE; + DBUG_RETURN(my_errno); + } if (info->lastinx < 0) DBUG_RETURN(my_errno=HA_ERR_WRONG_INDEX); diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index 68e383e9ce6..a017cf5a97e 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -730,6 +730,7 @@ start_master() --server-id=1 \ --basedir=$MY_BASEDIR \ --port=$MASTER_MYPORT \ + --local-infile \ --exit-info=256 \ --core \ --datadir=$MASTER_MYDDIR \ @@ -749,6 +750,7 @@ start_master() --server-id=1 --rpl-recovery-rank=1 \ --basedir=$MY_BASEDIR --init-rpl-role=master \ --port=$MASTER_MYPORT \ + --local-infile \ --datadir=$MASTER_MYDDIR \ --pid-file=$MASTER_MYPID \ --socket=$MASTER_MYSOCK \ diff --git a/mysql-test/r/select_found.result b/mysql-test/r/select_found.result index 3a84c3e52da..0e2cc108bb4 100644 --- a/mysql-test/r/select_found.result +++ b/mysql-test/r/select_found.result @@ -20,6 +20,12 @@ a b select found_rows(); FOUND_ROWS() 8 +select SQL_BUFFER_RESULT SQL_CALC_FOUND_ROWS * from t1 limit 1; +a b +1 2 +select found_rows(); +FOUND_ROWS() +8 select SQL_CALC_FOUND_ROWS * from t1 order by b desc limit 1; a b 8 9 diff --git a/mysql-test/t/select_found.test b/mysql-test/t/select_found.test index 9b14ab1fcf0..d6b6284a88b 100644 --- a/mysql-test/t/select_found.test +++ b/mysql-test/t/select_found.test @@ -9,6 +9,8 @@ select SQL_CALC_FOUND_ROWS * from t1; select found_rows(); select SQL_CALC_FOUND_ROWS * from t1 limit 1; select found_rows(); +select SQL_BUFFER_RESULT SQL_CALC_FOUND_ROWS * from t1 limit 1; +select found_rows(); select SQL_CALC_FOUND_ROWS * from t1 order by b desc limit 1; select found_rows(); select SQL_CALC_FOUND_ROWS distinct b from t1 limit 1; diff --git a/scripts/mysqld_multi.sh b/scripts/mysqld_multi.sh index 656894f0e37..83d12239472 100644 --- a/scripts/mysqld_multi.sh +++ b/scripts/mysqld_multi.sh @@ -4,7 +4,7 @@ use Getopt::Long; use POSIX qw(strftime); $|=1; -$VER="2.2"; +$VER="2.3"; $opt_config_file = undef(); $opt_example = 0; @@ -183,7 +183,7 @@ sub report_mysqlds sub start_mysqlds() { - my (@groups, $com, $i, @options, $j); + my (@groups, $com, $tmp, $i, @options, $j); if (!$opt_no_log) { @@ -202,11 +202,20 @@ sub start_mysqlds() @options = `$com`; chop @options; - $com = "$mysqld"; - for ($j = 0; defined($options[$j]); $j++) + $com= "$mysqld"; + for ($j = 0, $tmp= ""; defined($options[$j]); $j++) { - $com.= " $options[$j]"; + if ("--mysqld=" eq substr($options[$j], 0, 9)) + { + $options[$j]=~ s/\-\-mysqld\=//; + $com= $options[$j]; + } + else + { + $tmp.= " $options[$j]"; + } } + $com.= $tmp; $com.= " >> $opt_log 2>&1" if (!$opt_no_log); $com.= " &"; system($com); @@ -595,6 +604,11 @@ Options: to this option also. The options are passed to mysqld. Just make sure you have mysqld in your PATH or fix mysqld_safe. Using: $mysqld + Please note: Since mysqld_multi version 2.3 you can also + give this option in groups [mysqld#]! This will be + recognized as a special option and will not be passed + to the mysqld. This will allow one to start different + mysqld versions with mysqld_multi. --no-log Print to stdout instead of the log file. By default the log file is turned on. --password=... Password for user for mysqladmin. diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 2808212f039..284f6304e07 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -187,7 +187,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, TABLE *tmp_table; int error, tmp_error; bool need_tmp,hidden_group_fields; - bool simple_order,simple_group,no_order, skip_sort_order; + bool simple_order,simple_group,no_order, skip_sort_order, buffer_result; Item::cond_result cond_value; SQL_SELECT *select; DYNAMIC_ARRAY keyuse; @@ -201,6 +201,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, /* Check that all tables, fields, conds and order are ok */ select_distinct=test(select_options & SELECT_DISTINCT); + buffer_result=test(select_options & OPTION_BUFFER_RESULT) && !test(select_options & OPTION_FOUND_ROWS); tmp_table=0; select=0; no_order=skip_sort_order=0; @@ -546,8 +547,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, need_tmp= (join.const_tables != join.tables && ((select_distinct || !simple_order || !simple_group) || - (group && order) || - test(select_options & OPTION_BUFFER_RESULT))); + (group && order) || buffer_result)); // No cache for MATCH make_join_readinfo(&join,