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
1f0cd873
Commit
1f0cd873
authored
Jul 20, 2004
by
serg@serg.mylan
Browse files
Options
Browse Files
Download
Plain Diff
manual merged (blame me!)
parents
e2d6d838
64fa4cc1
Changes
22
Show whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
248 additions
and
72 deletions
+248
-72
Build-tools/Do-compile
Build-tools/Do-compile
+14
-12
innobase/btr/btr0cur.c
innobase/btr/btr0cur.c
+9
-2
innobase/include/lock0lock.h
innobase/include/lock0lock.h
+3
-2
innobase/include/row0mysql.h
innobase/include/row0mysql.h
+4
-3
innobase/include/srv0srv.h
innobase/include/srv0srv.h
+1
-0
innobase/include/sync0arr.h
innobase/include/sync0arr.h
+1
-1
innobase/include/trx0trx.h
innobase/include/trx0trx.h
+3
-2
innobase/lock/lock0lock.c
innobase/lock/lock0lock.c
+21
-19
innobase/row/row0ins.c
innobase/row/row0ins.c
+67
-14
innobase/row/row0mysql.c
innobase/row/row0mysql.c
+16
-5
innobase/srv/srv0srv.c
innobase/srv/srv0srv.c
+3
-0
innobase/srv/srv0start.c
innobase/srv/srv0start.c
+1
-1
innobase/sync/sync0arr.c
innobase/sync/sync0arr.c
+7
-5
innobase/trx/trx0trx.c
innobase/trx/trx0trx.c
+2
-2
mysql-test/r/create_select_tmp.result
mysql-test/r/create_select_tmp.result
+19
-0
mysql-test/r/rpl_drop.result
mysql-test/r/rpl_drop.result
+10
-0
mysql-test/t/create_select_tmp.test
mysql-test/t/create_select_tmp.test
+27
-0
mysql-test/t/innodb.test
mysql-test/t/innodb.test
+17
-0
mysql-test/t/rpl_drop.test
mysql-test/t/rpl_drop.test
+10
-0
sql/ha_innodb.cc
sql/ha_innodb.cc
+2
-2
sql/sql_insert.cc
sql/sql_insert.cc
+6
-2
sql/sql_load.cc
sql/sql_load.cc
+5
-0
No files found.
Build-tools/Do-compile
View file @
1f0cd873
...
@@ -171,6 +171,17 @@ info("PATH is $ENV{PATH}");
...
@@ -171,6 +171,17 @@ info("PATH is $ENV{PATH}");
log_timestamp
();
log_timestamp
();
$md5_result
=
safe_system
("
perl
$ENV
{HOME}/my_md5sum -c
${opt_distribution}
.md5
");
if
(
$md5_result
!=
0
)
{
abort
("
MD5 check failed for
$opt_distribution
!
");
}
else
{
info
("
SUCCESS: MD5 checks for
$opt_distribution
");
}
if
(
-
x
"
$host
/bin/mysqladmin
")
if
(
-
x
"
$host
/bin/mysqladmin
")
{
{
log_system
("
$host
/bin/mysqladmin
$mysqladmin_args
-S
$mysql_unix_port
-s shutdown
");
log_system
("
$host
/bin/mysqladmin
$mysqladmin_args
-S
$mysql_unix_port
-s shutdown
");
...
@@ -204,17 +215,6 @@ if ($opt_stage == 0)
...
@@ -204,17 +215,6 @@ if ($opt_stage == 0)
safe_cd
(
$host
);
safe_cd
(
$host
);
if
(
$opt_stage
==
0
&&
!
$opt_use_old_distribution
)
if
(
$opt_stage
==
0
&&
!
$opt_use_old_distribution
)
{
{
$md5_result
=
safe_system
("
./my_md5sum -c
${opt_distribution}
.md5
");
if
(
$md5_result
!=
0
)
{
abort
("
MD5 failed for
$opt_distribution
!
");
}
else
{
info
("
SUCCESS: MD5 checks for
$opt_distribution
");
}
safe_system
("
gunzip <
$opt_distribution
|
$tar
xf -
");
safe_system
("
gunzip <
$opt_distribution
|
$tar
xf -
");
# Fix file times; This is needed because the time for files may be
# Fix file times; This is needed because the time for files may be
...
@@ -343,7 +343,9 @@ $tar_file=<$pwd/$host/mysql*.t*gz>;
...
@@ -343,7 +343,9 @@ $tar_file=<$pwd/$host/mysql*.t*gz>;
abort
("
Could not find tarball!
")
unless
(
$tar_file
);
abort
("
Could not find tarball!
")
unless
(
$tar_file
);
# Generate the MD5 for the binary distribution
# Generate the MD5 for the binary distribution
safe_system
("
./my_md5sum
$tar_file
>
${tar_file}
.md5}
");
$tar_file
=~
/(mysql[^\/]*)\.(tar\.gz|tgz)/
;
$tar_file_lite
=
"
$1.$2
";
system
("
cd
$pwd
/
$host
; perl
$ENV
{HOME}/my_md5sum
$tar_file_lite
>
${tar_file_lite}
.md5
");
#
#
# Unpack the binary distribution
# Unpack the binary distribution
...
...
innobase/btr/btr0cur.c
View file @
1f0cd873
...
@@ -2717,8 +2717,11 @@ btr_estimate_number_of_different_key_vals(
...
@@ -2717,8 +2717,11 @@ btr_estimate_number_of_different_key_vals(
rec
=
page_rec_get_next
(
rec
);
rec
=
page_rec_get_next
(
rec
);
}
}
if
(
n_cols
==
dict_index_get_n_unique_in_tree
(
index
))
{
if
(
n_cols
==
dict_index_get_n_unique_in_tree
(
index
))
{
/* We add one because we know that the first record
/* If there is more than one leaf page in the tree,
we add one because we know that the first record
on the page certainly had a different prefix than the
on the page certainly had a different prefix than the
last record on the previous index page in the
last record on the previous index page in the
alphabetical order. Before this fix, if there was
alphabetical order. Before this fix, if there was
...
@@ -2726,8 +2729,12 @@ btr_estimate_number_of_different_key_vals(
...
@@ -2726,8 +2729,12 @@ btr_estimate_number_of_different_key_vals(
algorithm grossly underestimated the number of rows
algorithm grossly underestimated the number of rows
in the table. */
in the table. */
if
(
btr_page_get_prev
(
page
,
&
mtr
)
!=
FIL_NULL
||
btr_page_get_next
(
page
,
&
mtr
)
!=
FIL_NULL
)
{
n_diff
[
n_cols
]
++
;
n_diff
[
n_cols
]
++
;
}
}
}
total_external_size
+=
total_external_size
+=
btr_rec_get_externally_stored_len
(
rec
);
btr_rec_get_externally_stored_len
(
rec
);
...
...
innobase/include/lock0lock.h
View file @
1f0cd873
...
@@ -418,7 +418,8 @@ lock_release_off_kernel(
...
@@ -418,7 +418,8 @@ lock_release_off_kernel(
/*====================*/
/*====================*/
trx_t
*
trx
);
/* in: transaction */
trx_t
*
trx
);
/* in: transaction */
/*************************************************************************
/*************************************************************************
Releases table locks, and releases possible other transactions waiting
Releases table locks explicitly requested with LOCK TABLES (indicated by
lock type LOCK_TABLE_EXP), and releases possible other transactions waiting
because of these locks. */
because of these locks. */
void
void
...
@@ -548,7 +549,7 @@ extern lock_sys_t* lock_sys;
...
@@ -548,7 +549,7 @@ extern lock_sys_t* lock_sys;
/* Lock types */
/* Lock types */
#define LOCK_TABLE 16
/* these type values should be so high that */
#define LOCK_TABLE 16
/* these type values should be so high that */
#define LOCK_REC 32
/* they can be ORed to the lock mode */
#define LOCK_REC 32
/* they can be ORed to the lock mode */
#define LOCK_TABLE_EXP 80
/* explicit table lock */
#define LOCK_TABLE_EXP 80
/* explicit table lock
(80 = 16 + 64)
*/
#define LOCK_TYPE_MASK 0xF0UL
/* mask used to extract lock type from the
#define LOCK_TYPE_MASK 0xF0UL
/* mask used to extract lock type from the
type_mode field in a lock */
type_mode field in a lock */
/* Waiting lock flag */
/* Waiting lock flag */
...
...
innobase/include/row0mysql.h
View file @
1f0cd873
...
@@ -161,11 +161,12 @@ row_lock_table_autoinc_for_mysql(
...
@@ -161,11 +161,12 @@ row_lock_table_autoinc_for_mysql(
row_prebuilt_t
*
prebuilt
);
/* in: prebuilt struct in the MySQL
row_prebuilt_t
*
prebuilt
);
/* in: prebuilt struct in the MySQL
table handle */
table handle */
/*************************************************************************
/*************************************************************************
Unlocks a table lock possibly reserved by trx. */
Unlocks all table locks explicitly requested by trx (with LOCK TABLES,
lock type LOCK_TABLE_EXP). */
void
void
row_unlock_table_for_mysql
(
row_unlock_table
s
_for_mysql
(
/*=======================*/
/*=======================
=
*/
trx_t
*
trx
);
/* in: transaction */
trx_t
*
trx
);
/* in: transaction */
/*************************************************************************
/*************************************************************************
Sets a table lock on the table mentioned in prebuilt. */
Sets a table lock on the table mentioned in prebuilt. */
...
...
innobase/include/srv0srv.h
View file @
1f0cd873
...
@@ -157,6 +157,7 @@ extern ulint srv_test_n_mutexes;
...
@@ -157,6 +157,7 @@ extern ulint srv_test_n_mutexes;
extern
ulint
srv_test_array_size
;
extern
ulint
srv_test_array_size
;
extern
ulint
srv_activity_count
;
extern
ulint
srv_activity_count
;
extern
ulint
srv_fatal_semaphore_wait_threshold
;
extern
mutex_t
*
kernel_mutex_temp
;
/* mutex protecting the server, trx structs,
extern
mutex_t
*
kernel_mutex_temp
;
/* mutex protecting the server, trx structs,
query threads, and lock table: we allocate
query threads, and lock table: we allocate
...
...
innobase/include/sync0arr.h
View file @
1f0cd873
...
@@ -95,7 +95,7 @@ void
...
@@ -95,7 +95,7 @@ void
sync_arr_wake_threads_if_sema_free
(
void
);
sync_arr_wake_threads_if_sema_free
(
void
);
/*====================================*/
/*====================================*/
/**************************************************************************
/**************************************************************************
Prints warnings of long semaphore waits to stderr.
Currently > 120 sec.
*/
Prints warnings of long semaphore waits to stderr. */
void
void
sync_array_print_long_waits
(
void
);
sync_array_print_long_waits
(
void
);
...
...
innobase/include/trx0trx.h
View file @
1f0cd873
...
@@ -423,8 +423,9 @@ struct trx_struct{
...
@@ -423,8 +423,9 @@ struct trx_struct{
lock_t
*
auto_inc_lock
;
/* possible auto-inc lock reserved by
lock_t
*
auto_inc_lock
;
/* possible auto-inc lock reserved by
the transaction; note that it is also
the transaction; note that it is also
in the lock list trx_locks */
in the lock list trx_locks */
ulint
n_tables_locked
;
/* number of table locks reserved by
ulint
n_lock_table_exp
;
/* number of explicit table locks
the transaction, stored in trx_locks */
(LOCK TABLES) reserved by the
transaction, stored in trx_locks */
UT_LIST_NODE_T
(
trx_t
)
UT_LIST_NODE_T
(
trx_t
)
trx_list
;
/* list of transactions */
trx_list
;
/* list of transactions */
UT_LIST_NODE_T
(
trx_t
)
UT_LIST_NODE_T
(
trx_t
)
...
...
innobase/lock/lock0lock.c
View file @
1f0cd873
...
@@ -2023,9 +2023,8 @@ lock_grant(
...
@@ -2023,9 +2023,8 @@ lock_grant(
lock
->
trx
->
auto_inc_lock
=
lock
;
lock
->
trx
->
auto_inc_lock
=
lock
;
}
else
if
(
lock_get_type
(
lock
)
==
LOCK_TABLE_EXP
)
{
}
else
if
(
lock_get_type
(
lock
)
==
LOCK_TABLE_EXP
)
{
ut_a
d
(
lock_get_mode
(
lock
)
==
LOCK_S
ut_a
(
lock_get_mode
(
lock
)
==
LOCK_S
||
lock_get_mode
(
lock
)
==
LOCK_X
);
||
lock_get_mode
(
lock
)
==
LOCK_X
);
lock
->
trx
->
n_tables_locked
++
;
}
}
if
(
lock_print_waits
)
{
if
(
lock_print_waits
)
{
...
@@ -3203,6 +3202,10 @@ lock_table_create(
...
@@ -3203,6 +3202,10 @@ lock_table_create(
lock
->
type_mode
=
type_mode
|
LOCK_TABLE
;
lock
->
type_mode
=
type_mode
|
LOCK_TABLE
;
lock
->
trx
=
trx
;
lock
->
trx
=
trx
;
if
(
lock_get_type
(
lock
)
==
LOCK_TABLE_EXP
)
{
lock
->
trx
->
n_lock_table_exp
++
;
}
lock
->
un_member
.
tab_lock
.
table
=
table
;
lock
->
un_member
.
tab_lock
.
table
=
table
;
UT_LIST_ADD_LAST
(
un_member
.
tab_lock
.
locks
,
table
->
locks
,
lock
);
UT_LIST_ADD_LAST
(
un_member
.
tab_lock
.
locks
,
table
->
locks
,
lock
);
...
@@ -3239,6 +3242,10 @@ lock_table_remove_low(
...
@@ -3239,6 +3242,10 @@ lock_table_remove_low(
trx
->
auto_inc_lock
=
NULL
;
trx
->
auto_inc_lock
=
NULL
;
}
}
if
(
lock_get_type
(
lock
)
==
LOCK_TABLE_EXP
)
{
lock
->
trx
->
n_lock_table_exp
--
;
}
UT_LIST_REMOVE
(
trx_locks
,
trx
->
trx_locks
,
lock
);
UT_LIST_REMOVE
(
trx_locks
,
trx
->
trx_locks
,
lock
);
UT_LIST_REMOVE
(
un_member
.
tab_lock
.
locks
,
table
->
locks
,
lock
);
UT_LIST_REMOVE
(
un_member
.
tab_lock
.
locks
,
table
->
locks
,
lock
);
}
}
...
@@ -3386,7 +3393,7 @@ lock_table(
...
@@ -3386,7 +3393,7 @@ lock_table(
return
(
DB_SUCCESS
);
return
(
DB_SUCCESS
);
}
}
ut_a
d
(
flags
==
0
||
flags
==
LOCK_TABLE_EXP
);
ut_a
(
flags
==
0
||
flags
==
LOCK_TABLE_EXP
);
trx
=
thr_get_trx
(
thr
);
trx
=
thr_get_trx
(
thr
);
...
@@ -3418,10 +3425,7 @@ lock_table(
...
@@ -3418,10 +3425,7 @@ lock_table(
lock_table_create
(
table
,
mode
|
flags
,
trx
);
lock_table_create
(
table
,
mode
|
flags
,
trx
);
if
(
flags
)
{
ut_a
(
!
flags
||
mode
==
LOCK_S
||
mode
==
LOCK_X
);
ut_ad
(
mode
==
LOCK_S
||
mode
==
LOCK_X
);
trx
->
n_tables_locked
++
;
}
lock_mutex_exit_kernel
();
lock_mutex_exit_kernel
();
...
@@ -3502,7 +3506,7 @@ lock_table_dequeue(
...
@@ -3502,7 +3506,7 @@ lock_table_dequeue(
#ifdef UNIV_SYNC_DEBUG
#ifdef UNIV_SYNC_DEBUG
ut_ad
(
mutex_own
(
&
kernel_mutex
));
ut_ad
(
mutex_own
(
&
kernel_mutex
));
#endif
/* UNIV_SYNC_DEBUG */
#endif
/* UNIV_SYNC_DEBUG */
ut_a
d
(
lock_get_type
(
in_lock
)
==
LOCK_TABLE
||
ut_a
(
lock_get_type
(
in_lock
)
==
LOCK_TABLE
||
lock_get_type
(
in_lock
)
==
LOCK_TABLE_EXP
);
lock_get_type
(
in_lock
)
==
LOCK_TABLE_EXP
);
lock
=
UT_LIST_GET_NEXT
(
un_member
.
tab_lock
.
locks
,
in_lock
);
lock
=
UT_LIST_GET_NEXT
(
un_member
.
tab_lock
.
locks
,
in_lock
);
...
@@ -3608,9 +3612,8 @@ lock_release_off_kernel(
...
@@ -3608,9 +3612,8 @@ lock_release_off_kernel(
lock_table_dequeue
(
lock
);
lock_table_dequeue
(
lock
);
if
(
lock_get_type
(
lock
)
==
LOCK_TABLE_EXP
)
{
if
(
lock_get_type
(
lock
)
==
LOCK_TABLE_EXP
)
{
ut_a
d
(
lock_get_mode
(
lock
)
==
LOCK_S
ut_a
(
lock_get_mode
(
lock
)
==
LOCK_S
||
lock_get_mode
(
lock
)
==
LOCK_X
);
||
lock_get_mode
(
lock
)
==
LOCK_X
);
trx
->
n_tables_locked
--
;
}
}
}
}
...
@@ -3631,11 +3634,12 @@ lock_release_off_kernel(
...
@@ -3631,11 +3634,12 @@ lock_release_off_kernel(
mem_heap_empty
(
trx
->
lock_heap
);
mem_heap_empty
(
trx
->
lock_heap
);
ut_a
(
trx
->
auto_inc_lock
==
NULL
);
ut_a
(
trx
->
auto_inc_lock
==
NULL
);
ut_a
(
trx
->
n_
tables_locked
==
0
);
ut_a
(
trx
->
n_
lock_table_exp
==
0
);
}
}
/*************************************************************************
/*************************************************************************
Releases table locks, and releases possible other transactions waiting
Releases table locks explicitly requested with LOCK TABLES (indicated by
lock type LOCK_TABLE_EXP), and releases possible other transactions waiting
because of these locks. */
because of these locks. */
void
void
...
@@ -3660,7 +3664,7 @@ lock_release_tables_off_kernel(
...
@@ -3660,7 +3664,7 @@ lock_release_tables_off_kernel(
count
++
;
count
++
;
if
(
lock_get_type
(
lock
)
==
LOCK_TABLE_EXP
)
{
if
(
lock_get_type
(
lock
)
==
LOCK_TABLE_EXP
)
{
ut_a
d
(
lock_get_mode
(
lock
)
==
LOCK_S
ut_a
(
lock_get_mode
(
lock
)
==
LOCK_S
||
lock_get_mode
(
lock
)
==
LOCK_X
);
||
lock_get_mode
(
lock
)
==
LOCK_X
);
if
(
trx
->
insert_undo
||
trx
->
update_undo
)
{
if
(
trx
->
insert_undo
||
trx
->
update_undo
)
{
...
@@ -3676,7 +3680,7 @@ lock_release_tables_off_kernel(
...
@@ -3676,7 +3680,7 @@ lock_release_tables_off_kernel(
}
}
lock_table_dequeue
(
lock
);
lock_table_dequeue
(
lock
);
trx
->
n_tables_locked
--
;
lock
=
UT_LIST_GET_LAST
(
trx
->
trx_locks
);
lock
=
UT_LIST_GET_LAST
(
trx
->
trx_locks
);
continue
;
continue
;
}
}
...
@@ -3695,9 +3699,7 @@ lock_release_tables_off_kernel(
...
@@ -3695,9 +3699,7 @@ lock_release_tables_off_kernel(
lock
=
UT_LIST_GET_PREV
(
trx_locks
,
lock
);
lock
=
UT_LIST_GET_PREV
(
trx_locks
,
lock
);
}
}
mem_heap_empty
(
trx
->
lock_heap
);
ut_a
(
trx
->
n_lock_table_exp
==
0
);
ut_a
(
trx
->
n_tables_locked
==
0
);
}
}
/*************************************************************************
/*************************************************************************
...
...
innobase/row/row0ins.c
View file @
1f0cd873
...
@@ -370,6 +370,32 @@ row_ins_cascade_ancestor_updates_table(
...
@@ -370,6 +370,32 @@ row_ins_cascade_ancestor_updates_table(
return
(
FALSE
);
return
(
FALSE
);
}
}
/*************************************************************************
Returns the number of ancestor UPDATE or DELETE nodes of a
cascaded update/delete node. */
static
ulint
row_ins_cascade_n_ancestors
(
/*========================*/
/* out: number of ancestors */
que_node_t
*
node
)
/* in: node in a query graph */
{
que_node_t
*
parent
;
ulint
n_ancestors
=
0
;
parent
=
que_node_get_parent
(
node
);
while
(
que_node_get_type
(
parent
)
==
QUE_NODE_UPDATE
)
{
n_ancestors
++
;
parent
=
que_node_get_parent
(
parent
);
ut_a
(
parent
);
}
return
(
n_ancestors
);
}
/**********************************************************************
/**********************************************************************
Calculates the update vector node->cascade->update for a child table in
Calculates the update vector node->cascade->update for a child table in
a cascaded update. */
a cascaded update. */
...
@@ -615,6 +641,34 @@ row_ins_foreign_report_add_err(
...
@@ -615,6 +641,34 @@ row_ins_foreign_report_add_err(
mutex_exit
(
&
dict_foreign_err_mutex
);
mutex_exit
(
&
dict_foreign_err_mutex
);
}
}
/*************************************************************************
Invalidate the query cache for the given table. */
static
void
row_ins_invalidate_query_cache
(
/*===========================*/
que_thr_t
*
thr
,
/* in: query thread whose run_node
is an update node */
const
char
*
name
)
/* in: table name prefixed with
database name and a '/' character */
{
char
*
buf
;
char
*
ptr
;
ulint
len
=
strlen
(
name
)
+
1
;
buf
=
mem_strdupl
(
name
,
len
);
ptr
=
strchr
(
buf
,
'/'
);
ut_a
(
ptr
);
*
ptr
=
'\0'
;
/* We call a function in ha_innodb.cc */
#ifndef UNIV_HOTBACKUP
innobase_invalidate_query_cache
(
thr_get_trx
(
thr
),
buf
,
len
);
#endif
mem_free
(
buf
);
}
/*************************************************************************
/*************************************************************************
Perform referential actions or checks when a parent row is deleted or updated
Perform referential actions or checks when a parent row is deleted or updated
and the constraint had an ON DELETE or ON UPDATE condition which was not
and the constraint had an ON DELETE or ON UPDATE condition which was not
...
@@ -650,26 +704,15 @@ row_ins_foreign_check_on_constraint(
...
@@ -650,26 +704,15 @@ row_ins_foreign_check_on_constraint(
ulint
n_to_update
;
ulint
n_to_update
;
ulint
err
;
ulint
err
;
ulint
i
;
ulint
i
;
char
*
ptr
;
char
*
table_name_buf
;
ut_a
(
thr
&&
foreign
&&
pcur
&&
mtr
);
ut_a
(
thr
&&
foreign
&&
pcur
&&
mtr
);
/* Since we are going to delete or update a row, we have to invalidate
/* Since we are going to delete or update a row, we have to invalidate
the MySQL query cache for table */
the MySQL query cache for table */
table_name_buf
=
mem_strdup
(
table
->
name
);
row_ins_invalidate_query_cache
(
thr
,
table
->
name
);
ptr
=
strchr
(
table_name_buf
,
'/'
);
ut_a
(
ptr
);
*
ptr
=
'\0'
;
#ifndef UNIV_HOTBACKUP
/* We call a function in ha_innodb.cc */
innobase_invalidate_query_cache
(
thr_get_trx
(
thr
),
table_name_buf
,
strlen
(
table
->
name
)
+
1
);
#endif
mem_free
(
table_name_buf
);
node
=
thr
->
run_node
;
node
=
thr
->
run_node
;
...
@@ -757,6 +800,16 @@ row_ins_foreign_check_on_constraint(
...
@@ -757,6 +800,16 @@ row_ins_foreign_check_on_constraint(
goto
nonstandard_exit_func
;
goto
nonstandard_exit_func
;
}
}
if
(
row_ins_cascade_n_ancestors
(
cascade
)
>=
15
)
{
err
=
DB_ROW_IS_REFERENCED
;
row_ins_foreign_report_err
(
(
char
*
)
"Trying a too deep cascaded delete or update
\n
"
,
thr
,
foreign
,
btr_pcur_get_rec
(
pcur
),
entry
);
goto
nonstandard_exit_func
;
}
index
=
btr_pcur_get_btr_cur
(
pcur
)
->
index
;
index
=
btr_pcur_get_btr_cur
(
pcur
)
->
index
;
ut_a
(
index
==
foreign
->
foreign_index
);
ut_a
(
index
==
foreign
->
foreign_index
);
...
...
innobase/row/row0mysql.c
View file @
1f0cd873
...
@@ -741,14 +741,15 @@ run_again:
...
@@ -741,14 +741,15 @@ run_again:
}
}
/*************************************************************************
/*************************************************************************
Unlocks a table lock possibly reserved by trx. */
Unlocks all table locks explicitly requested by trx (with LOCK TABLES,
lock type LOCK_TABLE_EXP). */
void
void
row_unlock_table_for_mysql
(
row_unlock_table
s
_for_mysql
(
/*=======================*/
/*=======================
=
*/
trx_t
*
trx
)
/* in: transaction */
trx_t
*
trx
)
/* in: transaction */
{
{
if
(
!
trx
->
n_
tables_locked
)
{
if
(
!
trx
->
n_
lock_table_exp
)
{
return
;
return
;
}
}
...
@@ -3176,6 +3177,11 @@ row_check_table_for_mysql(
...
@@ -3176,6 +3177,11 @@ row_check_table_for_mysql(
prebuilt
->
trx
->
isolation_level
=
TRX_ISO_REPEATABLE_READ
;
prebuilt
->
trx
->
isolation_level
=
TRX_ISO_REPEATABLE_READ
;
/* Enlarge the fatal lock wait timeout during CHECK TABLE. */
mutex_enter
(
&
kernel_mutex
);
srv_fatal_semaphore_wait_threshold
+=
7200
;
/* 2 hours */
mutex_exit
(
&
kernel_mutex
);
index
=
dict_table_get_first_index
(
table
);
index
=
dict_table_get_first_index
(
table
);
while
(
index
!=
NULL
)
{
while
(
index
!=
NULL
)
{
...
@@ -3223,6 +3229,11 @@ row_check_table_for_mysql(
...
@@ -3223,6 +3229,11 @@ row_check_table_for_mysql(
ret
=
DB_ERROR
;
ret
=
DB_ERROR
;
}
}
/* Restore the fatal lock wait timeout after CHECK TABLE. */
mutex_enter
(
&
kernel_mutex
);
srv_fatal_semaphore_wait_threshold
-=
7200
;
/* 2 hours */
mutex_exit
(
&
kernel_mutex
);
prebuilt
->
trx
->
op_info
=
""
;
prebuilt
->
trx
->
op_info
=
""
;
return
(
ret
);
return
(
ret
);
...
...
innobase/srv/srv0srv.c
View file @
1f0cd873
...
@@ -55,6 +55,9 @@ ibool srv_lower_case_table_names = FALSE;
...
@@ -55,6 +55,9 @@ ibool srv_lower_case_table_names = FALSE;
in the server */
in the server */
ulint
srv_activity_count
=
0
;
ulint
srv_activity_count
=
0
;
/* The following is the maximum allowed duration of a lock wait. */
ulint
srv_fatal_semaphore_wait_threshold
=
600
;
ibool
srv_lock_timeout_and_monitor_active
=
FALSE
;
ibool
srv_lock_timeout_and_monitor_active
=
FALSE
;
ibool
srv_error_monitor_active
=
FALSE
;
ibool
srv_error_monitor_active
=
FALSE
;
...
...
innobase/srv/srv0start.c
View file @
1f0cd873
...
@@ -1115,7 +1115,7 @@ NetWare. */
...
@@ -1115,7 +1115,7 @@ NetWare. */
srv_monitor_file_name
=
mem_alloc
(
srv_monitor_file_name
=
mem_alloc
(
strlen
(
fil_path_to_mysql_datadir
)
+
strlen
(
fil_path_to_mysql_datadir
)
+
20
+
sizeof
"/innodb_status."
);
20
+
sizeof
"/innodb_status."
);
sprintf
(
srv_monitor_file_name
,
"%s/innodb
.
status.%lu"
,
sprintf
(
srv_monitor_file_name
,
"%s/innodb
_
status.%lu"
,
fil_path_to_mysql_datadir
,
os_proc_get_number
());
fil_path_to_mysql_datadir
,
os_proc_get_number
());
srv_monitor_file
=
fopen
(
srv_monitor_file_name
,
"w+"
);
srv_monitor_file
=
fopen
(
srv_monitor_file_name
,
"w+"
);
if
(
!
srv_monitor_file
)
{
if
(
!
srv_monitor_file
)
{
...
...
innobase/sync/sync0arr.c
View file @
1f0cd873
...
@@ -895,7 +895,7 @@ sync_arr_wake_threads_if_sema_free(void)
...
@@ -895,7 +895,7 @@ sync_arr_wake_threads_if_sema_free(void)
}
}
/**************************************************************************
/**************************************************************************
Prints warnings of long semaphore waits to stderr.
Currently > 120 sec.
*/
Prints warnings of long semaphore waits to stderr. */
void
void
sync_array_print_long_waits
(
void
)
sync_array_print_long_waits
(
void
)
...
@@ -905,6 +905,7 @@ sync_array_print_long_waits(void)
...
@@ -905,6 +905,7 @@ sync_array_print_long_waits(void)
ibool
old_val
;
ibool
old_val
;
ibool
noticed
=
FALSE
;
ibool
noticed
=
FALSE
;
ulint
i
;
ulint
i
;
ulint
fatal_timeout
=
srv_fatal_semaphore_wait_threshold
;
for
(
i
=
0
;
i
<
sync_primary_wait_array
->
n_cells
;
i
++
)
{
for
(
i
=
0
;
i
<
sync_primary_wait_array
->
n_cells
;
i
++
)
{
...
@@ -919,12 +920,13 @@ sync_array_print_long_waits(void)
...
@@ -919,12 +920,13 @@ sync_array_print_long_waits(void)
}
}
if
(
cell
->
wait_object
!=
NULL
if
(
cell
->
wait_object
!=
NULL
&&
difftime
(
time
(
NULL
),
cell
->
reservation_time
)
>
600
)
{
&&
difftime
(
time
(
NULL
),
cell
->
reservation_time
)
>
fatal_timeout
)
{
fp
uts
(
fp
rintf
(
stderr
,
"InnoDB: Error: semaphore wait has lasted >
600
seconds
\n
"
"InnoDB: Error: semaphore wait has lasted >
%lu
seconds
\n
"
"InnoDB: We intentionally crash the server, because it appears to be hung.
\n
"
,
"InnoDB: We intentionally crash the server, because it appears to be hung.
\n
"
,
stderr
);
fatal_timeout
);
ut_error
;
ut_error
;
}
}
...
...
innobase/trx/trx0trx.c
View file @
1f0cd873
...
@@ -151,7 +151,7 @@ trx_create(
...
@@ -151,7 +151,7 @@ trx_create(
trx
->
n_tickets_to_enter_innodb
=
0
;
trx
->
n_tickets_to_enter_innodb
=
0
;
trx
->
auto_inc_lock
=
NULL
;
trx
->
auto_inc_lock
=
NULL
;
trx
->
n_
tables_locked
=
0
;
trx
->
n_
lock_table_exp
=
0
;
trx
->
read_view_heap
=
mem_heap_create
(
256
);
trx
->
read_view_heap
=
mem_heap_create
(
256
);
trx
->
read_view
=
NULL
;
trx
->
read_view
=
NULL
;
...
@@ -279,7 +279,7 @@ trx_free(
...
@@ -279,7 +279,7 @@ trx_free(
ut_a
(
!
trx
->
has_search_latch
);
ut_a
(
!
trx
->
has_search_latch
);
ut_a
(
!
trx
->
auto_inc_lock
);
ut_a
(
!
trx
->
auto_inc_lock
);
ut_a
(
!
trx
->
n_
tables_locked
);
ut_a
(
!
trx
->
n_
lock_table_exp
);
ut_a
(
trx
->
dict_operation_lock_mode
==
0
);
ut_a
(
trx
->
dict_operation_lock_mode
==
0
);
...
...
mysql-test/r/create_select_tmp.result
0 → 100644
View file @
1f0cd873
drop table if exists t1, t2;
CREATE TABLE t1 ( a int );
INSERT INTO t1 VALUES (1),(2),(1);
CREATE TABLE t2 ( PRIMARY KEY (a) ) TYPE=INNODB SELECT a FROM t1;
Duplicate entry '1' for key 1
select * from t2;
Table 'test.t2' doesn't exist
CREATE TEMPORARY TABLE t2 ( PRIMARY KEY (a) ) TYPE=INNODB SELECT a FROM t1;
Duplicate entry '1' for key 1
select * from t2;
Table 'test.t2' doesn't exist
CREATE TABLE t2 ( PRIMARY KEY (a) ) TYPE=MYISAM SELECT a FROM t1;
Duplicate entry '1' for key 1
select * from t2;
Table 'test.t2' doesn't exist
CREATE TEMPORARY TABLE t2 ( PRIMARY KEY (a) ) TYPE=MYISAM SELECT a FROM t1;
Duplicate entry '1' for key 1
select * from t2;
Table 'test.t2' doesn't exist
mysql-test/r/rpl_drop.result
0 → 100644
View file @
1f0cd873
slave stop;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
slave start;
drop table if exists t1, t2;
create table t1 (a int);
drop table t1, t2;
Unknown table 't2'
mysql-test/t/create_select_tmp.test
0 → 100644
View file @
1f0cd873
# Testcase for BUG#4551
# The bug was that when the table was TEMPORARY, it was not deleted if
# the CREATE SELECT failed (the code intended too, but it actually
# didn't). And as the CREATE TEMPORARY TABLE was not written to the
# binlog if it was a transactional table, it resulted in an
# inconsistency between binlog and the internal list of temp tables.
--
source
include
/
have_innodb
.
inc
drop
table
if
exists
t1
,
t2
;
CREATE
TABLE
t1
(
a
int
);
INSERT
INTO
t1
VALUES
(
1
),(
2
),(
1
);
--
error
1062
;
CREATE
TABLE
t2
(
PRIMARY
KEY
(
a
)
)
TYPE
=
INNODB
SELECT
a
FROM
t1
;
--
error
1146
;
select
*
from
t2
;
--
error
1062
;
CREATE
TEMPORARY
TABLE
t2
(
PRIMARY
KEY
(
a
)
)
TYPE
=
INNODB
SELECT
a
FROM
t1
;
--
error
1146
;
select
*
from
t2
;
--
error
1062
;
CREATE
TABLE
t2
(
PRIMARY
KEY
(
a
)
)
TYPE
=
MYISAM
SELECT
a
FROM
t1
;
--
error
1146
;
select
*
from
t2
;
--
error
1062
;
CREATE
TEMPORARY
TABLE
t2
(
PRIMARY
KEY
(
a
)
)
TYPE
=
MYISAM
SELECT
a
FROM
t1
;
--
error
1146
;
select
*
from
t2
;
mysql-test/t/innodb.test
View file @
1f0cd873
...
@@ -959,6 +959,23 @@ update t1,t2,t3 set t3.id=5, t2.id=6, t1.id=7 where t1.id =1 and t2.id = t1.id
...
@@ -959,6 +959,23 @@ update t1,t2,t3 set t3.id=5, t2.id=6, t1.id=7 where t1.id =1 and t2.id = t1.id
update
t3
set
t3
.
id
=
7
where
t1
.
id
=
1
and
t2
.
id
=
t1
.
id
and
t3
.
id
=
t2
.
id
;
update
t3
set
t3
.
id
=
7
where
t1
.
id
=
1
and
t2
.
id
=
t1
.
id
and
t3
.
id
=
t2
.
id
;
drop
table
t3
,
t2
,
t1
;
drop
table
t3
,
t2
,
t1
;
#
# test for recursion depth limit
#
create
table
t1
(
id
int
primary
key
,
pid
int
,
index
(
pid
),
foreign
key
(
pid
)
references
t1
(
id
)
on
delete
cascade
)
engine
=
innodb
;
insert
into
t1
values
(
0
,
0
),(
1
,
0
),(
2
,
1
),(
3
,
2
),(
4
,
3
),(
5
,
4
),(
6
,
5
),(
7
,
6
),
(
8
,
7
),(
9
,
8
),(
10
,
9
),(
11
,
10
),(
12
,
11
),(
13
,
12
),(
14
,
13
),(
15
,
14
);
--
error
1217
delete
from
t1
where
id
=
0
;
delete
from
t1
where
id
=
15
;
delete
from
t1
where
id
=
0
;
drop
table
t1
;
#
#
# Test timestamps
# Test timestamps
#
#
...
...
mysql-test/t/rpl_drop.test
0 → 100644
View file @
1f0cd873
# Testcase for BUG#4552 (DROP on two tables, one of which does not
# exist, must be binlogged with a non-zero error code)
source
include
/
master
-
slave
.
inc
;
drop
table
if
exists
t1
,
t2
;
create
table
t1
(
a
int
);
--
error
1051
;
drop
table
t1
,
t2
;
save_master_pos
;
connection
slave
;
sync_with_master
;
sql/ha_innodb.cc
View file @
1f0cd873
...
@@ -4783,8 +4783,8 @@ ha_innobase::external_lock(
...
@@ -4783,8 +4783,8 @@ ha_innobase::external_lock(
trx
->
n_mysql_tables_in_use
--
;
trx
->
n_mysql_tables_in_use
--
;
prebuilt
->
mysql_has_locked
=
FALSE
;
prebuilt
->
mysql_has_locked
=
FALSE
;
auto_inc_counter_for_this_stat
=
0
;
auto_inc_counter_for_this_stat
=
0
;
if
(
trx
->
n_
tables_locked
)
{
if
(
trx
->
n_
lock_table_exp
)
{
row_unlock_table_for_mysql
(
trx
);
row_unlock_table
s
_for_mysql
(
trx
);
}
}
/* If the MySQL lock count drops to zero we know that the current SQL
/* If the MySQL lock count drops to zero we know that the current SQL
...
...
sql/sql_insert.cc
View file @
1f0cd873
...
@@ -1696,9 +1696,13 @@ void select_create::abort()
...
@@ -1696,9 +1696,13 @@ void select_create::abort()
table
->
file
->
extra
(
HA_EXTRA_NO_IGNORE_DUP_KEY
);
table
->
file
->
extra
(
HA_EXTRA_NO_IGNORE_DUP_KEY
);
enum
db_type
table_type
=
table
->
db_type
;
enum
db_type
table_type
=
table
->
db_type
;
if
(
!
table
->
tmp_table
)
if
(
!
table
->
tmp_table
)
{
hash_delete
(
&
open_cache
,(
byte
*
)
table
);
hash_delete
(
&
open_cache
,(
byte
*
)
table
);
if
(
!
create_info
->
table_existed
)
if
(
!
create_info
->
table_existed
)
quick_rm_table
(
table_type
,
db
,
name
);
quick_rm_table
(
table_type
,
db
,
name
);
}
else
if
(
!
create_info
->
table_existed
)
close_temporary_table
(
thd
,
db
,
name
);
table
=
0
;
table
=
0
;
}
}
VOID
(
pthread_mutex_unlock
(
&
LOCK_open
));
VOID
(
pthread_mutex_unlock
(
&
LOCK_open
));
...
...
sql/sql_load.cc
View file @
1f0cd873
...
@@ -310,6 +310,11 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
...
@@ -310,6 +310,11 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
{
{
if
(
transactional_table
)
if
(
transactional_table
)
ha_autocommit_or_rollback
(
thd
,
error
);
ha_autocommit_or_rollback
(
thd
,
error
);
if
(
read_file_from_client
)
while
(
!
read_info
.
next_line
())
;
#ifndef EMBEDDED_LIBRARY
#ifndef EMBEDDED_LIBRARY
if
(
mysql_bin_log
.
is_open
())
if
(
mysql_bin_log
.
is_open
())
{
{
...
...
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