diff options
author | unknown <monty@hundin.mysql.fi> | 2001-10-31 18:27:49 +0200 |
---|---|---|
committer | unknown <monty@hundin.mysql.fi> | 2001-10-31 18:27:49 +0200 |
commit | 03f6fdd575f71aacd4b6e782c9df4b929f8222b1 (patch) | |
tree | 603547f133fd6eaa7de511aeb171eb8224e0d208 | |
parent | 3f7cf671a1d735a72e98e89d91a16cce085e6817 (diff) | |
download | mariadb-git-03f6fdd575f71aacd4b6e782c9df4b929f8222b1.tar.gz |
Portability fixes
Fix for consistent 0000-00-00 date handling
Close + open binary logs on flush tables
Fix for AVG() in HAVING.
BUILD/SETUP.sh:
Compile MySQL with -O0 to make debugging easier.
Docs/manual.texi:
Changelog
configure.in:
Version change
innobase/buf/buf0lru.c:
Fix for windows
mysql-test/r/func_time.result:
Updated tests
mysql-test/r/having.result:
Updated tests
mysql-test/t/func_time.test:
Updated tests
mysql-test/t/having.test:
Updated tests
mysys/mf_casecnv.c:
Portability fix
mysys/mf_qsort.c:
Portability fix
mysys/my_compress.c:
Portability fix
mysys/my_tempnam.c:
More comments
sql/field.cc:
Fix for consistent 0000-00-00 date handling
sql/item.h:
Fix for AVG() in HAVING
sql/log.cc:
Close + open update logs on flush tables
sql/sql_select.cc:
More debugging info
sql/time.cc:
Fix for consistent 0000-00-00 date handling
strings/ctype.c:
Portability fix
strings/strto.c:
Portability fix
-rw-r--r-- | BUILD/SETUP.sh | 4 | ||||
-rw-r--r-- | Docs/manual.texi | 30 | ||||
-rw-r--r-- | configure.in | 2 | ||||
-rw-r--r-- | innobase/buf/buf0lru.c | 1 | ||||
-rw-r--r-- | mysql-test/r/func_time.result | 18 | ||||
-rw-r--r-- | mysql-test/r/having.result | 2 | ||||
-rw-r--r-- | mysql-test/t/func_time.test | 18 | ||||
-rw-r--r-- | mysql-test/t/having.test | 42 | ||||
-rw-r--r-- | mysys/mf_casecnv.c | 1 | ||||
-rw-r--r-- | mysys/mf_qsort.c | 1 | ||||
-rw-r--r-- | mysys/my_compress.c | 1 | ||||
-rw-r--r-- | mysys/my_tempnam.c | 11 | ||||
-rw-r--r-- | sql/field.cc | 18 | ||||
-rw-r--r-- | sql/item.h | 1 | ||||
-rw-r--r-- | sql/log.cc | 38 | ||||
-rw-r--r-- | sql/sql_select.cc | 1 | ||||
-rw-r--r-- | sql/time.cc | 6 | ||||
-rw-r--r-- | strings/ctype.c | 2 | ||||
-rw-r--r-- | strings/strto.c | 2 |
19 files changed, 151 insertions, 48 deletions
diff --git a/BUILD/SETUP.sh b/BUILD/SETUP.sh index a8b0762c3ec..2a99915a18d 100644 --- a/BUILD/SETUP.sh +++ b/BUILD/SETUP.sh @@ -35,7 +35,7 @@ AM_MAKEFLAGS="-j 4" # -Wshadow -Wunused -Winline (The later isn't usable in C++ as # __attribute()__ doesn't work with gnu C++) global_warnings="-Wimplicit -Wreturn-type -Wid-clash-51 -Wswitch -Wtrigraphs -Wcomment -W -Wchar-subscripts -Wformat -Wimplicit-function-dec -Wimplicit-int -Wparentheses -Wsign-compare -Wwrite-strings" -debug_extra_warnings="-Wuninitialized" +#debug_extra_warnings="-Wuninitialized" c_warnings="$global_warnings -Wunused" cxx_warnings="$global_warnings -Woverloaded-virtual -Wextern-inline -Wsign-promo -Wreorder -Wctor-dtor-privacy -Wnon-virtual-dtor" @@ -48,7 +48,7 @@ fast_cflags="-O3 -fno-omit-frame-pointer" # this is one is for someone who thinks 1% speedup is worth not being # able to backtrace reckless_cflags="-O3 -fomit-frame-pointer " -debug_cflags="-DEXTRA_DEBUG -DFORCE_INIT_OF_VARS -DSAFEMALLOC -DSAFE_MUTEX -O2" +debug_cflags="-DEXTRA_DEBUG -DFORCE_INIT_OF_VARS -DSAFEMALLOC -DSAFE_MUTEX -O0" base_cxxflags="-felide-constructors -fno-exceptions -fno-rtti" diff --git a/Docs/manual.texi b/Docs/manual.texi index e01f8ceb5b4..7c103f06a3b 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -22958,7 +22958,7 @@ By default, the @code{mysql.server} script starts the MySQL server with the @code{-l} option. If you need better performance when you start using MySQL in a production environment, you can remove the @code{-l} option from @code{mysql.server} or change it to -@code{--log-binary}. +@code{--log-bin}. The entries in this log are written as @code{mysqld} receives the questions. This may be different than the order in which the statements are executed. @@ -23032,8 +23032,8 @@ and the crash. @cindex binary log @cindex files, binary log -In the future the binary log will replace the update log, so we -recommend you to switch to this log format as soon as possible! +The intention is that the binary log should replace the update log, so +we recommend you to switch to this log format as soon as possible! The binary log contains all information that is available in the update log in a more efficient format. It also contains information about how long @@ -23048,6 +23048,14 @@ file name is given, it defaults to the name of the host machine followed by @code{-bin}. If file name is given, but it doesn't contain a path, the file is written in the data directory. +If you supply an extension to @code{--log-bin=filename.extension}, the +extension will be silenty removed. + +To the binary log filename @code{mysqld} will append an extension that is a +number that is incremented each time you execute @code{mysqladmin +refresh}, execute @code{mysqladmin flush-logs}, execute the @code{FLUSH LOGS} +statement or restart the server. + You can use the following options to @code{mysqld} to affect what is logged to the binary log: @@ -23062,11 +23070,6 @@ Tells the master that updates to the given database should not be logged to the binary log (Example: @code{binlog-ignore-db=some_database}) @end multitable -To the binary log filename @code{mysqld} will append an extension that is a -number that is incremented each time you execute @code{mysqladmin -refresh}, execute @code{mysqladmin flush-logs}, execute the @code{FLUSH LOGS} -statement or restart the server. - To be able to know which different binary log files have been used, @code{mysqld} will also create a binary log index file that contains the name of all used binary log files. By default this has the @@ -46840,6 +46843,11 @@ not yet 100% confident in this code. @appendixsubsec Changes in release 3.23.44 @itemize @bullet @item +Fixed bug when using a reference to a @code{AVG()} column in @code{HAVING}. +@item +Fixed that date functions that require correct dates, like +@code{DAYOFYEAR(column)} will return @code{NULL} for @code{0000-00-00} dates. +@item Fixed bug in const-propagation when comparing columns of different types. (@code{SELECT * FROM date_col="2001-01-01" and date_col=time_col}) @item @@ -52724,15 +52732,15 @@ Make a second backup of the tables. Remove (or move away) any old log files from the MySQL data directory if you need more space. @item -Start @code{mysqld} with @code{--log-binary}. @xref{Binary log}. +Start @code{mysqld} with @code{--log-bin}. @xref{Binary log}. If you want to find a query that crashes @code{mysqld}, you should use -@code{--log --log-binary}. +@code{--log --log-bin}. @item When you have gotten a crashed table, stop the @code{mysqld server}. @item Restore the backup. @item -Restart the @code{mysqld} server @strong{without} @code{--log-binary} +Restart the @code{mysqld} server @strong{without} @code{--log-bin} @item Re-execute the commands with @code{mysqlbinlog update-log-file | mysql}. The update log is saved in the MySQL database directory with diff --git a/configure.in b/configure.in index cfdbe51b987..989c296d7f5 100644 --- a/configure.in +++ b/configure.in @@ -4,7 +4,7 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(sql/mysqld.cc) AC_CANONICAL_SYSTEM # The Docs Makefile.am parses this line! -AM_INIT_AUTOMAKE(mysql, 3.23.43) +AM_INIT_AUTOMAKE(mysql, 3.23.44) AM_CONFIG_HEADER(config.h) PROTOCOL_VERSION=10 diff --git a/innobase/buf/buf0lru.c b/innobase/buf/buf0lru.c index 82777e4ef2f..c3118544492 100644 --- a/innobase/buf/buf0lru.c +++ b/innobase/buf/buf0lru.c @@ -10,6 +10,7 @@ Created 11/5/1995 Heikki Tuuri #ifdef UNIV_NONINL #include "buf0lru.ic" +#include "srv0srv.h" /* Needed to getsrv_print_innodb_monitor */ #endif #include "ut0byte.h" diff --git a/mysql-test/r/func_time.result b/mysql-test/r/func_time.result index 790cce9f1c1..e2e86723e31 100644 --- a/mysql-test/r/func_time.result +++ b/mysql-test/r/func_time.result @@ -200,3 +200,21 @@ month(updated) NULL year(updated) NULL +dayofyear("0000-00-00") dayofyear(d) dayofyear(dt) dayofyear(t) dayofyear(c) +NULL NULL NULL NULL NULL +dayofmonth("0000-00-00") dayofmonth(d) dayofmonth(dt) dayofmonth(t) dayofmonth(c) +0 0 0 0 0 +month("0000-00-00") month(d) month(dt) month(t) month(c) +0 0 0 0 0 +quarter("0000-00-00") quarter(d) quarter(dt) quarter(t) quarter(c) +0 0 0 0 0 +week("0000-00-00") week(d) week(dt) week(t) week(c) +NULL NULL NULL NULL NULL +year("0000-00-00") year(d) year(dt) year(t) year(c) +0 0 0 0 0 +yearweek("0000-00-00") yearweek(d) yearweek(dt) yearweek(t) yearweek(c) +NULL NULL NULL NULL NULL +to_days("0000-00-00") to_days(d) to_days(dt) to_days(t) to_days(c) +NULL NULL NULL NULL NULL +extract(MONTH FROM "0000-00-00") extract(MONTH FROM d) extract(MONTH FROM dt) extract(MONTH FROM t) extract(MONTH FROM c) +0 0 0 0 0 diff --git a/mysql-test/r/having.result b/mysql-test/r/having.result index cbd3fbfff4e..69943c505f0 100644 --- a/mysql-test/r/having.result +++ b/mysql-test/r/having.result @@ -2,3 +2,5 @@ b b b 0 +id start end chr_strand +133197 813898 813898 -1.0000 diff --git a/mysql-test/t/func_time.test b/mysql-test/t/func_time.test index cb021d25ae3..7901387eb24 100644 --- a/mysql-test/t/func_time.test +++ b/mysql-test/t/func_time.test @@ -131,3 +131,21 @@ INSERT INTO t1 VALUES (''); SELECT month(updated) from t1; SELECT year(updated) from t1; drop table t1; + +# +# Check that functions work identically on 0000-00-00 as a constant and on a +# column +# + +create table t1 (d date, dt datetime, t timestamp, c char(10)); +insert into t1 values ("0000-00-00", "0000-00-00", "0000-00-00", "0000-00-00"); +select dayofyear("0000-00-00"),dayofyear(d),dayofyear(dt),dayofyear(t),dayofyear(c) from t1; +select dayofmonth("0000-00-00"),dayofmonth(d),dayofmonth(dt),dayofmonth(t),dayofmonth(c) from t1; +select month("0000-00-00"),month(d),month(dt),month(t),month(c) from t1; +select quarter("0000-00-00"),quarter(d),quarter(dt),quarter(t),quarter(c) from t1; +select week("0000-00-00"),week(d),week(dt),week(t),week(c) from t1; +select year("0000-00-00"),year(d),year(dt),year(t),year(c) from t1; +select yearweek("0000-00-00"),yearweek(d),yearweek(dt),yearweek(t),yearweek(c) from t1; +select to_days("0000-00-00"),to_days(d),to_days(dt),to_days(t),to_days(c) from t1; +select extract(MONTH FROM "0000-00-00"),extract(MONTH FROM d),extract(MONTH FROM dt),extract(MONTH FROM t),extract(MONTH FROM c) from t1; +drop table t1; diff --git a/mysql-test/t/having.test b/mysql-test/t/having.test index a952f5e8d5c..fff5415976c 100644 --- a/mysql-test/t/having.test +++ b/mysql-test/t/having.test @@ -1,10 +1,50 @@ # test of problems with having (Reported by Mark Rogers) # -drop table if exists t1; +drop table if exists t1,t2; create table t1 (a int); select count(a) as b from t1 where a=0 having b > 0; insert into t1 values (null); select count(a) as b from t1 where a=0 having b > 0; select count(a) as b from t1 where a=0 having b >=0; drop table t1; + +# +# Test of problem with HAVING and AVG() +# + +CREATE TABLE t1 ( + raw_id int(10) NOT NULL default '0', + chr_start int(10) NOT NULL default '0', + chr_end int(10) NOT NULL default '0', + raw_start int(10) NOT NULL default '0', + raw_end int(10) NOT NULL default '0', + raw_ori int(2) NOT NULL default '0' +); + +INSERT INTO t1 VALUES (469713,1,164123,1,164123,1),(317330,164124,317193,101,153170,1),(469434,317194,375620,101,58527,1),(591816,375621,484273,1,108653,1),(591807,484274,534671,91,50488,1),(318885,534672,649362,101,114791,1),(318728,649363,775520,102,126259,1),(336829,775521,813997,101,38577,1),(317740,813998,953227,101,139330,1),(1,813998,953227,101,139330,1); + +CREATE TABLE t2 ( + id int(10) unsigned NOT NULL default '0', + contig_id int(10) unsigned NOT NULL default '0', + seq_start int(10) NOT NULL default '0', + seq_end int(10) NOT NULL default '0', + strand tinyint(2) NOT NULL default '0', + KEY id (id) +); +INSERT INTO t2 VALUES (133195,469713,61327,61384,1),(133196,469713,64113,64387,1),(133197,1,1,1,0),(133197,1,1,1,-2); +SELECT e.id, + MIN( IF(sgp.raw_ori=1, + (e.seq_start+sgp.chr_start-sgp.raw_start), + (sgp.chr_start+sgp.raw_end-e.seq_end))) as start, + MAX( IF(sgp.raw_ori=1, + (e.seq_end+sgp.chr_start-sgp.raw_start), + (sgp.chr_start+sgp.raw_end-e.seq_start))) as end, + AVG(IF (sgp.raw_ori=1,e.strand,(-e.strand))) as chr_strand +FROM t1 sgp, + t2 e +WHERE sgp.raw_id=e.contig_id +GROUP BY e.id +HAVING chr_strand= -1 and end >= 0 + AND start <= 999660; +drop table t1,t2; diff --git a/mysys/mf_casecnv.c b/mysys/mf_casecnv.c index 4ec3b66d9cb..125f54b2594 100644 --- a/mysys/mf_casecnv.c +++ b/mysys/mf_casecnv.c @@ -25,6 +25,7 @@ #include "mysys_priv.h" #include <m_ctype.h> +#include <m_string.h> /* string to uppercase */ diff --git a/mysys/mf_qsort.c b/mysys/mf_qsort.c index 032a1a28a72..64e70990696 100644 --- a/mysys/mf_qsort.c +++ b/mysys/mf_qsort.c @@ -25,6 +25,7 @@ */ #include "mysys_priv.h" +#include <m_string.h> /* Envoke the comparison function, returns either 0, < 0, or > 0. */ #ifdef QSORT_EXTRA_CMP_ARGUMENT diff --git a/mysys/my_compress.c b/mysys/my_compress.c index d1e32234135..f97d28c25ea 100644 --- a/mysys/my_compress.c +++ b/mysys/my_compress.c @@ -20,6 +20,7 @@ #include <global.h> #ifdef HAVE_COMPRESS #include <my_sys.h> +#include <m_string.h> #include <zlib.h> /* diff --git a/mysys/my_tempnam.c b/mysys/my_tempnam.c index 6b7ac099581..fdaf018af0d 100644 --- a/mysys/my_tempnam.c +++ b/mysys/my_tempnam.c @@ -15,6 +15,13 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ +/* + This function is only used by some old ISAM code. + When we remove ISAM support from MySQL, we should also delete this file + + One should instead use the functions in mf_tempfile.c +*/ + #include "mysys_priv.h" #include <m_string.h> #include "my_static.h" @@ -103,13 +110,13 @@ my_string my_tempnam(const char *dir, const char *pfx, old_env=(char**)environ; if (dir) { /* Don't use TMPDIR if dir is given */ - environ=(const char**)temp_env; + environ=(const char**)temp_env; /* May give warning */ temp_env[0]=0; } #endif res=tempnam((char*) dir,(my_string) pfx); /* Use stand. dir with prefix */ #ifndef OS2 - environ=(const char**)old_env; + environ=(const char**)old_env; /* May give warning */ #endif if (!res) DBUG_PRINT("error",("Got error: %d from tempnam",errno)); diff --git a/sql/field.cc b/sql/field.cc index b34f58439db..bd923a09dc6 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -2412,8 +2412,7 @@ String *Field_timestamp::val_str(String *val_buffer, return val_buffer; } -bool Field_timestamp::get_date(TIME *ltime, - bool fuzzydate __attribute__((unused))) +bool Field_timestamp::get_date(TIME *ltime, bool fuzzydate) { long temp; #ifdef WORDS_BIGENDIAN @@ -2424,6 +2423,8 @@ bool Field_timestamp::get_date(TIME *ltime, longget(temp,ptr); if (temp == 0L) { /* Zero time is "000000" */ + if (!fuzzydate) + return 1; bzero((char*) ltime,sizeof(*ltime)); } else @@ -2447,8 +2448,7 @@ bool Field_timestamp::get_date(TIME *ltime, bool Field_timestamp::get_time(TIME *ltime) { - Field_timestamp::get_date(ltime,0); - return 0; + return Field_timestamp::get_date(ltime,0); } int Field_timestamp::cmp(const char *a_ptr, const char *b_ptr) @@ -3029,13 +3029,12 @@ bool Field_newdate::get_date(TIME *ltime,bool fuzzydate) ltime->month= (tmp >> 5) & 15; ltime->year= (tmp >> 9); ltime->time_type=TIMESTAMP_DATE; - return (!fuzzydate && (!ltime->month || !ltime->day) && ltime->year) ? 1 : 0; + return (!fuzzydate && (!ltime->month || !ltime->day)) ? 1 : 0; } bool Field_newdate::get_time(TIME *ltime) { - Field_newdate::get_date(ltime,0); - return 0; + return Field_newdate::get_date(ltime,0); } int Field_newdate::cmp(const char *a_ptr, const char *b_ptr) @@ -3214,13 +3213,12 @@ bool Field_datetime::get_date(TIME *ltime,bool fuzzydate) ltime->day= part1%100; ltime->month= part1/100%100; ltime->year= part1/10000; - return (!fuzzydate && (!ltime->month || !ltime->day) && ltime->year) ? 1 : 0; + return (!fuzzydate && (!ltime->month || !ltime->day)) ? 1 : 0; } bool Field_datetime::get_time(TIME *ltime) { - Field_datetime::get_date(ltime,0); - return 0; + return Field_datetime::get_date(ltime,0); } int Field_datetime::cmp(const char *a_ptr, const char *b_ptr) diff --git a/sql/item.h b/sql/item.h index 9ad633d9278..c868f9d3bf7 100644 --- a/sql/item.h +++ b/sql/item.h @@ -292,6 +292,7 @@ public: Item_result_field() :result_field(0) {} ~Item_result_field() {} /* Required with gcc 2.95 */ Field *tmp_table_field() { return result_field; } + table_map used_tables() const { return 1; } virtual void fix_length_and_dec()=0; }; diff --git a/sql/log.cc b/sql/log.cc index d7825ce0e93..0417f7eb06b 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -513,29 +513,37 @@ bool MYSQL_LOG::is_active(const char* log_file_name) void MYSQL_LOG::new_file(bool inside_mutex) { - // only rotate open logs that are marked non-rotatable - // (binlog with constant name are non-rotatable) - if (is_open() && ! no_rotate) + if (is_open()) { char new_name[FN_REFLEN], *old_name=name; if (!inside_mutex) VOID(pthread_mutex_lock(&LOCK_log)); - if (generate_new_name(new_name, name)) - { - if (!inside_mutex) - VOID(pthread_mutex_unlock(&LOCK_log)); - return; // Something went wrong - } - if (log_type == LOG_BIN) + + if (!no_rotate) { /* - We log the whole file name for log file as the user may decide - to change base names at some point. + only rotate open logs that are marked non-rotatable + (binlog with constant name are non-rotatable) */ - Rotate_log_event r(new_name+dirname_length(new_name)); - r.write(&log_file); - VOID(pthread_cond_broadcast(&COND_binlog_update)); + if (generate_new_name(new_name, name)) + { + if (!inside_mutex) + VOID(pthread_mutex_unlock(&LOCK_log)); + return; // Something went wrong + } + if (log_type == LOG_BIN) + { + /* + We log the whole file name for log file as the user may decide + to change base names at some point. + */ + Rotate_log_event r(new_name+dirname_length(new_name)); + r.write(&log_file); + VOID(pthread_cond_broadcast(&COND_binlog_update)); + } } + else + strmov(new_name, old_name); // Reopen old file name name=0; close(); open(old_name, log_type, new_name); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 14f09454734..c4cd4421f98 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -5302,6 +5302,7 @@ static bool fix_having(JOIN *join, Item **having) JOIN_TAB *table=&join->join_tab[join->const_tables]; table_map used_tables= join->const_table_map | table->table->map; + DBUG_EXECUTE("where",print_where(*having,"having");); Item* sort_table_cond=make_cond_for_table(*having,used_tables,used_tables); if (sort_table_cond) { diff --git a/sql/time.cc b/sql/time.cc index e0b74fc9d25..1d7e055f682 100644 --- a/sql/time.cc +++ b/sql/time.cc @@ -426,7 +426,6 @@ timestamp_type str_to_TIME(const char *str, uint length, TIME *l_time,bool fuzzy_date) { uint field_length,year_length,digits,i,number_of_fields,date[7]; - bool date_used=0; const char *pos; const char *end=str+length; DBUG_ENTER("str_to_TIME"); @@ -452,8 +451,7 @@ str_to_TIME(const char *str, uint length, TIME *l_time,bool fuzzy_date) tmp_value=tmp_value*10 + (uint) (uchar) (*str - '0'); str++; } - if ((date[i]=tmp_value)) - date_used=1; // Found something + date[i]=tmp_value; if (i == 2 && str != end && *str == 'T') str++; // ISO8601: CCYYMMDDThhmmss else if ( i != 5 ) // Skip inter-field delimiters @@ -486,7 +484,7 @@ str_to_TIME(const char *str, uint length, TIME *l_time,bool fuzzy_date) number_of_fields=i; while (i < 6) date[i++]=0; - if (number_of_fields < 3 || !date_used || date[1] > 12 || + if (number_of_fields < 3 || date[1] > 12 || date[2] > 31 || date[3] > 23 || date[4] > 59 || date[5] > 59 || !fuzzy_date && (date[1] == 0 || date[2] == 0)) { diff --git a/strings/ctype.c b/strings/ctype.c index d6f02ec5054..e66c9771d78 100644 --- a/strings/ctype.c +++ b/strings/ctype.c @@ -16,8 +16,8 @@ MA 02111-1307, USA */ #include <global.h> - #include <m_ctype.h> +#include <m_string.h> /* generated by make, using conf_to_src */ #include "ctype_extra_sources.c" diff --git a/strings/strto.c b/strings/strto.c index 64b1c9a5ae9..d3392c794e9 100644 --- a/strings/strto.c +++ b/strings/strto.c @@ -197,7 +197,7 @@ function (const char *nptr,char **endptr,int base) } /* Return the result of the appropriate sign. */ - return (negative ? -((longtype) i) : i); + return (negative ? -((longtype) i) : (longtype) i); noconv: /* There was no number to convert. */ |