From 63a9d20c146c0d8b4d38627b1391430c08b9f2f4 Mon Sep 17 00:00:00 2001 From: "jani@janikt.pp.saunalahti.fi" <> Date: Wed, 23 May 2001 00:00:42 +0300 Subject: [PATCH 1/8] Added a link. --- BitKeeper/etc/logging_ok | 7 +------ Docs/manual.texi | 5 +++++ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index ee67cbe13b6..fb534622f9b 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -1,6 +1 @@ -mwagner@evoq.mwagner.org -tim@threads.polyesthetic.msg -tim@work.mysql.com -heikki@donna.mysql.fi -paul@central.snake.net -monty@donna.mysql.fi +jani@janikt.pp.saunalahti.fi diff --git a/Docs/manual.texi b/Docs/manual.texi index 92173dbddf6..050b731e0d1 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -43380,6 +43380,11 @@ these tables directly without ODBC-driver. Windows GUI (binary only) to administrate a database, by David B. Mansel, @email{david@@zhadum.org}. + +@item @uref{http://members.xoom.com/_opex_/mysqlmanager/index.html, MySQL Manager} +a graphical MySQL server manager for MySQL server written in Java, for Windows + + @item @uref{http://www.mysql.com/Downloads/Win32/netadmin.zip, netadmin.zip} An administrator tool for @strong{MySQL} on Windows 95/98 and Windows NT 4.0. Only tested with @strong{MySQL} Versions 3.23.5 - 3.23.7. Written From a6215da1cd4d71d8bf87b1fea6f05eee5e943e71 Mon Sep 17 00:00:00 2001 From: "monty@donna.mysql.fi" <> Date: Wed, 23 May 2001 00:15:16 +0300 Subject: [PATCH 2/8] Update of the mysqltest section --- Docs/manual.texi | 131 +++++++++++++++++++++++++++++++---------------- 1 file changed, 86 insertions(+), 45 deletions(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index 5b9315258e2..e8192c8a8c3 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -538,7 +538,7 @@ InnoDB Tables * InnoDB overview:: InnoDB tables overview * InnoDB start:: InnoDB startup options -* Creating an InnoDB database:: Creating an InnoDB database. Creating an InnoDB database. Creating an InnoDB database. Creating an InnoDB database. Creating an InnoDB database. Creating an InnoDB database. Creating an InnoDB database. +* InnoDB init:: Creating InnoDB table space. * Using InnoDB tables:: Creating InnoDB tables * Adding and removing:: Adding and removing InnoDB data and log files * Backing up:: Backing up and recovering an InnoDB database @@ -551,7 +551,7 @@ InnoDB Tables * InnoDB restrictions:: Some restrictions on InnoDB tables * InnoDB contact information:: InnoDB contact information. -Creating an InnoDB database +Creating InnoDB table space * Error createing InnoDB:: @@ -940,6 +940,12 @@ MySQL Internals * MySQL threads:: MySQL threads * MySQL test suite:: MySQL test suite +MySQL Test Suite + +* running mysqltest:: +* extending mysqltest:: +* Reporting mysqltest bugs:: + Credits * Developers:: @@ -24624,7 +24630,7 @@ NuSphere is working on removing these limitations. @menu * InnoDB overview:: InnoDB tables overview * InnoDB start:: InnoDB startup options -* Creating an InnoDB database:: Creating an InnoDB database. Creating an InnoDB database. Creating an InnoDB database. Creating an InnoDB database. Creating an InnoDB database. Creating an InnoDB database. Creating an InnoDB database. +* InnoDB init:: Creating InnoDB table space. * Using InnoDB tables:: Creating InnoDB tables * Adding and removing:: Adding and removing InnoDB data and log files * Backing up:: Backing up and recovering an InnoDB database @@ -24679,7 +24685,7 @@ may consist of several files. This is different from, for example, InnoDB is distributed under the GNU GPL License Version 2 (of June 1991). In the source distribution of @strong{MySQL}, InnoDB appears as a subdirectory. -@node InnoDB start, Creating an InnoDB database, InnoDB overview, InnoDB +@node InnoDB start, InnoDB init, InnoDB overview, InnoDB @subsection InnoDB startup options Beginning from @strong{MySQL}-3.23.37 the prefix of the options is changed @@ -24820,8 +24826,8 @@ InnoDB cannot notice. In cases like this the timeout is useful to resolve the situation. @end multitable -@node Creating an InnoDB database, Using InnoDB tables, InnoDB start, InnoDB -@subsection Creating an InnoDB database +@node InnoDB init, Using InnoDB tables, InnoDB start, InnoDB +@subsection Creating InnoDB table space Suppose you have installed @strong{MySQL} and have edited @file{my.cnf} so that it contains the necessary InnoDB configuration parameters. @@ -24885,7 +24891,7 @@ mysqld: ready for connections * Error createing InnoDB:: @end menu -@node Error createing InnoDB, , Creating an InnoDB database, Creating an InnoDB database +@node Error createing InnoDB, , InnoDB init, InnoDB init @subsubsection If something goes wrong in database creation If something goes wrong in an InnoDB database creation, you should @@ -24895,7 +24901,7 @@ create some InnoDB tables, delete also the corresponding @file{.frm} files for these tables from the @strong{MySQL} database directories. Then you can try the InnoDB database creation again. -@node Using InnoDB tables, Adding and removing, Creating an InnoDB database, InnoDB +@node Using InnoDB tables, Adding and removing, InnoDB init, InnoDB @subsection Creating InnoDB tables Suppose you have started the @strong{MySQL} client with the command @@ -42364,16 +42370,35 @@ as well developers, to do regression tests on the @strong{MySQL} code. To address this problem, we have created a new test system that is included in the source and binary distributions starting in Version 3.23.29. -The test system consist of a test language interpreter (@code{mysqltest}), -a shell script to run all tests(@code{mysql-test-run}), the actual test cases -written in a special test language, and their expected results. To run the -test suite on your system after a build, type @code{mysql-test/mysql-test-run} -from the source root. If you have installed a binary distribution, @code{cd} -to the install root (eg. @code{/usr/local/mysql}), and do -@code{scripts/mysql-test-run}. All tests should succeed. If they do not, -use @code{mysqlbug} to send a bug report to @email{bugs@@lists.mysql.com}. -Make sure to include the output of @code{mysql-test-run}, as well as -contents of all @code{.reject} files in @code{mysql-test/r} directory. +The current set of test cases doesn't test everything in MySQL but, it +should catch most obvious bugs in the SQL processing code, OS/library +issues, and is quite thorough in testing replication. Our eventual goal +is to have the tests cover 100% of the code. We welcome contributions +to our test suite. You may especially want to contribute tests that +examine the functionality critical to your system, as this will ensure +that all future @strong{MySQL} releases will work well with your +applications. + +@menu +* running mysqltest:: +* extending mysqltest:: +* Reporting mysqltest bugs:: +@end menu + +@node running mysqltest, extending mysqltest, MySQL test suite, MySQL test suite +@subsection Running the MySQL Test Suite + +The test system consist of a test language interpreter +(@code{mysqltest}), a shell script to run all +tests(@code{mysql-test-run}), the actual test cases written in a special +test language, and their expected results. To run the test suite on +your system after a build, type @code{make test} or +@code{mysql-test/mysql-test-run} from the source root. If you have +installed a binary distribution, @code{cd} to the install root +(eg. @code{/usr/local/mysql}), and do @code{scripts/mysql-test-run}. +All tests should succeed. If not, you should try to find out why and +report the problem if this is a bug in @strong{MySQL}. +@xref{Reporting mysqltest bugs}. If you have a copy of @code{mysqld} running on the machine where you want to run the test suite you do not have to stop it, as long as it is not using @@ -42381,14 +42406,14 @@ ports @code{9306} and @code{9307}. If one of those ports is taken, you should edit @code{mysql-test-run} and change the values of the master and/or slave port to one that is available. -The current set of test cases is far from comprehensive, as we have not yet -converted all of our private tests to the new format. However, it should -already catch most obvious bugs in the SQL processing code, OS/library issues, -and is quite thorough in testing replication. Our eventual goal is to have -the tests cover 100% of the code. We welcome contributions to our test suite. -You may especially want to contribute tests that examine the functionality -critical to your system, as this will ensure that all future @strong{MySQL} -releases will work well with your applications. +You can run one individual test case with +@code{mysql-test/mysql-test-run test_name}. + +If one test fails, you should test running @code{mysql-test-run} with +the @code{--force} option to check if any other tests fails. + +@node extending mysqltest, Reporting mysqltest bugs, running mysqltest, MySQL test suite +@subsection Extending the MySQL Test Suite You can use the @code{mysqltest} language to write your own test cases. Unfortunately, we have not yet written full documentation for it - we plan to @@ -42396,15 +42421,9 @@ do this shortly. You can, however, look at our current test cases and use them as an example. The following points should help you get started: @itemize - @item The tests are located in @code{mysql-test/t/*.test} -@item -You can run one individual test case with -@code{mysql-test/mysql-test-run test_name} -removing @code{.test} extension from the file name - @item A test case consists of @code{;} terminated statements and is similar to the input of @code{mysql} command line client. A statement by default is a query @@ -42433,15 +42452,9 @@ test produces more than one result, you should use @code{test_name.a.result}, @code{test_name.b.result}, etc. @item -Failed test results are put in a file with the same base name as the -result file with the @code{.reject} extension. If your test case is -failing, you should do a diff on the two files. If you cannot see how -they are different, examine both with @code{od -c} and also check their -lengths. - -@item -You can prefix a query with @code{!} if the test can continue after that query -returns an error. +If a statement returns an error, you should on the line before the statement +specify with the @code{--error error-number}. The error number can be +a list of possible error numbers separated with @code{','}. @item If you are writing a replication test case, you should on the first line of @@ -42480,6 +42493,9 @@ attachments, you should ftp all the relevant files to: @end itemize +@node Reporting mysqltest bugs, , extending mysqltest, MySQL test suite +@subsection Extending the MySQL Test Suite + If your @strong{MySQL} version doesn't pass the test suite you should do the following: @@ -42489,6 +42505,26 @@ Don't send a bug report before you have found out as much as possible of what when wrong! When you do it, please use the @code{mysqlbug} script so that we can get information about your system and @code{MySQL} version. @xref{Bug reports}. +@item +Make sure to include the output of @code{mysql-test-run}, as well as +contents of all @code{.reject} files in @code{mysql-test/r} directory. +@item +If a test in the test suite fails, check if the test fails also when run +by its own: + +@example +cd mysql-test +mysql-test-run --local test-name +@end example + +If this fails, then you should configure @strong{MySQL} with +@code{--with-debug} and run @code{mysql-test-run} with the +@code{--debug} option. If this also fails send the trace file +@file{var/tmp/master.trace} to ftp://support.mysql.com/pub/mysql/secret +so that we can examine it. Please remember to also include a full +description of your system, the version of the mysqld binary and how you +compiled it. + @item If you have compiled @strong{MySQL} yourself, check our manual for how to compile @strong{MySQL} on your platform or, preferable, use one of @@ -42501,9 +42537,13 @@ If you get an error, like @code{Result length mismatch} or @code{Result content mismatch} it means that the output of the test didn't match exactly the expected output. This could be a bug in @strong{MySQL} or that your mysqld version produces slight different results under some -circumstances. In this case you should compare the @code{.test} -and @code{.reject} file in the @code{mysql-test/r} sub directory to -see if this is something to worry about. +circumstances. + +Failed test results are put in a file with the same base name as the +result file with the @code{.reject} extension. If your test case is +failing, you should do a diff on the two files. If you cannot see how +they are different, examine both with @code{od -c} and also check their +lengths. @item If a test fails totally, you should check the logs file in the @@ -42511,7 +42551,8 @@ If a test fails totally, you should check the logs file in the @item If you have compiled @strong{MySQL} with debugging you can try to debug this -with the @code{--gdb} and @code{--debug} options to @code{mysql-test-run}. +by running @code{mysql-test-run} with the @code{--gdb} and/or @code{--debug} +options. @xref{Making trace files}. If you have not compiled @strong{MySQL} for debugging you should probably From 684082ce79f78d43b7ade6236c8abbe5abd79ce4 Mon Sep 17 00:00:00 2001 From: "monty@tik.mysql.fi" <> Date: Wed, 23 May 2001 02:30:17 +0300 Subject: [PATCH 3/8] Updated documentation of how to add new native functions. Small cleanups --- BitKeeper/etc/logging_ok | 7 +--- Docs/manual.texi | 59 ++++++++++++++++++++++++---------- mysql-test/r/func_crypt.result | 4 +-- mysql-test/t/func_crypt.test | 3 +- mysys/thr_lock.c | 10 +++--- 5 files changed, 52 insertions(+), 31 deletions(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index ee67cbe13b6..01a1261eae5 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -1,6 +1 @@ -mwagner@evoq.mwagner.org -tim@threads.polyesthetic.msg -tim@work.mysql.com -heikki@donna.mysql.fi -paul@central.snake.net -monty@donna.mysql.fi +monty@tik.mysql.fi diff --git a/Docs/manual.texi b/Docs/manual.texi index 5b9315258e2..4fc82f66ea9 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -10361,7 +10361,7 @@ feature). Ignore the @code{delay_key_write} option for all tables. @xref{Server parameters}. -@item -Sg, --skip-grant-tables +@item --skip-grant-tables This option causes the server not to use the privilege system at all. This gives everyone @emph{full access} to all databases! (You can tell a running server to start using the grant tables again by executing @code{mysqladmin @@ -35307,12 +35307,20 @@ To add a new native @strong{MySQL} function, follow these steps: Add one line to @file{lex.h} that defines the function name in the @code{sql_functions[]} array. @item -Add two lines to @file{sql_yacc.yy}. One indicates the preprocessor -symbol that @code{yacc} should define (this should be added at the -beginning of the file). Then define the function parameters and add an -``item'' with these parameters to the @code{simple_expr} parsing rule. -For an example, check all occurrences of @code{SOUNDEX} in -@file{sql_yacc.yy} to see how this is done. +If the function prototype is simple (just takes zero, one, two or three +arguments), you should in lex.h specify SYM(FUNC_ARG#) (where # is the +number of arguments) as the second argument in the +@code{sql_functions[]} array and add a function that creates a function +object in @file{item_create.cc}. Take a look at @code{"ABS"} and +@code{create_funcs_abs()} for an example of this. + +If the function prototype is complicated (for example takes a variable number +of arguments), you should add two lines to @file{sql_yacc.yy}. One +indicates the preprocessor symbol that @code{yacc} should define (this +should be added at the beginning of the file). Then define the function +parameters and add an ``item'' with these parameters to the +@code{simple_expr} parsing rule. For an example, check all occurrences +of @code{ATAN} in @file{sql_yacc.yy} to see how this is done. @item In @file{item_func.h}, declare a class inheriting from @code{Item_num_func} or @code{Item_str_func}, depending on whether your function returns a number or a @@ -35325,28 +35333,45 @@ double Item_func_newname::val() longlong Item_func_newname::val_int() String *Item_func_newname::Str(String *str) @end example + +If you inherit your object from any of the standard items (like +@code{Item_num_func} you probably only have to define one of the above +functions and let the parent object take care of the other functions. +For example, the @code{Item_str_func} class defines a @code{val()} function +that executes @code{atof()} on the value returned by @code{::str()}. + @item -You should probably also define the following function: +You should probably also define the following object function: @example void Item_func_newname::fix_length_and_dec() @end example This function should at least calculate @code{max_length} based on the given arguments. @code{max_length} is the maximum number of characters -the function may return. This function should also set @code{maybe_null = 0} -if the main function can't return a @code{NULL} value. The function can check -if any of the function arguments can return @code{NULL} by checking the -arguments @code{maybe_null} variable. +the function may return. This function should also set @code{maybe_null += 0} if the main function can't return a @code{NULL} value. The +function can check if any of the function arguments can return +@code{NULL} by checking the arguments @code{maybe_null} variable. You +can take a look at @code{Item_func_mod::fix_length_and_dec} for a +typical example of how to do this. @end enumerate -All functions must be thread safe. +All functions must be thread safe (In other words, don't use any global or +static variables in the functions without protecting them with mutexes). + +If you want to return @code{NULL}, from @code{::val()}, @code{::val_int()} +or @code{::str()} you should set @code{null_value} to 1 and return 0. + +For @code{::str()} object functions, there are some additional +considerations to be aware of: -For string functions, there are some additional considerations to be aware of: @itemize @bullet @item -The @code{String *str} argument provides a string -buffer that may be used to hold the result. +The @code{String *str} argument provides a string buffer that may be +used to hold the result. (For more information about the @code{String} type, +take a look at the @file{sql_string.h} file.) @item -The function should return the string that holds the result. +The @code{::str()} function should return the string that holds the result or +@code{(char*) 0} if the result is @code{NULL}. @item All current string functions try to avoid allocating any memory unless absolutely necessary! diff --git a/mysql-test/r/func_crypt.result b/mysql-test/r/func_crypt.result index 7e0f5f7981d..021989add8d 100644 --- a/mysql-test/r/func_crypt.result +++ b/mysql-test/r/func_crypt.result @@ -1,2 +1,2 @@ -encrypt('foo', 'ff') -ffTU0fyIP09Z. +length(encrypt('foo', 'ff')) <> 0 +1 diff --git a/mysql-test/t/func_crypt.test b/mysql-test/t/func_crypt.test index 4a499f3d5b7..ddc0816e301 100644 --- a/mysql-test/t/func_crypt.test +++ b/mysql-test/t/func_crypt.test @@ -1 +1,2 @@ -select encrypt('foo', 'ff'); + +select length(encrypt('foo', 'ff')) <> 0; diff --git a/mysys/thr_lock.c b/mysys/thr_lock.c index 74548b7fa12..7c92a7fa5fa 100644 --- a/mysys/thr_lock.c +++ b/mysys/thr_lock.c @@ -449,7 +449,7 @@ int thr_lock(THR_LOCK_DATA *data,enum thr_lock_type lock_type) check_locks(lock,"read lock with old write lock",0); if (lock->get_status) (*lock->get_status)(data->status_param); - ++locks_immediate; + statistic_increment(locks_immediate,&THR_LOCK_lock); goto end; } if (lock->write.data->type == TL_WRITE_ONLY) @@ -473,7 +473,7 @@ int thr_lock(THR_LOCK_DATA *data,enum thr_lock_type lock_type) if ((int) lock_type == (int) TL_READ_NO_INSERT) lock->read_no_write_count++; check_locks(lock,"read lock with no write locks",0); - ++locks_immediate; + statistic_increment(locks_immediate,&THR_LOCK_lock); goto end; } /* Can't get lock yet; Wait for it */ @@ -505,7 +505,7 @@ int thr_lock(THR_LOCK_DATA *data,enum thr_lock_type lock_type) data->cond=get_cond(); if (lock->get_status) (*lock->get_status)(data->status_param); - ++locks_immediate; + statistic_increment(locks_immediate,&THR_LOCK_lock); goto end; } } @@ -540,7 +540,7 @@ int thr_lock(THR_LOCK_DATA *data,enum thr_lock_type lock_type) check_locks(lock,"second write lock",0); if (data->lock->get_status) (*data->lock->get_status)(data->status_param); - ++locks_immediate; + statistic_increment(locks_immediate,&THR_LOCK_lock); goto end; } DBUG_PRINT("lock",("write locked by thread: %ld", @@ -566,7 +566,7 @@ int thr_lock(THR_LOCK_DATA *data,enum thr_lock_type lock_type) if (data->lock->get_status) (*data->lock->get_status)(data->status_param); check_locks(lock,"only write lock",0); - ++locks_immediate; + statistic_increment(locks_immediate,&THR_LOCK_lock); goto end; } } From b40410bca3ee1cbcc3a375460a991fee44426e95 Mon Sep 17 00:00:00 2001 From: "monty@donna.mysql.fi" <> Date: Wed, 23 May 2001 02:40:23 +0300 Subject: [PATCH 4/8] Fixed test case to work with the new auto_increment handling in InnoDB --- mysql-test/r/innodb.result | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/innodb.result b/mysql-test/r/innodb.result index f030b7fa763..d21863e7231 100644 --- a/mysql-test/r/innodb.result +++ b/mysql-test/r/innodb.result @@ -252,7 +252,7 @@ id ggid email passwd 2 test2 yyy id ggid email passwd 1 this will work -3 test2 this will work +4 test2 this will work id ggid email passwd 1 this will work id ggid email passwd @@ -474,4 +474,4 @@ t1 CREATE TABLE `t1` ( a 1 2 -3 +4 From 86eda127f780401ecd9d51e23f01ee984e1a5cf5 Mon Sep 17 00:00:00 2001 From: "monty@donna.mysql.fi" <> Date: Wed, 23 May 2001 02:40:24 +0300 Subject: [PATCH 5/8] Remove wrong access check for locks. Fixed problem with fuzzy dates. --- Docs/manual.texi | 3 +++ mysql-test/r/func_time.result | 4 ++++ mysql-test/t/func_time.test | 2 ++ sql/item.cc | 2 +- sql/sql_parse.cc | 9 --------- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index 93d4f1c377d..da569c67dd1 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -44538,6 +44538,9 @@ not yet 100% confident in this code. @appendixsubsec Changes in release 3.23.39 @itemize @bullet @item +Fixed that date-part extract functions works with dates where day +and/or month is 0. +@item Extended argument length in option files from 256 to 512 chars. @item Fixed problem with shutdown when @code{INSERT DELAYED} was waiting for diff --git a/mysql-test/r/func_time.result b/mysql-test/r/func_time.result index a24dc044a9a..fd7c6897574 100644 --- a/mysql-test/r/func_time.result +++ b/mysql-test/r/func_time.result @@ -20,6 +20,8 @@ dayofmonth("1997-01-02") dayofmonth(19970323) 2 23 month("1997-01-02") year("98-02-03") dayofyear("1997-12-31") 1 1998 365 +month("2001-02-00") year("2001-00-00") +2 2001 DAYOFYEAR("1997-03-03") WEEK("1998-03-03") QUARTER(980303) 62 9 1 HOUR("1997-03-03 23:03:22") MINUTE("23:03:22") SECOND(230322) @@ -184,6 +186,8 @@ extract(MINUTE_SECOND FROM "10:11:12") 1112 extract(SECOND FROM "1999-01-02 10:11:12") 12 +extract(MONTH FROM "2001-02-00") +2 ctime hour(ctime) 2001-01-12 12:23:40 12 monthname(date) diff --git a/mysql-test/t/func_time.test b/mysql-test/t/func_time.test index 062cbea9f84..a91844ab986 100644 --- a/mysql-test/t/func_time.test +++ b/mysql-test/t/func_time.test @@ -14,6 +14,7 @@ select date_format("1997-01-02 03:04:05", "%M %W %D %Y %y %m %d %h %i %s %w"); select date_format("1997-01-02", concat("%M %W %D ","%Y %y %m %d %h %i %s %w")); select dayofmonth("1997-01-02"),dayofmonth(19970323); select month("1997-01-02"),year("98-02-03"),dayofyear("1997-12-31"); +select month("2001-02-00"),year("2001-00-00"); select DAYOFYEAR("1997-03-03"), WEEK("1998-03-03"), QUARTER(980303); select HOUR("1997-03-03 23:03:22"), MINUTE("23:03:22"), SECOND(230322); select week(19980101),week(19970101),week(19980101,1),week(19970101,1); @@ -100,6 +101,7 @@ select extract(HOUR_SECOND FROM "10:11:12"); select extract(MINUTE FROM "10:11:12"); select extract(MINUTE_SECOND FROM "10:11:12"); select extract(SECOND FROM "1999-01-02 10:11:12"); +select extract(MONTH FROM "2001-02-00"); create table t1 (ctime varchar(20)); insert into t1 values ('2001-01-12 12:23:40'); diff --git a/sql/item.cc b/sql/item.cc index 10d1c6d0560..b268c5eb928 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -75,7 +75,7 @@ bool Item::get_date(TIME *ltime,bool fuzzydate) char buff[40]; String tmp(buff,sizeof(buff)),*res; if (!(res=val_str(&tmp)) || - str_to_TIME(res->ptr(),res->length(),ltime,0) == TIMESTAMP_NONE) + str_to_TIME(res->ptr(),res->length(),ltime,fuzzydate) == TIMESTAMP_NONE) { bzero((char*) ltime,sizeof(*ltime)); return 1; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index e420918e06d..7a94dc32997 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1851,15 +1851,6 @@ mysql_execute_command(void) } if (check_db_used(thd,tables) || end_active_trans(thd)) goto error; - for (TABLE_LIST *tmp = tables; tmp; tmp = tmp->next) - { - if (!(tmp->lock_type == TL_READ_NO_INSERT ? - !check_table_access(thd, SELECT_ACL, tmp) : - (!check_table_access(thd, INSERT_ACL, tmp) || - !check_table_access(thd, UPDATE_ACL, tmp) || - !check_table_access(thd, DELETE_ACL, tmp)))) - goto error; - } thd->in_lock_tables=1; if (!(res=open_and_lock_tables(thd,tables))) { From 587df0036ac74147c62a8190b6ad523ec51f3670 Mon Sep 17 00:00:00 2001 From: "heikki@donna.mysql.fi" <> Date: Wed, 23 May 2001 18:04:49 +0300 Subject: [PATCH 6/8] srv0srv.h One can now specify innodb_unix_file_flush_method in my.cnf srv0srv.c One can now specify innodb_unix_file_flush_method in my.cnf srv0start.c One can now specify innodb_unix_file_flush_method in my.cnf ha_innobase.cc One can now specify innodb_unix_file_flush_method in my.cnf ha_innobase.h One can now specify innodb_unix_file_flush_method in my.cnf mysqld.cc One can now specify innodb_unix_file_flush_method in my.cnf --- BitKeeper/etc/logging_ok | 1 + innobase/include/srv0srv.h | 10 ++++++++++ innobase/srv/srv0srv.c | 3 +++ innobase/srv/srv0start.c | 18 ++++++++++++++++++ sql/ha_innobase.cc | 5 +++++ sql/ha_innobase.h | 1 + sql/mysqld.cc | 7 +++++++ 7 files changed, 45 insertions(+) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index b6a17f4bda9..11b5f930d29 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -1,3 +1,4 @@ jani@janikt.pp.saunalahti.fi monty@tik.mysql.fi monty@donna.mysql.fi +heikki@donna.mysql.fi diff --git a/innobase/include/srv0srv.h b/innobase/include/srv0srv.h index 8853745926d..26164e2ccdc 100644 --- a/innobase/include/srv0srv.h +++ b/innobase/include/srv0srv.h @@ -48,6 +48,9 @@ extern dulint srv_archive_recovery_limit_lsn; extern ulint srv_lock_wait_timeout; +extern char* srv_unix_file_flush_method_str; +extern ulint srv_unix_file_flush_method; + extern ibool srv_set_thread_priorities; extern int srv_query_thread_priority; @@ -100,6 +103,13 @@ typedef struct srv_sys_struct srv_sys_t; /* The server system */ extern srv_sys_t* srv_sys; +/* Alternatives for fiel flush option in Unix; see the InnoDB manual about +what these mean */ +#define SRV_UNIX_FDATASYNC 1 +#define SRV_UNIX_O_DSYNC 2 +#define SRV_UNIX_LITTLESYNC 3 +#define SRV_UNIX_NOSYNC 4 + /************************************************************************* Boots Innobase server. */ diff --git a/innobase/srv/srv0srv.c b/innobase/srv/srv0srv.c index df36ec446a3..186ed1b8d56 100644 --- a/innobase/srv/srv0srv.c +++ b/innobase/srv/srv0srv.c @@ -88,6 +88,9 @@ dulint srv_archive_recovery_limit_lsn; ulint srv_lock_wait_timeout = 1024 * 1024 * 1024; +char* srv_unix_file_flush_method_str = NULL; +ulint srv_unix_file_flush_method = 0; + ibool srv_set_thread_priorities = TRUE; int srv_query_thread_priority = 0; /*-------------------------------------------*/ diff --git a/innobase/srv/srv0start.c b/innobase/srv/srv0start.c index 9e10cca7200..105d6e11623 100644 --- a/innobase/srv/srv0start.c +++ b/innobase/srv/srv0start.c @@ -532,6 +532,24 @@ innobase_start_or_create_for_mysql(void) srv_is_being_started = TRUE; + if (0 == ut_strcmp(srv_unix_file_flush_method_str, "fdatasync")) { + srv_unix_file_flush_method = SRV_UNIX_FDATASYNC; + } else if (0 == ut_strcmp(srv_unix_file_flush_method_str, "O_DSYNC")) { + srv_unix_file_flush_method = SRV_UNIX_O_DSYNC; + } else if (0 == ut_strcmp(srv_unix_file_flush_method_str, + "littlesync")) { + srv_unix_file_flush_method = SRV_UNIX_LITTLESYNC; + } else if (0 == ut_strcmp(srv_unix_file_flush_method_str, "nosync")) { + srv_unix_file_flush_method = SRV_UNIX_NOSYNC; + } else { + fprintf(stderr, + "InnoDB: Unrecognized value for innodb_unix_file_flush_method\n"); + + return(DB_ERROR); + } + + printf("InnoDB file flush method %lu\n", srv_unix_file_flush_method); + os_aio_use_native_aio = srv_use_native_aio; err = srv_boot(); diff --git a/sql/ha_innobase.cc b/sql/ha_innobase.cc index 3e86d0da6f1..fa44cebe19d 100644 --- a/sql/ha_innobase.cc +++ b/sql/ha_innobase.cc @@ -83,6 +83,7 @@ long innobase_mirrored_log_groups, innobase_log_files_in_group, char *innobase_data_home_dir, *innobase_data_file_path; char *innobase_log_group_home_dir, *innobase_log_arch_dir; +char *innobase_unix_file_flush_method; bool innobase_flush_log_at_trx_commit, innobase_log_archive, innobase_use_native_aio; @@ -474,6 +475,10 @@ innobase_init(void) DBUG_RETURN(TRUE); } + srv_unix_file_flush_method_str = (innobase_unix_file_flush_method ? + innobase_unix_file_flush_method : + (char*)"fdatasync"); + srv_n_log_groups = (ulint) innobase_mirrored_log_groups; srv_n_log_files = (ulint) innobase_log_files_in_group; srv_log_file_size = (ulint) innobase_log_file_size; diff --git a/sql/ha_innobase.h b/sql/ha_innobase.h index 429e47523dd..258e34cbf86 100644 --- a/sql/ha_innobase.h +++ b/sql/ha_innobase.h @@ -161,6 +161,7 @@ extern long innobase_buffer_pool_size, innobase_additional_mem_pool_size; extern long innobase_file_io_threads, innobase_lock_wait_timeout; extern char *innobase_data_home_dir, *innobase_data_file_path; extern char *innobase_log_group_home_dir, *innobase_log_arch_dir; +extern char *innobase_unix_file_flush_method; extern bool innobase_flush_log_at_trx_commit, innobase_log_archive, innobase_use_native_aio; diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 982e32a9fd7..dccb54ae7ec 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -2456,6 +2456,7 @@ enum options { OPT_INNODB_LOG_ARCH_DIR, OPT_INNODB_LOG_ARCHIVE, OPT_INNODB_FLUSH_LOG_AT_TRX_COMMIT, + OPT_INNODB_UNIX_FILE_FLUSH_METHOD, OPT_SAFE_SHOW_DB, OPT_GEMINI_SKIP, OPT_INNODB_SKIP, OPT_TEMP_POOL, OPT_TX_ISOLATION, @@ -2516,6 +2517,8 @@ static struct option long_options[] = { OPT_INNODB_LOG_ARCHIVE}, {"innodb_flush_log_at_trx_commit", optional_argument, 0, OPT_INNODB_FLUSH_LOG_AT_TRX_COMMIT}, + {"innodb_unix_file_flush_method", required_argument, 0, + OPT_INNODB_UNIX_FILE_FLUSH_METHOD}, #endif {"help", no_argument, 0, '?'}, {"init-file", required_argument, 0, (int) OPT_INIT_FILE}, @@ -2793,6 +2796,7 @@ struct show_var_st init_vars[]= { {"innodb_log_arch_dir", (char*) &innobase_log_arch_dir, SHOW_CHAR_PTR}, {"innodb_log_archive", (char*) &innobase_log_archive, SHOW_MY_BOOL}, {"innodb_log_group_home_dir", (char*) &innobase_log_group_home_dir, SHOW_CHAR_PTR}, + {"innodb_unix_file_flush_method", (char*) &innobase_unix_file_flush_method, SHOW_CHAR_PTR}, #endif {"interactive_timeout", (char*) &net_interactive_timeout, SHOW_LONG}, {"join_buffer_size", (char*) &join_buff_size, SHOW_LONG}, @@ -3653,6 +3657,9 @@ static void get_options(int argc,char **argv) case OPT_INNODB_FLUSH_LOG_AT_TRX_COMMIT: innobase_flush_log_at_trx_commit= optarg ? test(atoi(optarg)) : 1; break; + case OPT_INNODB_UNIX_FILE_FLUSH_METHOD: + innobase_unix_file_flush_method=optarg; + break; #endif /* HAVE_INNOBASE_DB */ case OPT_MYISAM_RECOVER: { From 9e60613398ed8e41f11167256ea12e6787729ceb Mon Sep 17 00:00:00 2001 From: "paul@central.snake.net" <> Date: Wed, 23 May 2001 10:18:51 -0500 Subject: [PATCH 7/8] manual.texi Add links for downloadable menagerie db distribution --- BitKeeper/etc/logging_ok | 1 + Docs/manual.texi | 13 ++++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index b6a17f4bda9..c651c956eb0 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -1,3 +1,4 @@ jani@janikt.pp.saunalahti.fi monty@tik.mysql.fi monty@donna.mysql.fi +paul@central.snake.net diff --git a/Docs/manual.texi b/Docs/manual.texi index da569c67dd1..7702d2dad10 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -9207,9 +9207,10 @@ You should now have an ODBC connection to @strong{MySQL}, encrypted using SSH. @node Windows symbolic links, Windows compiling, Windows and SSH, Windows @subsection Splitting Data Across Different Disks on Windows -Beginning with @strong{MySQL} Version 3.23.16, the @strong{MySQL} -distribution is compiled with the @code{-DUSE_SYMDIR} option. This allows -you to put a database on different disk by adding a symbolic link to it +Beginning with @strong{MySQL} Version 3.23.16, the @code{mysqld-max} +and @code{mysql-max-nt} servers in the @strong{MySQL} distribution are +compiled with the @code{-DUSE_SYMDIR} option. This allows you to put a +database on different disk by adding a symbolic link to it (in a manner similar to the way that symbolic links work on Unix). On Windows, you make a symbolic link to a database by creating a file @@ -26147,6 +26148,12 @@ The menagerie database will be simple (deliberately), but it is not difficult to think of real-world situations in which a similar type of database might be used. For example, a database like this could be used by a farmer to keep track of livestock, or by a veterinarian to keep track of patient records. +A menagerie distribution containing some of the queries and sample data used +in the following sections can be obtained from the @strong{MySQL} Web site. +It's available in either +@uref{http://www.mysql.com/Downloads/Contrib/Examples/menagerie.tar.gz,compressed @code{tar} format} +or +@uref{http://www.mysql.com/Downloads/Contrib/Examples/menagerie.zip,Zip format}. Use the @code{SHOW} statement to find out what databases currently exist on the server: From 221b1ea5a4d5d0334fa7ac62482467c89b97698d Mon Sep 17 00:00:00 2001 From: "heikki@donna.mysql.fi" <> Date: Wed, 23 May 2001 20:19:56 +0300 Subject: [PATCH 8/8] log0log.c InnoDB now allows parameter innodb_unix_file_flush_method os0file.c InnoDB now allows parameter innodb_unix_file_flush_method srv0start.c InnoDB now allows parameter innodb_unix_file_flush_method --- innobase/log/log0log.c | 14 ++++++++++---- innobase/os/os0file.c | 40 ++++++++++++++++++++++++++++------------ innobase/srv/srv0start.c | 2 -- 3 files changed, 38 insertions(+), 18 deletions(-) diff --git a/innobase/log/log0log.c b/innobase/log/log0log.c index 32e7f144026..46fcf400d34 100644 --- a/innobase/log/log0log.c +++ b/innobase/log/log0log.c @@ -838,14 +838,18 @@ log_io_complete( /* It was a checkpoint write */ group = (log_group_t*)((ulint)group - 1); - fil_flush(group->space_id); - + if (srv_unix_file_flush_method == SRV_UNIX_LITTLESYNC) { + fil_flush(group->space_id); + } + log_io_complete_checkpoint(group); return; } - fil_flush(group->space_id); + if (srv_unix_file_flush_method == SRV_UNIX_LITTLESYNC) { + fil_flush(group->space_id); + } mutex_enter(&(log_sys->mutex)); @@ -1474,7 +1478,9 @@ log_checkpoint( recv_apply_hashed_log_recs(TRUE); } - fil_flush_file_spaces(FIL_TABLESPACE); + if (srv_unix_file_flush_method == SRV_UNIX_LITTLESYNC) { + fil_flush_file_spaces(FIL_TABLESPACE); + } mutex_enter(&(log_sys->mutex)); diff --git a/innobase/os/os0file.c b/innobase/os/os0file.c index 7a6edd5a7c1..fa0c266a82a 100644 --- a/innobase/os/os0file.c +++ b/innobase/os/os0file.c @@ -9,6 +9,7 @@ Created 10/21/1995 Heikki Tuuri #include "os0file.h" #include "os0sync.h" #include "ut0mem.h" +#include "srv0srv.h" #ifdef POSIX_ASYNC_IO @@ -345,12 +346,11 @@ try_again: UT_NOT_USED(purpose); - /* On Linux opening a file in the O_SYNC mode seems to be much - more efficient for small writes than calling an explicit fsync or - fdatasync after each write, but on Solaris O_SYNC and O_DSYNC is - extremely slow in large block writes to a big file. Therefore we - do not use these options, but use explicit fdatasync. */ - +#ifdef O_DSYNC + if (srv_unix_file_flush_method == SRV_UNIX_O_DSYNC) { + create_flag = create_flag | O_DSYNC; + } +#endif if (create_mode == OS_FILE_CREATE) { file = open(name, create_flag, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); @@ -546,6 +546,12 @@ os_file_flush( return(FALSE); #else int ret; + +#ifdef O_DSYNC + if (srv_unix_file_flush_method == SRV_UNIX_O_DSYNC) { + return(TRUE); + } +#endif #ifdef HAVE_FDATASYNC ret = fdatasync(file); @@ -621,10 +627,15 @@ os_file_pwrite( #ifdef HAVE_PWRITE ret = pwrite(file, buf, n, offs); - /* Always do fsync to reduce the probability that when the OS crashes, - a database page is only partially physically written to disk. */ + if (srv_unix_file_flush_method != SRV_UNIX_LITTLESYNC + && srv_unix_file_flush_method != SRV_UNIX_NOSYNC) { - ut_a(TRUE == os_file_flush(file)); + /* Always do fsync to reduce the probability that when + the OS crashes, a database page is only partially + physically written to disk. */ + + ut_a(TRUE == os_file_flush(file)); + } return(ret); #else @@ -645,10 +656,15 @@ os_file_pwrite( ret = write(file, buf, n); - /* Always do fsync to reduce the probability that when the OS crashes, - a database page is only partially physically written to disk. */ + if (srv_unix_file_flush_method != SRV_UNIX_LITTLESYNC + && srv_unix_file_flush_method != SRV_UNIX_NOSYNC) { - ut_a(TRUE == os_file_flush(file)); + /* Always do fsync to reduce the probability that when + the OS crashes, a database page is only partially + physically written to disk. */ + + ut_a(TRUE == os_file_flush(file)); + } os_mutex_exit(os_file_seek_mutexes[i]); diff --git a/innobase/srv/srv0start.c b/innobase/srv/srv0start.c index 105d6e11623..29ddf2a21c8 100644 --- a/innobase/srv/srv0start.c +++ b/innobase/srv/srv0start.c @@ -548,8 +548,6 @@ innobase_start_or_create_for_mysql(void) return(DB_ERROR); } - printf("InnoDB file flush method %lu\n", srv_unix_file_flush_method); - os_aio_use_native_aio = srv_use_native_aio; err = srv_boot();