mirror of
https://github.com/MariaDB/server.git
synced 2025-07-27 18:02:13 +03:00
Merge mysql.com:/home/jonas/src/mysql-4.1
into mysql.com:/home/jonas/src/mysql-4.1-ndb
This commit is contained in:
@ -20,7 +20,7 @@ release_flags="-fast +O3"
|
|||||||
# note on pointers below.
|
# note on pointers below.
|
||||||
cflags="-g -z +O0"
|
cflags="-g -z +O0"
|
||||||
cxxflags="-g0 -z +O0"
|
cxxflags="-g0 -z +O0"
|
||||||
debug_conigure_options="--with-debug"
|
debug_configure_options="--with-debug"
|
||||||
|
|
||||||
while [ "$#" != 0 ]; do
|
while [ "$#" != 0 ]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
@ -40,23 +40,23 @@ while [ "$#" != 0 ]; do
|
|||||||
--release)
|
--release)
|
||||||
echo "Building release binary"
|
echo "Building release binary"
|
||||||
cflags="$release_flags"
|
cflags="$release_flags"
|
||||||
cxxflags="$release_flags"
|
cxxflags="$release_flags"
|
||||||
debug_configure_options=""
|
debug_configure_options=""
|
||||||
;;
|
;;
|
||||||
-32)
|
-32)
|
||||||
echo "Building 32-bit binary"
|
echo "Building 32-bit binary"
|
||||||
;;
|
;;
|
||||||
-64)
|
-64)
|
||||||
echo "Building 64-bit binary"
|
echo "Building 64-bit binary"
|
||||||
cflags="$cflags +DA2.0W +DD64"
|
cflags="$cflags +DA2.0W +DD64"
|
||||||
cxxflags="$cxxflags +DA2.0W +DD64"
|
cxxflags="$cxxflags +DA2.0W +DD64"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo "$0: invalid option '$1'; use --help to show usage"
|
echo "$0: invalid option '$1'; use --help to show usage"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
shift
|
shift
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
||||||
|
@ -423,6 +423,10 @@ SOURCE=..\mysys\my_static.c
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\strings\my_strtoll10.c
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=..\mysys\my_symlink.c
|
SOURCE=..\mysys\my_symlink.c
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
@ -383,6 +383,10 @@ SOURCE=..\mysys\my_static.c
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\strings\my_strtoll10.c
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=..\mysys\my_symlink.c
|
SOURCE=..\mysys\my_symlink.c
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
@ -264,7 +264,6 @@ static int write_to_table(char *filename, MYSQL *sock)
|
|||||||
{
|
{
|
||||||
char tablename[FN_REFLEN], hard_path[FN_REFLEN],
|
char tablename[FN_REFLEN], hard_path[FN_REFLEN],
|
||||||
sql_statement[FN_REFLEN*16+256], *end;
|
sql_statement[FN_REFLEN*16+256], *end;
|
||||||
my_bool local_file;
|
|
||||||
DBUG_ENTER("write_to_table");
|
DBUG_ENTER("write_to_table");
|
||||||
DBUG_PRINT("enter",("filename: %s",filename));
|
DBUG_PRINT("enter",("filename: %s",filename));
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ dnl Process this file with autoconf to produce a configure script.
|
|||||||
AC_INIT(sql/mysqld.cc)
|
AC_INIT(sql/mysqld.cc)
|
||||||
AC_CANONICAL_SYSTEM
|
AC_CANONICAL_SYSTEM
|
||||||
# The Docs Makefile.am parses this line!
|
# The Docs Makefile.am parses this line!
|
||||||
AM_INIT_AUTOMAKE(mysql, 4.1.6-gamma)
|
AM_INIT_AUTOMAKE(mysql, 4.1.7-gamma)
|
||||||
AM_CONFIG_HEADER(config.h)
|
AM_CONFIG_HEADER(config.h)
|
||||||
|
|
||||||
PROTOCOL_VERSION=10
|
PROTOCOL_VERSION=10
|
||||||
|
@ -713,7 +713,7 @@ typedef void *gptr; /* Generic pointer */
|
|||||||
typedef char *gptr; /* Generic pointer */
|
typedef char *gptr; /* Generic pointer */
|
||||||
#endif
|
#endif
|
||||||
#ifndef HAVE_INT_8_16_32
|
#ifndef HAVE_INT_8_16_32
|
||||||
typedef char int8; /* Signed integer >= 8 bits */
|
typedef signed char int8; /* Signed integer >= 8 bits */
|
||||||
typedef short int16; /* Signed integer >= 16 bits */
|
typedef short int16; /* Signed integer >= 16 bits */
|
||||||
#endif
|
#endif
|
||||||
#ifndef HAVE_UCHAR
|
#ifndef HAVE_UCHAR
|
||||||
|
@ -100,7 +100,10 @@ extern ulint srv_max_n_threads;
|
|||||||
extern lint srv_conc_n_threads;
|
extern lint srv_conc_n_threads;
|
||||||
|
|
||||||
extern ibool srv_fast_shutdown;
|
extern ibool srv_fast_shutdown;
|
||||||
|
extern ibool srv_very_fast_shutdown; /* if this TRUE, do not flush the
|
||||||
|
buffer pool to data files at the
|
||||||
|
shutdown; we effectively 'crash'
|
||||||
|
InnoDB */
|
||||||
extern ibool srv_innodb_status;
|
extern ibool srv_innodb_status;
|
||||||
|
|
||||||
extern ibool srv_use_doublewrite_buf;
|
extern ibool srv_use_doublewrite_buf;
|
||||||
|
@ -3048,13 +3048,25 @@ loop:
|
|||||||
#ifdef UNIV_LOG_ARCHIVE
|
#ifdef UNIV_LOG_ARCHIVE
|
||||||
log_archive_all();
|
log_archive_all();
|
||||||
#endif /* UNIV_LOG_ARCHIVE */
|
#endif /* UNIV_LOG_ARCHIVE */
|
||||||
log_make_checkpoint_at(ut_dulint_max, TRUE);
|
|
||||||
|
if (!srv_very_fast_shutdown) {
|
||||||
|
/* In a 'very fast' shutdown we do not flush the buffer pool:
|
||||||
|
it is essentially a 'crash' of the InnoDB server. */
|
||||||
|
|
||||||
|
log_make_checkpoint_at(ut_dulint_max, TRUE);
|
||||||
|
} else {
|
||||||
|
/* Make sure that the log is all flushed to disk, so that
|
||||||
|
we can recover all committed transactions in a crash
|
||||||
|
recovery */
|
||||||
|
log_buffer_flush_to_disk();
|
||||||
|
}
|
||||||
|
|
||||||
mutex_enter(&(log_sys->mutex));
|
mutex_enter(&(log_sys->mutex));
|
||||||
|
|
||||||
lsn = log_sys->lsn;
|
lsn = log_sys->lsn;
|
||||||
|
|
||||||
if (ut_dulint_cmp(lsn, log_sys->last_checkpoint_lsn) != 0
|
if ((ut_dulint_cmp(lsn, log_sys->last_checkpoint_lsn) != 0
|
||||||
|
&& !srv_very_fast_shutdown)
|
||||||
#ifdef UNIV_LOG_ARCHIVE
|
#ifdef UNIV_LOG_ARCHIVE
|
||||||
|| (srv_log_archive_on
|
|| (srv_log_archive_on
|
||||||
&& ut_dulint_cmp(lsn,
|
&& ut_dulint_cmp(lsn,
|
||||||
@ -3098,11 +3110,12 @@ loop:
|
|||||||
fil_flush_file_spaces(FIL_TABLESPACE);
|
fil_flush_file_spaces(FIL_TABLESPACE);
|
||||||
fil_flush_file_spaces(FIL_LOG);
|
fil_flush_file_spaces(FIL_LOG);
|
||||||
|
|
||||||
/* The next fil_write_... will pass the buffer pool: therefore
|
/* The call fil_write_flushed_lsn_to_data_files() will pass the buffer
|
||||||
it is essential that the buffer pool has been completely flushed
|
pool: therefore it is essential that the buffer pool has been
|
||||||
to disk! */
|
completely flushed to disk! (We do not call fil_write... if the
|
||||||
|
'very fast' shutdown is enabled.) */
|
||||||
|
|
||||||
if (!buf_all_freed()) {
|
if (!srv_very_fast_shutdown && !buf_all_freed()) {
|
||||||
|
|
||||||
goto loop;
|
goto loop;
|
||||||
}
|
}
|
||||||
@ -3125,7 +3138,7 @@ loop:
|
|||||||
|
|
||||||
/* Make some checks that the server really is quiet */
|
/* Make some checks that the server really is quiet */
|
||||||
ut_a(srv_n_threads_active[SRV_MASTER] == 0);
|
ut_a(srv_n_threads_active[SRV_MASTER] == 0);
|
||||||
ut_a(buf_all_freed());
|
ut_a(srv_very_fast_shutdown || buf_all_freed());
|
||||||
ut_a(0 == ut_dulint_cmp(lsn, log_sys->lsn));
|
ut_a(0 == ut_dulint_cmp(lsn, log_sys->lsn));
|
||||||
|
|
||||||
if (ut_dulint_cmp(lsn, srv_start_lsn) < 0) {
|
if (ut_dulint_cmp(lsn, srv_start_lsn) < 0) {
|
||||||
@ -3140,7 +3153,15 @@ loop:
|
|||||||
|
|
||||||
srv_shutdown_lsn = lsn;
|
srv_shutdown_lsn = lsn;
|
||||||
|
|
||||||
fil_write_flushed_lsn_to_data_files(lsn, arch_log_no);
|
if (!srv_very_fast_shutdown) {
|
||||||
|
/* In a 'very fast' shutdown we do not flush the buffer pool:
|
||||||
|
it is essentially a 'crash' of the InnoDB server. Then we must
|
||||||
|
not write the lsn stamps to the data files, since at a
|
||||||
|
startup InnoDB deduces from the stamps if the previous
|
||||||
|
shutdown was clean. */
|
||||||
|
|
||||||
|
fil_write_flushed_lsn_to_data_files(lsn, arch_log_no);
|
||||||
|
}
|
||||||
|
|
||||||
fil_flush_file_spaces(FIL_TABLESPACE);
|
fil_flush_file_spaces(FIL_TABLESPACE);
|
||||||
|
|
||||||
@ -3148,7 +3169,7 @@ loop:
|
|||||||
|
|
||||||
/* Make some checks that the server really is quiet */
|
/* Make some checks that the server really is quiet */
|
||||||
ut_a(srv_n_threads_active[SRV_MASTER] == 0);
|
ut_a(srv_n_threads_active[SRV_MASTER] == 0);
|
||||||
ut_a(buf_all_freed());
|
ut_a(srv_very_fast_shutdown || buf_all_freed());
|
||||||
ut_a(0 == ut_dulint_cmp(lsn, log_sys->lsn));
|
ut_a(0 == ut_dulint_cmp(lsn, log_sys->lsn));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -249,6 +249,10 @@ merge to completion before shutdown */
|
|||||||
|
|
||||||
ibool srv_fast_shutdown = FALSE;
|
ibool srv_fast_shutdown = FALSE;
|
||||||
|
|
||||||
|
ibool srv_very_fast_shutdown = FALSE; /* if this TRUE, do not flush the
|
||||||
|
buffer pool to data files at the
|
||||||
|
shutdown; we effectively 'crash'
|
||||||
|
InnoDB */
|
||||||
/* Generate a innodb_status.<pid> file */
|
/* Generate a innodb_status.<pid> file */
|
||||||
ibool srv_innodb_status = FALSE;
|
ibool srv_innodb_status = FALSE;
|
||||||
|
|
||||||
@ -2178,7 +2182,8 @@ loop:
|
|||||||
/*****************************************************************/
|
/*****************************************************************/
|
||||||
background_loop:
|
background_loop:
|
||||||
/* ---- In this loop we run background operations when the server
|
/* ---- In this loop we run background operations when the server
|
||||||
is quiet from user activity */
|
is quiet from user activity. Also in the case of a shutdown, we
|
||||||
|
loop here, flushing the buffer pool to the data files. */
|
||||||
|
|
||||||
/* The server has been quiet for a while: start running background
|
/* The server has been quiet for a while: start running background
|
||||||
operations */
|
operations */
|
||||||
@ -2251,7 +2256,16 @@ background_loop:
|
|||||||
|
|
||||||
flush_loop:
|
flush_loop:
|
||||||
srv_main_thread_op_info = "flushing buffer pool pages";
|
srv_main_thread_op_info = "flushing buffer pool pages";
|
||||||
n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST, 100, ut_dulint_max);
|
|
||||||
|
if (!srv_very_fast_shutdown) {
|
||||||
|
n_pages_flushed =
|
||||||
|
buf_flush_batch(BUF_FLUSH_LIST, 100, ut_dulint_max);
|
||||||
|
} else {
|
||||||
|
/* In a 'very fast' shutdown we do not flush the buffer pool
|
||||||
|
to data files: we set n_pages_flushed to 0 artificially. */
|
||||||
|
|
||||||
|
n_pages_flushed = 0;
|
||||||
|
}
|
||||||
|
|
||||||
srv_main_thread_op_info = "reserving kernel mutex";
|
srv_main_thread_op_info = "reserving kernel mutex";
|
||||||
|
|
||||||
@ -2304,7 +2318,10 @@ flush_loop:
|
|||||||
|
|
||||||
/* If we are doing a fast shutdown (= the default)
|
/* If we are doing a fast shutdown (= the default)
|
||||||
we do not do purge or insert buffer merge. But we
|
we do not do purge or insert buffer merge. But we
|
||||||
flush the buffer pool completely to disk. */
|
flush the buffer pool completely to disk.
|
||||||
|
In a 'very fast' shutdown we do not flush the buffer
|
||||||
|
pool to data files: we have set n_pages_flushed to
|
||||||
|
0 artificially. */
|
||||||
|
|
||||||
goto background_loop;
|
goto background_loop;
|
||||||
}
|
}
|
||||||
|
@ -1057,12 +1057,15 @@ trx_purge(void)
|
|||||||
&& !UT_LIST_GET_LAST(trx_sys->view_list)) {
|
&& !UT_LIST_GET_LAST(trx_sys->view_list)) {
|
||||||
float ratio = (float) trx_sys->rseg_history_len
|
float ratio = (float) trx_sys->rseg_history_len
|
||||||
/ srv_max_purge_lag;
|
/ srv_max_purge_lag;
|
||||||
if (ratio > 1) {
|
if (ratio > ULINT_MAX / 10000) {
|
||||||
|
/* Avoid overflow: maximum delay is 4295 seconds */
|
||||||
|
srv_dml_needed_delay = ULINT_MAX;
|
||||||
|
} else if (ratio > 1) {
|
||||||
/* If the history list length exceeds the
|
/* If the history list length exceeds the
|
||||||
innodb_max_purge_lag, the
|
innodb_max_purge_lag, the
|
||||||
data manipulation statements are delayed
|
data manipulation statements are delayed
|
||||||
by at least 5000 microseconds. */
|
by at least 5000 microseconds. */
|
||||||
srv_dml_needed_delay = (ratio - .5) * 10000;
|
srv_dml_needed_delay = (ulint) ((ratio - .5) * 10000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3196,24 +3196,20 @@ mysql_stmt_send_long_data(MYSQL_STMT *stmt, uint param_number,
|
|||||||
read_binary_{date,time,datetime}()
|
read_binary_{date,time,datetime}()
|
||||||
tm MYSQL_TIME structure to fill
|
tm MYSQL_TIME structure to fill
|
||||||
pos pointer to current position in network buffer.
|
pos pointer to current position in network buffer.
|
||||||
These functions increase pos to point to the beginning of this
|
These functions increase pos to point to the beginning of the
|
||||||
field (this is just due to implementation of net_field_length
|
next column.
|
||||||
which is used to get length of binary representation of
|
|
||||||
time value).
|
|
||||||
|
|
||||||
Auxiliary functions to read time (date, datetime) values from network
|
Auxiliary functions to read time (date, datetime) values from network
|
||||||
buffer and store in MYSQL_TIME structure. Jointly used by conversion
|
buffer and store in MYSQL_TIME structure. Jointly used by conversion
|
||||||
and no-conversion fetching.
|
and no-conversion fetching.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static uint read_binary_time(MYSQL_TIME *tm, uchar **pos)
|
static void read_binary_time(MYSQL_TIME *tm, uchar **pos)
|
||||||
{
|
{
|
||||||
uint length;
|
|
||||||
|
|
||||||
/* net_field_length will set pos to the first byte of data */
|
/* net_field_length will set pos to the first byte of data */
|
||||||
if (!(length= net_field_length(pos)))
|
uint length= net_field_length(pos);
|
||||||
set_zero_time(tm);
|
|
||||||
else
|
if (length)
|
||||||
{
|
{
|
||||||
uchar *to= *pos;
|
uchar *to= *pos;
|
||||||
tm->neg= (bool) to[0];
|
tm->neg= (bool) to[0];
|
||||||
@ -3226,17 +3222,18 @@ static uint read_binary_time(MYSQL_TIME *tm, uchar **pos)
|
|||||||
|
|
||||||
tm->year= tm->month= 0;
|
tm->year= tm->month= 0;
|
||||||
tm->time_type= MYSQL_TIMESTAMP_TIME;
|
tm->time_type= MYSQL_TIMESTAMP_TIME;
|
||||||
|
|
||||||
|
*pos+= length;
|
||||||
}
|
}
|
||||||
return length;
|
else
|
||||||
|
set_zero_time(tm);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint read_binary_datetime(MYSQL_TIME *tm, uchar **pos)
|
static void read_binary_datetime(MYSQL_TIME *tm, uchar **pos)
|
||||||
{
|
{
|
||||||
uint length;
|
uint length= net_field_length(pos);
|
||||||
|
|
||||||
if (!(length= net_field_length(pos)))
|
if (length)
|
||||||
set_zero_time(tm);
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
uchar *to= *pos;
|
uchar *to= *pos;
|
||||||
|
|
||||||
@ -3255,17 +3252,18 @@ static uint read_binary_datetime(MYSQL_TIME *tm, uchar **pos)
|
|||||||
tm->hour= tm->minute= tm->second= 0;
|
tm->hour= tm->minute= tm->second= 0;
|
||||||
tm->second_part= (length > 7) ? (ulong) sint4korr(to+7) : 0;
|
tm->second_part= (length > 7) ? (ulong) sint4korr(to+7) : 0;
|
||||||
tm->time_type= MYSQL_TIMESTAMP_DATETIME;
|
tm->time_type= MYSQL_TIMESTAMP_DATETIME;
|
||||||
|
|
||||||
|
*pos+= length;
|
||||||
}
|
}
|
||||||
return length;
|
else
|
||||||
|
set_zero_time(tm);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint read_binary_date(MYSQL_TIME *tm, uchar **pos)
|
static void read_binary_date(MYSQL_TIME *tm, uchar **pos)
|
||||||
{
|
{
|
||||||
uint length;
|
uint length= net_field_length(pos);
|
||||||
|
|
||||||
if (!(length= net_field_length(pos)))
|
if (length)
|
||||||
set_zero_time(tm);
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
uchar *to= *pos;
|
uchar *to= *pos;
|
||||||
tm->year = (uint) sint2korr(to);
|
tm->year = (uint) sint2korr(to);
|
||||||
@ -3276,8 +3274,11 @@ static uint read_binary_date(MYSQL_TIME *tm, uchar **pos)
|
|||||||
tm->second_part= 0;
|
tm->second_part= 0;
|
||||||
tm->neg= 0;
|
tm->neg= 0;
|
||||||
tm->time_type= MYSQL_TIMESTAMP_DATE;
|
tm->time_type= MYSQL_TIMESTAMP_DATE;
|
||||||
|
|
||||||
|
*pos+= length;
|
||||||
}
|
}
|
||||||
return length;
|
else
|
||||||
|
set_zero_time(tm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -3604,18 +3605,18 @@ static void fetch_datetime_with_conversion(MYSQL_BIND *param,
|
|||||||
static void fetch_result_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field,
|
static void fetch_result_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field,
|
||||||
uchar **row)
|
uchar **row)
|
||||||
{
|
{
|
||||||
ulong length;
|
|
||||||
enum enum_field_types field_type= field->type;
|
enum enum_field_types field_type= field->type;
|
||||||
uint field_is_unsigned= field->flags & UNSIGNED_FLAG;
|
uint field_is_unsigned= field->flags & UNSIGNED_FLAG;
|
||||||
|
|
||||||
switch (field_type) {
|
switch (field_type) {
|
||||||
case MYSQL_TYPE_TINY:
|
case MYSQL_TYPE_TINY:
|
||||||
{
|
{
|
||||||
char value= (char) **row;
|
uchar value= **row;
|
||||||
longlong data= field_is_unsigned ? (longlong) (unsigned char) value :
|
/* sic: we need to cast to 'signed char' as 'char' may be unsigned */
|
||||||
(longlong) value;
|
longlong data= field_is_unsigned ? (longlong) value :
|
||||||
|
(longlong) (signed char) value;
|
||||||
fetch_long_with_conversion(param, field, data);
|
fetch_long_with_conversion(param, field, data);
|
||||||
length= 1;
|
*row+= 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case MYSQL_TYPE_SHORT:
|
case MYSQL_TYPE_SHORT:
|
||||||
@ -3625,7 +3626,7 @@ static void fetch_result_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field,
|
|||||||
longlong data= field_is_unsigned ? (longlong) (unsigned short) value :
|
longlong data= field_is_unsigned ? (longlong) (unsigned short) value :
|
||||||
(longlong) value;
|
(longlong) value;
|
||||||
fetch_long_with_conversion(param, field, data);
|
fetch_long_with_conversion(param, field, data);
|
||||||
length= 2;
|
*row+= 2;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case MYSQL_TYPE_INT24: /* mediumint is sent as 4 bytes int */
|
case MYSQL_TYPE_INT24: /* mediumint is sent as 4 bytes int */
|
||||||
@ -3635,14 +3636,14 @@ static void fetch_result_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field,
|
|||||||
longlong data= field_is_unsigned ? (longlong) (unsigned long) value :
|
longlong data= field_is_unsigned ? (longlong) (unsigned long) value :
|
||||||
(longlong) value;
|
(longlong) value;
|
||||||
fetch_long_with_conversion(param, field, data);
|
fetch_long_with_conversion(param, field, data);
|
||||||
length= 4;
|
*row+= 4;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case MYSQL_TYPE_LONGLONG:
|
case MYSQL_TYPE_LONGLONG:
|
||||||
{
|
{
|
||||||
longlong value= (longlong)sint8korr(*row);
|
longlong value= (longlong)sint8korr(*row);
|
||||||
fetch_long_with_conversion(param, field, value);
|
fetch_long_with_conversion(param, field, value);
|
||||||
length= 8;
|
*row+= 8;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case MYSQL_TYPE_FLOAT:
|
case MYSQL_TYPE_FLOAT:
|
||||||
@ -3650,7 +3651,7 @@ static void fetch_result_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field,
|
|||||||
float value;
|
float value;
|
||||||
float4get(value,*row);
|
float4get(value,*row);
|
||||||
fetch_float_with_conversion(param, field, value, FLT_DIG);
|
fetch_float_with_conversion(param, field, value, FLT_DIG);
|
||||||
length= 4;
|
*row+= 4;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case MYSQL_TYPE_DOUBLE:
|
case MYSQL_TYPE_DOUBLE:
|
||||||
@ -3658,14 +3659,14 @@ static void fetch_result_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field,
|
|||||||
double value;
|
double value;
|
||||||
float8get(value,*row);
|
float8get(value,*row);
|
||||||
fetch_float_with_conversion(param, field, value, DBL_DIG);
|
fetch_float_with_conversion(param, field, value, DBL_DIG);
|
||||||
length= 8;
|
*row+= 8;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case MYSQL_TYPE_DATE:
|
case MYSQL_TYPE_DATE:
|
||||||
{
|
{
|
||||||
MYSQL_TIME tm;
|
MYSQL_TIME tm;
|
||||||
|
|
||||||
length= read_binary_date(&tm, row);
|
read_binary_date(&tm, row);
|
||||||
fetch_datetime_with_conversion(param, &tm);
|
fetch_datetime_with_conversion(param, &tm);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -3673,7 +3674,7 @@ static void fetch_result_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field,
|
|||||||
{
|
{
|
||||||
MYSQL_TIME tm;
|
MYSQL_TIME tm;
|
||||||
|
|
||||||
length= read_binary_time(&tm, row);
|
read_binary_time(&tm, row);
|
||||||
fetch_datetime_with_conversion(param, &tm);
|
fetch_datetime_with_conversion(param, &tm);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -3682,16 +3683,18 @@ static void fetch_result_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field,
|
|||||||
{
|
{
|
||||||
MYSQL_TIME tm;
|
MYSQL_TIME tm;
|
||||||
|
|
||||||
length= read_binary_datetime(&tm, row);
|
read_binary_datetime(&tm, row);
|
||||||
fetch_datetime_with_conversion(param, &tm);
|
fetch_datetime_with_conversion(param, &tm);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
length= net_field_length(row);
|
{
|
||||||
|
ulong length= net_field_length(row);
|
||||||
fetch_string_with_conversion(param, (char*) *row, length);
|
fetch_string_with_conversion(param, (char*) *row, length);
|
||||||
|
*row+= length;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
*row+= length;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -3760,19 +3763,19 @@ static void fetch_result_double(MYSQL_BIND *param, uchar **row)
|
|||||||
static void fetch_result_time(MYSQL_BIND *param, uchar **row)
|
static void fetch_result_time(MYSQL_BIND *param, uchar **row)
|
||||||
{
|
{
|
||||||
MYSQL_TIME *tm= (MYSQL_TIME *)param->buffer;
|
MYSQL_TIME *tm= (MYSQL_TIME *)param->buffer;
|
||||||
*row+= read_binary_time(tm, row);
|
read_binary_time(tm, row);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fetch_result_date(MYSQL_BIND *param, uchar **row)
|
static void fetch_result_date(MYSQL_BIND *param, uchar **row)
|
||||||
{
|
{
|
||||||
MYSQL_TIME *tm= (MYSQL_TIME *)param->buffer;
|
MYSQL_TIME *tm= (MYSQL_TIME *)param->buffer;
|
||||||
*row+= read_binary_date(tm, row);
|
read_binary_date(tm, row);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fetch_result_datetime(MYSQL_BIND *param, uchar **row)
|
static void fetch_result_datetime(MYSQL_BIND *param, uchar **row)
|
||||||
{
|
{
|
||||||
MYSQL_TIME *tm= (MYSQL_TIME *)param->buffer;
|
MYSQL_TIME *tm= (MYSQL_TIME *)param->buffer;
|
||||||
*row+= read_binary_datetime(tm, row);
|
read_binary_datetime(tm, row);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fetch_result_bin(MYSQL_BIND *param, uchar **row)
|
static void fetch_result_bin(MYSQL_BIND *param, uchar **row)
|
||||||
|
@ -750,3 +750,43 @@ SELECT id FROM t1 WHERE (list_id = 1) AND (term = "letterd");
|
|||||||
id
|
id
|
||||||
4
|
4
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
SET NAMES latin1;
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
id int unsigned NOT NULL auto_increment,
|
||||||
|
list_id smallint unsigned NOT NULL,
|
||||||
|
term text NOT NULL,
|
||||||
|
PRIMARY KEY(id),
|
||||||
|
INDEX(list_id, term(19))
|
||||||
|
) TYPE=MyISAM CHARSET=utf8;
|
||||||
|
Warnings:
|
||||||
|
Warning 1287 'TYPE=storage_engine' is deprecated; use 'ENGINE=storage_engine' instead
|
||||||
|
INSERT INTO t1 set list_id = 1, term = "test<73>test";
|
||||||
|
INSERT INTO t1 set list_id = 1, term = "testetest";
|
||||||
|
INSERT INTO t1 set list_id = 1, term = "test<73>test";
|
||||||
|
SELECT id, term FROM t1 where (list_id = 1) AND (term = "test<73>test");
|
||||||
|
id term
|
||||||
|
1 test<73>test
|
||||||
|
2 testetest
|
||||||
|
3 test<73>test
|
||||||
|
SELECT id, term FROM t1 where (list_id = 1) AND (term = "testetest");
|
||||||
|
id term
|
||||||
|
1 test<73>test
|
||||||
|
2 testetest
|
||||||
|
3 test<73>test
|
||||||
|
SELECT id, term FROM t1 where (list_id = 1) AND (term = "test<73>test");
|
||||||
|
id term
|
||||||
|
1 test<73>test
|
||||||
|
2 testetest
|
||||||
|
3 test<73>test
|
||||||
|
DROP TABLE t1;
|
||||||
|
set names utf8;
|
||||||
|
create table t1 (
|
||||||
|
a int primary key,
|
||||||
|
b varchar(6),
|
||||||
|
index b3(b(3))
|
||||||
|
) engine=innodb character set=utf8;
|
||||||
|
insert into t1 values(1,'foo'),(2,'foobar');
|
||||||
|
select * from t1 where b like 'foob%';
|
||||||
|
a b
|
||||||
|
2 foobar
|
||||||
|
drop table t1;
|
||||||
|
@ -336,3 +336,42 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
- - - - - - - - NULL Impossible WHERE
|
- - - - - - - - NULL Impossible WHERE
|
||||||
drop table t1;
|
drop table t1;
|
||||||
deallocate prepare stmt;
|
deallocate prepare stmt;
|
||||||
|
create table t1 (a int);
|
||||||
|
insert into t1 (a) values (1), (2), (3), (4);
|
||||||
|
set @precision=10000000000;
|
||||||
|
select rand(),
|
||||||
|
cast(rand(10)*@precision as unsigned integer),
|
||||||
|
cast(rand(a)*@precision as unsigned integer) from t1;
|
||||||
|
rand() cast(rand(10)*@precision as unsigned integer) cast(rand(a)*@precision as unsigned integer)
|
||||||
|
- 6570515219 -
|
||||||
|
- 1282061302 -
|
||||||
|
- 6698761160 -
|
||||||
|
- 9647622201 -
|
||||||
|
prepare stmt from
|
||||||
|
"select rand(),
|
||||||
|
cast(rand(10)*@precision as unsigned integer),
|
||||||
|
cast(rand(a)*@precision as unsigned integer),
|
||||||
|
cast(rand(?)*@precision as unsigned integer) from t1";
|
||||||
|
set @var=1;
|
||||||
|
execute stmt using @var;
|
||||||
|
rand() cast(rand(10)*@precision as unsigned integer) cast(rand(a)*@precision as unsigned integer) cast(rand(?)*@precision as unsigned integer)
|
||||||
|
- 6570515219 - 4054035371
|
||||||
|
- 1282061302 - 8716141803
|
||||||
|
- 6698761160 - 1418603212
|
||||||
|
- 9647622201 - 944590960
|
||||||
|
set @var=2;
|
||||||
|
execute stmt using @var;
|
||||||
|
rand() cast(rand(10)*@precision as unsigned integer) cast(rand(a)*@precision as unsigned integer) cast(rand(?)*@precision as unsigned integer)
|
||||||
|
- 6570515219 1559528654 6555866465
|
||||||
|
- 1282061302 6238114970 1223466192
|
||||||
|
- 6698761160 6511989195 6449731873
|
||||||
|
- 9647622201 3845601374 8578261098
|
||||||
|
set @var=3;
|
||||||
|
execute stmt using @var;
|
||||||
|
rand() cast(rand(10)*@precision as unsigned integer) cast(rand(a)*@precision as unsigned integer) cast(rand(?)*@precision as unsigned integer)
|
||||||
|
- 6570515219 1559528654 9057697559
|
||||||
|
- 1282061302 6238114970 3730790581
|
||||||
|
- 6698761160 6511989195 1480860534
|
||||||
|
- 9647622201 3845601374 6211931236
|
||||||
|
drop table t1;
|
||||||
|
deallocate prepare stmt;
|
||||||
|
@ -221,7 +221,9 @@ drop table t1;
|
|||||||
# Bug 4521: unique key prefix interacts poorly with utf8
|
# Bug 4521: unique key prefix interacts poorly with utf8
|
||||||
# InnoDB: keys with prefix compression, case insensitive collation.
|
# InnoDB: keys with prefix compression, case insensitive collation.
|
||||||
#
|
#
|
||||||
|
--disable_warnings
|
||||||
create table t1 (c varchar(30) character set utf8, unique(c(10))) engine=innodb;
|
create table t1 (c varchar(30) character set utf8, unique(c(10))) engine=innodb;
|
||||||
|
--enable_warnings
|
||||||
insert into t1 values ('1'),('2'),('3'),('x'),('y'),('z');
|
insert into t1 values ('1'),('2'),('3'),('x'),('y'),('z');
|
||||||
insert into t1 values ('aaaaaaaaaa');
|
insert into t1 values ('aaaaaaaaaa');
|
||||||
--error 1062
|
--error 1062
|
||||||
@ -269,7 +271,9 @@ drop table t1;
|
|||||||
# Bug 4521: unique key prefix interacts poorly with utf8
|
# Bug 4521: unique key prefix interacts poorly with utf8
|
||||||
# InnoDB: fixed length keys, case insensitive collation
|
# InnoDB: fixed length keys, case insensitive collation
|
||||||
#
|
#
|
||||||
|
--disable_warnings
|
||||||
create table t1 (c char(3) character set utf8, unique (c(2))) engine=innodb;
|
create table t1 (c char(3) character set utf8, unique (c(2))) engine=innodb;
|
||||||
|
--enable_warnings
|
||||||
insert into t1 values ('1'),('2'),('3'),('4'),('x'),('y'),('z');
|
insert into t1 values ('1'),('2'),('3'),('4'),('x'),('y'),('z');
|
||||||
insert into t1 values ('a');
|
insert into t1 values ('a');
|
||||||
insert into t1 values ('aa');
|
insert into t1 values ('aa');
|
||||||
@ -504,10 +508,12 @@ drop table t1;
|
|||||||
# Bug#4594: column index make = failed for gbk, but like works
|
# Bug#4594: column index make = failed for gbk, but like works
|
||||||
# Check InnoDB
|
# Check InnoDB
|
||||||
#
|
#
|
||||||
|
--disable_warnings
|
||||||
create table t1 (
|
create table t1 (
|
||||||
str varchar(255) character set utf8 not null,
|
str varchar(255) character set utf8 not null,
|
||||||
key str (str(2))
|
key str (str(2))
|
||||||
) engine=innodb;
|
) engine=innodb;
|
||||||
|
--enable_warnings
|
||||||
INSERT INTO t1 VALUES ('str');
|
INSERT INTO t1 VALUES ('str');
|
||||||
INSERT INTO t1 VALUES ('str2');
|
INSERT INTO t1 VALUES ('str2');
|
||||||
select * from t1 where str='str';
|
select * from t1 where str='str';
|
||||||
@ -563,10 +569,12 @@ DROP TABLE t1;
|
|||||||
# Bug #5723: length(<varchar utf8 field>) returns varying results
|
# Bug #5723: length(<varchar utf8 field>) returns varying results
|
||||||
#
|
#
|
||||||
SET NAMES utf8;
|
SET NAMES utf8;
|
||||||
|
--disable_warnings
|
||||||
CREATE TABLE t1 (
|
CREATE TABLE t1 (
|
||||||
subject varchar(255) character set utf8 collate utf8_unicode_ci,
|
subject varchar(255) character set utf8 collate utf8_unicode_ci,
|
||||||
p varchar(15) character set utf8
|
p varchar(15) character set utf8
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
|
||||||
|
--enable_warnings
|
||||||
INSERT INTO t1 VALUES ('谷川俊二と申しますが、インターネット予約の会員登録をしましたところ、メールアドレスを間違えてしまい会員IDが受け取ることが出来ませんでした。間違えアドレスはtani-shun@n.vodafone.ne.jpを書き込みました。どうすればよいですか? その他、住所等は間違えありません。連絡ください。よろしくお願いします。m(__)m','040312-000057');
|
INSERT INTO t1 VALUES ('谷川俊二と申しますが、インターネット予約の会員登録をしましたところ、メールアドレスを間違えてしまい会員IDが受け取ることが出来ませんでした。間違えアドレスはtani-shun@n.vodafone.ne.jpを書き込みました。どうすればよいですか? その他、住所等は間違えありません。連絡ください。よろしくお願いします。m(__)m','040312-000057');
|
||||||
INSERT INTO t1 VALUES ('aaa','bbb');
|
INSERT INTO t1 VALUES ('aaa','bbb');
|
||||||
SELECT length(subject) FROM t1;
|
SELECT length(subject) FROM t1;
|
||||||
@ -592,3 +600,38 @@ SELECT id FROM t1 WHERE (list_id = 1) AND (term = "letterb");
|
|||||||
SELECT id FROM t1 WHERE (list_id = 1) AND (term = "lettera");
|
SELECT id FROM t1 WHERE (list_id = 1) AND (term = "lettera");
|
||||||
SELECT id FROM t1 WHERE (list_id = 1) AND (term = "letterd");
|
SELECT id FROM t1 WHERE (list_id = 1) AND (term = "letterd");
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #6043 erratic searching for diacriticals in indexed MyISAM UTF-8 table
|
||||||
|
#
|
||||||
|
SET NAMES latin1;
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
id int unsigned NOT NULL auto_increment,
|
||||||
|
list_id smallint unsigned NOT NULL,
|
||||||
|
term text NOT NULL,
|
||||||
|
PRIMARY KEY(id),
|
||||||
|
INDEX(list_id, term(19))
|
||||||
|
) TYPE=MyISAM CHARSET=utf8;
|
||||||
|
INSERT INTO t1 set list_id = 1, term = "test<73>test";
|
||||||
|
INSERT INTO t1 set list_id = 1, term = "testetest";
|
||||||
|
INSERT INTO t1 set list_id = 1, term = "test<73>test";
|
||||||
|
SELECT id, term FROM t1 where (list_id = 1) AND (term = "test<73>test");
|
||||||
|
SELECT id, term FROM t1 where (list_id = 1) AND (term = "testetest");
|
||||||
|
SELECT id, term FROM t1 where (list_id = 1) AND (term = "test<73>test");
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #6019 SELECT tries to use too short prefix index on utf8 data
|
||||||
|
#
|
||||||
|
set names utf8;
|
||||||
|
--disable_warnings
|
||||||
|
create table t1 (
|
||||||
|
a int primary key,
|
||||||
|
b varchar(6),
|
||||||
|
index b3(b(3))
|
||||||
|
) engine=innodb character set=utf8;
|
||||||
|
--enable_warnings
|
||||||
|
insert into t1 values(1,'foo'),(2,'foobar');
|
||||||
|
select * from t1 where b like 'foob%';
|
||||||
|
drop table t1;
|
||||||
|
@ -363,4 +363,30 @@ execute stmt using @v;
|
|||||||
drop table t1;
|
drop table t1;
|
||||||
deallocate prepare stmt;
|
deallocate prepare stmt;
|
||||||
|
|
||||||
|
#
|
||||||
|
# A test case for Bug#5985 prepare stmt from "select rand(?)" crashes
|
||||||
|
# server. Check that Item_func_rand is prepared-statements friendly.
|
||||||
|
#
|
||||||
|
create table t1 (a int);
|
||||||
|
insert into t1 (a) values (1), (2), (3), (4);
|
||||||
|
set @precision=10000000000;
|
||||||
|
--replace_column 1 - 3 -
|
||||||
|
select rand(),
|
||||||
|
cast(rand(10)*@precision as unsigned integer),
|
||||||
|
cast(rand(a)*@precision as unsigned integer) from t1;
|
||||||
|
prepare stmt from
|
||||||
|
"select rand(),
|
||||||
|
cast(rand(10)*@precision as unsigned integer),
|
||||||
|
cast(rand(a)*@precision as unsigned integer),
|
||||||
|
cast(rand(?)*@precision as unsigned integer) from t1";
|
||||||
|
set @var=1;
|
||||||
|
--replace_column 1 - 3 -
|
||||||
|
execute stmt using @var;
|
||||||
|
set @var=2;
|
||||||
|
--replace_column 1 -
|
||||||
|
execute stmt using @var;
|
||||||
|
set @var=3;
|
||||||
|
--replace_column 1 -
|
||||||
|
execute stmt using @var;
|
||||||
|
drop table t1;
|
||||||
|
deallocate prepare stmt;
|
||||||
|
12
sql/field.cc
12
sql/field.cc
@ -5000,10 +5000,10 @@ String *Field_blob::val_str(String *val_buffer __attribute__((unused)),
|
|||||||
int Field_blob::cmp(const char *a,uint32 a_length, const char *b,
|
int Field_blob::cmp(const char *a,uint32 a_length, const char *b,
|
||||||
uint32 b_length)
|
uint32 b_length)
|
||||||
{
|
{
|
||||||
int diff=my_strnncoll(field_charset,
|
return field_charset->coll->strnncoll(field_charset,
|
||||||
(const uchar*)a,min(a_length,b_length),
|
(const uchar*)a, a_length,
|
||||||
(const uchar*)b,min(a_length,b_length));
|
(const uchar*)b, b_length,
|
||||||
return diff ? diff : (int) (a_length - b_length);
|
0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -5087,8 +5087,8 @@ void Field_blob::get_key_image(char *buff,uint length,
|
|||||||
|
|
||||||
get_ptr(&blob);
|
get_ptr(&blob);
|
||||||
uint char_length= length / cs->mbmaxlen;
|
uint char_length= length / cs->mbmaxlen;
|
||||||
char_length= my_charpos(cs, blob, blob + length, char_length);
|
char_length= my_charpos(cs, blob, blob + blob_length, char_length);
|
||||||
set_if_smaller(length, char_length);
|
set_if_smaller(blob_length, char_length);
|
||||||
|
|
||||||
if ((uint32) length > blob_length)
|
if ((uint32) length > blob_length)
|
||||||
{
|
{
|
||||||
|
@ -20,6 +20,9 @@ NOTE: You can only use noninlined InnoDB functions in this file, because we
|
|||||||
have disables the InnoDB inlining in this file. */
|
have disables the InnoDB inlining in this file. */
|
||||||
|
|
||||||
/* TODO list for the InnoDB handler in 4.1:
|
/* TODO list for the InnoDB handler in 4.1:
|
||||||
|
- Remove the flag innodb_active_trans from thd and replace it with a
|
||||||
|
function call innodb_active_trans(thd), which looks at the InnoDB
|
||||||
|
trx struct state field
|
||||||
- Find out what kind of problems the OS X case-insensitivity causes to
|
- Find out what kind of problems the OS X case-insensitivity causes to
|
||||||
table and database names; should we 'normalize' the names like we do
|
table and database names; should we 'normalize' the names like we do
|
||||||
in Windows?
|
in Windows?
|
||||||
@ -114,6 +117,9 @@ uint innobase_flush_log_at_trx_commit = 1;
|
|||||||
my_bool innobase_log_archive = FALSE;/* unused */
|
my_bool innobase_log_archive = FALSE;/* unused */
|
||||||
my_bool innobase_use_native_aio = FALSE;
|
my_bool innobase_use_native_aio = FALSE;
|
||||||
my_bool innobase_fast_shutdown = TRUE;
|
my_bool innobase_fast_shutdown = TRUE;
|
||||||
|
my_bool innobase_very_fast_shutdown = FALSE; /* this can be set to
|
||||||
|
1 just prior calling
|
||||||
|
innobase_end() */
|
||||||
my_bool innobase_file_per_table = FALSE;
|
my_bool innobase_file_per_table = FALSE;
|
||||||
my_bool innobase_locks_unsafe_for_binlog = FALSE;
|
my_bool innobase_locks_unsafe_for_binlog = FALSE;
|
||||||
my_bool innobase_create_status_file = FALSE;
|
my_bool innobase_create_status_file = FALSE;
|
||||||
@ -799,6 +805,10 @@ ha_innobase::init_table_handle_for_HANDLER(void)
|
|||||||
|
|
||||||
trx_assign_read_view(prebuilt->trx);
|
trx_assign_read_view(prebuilt->trx);
|
||||||
|
|
||||||
|
/* Set the MySQL flag to mark that there is an active transaction */
|
||||||
|
|
||||||
|
current_thd->transaction.all.innodb_active_trans = 1;
|
||||||
|
|
||||||
/* We did the necessary inits in this function, no need to repeat them
|
/* We did the necessary inits in this function, no need to repeat them
|
||||||
in row_search_for_mysql */
|
in row_search_for_mysql */
|
||||||
|
|
||||||
@ -1059,6 +1069,15 @@ innobase_end(void)
|
|||||||
#endif
|
#endif
|
||||||
if (innodb_inited)
|
if (innodb_inited)
|
||||||
{
|
{
|
||||||
|
if (innobase_very_fast_shutdown) {
|
||||||
|
srv_very_fast_shutdown = TRUE;
|
||||||
|
fprintf(stderr,
|
||||||
|
"InnoDB: MySQL has requested a very fast shutdown without flushing\n"
|
||||||
|
"InnoDB: the InnoDB buffer pool to data files. At the next mysqld startup\n"
|
||||||
|
"InnoDB: InnoDB will do a crash recovery!\n");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
innodb_inited= 0;
|
innodb_inited= 0;
|
||||||
if (innobase_shutdown_for_mysql() != DB_SUCCESS)
|
if (innobase_shutdown_for_mysql() != DB_SUCCESS)
|
||||||
err= 1;
|
err= 1;
|
||||||
@ -1115,6 +1134,48 @@ innobase_commit_low(
|
|||||||
trx_commit_for_mysql(trx);
|
trx_commit_for_mysql(trx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
Creates an InnoDB transaction struct for the thd if it does not yet have one.
|
||||||
|
Starts a new InnoDB transaction if a transaction is not yet started. And
|
||||||
|
assigns a new snapshot for a consistent read if the transaction does not yet
|
||||||
|
have one. */
|
||||||
|
|
||||||
|
int
|
||||||
|
innobase_start_trx_and_assign_read_view(
|
||||||
|
/*====================================*/
|
||||||
|
/* out: 0 */
|
||||||
|
THD* thd) /* in: MySQL thread handle of the user for whom
|
||||||
|
the transaction should be committed */
|
||||||
|
{
|
||||||
|
trx_t* trx;
|
||||||
|
|
||||||
|
DBUG_ENTER("innobase_start_trx_and_assign_read_view");
|
||||||
|
|
||||||
|
/* Create a new trx struct for thd, if it does not yet have one */
|
||||||
|
|
||||||
|
trx = check_trx_exists(thd);
|
||||||
|
|
||||||
|
/* This is just to play safe: release a possible FIFO ticket and
|
||||||
|
search latch. Since we will reserve the kernel mutex, we have to
|
||||||
|
release the search system latch first to obey the latching order. */
|
||||||
|
|
||||||
|
innobase_release_stat_resources(trx);
|
||||||
|
|
||||||
|
/* If the transaction is not started yet, start it */
|
||||||
|
|
||||||
|
trx_start_if_not_started_noninline(trx);
|
||||||
|
|
||||||
|
/* Assign a read view if the transaction does not have it yet */
|
||||||
|
|
||||||
|
trx_assign_read_view(trx);
|
||||||
|
|
||||||
|
/* Set the MySQL flag to mark that there is an active transaction */
|
||||||
|
|
||||||
|
current_thd->transaction.all.innodb_active_trans = 1;
|
||||||
|
|
||||||
|
DBUG_RETURN(0);
|
||||||
|
}
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
Commits a transaction in an InnoDB database or marks an SQL statement
|
Commits a transaction in an InnoDB database or marks an SQL statement
|
||||||
ended. */
|
ended. */
|
||||||
@ -1146,8 +1207,10 @@ innobase_commit(
|
|||||||
|
|
||||||
1. ::external_lock(),
|
1. ::external_lock(),
|
||||||
2. ::start_stmt(),
|
2. ::start_stmt(),
|
||||||
3. innobase_query_caching_of_table_permitted(), and
|
3. innobase_query_caching_of_table_permitted(),
|
||||||
4. innobase_savepoint(),
|
4. innobase_savepoint(),
|
||||||
|
5. ::init_table_handle_for_HANDLER(),
|
||||||
|
6. innobase_start_trx_and_assign_read_view()
|
||||||
|
|
||||||
and it is only set to 0 in a commit or a rollback. If it is 0 we know
|
and it is only set to 0 in a commit or a rollback. If it is 0 we know
|
||||||
there cannot be resources to be freed and we could return immediately.
|
there cannot be resources to be freed and we could return immediately.
|
||||||
|
@ -191,6 +191,11 @@ extern my_bool innobase_log_archive,
|
|||||||
innobase_use_native_aio, innobase_fast_shutdown,
|
innobase_use_native_aio, innobase_fast_shutdown,
|
||||||
innobase_file_per_table, innobase_locks_unsafe_for_binlog,
|
innobase_file_per_table, innobase_locks_unsafe_for_binlog,
|
||||||
innobase_create_status_file;
|
innobase_create_status_file;
|
||||||
|
extern my_bool innobase_very_fast_shutdown; /* set this to 1 just before
|
||||||
|
calling innobase_end() if you want
|
||||||
|
InnoDB to shut down without
|
||||||
|
flushing the buffer pool: this
|
||||||
|
is equivalent to a 'crash' */
|
||||||
extern "C" {
|
extern "C" {
|
||||||
extern ulong srv_max_buf_pool_modified_pct;
|
extern ulong srv_max_buf_pool_modified_pct;
|
||||||
extern ulong srv_auto_extend_increment;
|
extern ulong srv_auto_extend_increment;
|
||||||
@ -231,3 +236,4 @@ void innobase_release_temporary_latches(void* innobase_tid);
|
|||||||
|
|
||||||
void innobase_store_binlog_offset_and_flush_log(char *binlog_name,longlong offset);
|
void innobase_store_binlog_offset_and_flush_log(char *binlog_name,longlong offset);
|
||||||
|
|
||||||
|
int innobase_start_trx_and_assign_read_view(THD* thd);
|
||||||
|
@ -1010,21 +1010,38 @@ double Item_func_round::val()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Item_func_rand::fix_length_and_dec()
|
bool Item_func_rand::fix_fields(THD *thd, struct st_table_list *tables,
|
||||||
|
Item **ref)
|
||||||
{
|
{
|
||||||
decimals=NOT_FIXED_DEC;
|
Item_real_func::fix_fields(thd, tables, ref);
|
||||||
max_length=float_length(decimals);
|
|
||||||
used_tables_cache|= RAND_TABLE_BIT;
|
used_tables_cache|= RAND_TABLE_BIT;
|
||||||
if (arg_count)
|
if (arg_count)
|
||||||
{ // Only use argument once in query
|
{ // Only use argument once in query
|
||||||
uint32 tmp= (uint32) (args[0]->val_int());
|
/*
|
||||||
if ((rand= (struct rand_struct*) sql_alloc(sizeof(*rand))))
|
Allocate rand structure once: we must use thd->current_arena
|
||||||
randominit(rand,(uint32) (tmp*0x10001L+55555555L),
|
to create rand in proper mem_root if it's a prepared statement or
|
||||||
(uint32) (tmp*0x10000001L));
|
stored procedure.
|
||||||
|
*/
|
||||||
|
if (!rand && !(rand= (struct rand_struct*)
|
||||||
|
thd->current_arena->alloc(sizeof(*rand))))
|
||||||
|
return TRUE;
|
||||||
|
/*
|
||||||
|
PARAM_ITEM is returned if we're in statement prepare and consequently
|
||||||
|
no placeholder value is set yet.
|
||||||
|
*/
|
||||||
|
if (args[0]->type() != PARAM_ITEM)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
TODO: do not do reinit 'rand' for every execute of PS/SP if
|
||||||
|
args[0] is a constant.
|
||||||
|
*/
|
||||||
|
uint32 tmp= (uint32) args[0]->val_int();
|
||||||
|
randominit(rand, (uint32) (tmp*0x10001L+55555555L),
|
||||||
|
(uint32) (tmp*0x10000001L));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
THD *thd= current_thd;
|
|
||||||
/*
|
/*
|
||||||
No need to send a Rand log event if seed was given eg: RAND(seed),
|
No need to send a Rand log event if seed was given eg: RAND(seed),
|
||||||
as it will be replicated in the query as such.
|
as it will be replicated in the query as such.
|
||||||
@ -1038,6 +1055,7 @@ void Item_func_rand::fix_length_and_dec()
|
|||||||
thd->rand_saved_seed2=thd->rand.seed2;
|
thd->rand_saved_seed2=thd->rand.seed2;
|
||||||
rand= &thd->rand;
|
rand= &thd->rand;
|
||||||
}
|
}
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Item_func_rand::update_used_tables()
|
void Item_func_rand::update_used_tables()
|
||||||
|
@ -512,13 +512,13 @@ class Item_func_rand :public Item_real_func
|
|||||||
{
|
{
|
||||||
struct rand_struct *rand;
|
struct rand_struct *rand;
|
||||||
public:
|
public:
|
||||||
Item_func_rand(Item *a) :Item_real_func(a) {}
|
Item_func_rand(Item *a) :Item_real_func(a), rand(0) {}
|
||||||
Item_func_rand() :Item_real_func() {}
|
Item_func_rand() :Item_real_func() {}
|
||||||
double val();
|
double val();
|
||||||
const char *func_name() const { return "rand"; }
|
const char *func_name() const { return "rand"; }
|
||||||
bool const_item() const { return 0; }
|
bool const_item() const { return 0; }
|
||||||
void update_used_tables();
|
void update_used_tables();
|
||||||
void fix_length_and_dec();
|
bool fix_fields(THD *thd, struct st_table_list *tables, Item **ref);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -1284,7 +1284,8 @@ int subselect_uniquesubquery_engine::exec()
|
|||||||
error= table->file->index_read(table->record[0],
|
error= table->file->index_read(table->record[0],
|
||||||
tab->ref.key_buff,
|
tab->ref.key_buff,
|
||||||
tab->ref.key_length,HA_READ_KEY_EXACT);
|
tab->ref.key_length,HA_READ_KEY_EXACT);
|
||||||
if (error && error != HA_ERR_KEY_NOT_FOUND)
|
if (error &&
|
||||||
|
error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE)
|
||||||
error= report_error(table, error);
|
error= report_error(table, error);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1336,7 +1337,8 @@ int subselect_indexsubquery_engine::exec()
|
|||||||
error= table->file->index_read(table->record[0],
|
error= table->file->index_read(table->record[0],
|
||||||
tab->ref.key_buff,
|
tab->ref.key_buff,
|
||||||
tab->ref.key_length,HA_READ_KEY_EXACT);
|
tab->ref.key_length,HA_READ_KEY_EXACT);
|
||||||
if (error && error != HA_ERR_KEY_NOT_FOUND)
|
if (error &&
|
||||||
|
error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE)
|
||||||
error= report_error(table, error);
|
error= report_error(table, error);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -447,6 +447,7 @@ bool is_update_query(enum enum_sql_command command);
|
|||||||
bool alloc_query(THD *thd, char *packet, ulong packet_length);
|
bool alloc_query(THD *thd, char *packet, ulong packet_length);
|
||||||
void mysql_init_select(LEX *lex);
|
void mysql_init_select(LEX *lex);
|
||||||
void mysql_init_query(THD *thd, uchar *buf, uint length);
|
void mysql_init_query(THD *thd, uchar *buf, uint length);
|
||||||
|
void mysql_reset_thd_for_next_command(THD *thd);
|
||||||
bool mysql_new_select(LEX *lex, bool move_down);
|
bool mysql_new_select(LEX *lex, bool move_down);
|
||||||
void create_select_for_variable(const char *var_name);
|
void create_select_for_variable(const char *var_name);
|
||||||
void mysql_init_multi_delete(LEX *lex);
|
void mysql_init_multi_delete(LEX *lex);
|
||||||
|
@ -1498,7 +1498,7 @@ void Statement::restore_backup_statement(Statement *stmt, Statement *backup)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Statement::end_statement()
|
void THD::end_statement()
|
||||||
{
|
{
|
||||||
/* Cleanup SQL processing state to resuse this statement in next query. */
|
/* Cleanup SQL processing state to resuse this statement in next query. */
|
||||||
lex_end(lex);
|
lex_end(lex);
|
||||||
|
@ -582,12 +582,6 @@ public:
|
|||||||
void restore_backup_statement(Statement *stmt, Statement *backup);
|
void restore_backup_statement(Statement *stmt, Statement *backup);
|
||||||
/* return class type */
|
/* return class type */
|
||||||
virtual Type type() const;
|
virtual Type type() const;
|
||||||
|
|
||||||
/*
|
|
||||||
Cleanup statement parse state (parse tree, lex) after execution of
|
|
||||||
a non-prepared SQL statement.
|
|
||||||
*/
|
|
||||||
void end_statement();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -1063,6 +1057,12 @@ public:
|
|||||||
void nocheck_register_item_tree_change(Item **place, Item *old_value,
|
void nocheck_register_item_tree_change(Item **place, Item *old_value,
|
||||||
MEM_ROOT *runtime_memroot);
|
MEM_ROOT *runtime_memroot);
|
||||||
void rollback_item_tree_changes();
|
void rollback_item_tree_changes();
|
||||||
|
|
||||||
|
/*
|
||||||
|
Cleanup statement parse state (parse tree, lex) and execution
|
||||||
|
state after execution of a non-prepared SQL statement.
|
||||||
|
*/
|
||||||
|
void end_statement();
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Flags for the THD::system_thread (bitmap) variable */
|
/* Flags for the THD::system_thread (bitmap) variable */
|
||||||
|
@ -261,8 +261,6 @@ int mysql_ha_close(THD *thd, TABLE_LIST *tables)
|
|||||||
{
|
{
|
||||||
TABLE_LIST *hash_tables;
|
TABLE_LIST *hash_tables;
|
||||||
TABLE **table_ptr;
|
TABLE **table_ptr;
|
||||||
bool was_flushed= FALSE;
|
|
||||||
bool not_opened;
|
|
||||||
DBUG_ENTER("mysql_ha_close");
|
DBUG_ENTER("mysql_ha_close");
|
||||||
DBUG_PRINT("enter",("'%s'.'%s' as '%s'",
|
DBUG_PRINT("enter",("'%s'.'%s' as '%s'",
|
||||||
tables->db, tables->real_name, tables->alias));
|
tables->db, tables->real_name, tables->alias));
|
||||||
@ -366,7 +364,6 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
|
|||||||
uint num_rows;
|
uint num_rows;
|
||||||
byte *key;
|
byte *key;
|
||||||
uint key_len;
|
uint key_len;
|
||||||
bool was_flushed;
|
|
||||||
DBUG_ENTER("mysql_ha_read");
|
DBUG_ENTER("mysql_ha_read");
|
||||||
DBUG_PRINT("enter",("'%s'.'%s' as '%s'",
|
DBUG_PRINT("enter",("'%s'.'%s' as '%s'",
|
||||||
tables->db, tables->real_name, tables->alias));
|
tables->db, tables->real_name, tables->alias));
|
||||||
@ -624,10 +621,8 @@ err0:
|
|||||||
|
|
||||||
int mysql_ha_flush(THD *thd, TABLE_LIST *tables, uint mode_flags)
|
int mysql_ha_flush(THD *thd, TABLE_LIST *tables, uint mode_flags)
|
||||||
{
|
{
|
||||||
TABLE_LIST **tmp_tables_p;
|
|
||||||
TABLE_LIST *tmp_tables;
|
TABLE_LIST *tmp_tables;
|
||||||
TABLE **table_ptr;
|
TABLE **table_ptr;
|
||||||
bool was_flushed;
|
|
||||||
DBUG_ENTER("mysql_ha_flush");
|
DBUG_ENTER("mysql_ha_flush");
|
||||||
DBUG_PRINT("enter", ("tables: %p mode_flags: 0x%02x", tables, mode_flags));
|
DBUG_PRINT("enter", ("tables: %p mode_flags: 0x%02x", tables, mode_flags));
|
||||||
|
|
||||||
@ -703,14 +698,13 @@ static int mysql_ha_flush_table(THD *thd, TABLE **table_ptr, uint mode_flags)
|
|||||||
{
|
{
|
||||||
TABLE_LIST *hash_tables;
|
TABLE_LIST *hash_tables;
|
||||||
TABLE *table= *table_ptr;
|
TABLE *table= *table_ptr;
|
||||||
bool was_flushed;
|
|
||||||
DBUG_ENTER("mysql_ha_flush_table");
|
DBUG_ENTER("mysql_ha_flush_table");
|
||||||
DBUG_PRINT("enter",("'%s'.'%s' as '%s' flags: 0x%02x",
|
DBUG_PRINT("enter",("'%s'.'%s' as '%s' flags: 0x%02x",
|
||||||
table->table_cache_key, table->real_name,
|
table->table_cache_key, table->real_name,
|
||||||
table->table_name, mode_flags));
|
table->table_name, mode_flags));
|
||||||
|
|
||||||
if ((hash_tables= (TABLE_LIST*) hash_search(&thd->handler_tables_hash,
|
if ((hash_tables= (TABLE_LIST*) hash_search(&thd->handler_tables_hash,
|
||||||
(*table_ptr)->table_name,
|
(byte*) (*table_ptr)->table_name,
|
||||||
strlen((*table_ptr)->table_name) + 1)))
|
strlen((*table_ptr)->table_name) + 1)))
|
||||||
{
|
{
|
||||||
if (! (mode_flags & MYSQL_HA_REOPEN_ON_USAGE))
|
if (! (mode_flags & MYSQL_HA_REOPEN_ON_USAGE))
|
||||||
|
@ -117,7 +117,30 @@ void lex_free(void)
|
|||||||
void lex_start(THD *thd, uchar *buf,uint length)
|
void lex_start(THD *thd, uchar *buf,uint length)
|
||||||
{
|
{
|
||||||
LEX *lex= thd->lex;
|
LEX *lex= thd->lex;
|
||||||
|
lex->unit.init_query();
|
||||||
|
lex->unit.init_select();
|
||||||
lex->thd= thd;
|
lex->thd= thd;
|
||||||
|
lex->unit.thd= thd;
|
||||||
|
lex->select_lex.init_query();
|
||||||
|
lex->value_list.empty();
|
||||||
|
lex->param_list.empty();
|
||||||
|
lex->unit.next= lex->unit.master=
|
||||||
|
lex->unit.link_next= lex->unit.return_to= 0;
|
||||||
|
lex->unit.prev= lex->unit.link_prev= 0;
|
||||||
|
lex->unit.slave= lex->unit.global_parameters= lex->current_select=
|
||||||
|
lex->all_selects_list= &lex->select_lex;
|
||||||
|
lex->select_lex.master= &lex->unit;
|
||||||
|
lex->select_lex.prev= &lex->unit.slave;
|
||||||
|
lex->select_lex.link_next= lex->select_lex.slave= lex->select_lex.next= 0;
|
||||||
|
lex->select_lex.link_prev= (st_select_lex_node**)&(lex->all_selects_list);
|
||||||
|
lex->select_lex.options= 0;
|
||||||
|
lex->describe= 0;
|
||||||
|
lex->derived_tables= FALSE;
|
||||||
|
lex->lock_option= TL_READ;
|
||||||
|
lex->found_colon= 0;
|
||||||
|
lex->safe_to_cache_query= 1;
|
||||||
|
lex->time_zone_tables_used= 0;
|
||||||
|
lex->select_lex.select_number= 1;
|
||||||
lex->next_state=MY_LEX_START;
|
lex->next_state=MY_LEX_START;
|
||||||
lex->end_of_query=(lex->ptr=buf)+length;
|
lex->end_of_query=(lex->ptr=buf)+length;
|
||||||
lex->yylineno = 1;
|
lex->yylineno = 1;
|
||||||
|
@ -369,7 +369,7 @@ public:
|
|||||||
ulong init_prepare_fake_select_lex(THD *thd);
|
ulong init_prepare_fake_select_lex(THD *thd);
|
||||||
int change_result(select_subselect *result, select_subselect *old_result);
|
int change_result(select_subselect *result, select_subselect *old_result);
|
||||||
|
|
||||||
friend void mysql_init_query(THD *thd, uchar *buf, uint length);
|
friend void lex_start(THD *thd, uchar *buf, uint length);
|
||||||
friend int subselect_union_engine::exec();
|
friend int subselect_union_engine::exec();
|
||||||
private:
|
private:
|
||||||
bool create_total_list_n_last_return(THD *thd, st_lex *lex,
|
bool create_total_list_n_last_return(THD *thd, st_lex *lex,
|
||||||
@ -508,7 +508,7 @@ public:
|
|||||||
|
|
||||||
bool test_limit();
|
bool test_limit();
|
||||||
|
|
||||||
friend void mysql_init_query(THD *thd, uchar *buf, uint length);
|
friend void lex_start(THD *thd, uchar *buf, uint length);
|
||||||
st_select_lex() {}
|
st_select_lex() {}
|
||||||
void make_empty_select()
|
void make_empty_select()
|
||||||
{
|
{
|
||||||
|
@ -1001,16 +1001,15 @@ pthread_handler_decl(handle_one_connection,arg)
|
|||||||
net->compress=1; // Use compression
|
net->compress=1; // Use compression
|
||||||
|
|
||||||
thd->version= refresh_version;
|
thd->version= refresh_version;
|
||||||
|
thd->proc_info= 0;
|
||||||
|
thd->set_time();
|
||||||
|
thd->init_for_queries();
|
||||||
if (sys_init_connect.value_length && !(thd->master_access & SUPER_ACL))
|
if (sys_init_connect.value_length && !(thd->master_access & SUPER_ACL))
|
||||||
{
|
{
|
||||||
execute_init_command(thd, &sys_init_connect, &LOCK_sys_init_connect);
|
execute_init_command(thd, &sys_init_connect, &LOCK_sys_init_connect);
|
||||||
if (thd->query_error)
|
if (thd->query_error)
|
||||||
thd->killed= 1;
|
thd->killed= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
thd->proc_info=0;
|
|
||||||
thd->set_time();
|
|
||||||
thd->init_for_queries();
|
|
||||||
while (!net->error && net->vio != 0 && !thd->killed)
|
while (!net->error && net->vio != 0 && !thd->killed)
|
||||||
{
|
{
|
||||||
if (do_command(thd))
|
if (do_command(thd))
|
||||||
@ -3854,7 +3853,6 @@ bool my_yyoverflow(short **yyss, YYSTYPE **yyvs, ulong *yystacksize)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
Initialize global thd variables needed for query
|
Initialize global thd variables needed for query
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@ -3863,33 +3861,31 @@ void
|
|||||||
mysql_init_query(THD *thd, uchar *buf, uint length)
|
mysql_init_query(THD *thd, uchar *buf, uint length)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("mysql_init_query");
|
DBUG_ENTER("mysql_init_query");
|
||||||
LEX *lex= thd->lex;
|
|
||||||
lex->unit.init_query();
|
|
||||||
lex->unit.init_select();
|
|
||||||
lex->unit.thd= thd;
|
|
||||||
lex->select_lex.init_query();
|
|
||||||
lex->value_list.empty();
|
|
||||||
lex->param_list.empty();
|
|
||||||
lex->unit.next= lex->unit.master=
|
|
||||||
lex->unit.link_next= lex->unit.return_to=0;
|
|
||||||
lex->unit.prev= lex->unit.link_prev= 0;
|
|
||||||
lex->unit.slave= lex->unit.global_parameters= lex->current_select=
|
|
||||||
lex->all_selects_list= &lex->select_lex;
|
|
||||||
lex->select_lex.master= &lex->unit;
|
|
||||||
lex->select_lex.prev= &lex->unit.slave;
|
|
||||||
lex->select_lex.link_next= lex->select_lex.slave= lex->select_lex.next= 0;
|
|
||||||
lex->select_lex.link_prev= (st_select_lex_node**)&(lex->all_selects_list);
|
|
||||||
lex->select_lex.options=0;
|
|
||||||
lex->describe= 0;
|
|
||||||
lex->derived_tables= FALSE;
|
|
||||||
lex->lock_option= TL_READ;
|
|
||||||
lex->found_colon= 0;
|
|
||||||
lex->safe_to_cache_query= 1;
|
|
||||||
lex->time_zone_tables_used= 0;
|
|
||||||
lex_start(thd, buf, length);
|
lex_start(thd, buf, length);
|
||||||
thd->select_number= lex->select_lex.select_number= 1;
|
mysql_reset_thd_for_next_command(thd);
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Reset THD part responsible for command processing state.
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
This needs to be called before execution of every statement
|
||||||
|
(prepared or conventional).
|
||||||
|
|
||||||
|
TODO
|
||||||
|
Make it a method of THD and align its name with the rest of
|
||||||
|
reset/end/start/init methods.
|
||||||
|
Call it after we use THD for queries, not before.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void mysql_reset_thd_for_next_command(THD *thd)
|
||||||
|
{
|
||||||
|
DBUG_ENTER("mysql_reset_thd_for_next_command");
|
||||||
thd->free_list= 0;
|
thd->free_list= 0;
|
||||||
thd->total_warn_count=0; // Warnings for this query
|
thd->select_number= 1;
|
||||||
|
thd->total_warn_count= 0; // Warnings for this query
|
||||||
thd->last_insert_id_used= thd->query_start_used= thd->insert_id_used=0;
|
thd->last_insert_id_used= thd->query_start_used= thd->insert_id_used=0;
|
||||||
thd->sent_row_count= thd->examined_row_count= 0;
|
thd->sent_row_count= thd->examined_row_count= 0;
|
||||||
thd->is_fatal_error= thd->rand_used= thd->time_zone_used= 0;
|
thd->is_fatal_error= thd->rand_used= thd->time_zone_used= 0;
|
||||||
|
@ -1760,6 +1760,8 @@ void mysql_stmt_execute(THD *thd, char *packet, uint packet_length)
|
|||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DBUG_ASSERT(thd->free_list == NULL);
|
||||||
|
mysql_reset_thd_for_next_command(thd);
|
||||||
#ifndef EMBEDDED_LIBRARY
|
#ifndef EMBEDDED_LIBRARY
|
||||||
if (stmt->param_count)
|
if (stmt->param_count)
|
||||||
{
|
{
|
||||||
@ -1778,7 +1780,6 @@ void mysql_stmt_execute(THD *thd, char *packet, uint packet_length)
|
|||||||
if (stmt->param_count && stmt->set_params_data(stmt, &expanded_query))
|
if (stmt->param_count && stmt->set_params_data(stmt, &expanded_query))
|
||||||
goto set_params_data_err;
|
goto set_params_data_err;
|
||||||
#endif
|
#endif
|
||||||
DBUG_ASSERT(thd->free_list == NULL);
|
|
||||||
thd->protocol= &thd->protocol_prep; // Switch to binary protocol
|
thd->protocol= &thd->protocol_prep; // Switch to binary protocol
|
||||||
execute_stmt(thd, stmt, &expanded_query, true);
|
execute_stmt(thd, stmt, &expanded_query, true);
|
||||||
thd->protocol= &thd->protocol_simple; // Use normal protocol
|
thd->protocol= &thd->protocol_simple; // Use normal protocol
|
||||||
@ -1823,7 +1824,8 @@ void mysql_sql_stmt_execute(THD *thd, LEX_STRING *stmt_name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
DBUG_ASSERT(thd->free_list == NULL);
|
DBUG_ASSERT(thd->free_list == NULL);
|
||||||
|
/* Must go before setting variables, as it clears thd->user_var_events */
|
||||||
|
mysql_reset_thd_for_next_command(thd);
|
||||||
thd->set_n_backup_statement(stmt, &thd->stmt_backup);
|
thd->set_n_backup_statement(stmt, &thd->stmt_backup);
|
||||||
if (stmt->set_params_from_vars(stmt,
|
if (stmt->set_params_from_vars(stmt,
|
||||||
thd->stmt_backup.lex->prepared_stmt_params,
|
thd->stmt_backup.lex->prepared_stmt_params,
|
||||||
@ -1932,6 +1934,7 @@ void mysql_stmt_reset(THD *thd, char *packet)
|
|||||||
*/
|
*/
|
||||||
reset_stmt_params(stmt);
|
reset_stmt_params(stmt);
|
||||||
|
|
||||||
|
mysql_reset_thd_for_next_command(thd);
|
||||||
send_ok(thd);
|
send_ok(thd);
|
||||||
|
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
|
@ -499,6 +499,10 @@ my_bool my_like_range_mb(CHARSET_INFO *cs,
|
|||||||
{
|
{
|
||||||
char buf[10];
|
char buf[10];
|
||||||
uint buflen;
|
uint buflen;
|
||||||
|
uint charlen= my_charpos(cs, min_org, min_str, res_length/cs->mbmaxlen);
|
||||||
|
|
||||||
|
if (charlen < (uint) (min_str - min_org))
|
||||||
|
min_str= min_org + charlen;
|
||||||
|
|
||||||
/* Write min key */
|
/* Write min key */
|
||||||
*min_length= (uint) (min_str - min_org);
|
*min_length= (uint) (min_str - min_org);
|
||||||
|
@ -2059,7 +2059,7 @@ static MY_COLLATION_HANDLER my_collation_ci_handler =
|
|||||||
my_strnncoll_utf8,
|
my_strnncoll_utf8,
|
||||||
my_strnncollsp_utf8,
|
my_strnncollsp_utf8,
|
||||||
my_strnxfrm_utf8,
|
my_strnxfrm_utf8,
|
||||||
my_like_range_simple,
|
my_like_range_mb,
|
||||||
my_wildcmp_mb,
|
my_wildcmp_mb,
|
||||||
my_strcasecmp_utf8,
|
my_strcasecmp_utf8,
|
||||||
my_instr_mb,
|
my_instr_mb,
|
||||||
@ -2119,7 +2119,7 @@ CHARSET_INFO my_charset_utf8_general_ci=
|
|||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
3, /* mbmaxlen */
|
3, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
255, /* max_sort_char */
|
0xFFFF, /* max_sort_char */
|
||||||
&my_charset_utf8_handler,
|
&my_charset_utf8_handler,
|
||||||
&my_collation_ci_handler
|
&my_collation_ci_handler
|
||||||
};
|
};
|
||||||
|
1076
tests/client_test.c
1076
tests/client_test.c
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user