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
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
9b765549
Commit
9b765549
authored
Mar 01, 2007
by
marko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
branches/zip: Merge revisions 1271:1322 from trunk.
parent
d5028fac
Changes
9
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
313 additions
and
279 deletions
+313
-279
dict/dict0dict.c
dict/dict0dict.c
+22
-6
handler/ha_innodb.cc
handler/ha_innodb.cc
+221
-131
handler/ha_innodb.h
handler/ha_innodb.h
+0
-95
include/sync0sync.ic
include/sync0sync.ic
+13
-24
include/univ.i
include/univ.i
+10
-1
mysql-test/innodb.result
mysql-test/innodb.result
+9
-2
mysql-test/innodb.test
mysql-test/innodb.test
+30
-20
mysql-test/innodb_gis.result
mysql-test/innodb_gis.result
+2
-0
mysql-test/innodb_gis.test
mysql-test/innodb_gis.test
+6
-0
No files found.
dict/dict0dict.c
View file @
9b765549
...
...
@@ -1977,9 +1977,12 @@ dict_foreign_find_index(
ulint
n_cols
,
/* in: number of columns */
dict_index_t
*
types_idx
,
/* in: NULL or an index to whose types the
column types must match */
ibool
check_charsets
)
ibool
check_charsets
,
/* in: whether to check charsets.
only has an effect if types_idx != NULL */
ulint
check_null
)
/* in: nonzero if none of the columns must
be declared NOT NULL */
{
dict_index_t
*
index
;
dict_field_t
*
field
;
...
...
@@ -2009,6 +2012,12 @@ dict_foreign_find_index(
break
;
}
if
(
check_null
&&
(
field
->
col
->
prtype
&
DATA_NOT_NULL
))
{
return
(
NULL
);
}
if
(
types_idx
&&
!
cmp_cols_are_equal
(
dict_index_get_nth_col
(
index
,
i
),
dict_index_get_nth_col
(
types_idx
,
...
...
@@ -2125,7 +2134,7 @@ dict_foreign_add_to_cache(
ref_table
,
(
const
char
**
)
for_in_cache
->
referenced_col_names
,
for_in_cache
->
n_fields
,
for_in_cache
->
foreign_index
,
check_charsets
);
check_charsets
,
FALSE
);
if
(
index
==
NULL
)
{
dict_foreign_error_report
(
...
...
@@ -2157,7 +2166,10 @@ dict_foreign_add_to_cache(
for_table
,
(
const
char
**
)
for_in_cache
->
foreign_col_names
,
for_in_cache
->
n_fields
,
for_in_cache
->
referenced_index
,
check_charsets
);
for_in_cache
->
referenced_index
,
check_charsets
,
for_in_cache
->
type
&
(
DICT_FOREIGN_ON_DELETE_SET_NULL
|
DICT_FOREIGN_ON_UPDATE_SET_NULL
));
if
(
index
==
NULL
)
{
dict_foreign_error_report
(
...
...
@@ -2167,7 +2179,9 @@ dict_foreign_add_to_cache(
"the columns as the first columns,"
" or the data types in the
\n
"
"table do not match"
" the ones in the referenced table."
);
" the ones in the referenced table
\n
"
"or one of the ON ... SET NULL columns"
" is declared NOT NULL."
);
if
(
for_in_cache
==
foreign
)
{
if
(
added_to_referenced_list
)
{
...
...
@@ -2973,7 +2987,8 @@ dict_create_foreign_constraints_low(
/* Try to find an index which contains the columns
as the first fields and in the right order */
index
=
dict_foreign_find_index
(
table
,
column_names
,
i
,
NULL
,
TRUE
);
index
=
dict_foreign_find_index
(
table
,
column_names
,
i
,
NULL
,
TRUE
,
FALSE
);
if
(
!
index
)
{
mutex_enter
(
&
dict_foreign_err_mutex
);
...
...
@@ -3244,7 +3259,8 @@ dict_create_foreign_constraints_low(
if
(
referenced_table
)
{
index
=
dict_foreign_find_index
(
referenced_table
,
column_names
,
i
,
foreign
->
foreign_index
,
TRUE
);
foreign
->
foreign_index
,
TRUE
,
FALSE
);
if
(
!
index
)
{
dict_foreign_free
(
foreign
);
mutex_enter
(
&
dict_foreign_err_mutex
);
...
...
handler/ha_innodb.cc
View file @
9b765549
This diff is collapsed.
Click to expand it.
handler/ha_innodb.h
View file @
9b765549
...
...
@@ -238,11 +238,6 @@ extern ulong srv_commit_concurrency;
extern
ulong
srv_flush_log_at_trx_commit
;
}
int
innobase_init
(
void
);
int
innobase_end
(
handlerton
*
hton
,
ha_panic_function
type
);
bool
innobase_flush_logs
(
handlerton
*
hton
);
uint
innobase_get_free_space
(
void
);
/*
don't delete it - it may be re-enabled later
as an optimization for the most common case InnoDB+binlog
...
...
@@ -256,93 +251,3 @@ int innobase_report_binlog_offset_and_commit(
int innobase_commit_complete(void* trx_handle);
void innobase_store_binlog_offset_and_flush_log(char *binlog_name,longlong offset);
#endif
void
innobase_drop_database
(
handlerton
*
hton
,
char
*
path
);
bool
innobase_show_status
(
handlerton
*
hton
,
THD
*
thd
,
stat_print_fn
*
,
enum
ha_stat_type
);
int
innobase_release_temporary_latches
(
handlerton
*
hton
,
THD
*
thd
);
void
innobase_store_binlog_offset_and_flush_log
(
handlerton
*
hton
,
char
*
binlog_name
,
longlong
offset
);
int
innobase_start_trx_and_assign_read_view
(
handlerton
*
hton
,
THD
*
thd
);
/***********************************************************************
This function is used to prepare X/Open XA distributed transaction */
int
innobase_xa_prepare
(
/*====================*/
/* out: 0 or error number */
handlerton
*
hton
,
/* in: innobase hton */
THD
*
thd
,
/* in: handle to the MySQL thread of the user
whose XA transaction should be prepared */
bool
all
);
/* in: TRUE - commit transaction
FALSE - the current SQL statement ended */
/***********************************************************************
This function is used to recover X/Open XA distributed transactions */
int
innobase_xa_recover
(
/*====================*/
/* out: number of prepared transactions
stored in xid_list */
handlerton
*
hton
,
/* in: innobase hton */
XID
*
xid_list
,
/* in/out: prepared transactions */
uint
len
);
/* in: number of slots in xid_list */
/***********************************************************************
This function is used to commit one X/Open XA distributed transaction
which is in the prepared state */
int
innobase_commit_by_xid
(
/*=======================*/
/* out: 0 or error number */
handlerton
*
hton
,
/* in: innobase hton */
XID
*
xid
);
/* in : X/Open XA Transaction Identification */
/***********************************************************************
This function is used to rollback one X/Open XA distributed transaction
which is in the prepared state */
int
innobase_rollback_by_xid
(
/* out: 0 or error number */
handlerton
*
hton
,
/* in: innobase hton */
XID
*
xid
);
/* in : X/Open XA Transaction Identification */
/***********************************************************************
Create a consistent view for a cursor based on current transaction
which is created if the corresponding MySQL thread still lacks one.
This consistent view is then used inside of MySQL when accessing records
using a cursor. */
void
*
innobase_create_cursor_view
(
/* 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
global read view to a transaction read view. Transaction is created if the
corresponding MySQL thread still lacks one. */
void
innobase_close_cursor_view
(
/*=======================*/
handlerton
*
hton
,
/* in: innobase hton */
THD
*
thd
,
/* in: user thread handle */
void
*
curview
);
/* in: Consistent read view to be closed */
/***********************************************************************
Set the given consistent cursor view to a transaction which is created
if the corresponding MySQL thread still lacks one. If the given
consistent cursor view is NULL global read view of a transaction is
restored to a transaction read view. */
void
innobase_set_cursor_view
(
/*=====================*/
handlerton
*
hton
,
/* in: innobase hton */
THD
*
thd
,
/* in: user thread handle */
void
*
curview
);
/* in: Consistent read view to be set */
include/sync0sync.ic
View file @
9b765549
...
...
@@ -6,6 +6,16 @@ Mutex, the basic synchronization primitive
Created 9/5/1995 Heikki Tuuri
*******************************************************/
#if defined(not_defined) && defined(__GNUC__) && defined(UNIV_INTEL_X86)
/* %z0: Use the size of operand %0 which in our case is *m to determine
instruction size, it should end up as xchgl. "1" in the input constraint,
says that "in" has to go in the same place as "out".*/
#define TAS(m, in, out) \
asm volatile ("xchg%z0 %2, %0" \
: "=g" (*(m)), "=r" (out) \
: "1" (in)) /* Note: "1" here refers to "=r" (out) */
#endif
/**********************************************************************
Sets the waiters field in a mutex. */
...
...
@@ -89,20 +99,10 @@ mutex_test_and_set(
return(res);
#elif defined(not_defined) && defined(__GNUC__) && defined(UNIV_INTEL_X86)
ulint* lw;
ulint res;
lw = &(mutex->lock_word);
/* In assembly we use the so-called AT & T syntax where
the order of operands is inverted compared to the ordinary Intel
syntax. The 'l' after the mnemonics denotes a 32-bit operation.
The line after the code tells which values come out of the asm
code, and the second line tells the input to the asm code. */
TAS(&mutex->lock_word, 1, res);
asm volatile("movl $1, %%eax; xchgl (%%ecx), %%eax" :
"=eax" (res), "=m" (*lw) :
"ecx" (lw));
return(res);
#else
ibool ret;
...
...
@@ -141,20 +141,9 @@ mutex_reset_lock_word(
__asm MOV ECX, lw
__asm XCHG EDX, DWORD PTR [ECX]
#elif defined(not_defined) && defined(__GNUC__) && defined(UNIV_INTEL_X86)
ulint* lw;
lw = &(mutex->lock_word);
/* In assembly we use the so-called AT & T syntax where
the order of operands is inverted compared to the ordinary Intel
syntax. The 'l' after the mnemonics denotes a 32-bit operation. */
ulint res;
asm volatile("movl $0, %%eax; xchgl (%%ecx), %%eax" :
"=m" (*lw) :
"ecx" (lw) :
"eax"); /* gcc does not seem to understand
that our asm code resets eax: tell it
explicitly that after the third ':' */
TAS(&mutex->lock_word, 0, res);
#else
mutex->lock_word = 0;
...
...
include/univ.i
View file @
9b765549
...
...
@@ -43,12 +43,21 @@ if we are compiling on Windows. */
#
undef
VERSION
/* Include the header file generated by GNU autoconf */
#
include
"config.h"
#
ifndef
__WIN__
#
include
"config.h"
#
endif
#
ifdef
HAVE_SCHED_H
#
include
<
sched
.
h
>
#
endif
/* When compiling for Itanium IA64, undefine the flag below to prevent use
of the 32-bit x86 assembler in mutex operations. */
#
if
defined
(
__WIN__
)
&
&
!defined(WIN64)
&
&
!defined(_WIN64)
#
define
UNIV_CAN_USE_X86_ASSEMBLER
#
endif
/* We only try to do explicit inlining of functions with gcc and
Microsoft Visual C++ */
...
...
mysql-test/innodb.result
View file @
9b765549
...
...
@@ -3447,8 +3447,6 @@ SELECT p0.a FROM t2 p0 WHERE BINARY p0.b = 'customer_over';
a
1
drop table t2, t1;
create table t1 (g geometry not null, spatial gk(g)) engine=innodb;
ERROR HY000: The used table type doesn't support SPATIAL indexes
CREATE TABLE t1 ( a int ) ENGINE=innodb;
BEGIN;
INSERT INTO t1 VALUES (1);
...
...
@@ -3473,3 +3471,12 @@ t2 CREATE TABLE `t2` (
CONSTRAINT `t2_t1` FOREIGN KEY (`id`) REFERENCES `t1` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
)
ENGINE=InnoDB DEFAULT CHARSET=latin1
DROP TABLE t2, t1;
CREATE TABLE t1 (a INT, INDEX(a)) ENGINE=InnoDB;
CREATE TABLE t2 (a INT, INDEX(a)) ENGINE=InnoDB;
INSERT INTO t1 VALUES (1);
INSERT INTO t2 VALUES (1);
ALTER TABLE t2 ADD FOREIGN KEY (a) REFERENCES t1 (a) ON DELETE SET NULL;
ALTER TABLE t2 MODIFY a INT NOT NULL;
ERROR HY000: Error on rename of '#sql-temporary' to './test/t2' (errno: 150)
DELETE FROM t1;
DROP TABLE t2,t1;
mysql-test/innodb.test
View file @
9b765549
...
...
@@ -52,7 +52,7 @@ INSERT INTO t1 VALUES (1,0,0),(3,1,1),(4,1,1),(8,2,2),(9,2,2),(17,3,2),(22,4,2),
update
t1
set
parent_id
=
parent_id
+
100
;
select
*
from
t1
where
parent_id
=
102
;
update
t1
set
id
=
id
+
1000
;
--
error
1062
,
1022
--
error
ER_DUP_ENTRY_WITH_KEY_NAME
,
1022
update
t1
set
id
=
1024
where
id
=
1009
;
select
*
from
t1
;
update
ignore
t1
set
id
=
id
+
1
;
# This will change all rows
...
...
@@ -133,13 +133,13 @@ commit;
select
n
,
"after commit"
from
t1
;
commit
;
insert
into
t1
values
(
5
);
--
error
1062
--
error
ER_DUP_ENTRY_WITH_KEY_NAME
insert
into
t1
values
(
4
);
commit
;
select
n
,
"after commit"
from
t1
;
set
autocommit
=
1
;
insert
into
t1
values
(
6
);
--
error
1062
--
error
ER_DUP_ENTRY_WITH_KEY_NAME
insert
into
t1
values
(
4
);
select
n
from
t1
;
set
autocommit
=
0
;
...
...
@@ -213,7 +213,7 @@ drop table t1;
CREATE
TABLE
t1
(
id
char
(
8
)
not
null
primary
key
,
val
int
not
null
)
engine
=
innodb
;
insert
into
t1
values
(
'pippo'
,
12
);
--
error
1062
--
error
ER_DUP_ENTRY_WITH_KEY_NAME
insert
into
t1
values
(
'pippo'
,
12
);
# Gives error
delete
from
t1
;
delete
from
t1
where
id
=
'pippo'
;
...
...
@@ -341,9 +341,9 @@ CREATE TABLE t1 (
insert
into
t1
(
ggid
,
passwd
)
values
(
'test1'
,
'xxx'
);
insert
into
t1
(
ggid
,
passwd
)
values
(
'test2'
,
'yyy'
);
--
error
1062
--
error
ER_DUP_ENTRY_WITH_KEY_NAME
insert
into
t1
(
ggid
,
passwd
)
values
(
'test2'
,
'this will fail'
);
--
error
1062
--
error
ER_DUP_ENTRY_WITH_KEY_NAME
insert
into
t1
(
ggid
,
id
)
values
(
'this will fail'
,
1
);
select
*
from
t1
where
ggid
=
'test1'
;
...
...
@@ -352,7 +352,7 @@ select * from t1 where id=2;
replace
into
t1
(
ggid
,
id
)
values
(
'this will work'
,
1
);
replace
into
t1
(
ggid
,
passwd
)
values
(
'test2'
,
'this will work'
);
--
error
1062
--
error
ER_DUP_ENTRY_WITH_KEY_NAME
update
t1
set
id
=
100
,
ggid
=
'test2'
where
id
=
1
;
select
*
from
t1
;
select
*
from
t1
where
id
=
1
;
...
...
@@ -523,7 +523,7 @@ drop table t1;
create
table
t1
(
id
int
NOT
NULL
,
id2
int
NOT
NULL
,
id3
int
NOT
NULL
,
dummy1
char
(
30
),
primary
key
(
id
,
id2
),
index
index_id3
(
id3
))
engine
=
innodb
;
insert
into
t1
values
(
0
,
0
,
0
,
'ABCDEFGHIJ'
),(
2
,
2
,
2
,
'BCDEFGHIJK'
),(
1
,
1
,
1
,
'CDEFGHIJKL'
);
LOCK
TABLES
t1
WRITE
;
--
error
1062
--
error
ER_DUP_ENTRY_WITH_KEY_NAME
insert
into
t1
values
(
99
,
1
,
2
,
'D'
),(
1
,
1
,
2
,
'D'
);
select
id
from
t1
;
select
id
from
t1
;
...
...
@@ -534,7 +534,7 @@ create table t1 (id int NOT NULL,id2 int NOT NULL,id3 int NOT NULL,dummy1 char(3
insert
into
t1
values
(
0
,
0
,
0
,
'ABCDEFGHIJ'
),(
2
,
2
,
2
,
'BCDEFGHIJK'
),(
1
,
1
,
1
,
'CDEFGHIJKL'
);
LOCK
TABLES
t1
WRITE
;
begin
;
--
error
1062
--
error
ER_DUP_ENTRY_WITH_KEY_NAME
insert
into
t1
values
(
99
,
1
,
2
,
'D'
),(
1
,
1
,
2
,
'D'
);
select
id
from
t1
;
insert
ignore
into
t1
values
(
100
,
1
,
2
,
'D'
),(
1
,
1
,
99
,
'D'
);
...
...
@@ -1407,7 +1407,7 @@ create table t1 (rowid int not null auto_increment, val int not null,primary
key
(
rowid
),
unique
(
val
))
engine
=
innodb
;
replace
into
t1
(
val
)
values
(
'1'
),(
'2'
);
replace
into
t1
(
val
)
values
(
'1'
),(
'2'
);
--
error
1062
--
error
ER_DUP_ENTRY_WITH_KEY_NAME
insert
into
t1
(
val
)
values
(
'1'
),(
'2'
);
select
*
from
t1
;
drop
table
t1
;
...
...
@@ -1420,7 +1420,7 @@ create table t1 (a int not null auto_increment primary key, val int) engine=Inno
insert
into
t1
(
val
)
values
(
1
);
update
t1
set
a
=
2
where
a
=
1
;
# We should get the following error because InnoDB does not update the counter
--
error
1062
--
error
ER_DUP_ENTRY_WITH_KEY_NAME
insert
into
t1
(
val
)
values
(
1
);
select
*
from
t1
;
drop
table
t1
;
...
...
@@ -1876,13 +1876,13 @@ create table t3 (s1 varchar(2) binary,primary key (s1)) engine=innodb;
create
table
t4
(
s1
char
(
2
)
binary
,
primary
key
(
s1
))
engine
=
innodb
;
insert
into
t1
values
(
0x41
),(
0x4120
),(
0x4100
);
--
error
1062
--
error
ER_DUP_ENTRY_WITH_KEY_NAME
insert
into
t2
values
(
0x41
),(
0x4120
),(
0x4100
);
insert
into
t2
values
(
0x41
),(
0x4120
);
--
error
1062
--
error
ER_DUP_ENTRY_WITH_KEY_NAME
insert
into
t3
values
(
0x41
),(
0x4120
),(
0x4100
);
insert
into
t3
values
(
0x41
),(
0x4100
);
--
error
1062
--
error
ER_DUP_ENTRY_WITH_KEY_NAME
insert
into
t4
values
(
0x41
),(
0x4120
),(
0x4100
);
insert
into
t4
values
(
0x41
),(
0x4100
);
select
hex
(
s1
)
from
t1
;
...
...
@@ -2487,12 +2487,6 @@ SELECT p0.a FROM t2 p0 WHERE BINARY p0.b = 'customer_over';
drop
table
t2
,
t1
;
#
# Bug #15680 (SPATIAL key in innodb)
#
--
error
ER_TABLE_CANT_HANDLE_SPKEYS
create
table
t1
(
g
geometry
not
null
,
spatial
gk
(
g
))
engine
=
innodb
;
#
# Test optimize on table with open transaction
#
...
...
@@ -2519,6 +2513,22 @@ DELETE CASCADE ON UPDATE CASCADE;
SHOW
CREATE
TABLE
t2
;
DROP
TABLE
t2
,
t1
;
#
# Bug #25927: Prevent ALTER TABLE ... MODIFY ... NOT NULL on columns
# for which there is a foreign key constraint ON ... SET NULL.
#
CREATE
TABLE
t1
(
a
INT
,
INDEX
(
a
))
ENGINE
=
InnoDB
;
CREATE
TABLE
t2
(
a
INT
,
INDEX
(
a
))
ENGINE
=
InnoDB
;
INSERT
INTO
t1
VALUES
(
1
);
INSERT
INTO
t2
VALUES
(
1
);
ALTER
TABLE
t2
ADD
FOREIGN
KEY
(
a
)
REFERENCES
t1
(
a
)
ON
DELETE
SET
NULL
;
--
replace_regex
/
'\.\/test\/#sql-[0-9a-f_]*'
/
'#sql-temporary'
/
--
error
1025
ALTER
TABLE
t2
MODIFY
a
INT
NOT
NULL
;
DELETE
FROM
t1
;
DROP
TABLE
t2
,
t1
;
#######################################################################
# #
# Please, DO NOT TOUCH this file as well as the innodb.result file. #
...
...
mysql-test/innodb_gis.result
View file @
9b765549
...
...
@@ -460,3 +460,5 @@ ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
insert into t1 (fl) values (pointfromtext('point(1,1)'));
ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
drop table t1;
create table t1 (g geometry not null, spatial gk(g)) engine=innodb;
ERROR HY000: The used table type doesn't support SPATIAL indexes
mysql-test/innodb_gis.test
View file @
9b765549
--
source
include
/
have_innodb
.
inc
SET
storage_engine
=
innodb
;
--
source
include
/
gis_generic
.
inc
#
# Bug #15680 (SPATIAL key in innodb)
#
--
error
ER_TABLE_CANT_HANDLE_SPKEYS
create
table
t1
(
g
geometry
not
null
,
spatial
gk
(
g
))
engine
=
innodb
;
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