Merge siva.hindu.god:/usr/home/tim/m/bk/g50
into siva.hindu.god:/usr/home/tim/m/bk/50
This commit is contained in:
commit
f204db4dd1
@ -334,7 +334,8 @@ history_truncate_file (fname, lines)
|
||||
file_size = (size_t)finfo.st_size;
|
||||
|
||||
/* check for overflow on very large files */
|
||||
if (file_size != finfo.st_size || file_size + 1 < file_size)
|
||||
if ((long long) file_size != (long long) finfo.st_size ||
|
||||
file_size + 1 < file_size)
|
||||
{
|
||||
close (file);
|
||||
#if defined (EFBIG)
|
||||
|
@ -7,7 +7,7 @@ AC_INIT(sql/mysqld.cc)
|
||||
AC_CANONICAL_SYSTEM
|
||||
# The Docs Makefile.am parses this line!
|
||||
# remember to also change ndb version below and update version.c in ndb
|
||||
AM_INIT_AUTOMAKE(mysql, 5.0.32)
|
||||
AM_INIT_AUTOMAKE(mysql, 5.0.34)
|
||||
AM_CONFIG_HEADER(config.h)
|
||||
|
||||
PROTOCOL_VERSION=10
|
||||
@ -19,7 +19,7 @@ SHARED_LIB_VERSION=$SHARED_LIB_MAJOR_VERSION:0:0
|
||||
# ndb version
|
||||
NDB_VERSION_MAJOR=5
|
||||
NDB_VERSION_MINOR=0
|
||||
NDB_VERSION_BUILD=32
|
||||
NDB_VERSION_BUILD=34
|
||||
NDB_VERSION_STATUS=""
|
||||
|
||||
# Set all version vars based on $VERSION. How do we do this more elegant ?
|
||||
|
@ -27,6 +27,9 @@ Created 1/8/1996 Heikki Tuuri
|
||||
#include "que0que.h"
|
||||
#include "rem0cmp.h"
|
||||
|
||||
/* Implement isspace() in a locale-independent way. (Bug #24299) */
|
||||
#define ib_isspace(c) strchr(" \v\f\t\r\n", c)
|
||||
|
||||
dict_sys_t* dict_sys = NULL; /* the dictionary system */
|
||||
|
||||
rw_lock_t dict_operation_lock; /* table create, drop, etc. reserve
|
||||
@ -2406,7 +2409,7 @@ dict_accept(
|
||||
|
||||
*success = FALSE;
|
||||
|
||||
while (isspace(*ptr)) {
|
||||
while (ib_isspace(*ptr)) {
|
||||
ptr++;
|
||||
}
|
||||
|
||||
@ -2451,7 +2454,7 @@ dict_scan_id(
|
||||
|
||||
*id = NULL;
|
||||
|
||||
while (isspace(*ptr)) {
|
||||
while (ib_isspace(*ptr)) {
|
||||
ptr++;
|
||||
}
|
||||
|
||||
@ -2482,7 +2485,7 @@ dict_scan_id(
|
||||
len++;
|
||||
}
|
||||
} else {
|
||||
while (!isspace(*ptr) && *ptr != '(' && *ptr != ')'
|
||||
while (!ib_isspace(*ptr) && *ptr != '(' && *ptr != ')'
|
||||
&& (accept_also_dot || *ptr != '.')
|
||||
&& *ptr != ',' && *ptr != '\0') {
|
||||
|
||||
@ -2512,12 +2515,12 @@ dict_scan_id(
|
||||
if (heap && !quote) {
|
||||
/* EMS MySQL Manager sometimes adds characters 0xA0 (in
|
||||
latin1, a 'non-breakable space') to the end of a table name.
|
||||
But isspace(0xA0) is not true, which confuses our foreign key
|
||||
parser. After the UTF-8 conversion in ha_innodb.cc, bytes 0xC2
|
||||
and 0xA0 are at the end of the string.
|
||||
After the UTF-8 conversion in ha_innodb.cc, bytes 0xC2
|
||||
and 0xA0 are at the end of the string, and ib_isspace()
|
||||
does not work for multi-byte UTF-8 characters.
|
||||
|
||||
TODO: we should lex the string using thd->charset_info, and
|
||||
my_isspace(). Only after that, convert id names to UTF-8. */
|
||||
In MySQL 5.1 we lex the string using thd->charset_info, and
|
||||
my_isspace(). This workaround is not needed there. */
|
||||
|
||||
b = (byte*)(*id);
|
||||
id_len = strlen((char*) b);
|
||||
@ -3006,11 +3009,11 @@ loop:
|
||||
|
||||
ut_a(success);
|
||||
|
||||
if (!isspace(*ptr) && *ptr != '"' && *ptr != '`') {
|
||||
if (!ib_isspace(*ptr) && *ptr != '"' && *ptr != '`') {
|
||||
goto loop;
|
||||
}
|
||||
|
||||
while (isspace(*ptr)) {
|
||||
while (ib_isspace(*ptr)) {
|
||||
ptr++;
|
||||
}
|
||||
|
||||
@ -3052,7 +3055,7 @@ loop:
|
||||
goto loop;
|
||||
}
|
||||
|
||||
if (!isspace(*ptr)) {
|
||||
if (!ib_isspace(*ptr)) {
|
||||
goto loop;
|
||||
}
|
||||
|
||||
@ -3140,7 +3143,7 @@ col_loop1:
|
||||
}
|
||||
ptr = dict_accept(ptr, "REFERENCES", &success);
|
||||
|
||||
if (!success || !isspace(*ptr)) {
|
||||
if (!success || !ib_isspace(*ptr)) {
|
||||
dict_foreign_report_syntax_err(name, start_of_latest_foreign,
|
||||
ptr);
|
||||
return(DB_CANNOT_ADD_CONSTRAINT);
|
||||
@ -3527,7 +3530,7 @@ loop:
|
||||
|
||||
ptr = dict_accept(ptr, "DROP", &success);
|
||||
|
||||
if (!isspace(*ptr)) {
|
||||
if (!ib_isspace(*ptr)) {
|
||||
|
||||
goto loop;
|
||||
}
|
||||
|
@ -19,6 +19,8 @@ Created 9/17/2000 Heikki Tuuri
|
||||
#include "btr0pcur.h"
|
||||
#include "trx0types.h"
|
||||
|
||||
extern ibool row_rollback_on_timeout;
|
||||
|
||||
typedef struct row_prebuilt_struct row_prebuilt_t;
|
||||
|
||||
/***********************************************************************
|
||||
|
@ -61,8 +61,12 @@ Creates, or rather, initializes an rw-lock object in a specified memory
|
||||
location (which must be appropriately aligned). The rw-lock is initialized
|
||||
to the non-locked state. Explicit freeing of the rw-lock with rw_lock_free
|
||||
is necessary only if the memory block containing it is freed. */
|
||||
#define rw_lock_create(L) rw_lock_create_func((L), __FILE__, __LINE__, #L)
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
# define rw_lock_create(L) rw_lock_create_func((L), #L, __FILE__, __LINE__)
|
||||
#else /* UNIV_DEBUG */
|
||||
# define rw_lock_create(L) rw_lock_create_func((L), __FILE__, __LINE__)
|
||||
#endif /* UNIV_DEBUG */
|
||||
|
||||
/*=====================*/
|
||||
/**********************************************************************
|
||||
Creates, or rather, initializes an rw-lock object in a specified memory
|
||||
@ -74,9 +78,11 @@ void
|
||||
rw_lock_create_func(
|
||||
/*================*/
|
||||
rw_lock_t* lock, /* in: pointer to memory */
|
||||
#ifdef UNIV_DEBUG
|
||||
const char* cmutex_name, /* in: mutex name */
|
||||
#endif /* UNIV_DEBUG */
|
||||
const char* cfile_name, /* in: file name where created */
|
||||
ulint cline, /* in: file line where created */
|
||||
const char* cmutex_name); /* in: mutex name */
|
||||
ulint cline); /* in: file line where created */
|
||||
/**********************************************************************
|
||||
Calling this function is obligatory only if the memory buffer containing
|
||||
the rw-lock is freed. Removes an rw-lock object from the global list. The
|
||||
|
@ -39,7 +39,11 @@ location (which must be appropriately aligned). The mutex is initialized
|
||||
in the reset state. Explicit freeing of the mutex with mutex_free is
|
||||
necessary only if the memory block containing it is freed. */
|
||||
|
||||
#define mutex_create(M) mutex_create_func((M), __FILE__, __LINE__, #M)
|
||||
#ifdef UNIV_DEBUG
|
||||
# define mutex_create(M) mutex_create_func((M), #M, __FILE__, __LINE__)
|
||||
#else
|
||||
# define mutex_create(M) mutex_create_func((M), __FILE__, __LINE__)
|
||||
#endif
|
||||
/*===================*/
|
||||
/**********************************************************************
|
||||
Creates, or rather, initializes a mutex object in a specified memory
|
||||
@ -51,9 +55,11 @@ void
|
||||
mutex_create_func(
|
||||
/*==============*/
|
||||
mutex_t* mutex, /* in: pointer to memory */
|
||||
#ifdef UNIV_DEBUG
|
||||
const char* cmutex_name, /* in: mutex name */
|
||||
#endif /* UNIV_DEBUG */
|
||||
const char* cfile_name, /* in: file name where created */
|
||||
ulint cline, /* in: file line where created */
|
||||
const char* cmutex_name); /* in: mutex name */
|
||||
ulint cline); /* in: file line where created */
|
||||
/**********************************************************************
|
||||
Calling this function is obligatory only if the memory buffer containing
|
||||
the mutex is freed. Removes a mutex object from the mutex list. The mutex
|
||||
@ -479,15 +485,17 @@ struct mutex_struct {
|
||||
ulint cline; /* Line where created */
|
||||
ulint magic_n;
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
ulong count_using; /* count of times mutex used */
|
||||
ulong count_spin_loop; /* count of spin loops */
|
||||
ulong count_spin_rounds; /* count of spin rounds */
|
||||
ulong count_os_wait; /* count of os_wait */
|
||||
ulong count_os_yield; /* count of os_wait */
|
||||
ulonglong lspent_time; /* mutex os_wait timer msec */
|
||||
ulonglong lmax_spent_time; /* mutex os_wait timer msec */
|
||||
const char* cmutex_name;/* mutex name */
|
||||
ulint mutex_type;/* 0 - usual mutex 1 - rw_lock mutex */
|
||||
ulong count_os_wait; /* count of os_wait */
|
||||
# ifdef UNIV_DEBUG
|
||||
ulong count_using; /* count of times mutex used */
|
||||
ulong count_spin_loop; /* count of spin loops */
|
||||
ulong count_spin_rounds; /* count of spin rounds */
|
||||
ulong count_os_yield; /* count of os_wait */
|
||||
ulonglong lspent_time; /* mutex os_wait timer msec */
|
||||
ulonglong lmax_spent_time; /* mutex os_wait timer msec */
|
||||
const char* cmutex_name;/* mutex name */
|
||||
ulint mutex_type;/* 0 - usual mutex 1 - rw_lock mutex */
|
||||
# endif /* UNIV_DEBUG */
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
};
|
||||
|
||||
|
@ -250,9 +250,9 @@ mutex_enter_func(
|
||||
/* Note that we do not peek at the value of lock_word before trying
|
||||
the atomic test_and_set; we could peek, and possibly save time. */
|
||||
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
#if defined UNIV_DEBUG && !defined UNIV_HOTBACKUP
|
||||
mutex->count_using++;
|
||||
#endif /* UNIV_HOTBACKUP */
|
||||
#endif /* UNIV_DEBUG && !UNIV_HOTBACKUP */
|
||||
|
||||
if (!mutex_test_and_set(mutex))
|
||||
{
|
||||
|
@ -33,6 +33,7 @@ Created 9/20/1997 Heikki Tuuri
|
||||
#include "btr0cur.h"
|
||||
#include "dict0boot.h"
|
||||
#include "fil0fil.h"
|
||||
#include "sync0sync.h"
|
||||
|
||||
#ifdef UNIV_HOTBACKUP
|
||||
/* This is set to FALSE if the backup was originally taken with the
|
||||
@ -2969,6 +2970,15 @@ recv_recovery_from_checkpoint_finish(void)
|
||||
#ifndef UNIV_LOG_DEBUG
|
||||
recv_sys_free();
|
||||
#endif
|
||||
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
/* Wait for a while so that created threads have time to suspend
|
||||
themselves before we switch the latching order checks on */
|
||||
os_thread_sleep(1000000);
|
||||
|
||||
/* Switch latching order checks on in sync0sync.c */
|
||||
sync_order_checks_on = TRUE;
|
||||
#endif
|
||||
if (srv_force_recovery < SRV_FORCE_NO_TRX_UNDO) {
|
||||
/* Rollback the uncommitted transactions which have no user
|
||||
session */
|
||||
|
@ -35,6 +35,9 @@ Created 9/17/2000 Heikki Tuuri
|
||||
/* A dummy variable used to fool the compiler */
|
||||
ibool row_mysql_identically_false = FALSE;
|
||||
|
||||
/* Provide optional 4.x backwards compatibility for 5.0 and above */
|
||||
ibool row_rollback_on_timeout = FALSE;
|
||||
|
||||
/* List of tables we should drop in background. ALTER TABLE in MySQL requires
|
||||
that the table handler can drop the table in background when there are no
|
||||
queries to it any more. Protected by the kernel mutex. */
|
||||
@ -514,7 +517,9 @@ handle_new_error:
|
||||
return(TRUE);
|
||||
|
||||
} else if (err == DB_DEADLOCK
|
||||
|| err == DB_LOCK_TABLE_FULL) {
|
||||
|| err == DB_LOCK_TABLE_FULL
|
||||
|| (err == DB_LOCK_WAIT_TIMEOUT
|
||||
&& row_rollback_on_timeout)) {
|
||||
/* Roll back the whole transaction; this resolution was added
|
||||
to version 3.23.43 */
|
||||
|
||||
@ -522,6 +527,10 @@ handle_new_error:
|
||||
|
||||
} else if (err == DB_OUT_OF_FILE_SPACE
|
||||
|| err == DB_LOCK_WAIT_TIMEOUT) {
|
||||
|
||||
ut_ad(!(err == DB_LOCK_WAIT_TIMEOUT
|
||||
&& row_rollback_on_timeout));
|
||||
|
||||
if (savept) {
|
||||
/* Roll back the latest, possibly incomplete
|
||||
insertion or update */
|
||||
|
@ -1554,17 +1554,6 @@ innobase_start_or_create_for_mysql(void)
|
||||
srv_was_started = TRUE;
|
||||
srv_is_being_started = FALSE;
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
/* Wait a while so that the created threads have time to suspend
|
||||
themselves before we switch sync debugging on; otherwise a thread may
|
||||
execute mutex_enter() before the checks are on, and mutex_exit() after
|
||||
the checks are on, which will cause an assertion failure in sync
|
||||
debug. */
|
||||
|
||||
os_thread_sleep(3000000);
|
||||
#endif
|
||||
sync_order_checks_on = TRUE;
|
||||
|
||||
if (trx_doublewrite == NULL) {
|
||||
/* Create the doublewrite buffer to a new tablespace */
|
||||
|
||||
|
@ -89,9 +89,11 @@ void
|
||||
rw_lock_create_func(
|
||||
/*================*/
|
||||
rw_lock_t* lock, /* in: pointer to memory */
|
||||
#ifdef UNIV_DEBUG
|
||||
const char* cmutex_name, /* in: mutex name */
|
||||
#endif /* UNIV_DEBUG */
|
||||
const char* cfile_name, /* in: file name where created */
|
||||
ulint cline, /* in: file line where created */
|
||||
const char* cmutex_name) /* in: mutex name */
|
||||
ulint cline) /* in: file line where created */
|
||||
{
|
||||
/* If this is the very first time a synchronization
|
||||
object is created, then the following call initializes
|
||||
@ -102,10 +104,10 @@ rw_lock_create_func(
|
||||
|
||||
lock->mutex.cfile_name = cfile_name;
|
||||
lock->mutex.cline = cline;
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
lock->mutex.cmutex_name = cmutex_name;
|
||||
lock->mutex.mutex_type = 1;
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
#if defined UNIV_DEBUG && !defined UNIV_HOTBACKUP
|
||||
lock->mutex.cmutex_name = cmutex_name;
|
||||
lock->mutex.mutex_type = 1;
|
||||
#endif /* UNIV_DEBUG && !UNIV_HOTBACKUP */
|
||||
|
||||
rw_lock_set_waiters(lock, 0);
|
||||
rw_lock_set_writer(lock, RW_LOCK_NOT_LOCKED);
|
||||
|
@ -202,9 +202,11 @@ void
|
||||
mutex_create_func(
|
||||
/*==============*/
|
||||
mutex_t* mutex, /* in: pointer to memory */
|
||||
#ifdef UNIV_DEBUG
|
||||
const char* cmutex_name, /* in: mutex name */
|
||||
#endif /* UNIV_DEBUG */
|
||||
const char* cfile_name, /* in: file name where created */
|
||||
ulint cline, /* in: file line where created */
|
||||
const char* cmutex_name) /* in: mutex name */
|
||||
ulint cline) /* in: file line where created */
|
||||
{
|
||||
#if defined(_WIN32) && defined(UNIV_CAN_USE_X86_ASSEMBLER)
|
||||
mutex_reset_lock_word(mutex);
|
||||
@ -223,6 +225,8 @@ mutex_create_func(
|
||||
mutex->cfile_name = cfile_name;
|
||||
mutex->cline = cline;
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
mutex->count_os_wait = 0;
|
||||
# ifdef UNIV_DEBUG
|
||||
mutex->cmutex_name= cmutex_name;
|
||||
mutex->count_using= 0;
|
||||
mutex->mutex_type= 0;
|
||||
@ -230,8 +234,8 @@ mutex_create_func(
|
||||
mutex->lmax_spent_time= 0;
|
||||
mutex->count_spin_loop= 0;
|
||||
mutex->count_spin_rounds= 0;
|
||||
mutex->count_os_wait= 0;
|
||||
mutex->count_os_yield= 0;
|
||||
# endif /* UNIV_DEBUG */
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
|
||||
/* Check that lock_word is aligned; this is important on Intel */
|
||||
@ -378,13 +382,13 @@ mutex_spin_wait(
|
||||
{
|
||||
ulint index; /* index of the reserved wait cell */
|
||||
ulint i; /* spin round count */
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
#if defined UNIV_DEBUG && !defined UNIV_HOTBACKUP
|
||||
ib_longlong lstart_time = 0, lfinish_time; /* for timing os_wait */
|
||||
ulint ltime_diff;
|
||||
ulint sec;
|
||||
ulint ms;
|
||||
uint timer_started = 0;
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
#endif /* UNIV_DEBUG && !UNIV_HOTBACKUP */
|
||||
ut_ad(mutex);
|
||||
|
||||
mutex_loop:
|
||||
@ -398,10 +402,10 @@ mutex_loop:
|
||||
memory word. */
|
||||
|
||||
spin_loop:
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
#if defined UNIV_DEBUG && !defined UNIV_HOTBACKUP
|
||||
mutex_spin_wait_count++;
|
||||
mutex->count_spin_loop++;
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
#endif /* UNIV_DEBUG && !UNIV_HOTBACKUP */
|
||||
|
||||
while (mutex_get_lock_word(mutex) != 0 && i < SYNC_SPIN_ROUNDS)
|
||||
{
|
||||
@ -415,7 +419,7 @@ spin_loop:
|
||||
|
||||
if (i == SYNC_SPIN_ROUNDS)
|
||||
{
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
#if defined UNIV_DEBUG && !defined UNIV_HOTBACKUP
|
||||
mutex->count_os_yield++;
|
||||
if (timed_mutexes == 1 && timer_started==0)
|
||||
{
|
||||
@ -423,7 +427,7 @@ spin_loop:
|
||||
lstart_time= (ib_longlong)sec * 1000000 + ms;
|
||||
timer_started = 1;
|
||||
}
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
#endif /* UNIV_DEBUG && !UNIV_HOTBACKUP */
|
||||
os_thread_yield();
|
||||
}
|
||||
|
||||
@ -436,9 +440,9 @@ spin_loop:
|
||||
|
||||
mutex_spin_round_count += i;
|
||||
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
#if defined UNIV_DEBUG && !defined UNIV_HOTBACKUP
|
||||
mutex->count_spin_rounds += i;
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
#endif /* UNIV_DEBUG && !UNIV_HOTBACKUP */
|
||||
|
||||
if (mutex_test_and_set(mutex) == 0)
|
||||
{
|
||||
@ -522,6 +526,7 @@ Now there is no risk of infinite wait on the event. */
|
||||
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
mutex->count_os_wait++;
|
||||
# ifdef UNIV_DEBUG
|
||||
/*
|
||||
!!!!! Sometimes os_wait can be called without os_thread_yield
|
||||
*/
|
||||
@ -532,13 +537,14 @@ Now there is no risk of infinite wait on the event. */
|
||||
lstart_time= (ib_longlong)sec * 1000000 + ms;
|
||||
timer_started = 1;
|
||||
}
|
||||
# endif /* UNIV_DEBUG */
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
|
||||
sync_array_wait_event(sync_primary_wait_array, index);
|
||||
goto mutex_loop;
|
||||
|
||||
finish_timing:
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
#if defined UNIV_DEBUG && !defined UNIV_HOTBACKUP
|
||||
if (timed_mutexes == 1 && timer_started==1)
|
||||
{
|
||||
ut_usectime(&sec, &ms);
|
||||
@ -551,7 +557,7 @@ finish_timing:
|
||||
mutex->lmax_spent_time= ltime_diff;
|
||||
}
|
||||
}
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
#endif /* UNIV_DEBUG && !UNIV_HOTBACKUP */
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -129,9 +129,27 @@ trx_rollback_for_mysql(
|
||||
}
|
||||
|
||||
trx->op_info = "rollback";
|
||||
|
||||
err = trx_general_rollback_for_mysql(trx, FALSE, NULL);
|
||||
|
||||
/* If we are doing the XA recovery of prepared transactions, then
|
||||
the transaction object does not have an InnoDB session object, and we
|
||||
set a dummy session that we use for all MySQL transactions. */
|
||||
|
||||
mutex_enter(&kernel_mutex);
|
||||
|
||||
if (trx->sess == NULL) {
|
||||
/* Open a dummy session */
|
||||
|
||||
if (!trx_dummy_sess) {
|
||||
trx_dummy_sess = sess_open();
|
||||
}
|
||||
|
||||
trx->sess = trx_dummy_sess;
|
||||
}
|
||||
|
||||
mutex_exit(&kernel_mutex);
|
||||
|
||||
err = trx_general_rollback_for_mysql(trx, FALSE, NULL);
|
||||
|
||||
trx->op_info = "";
|
||||
|
||||
return(err);
|
||||
|
@ -1601,7 +1601,25 @@ trx_commit_for_mysql(
|
||||
ut_a(trx);
|
||||
|
||||
trx->op_info = "committing";
|
||||
|
||||
/* If we are doing the XA recovery of prepared transactions, then
|
||||
the transaction object does not have an InnoDB session object, and we
|
||||
set the dummy session that we use for all MySQL transactions. */
|
||||
|
||||
mutex_enter(&kernel_mutex);
|
||||
|
||||
if (trx->sess == NULL) {
|
||||
/* Open a dummy session */
|
||||
|
||||
if (!trx_dummy_sess) {
|
||||
trx_dummy_sess = sess_open();
|
||||
}
|
||||
|
||||
trx->sess = trx_dummy_sess;
|
||||
}
|
||||
|
||||
mutex_exit(&kernel_mutex);
|
||||
|
||||
trx_start_if_not_started(trx);
|
||||
|
||||
mutex_enter(&kernel_mutex);
|
||||
|
37
mysql-test/include/innodb_rollback_on_timeout.inc
Normal file
37
mysql-test/include/innodb_rollback_on_timeout.inc
Normal file
@ -0,0 +1,37 @@
|
||||
#
|
||||
# Bug #24200: Provide backwards compatibility mode for 4.x "rollback on
|
||||
# transaction timeout"
|
||||
#
|
||||
show variables like 'innodb_rollback_on_timeout';
|
||||
create table t1 (a int unsigned not null primary key) engine = innodb;
|
||||
insert into t1 values (1);
|
||||
commit;
|
||||
connect (con1,localhost,root,,);
|
||||
connect (con2,localhost,root,,);
|
||||
|
||||
connection con2;
|
||||
begin work;
|
||||
insert into t1 values (2);
|
||||
select * from t1;
|
||||
|
||||
connection con1;
|
||||
begin work;
|
||||
insert into t1 values (5);
|
||||
select * from t1;
|
||||
# Lock wait timeout set to 2 seconds in <THIS TEST>-master.opt; this
|
||||
# statement will time out; in 5.0.13+, it will not roll back transaction.
|
||||
--error ER_LOCK_WAIT_TIMEOUT
|
||||
insert into t1 values (2);
|
||||
# On 5.0.13+, this should give ==> 1, 5
|
||||
select * from t1;
|
||||
commit;
|
||||
|
||||
connection con2;
|
||||
select * from t1;
|
||||
commit;
|
||||
|
||||
connection default;
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
disconnect con1;
|
||||
disconnect con2;
|
@ -10,10 +10,16 @@ use Fcntl ':flock';
|
||||
# Requested IDs are stored in a hash and released upon END.
|
||||
#
|
||||
my %mtr_unique_assigned_ids = ();
|
||||
my $mtr_unique_pid;
|
||||
BEGIN {
|
||||
$mtr_unique_pid = $$ unless defined $mtr_unique_pid;
|
||||
}
|
||||
END {
|
||||
while(my ($id,$file) = each(%mtr_unique_assigned_ids)) {
|
||||
print "Autoreleasing $file:$id\n";
|
||||
mtr_release_unique_id($file, $id);
|
||||
if($mtr_unique_pid == $$) {
|
||||
while(my ($id,$file) = each(%mtr_unique_assigned_ids)) {
|
||||
print "Autoreleasing $file:$id\n";
|
||||
mtr_release_unique_id($file, $id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -58,6 +58,7 @@ $Devel::Trace::TRACE= 0; # Don't trace boring init stuff
|
||||
use File::Path;
|
||||
use File::Basename;
|
||||
use File::Copy;
|
||||
use File::Temp qw / tempdir /;
|
||||
use Cwd;
|
||||
use Getopt::Long;
|
||||
use Sys::Hostname;
|
||||
@ -1032,6 +1033,11 @@ sub command_line_setup () {
|
||||
my $sockdir = $opt_tmpdir;
|
||||
$sockdir =~ s|/+$||;
|
||||
|
||||
# On some operating systems, there is a limit to the length of a
|
||||
# UNIX domain socket's path far below PATH_MAX, so try to avoid long
|
||||
# socket path names.
|
||||
$sockdir = tempdir(CLEANUP => 1) if ( length($sockdir) > 80 );
|
||||
|
||||
# Put this into a hash, will be a C struct
|
||||
|
||||
$master->[0]=
|
||||
|
@ -1916,4 +1916,16 @@ CHAR(0xff,0x8f USING utf8) IS NULL
|
||||
Warnings:
|
||||
Error 1300 Invalid utf8 character string: 'FF8F'
|
||||
SET SQL_MODE=@orig_sql_mode;
|
||||
select substring('abc', cast(2 as unsigned int));
|
||||
substring('abc', cast(2 as unsigned int))
|
||||
bc
|
||||
select repeat('a', cast(2 as unsigned int));
|
||||
repeat('a', cast(2 as unsigned int))
|
||||
aa
|
||||
select rpad('abc', cast(5 as unsigned integer), 'x');
|
||||
rpad('abc', cast(5 as unsigned integer), 'x')
|
||||
abcxx
|
||||
select lpad('abc', cast(5 as unsigned integer), 'x');
|
||||
lpad('abc', cast(5 as unsigned integer), 'x')
|
||||
xxabc
|
||||
End of 5.0 tests
|
||||
|
@ -673,6 +673,22 @@ POINT(10 10)
|
||||
select (asWKT(geomfromwkb((0x010100000000000000000024400000000000002440))));
|
||||
(asWKT(geomfromwkb((0x010100000000000000000024400000000000002440))))
|
||||
POINT(10 10)
|
||||
create table t1 (g GEOMETRY);
|
||||
select * from t1;
|
||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||
def test t1 t1 g g 255 4294967295 0 Y 144 0 63
|
||||
g
|
||||
select asbinary(g) from t1;
|
||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||
def asbinary(g) 252 8192 0 Y 128 0 63
|
||||
asbinary(g)
|
||||
drop table t1;
|
||||
create table t1 (a TEXT, b GEOMETRY NOT NULL, SPATIAL KEY(b));
|
||||
alter table t1 disable keys;
|
||||
load data infile '../std_data_ln/bad_gis_data.dat' into table t1;
|
||||
ERROR 22004: Column was set to data type implicit default; NULL supplied for NOT NULL column 'b' at row 1
|
||||
alter table t1 enable keys;
|
||||
drop table t1;
|
||||
create table t1 (s1 geometry not null,s2 char(100));
|
||||
create trigger t1_bu before update on t1 for each row set new.s1 = null;
|
||||
insert into t1 values (null,null);
|
||||
@ -696,16 +712,6 @@ alter table t1 add primary key pti(pt);
|
||||
ERROR 42000: BLOB/TEXT column 'pt' used in key specification without a key length
|
||||
alter table t1 add primary key pti(pt(20));
|
||||
drop table t1;
|
||||
create table t1 (g GEOMETRY);
|
||||
select * from t1;
|
||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||
def test t1 t1 g g 255 4294967295 0 Y 144 0 63
|
||||
g
|
||||
select asbinary(g) from t1;
|
||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||
def asbinary(g) 252 8192 0 Y 128 0 63
|
||||
asbinary(g)
|
||||
drop table t1;
|
||||
create table t1 select GeomFromText('point(1 1)');
|
||||
desc t1;
|
||||
Field Type Null Key Default Extra
|
||||
|
@ -383,4 +383,40 @@ EXPLAIN SELECT SQL_BIG_RESULT b, SUM(c) FROM t1 GROUP BY b;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 128 Using filesort
|
||||
DROP TABLE t1;
|
||||
show variables like 'innodb_rollback_on_timeout';
|
||||
Variable_name Value
|
||||
innodb_rollback_on_timeout OFF
|
||||
create table t1 (a int unsigned not null primary key) engine = innodb;
|
||||
insert into t1 values (1);
|
||||
commit;
|
||||
begin work;
|
||||
insert into t1 values (2);
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
2
|
||||
begin work;
|
||||
insert into t1 values (5);
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
5
|
||||
insert into t1 values (2);
|
||||
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
5
|
||||
commit;
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
2
|
||||
commit;
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
2
|
||||
5
|
||||
drop table t1;
|
||||
End of 5.0 tests
|
||||
|
35
mysql-test/r/innodb_timeout_rollback.result
Normal file
35
mysql-test/r/innodb_timeout_rollback.result
Normal file
@ -0,0 +1,35 @@
|
||||
show variables like 'innodb_rollback_on_timeout';
|
||||
Variable_name Value
|
||||
innodb_rollback_on_timeout ON
|
||||
create table t1 (a int unsigned not null primary key) engine = innodb;
|
||||
insert into t1 values (1);
|
||||
commit;
|
||||
begin work;
|
||||
insert into t1 values (2);
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
2
|
||||
begin work;
|
||||
insert into t1 values (5);
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
5
|
||||
insert into t1 values (2);
|
||||
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
commit;
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
2
|
||||
commit;
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
2
|
||||
drop table t1;
|
||||
End of 5.0 tests
|
1
mysql-test/std_data/bad_gis_data.dat
Normal file
1
mysql-test/std_data/bad_gis_data.dat
Normal file
@ -0,0 +1 @@
|
||||
foo
|
@ -10,6 +10,7 @@
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
im_daemon_life_cycle : Bug#24415 see note: [19 Dec 23:17] Trudy Pelzer
|
||||
ndb_load : Bug#17233
|
||||
user_limits : Bug#23921 random failure of user_limits.test
|
||||
flush2 : Bug#24805 Pushbuild can't handle test with --disable-log-bin
|
||||
|
@ -991,5 +991,13 @@ SELECT CHAR(0xff,0x8f USING utf8) IS NULL;
|
||||
|
||||
SET SQL_MODE=@orig_sql_mode;
|
||||
|
||||
#
|
||||
# Bug #24947: problem with some string function with unsigned int parameters
|
||||
#
|
||||
|
||||
select substring('abc', cast(2 as unsigned int));
|
||||
select repeat('a', cast(2 as unsigned int));
|
||||
select rpad('abc', cast(5 as unsigned integer), 'x');
|
||||
select lpad('abc', cast(5 as unsigned integer), 'x');
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
@ -375,6 +375,20 @@ drop table t1;
|
||||
select (asWKT(geomfromwkb((0x000000000140240000000000004024000000000000))));
|
||||
select (asWKT(geomfromwkb((0x010100000000000000000024400000000000002440))));
|
||||
|
||||
--enable_metadata
|
||||
create table t1 (g GEOMETRY);
|
||||
select * from t1;
|
||||
select asbinary(g) from t1;
|
||||
--disable_metadata
|
||||
drop table t1;
|
||||
|
||||
create table t1 (a TEXT, b GEOMETRY NOT NULL, SPATIAL KEY(b));
|
||||
alter table t1 disable keys;
|
||||
--error 1263
|
||||
load data infile '../std_data_ln/bad_gis_data.dat' into table t1;
|
||||
alter table t1 enable keys;
|
||||
drop table t1;
|
||||
|
||||
# End of 4.1 tests
|
||||
|
||||
#
|
||||
@ -410,15 +424,7 @@ alter table t1 add primary key pti(pt);
|
||||
alter table t1 add primary key pti(pt(20));
|
||||
drop table t1;
|
||||
|
||||
--enable_metadata
|
||||
create table t1 (g GEOMETRY);
|
||||
select * from t1;
|
||||
select asbinary(g) from t1;
|
||||
--disable_metadata
|
||||
drop table t1;
|
||||
|
||||
|
||||
create table t1 select GeomFromText('point(1 1)');
|
||||
desc t1;
|
||||
drop table t1;
|
||||
|
||||
|
1
mysql-test/t/innodb_mysql-master.opt
Normal file
1
mysql-test/t/innodb_mysql-master.opt
Normal file
@ -0,0 +1 @@
|
||||
--innodb-lock-wait-timeout=2
|
@ -384,4 +384,6 @@ EXPLAIN SELECT SQL_BIG_RESULT b, SUM(c) FROM t1 GROUP BY b;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--source include/innodb_rollback_on_timeout.inc
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
1
mysql-test/t/innodb_timeout_rollback-master.opt
Normal file
1
mysql-test/t/innodb_timeout_rollback-master.opt
Normal file
@ -0,0 +1 @@
|
||||
--innodb_lock_wait_timeout=2 --innodb_rollback_on_timeout
|
5
mysql-test/t/innodb_timeout_rollback.test
Normal file
5
mysql-test/t/innodb_timeout_rollback.test
Normal file
@ -0,0 +1,5 @@
|
||||
-- source include/have_innodb.inc
|
||||
|
||||
--source include/innodb_rollback_on_timeout.inc
|
||||
|
||||
--echo End of 5.0 tests
|
@ -115,6 +115,7 @@ SUFFIXES = .sh
|
||||
-e 's!@''pkglibdir''@!$(pkglibdir)!g' \
|
||||
-e 's!@''pkgincludedir''@!$(pkgincludedir)!g' \
|
||||
-e 's!@''pkgdatadir''@!$(pkgdatadir)!g' \
|
||||
-e 's!@''sysconfdir''@!$(sysconfdir)!g' \
|
||||
-e 's!@''CC''@!@CC@!'\
|
||||
-e 's!@''CXX''@!@CXX@!'\
|
||||
-e 's!@''GXX''@!@GXX@!'\
|
||||
|
@ -243,6 +243,7 @@ $CP mysql-test/include/*.inc $BASE/mysql-test/include
|
||||
$CP mysql-test/include/*.test $BASE/mysql-test/include
|
||||
$CP mysql-test/t/*.def $BASE/mysql-test/t
|
||||
$CP mysql-test/std_data/*.dat mysql-test/std_data/*.frm \
|
||||
mysql-test/std_data/*.MYD mysql-test/std_data/*.MYI \
|
||||
mysql-test/std_data/*.pem mysql-test/std_data/Moscow_leap \
|
||||
mysql-test/std_data/des_key_file mysql-test/std_data/*.*001 \
|
||||
mysql-test/std_data/*.cnf mysql-test/std_data/*.MY* \
|
||||
|
@ -462,8 +462,8 @@ MySQLaccess::Report::Print_Header();
|
||||
if (-f "./$script_conf") {
|
||||
require "./$script_conf";
|
||||
}
|
||||
elsif (-f "/etc/$script_conf") {
|
||||
require "/etc/$script_conf";
|
||||
elsif (-f "@sysconfdir@/$script_conf") {
|
||||
require "@sysconfdir@/$script_conf";
|
||||
}
|
||||
|
||||
# ****************************
|
||||
@ -929,7 +929,7 @@ sub MergeConfigFile {
|
||||
# =================================
|
||||
sub MergeConfigFiles {
|
||||
my ($name,$pass,$uid,$gid,$quota,$comment,$gcos,$dir,$shell) = getpwuid $<;
|
||||
MergeConfigFile("/etc/my.cnf");
|
||||
MergeConfigFile("@sysconfdir@/my.cnf");
|
||||
MergeConfigFile("$dir/.my.cnf");
|
||||
}
|
||||
|
||||
|
@ -464,9 +464,9 @@ sub find_groups
|
||||
}
|
||||
else
|
||||
{
|
||||
if (-f "/etc/my.cnf" && -r "/etc/my.cnf")
|
||||
if (-f "@sysconfdir@/my.cnf" && -r "@sysconfdir@/my.cnf")
|
||||
{
|
||||
open(MY_CNF, "</etc/my.cnf") && (@tmp=<MY_CNF>) && close(MY_CNF);
|
||||
open(MY_CNF, "<@sysconfdir@/my.cnf") && (@tmp=<MY_CNF>) && close(MY_CNF);
|
||||
}
|
||||
for ($i = 0; ($line = shift @tmp); $i++)
|
||||
{
|
||||
@ -719,7 +719,7 @@ sub example
|
||||
# (as per Linux/Unix standard). You may even replace the
|
||||
# /etc/init.d/mysql.server script with it.
|
||||
#
|
||||
# Before using, you must create a my.cnf file either in /etc/my.cnf
|
||||
# Before using, you must create a my.cnf file either in @sysconfdir@/my.cnf
|
||||
# or /root/.my.cnf and add the [mysqld_multi] and [mysqld#] groups.
|
||||
#
|
||||
# The script can be found from support-files/mysqld_multi.server.sh
|
||||
|
@ -1569,10 +1569,11 @@ void Field_null::sql_type(String &res) const
|
||||
This is an number stored as a pre-space (or pre-zero) string
|
||||
****************************************************************************/
|
||||
|
||||
void
|
||||
int
|
||||
Field_decimal::reset(void)
|
||||
{
|
||||
Field_decimal::store(STRING_WITH_LEN("0"),&my_charset_bin);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Field_decimal::overflow(bool negative)
|
||||
@ -2217,9 +2218,10 @@ Field_new_decimal::Field_new_decimal(uint32 len_arg,
|
||||
}
|
||||
|
||||
|
||||
void Field_new_decimal::reset(void)
|
||||
int Field_new_decimal::reset(void)
|
||||
{
|
||||
store_value(&decimal_zero);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
117
sql/field.h
117
sql/field.h
@ -150,7 +150,7 @@ public:
|
||||
*/
|
||||
virtual uint32 data_length(const char *from) { return pack_length(); }
|
||||
virtual uint32 sort_length() const { return pack_length(); }
|
||||
virtual void reset(void) { bzero(ptr,pack_length()); }
|
||||
virtual int reset(void) { bzero(ptr,pack_length()); return 0; }
|
||||
virtual void reset_fields() {}
|
||||
virtual void set_default()
|
||||
{
|
||||
@ -450,10 +450,10 @@ public:
|
||||
enum_field_types type() const { return FIELD_TYPE_DECIMAL;}
|
||||
enum ha_base_keytype key_type() const
|
||||
{ return zerofill ? HA_KEYTYPE_BINARY : HA_KEYTYPE_NUM; }
|
||||
void reset(void);
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
int reset(void);
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
double val_real(void);
|
||||
longlong val_int(void);
|
||||
String *val_str(String*,String *);
|
||||
@ -490,7 +490,7 @@ public:
|
||||
enum_field_types type() const { return FIELD_TYPE_NEWDECIMAL;}
|
||||
enum ha_base_keytype key_type() const { return HA_KEYTYPE_BINARY; }
|
||||
Item_result result_type () const { return DECIMAL_RESULT; }
|
||||
void reset(void);
|
||||
int reset(void);
|
||||
bool store_value(const my_decimal *decimal_value);
|
||||
void set_value_on_overflow(my_decimal *decimal_value, bool sign);
|
||||
int store(const char *to, uint length, CHARSET_INFO *charset);
|
||||
@ -527,10 +527,10 @@ public:
|
||||
enum_field_types type() const { return FIELD_TYPE_TINY;}
|
||||
enum ha_base_keytype key_type() const
|
||||
{ return unsigned_flag ? HA_KEYTYPE_BINARY : HA_KEYTYPE_INT8; }
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
void reset(void) { ptr[0]=0; }
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
int reset(void) { ptr[0]=0; return 0; }
|
||||
double val_real(void);
|
||||
longlong val_int(void);
|
||||
String *val_str(String*,String *);
|
||||
@ -563,10 +563,10 @@ public:
|
||||
enum_field_types type() const { return FIELD_TYPE_SHORT;}
|
||||
enum ha_base_keytype key_type() const
|
||||
{ return unsigned_flag ? HA_KEYTYPE_USHORT_INT : HA_KEYTYPE_SHORT_INT;}
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
void reset(void) { ptr[0]=ptr[1]=0; }
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
int reset(void) { ptr[0]=ptr[1]=0; return 0; }
|
||||
double val_real(void);
|
||||
longlong val_int(void);
|
||||
String *val_str(String*,String *);
|
||||
@ -594,10 +594,10 @@ public:
|
||||
enum_field_types type() const { return FIELD_TYPE_INT24;}
|
||||
enum ha_base_keytype key_type() const
|
||||
{ return unsigned_flag ? HA_KEYTYPE_UINT24 : HA_KEYTYPE_INT24; }
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
void reset(void) { ptr[0]=ptr[1]=ptr[2]=0; }
|
||||
int reset(void) { ptr[0]=ptr[1]=ptr[2]=0; return 0; }
|
||||
double val_real(void);
|
||||
longlong val_int(void);
|
||||
String *val_str(String*,String *);
|
||||
@ -630,10 +630,10 @@ public:
|
||||
enum_field_types type() const { return FIELD_TYPE_LONG;}
|
||||
enum ha_base_keytype key_type() const
|
||||
{ return unsigned_flag ? HA_KEYTYPE_ULONG_INT : HA_KEYTYPE_LONG_INT; }
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; }
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
int reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; return 0; }
|
||||
double val_real(void);
|
||||
longlong val_int(void);
|
||||
bool send_binary(Protocol *protocol);
|
||||
@ -668,10 +668,14 @@ public:
|
||||
enum_field_types type() const { return FIELD_TYPE_LONGLONG;}
|
||||
enum ha_base_keytype key_type() const
|
||||
{ return unsigned_flag ? HA_KEYTYPE_ULONGLONG : HA_KEYTYPE_LONGLONG; }
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=ptr[4]=ptr[5]=ptr[6]=ptr[7]=0; }
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
int reset(void)
|
||||
{
|
||||
ptr[0]=ptr[1]=ptr[2]=ptr[3]=ptr[4]=ptr[5]=ptr[6]=ptr[7]=0;
|
||||
return 0;
|
||||
}
|
||||
double val_real(void);
|
||||
longlong val_int(void);
|
||||
String *val_str(String*,String *);
|
||||
@ -704,10 +708,10 @@ public:
|
||||
{}
|
||||
enum_field_types type() const { return FIELD_TYPE_FLOAT;}
|
||||
enum ha_base_keytype key_type() const { return HA_KEYTYPE_FLOAT; }
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
void reset(void) { bzero(ptr,sizeof(float)); }
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
int reset(void) { bzero(ptr,sizeof(float)); return 0; }
|
||||
double val_real(void);
|
||||
longlong val_int(void);
|
||||
String *val_str(String*,String *);
|
||||
@ -741,7 +745,7 @@ public:
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
void reset(void) { bzero(ptr,sizeof(double)); }
|
||||
int reset(void) { bzero(ptr,sizeof(double)); return 0; }
|
||||
double val_real(void);
|
||||
longlong val_int(void);
|
||||
String *val_str(String*,String *);
|
||||
@ -768,10 +772,10 @@ public:
|
||||
enum_field_types type() const { return FIELD_TYPE_NULL;}
|
||||
int store(const char *to, uint length, CHARSET_INFO *cs)
|
||||
{ null[0]=1; return 0; }
|
||||
int store(double nr) { null[0]=1; return 0; }
|
||||
int store(longlong nr, bool unsigned_val) { null[0]=1; return 0; }
|
||||
int store_decimal(const my_decimal *d) { null[0]=1; return 0; }
|
||||
void reset(void) {}
|
||||
int store(double nr) { null[0]=1; return 0; }
|
||||
int store(longlong nr, bool unsigned_val) { null[0]=1; return 0; }
|
||||
int store_decimal(const my_decimal *d) { null[0]=1; return 0; }
|
||||
int reset(void) { return 0; }
|
||||
double val_real(void) { return 0.0;}
|
||||
longlong val_int(void) { return 0;}
|
||||
my_decimal *val_decimal(my_decimal *) { return 0; }
|
||||
@ -801,7 +805,7 @@ public:
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; }
|
||||
int reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; return 0; }
|
||||
double val_real(void);
|
||||
longlong val_int(void);
|
||||
String *val_str(String*,String *);
|
||||
@ -877,10 +881,10 @@ public:
|
||||
enum_field_types type() const { return FIELD_TYPE_DATE;}
|
||||
enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONG_INT; }
|
||||
enum Item_result cmp_type () const { return INT_RESULT; }
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; }
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
int reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; return 0; }
|
||||
double val_real(void);
|
||||
longlong val_int(void);
|
||||
String *val_str(String*,String *);
|
||||
@ -909,7 +913,7 @@ public:
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
int store_time(TIME *ltime, timestamp_type type);
|
||||
void reset(void) { ptr[0]=ptr[1]=ptr[2]=0; }
|
||||
int reset(void) { ptr[0]=ptr[1]=ptr[2]=0; return 0; }
|
||||
double val_real(void);
|
||||
longlong val_int(void);
|
||||
String *val_str(String*,String *);
|
||||
@ -941,10 +945,10 @@ public:
|
||||
enum ha_base_keytype key_type() const { return HA_KEYTYPE_INT24; }
|
||||
enum Item_result cmp_type () const { return INT_RESULT; }
|
||||
int store_time(TIME *ltime, timestamp_type type);
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
void reset(void) { ptr[0]=ptr[1]=ptr[2]=0; }
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
int reset(void) { ptr[0]=ptr[1]=ptr[2]=0; return 0; }
|
||||
double val_real(void);
|
||||
longlong val_int(void);
|
||||
String *val_str(String*,String *);
|
||||
@ -982,7 +986,11 @@ public:
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
int store_time(TIME *ltime, timestamp_type type);
|
||||
void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=ptr[4]=ptr[5]=ptr[6]=ptr[7]=0; }
|
||||
int reset(void)
|
||||
{
|
||||
ptr[0]=ptr[1]=ptr[2]=ptr[3]=ptr[4]=ptr[5]=ptr[6]=ptr[7]=0;
|
||||
return 0;
|
||||
}
|
||||
double val_real(void);
|
||||
longlong val_int(void);
|
||||
String *val_str(String*,String *);
|
||||
@ -1025,9 +1033,13 @@ public:
|
||||
enum ha_base_keytype key_type() const
|
||||
{ return binary() ? HA_KEYTYPE_BINARY : HA_KEYTYPE_TEXT; }
|
||||
bool zero_pack() const { return 0; }
|
||||
void reset(void) { charset()->cset->fill(charset(),ptr,field_length,' '); }
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
int reset(void)
|
||||
{
|
||||
charset()->cset->fill(charset(),ptr,field_length,' ');
|
||||
return 0;
|
||||
}
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
int store(double nr) { return Field_str::store(nr); } /* QQ: To be deleted */
|
||||
double val_real(void);
|
||||
longlong val_int(void);
|
||||
@ -1082,7 +1094,7 @@ public:
|
||||
enum_field_types type() const { return MYSQL_TYPE_VARCHAR; }
|
||||
enum ha_base_keytype key_type() const;
|
||||
bool zero_pack() const { return 0; }
|
||||
void reset(void) { bzero(ptr,field_length+length_bytes); }
|
||||
int reset(void) { bzero(ptr,field_length+length_bytes); return 0; }
|
||||
uint32 pack_length() const { return (uint32) field_length+length_bytes; }
|
||||
uint32 key_length() const { return (uint32) field_length; }
|
||||
uint32 sort_length() const
|
||||
@ -1183,7 +1195,7 @@ public:
|
||||
{
|
||||
return (uint32) (((ulonglong) 1 << (packlength*8)) -1);
|
||||
}
|
||||
void reset(void) { bzero(ptr, packlength+sizeof(char*)); }
|
||||
int reset(void) { bzero(ptr, packlength+sizeof(char*)); return 0; }
|
||||
void reset_fields() { bzero((char*) &value,sizeof(value)); }
|
||||
void store_length(uint32 number);
|
||||
inline uint32 get_length(uint row_offset=0)
|
||||
@ -1264,6 +1276,7 @@ public:
|
||||
int store_decimal(const my_decimal *);
|
||||
void get_key_image(char *buff,uint length,imagetype type);
|
||||
uint size_of() const { return sizeof(*this); }
|
||||
int reset(void) { return !maybe_null(); }
|
||||
};
|
||||
#endif /*HAVE_SPATIAL*/
|
||||
|
||||
@ -1293,7 +1306,7 @@ public:
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
void reset() { bzero(ptr,packlength); }
|
||||
int reset() { bzero(ptr,packlength); return 0; }
|
||||
double val_real(void);
|
||||
longlong val_int(void);
|
||||
String *val_str(String*,String *);
|
||||
@ -1354,7 +1367,7 @@ public:
|
||||
uint32 max_length() { return field_length; }
|
||||
uint size_of() const { return sizeof(*this); }
|
||||
Item_result result_type () const { return INT_RESULT; }
|
||||
void reset(void) { bzero(ptr, bytes_in_rec); }
|
||||
int reset(void) { bzero(ptr, bytes_in_rec); return 0; }
|
||||
int store(const char *to, uint length, CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
|
@ -173,6 +173,7 @@ my_bool innobase_use_large_pages = FALSE;
|
||||
my_bool innobase_use_native_aio = FALSE;
|
||||
my_bool innobase_file_per_table = FALSE;
|
||||
my_bool innobase_locks_unsafe_for_binlog = FALSE;
|
||||
my_bool innobase_rollback_on_timeout = FALSE;
|
||||
my_bool innobase_create_status_file = FALSE;
|
||||
|
||||
static char *internal_innobase_data_file_path = NULL;
|
||||
@ -467,6 +468,10 @@ convert_error_code_to_mysql(
|
||||
latest SQL statement in a lock wait timeout. Previously, we
|
||||
rolled back the whole transaction. */
|
||||
|
||||
if (thd && row_rollback_on_timeout) {
|
||||
ha_rollback(thd);
|
||||
}
|
||||
|
||||
return(HA_ERR_LOCK_WAIT_TIMEOUT);
|
||||
|
||||
} else if (error == (int) DB_NO_REFERENCED_ROW) {
|
||||
@ -1380,6 +1385,8 @@ innobase_init(void)
|
||||
os_use_large_pages = (ibool) innobase_use_large_pages;
|
||||
os_large_page_size = (ulint) innobase_large_page_size;
|
||||
|
||||
row_rollback_on_timeout = (ibool) innobase_rollback_on_timeout;
|
||||
|
||||
srv_file_per_table = (ibool) innobase_file_per_table;
|
||||
srv_locks_unsafe_for_binlog = (ibool) innobase_locks_unsafe_for_binlog;
|
||||
|
||||
@ -5308,19 +5315,11 @@ ha_innobase::info(
|
||||
|
||||
prebuilt->trx->op_info = (char*)
|
||||
"returning various info to MySQL";
|
||||
|
||||
if (ib_table->space != 0) {
|
||||
my_snprintf(path, sizeof(path), "%s/%s%s",
|
||||
mysql_data_home, ib_table->name,
|
||||
".ibd");
|
||||
unpack_filename(path,path);
|
||||
} else {
|
||||
my_snprintf(path, sizeof(path), "%s/%s%s",
|
||||
my_snprintf(path, sizeof(path), "%s/%s%s",
|
||||
mysql_data_home, ib_table->name,
|
||||
reg_ext);
|
||||
|
||||
unpack_filename(path,path);
|
||||
}
|
||||
unpack_filename(path,path);
|
||||
|
||||
/* Note that we do not know the access time of the table,
|
||||
nor the CHECK TABLE time, nor the UPDATE or INSERT time. */
|
||||
@ -6377,14 +6376,17 @@ innodb_mutex_show_status(
|
||||
Protocol *protocol= thd->protocol;
|
||||
List<Item> field_list;
|
||||
mutex_t* mutex;
|
||||
#ifdef UNIV_DEBUG
|
||||
ulint rw_lock_count= 0;
|
||||
ulint rw_lock_count_spin_loop= 0;
|
||||
ulint rw_lock_count_spin_rounds= 0;
|
||||
ulint rw_lock_count_os_wait= 0;
|
||||
ulint rw_lock_count_os_yield= 0;
|
||||
ulonglong rw_lock_wait_time= 0;
|
||||
#endif /* UNIV_DEBUG */
|
||||
DBUG_ENTER("innodb_mutex_show_status");
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
field_list.push_back(new Item_empty_string("Mutex", FN_REFLEN));
|
||||
field_list.push_back(new Item_empty_string("Module", FN_REFLEN));
|
||||
field_list.push_back(new Item_uint("Count", 21));
|
||||
@ -6393,19 +6395,23 @@ innodb_mutex_show_status(
|
||||
field_list.push_back(new Item_uint("OS_waits", 21));
|
||||
field_list.push_back(new Item_uint("OS_yields", 21));
|
||||
field_list.push_back(new Item_uint("OS_waits_time", 21));
|
||||
#else /* UNIV_DEBUG */
|
||||
field_list.push_back(new Item_empty_string("File", FN_REFLEN));
|
||||
field_list.push_back(new Item_uint("Line", 21));
|
||||
field_list.push_back(new Item_uint("OS_waits", 21));
|
||||
#endif /* UNIV_DEBUG */
|
||||
|
||||
if (protocol->send_fields(&field_list,
|
||||
Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF))
|
||||
DBUG_RETURN(TRUE);
|
||||
|
||||
#ifdef MUTEX_PROTECT_TO_BE_ADDED_LATER
|
||||
mutex_enter(&mutex_list_mutex);
|
||||
#endif
|
||||
mutex_enter_noninline(&mutex_list_mutex);
|
||||
|
||||
mutex = UT_LIST_GET_FIRST(mutex_list);
|
||||
|
||||
while ( mutex != NULL )
|
||||
{
|
||||
#ifdef UNIV_DEBUG
|
||||
if (mutex->mutex_type != 1)
|
||||
{
|
||||
if (mutex->count_using > 0)
|
||||
@ -6422,9 +6428,7 @@ innodb_mutex_show_status(
|
||||
|
||||
if (protocol->write())
|
||||
{
|
||||
#ifdef MUTEX_PROTECT_TO_BE_ADDED_LATER
|
||||
mutex_exit(&mutex_list_mutex);
|
||||
#endif
|
||||
mutex_exit_noninline(&mutex_list_mutex);
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
}
|
||||
@ -6438,10 +6442,25 @@ innodb_mutex_show_status(
|
||||
rw_lock_count_os_yield += mutex->count_os_yield;
|
||||
rw_lock_wait_time += mutex->lspent_time;
|
||||
}
|
||||
#else /* UNIV_DEBUG */
|
||||
protocol->prepare_for_resend();
|
||||
protocol->store(mutex->cfile_name, system_charset_info);
|
||||
protocol->store((ulonglong)mutex->cline);
|
||||
protocol->store((ulonglong)mutex->count_os_wait);
|
||||
|
||||
if (protocol->write())
|
||||
{
|
||||
mutex_exit_noninline(&mutex_list_mutex);
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
#endif /* UNIV_DEBUG */
|
||||
|
||||
mutex = UT_LIST_GET_NEXT(list, mutex);
|
||||
}
|
||||
|
||||
mutex_exit_noninline(&mutex_list_mutex);
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
protocol->prepare_for_resend();
|
||||
protocol->store("rw_lock_mutexes", system_charset_info);
|
||||
protocol->store("", system_charset_info);
|
||||
@ -6456,10 +6475,8 @@ innodb_mutex_show_status(
|
||||
{
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
#endif /* UNIV_DEBUG */
|
||||
|
||||
#ifdef MUTEX_PROTECT_TO_BE_ADDED_LATER
|
||||
mutex_exit(&mutex_list_mutex);
|
||||
#endif
|
||||
send_eof(thd);
|
||||
DBUG_RETURN(FALSE);
|
||||
}
|
||||
|
@ -216,6 +216,7 @@ extern my_bool innobase_log_archive,
|
||||
innobase_use_large_pages,
|
||||
innobase_use_native_aio,
|
||||
innobase_file_per_table, innobase_locks_unsafe_for_binlog,
|
||||
innobase_rollback_on_timeout,
|
||||
innobase_create_status_file;
|
||||
extern my_bool innobase_very_fast_shutdown; /* set this to 1 just before
|
||||
calling innobase_end() if you want
|
||||
|
@ -1166,7 +1166,8 @@ String *Item_func_substr::val_str(String *str)
|
||||
|
||||
/* if "unsigned_flag" is set, we have a *huge* positive number. */
|
||||
/* Assumes that the maximum length of a String is < INT_MAX32. */
|
||||
if ((args[1]->unsigned_flag) || (start < INT_MIN32) || (start > INT_MAX32))
|
||||
if ((!args[1]->unsigned_flag && (start < INT_MIN32 || start > INT_MAX32)) ||
|
||||
(args[1]->unsigned_flag && ((ulonglong) start > INT_MAX32)))
|
||||
return &my_empty_string;
|
||||
|
||||
start= ((start < 0) ? res->numchars() + start : start - 1);
|
||||
@ -2227,25 +2228,23 @@ String *Item_func_repeat::val_str(String *str)
|
||||
uint length,tot_length;
|
||||
char *to;
|
||||
/* must be longlong to avoid truncation */
|
||||
longlong tmp_count= args[1]->val_int();
|
||||
long count= (long) tmp_count;
|
||||
longlong count= args[1]->val_int();
|
||||
String *res= args[0]->val_str(str);
|
||||
|
||||
/* Assumes that the maximum length of a String is < INT_MAX32. */
|
||||
/* Bounds check on count: If this is triggered, we will error. */
|
||||
if ((tmp_count > INT_MAX32) || args[1]->unsigned_flag)
|
||||
count= INT_MAX32;
|
||||
|
||||
if (args[0]->null_value || args[1]->null_value)
|
||||
goto err; // string and/or delim are null
|
||||
null_value= 0;
|
||||
if ((tmp_count <= 0) && !args[1]->unsigned_flag) // For nicer SQL code
|
||||
if ((count <= 0) && !args[1]->unsigned_flag) // For nicer SQL code
|
||||
return &my_empty_string;
|
||||
/* Assumes that the maximum length of a String is < INT_MAX32. */
|
||||
/* Bounds check on count: If this is triggered, we will error. */
|
||||
if ((ulonglong) count > INT_MAX32)
|
||||
count= INT_MAX32;
|
||||
if (count == 1) // To avoid reallocs
|
||||
return res;
|
||||
length=res->length();
|
||||
// Safe length check
|
||||
if (length > current_thd->variables.max_allowed_packet/count)
|
||||
if (length > current_thd->variables.max_allowed_packet / (uint) count)
|
||||
{
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_WARN_ALLOWED_PACKET_OVERFLOWED,
|
||||
@ -2319,15 +2318,14 @@ String *Item_func_rpad::val_str(String *str)
|
||||
String *res= args[0]->val_str(str);
|
||||
String *rpad= args[2]->val_str(&rpad_str);
|
||||
|
||||
/* Assumes that the maximum length of a String is < INT_MAX32. */
|
||||
/* Set here so that rest of code sees out-of-bound value as such. */
|
||||
if ((count > INT_MAX32) || args[1]->unsigned_flag)
|
||||
count= INT_MAX32;
|
||||
|
||||
if (!res || args[1]->null_value || !rpad || count < 0)
|
||||
if (!res || args[1]->null_value || !rpad ||
|
||||
((count < 0) && !args[1]->unsigned_flag))
|
||||
goto err;
|
||||
null_value=0;
|
||||
|
||||
/* Assumes that the maximum length of a String is < INT_MAX32. */
|
||||
/* Set here so that rest of code sees out-of-bound value as such. */
|
||||
if ((ulonglong) count > INT_MAX32)
|
||||
count= INT_MAX32;
|
||||
if (count <= (res_char_length= res->numchars()))
|
||||
{ // String to pad is big enough
|
||||
res->length(res->charpos((int) count)); // Shorten result if longer
|
||||
@ -2421,14 +2419,15 @@ String *Item_func_lpad::val_str(String *str)
|
||||
String *res= args[0]->val_str(&tmp_value);
|
||||
String *pad= args[2]->val_str(&lpad_str);
|
||||
|
||||
if (!res || args[1]->null_value || !pad ||
|
||||
((count < 0) && !args[1]->unsigned_flag))
|
||||
goto err;
|
||||
null_value=0;
|
||||
/* Assumes that the maximum length of a String is < INT_MAX32. */
|
||||
/* Set here so that rest of code sees out-of-bound value as such. */
|
||||
if ((count > INT_MAX32) || args[1]->unsigned_flag)
|
||||
if ((ulonglong) count > INT_MAX32)
|
||||
count= INT_MAX32;
|
||||
|
||||
if (!res || args[1]->null_value || !pad || count < 0)
|
||||
goto err;
|
||||
null_value=0;
|
||||
res_char_length= res->numchars();
|
||||
|
||||
if (count <= res_char_length)
|
||||
|
@ -4692,7 +4692,8 @@ enum options_mysqld
|
||||
OPT_LOG_SLOW_ADMIN_STATEMENTS,
|
||||
OPT_TABLE_LOCK_WAIT_TIMEOUT,
|
||||
OPT_PORT_OPEN_TIMEOUT,
|
||||
OPT_MERGE
|
||||
OPT_MERGE,
|
||||
OPT_INNODB_ROLLBACK_ON_TIMEOUT
|
||||
};
|
||||
|
||||
|
||||
@ -4968,6 +4969,10 @@ Disable with --skip-innodb-doublewrite.", (gptr*) &innobase_use_doublewrite,
|
||||
(gptr*) &srv_max_purge_lag,
|
||||
(gptr*) &srv_max_purge_lag, 0, GET_LONG, REQUIRED_ARG, 0, 0, ~0L,
|
||||
0, 1L, 0},
|
||||
{"innodb_rollback_on_timeout", OPT_INNODB_ROLLBACK_ON_TIMEOUT,
|
||||
"Roll back the complete transaction on lock wait timeout, for 4.x compatibility (disabled by default)",
|
||||
(gptr*) &innobase_rollback_on_timeout, (gptr*) &innobase_rollback_on_timeout,
|
||||
0, GET_BOOL, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"innodb_status_file", OPT_INNODB_STATUS_FILE,
|
||||
"Enable SHOW INNODB STATUS output in the innodb_status.<pid> file",
|
||||
(gptr*) &innobase_create_status_file, (gptr*) &innobase_create_status_file,
|
||||
|
@ -904,6 +904,7 @@ struct show_var_st init_vars[]= {
|
||||
{sys_innodb_max_purge_lag.name, (char*) &sys_innodb_max_purge_lag, SHOW_SYS},
|
||||
{"innodb_mirrored_log_groups", (char*) &innobase_mirrored_log_groups, SHOW_LONG},
|
||||
{"innodb_open_files", (char*) &innobase_open_files, SHOW_LONG },
|
||||
{"innodb_rollback_on_timeout", (char*) &innobase_rollback_on_timeout, SHOW_MY_BOOL},
|
||||
{sys_innodb_support_xa.name, (char*) &sys_innodb_support_xa, SHOW_SYS},
|
||||
{sys_innodb_sync_spin_loops.name, (char*) &sys_innodb_sync_spin_loops, SHOW_SYS},
|
||||
{sys_innodb_table_locks.name, (char*) &sys_innodb_table_locks, SHOW_SYS},
|
||||
|
@ -696,7 +696,12 @@ read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list,
|
||||
if (item->type() == Item::FIELD_ITEM)
|
||||
{
|
||||
Field *field= ((Item_field *)item)->field;
|
||||
field->reset();
|
||||
if (field->reset())
|
||||
{
|
||||
my_error(ER_WARN_NULL_TO_NOTNULL, MYF(0), field->field_name,
|
||||
thd->row_count);
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
field->set_null();
|
||||
if (field == table->next_number_field)
|
||||
table->auto_increment_field_not_null= TRUE;
|
||||
@ -745,6 +750,13 @@ read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list,
|
||||
{
|
||||
if (item->type() == Item::FIELD_ITEM)
|
||||
{
|
||||
Field *field= ((Item_field *)item)->field;
|
||||
if (field->reset())
|
||||
{
|
||||
my_error(ER_WARN_NULL_TO_NOTNULL, MYF(0),field->field_name,
|
||||
thd->row_count);
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
/*
|
||||
QQ: We probably should not throw warning for each field.
|
||||
But how about intention to always have the same number
|
||||
|
@ -1087,7 +1087,7 @@ my_bool is_const_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
|
||||
strmov(message, "IS_CONST accepts only one argument");
|
||||
return 1;
|
||||
}
|
||||
initid->ptr= (char*)((args->args[0] != NULL) ? 1 : 0);
|
||||
initid->ptr= (char*)((args->args[0] != NULL) ? 1UL : 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -138,6 +138,12 @@ static const dec1 frac_max[DIG_PER_DEC1-1]={
|
||||
900000000, 990000000, 999000000,
|
||||
999900000, 999990000, 999999000,
|
||||
999999900, 999999990 };
|
||||
static double scaler10[]= {
|
||||
1.0, 1e10, 1e20, 1e30, 1e40, 1e50, 1e60, 1e70, 1e80, 1e90
|
||||
};
|
||||
static double scaler1[]= {
|
||||
1.0, 10.0, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9
|
||||
};
|
||||
|
||||
#ifdef HAVE_purify
|
||||
#define sanity(d) DBUG_ASSERT((d)->len > 0)
|
||||
@ -946,15 +952,27 @@ fatal_error:
|
||||
|
||||
int decimal2double(decimal_t *from, double *to)
|
||||
{
|
||||
double x=0, t=DIG_BASE;
|
||||
int intg, frac;
|
||||
dec1 *buf=from->buf;
|
||||
double result= 0.0;
|
||||
int i, exp= 0;
|
||||
dec1 *buf= from->buf;
|
||||
|
||||
for (i= from->intg; i > 0; i-= DIG_PER_DEC1)
|
||||
result= result * DIG_BASE + *buf++;
|
||||
|
||||
for (i= from->frac; i > 0; i-= DIG_PER_DEC1) {
|
||||
result= result * DIG_BASE + *buf++;
|
||||
exp+= DIG_PER_DEC1;
|
||||
}
|
||||
|
||||
DBUG_PRINT("info", ("interm.: %f %d %f", result, exp,
|
||||
scaler10[exp / 10] * scaler1[exp % 10]));
|
||||
|
||||
result/= scaler10[exp / 10] * scaler1[exp % 10];
|
||||
|
||||
*to= from->sign ? -result : result;
|
||||
|
||||
DBUG_PRINT("info", ("result: %f (%lx)", *to, *(ulong *)to));
|
||||
|
||||
for (intg=from->intg; intg > 0; intg-=DIG_PER_DEC1)
|
||||
x=x*DIG_BASE + *buf++;
|
||||
for (frac=from->frac; frac > 0; frac-=DIG_PER_DEC1, t*=DIG_BASE)
|
||||
x+=*buf++/t;
|
||||
*to=from->sign ? -x : x;
|
||||
return E_DEC_OK;
|
||||
}
|
||||
|
||||
|
@ -575,6 +575,7 @@ fi
|
||||
|
||||
%doc %attr(644, root, root) %{_infodir}/mysql.info*
|
||||
|
||||
%doc %attr(644, root, man) %{_mandir}/man1/my_print_defaults.1*
|
||||
%doc %attr(644, root, man) %{_mandir}/man1/myisam_ftdump.1*
|
||||
%doc %attr(644, root, man) %{_mandir}/man1/myisamchk.1*
|
||||
%doc %attr(644, root, man) %{_mandir}/man1/myisamlog.1*
|
||||
@ -587,8 +588,9 @@ fi
|
||||
%doc %attr(644, root, man) %{_mandir}/man1/mysql_upgrade.1*
|
||||
%doc %attr(644, root, man) %{_mandir}/man1/mysqlhotcopy.1*
|
||||
%doc %attr(644, root, man) %{_mandir}/man1/mysqlman.1*
|
||||
%doc %attr(644, root, man) %{_mandir}/man1/mysqlmanager.1*
|
||||
%doc %attr(644, root, man) %{_mandir}/man8/mysqlmanager.8*
|
||||
%doc %attr(644, root, man) %{_mandir}/man1/mysql.server.1*
|
||||
%doc %attr(644, root, man) %{_mandir}/man1/mysql_tzinfo_to_sql.1*
|
||||
%doc %attr(644, root, man) %{_mandir}/man1/mysql_zap.1*
|
||||
%doc %attr(644, root, man) %{_mandir}/man1/perror.1*
|
||||
%doc %attr(644, root, man) %{_mandir}/man1/replace.1*
|
||||
@ -753,6 +755,16 @@ fi
|
||||
# itself - note that they must be ordered by date (important when
|
||||
# merging BK trees)
|
||||
%changelog
|
||||
* Mon Dec 18 2006 Joerg Bruehe <joerg@mysql.com>
|
||||
|
||||
- Fix the move of "mysqlmanager" to section 8: Directory name was wrong.
|
||||
|
||||
* Thu Dec 14 2006 Joerg Bruehe <joerg@mysql.com>
|
||||
|
||||
- Include the new man pages for "my_print_defaults" and "mysql_tzinfo_to_sql"
|
||||
in the server RPM.
|
||||
- The "mysqlmanager" man page got moved from section 1 to 8.
|
||||
|
||||
* Thu Nov 16 2006 Joerg Bruehe <joerg@mysql.com>
|
||||
|
||||
- Explicitly note that the "MySQL-shared" RPMs (as built by MySQL AB)
|
||||
|
Loading…
x
Reference in New Issue
Block a user