mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Merge aivanov@bk-internal.mysql.com:/home/bk/mysql-5.1-new
into mysql.com:/home/alexi/innodb-ss/mysql-5.1-ss28 mysql-test/r/innodb.result: Auto merged mysql-test/t/innodb.test: Auto merged sql/ha_innodb.cc: Auto merged
This commit is contained in:
@ -2437,7 +2437,9 @@ a b
|
|||||||
20 NULL
|
20 NULL
|
||||||
drop table t1;
|
drop table t1;
|
||||||
create table t1 (v varchar(65530), key(v));
|
create table t1 (v varchar(65530), key(v));
|
||||||
ERROR HY000: Can't create table 'test.t1' (errno: 139)
|
Warnings:
|
||||||
|
Warning 1071 Specified key was too long; max key length is 767 bytes
|
||||||
|
drop table t1;
|
||||||
create table t1 (v varchar(65536));
|
create table t1 (v varchar(65536));
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1246 Converting column 'v' from VARCHAR to TEXT
|
Note 1246 Converting column 'v' from VARCHAR to TEXT
|
||||||
@ -2577,22 +2579,49 @@ create table t8 (col1 blob, index(col1(767)))
|
|||||||
character set = latin1 engine = innodb;
|
character set = latin1 engine = innodb;
|
||||||
create table t9 (col1 varchar(512), col2 varchar(512), index(col1, col2))
|
create table t9 (col1 varchar(512), col2 varchar(512), index(col1, col2))
|
||||||
character set = latin1 engine = innodb;
|
character set = latin1 engine = innodb;
|
||||||
|
show create table t9;
|
||||||
|
Table Create Table
|
||||||
|
t9 CREATE TABLE `t9` (
|
||||||
|
`col1` varchar(512) default NULL,
|
||||||
|
`col2` varchar(512) default NULL,
|
||||||
|
KEY `col1` (`col1`,`col2`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||||
drop table t1, t2, t3, t4, t5, t6, t7, t8, t9;
|
drop table t1, t2, t3, t4, t5, t6, t7, t8, t9;
|
||||||
create table t1 (col1 varchar(768), index (col1))
|
create table t1 (col1 varchar(768), index(col1))
|
||||||
character set = latin1 engine = innodb;
|
character set = latin1 engine = innodb;
|
||||||
ERROR HY000: Can't create table 'test.t1' (errno: 139)
|
Warnings:
|
||||||
create table t2 (col1 varchar(768) primary key)
|
Warning 1071 Specified key was too long; max key length is 767 bytes
|
||||||
|
create table t2 (col1 varbinary(768), index(col1))
|
||||||
character set = latin1 engine = innodb;
|
character set = latin1 engine = innodb;
|
||||||
ERROR HY000: Can't create table 'test.t2' (errno: 139)
|
Warnings:
|
||||||
create table t3 (col1 varbinary(768) primary key)
|
Warning 1071 Specified key was too long; max key length is 767 bytes
|
||||||
|
create table t3 (col1 text, index(col1(768)))
|
||||||
character set = latin1 engine = innodb;
|
character set = latin1 engine = innodb;
|
||||||
ERROR HY000: Can't create table 'test.t3' (errno: 139)
|
Warnings:
|
||||||
create table t4 (col1 text, index(col1(768)))
|
Warning 1071 Specified key was too long; max key length is 767 bytes
|
||||||
|
create table t4 (col1 blob, index(col1(768)))
|
||||||
character set = latin1 engine = innodb;
|
character set = latin1 engine = innodb;
|
||||||
ERROR HY000: Can't create table 'test.t4' (errno: 139)
|
Warnings:
|
||||||
create table t5 (col1 blob, index(col1(768)))
|
Warning 1071 Specified key was too long; max key length is 767 bytes
|
||||||
|
show create table t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`col1` varchar(768) default NULL,
|
||||||
|
KEY `col1` (`col1`(767))
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||||
|
drop table t1, t2, t3, t4;
|
||||||
|
create table t1 (col1 varchar(768) primary key)
|
||||||
character set = latin1 engine = innodb;
|
character set = latin1 engine = innodb;
|
||||||
ERROR HY000: Can't create table 'test.t5' (errno: 139)
|
ERROR 42000: Specified key was too long; max key length is 767 bytes
|
||||||
|
create table t2 (col1 varbinary(768) primary key)
|
||||||
|
character set = latin1 engine = innodb;
|
||||||
|
ERROR 42000: Specified key was too long; max key length is 767 bytes
|
||||||
|
create table t3 (col1 text, primary key(col1(768)))
|
||||||
|
character set = latin1 engine = innodb;
|
||||||
|
ERROR 42000: Specified key was too long; max key length is 767 bytes
|
||||||
|
create table t4 (col1 blob, primary key(col1(768)))
|
||||||
|
character set = latin1 engine = innodb;
|
||||||
|
ERROR 42000: Specified key was too long; max key length is 767 bytes
|
||||||
CREATE TABLE t1
|
CREATE TABLE t1
|
||||||
(
|
(
|
||||||
id INT PRIMARY KEY
|
id INT PRIMARY KEY
|
||||||
|
@ -1356,8 +1356,8 @@ source include/varchar.inc;
|
|||||||
# Clean up filename -- embedded server reports whole path without .frm,
|
# Clean up filename -- embedded server reports whole path without .frm,
|
||||||
# regular server reports relative path with .frm (argh!)
|
# regular server reports relative path with .frm (argh!)
|
||||||
--replace_result \\ / $MYSQL_TEST_DIR . /var/master-data/ / t1.frm t1
|
--replace_result \\ / $MYSQL_TEST_DIR . /var/master-data/ / t1.frm t1
|
||||||
--error 1005
|
|
||||||
create table t1 (v varchar(65530), key(v));
|
create table t1 (v varchar(65530), key(v));
|
||||||
|
drop table t1;
|
||||||
create table t1 (v varchar(65536));
|
create table t1 (v varchar(65536));
|
||||||
show create table t1;
|
show create table t1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
@ -1485,7 +1485,7 @@ CREATE TEMPORARY TABLE t2
|
|||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
#
|
#
|
||||||
# Test that index column max sizes are checked (bug #13315)
|
# Test that index column max sizes are honored (bug #13315)
|
||||||
#
|
#
|
||||||
|
|
||||||
# prefix index
|
# prefix index
|
||||||
@ -1512,22 +1512,36 @@ create table t8 (col1 blob, index(col1(767)))
|
|||||||
create table t9 (col1 varchar(512), col2 varchar(512), index(col1, col2))
|
create table t9 (col1 varchar(512), col2 varchar(512), index(col1, col2))
|
||||||
character set = latin1 engine = innodb;
|
character set = latin1 engine = innodb;
|
||||||
|
|
||||||
|
show create table t9;
|
||||||
|
|
||||||
drop table t1, t2, t3, t4, t5, t6, t7, t8, t9;
|
drop table t1, t2, t3, t4, t5, t6, t7, t8, t9;
|
||||||
|
|
||||||
--error 1005
|
# these should have their index length trimmed
|
||||||
create table t1 (col1 varchar(768), index (col1))
|
create table t1 (col1 varchar(768), index(col1))
|
||||||
character set = latin1 engine = innodb;
|
character set = latin1 engine = innodb;
|
||||||
--error 1005
|
create table t2 (col1 varbinary(768), index(col1))
|
||||||
create table t2 (col1 varchar(768) primary key)
|
|
||||||
character set = latin1 engine = innodb;
|
character set = latin1 engine = innodb;
|
||||||
--error 1005
|
create table t3 (col1 text, index(col1(768)))
|
||||||
create table t3 (col1 varbinary(768) primary key)
|
|
||||||
character set = latin1 engine = innodb;
|
character set = latin1 engine = innodb;
|
||||||
--error 1005
|
create table t4 (col1 blob, index(col1(768)))
|
||||||
create table t4 (col1 text, index(col1(768)))
|
|
||||||
character set = latin1 engine = innodb;
|
character set = latin1 engine = innodb;
|
||||||
--error 1005
|
|
||||||
create table t5 (col1 blob, index(col1(768)))
|
show create table t1;
|
||||||
|
|
||||||
|
drop table t1, t2, t3, t4;
|
||||||
|
|
||||||
|
# these should be refused
|
||||||
|
--error 1071
|
||||||
|
create table t1 (col1 varchar(768) primary key)
|
||||||
|
character set = latin1 engine = innodb;
|
||||||
|
--error 1071
|
||||||
|
create table t2 (col1 varbinary(768) primary key)
|
||||||
|
character set = latin1 engine = innodb;
|
||||||
|
--error 1071
|
||||||
|
create table t3 (col1 text, primary key(col1(768)))
|
||||||
|
character set = latin1 engine = innodb;
|
||||||
|
--error 1071
|
||||||
|
create table t4 (col1 blob, primary key(col1(768)))
|
||||||
character set = latin1 engine = innodb;
|
character set = latin1 engine = innodb;
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -2540,6 +2540,12 @@ ha_innobase::open(
|
|||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint
|
||||||
|
ha_innobase::max_supported_key_part_length() const
|
||||||
|
{
|
||||||
|
return(DICT_MAX_INDEX_COL_LEN - 1);
|
||||||
|
}
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
Closes a handle to an InnoDB table. */
|
Closes a handle to an InnoDB table. */
|
||||||
|
|
||||||
@ -4698,6 +4704,9 @@ create_index(
|
|||||||
0, prefix_len);
|
0, prefix_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Even though we've defined max_supported_key_part_length, we
|
||||||
|
still do our own checking using field_lengths to be absolutely
|
||||||
|
sure we don't create too long indexes. */
|
||||||
error = row_create_index_for_mysql(index, trx, field_lengths);
|
error = row_create_index_for_mysql(index, trx, field_lengths);
|
||||||
|
|
||||||
error = convert_error_code_to_mysql(error, NULL);
|
error = convert_error_code_to_mysql(error, NULL);
|
||||||
|
@ -110,7 +110,7 @@ class ha_innobase: public handler
|
|||||||
but currently MySQL does not work with keys
|
but currently MySQL does not work with keys
|
||||||
whose size is > MAX_KEY_LENGTH */
|
whose size is > MAX_KEY_LENGTH */
|
||||||
uint max_supported_key_length() const { return 3500; }
|
uint max_supported_key_length() const { return 3500; }
|
||||||
uint max_supported_key_part_length() const { return 3500; }
|
uint max_supported_key_part_length() const;
|
||||||
const key_map *keys_to_use_for_scanning() { return &key_map_full; }
|
const key_map *keys_to_use_for_scanning() { return &key_map_full; }
|
||||||
bool has_transactions() { return 1;}
|
bool has_transactions() { return 1;}
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ TAR = gtar
|
|||||||
noinst_HEADERS = ib_config.h
|
noinst_HEADERS = ib_config.h
|
||||||
|
|
||||||
SUBDIRS = os ut btr buf data dict dyn eval fil fsp fut \
|
SUBDIRS = os ut btr buf data dict dyn eval fil fsp fut \
|
||||||
ha ibuf include lock log mach mem mtr page \
|
ha ibuf lock log mach mem mtr page \
|
||||||
pars que read rem row srv sync thr trx usr
|
pars que read rem row srv sync thr trx usr
|
||||||
|
|
||||||
# Don't update the files from bitkeeper
|
# Don't update the files from bitkeeper
|
||||||
|
@ -128,7 +128,7 @@ AC_OUTPUT(Makefile os/Makefile ut/Makefile btr/Makefile dnl
|
|||||||
buf/Makefile data/Makefile dnl
|
buf/Makefile data/Makefile dnl
|
||||||
dict/Makefile dyn/Makefile dnl
|
dict/Makefile dyn/Makefile dnl
|
||||||
eval/Makefile fil/Makefile fsp/Makefile fut/Makefile dnl
|
eval/Makefile fil/Makefile fsp/Makefile fut/Makefile dnl
|
||||||
ha/Makefile ibuf/Makefile include/Makefile dnl
|
ha/Makefile ibuf/Makefile dnl
|
||||||
lock/Makefile log/Makefile dnl
|
lock/Makefile log/Makefile dnl
|
||||||
mach/Makefile mem/Makefile mtr/Makefile dnl
|
mach/Makefile mem/Makefile mtr/Makefile dnl
|
||||||
page/Makefile pars/Makefile que/Makefile dnl
|
page/Makefile pars/Makefile que/Makefile dnl
|
||||||
|
@ -1,44 +0,0 @@
|
|||||||
/******************************************************
|
|
||||||
Global error codes for the database
|
|
||||||
|
|
||||||
(c) 1996 Innobase Oy
|
|
||||||
|
|
||||||
Created 5/24/1996 Heikki Tuuri
|
|
||||||
*******************************************************/
|
|
||||||
|
|
||||||
#ifndef db0err_h
|
|
||||||
#define db0err_h
|
|
||||||
|
|
||||||
|
|
||||||
#define DB_SUCCESS 10
|
|
||||||
|
|
||||||
/* The following are error codes */
|
|
||||||
#define DB_ERROR 11
|
|
||||||
#define DB_OUT_OF_MEMORY 12
|
|
||||||
#define DB_OUT_OF_FILE_SPACE 13
|
|
||||||
#define DB_LOCK_WAIT 14
|
|
||||||
#define DB_DEADLOCK 15
|
|
||||||
#define DB_ROLLBACK 16
|
|
||||||
#define DB_DUPLICATE_KEY 17
|
|
||||||
#define DB_QUE_THR_SUSPENDED 18
|
|
||||||
#define DB_MISSING_HISTORY 19 /* required history data has been
|
|
||||||
deleted due to lack of space in
|
|
||||||
rollback segment */
|
|
||||||
#define DB_CLUSTER_NOT_FOUND 30
|
|
||||||
#define DB_TABLE_NOT_FOUND 31
|
|
||||||
#define DB_MUST_GET_MORE_FILE_SPACE 32 /* the database has to be stopped
|
|
||||||
and restrated with more file space */
|
|
||||||
#define DB_TABLE_IS_BEING_USED 33
|
|
||||||
#define DB_TOO_BIG_RECORD 34 /* a record in an index would become
|
|
||||||
bigger than 1/2 free space in a page
|
|
||||||
frame */
|
|
||||||
|
|
||||||
/* The following are partial failure codes */
|
|
||||||
#define DB_FAIL 1000
|
|
||||||
#define DB_OVERFLOW 1001
|
|
||||||
#define DB_UNDERFLOW 1002
|
|
||||||
#define DB_STRONG_FAIL 1003
|
|
||||||
#define DB_RECORD_NOT_FOUND 1500
|
|
||||||
#define DB_END_OF_INDEX 1501
|
|
||||||
|
|
||||||
#endif
|
|
@ -40,9 +40,13 @@ ha_create(
|
|||||||
table->adaptive = FALSE;
|
table->adaptive = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Creating MEM_HEAP_BTR_SEARCH type heaps can potentially fail,
|
||||||
|
but in practise it never should in this case, hence the asserts. */
|
||||||
|
|
||||||
if (n_mutexes == 0) {
|
if (n_mutexes == 0) {
|
||||||
if (in_btr_search) {
|
if (in_btr_search) {
|
||||||
table->heap = mem_heap_create_in_btr_search(4096);
|
table->heap = mem_heap_create_in_btr_search(4096);
|
||||||
|
ut_a(table->heap);
|
||||||
} else {
|
} else {
|
||||||
table->heap = mem_heap_create_in_buffer(4096);
|
table->heap = mem_heap_create_in_buffer(4096);
|
||||||
}
|
}
|
||||||
@ -57,6 +61,7 @@ ha_create(
|
|||||||
for (i = 0; i < n_mutexes; i++) {
|
for (i = 0; i < n_mutexes; i++) {
|
||||||
if (in_btr_search) {
|
if (in_btr_search) {
|
||||||
table->heaps[i] = mem_heap_create_in_btr_search(4096);
|
table->heaps[i] = mem_heap_create_in_btr_search(4096);
|
||||||
|
ut_a(table->heaps[i]);
|
||||||
} else {
|
} else {
|
||||||
table->heaps[i] = mem_heap_create_in_buffer(4096);
|
table->heaps[i] = mem_heap_create_in_buffer(4096);
|
||||||
}
|
}
|
||||||
|
@ -1,60 +0,0 @@
|
|||||||
# Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
|
|
||||||
# & Innobase Oy
|
|
||||||
#
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program; if not, write to the Free Software
|
|
||||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
noinst_HEADERS = btr0btr.h btr0btr.ic btr0cur.h btr0cur.ic \
|
|
||||||
btr0pcur.h btr0pcur.ic btr0sea.h btr0sea.ic btr0types.h \
|
|
||||||
buf0buf.h buf0buf.ic buf0flu.h buf0flu.ic buf0lru.h \
|
|
||||||
buf0lru.ic buf0rea.h buf0types.h data0data.h data0data.ic data0type.h \
|
|
||||||
data0type.ic data0types.h db0err.h dict0boot.h \
|
|
||||||
dict0boot.ic dict0crea.h dict0crea.ic dict0dict.h \
|
|
||||||
dict0dict.ic dict0load.h dict0load.ic dict0mem.h \
|
|
||||||
dict0mem.ic dict0types.h dyn0dyn.h dyn0dyn.ic eval0eval.h \
|
|
||||||
eval0eval.ic eval0proc.h eval0proc.ic fil0fil.h fsp0fsp.h \
|
|
||||||
fsp0fsp.ic fut0fut.h fut0fut.ic fut0lst.h fut0lst.ic \
|
|
||||||
ha0ha.h ha0ha.ic hash0hash.h hash0hash.ic \
|
|
||||||
ibuf0ibuf.h ibuf0ibuf.ic ibuf0types.h lock0lock.h \
|
|
||||||
lock0lock.ic lock0types.h log0log.h log0log.ic log0recv.h \
|
|
||||||
log0recv.ic mach0data.h mach0data.ic \
|
|
||||||
mem0dbg.h mem0dbg.ic mem0mem.h mem0mem.ic mem0pool.h \
|
|
||||||
mem0pool.ic mtr0log.h mtr0log.ic mtr0mtr.h mtr0mtr.ic \
|
|
||||||
mtr0types.h os0file.h os0proc.h os0proc.ic \
|
|
||||||
os0sync.h os0sync.ic os0thread.h \
|
|
||||||
os0thread.ic page0cur.h page0cur.ic page0page.h \
|
|
||||||
page0page.ic page0types.h pars0grm.h pars0opt.h \
|
|
||||||
pars0opt.ic pars0pars.h pars0pars.ic pars0sym.h \
|
|
||||||
pars0sym.ic pars0types.h que0que.h que0que.ic que0types.h \
|
|
||||||
read0read.h read0read.ic read0types.h rem0cmp.h \
|
|
||||||
rem0cmp.ic rem0rec.h rem0rec.ic rem0types.h row0ins.h \
|
|
||||||
row0ins.ic row0mysql.h row0mysql.ic row0purge.h \
|
|
||||||
row0purge.ic row0row.h row0row.ic row0sel.h row0sel.ic \
|
|
||||||
row0types.h row0uins.h row0uins.ic row0umod.h row0umod.ic \
|
|
||||||
row0undo.h row0undo.ic row0upd.h row0upd.ic row0vers.h \
|
|
||||||
row0vers.ic srv0que.h srv0srv.h srv0srv.ic srv0start.h \
|
|
||||||
sync0arr.h sync0arr.ic sync0rw.h \
|
|
||||||
sync0rw.ic sync0sync.h sync0sync.ic sync0types.h \
|
|
||||||
thr0loc.h thr0loc.ic trx0purge.h trx0purge.ic trx0rec.h \
|
|
||||||
trx0rec.ic trx0roll.h trx0roll.ic trx0rseg.h trx0rseg.ic \
|
|
||||||
trx0sys.h trx0sys.ic trx0trx.h trx0trx.ic trx0types.h \
|
|
||||||
trx0undo.h trx0undo.ic trx0xa.h univ.i \
|
|
||||||
usr0sess.h usr0sess.ic usr0types.h ut0byte.h ut0byte.ic \
|
|
||||||
ut0dbg.h ut0lst.h ut0mem.h ut0mem.ic ut0rnd.h ut0rnd.ic \
|
|
||||||
ut0sort.h ut0ut.h ut0ut.ic
|
|
||||||
|
|
||||||
EXTRA_DIST = Makefile.i
|
|
||||||
|
|
||||||
# Don't update the files from bitkeeper
|
|
||||||
%::SCCS/s.%
|
|
@ -68,21 +68,6 @@ ha_insert_for_fold(
|
|||||||
node is created! */
|
node is created! */
|
||||||
void* data); /* in: data, must not be NULL */
|
void* data); /* in: data, must not be NULL */
|
||||||
/*****************************************************************
|
/*****************************************************************
|
||||||
Reserves the necessary hash table mutex and inserts an entry into the hash
|
|
||||||
table. */
|
|
||||||
UNIV_INLINE
|
|
||||||
ibool
|
|
||||||
ha_insert_for_fold_mutex(
|
|
||||||
/*=====================*/
|
|
||||||
/* out: TRUE if succeed, FALSE if no more
|
|
||||||
memory could be allocated */
|
|
||||||
hash_table_t* table, /* in: hash table */
|
|
||||||
ulint fold, /* in: folded value of data; if a node with
|
|
||||||
the same fold value already exists, it is
|
|
||||||
updated to point to the same data, and no new
|
|
||||||
node is created! */
|
|
||||||
void* data); /* in: data, must not be NULL */
|
|
||||||
/*****************************************************************
|
|
||||||
Deletes an entry from a hash table. */
|
Deletes an entry from a hash table. */
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -191,30 +191,3 @@ ha_search_and_delete_if_found(
|
|||||||
|
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************
|
|
||||||
Reserves the necessary hash table mutex and inserts an entry into the hash
|
|
||||||
table. */
|
|
||||||
UNIV_INLINE
|
|
||||||
ibool
|
|
||||||
ha_insert_for_fold_mutex(
|
|
||||||
/*=====================*/
|
|
||||||
/* out: TRUE if succeed, FALSE if no more
|
|
||||||
memory could be allocated */
|
|
||||||
hash_table_t* table, /* in: hash table */
|
|
||||||
ulint fold, /* in: folded value of data; if a node with
|
|
||||||
the same fold value already exists, it is
|
|
||||||
updated to point to the same data, and no new
|
|
||||||
node is created! */
|
|
||||||
void* data) /* in: data, must not be NULL */
|
|
||||||
{
|
|
||||||
ibool ret;
|
|
||||||
|
|
||||||
hash_mutex_enter(table, fold);
|
|
||||||
|
|
||||||
ret = ha_insert_for_fold(table, fold, data);
|
|
||||||
|
|
||||||
hash_mutex_exit(table, fold);
|
|
||||||
|
|
||||||
return(ret);
|
|
||||||
}
|
|
||||||
|
@ -31,13 +31,18 @@ typedef mem_block_info_t mem_block_t;
|
|||||||
typedef mem_block_t mem_heap_t;
|
typedef mem_block_t mem_heap_t;
|
||||||
|
|
||||||
/* Types of allocation for memory heaps: DYNAMIC means allocation from the
|
/* Types of allocation for memory heaps: DYNAMIC means allocation from the
|
||||||
dynamic memory pool of the C compiler, BUFFER means allocation from the index
|
dynamic memory pool of the C compiler, BUFFER means allocation from the
|
||||||
page buffer pool; the latter method is used for very big heaps */
|
buffer pool; the latter method is used for very big heaps */
|
||||||
|
|
||||||
#define MEM_HEAP_DYNAMIC 0 /* the most common type */
|
#define MEM_HEAP_DYNAMIC 0 /* the most common type */
|
||||||
#define MEM_HEAP_BUFFER 1
|
#define MEM_HEAP_BUFFER 1
|
||||||
#define MEM_HEAP_BTR_SEARCH 2 /* this flag can be ORed to the
|
#define MEM_HEAP_BTR_SEARCH 2 /* this flag can optionally be
|
||||||
previous */
|
ORed to MEM_HEAP_BUFFER, in which
|
||||||
|
case heap->free_block is used in
|
||||||
|
some cases for memory allocations,
|
||||||
|
and if it's NULL, the memory
|
||||||
|
allocation functions can return
|
||||||
|
NULL. */
|
||||||
|
|
||||||
/* The following start size is used for the first block in the memory heap if
|
/* The following start size is used for the first block in the memory heap if
|
||||||
the size is not specified, i.e., 0 is given as the parameter in the call of
|
the size is not specified, i.e., 0 is given as the parameter in the call of
|
||||||
@ -98,13 +103,15 @@ heap freeing. */
|
|||||||
(heap), __FILE__, __LINE__)
|
(heap), __FILE__, __LINE__)
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
NOTE: Use the corresponding macros instead of this function. Creates a
|
NOTE: Use the corresponding macros instead of this function. Creates a
|
||||||
memory heap which allocates memory from dynamic space. For debugging
|
memory heap. For debugging purposes, takes also the file name and line as
|
||||||
purposes, takes also the file name and line as argument. */
|
arguments. */
|
||||||
UNIV_INLINE
|
UNIV_INLINE
|
||||||
mem_heap_t*
|
mem_heap_t*
|
||||||
mem_heap_create_func(
|
mem_heap_create_func(
|
||||||
/*=================*/
|
/*=================*/
|
||||||
/* out, own: memory heap */
|
/* out, own: memory heap, NULL if
|
||||||
|
did not succeed (only possible for
|
||||||
|
MEM_HEAP_BTR_SEARCH type heaps)*/
|
||||||
ulint n, /* in: desired start block size,
|
ulint n, /* in: desired start block size,
|
||||||
this means that a single user buffer
|
this means that a single user buffer
|
||||||
of size n will fit in the block,
|
of size n will fit in the block,
|
||||||
@ -121,11 +128,9 @@ mem_heap_create_func(
|
|||||||
block is not unintentionally erased
|
block is not unintentionally erased
|
||||||
(if allocated in the stack), before
|
(if allocated in the stack), before
|
||||||
the memory heap is explicitly freed. */
|
the memory heap is explicitly freed. */
|
||||||
ulint type, /* in: MEM_HEAP_DYNAMIC
|
ulint type, /* in: heap type */
|
||||||
or MEM_HEAP_BUFFER */
|
|
||||||
const char* file_name, /* in: file name where created */
|
const char* file_name, /* in: file name where created */
|
||||||
ulint line /* in: line where created */
|
ulint line); /* in: line where created */
|
||||||
);
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
NOTE: Use the corresponding macro instead of this function. Frees the space
|
NOTE: Use the corresponding macro instead of this function. Frees the space
|
||||||
occupied by a memory heap. In the debug version erases the heap memory
|
occupied by a memory heap. In the debug version erases the heap memory
|
||||||
@ -143,8 +148,9 @@ UNIV_INLINE
|
|||||||
void*
|
void*
|
||||||
mem_heap_alloc(
|
mem_heap_alloc(
|
||||||
/*===========*/
|
/*===========*/
|
||||||
/* out: allocated storage, NULL if
|
/* out: allocated storage, NULL if did not
|
||||||
did not succeed */
|
succeed (only possible for
|
||||||
|
MEM_HEAP_BTR_SEARCH type heaps) */
|
||||||
mem_heap_t* heap, /* in: memory heap */
|
mem_heap_t* heap, /* in: memory heap */
|
||||||
ulint n); /* in: number of bytes; if the heap is allowed
|
ulint n); /* in: number of bytes; if the heap is allowed
|
||||||
to grow into the buffer pool, this must be
|
to grow into the buffer pool, this must be
|
||||||
@ -220,8 +226,7 @@ UNIV_INLINE
|
|||||||
void*
|
void*
|
||||||
mem_alloc_func(
|
mem_alloc_func(
|
||||||
/*===========*/
|
/*===========*/
|
||||||
/* out, own: free storage, NULL
|
/* out, own: free storage */
|
||||||
if did not succeed */
|
|
||||||
ulint n, /* in: desired number of bytes */
|
ulint n, /* in: desired number of bytes */
|
||||||
const char* file_name, /* in: file name where created */
|
const char* file_name, /* in: file name where created */
|
||||||
ulint line /* in: line where created */
|
ulint line /* in: line where created */
|
||||||
@ -235,8 +240,7 @@ with mem_free. */
|
|||||||
void*
|
void*
|
||||||
mem_alloc_func_noninline(
|
mem_alloc_func_noninline(
|
||||||
/*=====================*/
|
/*=====================*/
|
||||||
/* out, own: free storage,
|
/* out, own: free storage */
|
||||||
NULL if did not succeed */
|
|
||||||
ulint n, /* in: desired number of bytes */
|
ulint n, /* in: desired number of bytes */
|
||||||
const char* file_name, /* in: file name where created */
|
const char* file_name, /* in: file name where created */
|
||||||
ulint line /* in: line where created */
|
ulint line /* in: line where created */
|
||||||
|
@ -16,8 +16,9 @@ Creates a memory heap block where data can be allocated. */
|
|||||||
mem_block_t*
|
mem_block_t*
|
||||||
mem_heap_create_block(
|
mem_heap_create_block(
|
||||||
/*==================*/
|
/*==================*/
|
||||||
/* out, own: memory heap block,
|
/* out, own: memory heap block, NULL if
|
||||||
NULL if did not succeed */
|
did not succeed (only possible for
|
||||||
|
MEM_HEAP_BTR_SEARCH type heaps) */
|
||||||
mem_heap_t* heap, /* in: memory heap or NULL if first block
|
mem_heap_t* heap, /* in: memory heap or NULL if first block
|
||||||
should be created */
|
should be created */
|
||||||
ulint n, /* in: number of bytes needed for user data, or
|
ulint n, /* in: number of bytes needed for user data, or
|
||||||
@ -50,7 +51,8 @@ mem_block_t*
|
|||||||
mem_heap_add_block(
|
mem_heap_add_block(
|
||||||
/*===============*/
|
/*===============*/
|
||||||
/* out: created block, NULL if did not
|
/* out: created block, NULL if did not
|
||||||
succeed */
|
succeed (only possible for
|
||||||
|
MEM_HEAP_BTR_SEARCH type heaps)*/
|
||||||
mem_heap_t* heap, /* in: memory heap */
|
mem_heap_t* heap, /* in: memory heap */
|
||||||
ulint n); /* in: number of bytes user needs */
|
ulint n); /* in: number of bytes user needs */
|
||||||
|
|
||||||
@ -126,7 +128,9 @@ UNIV_INLINE
|
|||||||
void*
|
void*
|
||||||
mem_heap_alloc(
|
mem_heap_alloc(
|
||||||
/*===========*/
|
/*===========*/
|
||||||
/* out: allocated storage */
|
/* out: allocated storage, NULL if did not
|
||||||
|
succeed (only possible for
|
||||||
|
MEM_HEAP_BTR_SEARCH type heaps) */
|
||||||
mem_heap_t* heap, /* in: memory heap */
|
mem_heap_t* heap, /* in: memory heap */
|
||||||
ulint n) /* in: number of bytes; if the heap is allowed
|
ulint n) /* in: number of bytes; if the heap is allowed
|
||||||
to grow into the buffer pool, this must be
|
to grow into the buffer pool, this must be
|
||||||
@ -370,13 +374,15 @@ mem_heap_free_top(
|
|||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
NOTE: Use the corresponding macros instead of this function. Creates a
|
NOTE: Use the corresponding macros instead of this function. Creates a
|
||||||
memory heap which allocates memory from dynamic space. For debugging
|
memory heap. For debugging purposes, takes also the file name and line as
|
||||||
purposes, takes also the file name and line as argument. */
|
argument. */
|
||||||
UNIV_INLINE
|
UNIV_INLINE
|
||||||
mem_heap_t*
|
mem_heap_t*
|
||||||
mem_heap_create_func(
|
mem_heap_create_func(
|
||||||
/*=================*/
|
/*=================*/
|
||||||
/* out, own: memory heap */
|
/* out, own: memory heap, NULL if
|
||||||
|
did not succeed (only possible for
|
||||||
|
MEM_HEAP_BTR_SEARCH type heaps)*/
|
||||||
ulint n, /* in: desired start block size,
|
ulint n, /* in: desired start block size,
|
||||||
this means that a single user buffer
|
this means that a single user buffer
|
||||||
of size n will fit in the block,
|
of size n will fit in the block,
|
||||||
@ -393,11 +399,9 @@ mem_heap_create_func(
|
|||||||
block is not unintentionally erased
|
block is not unintentionally erased
|
||||||
(if allocated in the stack), before
|
(if allocated in the stack), before
|
||||||
the memory heap is explicitly freed. */
|
the memory heap is explicitly freed. */
|
||||||
ulint type, /* in: MEM_HEAP_DYNAMIC
|
ulint type, /* in: heap type */
|
||||||
or MEM_HEAP_BUFFER */
|
|
||||||
const char* file_name, /* in: file name where created */
|
const char* file_name, /* in: file name where created */
|
||||||
ulint line /* in: line where created */
|
ulint line) /* in: line where created */
|
||||||
)
|
|
||||||
{
|
{
|
||||||
mem_block_t* block;
|
mem_block_t* block;
|
||||||
|
|
||||||
@ -409,7 +413,10 @@ mem_heap_create_func(
|
|||||||
init_block, type, file_name, line);
|
init_block, type, file_name, line);
|
||||||
}
|
}
|
||||||
|
|
||||||
ut_ad(block);
|
if (block == NULL) {
|
||||||
|
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
UT_LIST_INIT(block->base);
|
UT_LIST_INIT(block->base);
|
||||||
|
|
||||||
@ -418,11 +425,6 @@ mem_heap_create_func(
|
|||||||
|
|
||||||
#ifdef UNIV_MEM_DEBUG
|
#ifdef UNIV_MEM_DEBUG
|
||||||
|
|
||||||
if (block == NULL) {
|
|
||||||
|
|
||||||
return(block);
|
|
||||||
}
|
|
||||||
|
|
||||||
mem_hash_insert(block, file_name, line);
|
mem_hash_insert(block, file_name, line);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@ -484,8 +486,7 @@ UNIV_INLINE
|
|||||||
void*
|
void*
|
||||||
mem_alloc_func(
|
mem_alloc_func(
|
||||||
/*===========*/
|
/*===========*/
|
||||||
/* out, own: free storage, NULL
|
/* out, own: free storage */
|
||||||
if did not succeed */
|
|
||||||
ulint n, /* in: desired number of bytes */
|
ulint n, /* in: desired number of bytes */
|
||||||
const char* file_name, /* in: file name where created */
|
const char* file_name, /* in: file name where created */
|
||||||
ulint line /* in: line where created */
|
ulint line /* in: line where created */
|
||||||
@ -496,10 +497,6 @@ mem_alloc_func(
|
|||||||
|
|
||||||
heap = mem_heap_create_func(n, NULL, MEM_HEAP_DYNAMIC, file_name,
|
heap = mem_heap_create_func(n, NULL, MEM_HEAP_DYNAMIC, file_name,
|
||||||
line);
|
line);
|
||||||
if (heap == NULL) {
|
|
||||||
|
|
||||||
return(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Note that as we created the first block in the heap big enough
|
/* Note that as we created the first block in the heap big enough
|
||||||
for the buffer requested by the caller, the buffer will be in the
|
for the buffer requested by the caller, the buffer will be in the
|
||||||
|
@ -1705,7 +1705,7 @@ static
|
|||||||
lock_t*
|
lock_t*
|
||||||
lock_rec_create(
|
lock_rec_create(
|
||||||
/*============*/
|
/*============*/
|
||||||
/* out: created lock, NULL if out of memory */
|
/* out: created lock */
|
||||||
ulint type_mode,/* in: lock mode and wait flag, type is
|
ulint type_mode,/* in: lock mode and wait flag, type is
|
||||||
ignored and replaced by LOCK_REC */
|
ignored and replaced by LOCK_REC */
|
||||||
rec_t* rec, /* in: record on page */
|
rec_t* rec, /* in: record on page */
|
||||||
@ -1747,11 +1747,6 @@ lock_rec_create(
|
|||||||
|
|
||||||
lock = mem_heap_alloc(trx->lock_heap, sizeof(lock_t) + n_bytes);
|
lock = mem_heap_alloc(trx->lock_heap, sizeof(lock_t) + n_bytes);
|
||||||
|
|
||||||
if (UNIV_UNLIKELY(lock == NULL)) {
|
|
||||||
|
|
||||||
return(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
UT_LIST_ADD_LAST(trx_locks, trx->trx_locks, lock);
|
UT_LIST_ADD_LAST(trx_locks, trx->trx_locks, lock);
|
||||||
|
|
||||||
lock->trx = trx;
|
lock->trx = trx;
|
||||||
@ -1886,8 +1881,7 @@ static
|
|||||||
lock_t*
|
lock_t*
|
||||||
lock_rec_add_to_queue(
|
lock_rec_add_to_queue(
|
||||||
/*==================*/
|
/*==================*/
|
||||||
/* out: lock where the bit was set, NULL if out
|
/* out: lock where the bit was set */
|
||||||
of memory */
|
|
||||||
ulint type_mode,/* in: lock mode, wait, gap etc. flags;
|
ulint type_mode,/* in: lock mode, wait, gap etc. flags;
|
||||||
type is ignored and replaced by LOCK_REC */
|
type is ignored and replaced by LOCK_REC */
|
||||||
rec_t* rec, /* in: record on page */
|
rec_t* rec, /* in: record on page */
|
||||||
@ -3405,8 +3399,7 @@ UNIV_INLINE
|
|||||||
lock_t*
|
lock_t*
|
||||||
lock_table_create(
|
lock_table_create(
|
||||||
/*==============*/
|
/*==============*/
|
||||||
/* out, own: new lock object, or NULL if
|
/* out, own: new lock object */
|
||||||
out of memory */
|
|
||||||
dict_table_t* table, /* in: database table in dictionary cache */
|
dict_table_t* table, /* in: database table in dictionary cache */
|
||||||
ulint type_mode,/* in: lock mode possibly ORed with
|
ulint type_mode,/* in: lock mode possibly ORed with
|
||||||
LOCK_WAIT */
|
LOCK_WAIT */
|
||||||
@ -3432,11 +3425,6 @@ lock_table_create(
|
|||||||
lock = mem_heap_alloc(trx->lock_heap, sizeof(lock_t));
|
lock = mem_heap_alloc(trx->lock_heap, sizeof(lock_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lock == NULL) {
|
|
||||||
|
|
||||||
return(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
UT_LIST_ADD_LAST(trx_locks, trx->trx_locks, lock);
|
UT_LIST_ADD_LAST(trx_locks, trx->trx_locks, lock);
|
||||||
|
|
||||||
lock->type_mode = type_mode | LOCK_TABLE;
|
lock->type_mode = type_mode | LOCK_TABLE;
|
||||||
|
@ -92,12 +92,10 @@ with mem_free. */
|
|||||||
void*
|
void*
|
||||||
mem_alloc_func_noninline(
|
mem_alloc_func_noninline(
|
||||||
/*=====================*/
|
/*=====================*/
|
||||||
/* out, own: free storage,
|
/* out, own: free storage */
|
||||||
NULL if did not succeed */
|
|
||||||
ulint n, /* in: desired number of bytes */
|
ulint n, /* in: desired number of bytes */
|
||||||
const char* file_name, /* in: file name where created */
|
const char* file_name, /* in: file name where created */
|
||||||
ulint line /* in: line where created */
|
ulint line) /* in: line where created */
|
||||||
)
|
|
||||||
{
|
{
|
||||||
return(mem_alloc_func(n, file_name, line));
|
return(mem_alloc_func(n, file_name, line));
|
||||||
}
|
}
|
||||||
@ -122,8 +120,9 @@ Creates a memory heap block where data can be allocated. */
|
|||||||
mem_block_t*
|
mem_block_t*
|
||||||
mem_heap_create_block(
|
mem_heap_create_block(
|
||||||
/*==================*/
|
/*==================*/
|
||||||
/* out, own: memory heap block,
|
/* out, own: memory heap block, NULL if
|
||||||
NULL if did not succeed */
|
did not succeed (only possible for
|
||||||
|
MEM_HEAP_BTR_SEARCH type heaps) */
|
||||||
mem_heap_t* heap, /* in: memory heap or NULL if first block
|
mem_heap_t* heap, /* in: memory heap or NULL if first block
|
||||||
should be created */
|
should be created */
|
||||||
ulint n, /* in: number of bytes needed for user data, or
|
ulint n, /* in: number of bytes needed for user data, or
|
||||||
@ -182,6 +181,8 @@ mem_heap_create_block(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (block == NULL) {
|
if (block == NULL) {
|
||||||
|
/* Only MEM_HEAP_BTR_SEARCH allocation should ever fail. */
|
||||||
|
ut_a(type & MEM_HEAP_BTR_SEARCH);
|
||||||
|
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
@ -222,7 +223,8 @@ mem_block_t*
|
|||||||
mem_heap_add_block(
|
mem_heap_add_block(
|
||||||
/*===============*/
|
/*===============*/
|
||||||
/* out: created block, NULL if did not
|
/* out: created block, NULL if did not
|
||||||
succeed */
|
succeed (only possible for
|
||||||
|
MEM_HEAP_BTR_SEARCH type heaps)*/
|
||||||
mem_heap_t* heap, /* in: memory heap */
|
mem_heap_t* heap, /* in: memory heap */
|
||||||
ulint n) /* in: number of bytes user needs */
|
ulint n) /* in: number of bytes user needs */
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user