mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
merge (+ multi-table fix)
This commit is contained in:
commit
8663419e31
16 changed files with 256 additions and 115 deletions
|
@ -80,5 +80,5 @@ EOF
|
|||
fi
|
||||
|
||||
else
|
||||
echo "commit failed because '$BK_STATUS', sorry life is hard..."
|
||||
echo "commit failed because '$BK_STATUS', you may need to re-clone..."
|
||||
fi
|
||||
|
|
|
@ -14186,7 +14186,10 @@ Set the default character set. @xref{Character sets}.
|
|||
@item --default-table-type=type
|
||||
Set the default table type for tables. @xref{Table types}.
|
||||
|
||||
@item --delay-key-write-for-all-tables
|
||||
@item --delay-key-write[= OFF | ON | ALL]
|
||||
How MyISAM @code{DELAYED KEYS} should be used. @xref{Server parameters}.
|
||||
|
||||
@item --delay-key-write-for-all-tables; In MySQL 4.0.3 you should use --delay-key-write=ALL instead.
|
||||
Don't flush key buffers between writes for any @code{MyISAM} table.
|
||||
@xref{Server parameters}.
|
||||
|
||||
|
@ -14321,7 +14324,7 @@ correct it to stay within a given range and also adjusts the value a
|
|||
little to fix for the used algorithm.
|
||||
|
||||
@item --safe-mode
|
||||
Skip some optimise stages. Implies @code{--skip-delay-key-write}.
|
||||
Skip some optimise stages.
|
||||
|
||||
@item --safe-show-database
|
||||
With this option, the @code{SHOW DATABASES} command returns only those
|
||||
|
@ -14340,8 +14343,8 @@ Turn off the ability to select and insert at the same time on @code{MyISAM}
|
|||
tables. (This is only to be used if you think you have found a bug in this
|
||||
feature.)
|
||||
|
||||
@item --skip-delay-key-write
|
||||
Ignore the @code{delay_key_write} option for all tables.
|
||||
@item --skip-delay-key-write; In MySQL 4.0.3 you should use --delay-key-write=OFF instead.
|
||||
Ignore the @code{DELAY_KEY_WRITE} option for all tables.
|
||||
@xref{Server parameters}.
|
||||
|
||||
@item --skip-grant-tables
|
||||
|
@ -14370,8 +14373,7 @@ Don't listen for TCP/IP connections at all. All interaction with
|
|||
recommended for systems where only local requests are allowed. @xref{DNS}.
|
||||
|
||||
@item --skip-new
|
||||
Don't use new, possible wrong routines. Implies @code{--skip-delay-key-write}.
|
||||
This will also set default table type to @code{ISAM}. @xref{ISAM}.
|
||||
Don't use new, possible wrong routines.
|
||||
|
||||
@item --skip-symlink
|
||||
Don't delete or rename files that a symlinked file in the data directory
|
||||
|
@ -19848,16 +19850,20 @@ packet before responding with @code{Bad handshake}.
|
|||
The value of the @code{--datadir} option.
|
||||
|
||||
@item @code{delay_key_write}
|
||||
If enabled (is on by default), MySQL will honor the
|
||||
@code{DELAY_KEY_WRITE} option for @code{CREATE TABLE}. This means that the
|
||||
key buffer for tables with this option will not get flushed on every
|
||||
index update, but only when a table is closed. This will speed up
|
||||
writes on keys a lot, but you should add automatic checking of all tables
|
||||
with @code{myisamchk --fast --force} if you use this. Note that if you
|
||||
start @code{mysqld} with the @code{--delay-key-write-for-all-tables}
|
||||
option this means that all tables will be treated as if they were
|
||||
created with the @code{delay_key_write} option. You can clear this flag
|
||||
by starting @code{mysqld} with @code{--skip-new} or @code{--safe-mode}.
|
||||
Option for MyISAM tables. Can have one of the following values:
|
||||
|
||||
@multitable @columnfractions .30 .70
|
||||
@item OFF @tab All CREATE TABLE ... DELAYED_KEY_WRITES are ignored.
|
||||
@item ON @tab (default) MySQL will honor the @code{DELAY_KEY_WRITE} option
|
||||
for @code{CREATE TABLE}.
|
||||
@item ALL @tab All new opened tables are treated as if they were created with the @code{DELAY_KEY_WRITE} option.
|
||||
@end multitable
|
||||
|
||||
If @code{DELAY_KEY_WRITE} is enabled this means that the key buffer for
|
||||
tables with this option will not get flushed on every index update, but
|
||||
only when a table is closed. This will speed up writes on keys a lot,
|
||||
but you should add automatic checking of all tables with @code{myisamchk
|
||||
--fast --force} if you use this.
|
||||
|
||||
@item @code{delayed_insert_limit}
|
||||
After inserting @code{delayed_insert_limit} rows, the @code{INSERT
|
||||
|
@ -19961,7 +19967,7 @@ status} and examine the variables @code{Key_read_requests},
|
|||
The @code{Key_write/Key_write_requests} is usually near 1 if you are
|
||||
using mostly updates/deletes but may be much smaller if you tend to
|
||||
do updates that affect many at the same time or if you are
|
||||
using @code{delay_key_write}. @xref{SHOW, , @code{SHOW}}.
|
||||
using @code{DELAY_KEY_WRITE}. @xref{SHOW, , @code{SHOW}}.
|
||||
|
||||
To get even more speed when writing many rows at the same time, use
|
||||
@code{LOCK TABLES}. @xref{LOCK TABLES, , @code{LOCK TABLES}}.
|
||||
|
@ -24477,7 +24483,7 @@ offset by network delays.
|
|||
writes to it, and configure as many slaves as you have the money and
|
||||
rackspace for, distributing the reads among the master and the slaves.
|
||||
You can also start the slaves with @code{--skip-bdb},
|
||||
@code{--low-priority-updates} and @code{--delay-key-write-for-all-tables}
|
||||
@code{--low-priority-updates} and @code{--delay-key-write=ALL}
|
||||
to get speed improvements for the slave. In this case the slave will
|
||||
use non-transactional @code{MyISAM} tables instead of @code{BDB} tables
|
||||
to get more speed.
|
||||
|
@ -28630,7 +28636,7 @@ and if you can use @code{GLOBAL} or @code{SESSION} with them.
|
|||
@item concurrent_insert @tab bool @tab GLOBAL
|
||||
@item connect_timeout @tab num @tab GLOBAL
|
||||
@item convert_character_set @tab string @tab SESSION
|
||||
@item delay_key_write @tab bool @tab GLOBAL
|
||||
@item delay_key_write @tab OFF | ON | ALL @tab GLOBAL
|
||||
@item delayed_insert_limit @tab num @tab GLOBAL
|
||||
@item delayed_insert_timeout @tab num @tab GLOBAL
|
||||
@item delayed_queue_size @tab num @tab GLOBAL
|
||||
|
@ -28717,6 +28723,7 @@ Here is a description of some of the variables:
|
|||
@item identity @tab Alias for last_insert_id (Sybase compatiblity)
|
||||
@item sql_low_priority_updates @tab Alias for low_priority_updates
|
||||
@item sql_max_join_size @tab Alias for max_join_size
|
||||
@item delay_key_write_for_all_tables @tab If this and delay_key_write is set then all new MyISAM tables that are opened will use delayed key writes.
|
||||
@item version @tab Alias for VERSION() (Sybase (?) compatability)
|
||||
@end multitable
|
||||
|
||||
|
@ -37704,7 +37711,7 @@ The following options to @code{mysqld} can be used to change the behaviour of
|
|||
@item @strong{Option} @tab @strong{Description}
|
||||
@item @code{--myisam-recover=#} @tab Automatic recovery of crashed tables.
|
||||
@item @code{-O myisam_sort_buffer_size=#} @tab Buffer used when recovering tables.
|
||||
@item @code{--delay-key-write-for-all-tables} @tab Don't flush key buffers between writes for any MyISAM table
|
||||
@item @code{--delay-key-write=ALL} @tab Don't flush key buffers between writes for any MyISAM table
|
||||
@item @code{-O myisam_max_extra_sort_file_size=#} @tab Used to help MySQL to decide when to use the slow but safe key cache index create method. @strong{Note} that this parameter is given in megabytes before 4.0.3 and in bytes starting from this version.
|
||||
@item @code{-O myisam_max_sort_file_size=#} @tab Don't use the fast sort index method to created index if the temporary file would get bigger than this. @strong{Note} that this parameter is given in megabytes before 4.0.3 and in bytes starting from this version.
|
||||
@item @code{-O bulk_insert_buffer_size=#} @tab Size of tree cache used in bulk insert optimisation. @strong{Note} that this is a limit @strong{per thread}!
|
||||
|
@ -50250,6 +50257,9 @@ each individual 4.0.x release.
|
|||
Added @code{QUOTE()} function that performs SQL quoting to produce values
|
||||
that can be used as data values in queries.
|
||||
@item
|
||||
Changed variable @code{DELAY_KEY_WRITE} to an enum to allow one set
|
||||
@code{DELAY_KEY_WRITE} for all tables without taking down the server.
|
||||
@item
|
||||
Changed behavior of @code{IF(condition,column,NULL)} so that it returns
|
||||
the value of the column type.
|
||||
@item
|
||||
|
@ -50841,6 +50851,7 @@ users use this code as the rest of the code and because of this we are
|
|||
not yet 100% confident in this code.
|
||||
|
||||
@menu
|
||||
* News-3.23.53:: Changes in release 3.23.53
|
||||
* News-3.23.52:: Changes in release 3.23.52
|
||||
* News-3.23.51:: Changes in release 3.23.51 (31 May 2002)
|
||||
* News-3.23.50:: Changes in release 3.23.50 (21 Apr 2002)
|
||||
|
@ -50897,8 +50908,15 @@ not yet 100% confident in this code.
|
|||
* News-3.23.0:: Changes in release 3.23.0 (05 Aug 1999: Alpha)
|
||||
@end menu
|
||||
|
||||
@node News-3.23.52, News-3.23.51, News-3.23.x, News-3.23.x
|
||||
@node News-3.23.53, News-3.23.52, News-3.23.x, News-3.23.x
|
||||
@appendixsubsec Changes in release 3.23.53
|
||||
|
||||
@itemize @bullet
|
||||
@end itemize
|
||||
|
||||
@node News-3.23.52, News-3.23.51, News-3.23.53, News-3.23.x
|
||||
@appendixsubsec Changes in release 3.23.52
|
||||
|
||||
@itemize @bullet
|
||||
@item
|
||||
Fixed problem with @code{UNSIGNED BIGINT} on AIX.
|
||||
|
|
|
@ -25,33 +25,37 @@ can wait inside InnoDB */
|
|||
|
||||
#ifdef __WIN__
|
||||
typedef void* os_thread_t;
|
||||
typedef ulint os_thread_id_t; /* In Windows the thread id
|
||||
is an unsigned long int */
|
||||
#else
|
||||
typedef pthread_t os_thread_t;
|
||||
typedef os_thread_t os_thread_id_t; /* In Unix we use the thread
|
||||
handle itself as the id of
|
||||
the thread */
|
||||
#endif
|
||||
|
||||
#define os_thread_id_t os_thread_t
|
||||
|
||||
/* Define a function pointer type to use in a typecast */
|
||||
typedef void* (*os_posix_f_t) (void*);
|
||||
|
||||
/*******************************************************************
|
||||
Compares two threads or thread ids for equality */
|
||||
Compares two thread ids for equality. */
|
||||
|
||||
ibool
|
||||
os_thread_eq(
|
||||
/*=========*/
|
||||
/* out: TRUE if equal */
|
||||
os_thread_t a, /* in: OS thread or thread id */
|
||||
os_thread_t b); /* in: OS thread or thread id */
|
||||
os_thread_id_t a, /* in: OS thread or thread id */
|
||||
os_thread_id_t b); /* in: OS thread or thread id */
|
||||
/********************************************************************
|
||||
Converts an OS thread or thread id to a ulint. It is NOT guaranteed that
|
||||
the ulint is unique for the thread though! */
|
||||
Converts an OS thread id to a ulint. It is NOT guaranteed that the ulint is
|
||||
unique for the thread though! */
|
||||
|
||||
ulint
|
||||
os_thread_pf(
|
||||
/*=========*/
|
||||
/* out: unsigned long int */
|
||||
os_thread_t a); /* in: thread or thread id */
|
||||
os_thread_id_t a); /* in: thread or thread id */
|
||||
/********************************************************************
|
||||
Creates a new thread of execution. The execution starts from
|
||||
the function given. The start function takes a void* parameter
|
||||
|
@ -69,10 +73,8 @@ os_thread_create(
|
|||
#endif
|
||||
void* arg, /* in: argument to start
|
||||
function */
|
||||
os_thread_id_t* thread_id); /* out: id of created
|
||||
thread; currently this is
|
||||
identical to the handle to
|
||||
the thread */
|
||||
os_thread_id_t* thread_id); /* out: id of the created
|
||||
thread */
|
||||
/*********************************************************************
|
||||
A thread calling this function ends its execution. */
|
||||
|
||||
|
|
|
@ -19,14 +19,14 @@ Created 9/8/1995 Heikki Tuuri
|
|||
#include "srv0srv.h"
|
||||
|
||||
/*******************************************************************
|
||||
Compares two threads or thread ids for equality */
|
||||
Compares two thread ids for equality. */
|
||||
|
||||
ibool
|
||||
os_thread_eq(
|
||||
/*=========*/
|
||||
/* out: TRUE if equal */
|
||||
os_thread_t a, /* in: OS thread or thread id */
|
||||
os_thread_t b) /* in: OS thread or thread id */
|
||||
os_thread_id_t a, /* in: OS thread or thread id */
|
||||
os_thread_id_t b) /* in: OS thread or thread id */
|
||||
{
|
||||
#ifdef __WIN__
|
||||
if (a == b) {
|
||||
|
@ -44,13 +44,13 @@ os_thread_eq(
|
|||
}
|
||||
|
||||
/********************************************************************
|
||||
Converts an OS thread or thread id to a ulint. It is NOT guaranteed that
|
||||
the ulint is unique for the thread though! */
|
||||
Converts an OS thread id to a ulint. It is NOT guaranteed that the ulint is
|
||||
unique for the thread though! */
|
||||
|
||||
ulint
|
||||
os_thread_pf(
|
||||
/*=========*/
|
||||
os_thread_t a)
|
||||
os_thread_id_t a)
|
||||
{
|
||||
#ifdef UNIV_HPUX
|
||||
/* In HP-UX a pthread_t is a struct of 3 fields: field1, field2,
|
||||
|
@ -64,15 +64,15 @@ os_thread_pf(
|
|||
|
||||
/*********************************************************************
|
||||
Returns the thread identifier of current thread. Currently the thread
|
||||
identifier is the thread handle itself. Note that in HP-UX pthread_t is
|
||||
a struct of 3 fields. */
|
||||
identifier in Unix is the thread handle itself. Note that in HP-UX
|
||||
pthread_t is a struct of 3 fields. */
|
||||
|
||||
os_thread_id_t
|
||||
os_thread_get_curr_id(void)
|
||||
/*=======================*/
|
||||
{
|
||||
#ifdef __WIN__
|
||||
return(GetCurrentThread());
|
||||
return(GetCurrentThreadId());
|
||||
#else
|
||||
return(pthread_self());
|
||||
#endif
|
||||
|
@ -95,11 +95,8 @@ os_thread_create(
|
|||
#endif
|
||||
void* arg, /* in: argument to start
|
||||
function */
|
||||
os_thread_id_t* thread_id __attribute__((unused)))
|
||||
/* out: id of created
|
||||
thread; currently this is
|
||||
identical to the handle to
|
||||
the thread */
|
||||
os_thread_id_t* thread_id) /* out: id of the created
|
||||
thread */
|
||||
{
|
||||
#ifdef __WIN__
|
||||
os_thread_t thread;
|
||||
|
@ -121,7 +118,7 @@ os_thread_create(
|
|||
ut_a(SetThreadPriority(thread, srv_query_thread_priority));
|
||||
}
|
||||
|
||||
*thread_id = thread;
|
||||
*thread_id = win_thread_id;
|
||||
|
||||
return(thread);
|
||||
#else
|
||||
|
|
|
@ -267,7 +267,7 @@ insert into t1 values (-.1),(+.1),(.1);
|
|||
insert into t1 values (00000000000001),(+0000000000001),(-0000000000001);
|
||||
insert into t1 values (+111111111.11),(111111111.11),(-11111111.11);
|
||||
insert into t1 values (-111111111.11),(+1111111111.11),(1111111111.11);
|
||||
insert into t1 values (1e+1000),(1e-1000),(-1e+1000);
|
||||
insert into t1 values (1e+100),(1e-100),(-1e+100);
|
||||
insert into t1 values (123.4e0),(123.4e+2),(123.4e-2),(123e1),(123e+0);
|
||||
select * from t1;
|
||||
a
|
||||
|
|
|
@ -219,7 +219,21 @@ set convert_character_set=cp1251_koi8;
|
|||
set convert_character_set=default;
|
||||
set @@global.concurrent_insert=1;
|
||||
set global connect_timeout=100;
|
||||
select @@delay_key_write;
|
||||
@@delay_key_write
|
||||
ON
|
||||
set global delay_key_write="OFF";
|
||||
select @@delay_key_write;
|
||||
@@delay_key_write
|
||||
OFF
|
||||
set global delay_key_write=ALL;
|
||||
select @@delay_key_write;
|
||||
@@delay_key_write
|
||||
ALL
|
||||
set global delay_key_write=1;
|
||||
select @@delay_key_write;
|
||||
@@delay_key_write
|
||||
ON
|
||||
set global delayed_insert_limit=100;
|
||||
set global delayed_insert_timeout=100;
|
||||
set global delayed_queue_size=100;
|
||||
|
|
|
@ -195,7 +195,7 @@ insert into t1 values (-.1),(+.1),(.1);
|
|||
insert into t1 values (00000000000001),(+0000000000001),(-0000000000001);
|
||||
insert into t1 values (+111111111.11),(111111111.11),(-11111111.11);
|
||||
insert into t1 values (-111111111.11),(+1111111111.11),(1111111111.11);
|
||||
insert into t1 values (1e+1000),(1e-1000),(-1e+1000);
|
||||
insert into t1 values (1e+100),(1e-100),(-1e+100);
|
||||
insert into t1 values (123.4e0),(123.4e+2),(123.4e-2),(123e1),(123e+0);
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
|
|
|
@ -143,7 +143,13 @@ set convert_character_set=cp1251_koi8;
|
|||
set convert_character_set=default;
|
||||
set @@global.concurrent_insert=1;
|
||||
set global connect_timeout=100;
|
||||
select @@delay_key_write;
|
||||
set global delay_key_write="OFF";
|
||||
select @@delay_key_write;
|
||||
set global delay_key_write=ALL;
|
||||
select @@delay_key_write;
|
||||
set global delay_key_write=1;
|
||||
select @@delay_key_write;
|
||||
set global delayed_insert_limit=100;
|
||||
set global delayed_insert_timeout=100;
|
||||
set global delayed_queue_size=100;
|
||||
|
|
|
@ -259,57 +259,66 @@ convert_error_code_to_mysql(
|
|||
extern "C" {
|
||||
/*****************************************************************
|
||||
Prints info of a THD object (== user session thread) to the
|
||||
standard output. NOTE that mysql/innobase/trx/trx0trx.c must contain
|
||||
standard output. NOTE that /mysql/innobase/trx/trx0trx.c must contain
|
||||
the prototype for this function! */
|
||||
|
||||
void
|
||||
innobase_mysql_print_thd(
|
||||
/*=====================*/
|
||||
char* buf, /* in/out: buffer where to print, must be at least
|
||||
300 bytes */
|
||||
void* input_thd)/* in: pointer to a MySQL THD object */
|
||||
char* buf, /* in/out: buffer where to print, must be at least
|
||||
400 bytes */
|
||||
void* input_thd)/* in: pointer to a MySQL THD object */
|
||||
{
|
||||
THD* thd;
|
||||
THD* thd;
|
||||
char* old_buf = buf;
|
||||
|
||||
thd = (THD*) input_thd;
|
||||
thd = (THD*) input_thd;
|
||||
|
||||
/* We can't use value of sprintf() as this is not portable */
|
||||
buf+= my_sprintf(buf,
|
||||
/* We cannot use the return value of normal sprintf() as this is
|
||||
not portable to some old non-Posix Unixes, e.g., some old SCO
|
||||
Unixes */
|
||||
|
||||
buf += my_sprintf(buf,
|
||||
(buf, "MySQL thread id %lu, query id %lu",
|
||||
thd->thread_id, thd->query_id));
|
||||
if (thd->host)
|
||||
{
|
||||
*buf++=' ';
|
||||
buf=strnmov(buf, thd->host, 30);
|
||||
if (thd->host) {
|
||||
*buf = ' ';
|
||||
buf++;
|
||||
buf = strnmov(buf, thd->host, 30);
|
||||
}
|
||||
|
||||
if (thd->ip)
|
||||
{
|
||||
*buf++=' ';
|
||||
buf=strnmov(buf, thd->ip, 20);
|
||||
if (thd->ip) {
|
||||
*buf = ' ';
|
||||
buf++;
|
||||
buf=strnmov(buf, thd->ip, 20);
|
||||
}
|
||||
|
||||
if (thd->user)
|
||||
{
|
||||
*buf++=' ';
|
||||
buf=strnmov(buf, thd->user, 20);
|
||||
if (thd->user) {
|
||||
*buf = ' ';
|
||||
buf++;
|
||||
buf=strnmov(buf, thd->user, 20);
|
||||
}
|
||||
|
||||
if (thd->proc_info)
|
||||
{
|
||||
*buf++=' ';
|
||||
buf=strnmov(buf, thd->proc_info, 50);
|
||||
if (thd->proc_info) {
|
||||
*buf = ' ';
|
||||
buf++;
|
||||
buf=strnmov(buf, thd->proc_info, 50);
|
||||
}
|
||||
|
||||
if (thd->query)
|
||||
{
|
||||
*buf++=' ';
|
||||
buf=strnmov(buf, thd->query, 150);
|
||||
if (thd->query) {
|
||||
*buf = '\n';
|
||||
buf++;
|
||||
buf=strnmov(buf, thd->query, 150);
|
||||
}
|
||||
buf[0]='\n';
|
||||
buf[1]=0;
|
||||
|
||||
ut_a(strlen(buf) < 400);
|
||||
buf[0] = '\n';
|
||||
buf[1] = '\0'; /* Note that we must put a null character here to end
|
||||
the printed string */
|
||||
|
||||
/* We test the printed length did not overrun the buffer length of
|
||||
400 bytes */
|
||||
|
||||
ut_a(strlen(old_buf) < 400);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -395,6 +404,9 @@ ha_innobase::update_thd(
|
|||
return(0);
|
||||
}
|
||||
|
||||
#ifdef notdefined
|
||||
/* The code here appears for documentational purposes only. Not used
|
||||
or tested yet. Will be used in 4.1. */
|
||||
/*********************************************************************
|
||||
Call this when you have opened a new table handle in HANDLER, before you
|
||||
call index_read_idx() etc. Actually, we can let the cursor stay open even
|
||||
|
@ -402,14 +414,15 @@ over a transaction commit! Then you should call this before every operation,
|
|||
fecth next etc. This function inits the necessary things even after a
|
||||
transaction commit. */
|
||||
|
||||
/* TODO: THIS CODE HAS NOT BEEN TESTED!!! */
|
||||
|
||||
void
|
||||
ha_innobase::init_table_handle_for_HANDLER(void)
|
||||
/*============================================*/
|
||||
{
|
||||
row_prebuilt_t* prebuilt;
|
||||
|
||||
ut_a(0); /* the code has not been used or tested yet; to prevent
|
||||
inadvertent usage we assert an error here */
|
||||
|
||||
/* If current thd does not yet have a trx struct, create one.
|
||||
If the current handle does not yet have a prebuilt struct, create
|
||||
one. Update the trx pointers in the prebuilt struct. Normally
|
||||
|
@ -449,6 +462,7 @@ ha_innobase::init_table_handle_for_HANDLER(void)
|
|||
|
||||
prebuilt->read_just_key = FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*************************************************************************
|
||||
Opens an InnoDB database. */
|
||||
|
@ -2500,6 +2514,7 @@ ha_innobase::rnd_pos(
|
|||
Stores a reference to the current row to 'ref' field of the handle. Note
|
||||
that in the case where we have generated the clustered index for the
|
||||
table, the function parameter is illogical: we MUST ASSUME that 'record'
|
||||
is the current 'position' of the handle, because if row ref is actually
|
||||
the row id internally generated in InnoDB, then 'record' does not contain
|
||||
it. We just guess that the row id must be for the record where the handle
|
||||
was positioned the last time. */
|
||||
|
|
|
@ -164,7 +164,8 @@ class ha_innobase: public handler
|
|||
void free_foreign_key_create_info(char* str);
|
||||
THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA **to,
|
||||
enum thr_lock_type lock_type);
|
||||
void init_table_handle_for_HANDLER(); /* TODO: NOT TESTED!!! */
|
||||
/* void init_table_handle_for_HANDLER(); Not tested or used yet, code
|
||||
included for documentational purposes only */
|
||||
longlong get_auto_increment();
|
||||
};
|
||||
|
||||
|
|
|
@ -635,6 +635,7 @@ extern ulong specialflag, current_pid;
|
|||
|
||||
extern uint test_flags,select_errors,ha_open_options;
|
||||
extern uint protocol_version,dropping_tables;
|
||||
extern uint delay_key_write_options;
|
||||
extern bool opt_endinfo, using_udf_functions, locked_in_memory;
|
||||
extern bool opt_using_transactions, use_temp_pool, mysql_embedded;
|
||||
extern bool using_update_log, opt_large_files;
|
||||
|
|
|
@ -47,6 +47,12 @@
|
|||
#define SIGNAL_THD
|
||||
#endif
|
||||
|
||||
#ifdef PURIFY
|
||||
#define IF_PURIFY(A,B) (A)
|
||||
#else
|
||||
#define IF_PURIFY(A,B) (B)
|
||||
#endif
|
||||
|
||||
/* stack traces are only supported on linux intel */
|
||||
#if defined(__linux__) && defined(__i386__) && defined(USE_PSTACK)
|
||||
#define HAVE_STACK_TRACE_ON_SEGV
|
||||
|
@ -259,6 +265,7 @@ bool opt_log, opt_update_log, opt_bin_log, opt_slow_log;
|
|||
bool opt_disable_networking=0, opt_skip_show_db=0;
|
||||
bool opt_enable_named_pipe= 0;
|
||||
my_bool opt_local_infile, opt_external_locking, opt_slave_compressed_protocol;
|
||||
uint delay_key_write_options= (uint) DELAY_KEY_WRITE_ON;
|
||||
|
||||
static bool opt_do_pstack = 0;
|
||||
static ulong opt_specialflag=SPECIAL_ENGLISH;
|
||||
|
@ -2816,8 +2823,8 @@ enum options {
|
|||
OPT_FLUSH, OPT_SAFE,
|
||||
OPT_BOOTSTRAP, OPT_SKIP_SHOW_DB,
|
||||
OPT_TABLE_TYPE, OPT_INIT_FILE,
|
||||
OPT_DELAY_KEY_WRITE, OPT_SLOW_QUERY_LOG,
|
||||
OPT_USE_DELAY_KEY_WRITE, OPT_CHARSETS_DIR,
|
||||
OPT_DELAY_KEY_WRITE_ALL, OPT_SLOW_QUERY_LOG,
|
||||
OPT_DELAY_KEY_WRITE, OPT_CHARSETS_DIR,
|
||||
OPT_BDB_HOME, OPT_BDB_LOG,
|
||||
OPT_BDB_TMP, OPT_BDB_NOSYNC,
|
||||
OPT_BDB_LOCK, OPT_BDB_SKIP,
|
||||
|
@ -2994,9 +3001,11 @@ struct my_option my_long_options[] =
|
|||
{"default-table-type", OPT_TABLE_TYPE,
|
||||
"Set the default table type for tables", 0, 0,
|
||||
0, GET_NO_ARG, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"delay-key-write-for-all-tables", OPT_DELAY_KEY_WRITE,
|
||||
"Don't flush key buffers between writes for any MyISAM table", 0, 0, 0,
|
||||
GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"delay-key-write", OPT_DELAY_KEY_WRITE, "Type of DELAY_KEY_WRITE",
|
||||
0,0,0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"delay-key-write-for-all-tables", OPT_DELAY_KEY_WRITE_ALL,
|
||||
"Don't flush key buffers between writes for any MyISAM table (Depricated option, use --delay-key-write=all instead)",
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"enable-locking", OPT_ENABLE_LOCK,
|
||||
"Depricated option, use --external-locking instead",
|
||||
(gptr*) &opt_external_locking, (gptr*) &opt_external_locking,
|
||||
|
@ -3260,10 +3269,6 @@ struct my_option my_long_options[] =
|
|||
"Use concurrent insert with MyISAM. Disable with prefix --skip-",
|
||||
(gptr*) &myisam_concurrent_insert, (gptr*) &myisam_concurrent_insert,
|
||||
0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
|
||||
{"delay-key-write", OPT_USE_DELAY_KEY_WRITE,
|
||||
"Use delay_key_write option for all tables. Disable with prefix --skip-",
|
||||
(gptr*) &myisam_delay_key_write, (gptr*) &myisam_delay_key_write, 0,
|
||||
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"skip-grant-tables", OPT_SKIP_GRANT,
|
||||
"Start without grant tables. This gives all users FULL ACCESS to all tables!",
|
||||
(gptr*) &opt_noacl, (gptr*) &opt_noacl, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0,
|
||||
|
@ -3335,8 +3340,8 @@ struct my_option my_long_options[] =
|
|||
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#ifdef USE_SYMDIR
|
||||
{"use-symbolic-links", 's', "Enable symbolic link support",
|
||||
(gptr*) &my_use_symdir, (gptr*) &my_use_symdir, 0, GET_BOOL, NO_ARG, 0, 0,
|
||||
0, 0, 0, 0},
|
||||
(gptr*) &my_use_symdir, (gptr*) &my_use_symdir, 0, GET_BOOL, NO_ARG,
|
||||
USE_PURIFY(0,1), 0, 0, 0, 0, 0},
|
||||
#endif
|
||||
{"user", 'u', "Run mysqld daemon as user", (gptr*) &mysqld_user,
|
||||
(gptr*) &mysqld_user, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
|
@ -3382,7 +3387,7 @@ struct my_option my_long_options[] =
|
|||
(gptr*) &connect_timeout, (gptr*) &connect_timeout,
|
||||
0, GET_ULONG, REQUIRED_ARG, CONNECT_TIMEOUT, 2, LONG_TIMEOUT, 0, 1, 0 },
|
||||
{"delayed_insert_timeout", OPT_DELAYED_INSERT_TIMEOUT,
|
||||
"How long a INSERT DELAYED thread should wait for INSERT statements before terminating.",
|
||||
"Ho wlong a INSERT DELAYED thread should wait for INSERT statements before terminating.",
|
||||
(gptr*) &delayed_insert_timeout, (gptr*) &delayed_insert_timeout, 0,
|
||||
GET_ULONG, REQUIRED_ARG, DELAYED_WAIT_TIMEOUT, 1, LONG_TIMEOUT, 0, 1, 0},
|
||||
{"delayed_insert_limit", OPT_DELAYED_INSERT_LIMIT,
|
||||
|
@ -4119,22 +4124,22 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
|||
break;
|
||||
case (int) OPT_SKIP_NEW:
|
||||
opt_specialflag|= SPECIAL_NO_NEW_FUNC;
|
||||
myisam_delay_key_write=0;
|
||||
delay_key_write_options= (uint) DELAY_KEY_WRITE_NONE;
|
||||
myisam_concurrent_insert=0;
|
||||
myisam_recover_options= HA_RECOVER_NONE;
|
||||
my_disable_symlinks=1;
|
||||
my_use_symdir=0;
|
||||
have_symlink=SHOW_OPTION_DISABLED;
|
||||
ha_open_options&= ~HA_OPEN_ABORT_IF_CRASHED;
|
||||
ha_open_options&= ~(HA_OPEN_ABORT_IF_CRASHED | HA_OPEN_DELAY_KEY_WRITE);
|
||||
#ifdef HAVE_QUERY_CACHE
|
||||
query_cache_size=0;
|
||||
#endif
|
||||
break;
|
||||
case (int) OPT_SAFE:
|
||||
opt_specialflag|= SPECIAL_SAFE_MODE;
|
||||
myisam_delay_key_write=0;
|
||||
delay_key_write_options= (uint) DELAY_KEY_WRITE_NONE;
|
||||
myisam_recover_options= HA_RECOVER_NONE; // To be changed
|
||||
ha_open_options&= ~HA_OPEN_ABORT_IF_CRASHED;
|
||||
ha_open_options&= ~(HA_OPEN_ABORT_IF_CRASHED | HA_OPEN_DELAY_KEY_WRITE);
|
||||
break;
|
||||
case (int) OPT_SKIP_PRIOR:
|
||||
opt_specialflag|= SPECIAL_NO_PRIOR;
|
||||
|
@ -4239,9 +4244,25 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
|||
case OPT_SERVER_ID:
|
||||
server_id_supplied = 1;
|
||||
break;
|
||||
case OPT_DELAY_KEY_WRITE_ALL:
|
||||
if (argument != disabled_my_option)
|
||||
argument= (char*) "ALL";
|
||||
/* Fall through */
|
||||
case OPT_DELAY_KEY_WRITE:
|
||||
ha_open_options|=HA_OPEN_DELAY_KEY_WRITE;
|
||||
myisam_delay_key_write=1;
|
||||
if (argument == disabled_my_option)
|
||||
delay_key_write_options= (uint) DELAY_KEY_WRITE_NONE;
|
||||
else if (! argument)
|
||||
delay_key_write_options= (uint) DELAY_KEY_WRITE_ON;
|
||||
else
|
||||
{
|
||||
int type;
|
||||
if ((type=find_type(argument, &delay_key_write_typelib, 2)) <= 0)
|
||||
{
|
||||
fprintf(stderr,"Unknown delay_key_write type: %s\n",argument);
|
||||
exit(1);
|
||||
}
|
||||
delay_key_write_options= (uint) type-1;
|
||||
}
|
||||
break;
|
||||
case OPT_CHARSETS_DIR:
|
||||
strmake(mysql_charsets_dir, argument, sizeof(mysql_charsets_dir)-1);
|
||||
|
@ -4364,19 +4385,23 @@ static void get_options(int argc,char **argv)
|
|||
{
|
||||
int ho_error;
|
||||
|
||||
myisam_delay_key_write=1; // Allow use of this
|
||||
#ifndef HAVE_purify
|
||||
my_use_symdir=1; // Use internal symbolic links
|
||||
#else
|
||||
/* Symlinks gives too many warnings with purify */
|
||||
my_disable_symlinks=1;
|
||||
my_use_symdir=0;
|
||||
have_symlink=SHOW_OPTION_DISABLED;
|
||||
#endif
|
||||
|
||||
if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
|
||||
exit(ho_error);
|
||||
|
||||
#ifdef HAVE_BROKEN_REALPATH
|
||||
my_use_symdir=0;
|
||||
my_disable_symlinks=1;
|
||||
have_symlink=SHOW_OPTION_NO;
|
||||
#else
|
||||
if (!my_use_symdir)
|
||||
{
|
||||
my_disable_symlinks=1;
|
||||
have_symlink=SHOW_OPTION_DISABLED;
|
||||
}
|
||||
#endif
|
||||
/* Set global MyISAM variables from delay_key_write_options */
|
||||
fix_delay_key_write((THD*) 0, OPT_GLOBAL);
|
||||
|
||||
if (mysqld_chroot)
|
||||
set_root(mysqld_chroot);
|
||||
fix_paths();
|
||||
|
|
|
@ -62,6 +62,12 @@ TYPELIB bool_typelib=
|
|||
array_elements(bool_type_names)-1, "", bool_type_names
|
||||
};
|
||||
|
||||
const char *delay_key_write_type_names[]= { "OFF", "ON", "ALL", NullS };
|
||||
TYPELIB delay_key_write_typelib=
|
||||
{
|
||||
array_elements(delay_key_write_type_names)-1, "", delay_key_write_type_names
|
||||
};
|
||||
|
||||
static bool sys_check_charset(THD *thd, set_var *var);
|
||||
static bool sys_update_charset(THD *thd, set_var *var);
|
||||
static void sys_set_default_charset(THD *thd, enum_var_type type);
|
||||
|
@ -97,8 +103,10 @@ sys_var_bool_ptr sys_concurrent_insert("concurrent_insert",
|
|||
&myisam_concurrent_insert);
|
||||
sys_var_long_ptr sys_connect_timeout("connect_timeout",
|
||||
&connect_timeout);
|
||||
sys_var_bool_ptr sys_delay_key_write("delay_key_write",
|
||||
&myisam_delay_key_write);
|
||||
sys_var_enum sys_delay_key_write("delay_key_write",
|
||||
&delay_key_write_options,
|
||||
&delay_key_write_typelib,
|
||||
fix_delay_key_write);
|
||||
sys_var_long_ptr sys_delayed_insert_limit("delayed_insert_limit",
|
||||
&delayed_insert_limit);
|
||||
sys_var_long_ptr sys_delayed_insert_timeout("delayed_insert_timeout",
|
||||
|
@ -625,6 +633,23 @@ static void fix_key_buffer_size(THD *thd, enum_var_type type)
|
|||
}
|
||||
|
||||
|
||||
void fix_delay_key_write(THD *thd, enum_var_type type)
|
||||
{
|
||||
switch ((enum_delay_key_write) delay_key_write_options) {
|
||||
case DELAY_KEY_WRITE_NONE:
|
||||
myisam_delay_key_write=0;
|
||||
break;
|
||||
case DELAY_KEY_WRITE_ON:
|
||||
myisam_delay_key_write=1;
|
||||
break;
|
||||
case DELAY_KEY_WRITE_ALL:
|
||||
myisam_delay_key_write=1;
|
||||
ha_open_options|= HA_OPEN_DELAY_KEY_WRITE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool sys_var_long_ptr::update(THD *thd, set_var *var)
|
||||
{
|
||||
ulonglong tmp= var->value->val_int();
|
||||
|
@ -655,6 +680,19 @@ void sys_var_bool_ptr::set_default(THD *thd, enum_var_type type)
|
|||
}
|
||||
|
||||
|
||||
bool sys_var_enum::update(THD *thd, set_var *var)
|
||||
{
|
||||
*value= (uint) var->save_result.ulong_value;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
byte *sys_var_enum::value_ptr(THD *thd, enum_var_type type)
|
||||
{
|
||||
return (byte*) enum_names->type_names[*value];
|
||||
}
|
||||
|
||||
|
||||
bool sys_var_thd_ulong::update(THD *thd, set_var *var)
|
||||
{
|
||||
ulonglong tmp= var->value->val_int();
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
class sys_var;
|
||||
class set_var;
|
||||
typedef struct system_variables SV;
|
||||
extern TYPELIB bool_typelib;
|
||||
extern TYPELIB bool_typelib, delay_key_write_typelib;
|
||||
|
||||
enum enum_var_type
|
||||
{
|
||||
|
@ -140,6 +140,26 @@ public:
|
|||
};
|
||||
|
||||
|
||||
class sys_var_enum :public sys_var
|
||||
{
|
||||
uint *value;
|
||||
TYPELIB *enum_names;
|
||||
public:
|
||||
sys_var_enum(const char *name_arg, uint *value_arg,
|
||||
TYPELIB *typelib, sys_after_update_func func)
|
||||
:sys_var(name_arg,func), value(value_arg), enum_names(typelib)
|
||||
{}
|
||||
bool check(THD *thd, set_var *var)
|
||||
{
|
||||
return check_enum(thd, var, enum_names);
|
||||
}
|
||||
bool update(THD *thd, set_var *var);
|
||||
SHOW_TYPE type() { return SHOW_CHAR; }
|
||||
byte *value_ptr(THD *thd, enum_var_type type);
|
||||
bool check_update_type(Item_result type) { return 0; }
|
||||
};
|
||||
|
||||
|
||||
class sys_var_thd :public sys_var
|
||||
{
|
||||
public:
|
||||
|
@ -415,5 +435,6 @@ void set_var_init();
|
|||
void set_var_free();
|
||||
sys_var *find_sys_var(const char *str, uint length=0);
|
||||
bool sql_set_variables(THD *thd, List<set_var_base> *var_list);
|
||||
void fix_delay_key_write(THD *thd, enum_var_type type);
|
||||
|
||||
extern sys_var_str sys_charset;
|
||||
|
|
|
@ -31,6 +31,8 @@ enum enum_enable_or_disable { LEAVE_AS_IS, ENABLE, DISABLE };
|
|||
enum enum_ha_read_modes { RFIRST, RNEXT, RPREV, RLAST, RKEY };
|
||||
enum enum_duplicates { DUP_ERROR, DUP_REPLACE, DUP_IGNORE };
|
||||
enum enum_log_type { LOG_CLOSED, LOG_NORMAL, LOG_NEW, LOG_BIN };
|
||||
enum enum_delay_key_write { DELAY_KEY_WRITE_NONE, DELAY_KEY_WRITE_ON,
|
||||
DELAY_KEY_WRITE_ALL };
|
||||
|
||||
// log info errors
|
||||
#define LOG_INFO_EOF -1
|
||||
|
|
|
@ -3346,6 +3346,7 @@ set_expr_or_default:
|
|||
expr { $$=$1; }
|
||||
| DEFAULT { $$=0; }
|
||||
| ON { $$=new Item_string("ON",2); }
|
||||
| ALL { $$=new Item_string("ALL",3); }
|
||||
;
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue