Commit 8fd48cce authored by unknown's avatar unknown

Merge mysql.com:/home/bkroot/mysql-4.1-rpl

into  mysql.com:/home/bk/MERGE/mysql-4.1-merge

parents 57ba34ff c6d31783
License Agreement for Commercial Use of MySQL[tm] Software
This Agreement ("License") is between MySQL AB, a Swedish company
("Licensor"), and the customer ("Licensee") identified on the electronic order
form submitted on behalf of Licensee (the "Order Form"). In consideration of
the mutual promises, covenants and conditions contained herein, the
sufficiency of which is hereby acknowledged, the parties agree as follows.
1. License Grant.
"Licensed Software" means a complete and unchanged copy of the object code
version of the MySQL relational database management software identified in the
Order Form and posted on a special download page of the MySQL AB web site (the
"Download Page") made available to Licensee immediately after payment as
provided in Section 4. Subject to payment and the other terms and conditions
hereof, Licensor grants to Licensee a limited, non-exclusive and
non-transferable right to: (a) make one copy of the Licensed Software for each
license purchased (each, a "Licensed Copy"); (b) compile and/or link each
Licensed Copy to one copy of the Licensee software identified in the Order
Form (the "Licensee Application") without modifying the Licensed Software
(each, an "Integrated Product"); and (c) load and use the Licensed Copy
portion of an Integrated Product on one machine or instrument in the operating
system environment(s), and on the hardware platform(s) specified in the Order
Form, and solely for running and extracting data from, the Licensee
Application. "Use" means operation by one person for internal business
purposes in accordance with the terms and conditions hereof. Licensed Copies
shall be deemed accepted by Licensee immediately upon download. Licensee may
make one additional copy of each Licensed Copy for backup and archival
purposes only.
2. Transfer.
Only after Licensee has linked or compiled a Licensed Copy as permitted in
Section 1, Licensee may transfer to a third party (the "Transferee") the right
to use such copy as described in Section 1. As a condition to any such
transfer: (a) Licensee must deliver the Licensed Copy and any backup copy to
the Transferee along with a copy of this License (including the Sales Order);
and (b) the Transferee must accept the terms and conditions of this License.
Any and all of Licensee's rights to a Licensed Copy shall terminate upon
transfer of the right to use such copy. A Transferee's rights are limited to
the use rights described in Section 1(c), and do not include the linking,
compilation or copying rights (except for backup and archival copies)
described in Section 1. If you did not purchase this License directly from
MySQL AB, then you are a Transferee. Licensee and any Transferee must comply
with all applicable export laws and regulations.
3. Restrictions.
Licensee may use the Licensed Software only as expressly provided in Section
1. Without limiting the foregoing, Licensee shall not: (a) lease, license,
use, make available, distribute or modify all or any part of the Licensed
Software to any third party, except as otherwise expressly permitted herein;
(b) use the Licensed Software to operate in or as a time-sharing, outsourcing,
service bureau, application service provider or managed service provider
environment; (c) lease, license, use, make available or distribute the
Licensed Software as a general SQL server, as a stand alone application or
with applications other than the Licensee Application under this License; (d)
copy the Licensed Software onto any public or distributed network; (e)
distribute Integrated Products pursuant to a public or open source license;
(f) port the Licensed Software to any operating system other than as described
in the Order Form; or (g) change any proprietary rights notices which appear
in the Licensed Software. Except as otherwise provided in Section 2, the
rights granted to Licensee herein are rights that may be exercised solely by
Licensee.
4. Price and payment.
No later than thirty (30) days after submission of the Order Form, Licensee
shall remit one non-refundable license fee per Licensed Copy as posted on
http://shop.mysql.com on the date Licensee submitted the Order Form (the
"License Fee"). All payments shall be made in Euros or U.S. dollars. Licensee
shall be responsible for paying all local, state, federal and international
sales, value added, excise and other taxes and duties payable in connection
with this License, other than taxes based upon Licensor's net income. Licensee
shall not be permitted to access the Download Page until Licensor has received
payment in full.
5. Termination.
Licensor may terminate this License immediately if the Licensee shall breach
any of the provisions of this License and such breach remains uncured 30 days
after receipt of notice. In the event that Licensee becomes liquidated,
dissolved, bankrupt or insolvent, whether voluntarily or involuntarily, or
shall take any action to be so declared, Licensor shall have the right to
terminate this License immediately. Upon expiration, cancellation or other
termination of this License, Licensee shall immediately: (a) discontinue
distribution of Integrated Products that include Licensed Software; and (b)
destroy all copies of the Licensed Software, including (without limitation) as
linked or compiled in any Integrated Product. Sections 4 through 10 shall
survive the termination of this License for any reason.
6. Proprietary Rights.
Licensee agrees that the copyright, patent, trade secrets and all other
intellectual proprietary rights of whatever nature in the Licensed Software
and related documentation, including derivative works, are and shall remain
the exclusive property of Licensor and any third party suppliers. Nothing in
this License should be construed as transferring any aspects of such rights to
Licensee or any third party. Licensor reserves any and all rights not
expressly granted herein. MySQL is a trademark of MySQL AB, and shall not be
used by Licensee without Licensor's express written authorization. Licensee
shall include in the Integrated Products a conspicuous notice that the
Integrated Products include software whose copyright is owned by MySQL AB.
7. Disclaimer of Warranties.
THE LICENSED SOFTWARE IS LICENSED "AS IS," WITHOUT ANY WARRANTIES WHATSOEVER.
LICENSOR EXPRESSLY DISCLAIMS, AND LICENSEE EXPRESSLY WAIVES, ALL WARRANTIES,
WHETHER EXPRESS OR IMPLIED, INCLUDING WARRANTIES OF MERCHANTIBILITY, FITNESS
FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, SYSTEM INTEGRATION,
NON-INTERFERENCE AND ACCURACY OF INFORMATIONAL CONTENT. LICENSOR DOES NOT
WARRANT THAT THE LICENSED SOFTWARE WILL MEET LICENSEE'S REQUIREMENTS OR THAT
THE OPERATION OF THE LICENSED SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR
THAT ERRORS WILL BE CORRECTED. THE ENTIRE RISK OF THE LICENSED SOFTWARE'S
QUALITY AND PERFORMANCE IS WITH LICENSEE. Without limiting the generality of
the foregoing disclaimer, Licensee acknowledges that the Licensed Software is
not specifically designed, manufactured or intended for use in the planning,
construction, maintenance, control or direct operation of nuclear facilities,
aircraft navigation, control or communication systems, weapons systems or
direct life support systems.
8. Indemnification.
Licensee hereby indemnifies and agrees to defend Licensor against any and all
damages, judgments and costs (including reasonable attorneys' fees) related to
any claim based upon: (a) an allegation that the Licensee Application
infringes the intellectual property of a third party; (b) use of the Licensed
Software in a manner prohibited under this License or in a manner for which
the Licensed Software was not designed; (c) integration or use of the Licensed
Software with the Licensee Application (where use of the Licensed Software
alone would not infringe); (d) changes made by Licensee to the Licensed
Software (where use of unmodified Licensed Software would not infringe); (e)
changes made, or actions taken, by Licensor upon Licensee's direct
instructions; or (f) bodily injury, property damage or any other damage or
injury due to the use or inability to use an Integrated Product.
9. Limitation of Liability.
LICENSOR SHALL HAVE NO LIABILITY WITH RESPECT TO ITS OBLIGATIONS UNDER THIS
AGREEMENT OR OTHERWISE FOR CONSEQUENTIAL, EXEMPLARY, SPECIAL, INDIRECT,
INCIDENTAL OR PUNITIVE DAMAGES, INCLUDING (WITHOUT LIMITATION) ANY LOST
PROFITS OR LOST SAVINGS (WHETHER RESULTING FROM IMPAIRED OR LOST DATA,
SOFTWARE OR COMPUTER FAILURE OR ANY OTHER CAUSE), EVEN IF IT HAS BEEN ADVISED
OF THE POSSIBILITY OF SUCH DAMAGES. NOTWITHSTANDING ANY OTHER PROVISION IN
THIS AGREEMENT, THE LIABILITY OF LICENSOR FOR ANY REASON AND UPON ANY CAUSE OF
ACTION SHALL BE LIMITED TO THE AMOUNT PAID TO LICENSOR BY LICENSEE UNDER THIS
AGREEMENT. THIS LIMITATION APPLIES TO ALL CAUSES OF ACTION IN THE AGGREGATE,
INCLUDING (WITHOUT LIMITATION) BREACH OF CONTRACT, BREACH OF WARRANTY,
NEGLIGENCE, MISREPRESENTATIONS AND OTHER TORTS. THE PARTIES AGREE THAT THE
REMEDIES AND LIMITATIONS HEREIN ALLOCATE THE RISKS BETWEEN THE PARTIES AS
AUTHORIZED BY APPLICABLE LAWS. THE LICENSE FEES ARE SET IN RELIANCE UPON THIS
ALLOCATION OF RISK AND THE EXCLUSION OF CERTAIN DAMAGES AS SET FORTH IN THIS
AGREEMENT.
10. Miscellaneous.
10.1 Interpretation.
Failure by Licensor to exercise any right or remedy does not signify
acceptance of the event giving rise to such right or remedy. No action arising
out of this License may be brought by Licensee more than one year after the
cause of action has accrued. If any part of this License is held by a court of
competent jurisdiction to be illegal or unenforceable, the validity or
enforceability of the remainder of this License shall not be affected and such
provision shall be deemed modified to the minimum extent necessary to make
such provision consistent with applicable law and, in its modified form, such
provision shall be enforceable and enforced. Licensor reserves the right not
to accept any Order Form. Any invoice issued by Licensor in connection with
this License shall be deemed a part of this Agreement. To the extent of any
inconsistency between an Order Form and an invoice issued by Licensor, the
terms and conditions of the invoice shall prevail; Licensee shall be deemed to
have accepted an invoice upon payment of such invoice. In the event that
Licensee placed an order by telephone or through an authorized sales
representative, the invoice issued by Licensor shall constitute the Order
Form. The terms and conditions of this Agreement shall replace and serve as a
novation of the terms and conditions of any commercial (i.e., non-GPL) license
purchased online by Licensee prior to August 2002.
10.2 Binding.
This Agreement will be binding upon and inure to the benefit of the parties,
their respective successors and permitted assigns. Except as otherwise
provided in Section 2, without the prior written consent of Licensor, Licensee
may not assign this License or its rights or obligations under this License to
any person or party, whether by operation of law or otherwise; any attempt by
Licensee to assign this License without Licensor's prior written consent shall
be null and void. There are no intended third party beneficiaries of this
License. The parties are, and shall remain, independent contractors; nothing
in this License is designed to create, nor shall create between them, a
partnership, joint venture, agency, or employment relationship.
10.3 Governing Law; Dispute Forum.
If Licensee's residence, principal place of business or place of organization
is in the United States of America ("USA"), then this License shall be deemed
to have been executed in the USA and shall be governed by the laws of the
State of Delaware, without regard to the conflict of laws provisions thereof.
If Licensee's residence, principal place of business or place of organization
is in any country other than the USA, then this License shall be deemed to
have been executed in Sweden and shall be governed by the laws of Sweden,
without regard to the conflict of laws provisions thereof. In no event shall
the United Nations Convention on Contracts for the International Sale of Goods
apply to, or govern, this License. The parties consent to the exclusive
jurisdiction of the courts of Sweden and the USA, as provided in this Section.
In the event that Licensor initiates an action in connection with this License
or any other dispute between the parties, the exclusive jurisdiction of such
action shall be in: (a) Newark, Delaware, if Licensee's residence, principal
place of business or place of organization is in the USA; or (b) Uppsala,
Sweden, if Licensee's residence, principal place of business or place of
organization is in any country other than the USA. In the event that Licensee
initiates an action in connection with this License or any other dispute
between the parties, the exclusive jurisdiction of such action shall be in
Stockholm, Sweden. Notwithstanding the foregoing, either party may bring a
counterclaim in an action in the same jurisdiction in which the originating
claim was filed, and either party may enforce any judgment rendered by such
court in any court of competent jurisdiction. Licensee shall comply at its own
expense with all relevant and applicable laws related to use and distribution
of the Licensed Software as permitted in this License. Notwithstanding the
foregoing, Licensor may seek injunctive or other equitable relief in any
jurisdiction in order to protect its intellectual property rights. The parties
have agreed to execute this License in the English language, and the English
language version of the Agreement will control for all purposes. Any action
brought under this License shall be conducted in the English language.
Licensee shall be responsible for Licensor's attorneys fees and other expenses
associated with the enforcement of this License or the collection of any
amounts due under this License.
10.4 Notice.
Unless otherwise agreed, any notice under this License shall be delivered and
addressed to Licensee at the address set forth on the Order Form, and to
Licensor at Bangardsgatan 8, 753 20, Uppsala, Sweden. Notice shall be deemed
received by any party: (a) on the day given, if personally delivered or if
sent by confirmed facsimile transmission, receipt verified; (b) on the third
day after deposit, if mailed by certified, first class, postage prepaid,
return receipt requested mail, or by reputable, expedited overnight courier;
or (c) on the fifth day after deposit, if sent by reputable, expedited
international courier. Either party may change its address for notice
purposes upon notice in accordance with this Section. Licensor may identify
Licensee as a commercial licensee, including on the MySQL web site.
10.5 GPL.
The GPL License shall continue to apply to any and all uses and distributions
of the Licensed Software undertaken by Licensee either prior to the Effective
Date, after termination, or otherwise outside the scope of this License. This
Agreement shall not be deemed to replace or otherwise amend any Licensee
rights or obligations pursuant to the GPL License with respect to any uses of
the Licensed Software described in the preceding sentence.
10.6 Entire Agreement.
This Agreement (including the Order Form and the invoice) comprises the entire
agreement, and supercedes and merges all prior proposals, understandings and
agreements, oral and written, between the parties relating to the subject
matter of this License. This Agreement may be amended or modified only in a
writing executed by both parties. To the extent of any conflict or
inconsistency between this License and any invoice or other document submitted
by Licensee to Licensor, this License will control. Licensor's acceptance of
any document shall not be construed as an acceptance of provisions which are
in any way in conflict or inconsistent with, or in addition to, this License,
unless such terms are separately and specifically accepted in writing by an
authorized officer of Licensor.
10.7 Print this License.
For record keeping purposes, we encourage Licensee to print this License and
the Order Form on the date that the Order Form is submitted.
......@@ -2,8 +2,9 @@ This is a release of MySQL, a dual-license SQL database server.
MySQL is brought to you by the MySQL team at MySQL AB.
License information can be found in these files:
- For GPL (free) distributions, see the COPYING file.
- For commercial distributions, see the MySQLEULA.txt file.
- For GPL (free) distributions, see the COPYING file and
the EXCEPTIONS-CLIENT file.
- For commercial distributions, see the LICENSE.mysql file.
For further information about MySQL or additional documentation, see:
......@@ -15,11 +16,10 @@ Some manual sections of special interest:
- If you are migrating from an older version of MySQL, please read the
"Upgrading from..." section first!
- To see what MySQL can do, take a look at the features section.
- For installation instructions, see the Installation chapter.
- For future plans, see the TODO appendix.
- For the new features/bugfix history, see the News appendix.
- For the currently known bugs/misfeatures (known errors) see the problems
appendix.
- For installation instructions, see the Installing and Upgrading chapter.
- For the new features/bugfix history, see the Change History appendix.
- For the currently known bugs/misfeatures (known errors) see the Problems
and Common Errors appendix.
- For a list of developers and other contributors, see the Credits
appendix.
......
......@@ -1835,6 +1835,30 @@ dnl END OF MYSQL_CHECK_NDBCLUSTER SECTION
dnl ---------------------------------------------------------------------------
dnl
dnl Macro to check time_t range: according to C standard
dnl array index myst be greater then 0 => if time_t is signed
dnl the code in the macros below won't compile.
dnl
AC_DEFUN([MYSQL_CHECK_TIME_T],[
AC_MSG_CHECKING(if time_t is unsigned)
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
[[
#include <time.h>
]],
[[
int array[(((time_t)-1) > 0) ? 1 : -1];
]] )
], [
AC_DEFINE([TIME_T_UNSIGNED], 1, [Define to 1 if time_t is unsigned])
AC_MSG_RESULT(yes)
],
[AC_MSG_RESULT(no)]
)
])
dnl By default, many hosts won't let programs access large files;
dnl one must use special compiler options to get large-file access to work.
dnl For more details about this brain damage please see:
......
......@@ -1824,6 +1824,13 @@ then
AC_MSG_ERROR("MySQL needs a off_t type.")
fi
dnl
dnl check if time_t is unsigned
dnl
MYSQL_CHECK_TIME_T
# do we need #pragma interface/#pragma implementation ?
# yes if it's gcc 2.x, and not icc pretending to be gcc, and not cygwin
AC_MSG_CHECKING(the need for @%:@pragma interface/implementation)
......
......@@ -38,6 +38,14 @@ typedef long my_time_t;
#define MY_TIME_T_MAX LONG_MAX
#define MY_TIME_T_MIN LONG_MIN
/* Time handling defaults */
#define TIMESTAMP_MAX_YEAR 2038
#define YY_PART_YEAR 70
#define TIMESTAMP_MIN_YEAR (1900 + YY_PART_YEAR - 1)
#define TIMESTAMP_MAX_VALUE INT_MAX32
#define TIMESTAMP_MIN_VALUE 1
#define YY_PART_YEAR 70
/* Flags to str_to_datetime */
......@@ -67,6 +75,30 @@ long calc_daynr(uint year,uint month,uint day);
void init_time(void);
/*
Function to check sanity of a TIMESTAMP value
DESCRIPTION
Check if a given MYSQL_TIME value fits in TIMESTAMP range.
This function doesn't make precise check, but rather a rough
estimate.
RETURN VALUES
FALSE The value seems sane
TRUE The MYSQL_TIME value is definitely out of range
*/
static inline bool validate_timestamp_range(const MYSQL_TIME *t)
{
if ((t->year > TIMESTAMP_MAX_YEAR || t->year < TIMESTAMP_MIN_YEAR) ||
(t->year == TIMESTAMP_MAX_YEAR && (t->month > 1 || t->day > 19)) ||
(t->year == TIMESTAMP_MIN_YEAR && (t->month < 12 || t->day < 31)))
return FALSE;
return TRUE;
}
my_time_t
my_system_gmt_sec(const MYSQL_TIME *t, long *my_timezone, bool *in_dst_time_gap);
......
......@@ -315,6 +315,7 @@ pthread_handler_decl(thr_find_all_keys,arg)
uint memavl,old_memavl,keys,sort_length;
uint idx, maxbuffer;
uchar **sort_keys=0;
DBUG_ENTER("thr_find_all_keys"); /* FIXME why no matching DBUG_RETURN ? */
LINT_INIT(keys);
......@@ -322,8 +323,9 @@ pthread_handler_decl(thr_find_all_keys,arg)
if (my_thread_init())
goto err;
DBUG_ENTER("thr_find_all_keys");
DBUG_PRINT("enter", ("master: %d", sort_param->master));
if (sort_param->sort_info->got_error)
goto err;
......
#
# show server variables
#
--disable_query_log
--echo ===== ENGINES =====
show engines;
--echo ===== VARIABLES =====
show variables;
--echo ===== STOP =====
--enable_query_log
#!/bin/sh
# Copyright (C) 1997-2002 MySQL AB
# Copyright (C) 1997-2006 MySQL AB
# For a more info consult the file COPYRIGHT distributed with this file
# This scripts creates the privilege tables db, host, user, tables_priv,
......@@ -7,19 +7,26 @@
if [ x$1 = x"--bin" ]; then
shift 1
BINARY_DIST=1
bindir=../bin
scriptdir=../bin
libexecdir=../libexec
# Check if it's a binary distribution or a 'make install'
if test -x ../libexec/mysqld
then
execdir=../libexec
elif test -x ../../sbin/mysqld # RPM installation
then
execdir=../../sbin
bindir=../../bin
scriptdir=../../bin
libexecdir=../../libexec
else
execdir=../bin
fi
bindir=../bin
BINARY_DIST=1
fix_bin=mysql-test
scriptdir=../bin
libexecdir=../libexec
else
execdir=../sql
bindir=../client
......
......@@ -182,6 +182,7 @@ our $opt_force;
our $opt_reorder= 0;
our $opt_enable_disabled;
our $opt_mem;
our $opt_report_features;
our $opt_gcov;
our $opt_gcov_err;
......@@ -423,10 +424,14 @@ sub main () {
if ( ! $need_im )
{
$opt_skip_im= 1;
}
}
initialize_servers();
if ( $opt_report_features ) {
run_report_features();
}
run_suite($opt_suite, $tests);
}
......@@ -462,7 +467,7 @@ sub initial_setup () {
$glob_hostname= mtr_short_hostname();
# 'basedir' is always parent of "mysql-test" directory
# Find the absolute path to the test directory
$glob_mysql_test_dir= cwd();
if ( $glob_cygwin_perl )
{
......@@ -470,11 +475,27 @@ sub initial_setup () {
$glob_mysql_test_dir= `cygpath -m "$glob_mysql_test_dir"`;
chomp($glob_mysql_test_dir);
}
$glob_basedir= dirname($glob_mysql_test_dir);
# In most cases, the base directory we find everything relative to,
# is the parent directory of the "mysql-test" directory. For source
# distributions, TAR binary distributions and some other packages.
$glob_basedir= dirname($glob_mysql_test_dir);
# In the RPM case, binaries and libraries are installed in the
# default system locations, instead of having our own private base
# directory. And we install "/usr/share/mysql-test". Moving up one
# more directory relative to "mysql-test" gives us a usable base
# directory for RPM installs.
if ( ! $opt_source_dist and ! -d "$glob_basedir/bin" )
{
$glob_basedir= dirname($glob_basedir);
}
# Expect mysql-bench to be located adjacent to the source tree, by default
$glob_mysql_bench_dir= "$glob_basedir/../mysql-bench"
unless defined $glob_mysql_bench_dir;
$glob_mysql_bench_dir= undef
unless -d $glob_mysql_bench_dir;
$path_my_basedir=
$opt_source_dist ? $glob_mysql_test_dir : $glob_basedir;
......@@ -504,6 +525,7 @@ sub initial_setup () {
"$path_client_bindir/mysqld-max",
"$glob_basedir/libexec/mysqld",
"$glob_basedir/bin/mysqld",
"$glob_basedir/sbin/mysqld",
"$glob_basedir/sql/release/mysqld",
"$glob_basedir/sql/debug/mysqld");
......@@ -670,6 +692,7 @@ sub command_line_setup () {
'mem' => \$opt_mem,
# Misc
'report-features' => \$opt_report_features,
'comment=s' => \$opt_comment,
'debug' => \$opt_debug,
'fast' => \$opt_fast,
......@@ -806,6 +829,13 @@ sub command_line_setup () {
$opt_vardir= "$glob_mysql_test_dir/$opt_vardir";
}
# Ensure a proper error message
mkpath("$opt_vardir");
unless ( -d $opt_vardir and -w $opt_vardir )
{
mtr_error("Writable 'var' directory is needed, use the '--vardir' option");
}
# --------------------------------------------------------------------------
# Set tmpdir
# --------------------------------------------------------------------------
......@@ -1327,7 +1357,9 @@ sub executable_setup_im () {
$exe_im=
mtr_exe_maybe_exists(
"$glob_basedir/server-tools/instance-manager/mysqlmanager",
"$glob_basedir/libexec/mysqlmanager");
"$glob_basedir/libexec/mysqlmanager",
"$glob_basedir/bin/mysqlmanager",
"$glob_basedir/sbin/mysqlmanager");
return ($exe_im eq "");
}
......@@ -4190,6 +4222,43 @@ sub run_check_testcase ($$) {
return $res;
}
##############################################################################
#
# Report the features that were compiled in
#
##############################################################################
sub run_report_features () {
my $args;
if ( ! $glob_use_embedded_server )
{
mysqld_start($master->[0],[],[]);
if ( ! $master->[0]->{'pid'} )
{
mtr_error("Can't start the mysqld server");
}
mysqld_wait_started($master->[0]);
}
my $tinfo = {};
$tinfo->{'name'} = 'report features';
$tinfo->{'result_file'} = undef;
$tinfo->{'component_id'} = 'mysqld';
$tinfo->{'path'} = 'include/report-features.test';
$tinfo->{'timezone'}= "GMT-3";
$tinfo->{'slave_num'} = 0;
$tinfo->{'master_opt'} = [];
$tinfo->{'slave_opt'} = [];
$tinfo->{'slave_mi'} = [];
$tinfo->{'comment'} = 'report server features';
run_mysqltest($tinfo);
if ( ! $glob_use_embedded_server )
{
stop_all_servers();
}
}
sub run_mysqltest ($) {
......@@ -4329,8 +4398,10 @@ sub run_mysqltest ($) {
mtr_add_arg($args, "--test-file");
mtr_add_arg($args, $tinfo->{'path'});
mtr_add_arg($args, "--result-file");
mtr_add_arg($args, $tinfo->{'result_file'});
if ( defined $tinfo->{'result_file'} ) {
mtr_add_arg($args, "--result-file");
mtr_add_arg($args, $tinfo->{'result_file'});
}
if ( $opt_record )
{
......@@ -4739,3 +4810,4 @@ HERE
mtr_exit(1);
}
......@@ -158,18 +158,29 @@ fi
# Misc. Definitions
#--
if [ -d ../sql ] ; then
# BASEDIR is always above mysql-test directory ...
MYSQL_TEST_DIR=`pwd`
cd ..
if [ -d ./sql ] ; then
SOURCE_DIST=1
else
BINARY_DIST=1
fi
#BASEDIR is always one above mysql-test directory
CWD=`pwd`
cd ..
BASEDIR=`pwd`
cd $CWD
MYSQL_TEST_DIR=$BASEDIR/mysql-test
# ... one level for tar.gz, two levels for a RPM installation
if [ -d ./bin ] ; then
# this is not perfect: we have
# /usr/share/mysql/ # mysql-test-run is here, so this is "$MYSQL_TEST_DIR"
# /usr/bin/ # with MySQL client programs
# so the existence of "/usr/share/bin/" would make this test fail.
BASEDIR=`pwd`
else
cd ..
BASEDIR=`pwd`
fi
cd $MYSQL_TEST_DIR
MYSQL_TEST_WINDIR=$MYSQL_TEST_DIR
MYSQLTEST_VARDIR=$MYSQL_TEST_DIR/var
export MYSQL_TEST_DIR MYSQL_TEST_WINDIR MYSQLTEST_VARDIR
......@@ -648,8 +659,15 @@ else
if test -x "$BASEDIR/libexec/mysqld"
then
MYSQLD="$VALGRIND $BASEDIR/libexec/mysqld"
else
elif test -x "$BASEDIR/bin/mysqld"
then
MYSQLD="$VALGRIND $BASEDIR/bin/mysqld"
elif test -x "$BASEDIR/sbin/mysqld"
then
MYSQLD="$VALGRIND $BASEDIR/sbin/mysqld"
else
$ECHO "Fatal error: Cannot find program mysqld in $BASEDIR/{libexec,bin,sbin}" 1>&2
exit 1
fi
CLIENT_BINDIR="$BASEDIR/bin"
if test -d "$BASEDIR/tests"
......@@ -1261,7 +1279,7 @@ start_master()
then
$ECHO "set args $master_args" > $GDB_MASTER_INIT$1
$ECHO "To start gdb for the master , type in another window:"
$ECHO "cd $CWD ; gdb -x $GDB_MASTER_INIT$1 $MASTER_MYSQLD"
$ECHO "cd $MYSQL_TEST_DIR ; gdb -x $GDB_MASTER_INIT$1 $MASTER_MYSQLD"
wait_for_master=1500
else
( $ECHO set args $master_args;
......@@ -1377,7 +1395,7 @@ start_slave()
then
$ECHO "set args $slave_args" > $GDB_SLAVE_INIT
echo "To start gdb for the slave, type in another window:"
echo "cd $CWD ; gdb -x $GDB_SLAVE_INIT $SLAVE_MYSQLD"
echo "cd $MYSQL_TEST_DIR ; gdb -x $GDB_SLAVE_INIT $SLAVE_MYSQLD"
wait_for_slave=1500
else
( $ECHO set args $slave_args;
......@@ -1606,10 +1624,13 @@ run_testcase ()
--result-file=*)
result_file=`$ECHO "$EXTRA_MASTER_OPT" | $SED -e "s;--result-file=;;"`
result_file="r/$result_file.result"
# Note that this must be set to space, not "" for test-reset to
# work
# Note that this must be set to space, not "" for test-reset to work
EXTRA_MASTER_OPT=" "
;;
--force-restart)
# Note that this must be set to space, not "" for test-reset to work
EXTRA_MASTER_OPT=" "
;;
esac
stop_master
stop_master 1
......
......@@ -485,12 +485,48 @@ unix_timestamp('1969-12-01 19:00:01')
select from_unixtime(-1);
from_unixtime(-1)
NULL
select from_unixtime(2145916800);
from_unixtime(2145916800)
select from_unixtime(2147483647);
from_unixtime(2147483647)
2038-01-19 06:14:07
select from_unixtime(2147483648);
from_unixtime(2147483648)
NULL
select from_unixtime(0);
from_unixtime(0)
1970-01-01 03:00:00
select unix_timestamp(from_unixtime(2147483647));
unix_timestamp(from_unixtime(2147483647))
2147483647
select unix_timestamp(from_unixtime(2147483648));
unix_timestamp(from_unixtime(2147483648))
NULL
select unix_timestamp('2039-01-20 01:00:00');
unix_timestamp('2039-01-20 01:00:00')
0
select unix_timestamp('1968-01-20 01:00:00');
unix_timestamp('1968-01-20 01:00:00')
0
select unix_timestamp('2038-02-10 01:00:00');
unix_timestamp('2038-02-10 01:00:00')
0
select unix_timestamp('1969-11-20 01:00:00');
unix_timestamp('1969-11-20 01:00:00')
0
select unix_timestamp('2038-01-20 01:00:00');
unix_timestamp('2038-01-20 01:00:00')
0
select unix_timestamp('1969-12-30 01:00:00');
unix_timestamp('1969-12-30 01:00:00')
0
select unix_timestamp('2038-01-17 12:00:00');
unix_timestamp('2038-01-17 12:00:00')
2147331600
select unix_timestamp('1970-01-01 03:00:01');
unix_timestamp('1970-01-01 03:00:01')
1
select unix_timestamp('2038-01-19 07:14:07');
unix_timestamp('2038-01-19 07:14:07')
0
CREATE TABLE t1 (datetime datetime, timestamp timestamp, date date, time time);
INSERT INTO t1 values ("2001-01-02 03:04:05", "2002-01-02 03:04:05", "2003-01-02", "06:07:08");
SELECT * from t1;
......
......@@ -54,3 +54,4 @@ Tables_in_test
t2
t4
drop table t2, t4;
End of 4.1 tests
......@@ -41,7 +41,7 @@ Warning 1299 Invalid TIMESTAMP value in column 'ts' at row 2
DROP TABLE t1;
select unix_timestamp('1970-01-01 01:00:00'),
unix_timestamp('1970-01-01 01:00:01'),
unix_timestamp('2038-01-01 00:59:59'),
unix_timestamp('2038-01-01 01:00:00');
unix_timestamp('1970-01-01 01:00:00') unix_timestamp('1970-01-01 01:00:01') unix_timestamp('2038-01-01 00:59:59') unix_timestamp('2038-01-01 01:00:00')
0 1 2145916799 0
unix_timestamp('2038-01-19 04:14:07'),
unix_timestamp('2038-01-19 04:14:08');
unix_timestamp('1970-01-01 01:00:00') unix_timestamp('1970-01-01 01:00:01') unix_timestamp('2038-01-19 04:14:07') unix_timestamp('2038-01-19 04:14:08')
0 1 2147483647 0
......@@ -106,7 +106,7 @@ create table t1 (ts timestamp);
set time_zone='UTC';
insert into t1 values ('0000-00-00 00:00:00'),('1969-12-31 23:59:59'),
('1970-01-01 00:00:00'),('1970-01-01 00:00:01'),
('2037-12-31 23:59:59'),('2038-01-01 00:00:00');
('2038-01-19 03:14:07'),('2038-01-19 03:14:08');
Warnings:
Warning 1264 Data truncated; out of range for column 'ts' at row 2
Warning 1264 Data truncated; out of range for column 'ts' at row 3
......@@ -117,13 +117,13 @@ ts
0000-00-00 00:00:00
0000-00-00 00:00:00
1970-01-01 00:00:01
2037-12-31 23:59:59
2038-01-19 03:14:07
0000-00-00 00:00:00
delete from t1;
set time_zone='MET';
insert into t1 values ('0000-00-00 00:00:00'),('1970-01-01 00:30:00'),
('1970-01-01 01:00:00'),('1970-01-01 01:00:01'),
('2038-01-01 00:59:59'),('2038-01-01 01:00:00');
('2038-01-19 04:14:07'),('2038-01-19 04:14:08');
Warnings:
Warning 1264 Data truncated; out of range for column 'ts' at row 2
Warning 1264 Data truncated; out of range for column 'ts' at row 3
......@@ -134,13 +134,13 @@ ts
0000-00-00 00:00:00
0000-00-00 00:00:00
1970-01-01 01:00:01
2038-01-01 00:59:59
2038-01-19 04:14:07
0000-00-00 00:00:00
delete from t1;
set time_zone='+01:30';
insert into t1 values ('0000-00-00 00:00:00'),('1970-01-01 01:00:00'),
('1970-01-01 01:30:00'),('1970-01-01 01:30:01'),
('2038-01-01 01:29:59'),('2038-01-01 01:30:00');
('2038-01-19 04:44:07'),('2038-01-19 04:44:08');
Warnings:
Warning 1264 Data truncated; out of range for column 'ts' at row 2
Warning 1264 Data truncated; out of range for column 'ts' at row 3
......@@ -151,7 +151,7 @@ ts
0000-00-00 00:00:00
0000-00-00 00:00:00
1970-01-01 01:30:01
2038-01-01 01:29:59
2038-01-19 04:44:07
0000-00-00 00:00:00
drop table t1;
show variables like 'time_zone';
......@@ -213,12 +213,12 @@ convert_tz('2003-10-26 02:59:59', 'MET', 'UTC')
select convert_tz('2003-10-26 04:00:00', 'MET', 'UTC');
convert_tz('2003-10-26 04:00:00', 'MET', 'UTC')
2003-10-26 03:00:00
select convert_tz('2038-01-01 00:59:59', 'MET', 'UTC');
convert_tz('2038-01-01 00:59:59', 'MET', 'UTC')
2037-12-31 23:59:59
select convert_tz('2038-01-01 01:00:00', 'MET', 'UTC');
convert_tz('2038-01-01 01:00:00', 'MET', 'UTC')
2038-01-01 01:00:00
select convert_tz('2038-01-19 04:14:07', 'MET', 'UTC');
convert_tz('2038-01-19 04:14:07', 'MET', 'UTC')
2038-01-19 03:14:07
select convert_tz('2038-01-19 04:14:08', 'MET', 'UTC');
convert_tz('2038-01-19 04:14:08', 'MET', 'UTC')
2038-01-19 04:14:08
select convert_tz('2103-01-01 04:00:00', 'MET', 'UTC');
convert_tz('2103-01-01 04:00:00', 'MET', 'UTC')
2103-01-01 04:00:00
......
select from_unixtime(0);
from_unixtime(0)
1969-12-31 14:00:00
select unix_timestamp('1969-12-31 14:00:01');
unix_timestamp('1969-12-31 14:00:01')
1
......@@ -236,16 +236,56 @@ select unix_timestamp(@a);
select unix_timestamp('1969-12-01 19:00:01');
#
# Test for bug #6439 "unix_timestamp() function returns wrong datetime
# values for too big argument" and bug #7515 "from_unixtime(0) now
# returns NULL instead of the epoch". unix_timestamp() should return error
# for too big or negative argument. It should return Epoch value for zero
# argument since it seems that many user's rely on this fact.
# Tests for bug #6439 "unix_timestamp() function returns wrong datetime
# values for too big argument", bug #7515 "from_unixtime(0) now
# returns NULL instead of the epoch" and bug #9191
# "TIMESTAMP/from_unixtime() no longer accepts 2^31-1."
# unix_timestamp() should return error for too big or negative argument.
# It should return Epoch value for zero argument since it seems that many
# users rely on this fact, from_unixtime() should work with values
# up to INT_MAX32 because of the same reason.
#
select from_unixtime(-1);
select from_unixtime(2145916800);
# check for from_unixtime(2^31-1) and from_unixtime(2^31)
select from_unixtime(2147483647);
select from_unixtime(2147483648);
select from_unixtime(0);
#
# Some more tests for bug #9191 "TIMESTAMP/from_unixtime() no
# longer accepts 2^31-1". Here we test that from_unixtime and
# unix_timestamp are consistent, when working with boundary dates.
#
select unix_timestamp(from_unixtime(2147483647));
select unix_timestamp(from_unixtime(2147483648));
# check for invalid dates
# bad year
select unix_timestamp('2039-01-20 01:00:00');
select unix_timestamp('1968-01-20 01:00:00');
# bad month
select unix_timestamp('2038-02-10 01:00:00');
select unix_timestamp('1969-11-20 01:00:00');
# bad day
select unix_timestamp('2038-01-20 01:00:00');
select unix_timestamp('1969-12-30 01:00:00');
#
# Check negative shift (we subtract several days for boundary dates during
# conversion).
select unix_timestamp('2038-01-17 12:00:00');
#
# Check positive shift. (it happens only on
# platfroms with unsigned time_t, such as QNX)
#
select unix_timestamp('1970-01-01 03:00:01');
# check bad date, close to the boundary (we cut them off in the very end)
select unix_timestamp('2038-01-19 07:14:07');
#
# Test types from + INTERVAL
#
......
......@@ -70,4 +70,8 @@ show tables;
drop table t2, t4;
# End of 4.1 tests
disconnect con2;
disconnect con1;
connection default;
--echo End of 4.1 tests
......@@ -52,11 +52,12 @@ INSERT INTO t1 (ts) VALUES ('2003-03-30 01:59:59'),
DROP TABLE t1;
#
# Test for fix for Bug#2523
# Test for fix for Bug#2523 Check that boundary dates are processed
# correctly.
#
select unix_timestamp('1970-01-01 01:00:00'),
unix_timestamp('1970-01-01 01:00:01'),
unix_timestamp('2038-01-01 00:59:59'),
unix_timestamp('2038-01-01 01:00:00');
unix_timestamp('2038-01-19 04:14:07'),
unix_timestamp('2038-01-19 04:14:08');
# End of 4.1 tests
......@@ -107,21 +107,21 @@ create table t1 (ts timestamp);
set time_zone='UTC';
insert into t1 values ('0000-00-00 00:00:00'),('1969-12-31 23:59:59'),
('1970-01-01 00:00:00'),('1970-01-01 00:00:01'),
('2037-12-31 23:59:59'),('2038-01-01 00:00:00');
('2038-01-19 03:14:07'),('2038-01-19 03:14:08');
select * from t1;
delete from t1;
# MET time zone has range shifted by one hour
set time_zone='MET';
insert into t1 values ('0000-00-00 00:00:00'),('1970-01-01 00:30:00'),
('1970-01-01 01:00:00'),('1970-01-01 01:00:01'),
('2038-01-01 00:59:59'),('2038-01-01 01:00:00');
('2038-01-19 04:14:07'),('2038-01-19 04:14:08');
select * from t1;
delete from t1;
# same for +01:30 time zone
set time_zone='+01:30';
insert into t1 values ('0000-00-00 00:00:00'),('1970-01-01 01:00:00'),
('1970-01-01 01:30:00'),('1970-01-01 01:30:01'),
('2038-01-01 01:29:59'),('2038-01-01 01:30:00');
('2038-01-19 04:44:07'),('2038-01-19 04:44:08');
select * from t1;
drop table t1;
......@@ -171,8 +171,8 @@ select convert_tz('2003-10-26 01:00:00', 'MET', 'UTC');
select convert_tz('2003-10-26 02:00:00', 'MET', 'UTC');
select convert_tz('2003-10-26 02:59:59', 'MET', 'UTC');
select convert_tz('2003-10-26 04:00:00', 'MET', 'UTC');
select convert_tz('2038-01-01 00:59:59', 'MET', 'UTC');
select convert_tz('2038-01-01 01:00:00', 'MET', 'UTC');
select convert_tz('2038-01-19 04:14:07', 'MET', 'UTC');
select convert_tz('2038-01-19 04:14:08', 'MET', 'UTC');
select convert_tz('2103-01-01 04:00:00', 'MET', 'UTC');
# Let us test variable time zone argument
......
#
# Tests for time functions. The difference from func_time test is the
# timezone. In func_time it's GMT-3. In our case it's GMT+10
#
#
# Test for bug bug #9191 "TIMESTAMP/from_unixtime() no longer accepts 2^31-1"
#
select from_unixtime(0);
# check 0 boundary
select unix_timestamp('1969-12-31 14:00:01');
......@@ -4,4 +4,7 @@
*/
#ifdef DEFINE_CXA_PURE_VIRTUAL
extern "C" { int __cxa_pure_virtual() { return 0;} }
#else
/* Some compiler/linker combinations fail on files without exported symbols. */
extern "C" { int dummy_export_symbol() { return 0;} }
#endif
......@@ -105,7 +105,7 @@ copyfileto()
copyfileto $BASE/docs ChangeLog Docs/mysql.info
copyfileto $BASE COPYING COPYING.LIB README Docs/INSTALL-BINARY \
EXCEPTIONS-CLIENT MySQLEULA.txt LICENSE.doc README.NW
EXCEPTIONS-CLIENT LICENSE.mysql
# Non platform-specific bin dir files:
BIN_FILES="extra/comp_err$BS extra/replace$BS extra/perror$BS \
......@@ -282,10 +282,7 @@ if [ $BASE_SYSTEM = "netware" ] ; then
$BASE/support-files/build-tags \
$BASE/support-files/MySQL-shared-compat.spec \
$BASE/support-files/ndb-config-2-node.ini \
$BASE/INSTALL-BINARY \
$BASE/MySQLEULA.txt
else
rm -f $BASE/README.NW
$BASE/INSTALL-BINARY
fi
# Make safe_mysqld a symlink to mysqld_safe for backwards portability
......
......@@ -714,14 +714,27 @@ long calc_daynr(uint year,uint month,uint day)
RETURN VALUE
Time in UTC seconds since Unix Epoch representation.
*/
my_time_t
my_system_gmt_sec(const MYSQL_TIME *t, long *my_timezone, bool *in_dst_time_gap)
my_time_t
my_system_gmt_sec(const MYSQL_TIME *t_src, long *my_timezone,
bool *in_dst_time_gap)
{
uint loop;
time_t tmp;
time_t tmp= 0;
int shift= 0;
MYSQL_TIME tmp_time;
MYSQL_TIME *t= &tmp_time;
struct tm *l_time,tm_tmp;
long diff, current_timezone;
/*
Use temp variable to avoid trashing input data, which could happen in
case of shift required for boundary dates processing.
*/
memcpy(&tmp_time, t_src, sizeof(MYSQL_TIME));
if (!validate_timestamp_range(t))
return 0;
/*
Calculate the gmt time based on current time and timezone
The -1 on the end is to ensure that if have a date that exists twice
......@@ -735,13 +748,89 @@ my_system_gmt_sec(const MYSQL_TIME *t, long *my_timezone, bool *in_dst_time_gap)
Note: this code assumes that our time_t estimation is not too far away
from real value (we assume that localtime_r(tmp) will return something
within 24 hrs from t) which is probably true for all current time zones.
Note2: For the dates, which have time_t representation close to
MAX_INT32 (efficient time_t limit for supported platforms), we should
do a small trick to avoid overflow. That is, convert the date, which is
two days earlier, and then add these days to the final value.
The same trick is done for the values close to 0 in time_t
representation for platfroms with unsigned time_t (QNX).
To be more verbose, here is a sample (extracted from the code below):
(calc_daynr(2038, 1, 19) - (long) days_at_timestart)*86400L + 4*3600L
would return -2147480896 because of the long type overflow. In result
we would get 1901 year in localtime_r(), which is an obvious error.
Alike problem raises with the dates close to Epoch. E.g.
(calc_daynr(1969, 12, 31) - (long) days_at_timestart)*86400L + 23*3600L
will give -3600.
On some platforms, (E.g. on QNX) time_t is unsigned and localtime(-3600)
wil give us a date around 2106 year. Which is no good.
Theoreticaly, there could be problems with the latter conversion:
there are at least two timezones, which had time switches near 1 Jan
of 1970 (because of political reasons). These are America/Hermosillo and
America/Mazatlan time zones. They changed their offset on
1970-01-01 08:00:00 UTC from UTC-8 to UTC-7. For these zones
the code below will give incorrect results for dates close to
1970-01-01, in the case OS takes into account these historical switches.
Luckily, it seems that we support only one platform with unsigned
time_t. It's QNX. And QNX does not support historical timezone data at all.
E.g. there are no /usr/share/zoneinfo/ files or any other mean to supply
historical information for localtime_r() etc. That is, the problem is not
relevant to QNX.
We are safe with shifts close to MAX_INT32, as there are no known
time switches on Jan 2038 yet :)
*/
tmp=(time_t) (((calc_daynr((uint) t->year,(uint) t->month,(uint) t->day) -
(long) days_at_timestart)*86400L + (long) t->hour*3600L +
(long) (t->minute*60 + t->second)) + (time_t) my_time_zone -
3600);
current_timezone= my_time_zone;
if ((t->year == TIMESTAMP_MAX_YEAR) && (t->month == 1) && (t->day > 4))
{
/*
Below we will pass (uint) (t->day - shift) to calc_daynr.
As we don't want to get an overflow here, we will shift
only safe dates. That's why we have (t->day > 4) above.
*/
t->day-= 2;
shift= 2;
}
#ifdef TIME_T_UNSIGNED
else
{
/*
We can get 0 in time_t representaion only on 1969, 31 of Dec or on
1970, 1 of Jan. For both dates we use shift, which is added
to t->day in order to step out a bit from the border.
This is required for platforms, where time_t is unsigned.
As far as I know, among the platforms we support it's only QNX.
Note: the order of below if-statements is significant.
*/
if ((t->year == TIMESTAMP_MIN_YEAR + 1) && (t->month == 1)
&& (t->day <= 10))
{
t->day+= 2;
shift= -2;
}
if ((t->year == TIMESTAMP_MIN_YEAR) && (t->month == 12)
&& (t->day == 31))
{
t->year++;
t->month= 1;
t->day= 2;
shift= -2;
}
}
#endif
tmp= (time_t) (((calc_daynr((uint) t->year, (uint) t->month, (uint) t->day) -
(long) days_at_timestart)*86400L + (long) t->hour*3600L +
(long) (t->minute*60 + t->second)) + (time_t) my_time_zone -
3600);
current_timezone= my_time_zone;
localtime_r(&tmp,&tm_tmp);
l_time=&tm_tmp;
for (loop=0;
......@@ -793,7 +882,24 @@ my_system_gmt_sec(const MYSQL_TIME *t, long *my_timezone, bool *in_dst_time_gap)
*in_dst_time_gap= 1;
}
*my_timezone= current_timezone;
/* shift back, if we were dealing with boundary dates */
tmp+= shift*86400L;
/*
This is possible for dates, which slightly exceed boundaries.
Conversion will pass ok for them, but we don't allow them.
First check will pass for platforms with signed time_t.
instruction above (tmp+= shift*86400L) could exceed
MAX_INT32 (== TIMESTAMP_MAX_VALUE) and overflow will happen.
So, tmp < TIMESTAMP_MIN_VALUE will be triggered. On platfroms
with unsigned time_t tmp+= shift*86400L might result in a number,
larger then TIMESTAMP_MAX_VALUE, so another check will work.
*/
if ((tmp < TIMESTAMP_MIN_VALUE) || (tmp > TIMESTAMP_MAX_VALUE))
tmp= 0;
end:
return (my_time_t) tmp;
} /* my_system_gmt_sec */
......
......@@ -1931,15 +1931,10 @@ bool Item_func_convert_tz::get_date(TIME *ltime,
return 1;
}
/* Check if we in range where we treat datetime values as non-UTC */
if (ltime->year < TIMESTAMP_MAX_YEAR && ltime->year > TIMESTAMP_MIN_YEAR ||
ltime->year==TIMESTAMP_MAX_YEAR && ltime->month==1 && ltime->day==1 ||
ltime->year==TIMESTAMP_MIN_YEAR && ltime->month==12 && ltime->day==31)
{
my_time_tmp= from_tz->TIME_to_gmt_sec(ltime, &not_used);
if (my_time_tmp >= TIMESTAMP_MIN_VALUE && my_time_tmp <= TIMESTAMP_MAX_VALUE)
to_tz->gmt_sec_to_TIME(ltime, my_time_tmp);
}
my_time_tmp= from_tz->TIME_to_gmt_sec(ltime, &not_used);
/* my_time_tmp is guranteed to be in the allowed range */
if (my_time_tmp)
to_tz->gmt_sec_to_TIME(ltime, my_time_tmp);
null_value= 0;
return 0;
......
......@@ -144,12 +144,6 @@ MY_LOCALE *my_locale_by_name(const char *name);
/* Characters shown for the command in 'show processlist' */
#define PROCESS_LIST_WIDTH 100
/* Time handling defaults */
#define TIMESTAMP_MAX_YEAR 2038
#define YY_PART_YEAR 70
#define TIMESTAMP_MIN_YEAR (1900 + YY_PART_YEAR - 1)
#define TIMESTAMP_MAX_VALUE 2145916799
#define TIMESTAMP_MIN_VALUE 1
#define PRECISION_FOR_DOUBLE 53
#define PRECISION_FOR_FLOAT 24
......
......@@ -230,14 +230,11 @@ my_time_t TIME_to_timestamp(THD *thd, const TIME *t, bool *in_dst_time_gap)
*in_dst_time_gap= 0;
if (t->year < TIMESTAMP_MAX_YEAR && t->year > TIMESTAMP_MIN_YEAR ||
t->year == TIMESTAMP_MAX_YEAR && t->month == 1 && t->day == 1 ||
t->year == TIMESTAMP_MIN_YEAR && t->month == 12 && t->day == 31)
timestamp= thd->variables.time_zone->TIME_to_gmt_sec(t, in_dst_time_gap);
if (timestamp)
{
thd->time_zone_used= 1;
timestamp= thd->variables.time_zone->TIME_to_gmt_sec(t, in_dst_time_gap);
if (timestamp >= TIMESTAMP_MIN_VALUE && timestamp <= TIMESTAMP_MAX_VALUE)
return timestamp;
return timestamp;
}
/* If we are here we have range error. */
......
......@@ -885,9 +885,14 @@ TIME_to_gmt_sec(const TIME *t, const TIME_ZONE_INFO *sp, bool *in_dst_time_gap)
my_time_t local_t;
uint saved_seconds;
uint i;
int shift= 0;
DBUG_ENTER("TIME_to_gmt_sec");
if (!validate_timestamp_range(t))
DBUG_RETURN(0);
/* We need this for correct leap seconds handling */
if (t->second < SECS_PER_MIN)
saved_seconds= 0;
......@@ -895,11 +900,29 @@ TIME_to_gmt_sec(const TIME *t, const TIME_ZONE_INFO *sp, bool *in_dst_time_gap)
saved_seconds= t->second;
/*
NOTE If we want to convert full my_time_t range without MySQL
restrictions we should catch overflow here somehow.
NOTE: to convert full my_time_t range we do a shift of the
boundary dates here to avoid overflow of my_time_t.
We use alike approach in my_system_gmt_sec().
However in that function we also have to take into account
overflow near 0 on some platforms. That's because my_system_gmt_sec
uses localtime_r(), which doesn't work with negative values correctly
on platforms with unsigned time_t (QNX). Here we don't use localtime()
=> we negative values of local_t are ok.
*/
local_t= sec_since_epoch(t->year, t->month, t->day,
if ((t->year == TIMESTAMP_MAX_YEAR) && (t->month == 1) && t->day > 4)
{
/*
We will pass (t->day - shift) to sec_since_epoch(), and
want this value to be a positive number, so we shift
only dates > 4.01.2038 (to avoid owerflow).
*/
shift= 2;
}
local_t= sec_since_epoch(t->year, t->month, (t->day - shift),
t->hour, t->minute,
saved_seconds ? 0 : t->second);
......@@ -918,6 +941,22 @@ TIME_to_gmt_sec(const TIME *t, const TIME_ZONE_INFO *sp, bool *in_dst_time_gap)
/* binary search for our range */
i= find_time_range(local_t, sp->revts, sp->revcnt);
/*
As there are no offset switches at the end of TIMESTAMP range,
we could simply check for overflow here (and don't need to bother
about DST gaps etc)
*/
if (shift)
{
if (local_t > (TIMESTAMP_MAX_VALUE - shift*86400L +
sp->revtis[i].rt_offset - saved_seconds))
{
DBUG_RETURN(0); /* my_time_t overflow */
}
else
local_t+= shift*86400L;
}
if (sp->revtis[i].rt_type)
{
/*
......@@ -927,10 +966,16 @@ TIME_to_gmt_sec(const TIME *t, const TIME_ZONE_INFO *sp, bool *in_dst_time_gap)
beginning of the gap.
*/
*in_dst_time_gap= 1;
DBUG_RETURN(sp->revts[i] - sp->revtis[i].rt_offset + saved_seconds);
local_t= sp->revts[i] - sp->revtis[i].rt_offset + saved_seconds;
}
else
DBUG_RETURN(local_t - sp->revtis[i].rt_offset + saved_seconds);
local_t= local_t - sp->revtis[i].rt_offset + saved_seconds;
/* check for TIMESTAMP_MAX_VALUE was already done above */
if (local_t < TIMESTAMP_MIN_VALUE)
local_t= 0;
DBUG_RETURN(local_t);
}
......@@ -1294,9 +1339,24 @@ Time_zone_offset::Time_zone_offset(long tz_offset_arg):
my_time_t
Time_zone_offset::TIME_to_gmt_sec(const TIME *t, bool *in_dst_time_gap) const
{
return sec_since_epoch(t->year, t->month, t->day,
t->hour, t->minute, t->second) -
offset;
my_time_t local_t;
/*
Check timestamp range.we have to do this as calling function relies on
us to make all validation checks here.
*/
if (!validate_timestamp_range(t))
return 0;
local_t= sec_since_epoch(t->year, t->month, t->day,
t->hour, t->minute, t->second) -
offset;
if (local_t >= TIMESTAMP_MIN_VALUE && local_t <= TIMESTAMP_MAX_VALUE)
return local_t;
/* range error*/
return 0;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment