Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
f3a617f3
Commit
f3a617f3
authored
Oct 03, 2006
by
marko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
branches/zip: Merge revisions 869:887 from trunk.
parent
66ae0ded
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
149 additions
and
127 deletions
+149
-127
handler/Makefile.am
handler/Makefile.am
+3
-0
handler/ha_innodb.cc
handler/ha_innodb.cc
+118
-84
handler/ha_innodb.h
handler/ha_innodb.h
+21
-11
setup.sh
setup.sh
+7
-32
No files found.
handler/Makefile.am
View file @
f3a617f3
...
@@ -24,3 +24,6 @@ noinst_LIBRARIES = libhandler.a
...
@@ -24,3 +24,6 @@ noinst_LIBRARIES = libhandler.a
libhandler_a_SOURCES
=
ha_innodb.cc
libhandler_a_SOURCES
=
ha_innodb.cc
EXTRA_PROGRAMS
=
EXTRA_PROGRAMS
=
# Don't update the files from bitkeeper
%
::
SCCS/s.%
handler/ha_innodb.cc
View file @
f3a617f3
...
@@ -54,6 +54,12 @@ pthread_cond_t commit_cond;
...
@@ -54,6 +54,12 @@ pthread_cond_t commit_cond;
pthread_mutex_t
commit_cond_m
;
pthread_mutex_t
commit_cond_m
;
bool
innodb_inited
=
0
;
bool
innodb_inited
=
0
;
/*
This needs to exist until the query cache callback is removed
or learns to pass hton.
*/
static
handlerton
*
legacy_innodb_hton
;
/*-----------------------------------------------------------------*/
/*-----------------------------------------------------------------*/
/* These variables are used to implement (semi-)synchronous MySQL binlog
/* These variables are used to implement (semi-)synchronous MySQL binlog
replication for InnoDB tables. */
replication for InnoDB tables. */
...
@@ -197,22 +203,25 @@ static mysql_byte* innobase_get_key(INNOBASE_SHARE *share,uint *length,
...
@@ -197,22 +203,25 @@ static mysql_byte* innobase_get_key(INNOBASE_SHARE *share,uint *length,
my_bool
not_used
__attribute__
((
unused
)));
my_bool
not_used
__attribute__
((
unused
)));
static
INNOBASE_SHARE
*
get_share
(
const
char
*
table_name
);
static
INNOBASE_SHARE
*
get_share
(
const
char
*
table_name
);
static
void
free_share
(
INNOBASE_SHARE
*
share
);
static
void
free_share
(
INNOBASE_SHARE
*
share
);
static
int
innobase_close_connection
(
THD
*
thd
);
static
int
innobase_close_connection
(
handlerton
*
hton
,
THD
*
thd
);
static
int
innobase_commit
(
THD
*
thd
,
bool
all
);
static
int
innobase_commit
(
handlerton
*
hton
,
THD
*
thd
,
bool
all
);
static
int
innobase_rollback
(
THD
*
thd
,
bool
all
);
static
int
innobase_rollback
(
handlerton
*
hton
,
THD
*
thd
,
bool
all
);
static
int
innobase_rollback_to_savepoint
(
THD
*
thd
,
void
*
savepoint
);
static
int
innobase_rollback_to_savepoint
(
handlerton
*
hton
,
THD
*
thd
,
static
int
innobase_savepoint
(
THD
*
thd
,
void
*
savepoint
);
void
*
savepoint
);
static
int
innobase_release_savepoint
(
THD
*
thd
,
void
*
savepoint
);
static
int
innobase_savepoint
(
handlerton
*
hton
,
THD
*
thd
,
void
*
savepoint
);
static
handler
*
innobase_create_handler
(
TABLE_SHARE
*
table
,
static
int
innobase_release_savepoint
(
handlerton
*
hton
,
THD
*
thd
,
void
*
savepoint
);
static
handler
*
innobase_create_handler
(
handlerton
*
hton
,
TABLE_SHARE
*
table
,
MEM_ROOT
*
mem_root
);
MEM_ROOT
*
mem_root
);
static
const
char
innobase_hton_name
[]
=
"InnoDB"
;
static
const
char
innobase_hton_name
[]
=
"InnoDB"
;
handlerton
*
innobase_hton
;
static
handler
*
innobase_create_handler
(
handlerton
*
hton
,
TABLE_SHARE
*
table
,
static
handler
*
innobase_create_handler
(
TABLE_SHARE
*
table
,
MEM_ROOT
*
mem_root
)
MEM_ROOT
*
mem_root
)
{
{
return
new
(
mem_root
)
ha_innobase
(
table
);
return
new
(
mem_root
)
ha_innobase
(
hton
,
table
);
}
}
...
@@ -380,7 +389,8 @@ documentation, see handler.cc. */
...
@@ -380,7 +389,8 @@ documentation, see handler.cc. */
int
int
innobase_release_temporary_latches
(
innobase_release_temporary_latches
(
/*===============================*/
/*===============================*/
THD
*
thd
)
handlerton
*
hton
,
THD
*
thd
)
{
{
trx_t
*
trx
;
trx_t
*
trx
;
...
@@ -389,7 +399,7 @@ innobase_release_temporary_latches(
...
@@ -389,7 +399,7 @@ innobase_release_temporary_latches(
return
0
;
return
0
;
}
}
trx
=
(
trx_t
*
)
thd
->
ha_data
[
innobase_
hton
->
slot
];
trx
=
(
trx_t
*
)
thd
->
ha_data
[
hton
->
slot
];
if
(
trx
)
{
if
(
trx
)
{
innobase_release_stat_resources
(
trx
);
innobase_release_stat_resources
(
trx
);
...
@@ -841,13 +851,14 @@ trx_t*
...
@@ -841,13 +851,14 @@ trx_t*
check_trx_exists
(
check_trx_exists
(
/*=============*/
/*=============*/
/* out: InnoDB transaction handle */
/* out: InnoDB transaction handle */
handlerton
*
hton
,
/* in: handlerton for innodb */
THD
*
thd
)
/* in: user thread handle */
THD
*
thd
)
/* in: user thread handle */
{
{
trx_t
*
trx
;
trx_t
*
trx
;
ut_ad
(
thd
==
current_thd
);
ut_ad
(
thd
==
current_thd
);
trx
=
(
trx_t
*
)
thd
->
ha_data
[
innobase_
hton
->
slot
];
trx
=
(
trx_t
*
)
thd
->
ha_data
[
hton
->
slot
];
if
(
trx
==
NULL
)
{
if
(
trx
==
NULL
)
{
DBUG_ASSERT
(
thd
!=
NULL
);
DBUG_ASSERT
(
thd
!=
NULL
);
...
@@ -861,7 +872,7 @@ check_trx_exists(
...
@@ -861,7 +872,7 @@ check_trx_exists(
CPU time */
CPU time */
trx
->
support_xa
=
(
ibool
)(
thd
->
variables
.
innodb_support_xa
);
trx
->
support_xa
=
(
ibool
)(
thd
->
variables
.
innodb_support_xa
);
thd
->
ha_data
[
innobase_
hton
->
slot
]
=
trx
;
thd
->
ha_data
[
hton
->
slot
]
=
trx
;
}
else
{
}
else
{
if
(
trx
->
magic_n
!=
TRX_MAGIC_N
)
{
if
(
trx
->
magic_n
!=
TRX_MAGIC_N
)
{
mem_analyze_corruption
(
trx
);
mem_analyze_corruption
(
trx
);
...
@@ -889,8 +900,8 @@ check_trx_exists(
...
@@ -889,8 +900,8 @@ check_trx_exists(
/*************************************************************************
/*************************************************************************
Construct ha_innobase handler. */
Construct ha_innobase handler. */
ha_innobase
::
ha_innobase
(
TABLE_SHARE
*
table_arg
)
ha_innobase
::
ha_innobase
(
handlerton
*
hton
,
TABLE_SHARE
*
table_arg
)
:
handler
(
innobase_
hton
,
table_arg
),
:
handler
(
hton
,
table_arg
),
int_table_flags
(
HA_REC_NOT_IN_SEQ
|
int_table_flags
(
HA_REC_NOT_IN_SEQ
|
HA_NULL_IN_KEY
|
HA_NULL_IN_KEY
|
HA_CAN_INDEX_BLOBS
|
HA_CAN_INDEX_BLOBS
|
...
@@ -917,7 +928,7 @@ ha_innobase::update_thd(
...
@@ -917,7 +928,7 @@ ha_innobase::update_thd(
row_prebuilt_t
*
prebuilt
=
(
row_prebuilt_t
*
)
innobase_prebuilt
;
row_prebuilt_t
*
prebuilt
=
(
row_prebuilt_t
*
)
innobase_prebuilt
;
trx_t
*
trx
;
trx_t
*
trx
;
trx
=
check_trx_exists
(
thd
);
trx
=
check_trx_exists
(
ht
,
thd
);
if
(
prebuilt
->
trx
!=
trx
)
{
if
(
prebuilt
->
trx
!=
trx
)
{
...
@@ -938,10 +949,11 @@ inline
...
@@ -938,10 +949,11 @@ inline
void
void
innobase_register_stmt
(
innobase_register_stmt
(
/*===================*/
/*===================*/
handlerton
*
hton
,
/* in: Innobase hton */
THD
*
thd
)
/* in: MySQL thd (connection) object */
THD
*
thd
)
/* in: MySQL thd (connection) object */
{
{
/* Register the statement */
/* Register the statement */
trans_register_ha
(
thd
,
FALSE
,
innobase_
hton
);
trans_register_ha
(
thd
,
FALSE
,
hton
);
}
}
/*************************************************************************
/*************************************************************************
...
@@ -955,17 +967,18 @@ inline
...
@@ -955,17 +967,18 @@ inline
void
void
innobase_register_trx_and_stmt
(
innobase_register_trx_and_stmt
(
/*===========================*/
/*===========================*/
handlerton
*
hton
,
/* in: Innobase handlerton */
THD
*
thd
)
/* in: MySQL thd (connection) object */
THD
*
thd
)
/* in: MySQL thd (connection) object */
{
{
/* NOTE that actually innobase_register_stmt() registers also
/* NOTE that actually innobase_register_stmt() registers also
the transaction in the AUTOCOMMIT=1 mode. */
the transaction in the AUTOCOMMIT=1 mode. */
innobase_register_stmt
(
thd
);
innobase_register_stmt
(
hton
,
thd
);
if
(
thd
->
options
&
(
OPTION_NOT_AUTOCOMMIT
|
OPTION_BEGIN
))
{
if
(
thd
->
options
&
(
OPTION_NOT_AUTOCOMMIT
|
OPTION_BEGIN
))
{
/* No autocommit mode, register for a transaction */
/* No autocommit mode, register for a transaction */
trans_register_ha
(
thd
,
TRUE
,
innobase_
hton
);
trans_register_ha
(
thd
,
TRUE
,
hton
);
}
}
}
}
...
@@ -1061,7 +1074,7 @@ innobase_query_caching_of_table_permitted(
...
@@ -1061,7 +1074,7 @@ innobase_query_caching_of_table_permitted(
return
((
my_bool
)
FALSE
);
return
((
my_bool
)
FALSE
);
}
}
trx
=
check_trx_exists
(
thd
);
trx
=
check_trx_exists
(
legacy_innodb_hton
,
thd
);
if
(
trx
->
has_search_latch
)
{
if
(
trx
->
has_search_latch
)
{
ut_print_timestamp
(
stderr
);
ut_print_timestamp
(
stderr
);
sql_print_error
(
"The calling thread is holding the adaptive "
sql_print_error
(
"The calling thread is holding the adaptive "
...
@@ -1120,7 +1133,7 @@ innobase_query_caching_of_table_permitted(
...
@@ -1120,7 +1133,7 @@ innobase_query_caching_of_table_permitted(
if
(
trx
->
active_trans
==
0
)
{
if
(
trx
->
active_trans
==
0
)
{
innobase_register_trx_and_stmt
(
thd
);
innobase_register_trx_and_stmt
(
legacy_innodb_hton
,
thd
);
trx
->
active_trans
=
1
;
trx
->
active_trans
=
1
;
}
}
...
@@ -1295,7 +1308,7 @@ ha_innobase::init_table_handle_for_HANDLER(void)
...
@@ -1295,7 +1308,7 @@ ha_innobase::init_table_handle_for_HANDLER(void)
if
(
prebuilt
->
trx
->
active_trans
==
0
)
{
if
(
prebuilt
->
trx
->
active_trans
==
0
)
{
innobase_register_trx_and_stmt
(
current_thd
);
innobase_register_trx_and_stmt
(
ht
,
current_thd
);
prebuilt
->
trx
->
active_trans
=
1
;
prebuilt
->
trx
->
active_trans
=
1
;
}
}
...
@@ -1338,7 +1351,8 @@ innobase_init(void *p)
...
@@ -1338,7 +1351,8 @@ innobase_init(void *p)
char
*
default_path
;
char
*
default_path
;
DBUG_ENTER
(
"innobase_init"
);
DBUG_ENTER
(
"innobase_init"
);
innobase_hton
=
(
handlerton
*
)
p
;
handlerton
*
innobase_hton
=
(
handlerton
*
)
p
;
legacy_innodb_hton
=
innobase_hton
;
innobase_hton
->
state
=
have_innodb
;
innobase_hton
->
state
=
have_innodb
;
innobase_hton
->
db_type
=
DB_TYPE_INNODB
;
innobase_hton
->
db_type
=
DB_TYPE_INNODB
;
...
@@ -1613,7 +1627,7 @@ error:
...
@@ -1613,7 +1627,7 @@ error:
Closes an InnoDB database. */
Closes an InnoDB database. */
int
int
innobase_end
(
ha_panic_function
type
)
innobase_end
(
ha
ndlerton
*
hton
,
ha
_panic_function
type
)
/*==============*/
/*==============*/
/* out: TRUE if error */
/* out: TRUE if error */
{
{
...
@@ -1651,7 +1665,7 @@ Flushes InnoDB logs to disk and makes a checkpoint. Really, a commit flushes
...
@@ -1651,7 +1665,7 @@ Flushes InnoDB logs to disk and makes a checkpoint. Really, a commit flushes
the logs, and the name of this function should be innobase_checkpoint. */
the logs, and the name of this function should be innobase_checkpoint. */
bool
bool
innobase_flush_logs
(
void
)
innobase_flush_logs
(
handlerton
*
hton
)
/*=====================*/
/*=====================*/
/* out: TRUE if error */
/* out: TRUE if error */
{
{
...
@@ -1690,6 +1704,7 @@ int
...
@@ -1690,6 +1704,7 @@ int
innobase_start_trx_and_assign_read_view
(
innobase_start_trx_and_assign_read_view
(
/*====================================*/
/*====================================*/
/* out: 0 */
/* out: 0 */
handlerton
*
hton
,
/* in: Innodb handlerton */
THD
*
thd
)
/* in: MySQL thread handle of the user for whom
THD
*
thd
)
/* in: MySQL thread handle of the user for whom
the transaction should be committed */
the transaction should be committed */
{
{
...
@@ -1699,7 +1714,7 @@ innobase_start_trx_and_assign_read_view(
...
@@ -1699,7 +1714,7 @@ innobase_start_trx_and_assign_read_view(
/* Create a new trx struct for thd, if it does not yet have one */
/* Create a new trx struct for thd, if it does not yet have one */
trx
=
check_trx_exists
(
thd
);
trx
=
check_trx_exists
(
hton
,
thd
);
/* This is just to play safe: release a possible FIFO ticket and
/* This is just to play safe: release a possible FIFO ticket and
search latch. Since we will reserve the kernel mutex, we have to
search latch. Since we will reserve the kernel mutex, we have to
...
@@ -1718,9 +1733,7 @@ innobase_start_trx_and_assign_read_view(
...
@@ -1718,9 +1733,7 @@ innobase_start_trx_and_assign_read_view(
/* Set the MySQL flag to mark that there is an active transaction */
/* Set the MySQL flag to mark that there is an active transaction */
if
(
trx
->
active_trans
==
0
)
{
if
(
trx
->
active_trans
==
0
)
{
innobase_register_trx_and_stmt
(
hton
,
current_thd
);
innobase_register_trx_and_stmt
(
current_thd
);
trx
->
active_trans
=
1
;
trx
->
active_trans
=
1
;
}
}
...
@@ -1735,7 +1748,8 @@ int
...
@@ -1735,7 +1748,8 @@ int
innobase_commit
(
innobase_commit
(
/*============*/
/*============*/
/* out: 0 */
/* out: 0 */
THD
*
thd
,
/* in: MySQL thread handle of the user for whom
handlerton
*
hton
,
/* in: Innodb handlerton */
THD
*
thd
,
/* in: MySQL thread handle of the user for whom
the transaction should be committed */
the transaction should be committed */
bool
all
)
/* in: TRUE - commit transaction
bool
all
)
/* in: TRUE - commit transaction
FALSE - the current SQL statement ended */
FALSE - the current SQL statement ended */
...
@@ -1745,7 +1759,7 @@ innobase_commit(
...
@@ -1745,7 +1759,7 @@ innobase_commit(
DBUG_ENTER
(
"innobase_commit"
);
DBUG_ENTER
(
"innobase_commit"
);
DBUG_PRINT
(
"trans"
,
(
"ending transaction"
));
DBUG_PRINT
(
"trans"
,
(
"ending transaction"
));
trx
=
check_trx_exists
(
thd
);
trx
=
check_trx_exists
(
hton
,
thd
);
/* Update the info whether we should skip XA steps that eat CPU time */
/* Update the info whether we should skip XA steps that eat CPU time */
trx
->
support_xa
=
(
ibool
)(
thd
->
variables
.
innodb_support_xa
);
trx
->
support_xa
=
(
ibool
)(
thd
->
variables
.
innodb_support_xa
);
...
@@ -1871,6 +1885,7 @@ int
...
@@ -1871,6 +1885,7 @@ int
innobase_report_binlog_offset_and_commit
(
innobase_report_binlog_offset_and_commit
(
/*=====================================*/
/*=====================================*/
/* out: 0 */
/* out: 0 */
handlerton
*
hton
,
/* in: Innodb handlerton */
THD
*
thd
,
/* in: user thread */
THD
*
thd
,
/* in: user thread */
void
*
trx_handle
,
/* in: InnoDB trx handle */
void
*
trx_handle
,
/* in: InnoDB trx handle */
char
*
log_file_name
,
/* in: latest binlog file name */
char
*
log_file_name
,
/* in: latest binlog file name */
...
@@ -1888,7 +1903,7 @@ innobase_report_binlog_offset_and_commit(
...
@@ -1888,7 +1903,7 @@ innobase_report_binlog_offset_and_commit(
trx
->
flush_log_later
=
TRUE
;
trx
->
flush_log_later
=
TRUE
;
innobase_commit
(
thd
,
TRUE
);
innobase_commit
(
hton
,
thd
,
TRUE
);
trx
->
flush_log_later
=
FALSE
;
trx
->
flush_log_later
=
FALSE
;
...
@@ -1936,11 +1951,12 @@ int
...
@@ -1936,11 +1951,12 @@ int
innobase_commit_complete
(
innobase_commit_complete
(
/*=====================*/
/*=====================*/
/* out: 0 */
/* out: 0 */
handlerton
*
hton
,
/* in: Innodb handlerton */
THD
*
thd
)
/* in: user thread */
THD
*
thd
)
/* in: user thread */
{
{
trx_t
*
trx
;
trx_t
*
trx
;
trx
=
(
trx_t
*
)
thd
->
ha_data
[
innobase_
hton
->
slot
];
trx
=
(
trx_t
*
)
thd
->
ha_data
[
hton
->
slot
];
if
(
trx
&&
trx
->
active_trans
)
{
if
(
trx
&&
trx
->
active_trans
)
{
...
@@ -1964,6 +1980,7 @@ static int
...
@@ -1964,6 +1980,7 @@ static int
innobase_rollback
(
innobase_rollback
(
/*==============*/
/*==============*/
/* out: 0 or error number */
/* out: 0 or error number */
handlerton
*
hton
,
/* in: Innodb handlerton */
THD
*
thd
,
/* in: handle to the MySQL thread of the user
THD
*
thd
,
/* in: handle to the MySQL thread of the user
whose transaction should be rolled back */
whose transaction should be rolled back */
bool
all
)
/* in: TRUE - commit transaction
bool
all
)
/* in: TRUE - commit transaction
...
@@ -1975,7 +1992,7 @@ innobase_rollback(
...
@@ -1975,7 +1992,7 @@ innobase_rollback(
DBUG_ENTER
(
"innobase_rollback"
);
DBUG_ENTER
(
"innobase_rollback"
);
DBUG_PRINT
(
"trans"
,
(
"aborting transaction"
));
DBUG_PRINT
(
"trans"
,
(
"aborting transaction"
));
trx
=
check_trx_exists
(
thd
);
trx
=
check_trx_exists
(
hton
,
thd
);
/* Update the info whether we should skip XA steps that eat CPU time */
/* Update the info whether we should skip XA steps that eat CPU time */
trx
->
support_xa
=
(
ibool
)(
thd
->
variables
.
innodb_support_xa
);
trx
->
support_xa
=
(
ibool
)(
thd
->
variables
.
innodb_support_xa
);
...
@@ -2047,6 +2064,7 @@ innobase_rollback_to_savepoint(
...
@@ -2047,6 +2064,7 @@ innobase_rollback_to_savepoint(
/*===========================*/
/*===========================*/
/* out: 0 if success, HA_ERR_NO_SAVEPOINT if
/* out: 0 if success, HA_ERR_NO_SAVEPOINT if
no savepoint with the given name */
no savepoint with the given name */
handlerton
*
hton
,
/* in: Innodb handlerton */
THD
*
thd
,
/* in: handle to the MySQL thread of the user
THD
*
thd
,
/* in: handle to the MySQL thread of the user
whose transaction should be rolled back */
whose transaction should be rolled back */
void
*
savepoint
)
/* in: savepoint data */
void
*
savepoint
)
/* in: savepoint data */
...
@@ -2058,7 +2076,7 @@ innobase_rollback_to_savepoint(
...
@@ -2058,7 +2076,7 @@ innobase_rollback_to_savepoint(
DBUG_ENTER
(
"innobase_rollback_to_savepoint"
);
DBUG_ENTER
(
"innobase_rollback_to_savepoint"
);
trx
=
check_trx_exists
(
thd
);
trx
=
check_trx_exists
(
hton
,
thd
);
/* Release a possible FIFO ticket and search latch. Since we will
/* Release a possible FIFO ticket and search latch. Since we will
reserve the kernel mutex, we have to release the search system latch
reserve the kernel mutex, we have to release the search system latch
...
@@ -2083,6 +2101,7 @@ innobase_release_savepoint(
...
@@ -2083,6 +2101,7 @@ innobase_release_savepoint(
/*=======================*/
/*=======================*/
/* out: 0 if success, HA_ERR_NO_SAVEPOINT if
/* out: 0 if success, HA_ERR_NO_SAVEPOINT if
no savepoint with the given name */
no savepoint with the given name */
handlerton
*
hton
,
/* in: handlerton for Innodb */
THD
*
thd
,
/* in: handle to the MySQL thread of the user
THD
*
thd
,
/* in: handle to the MySQL thread of the user
whose transaction should be rolled back */
whose transaction should be rolled back */
void
*
savepoint
)
/* in: savepoint data */
void
*
savepoint
)
/* in: savepoint data */
...
@@ -2093,7 +2112,7 @@ innobase_release_savepoint(
...
@@ -2093,7 +2112,7 @@ innobase_release_savepoint(
DBUG_ENTER
(
"innobase_release_savepoint"
);
DBUG_ENTER
(
"innobase_release_savepoint"
);
trx
=
check_trx_exists
(
thd
);
trx
=
check_trx_exists
(
hton
,
thd
);
/* TODO: use provided savepoint data area to store savepoint data */
/* TODO: use provided savepoint data area to store savepoint data */
...
@@ -2111,6 +2130,7 @@ int
...
@@ -2111,6 +2130,7 @@ int
innobase_savepoint
(
innobase_savepoint
(
/*===============*/
/*===============*/
/* out: always 0, that is, always succeeds */
/* out: always 0, that is, always succeeds */
handlerton
*
hton
,
/* in: handle to the Innodb handlerton */
THD
*
thd
,
/* in: handle to the MySQL thread */
THD
*
thd
,
/* in: handle to the MySQL thread */
void
*
savepoint
)
/* in: savepoint data */
void
*
savepoint
)
/* in: savepoint data */
{
{
...
@@ -2127,7 +2147,7 @@ innobase_savepoint(
...
@@ -2127,7 +2147,7 @@ innobase_savepoint(
DBUG_ASSERT
(
thd
->
options
&
(
OPTION_NOT_AUTOCOMMIT
|
OPTION_BEGIN
)
||
DBUG_ASSERT
(
thd
->
options
&
(
OPTION_NOT_AUTOCOMMIT
|
OPTION_BEGIN
)
||
thd
->
in_sub_stmt
);
thd
->
in_sub_stmt
);
trx
=
check_trx_exists
(
thd
);
trx
=
check_trx_exists
(
hton
,
thd
);
/* Release a possible FIFO ticket and search latch. Since we will
/* Release a possible FIFO ticket and search latch. Since we will
reserve the kernel mutex, we have to release the search system latch
reserve the kernel mutex, we have to release the search system latch
...
@@ -2154,12 +2174,13 @@ int
...
@@ -2154,12 +2174,13 @@ int
innobase_close_connection
(
innobase_close_connection
(
/*======================*/
/*======================*/
/* out: 0 or error number */
/* out: 0 or error number */
handlerton
*
hton
,
/* in: innobase handlerton */
THD
*
thd
)
/* in: handle to the MySQL thread of the user
THD
*
thd
)
/* in: handle to the MySQL thread of the user
whose resources should be free'd */
whose resources should be free'd */
{
{
trx_t
*
trx
;
trx_t
*
trx
;
trx
=
(
trx_t
*
)
thd
->
ha_data
[
innobase_
hton
->
slot
];
trx
=
(
trx_t
*
)
thd
->
ha_data
[
hton
->
slot
];
ut_a
(
trx
);
ut_a
(
trx
);
...
@@ -3254,11 +3275,11 @@ ha_innobase::write_row(
...
@@ -3254,11 +3275,11 @@ ha_innobase::write_row(
DBUG_ENTER
(
"ha_innobase::write_row"
);
DBUG_ENTER
(
"ha_innobase::write_row"
);
if
(
prebuilt
->
trx
!=
if
(
prebuilt
->
trx
!=
(
trx_t
*
)
current_thd
->
ha_data
[
innobase_hton
->
slot
])
{
(
trx_t
*
)
current_thd
->
ha_data
[
ht
->
slot
])
{
sql_print_error
(
"The transaction object for the table handle is at "
sql_print_error
(
"The transaction object for the table handle is at "
"%p, but for the current thread it is at %p"
,
"%p, but for the current thread it is at %p"
,
prebuilt
->
trx
,
prebuilt
->
trx
,
(
trx_t
*
)
current_thd
->
ha_data
[
innobase_hton
->
slot
]);
(
trx_t
*
)
current_thd
->
ha_data
[
ht
->
slot
]);
fputs
(
"InnoDB: Dump of 200 bytes around prebuilt: "
,
stderr
);
fputs
(
"InnoDB: Dump of 200 bytes around prebuilt: "
,
stderr
);
ut_print_buf
(
stderr
,
((
const
byte
*
)
prebuilt
)
-
100
,
200
);
ut_print_buf
(
stderr
,
((
const
byte
*
)
prebuilt
)
-
100
,
200
);
...
@@ -3266,7 +3287,7 @@ ha_innobase::write_row(
...
@@ -3266,7 +3287,7 @@ ha_innobase::write_row(
"InnoDB: Dump of 200 bytes around transaction.all: "
,
"InnoDB: Dump of 200 bytes around transaction.all: "
,
stderr
);
stderr
);
ut_print_buf
(
stderr
,
ut_print_buf
(
stderr
,
((
byte
*
)(
&
(
current_thd
->
ha_data
[
innobase_hton
->
slot
])))
-
100
,
((
byte
*
)(
&
(
current_thd
->
ha_data
[
ht
->
slot
])))
-
100
,
200
);
200
);
putc
(
'\n'
,
stderr
);
putc
(
'\n'
,
stderr
);
ut_error
;
ut_error
;
...
@@ -3320,7 +3341,7 @@ no_commit:
...
@@ -3320,7 +3341,7 @@ no_commit:
no need to re-acquire locks on it. */
no need to re-acquire locks on it. */
/* Altering to InnoDB format */
/* Altering to InnoDB format */
innobase_commit
(
user_thd
,
1
);
innobase_commit
(
ht
,
user_thd
,
1
);
/* Note that this transaction is still active. */
/* Note that this transaction is still active. */
prebuilt
->
trx
->
active_trans
=
1
;
prebuilt
->
trx
->
active_trans
=
1
;
/* We will need an IX lock on the destination table. */
/* We will need an IX lock on the destination table. */
...
@@ -3336,7 +3357,7 @@ no_commit:
...
@@ -3336,7 +3357,7 @@ no_commit:
/* Commit the transaction. This will release the table
/* Commit the transaction. This will release the table
locks, so they have to be acquired again. */
locks, so they have to be acquired again. */
innobase_commit
(
user_thd
,
1
);
innobase_commit
(
ht
,
user_thd
,
1
);
/* Note that this transaction is still active. */
/* Note that this transaction is still active. */
prebuilt
->
trx
->
active_trans
=
1
;
prebuilt
->
trx
->
active_trans
=
1
;
/* Re-acquire the table lock on the source table. */
/* Re-acquire the table lock on the source table. */
...
@@ -3403,7 +3424,8 @@ no_commit:
...
@@ -3403,7 +3424,8 @@ no_commit:
/* We must use the handler code to update the auto-increment
/* We must use the handler code to update the auto-increment
value to be sure that we increment it correctly. */
value to be sure that we increment it correctly. */
update_auto_increment
();
if
((
error
=
update_auto_increment
()))
goto
func_exit
;
auto_inc_used
=
1
;
auto_inc_used
=
1
;
}
}
...
@@ -3642,7 +3664,7 @@ ha_innobase::update_row(
...
@@ -3642,7 +3664,7 @@ ha_innobase::update_row(
DBUG_ENTER
(
"ha_innobase::update_row"
);
DBUG_ENTER
(
"ha_innobase::update_row"
);
ut_a
(
prebuilt
->
trx
==
ut_a
(
prebuilt
->
trx
==
(
trx_t
*
)
current_thd
->
ha_data
[
innobase_hton
->
slot
]);
(
trx_t
*
)
current_thd
->
ha_data
[
ht
->
slot
]);
if
(
table
->
timestamp_field_type
&
TIMESTAMP_AUTO_SET_ON_UPDATE
)
if
(
table
->
timestamp_field_type
&
TIMESTAMP_AUTO_SET_ON_UPDATE
)
table
->
timestamp_field
->
set_time
();
table
->
timestamp_field
->
set_time
();
...
@@ -3703,7 +3725,7 @@ ha_innobase::delete_row(
...
@@ -3703,7 +3725,7 @@ ha_innobase::delete_row(
DBUG_ENTER
(
"ha_innobase::delete_row"
);
DBUG_ENTER
(
"ha_innobase::delete_row"
);
ut_a
(
prebuilt
->
trx
==
ut_a
(
prebuilt
->
trx
==
(
trx_t
*
)
current_thd
->
ha_data
[
innobase_hton
->
slot
]);
(
trx_t
*
)
current_thd
->
ha_data
[
ht
->
slot
]);
if
(
last_query_id
!=
user_thd
->
query_id
)
{
if
(
last_query_id
!=
user_thd
->
query_id
)
{
prebuilt
->
sql_stat_start
=
TRUE
;
prebuilt
->
sql_stat_start
=
TRUE
;
...
@@ -3801,7 +3823,7 @@ ha_innobase::try_semi_consistent_read(bool yes)
...
@@ -3801,7 +3823,7 @@ ha_innobase::try_semi_consistent_read(bool yes)
row_prebuilt_t
*
prebuilt
=
(
row_prebuilt_t
*
)
innobase_prebuilt
;
row_prebuilt_t
*
prebuilt
=
(
row_prebuilt_t
*
)
innobase_prebuilt
;
ut_a
(
prebuilt
->
trx
==
ut_a
(
prebuilt
->
trx
==
(
trx_t
*
)
current_thd
->
ha_data
[
innobase_hton
->
slot
]);
(
trx_t
*
)
current_thd
->
ha_data
[
ht
->
slot
]);
/* Row read type is set to semi consistent read if this was
/* Row read type is set to semi consistent read if this was
requested by the MySQL and either innodb_locks_unsafe_for_binlog
requested by the MySQL and either innodb_locks_unsafe_for_binlog
...
@@ -3968,7 +3990,7 @@ ha_innobase::index_read(
...
@@ -3968,7 +3990,7 @@ ha_innobase::index_read(
DBUG_ENTER
(
"index_read"
);
DBUG_ENTER
(
"index_read"
);
ut_a
(
prebuilt
->
trx
==
ut_a
(
prebuilt
->
trx
==
(
trx_t
*
)
current_thd
->
ha_data
[
innobase_hton
->
slot
]);
(
trx_t
*
)
current_thd
->
ha_data
[
ht
->
slot
]);
statistic_increment
(
current_thd
->
status_var
.
ha_read_key_count
,
statistic_increment
(
current_thd
->
status_var
.
ha_read_key_count
,
&
LOCK_status
);
&
LOCK_status
);
...
@@ -4083,7 +4105,7 @@ ha_innobase::change_active_index(
...
@@ -4083,7 +4105,7 @@ ha_innobase::change_active_index(
ut_ad
(
user_thd
==
current_thd
);
ut_ad
(
user_thd
==
current_thd
);
ut_a
(
prebuilt
->
trx
==
ut_a
(
prebuilt
->
trx
==
(
trx_t
*
)
current_thd
->
ha_data
[
innobase_hton
->
slot
]);
(
trx_t
*
)
current_thd
->
ha_data
[
ht
->
slot
]);
active_index
=
keynr
;
active_index
=
keynr
;
...
@@ -4173,7 +4195,7 @@ ha_innobase::general_fetch(
...
@@ -4173,7 +4195,7 @@ ha_innobase::general_fetch(
DBUG_ENTER
(
"general_fetch"
);
DBUG_ENTER
(
"general_fetch"
);
ut_a
(
prebuilt
->
trx
==
ut_a
(
prebuilt
->
trx
==
(
trx_t
*
)
current_thd
->
ha_data
[
innobase_hton
->
slot
]);
(
trx_t
*
)
current_thd
->
ha_data
[
ht
->
slot
]);
innodb_srv_conc_enter_innodb
(
prebuilt
->
trx
);
innodb_srv_conc_enter_innodb
(
prebuilt
->
trx
);
...
@@ -4409,7 +4431,7 @@ ha_innobase::rnd_pos(
...
@@ -4409,7 +4431,7 @@ ha_innobase::rnd_pos(
&
LOCK_status
);
&
LOCK_status
);
ut_a
(
prebuilt
->
trx
==
ut_a
(
prebuilt
->
trx
==
(
trx_t
*
)
current_thd
->
ha_data
[
innobase_hton
->
slot
]);
(
trx_t
*
)
current_thd
->
ha_data
[
ht
->
slot
]);
if
(
prebuilt
->
clust_index_was_generated
)
{
if
(
prebuilt
->
clust_index_was_generated
)
{
/* No primary key was defined for the table and we
/* No primary key was defined for the table and we
...
@@ -4459,7 +4481,7 @@ ha_innobase::position(
...
@@ -4459,7 +4481,7 @@ ha_innobase::position(
uint
len
;
uint
len
;
ut_a
(
prebuilt
->
trx
==
ut_a
(
prebuilt
->
trx
==
(
trx_t
*
)
current_thd
->
ha_data
[
innobase_hton
->
slot
]);
(
trx_t
*
)
current_thd
->
ha_data
[
ht
->
slot
]);
if
(
prebuilt
->
clust_index_was_generated
)
{
if
(
prebuilt
->
clust_index_was_generated
)
{
/* No primary key was defined for the table and we
/* No primary key was defined for the table and we
...
@@ -4786,7 +4808,7 @@ ha_innobase::create(
...
@@ -4786,7 +4808,7 @@ ha_innobase::create(
/* Get the transaction associated with the current thd, or create one
/* Get the transaction associated with the current thd, or create one
if not yet created */
if not yet created */
parent_trx
=
check_trx_exists
(
thd
);
parent_trx
=
check_trx_exists
(
ht
,
thd
);
/* In case MySQL calls this in the middle of a SELECT query, release
/* In case MySQL calls this in the middle of a SELECT query, release
possible adaptive hash latch to avoid deadlocks of threads */
possible adaptive hash latch to avoid deadlocks of threads */
...
@@ -4968,7 +4990,7 @@ ha_innobase::discard_or_import_tablespace(
...
@@ -4968,7 +4990,7 @@ ha_innobase::discard_or_import_tablespace(
ut_a
(
prebuilt
->
trx
&&
prebuilt
->
trx
->
magic_n
==
TRX_MAGIC_N
);
ut_a
(
prebuilt
->
trx
&&
prebuilt
->
trx
->
magic_n
==
TRX_MAGIC_N
);
ut_a
(
prebuilt
->
trx
==
ut_a
(
prebuilt
->
trx
==
(
trx_t
*
)
current_thd
->
ha_data
[
innobase_hton
->
slot
]);
(
trx_t
*
)
current_thd
->
ha_data
[
ht
->
slot
]);
dict_table
=
prebuilt
->
table
;
dict_table
=
prebuilt
->
table
;
trx
=
prebuilt
->
trx
;
trx
=
prebuilt
->
trx
;
...
@@ -5048,7 +5070,7 @@ ha_innobase::delete_table(
...
@@ -5048,7 +5070,7 @@ ha_innobase::delete_table(
/* Get the transaction associated with the current thd, or create one
/* Get the transaction associated with the current thd, or create one
if not yet created */
if not yet created */
parent_trx
=
check_trx_exists
(
thd
);
parent_trx
=
check_trx_exists
(
ht
,
thd
);
/* In case MySQL calls this in the middle of a SELECT query, release
/* In case MySQL calls this in the middle of a SELECT query, release
possible adaptive hash latch to avoid deadlocks of threads */
possible adaptive hash latch to avoid deadlocks of threads */
...
@@ -5115,6 +5137,7 @@ void
...
@@ -5115,6 +5137,7 @@ void
innobase_drop_database
(
innobase_drop_database
(
/*===================*/
/*===================*/
/* out: error number */
/* out: error number */
handlerton
*
hton
,
/* in: handlerton of Innodb */
char
*
path
)
/* in: database path; inside InnoDB the name
char
*
path
)
/* in: database path; inside InnoDB the name
of the last directory in the path is used as
of the last directory in the path is used as
the database name: for example, in 'mysql/data/test'
the database name: for example, in 'mysql/data/test'
...
@@ -5130,7 +5153,7 @@ innobase_drop_database(
...
@@ -5130,7 +5153,7 @@ innobase_drop_database(
/* Get the transaction associated with the current thd, or create one
/* Get the transaction associated with the current thd, or create one
if not yet created */
if not yet created */
parent_trx
=
check_trx_exists
(
current_thd
);
parent_trx
=
check_trx_exists
(
hton
,
current_thd
);
/* In case MySQL calls this in the middle of a SELECT query, release
/* In case MySQL calls this in the middle of a SELECT query, release
possible adaptive hash latch to avoid deadlocks of threads */
possible adaptive hash latch to avoid deadlocks of threads */
...
@@ -5209,7 +5232,7 @@ ha_innobase::rename_table(
...
@@ -5209,7 +5232,7 @@ ha_innobase::rename_table(
/* Get the transaction associated with the current thd, or create one
/* Get the transaction associated with the current thd, or create one
if not yet created */
if not yet created */
parent_trx
=
check_trx_exists
(
current_thd
);
parent_trx
=
check_trx_exists
(
ht
,
current_thd
);
/* In case MySQL calls this in the middle of a SELECT query, release
/* In case MySQL calls this in the middle of a SELECT query, release
possible adaptive hash latch to avoid deadlocks of threads */
possible adaptive hash latch to avoid deadlocks of threads */
...
@@ -5296,7 +5319,7 @@ ha_innobase::records_in_range(
...
@@ -5296,7 +5319,7 @@ ha_innobase::records_in_range(
DBUG_ENTER
(
"records_in_range"
);
DBUG_ENTER
(
"records_in_range"
);
ut_a
(
prebuilt
->
trx
==
ut_a
(
prebuilt
->
trx
==
(
trx_t
*
)
current_thd
->
ha_data
[
innobase_hton
->
slot
]);
(
trx_t
*
)
current_thd
->
ha_data
[
ht
->
slot
]);
prebuilt
->
trx
->
op_info
=
(
char
*
)
"estimating records in index range"
;
prebuilt
->
trx
->
op_info
=
(
char
*
)
"estimating records in index range"
;
...
@@ -5738,7 +5761,7 @@ ha_innobase::check(
...
@@ -5738,7 +5761,7 @@ ha_innobase::check(
ut_a
(
prebuilt
->
trx
&&
prebuilt
->
trx
->
magic_n
==
TRX_MAGIC_N
);
ut_a
(
prebuilt
->
trx
&&
prebuilt
->
trx
->
magic_n
==
TRX_MAGIC_N
);
ut_a
(
prebuilt
->
trx
==
ut_a
(
prebuilt
->
trx
==
(
trx_t
*
)
current_thd
->
ha_data
[
innobase_hton
->
slot
]);
(
trx_t
*
)
current_thd
->
ha_data
[
ht
->
slot
]);
if
(
prebuilt
->
mysql_template
==
NULL
)
{
if
(
prebuilt
->
mysql_template
==
NULL
)
{
/* Build the template; we will use a dummy template
/* Build the template; we will use a dummy template
...
@@ -6022,7 +6045,7 @@ ha_innobase::can_switch_engines(void)
...
@@ -6022,7 +6045,7 @@ ha_innobase::can_switch_engines(void)
DBUG_ENTER
(
"ha_innobase::can_switch_engines"
);
DBUG_ENTER
(
"ha_innobase::can_switch_engines"
);
ut_a
(
prebuilt
->
trx
==
ut_a
(
prebuilt
->
trx
==
(
trx_t
*
)
current_thd
->
ha_data
[
innobase_hton
->
slot
]);
(
trx_t
*
)
current_thd
->
ha_data
[
ht
->
slot
]);
prebuilt
->
trx
->
op_info
=
prebuilt
->
trx
->
op_info
=
"determining if there are foreign key constraints"
;
"determining if there are foreign key constraints"
;
...
@@ -6201,10 +6224,10 @@ ha_innobase::start_stmt(
...
@@ -6201,10 +6224,10 @@ ha_innobase::start_stmt(
/* Set the MySQL flag to mark that there is an active transaction */
/* Set the MySQL flag to mark that there is an active transaction */
if
(
trx
->
active_trans
==
0
)
{
if
(
trx
->
active_trans
==
0
)
{
innobase_register_trx_and_stmt
(
thd
);
innobase_register_trx_and_stmt
(
ht
,
thd
);
trx
->
active_trans
=
1
;
trx
->
active_trans
=
1
;
}
else
{
}
else
{
innobase_register_stmt
(
thd
);
innobase_register_stmt
(
ht
,
thd
);
}
}
return
(
0
);
return
(
0
);
...
@@ -6277,10 +6300,10 @@ ha_innobase::external_lock(
...
@@ -6277,10 +6300,10 @@ ha_innobase::external_lock(
transaction */
transaction */
if
(
trx
->
active_trans
==
0
)
{
if
(
trx
->
active_trans
==
0
)
{
innobase_register_trx_and_stmt
(
thd
);
innobase_register_trx_and_stmt
(
ht
,
thd
);
trx
->
active_trans
=
1
;
trx
->
active_trans
=
1
;
}
else
if
(
trx
->
n_mysql_tables_in_use
==
0
)
{
}
else
if
(
trx
->
n_mysql_tables_in_use
==
0
)
{
innobase_register_stmt
(
thd
);
innobase_register_stmt
(
ht
,
thd
);
}
}
trx
->
n_mysql_tables_in_use
++
;
trx
->
n_mysql_tables_in_use
++
;
...
@@ -6358,7 +6381,7 @@ ha_innobase::external_lock(
...
@@ -6358,7 +6381,7 @@ ha_innobase::external_lock(
if
(
!
(
thd
->
options
&
(
OPTION_NOT_AUTOCOMMIT
|
OPTION_BEGIN
)))
{
if
(
!
(
thd
->
options
&
(
OPTION_NOT_AUTOCOMMIT
|
OPTION_BEGIN
)))
{
if
(
trx
->
active_trans
!=
0
)
{
if
(
trx
->
active_trans
!=
0
)
{
innobase_commit
(
thd
,
TRUE
);
innobase_commit
(
ht
,
thd
,
TRUE
);
}
}
}
else
{
}
else
{
if
(
trx
->
isolation_level
<=
TRX_ISO_READ_COMMITTED
if
(
trx
->
isolation_level
<=
TRX_ISO_READ_COMMITTED
...
@@ -6439,7 +6462,7 @@ ha_innobase::transactional_table_lock(
...
@@ -6439,7 +6462,7 @@ ha_innobase::transactional_table_lock(
/* Set the MySQL flag to mark that there is an active transaction */
/* Set the MySQL flag to mark that there is an active transaction */
if
(
trx
->
active_trans
==
0
)
{
if
(
trx
->
active_trans
==
0
)
{
innobase_register_trx_and_stmt
(
thd
);
innobase_register_trx_and_stmt
(
ht
,
thd
);
trx
->
active_trans
=
1
;
trx
->
active_trans
=
1
;
}
}
...
@@ -6487,6 +6510,7 @@ Monitor to the client. */
...
@@ -6487,6 +6510,7 @@ Monitor to the client. */
bool
bool
innodb_show_status
(
innodb_show_status
(
/*===============*/
/*===============*/
handlerton
*
hton
,
/* in: the innodb handlerton */
THD
*
thd
,
/* in: the MySQL query thread of the caller */
THD
*
thd
,
/* in: the MySQL query thread of the caller */
stat_print_fn
*
stat_print
)
stat_print_fn
*
stat_print
)
{
{
...
@@ -6502,7 +6526,7 @@ innodb_show_status(
...
@@ -6502,7 +6526,7 @@ innodb_show_status(
DBUG_RETURN
(
FALSE
);
DBUG_RETURN
(
FALSE
);
}
}
trx
=
check_trx_exists
(
thd
);
trx
=
check_trx_exists
(
hton
,
thd
);
innobase_release_stat_resources
(
trx
);
innobase_release_stat_resources
(
trx
);
...
@@ -6577,6 +6601,7 @@ Implements the SHOW MUTEX STATUS command. . */
...
@@ -6577,6 +6601,7 @@ Implements the SHOW MUTEX STATUS command. . */
bool
bool
innodb_mutex_show_status
(
innodb_mutex_show_status
(
/*=====================*/
/*=====================*/
handlerton
*
hton
,
/* in: the innodb handlerton */
THD
*
thd
,
/* in: the MySQL query thread of the
THD
*
thd
,
/* in: the MySQL query thread of the
caller */
caller */
stat_print_fn
*
stat_print
)
stat_print_fn
*
stat_print
)
...
@@ -6658,14 +6683,15 @@ innodb_mutex_show_status(
...
@@ -6658,14 +6683,15 @@ innodb_mutex_show_status(
DBUG_RETURN
(
FALSE
);
DBUG_RETURN
(
FALSE
);
}
}
bool
innobase_show_status
(
THD
*
thd
,
stat_print_fn
*
stat_print
,
bool
innobase_show_status
(
handlerton
*
hton
,
THD
*
thd
,
enum
ha_stat_type
stat_type
)
stat_print_fn
*
stat_print
,
enum
ha_stat_type
stat_type
)
{
{
switch
(
stat_type
)
{
switch
(
stat_type
)
{
case
HA_ENGINE_STATUS
:
case
HA_ENGINE_STATUS
:
return
innodb_show_status
(
thd
,
stat_print
);
return
innodb_show_status
(
hton
,
thd
,
stat_print
);
case
HA_ENGINE_MUTEX
:
case
HA_ENGINE_MUTEX
:
return
innodb_mutex_show_status
(
thd
,
stat_print
);
return
innodb_mutex_show_status
(
hton
,
thd
,
stat_print
);
default:
default:
return
FALSE
;
return
FALSE
;
}
}
...
@@ -6765,7 +6791,7 @@ ha_innobase::store_lock(
...
@@ -6765,7 +6791,7 @@ ha_innobase::store_lock(
because we call update_thd() later, in ::external_lock()! Failure to
because we call update_thd() later, in ::external_lock()! Failure to
understand this caused a serious memory corruption bug in 5.1.11. */
understand this caused a serious memory corruption bug in 5.1.11. */
trx
=
check_trx_exists
(
thd
);
trx
=
check_trx_exists
(
ht
,
thd
);
/* NOTE: MySQL can call this function with lock 'type' TL_IGNORE!
/* NOTE: MySQL can call this function with lock 'type' TL_IGNORE!
Be careful to ignore TL_IGNORE if we are going to do something with
Be careful to ignore TL_IGNORE if we are going to do something with
...
@@ -7151,7 +7177,7 @@ ha_innobase::reset_auto_increment(ulonglong value)
...
@@ -7151,7 +7177,7 @@ ha_innobase::reset_auto_increment(ulonglong value)
bool
bool
ha_innobase
::
get_error_message
(
int
error
,
String
*
buf
)
ha_innobase
::
get_error_message
(
int
error
,
String
*
buf
)
{
{
trx_t
*
trx
=
check_trx_exists
(
current_thd
);
trx_t
*
trx
=
check_trx_exists
(
ht
,
current_thd
);
buf
->
copy
(
trx
->
detailed_error
,
strlen
(
trx
->
detailed_error
),
buf
->
copy
(
trx
->
detailed_error
,
strlen
(
trx
->
detailed_error
),
system_charset_info
);
system_charset_info
);
...
@@ -7370,13 +7396,14 @@ int
...
@@ -7370,13 +7396,14 @@ int
innobase_xa_prepare
(
innobase_xa_prepare
(
/*================*/
/*================*/
/* out: 0 or error number */
/* out: 0 or error number */
handlerton
*
hton
,
THD
*
thd
,
/* in: handle to the MySQL thread of the user
THD
*
thd
,
/* in: handle to the MySQL thread of the user
whose XA transaction should be prepared */
whose XA transaction should be prepared */
bool
all
)
/* in: TRUE - commit transaction
bool
all
)
/* in: TRUE - commit transaction
FALSE - the current SQL statement ended */
FALSE - the current SQL statement ended */
{
{
int
error
=
0
;
int
error
=
0
;
trx_t
*
trx
=
check_trx_exists
(
thd
);
trx_t
*
trx
=
check_trx_exists
(
hton
,
thd
);
if
(
thd
->
lex
->
sql_command
!=
SQLCOM_XA_PREPARE
&&
if
(
thd
->
lex
->
sql_command
!=
SQLCOM_XA_PREPARE
&&
(
all
||
!
(
thd
->
options
&
(
OPTION_NOT_AUTOCOMMIT
|
OPTION_BEGIN
))))
(
all
||
!
(
thd
->
options
&
(
OPTION_NOT_AUTOCOMMIT
|
OPTION_BEGIN
))))
...
@@ -7466,6 +7493,7 @@ innobase_xa_recover(
...
@@ -7466,6 +7493,7 @@ innobase_xa_recover(
/*================*/
/*================*/
/* out: number of prepared transactions
/* out: number of prepared transactions
stored in xid_list */
stored in xid_list */
handlerton
*
hton
,
XID
*
xid_list
,
/* in/out: prepared transactions */
XID
*
xid_list
,
/* in/out: prepared transactions */
uint
len
)
/* in: number of slots in xid_list */
uint
len
)
/* in: number of slots in xid_list */
{
{
...
@@ -7485,6 +7513,7 @@ int
...
@@ -7485,6 +7513,7 @@ int
innobase_commit_by_xid
(
innobase_commit_by_xid
(
/*===================*/
/*===================*/
/* out: 0 or error number */
/* out: 0 or error number */
handlerton
*
hton
,
XID
*
xid
)
/* in: X/Open XA transaction identification */
XID
*
xid
)
/* in: X/Open XA transaction identification */
{
{
trx_t
*
trx
;
trx_t
*
trx
;
...
@@ -7508,6 +7537,7 @@ int
...
@@ -7508,6 +7537,7 @@ int
innobase_rollback_by_xid
(
innobase_rollback_by_xid
(
/*=====================*/
/*=====================*/
/* out: 0 or error number */
/* out: 0 or error number */
handlerton
*
hton
,
XID
*
xid
)
/* in: X/Open XA transaction identification */
XID
*
xid
)
/* in: X/Open XA transaction identification */
{
{
trx_t
*
trx
;
trx_t
*
trx
;
...
@@ -7528,12 +7558,13 @@ This consistent view is then used inside of MySQL when accessing records
...
@@ -7528,12 +7558,13 @@ This consistent view is then used inside of MySQL when accessing records
using a cursor. */
using a cursor. */
void
*
void
*
innobase_create_cursor_view
(
void
)
innobase_create_cursor_view
(
/*=============================*/
/* out: pointer to cursor view or NULL */
/* out: Pointer to cursor view or NULL */
handlerton
*
hton
,
/* in: innobase hton */
THD
*
thd
)
/* in: user thread handle */
{
{
return
(
read_cursor_view_create_for_mysql
(
return
(
read_cursor_view_create_for_mysql
(
check_trx_exists
(
current_
thd
)));
check_trx_exists
(
hton
,
thd
)));
}
}
/***********************************************************************
/***********************************************************************
...
@@ -7543,10 +7574,11 @@ corresponding MySQL thread still lacks one. */
...
@@ -7543,10 +7574,11 @@ corresponding MySQL thread still lacks one. */
void
void
innobase_close_cursor_view
(
innobase_close_cursor_view
(
/*=======================*/
handlerton
*
hton
,
THD
*
thd
,
/* in: user thread handle */
void
*
curview
)
/* in: Consistent read view to be closed */
void
*
curview
)
/* in: Consistent read view to be closed */
{
{
read_cursor_view_close_for_mysql
(
check_trx_exists
(
current_thd
),
read_cursor_view_close_for_mysql
(
check_trx_exists
(
hton
,
current_thd
),
(
cursor_view_t
*
)
curview
);
(
cursor_view_t
*
)
curview
);
}
}
...
@@ -7559,9 +7591,11 @@ restored to a transaction read view. */
...
@@ -7559,9 +7591,11 @@ restored to a transaction read view. */
void
void
innobase_set_cursor_view
(
innobase_set_cursor_view
(
/*=====================*/
/*=====================*/
handlerton
*
hton
,
THD
*
thd
,
/* in: user thread handle */
void
*
curview
)
/* in: Consistent cursor view to be set */
void
*
curview
)
/* in: Consistent cursor view to be set */
{
{
read_cursor_set_for_mysql
(
check_trx_exists
(
current_thd
),
read_cursor_set_for_mysql
(
check_trx_exists
(
hton
,
current_thd
),
(
cursor_view_t
*
)
curview
);
(
cursor_view_t
*
)
curview
);
}
}
...
@@ -7606,7 +7640,7 @@ SHOW_VAR innodb_status_variables_export[]= {
...
@@ -7606,7 +7640,7 @@ SHOW_VAR innodb_status_variables_export[]= {
};
};
struct
st_mysql_storage_engine
innobase_storage_engine
=
struct
st_mysql_storage_engine
innobase_storage_engine
=
{
MYSQL_HANDLERTON_INTERFACE_VERSION
,
innobase_hton
};
{
MYSQL_HANDLERTON_INTERFACE_VERSION
};
mysql_declare_plugin
(
innobase
)
mysql_declare_plugin
(
innobase
)
{
{
...
...
handler/ha_innodb.h
View file @
f3a617f3
...
@@ -80,7 +80,7 @@ class ha_innobase: public handler
...
@@ -80,7 +80,7 @@ class ha_innobase: public handler
/* Init values for the class: */
/* Init values for the class: */
public:
public:
ha_innobase
(
TABLE_SHARE
*
table_arg
);
ha_innobase
(
handlerton
*
hton
,
TABLE_SHARE
*
table_arg
);
~
ha_innobase
()
{}
~
ha_innobase
()
{}
/*
/*
Get the row type from the storage engine. If this method returns
Get the row type from the storage engine. If this method returns
...
@@ -238,8 +238,8 @@ extern ulong srv_flush_log_at_trx_commit;
...
@@ -238,8 +238,8 @@ extern ulong srv_flush_log_at_trx_commit;
}
}
int
innobase_init
(
void
);
int
innobase_init
(
void
);
int
innobase_end
(
ha_panic_function
type
);
int
innobase_end
(
ha
ndlerton
*
hton
,
ha
_panic_function
type
);
bool
innobase_flush_logs
(
void
);
bool
innobase_flush_logs
(
handlerton
*
hton
);
uint
innobase_get_free_space
(
void
);
uint
innobase_get_free_space
(
void
);
/*
/*
...
@@ -256,14 +256,14 @@ int innobase_commit_complete(void* trx_handle);
...
@@ -256,14 +256,14 @@ int innobase_commit_complete(void* trx_handle);
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);
#endif
#endif
void
innobase_drop_database
(
char
*
path
);
void
innobase_drop_database
(
handlerton
*
hton
,
char
*
path
);
bool
innobase_show_status
(
THD
*
thd
,
stat_print_fn
*
,
enum
ha_stat_type
);
bool
innobase_show_status
(
handlerton
*
hton
,
THD
*
thd
,
stat_print_fn
*
,
enum
ha_stat_type
);
int
innobase_release_temporary_latches
(
THD
*
thd
);
int
innobase_release_temporary_latches
(
handlerton
*
hton
,
THD
*
thd
);
void
innobase_store_binlog_offset_and_flush_log
(
char
*
binlog_name
,
longlong
offset
);
void
innobase_store_binlog_offset_and_flush_log
(
handlerton
*
hton
,
char
*
binlog_name
,
longlong
offset
);
int
innobase_start_trx_and_assign_read_view
(
THD
*
thd
);
int
innobase_start_trx_and_assign_read_view
(
handlerton
*
hton
,
THD
*
thd
);
/***********************************************************************
/***********************************************************************
This function is used to prepare X/Open XA distributed transaction */
This function is used to prepare X/Open XA distributed transaction */
...
@@ -271,6 +271,7 @@ This function is used to prepare X/Open XA distributed transaction */
...
@@ -271,6 +271,7 @@ This function is used to prepare X/Open XA distributed transaction */
int
innobase_xa_prepare
(
int
innobase_xa_prepare
(
/*====================*/
/*====================*/
/* out: 0 or error number */
/* out: 0 or error number */
handlerton
*
hton
,
/* in: innobase hton */
THD
*
thd
,
/* in: handle to the MySQL thread of the user
THD
*
thd
,
/* in: handle to the MySQL thread of the user
whose XA transaction should be prepared */
whose XA transaction should be prepared */
bool
all
);
/* in: TRUE - commit transaction
bool
all
);
/* in: TRUE - commit transaction
...
@@ -283,6 +284,7 @@ int innobase_xa_recover(
...
@@ -283,6 +284,7 @@ int innobase_xa_recover(
/*====================*/
/*====================*/
/* out: number of prepared transactions
/* out: number of prepared transactions
stored in xid_list */
stored in xid_list */
handlerton
*
hton
,
/* in: innobase hton */
XID
*
xid_list
,
/* in/out: prepared transactions */
XID
*
xid_list
,
/* in/out: prepared transactions */
uint
len
);
/* in: number of slots in xid_list */
uint
len
);
/* in: number of slots in xid_list */
...
@@ -293,6 +295,7 @@ which is in the prepared state */
...
@@ -293,6 +295,7 @@ which is in the prepared state */
int
innobase_commit_by_xid
(
int
innobase_commit_by_xid
(
/*=======================*/
/*=======================*/
/* out: 0 or error number */
/* out: 0 or error number */
handlerton
*
hton
,
/* in: innobase hton */
XID
*
xid
);
/* in : X/Open XA Transaction Identification */
XID
*
xid
);
/* in : X/Open XA Transaction Identification */
/***********************************************************************
/***********************************************************************
...
@@ -301,6 +304,7 @@ which is in the prepared state */
...
@@ -301,6 +304,7 @@ which is in the prepared state */
int
innobase_rollback_by_xid
(
int
innobase_rollback_by_xid
(
/* out: 0 or error number */
/* out: 0 or error number */
handlerton
*
hton
,
/* in: innobase hton */
XID
*
xid
);
/* in : X/Open XA Transaction Identification */
XID
*
xid
);
/* in : X/Open XA Transaction Identification */
...
@@ -311,9 +315,10 @@ This consistent view is then used inside of MySQL when accessing records
...
@@ -311,9 +315,10 @@ This consistent view is then used inside of MySQL when accessing records
using a cursor. */
using a cursor. */
void
*
void
*
innobase_create_cursor_view
(
void
);
innobase_create_cursor_view
(
/*=============================*/
/* out: Pointer to cursor view or NULL */
/* out: Pointer to cursor view or NULL */
handlerton
*
hton
,
/* in: innobase hton */
THD
*
thd
);
/* in: user thread handle */
/***********************************************************************
/***********************************************************************
Close the given consistent cursor view of a transaction and restore
Close the given consistent cursor view of a transaction and restore
...
@@ -323,8 +328,11 @@ corresponding MySQL thread still lacks one. */
...
@@ -323,8 +328,11 @@ corresponding MySQL thread still lacks one. */
void
void
innobase_close_cursor_view
(
innobase_close_cursor_view
(
/*=======================*/
/*=======================*/
handlerton
*
hton
,
/* in: innobase hton */
THD
*
thd
,
/* in: user thread handle */
void
*
curview
);
/* in: Consistent read view to be closed */
void
*
curview
);
/* in: Consistent read view to be closed */
/***********************************************************************
/***********************************************************************
Set the given consistent cursor view to a transaction which is created
Set the given consistent cursor view to a transaction which is created
if the corresponding MySQL thread still lacks one. If the given
if the corresponding MySQL thread still lacks one. If the given
...
@@ -334,4 +342,6 @@ restored to a transaction read view. */
...
@@ -334,4 +342,6 @@ restored to a transaction read view. */
void
void
innobase_set_cursor_view
(
innobase_set_cursor_view
(
/*=====================*/
/*=====================*/
handlerton
*
hton
,
/* in: innobase hton */
THD
*
thd
,
/* in: user thread handle */
void
*
curview
);
/* in: Consistent read view to be set */
void
*
curview
);
/* in: Consistent read view to be set */
setup.sh
View file @
f3a617f3
...
@@ -3,43 +3,18 @@
...
@@ -3,43 +3,18 @@
# Prepare the MySQL source code tree for building
# Prepare the MySQL source code tree for building
# with checked-out InnoDB Subversion directory.
# with checked-out InnoDB Subversion directory.
# This script assumes that the
MySQL tree is at .. and that . = ../innodb
# This script assumes that the
current directory is storage/innobase.
set
-eu
set
-eu
TARGETDIR
=
../storage/innobase
TARGETDIR
=
../storage/innobase
rm
-fr
"
$TARGETDIR
"
mkdir
"
$TARGETDIR
"
# link the build scripts
# link the build scripts
ln
-sf
../innodb/compile-innodb
{
,-debug
}
../BUILD
ln
-sf
$TARGETDIR
/compile-innodb
{
,-debug
}
../../BUILD
# create the directories
for
dir
in
*
/
do
case
"
$dir
"
in
mysql-test/
)
;;
*
.svn
*
)
;;
*
to-mysql
*
)
;;
*
)
mkdir
"
$TARGETDIR
/
$dir
"
;;
esac
done
# create the symlinks to files
cd
"
$TARGETDIR
"
for
dir
in
*
/
do
cd
"
$dir
"
ln
-s
../../../innodb/
"
$dir
"
*
.
cd
..
done
for
file
in
plug.in Makefile.am CMakeLists.txt
do
ln
-s
../../innodb/
"
$file
"
.
done
cd
../../mysql-test/t
cd
../../mysql-test/t
ln
-sf
../../innodb/mysql-test/
*
.test ../../innodb/mysql-test/
*
.opt ./
ln
-sf
../
$TARGETDIR
/mysql-test/
*
.test
$TARGETDIR
/mysql-test/
*
.opt
.
ln
-sf
../../innodb/mysql-test/
*
.result ../r/
cd
../r
ln
-sf
../../innodb/mysql-test/
*
.inc ../include/
ln
-sf
../
$TARGETDIR
/mysql-test/
*
.result
.
cd
../include
ln
-sf
../
$TARGETDIR
/mysql-test/
*
.inc
.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment