mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Apply the following innodb-5.1-* snapshots: ss1489, ss1496, ss1550, ss1569.
After applying the snapshots, ensure that code conforms to the final version of WL 3914. It is signficant that, after these changes, InnoDB does not define MYSQL_SERVER, and can be built as an independent storage engine plugin. Fixes: Bug#9709: InnoDB inconsistensy causes "Operating System Error 32/33" Bug#18828: If InnoDB runs out of undo slots, it returns misleading 'table is full' Bug#20090: InnoDB: Error: trying to declare trx to enter InnoDB Bug#20352: Make ibuf_contract_for_n_pages tunable Bug#21101: Wrong error on exceeding max row size for InnoDB table Bug#21293: Deadlock detection prefers to kill long running FOR UPDATE queries Bug#22819: SHOW INNODB STATUS crashes the server with an assertion failure under high load Bug#25078: Make the replication thread to ignore innodb_thread_concurrency Bug#25645: Assertion failure in file srv0srv.c Bug#28138: indexing column prefixes produces corruption in InnoDB
This commit is contained in:
51
mysql-test/include/innodb_trx_weight.inc
Normal file
51
mysql-test/include/innodb_trx_weight.inc
Normal file
@ -0,0 +1,51 @@
|
||||
-- connect (con1,localhost,root,,)
|
||||
-- connect (con2,localhost,root,,)
|
||||
|
||||
-- connection con1
|
||||
SET autocommit=0;
|
||||
SELECT * FROM t1 FOR UPDATE;
|
||||
-- if ($con1_extra_sql_present) {
|
||||
-- eval $con1_extra_sql
|
||||
-- }
|
||||
|
||||
-- connection con2
|
||||
SET autocommit=0;
|
||||
SELECT * FROM t2 FOR UPDATE;
|
||||
-- if ($con2_extra_sql_present) {
|
||||
-- eval $con2_extra_sql
|
||||
-- }
|
||||
|
||||
-- if ($con1_should_be_rolledback) {
|
||||
-- connection con1
|
||||
-- send
|
||||
INSERT INTO t2 VALUES (0);
|
||||
|
||||
-- connection con2
|
||||
INSERT INTO t1 VALUES (0);
|
||||
ROLLBACK;
|
||||
|
||||
-- connection con1
|
||||
-- error ER_LOCK_DEADLOCK
|
||||
-- reap
|
||||
-- }
|
||||
# else
|
||||
-- if (!$con1_should_be_rolledback) {
|
||||
-- connection con2
|
||||
-- send
|
||||
INSERT INTO t1 VALUES (0);
|
||||
|
||||
-- connection con1
|
||||
INSERT INTO t2 VALUES (0);
|
||||
ROLLBACK;
|
||||
|
||||
-- connection con2
|
||||
-- error ER_LOCK_DEADLOCK
|
||||
-- reap
|
||||
-- }
|
||||
|
||||
-- connection default
|
||||
|
||||
DELETE FROM t5_nontrans;
|
||||
|
||||
-- disconnect con1
|
||||
-- disconnect con2
|
@ -3211,3 +3211,14 @@ t1 CREATE TABLE `t1` (
|
||||
CONSTRAINT `t1_t2` FOREIGN KEY (`id`) REFERENCES `t2` (`id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=349 DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1,t2;
|
||||
CREATE TABLE t1 (
|
||||
c01 CHAR(255), c02 CHAR(255), c03 CHAR(255), c04 CHAR(255),
|
||||
c05 CHAR(255), c06 CHAR(255), c07 CHAR(255), c08 CHAR(255),
|
||||
c09 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255),
|
||||
c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255),
|
||||
c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255),
|
||||
c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255),
|
||||
c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255),
|
||||
c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255)
|
||||
) ENGINE = InnoDB;
|
||||
ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. You have to change some columns to TEXT or BLOBs
|
||||
|
1
mysql-test/r/innodb_trx_weight.result
Normal file
1
mysql-test/r/innodb_trx_weight.result
Normal file
@ -0,0 +1 @@
|
||||
SET storage_engine=InnoDB;
|
@ -2349,6 +2349,21 @@ SHOW CREATE TABLE t1;
|
||||
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
#
|
||||
# Bug #21101 (Prints wrong error message if max row size is too large)
|
||||
#
|
||||
--error 1118
|
||||
CREATE TABLE t1 (
|
||||
c01 CHAR(255), c02 CHAR(255), c03 CHAR(255), c04 CHAR(255),
|
||||
c05 CHAR(255), c06 CHAR(255), c07 CHAR(255), c08 CHAR(255),
|
||||
c09 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255),
|
||||
c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255),
|
||||
c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255),
|
||||
c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255),
|
||||
c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255),
|
||||
c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255)
|
||||
) ENGINE = InnoDB;
|
||||
|
||||
#######################################################################
|
||||
# #
|
||||
# Please, DO NOT TOUCH this file as well as the innodb.result file. #
|
||||
|
108
mysql-test/t/innodb_trx_weight.test
Normal file
108
mysql-test/t/innodb_trx_weight.test
Normal file
@ -0,0 +1,108 @@
|
||||
#
|
||||
# Ensure that the number of locks (SELECT FOR UPDATE for example) is
|
||||
# added to the number of altered rows when choosing the smallest
|
||||
# transaction to kill as a victim when a deadlock is detected.
|
||||
# Also transactions what had edited non-transactional tables should
|
||||
# be heavier than ones that had not.
|
||||
#
|
||||
|
||||
-- source include/have_innodb.inc
|
||||
|
||||
SET storage_engine=InnoDB;
|
||||
|
||||
# we do not really care about what gets printed, we are only
|
||||
# interested in getting the deadlock resolved according to our
|
||||
# expectations
|
||||
-- disable_query_log
|
||||
-- disable_result_log
|
||||
|
||||
# we want to use "-- eval statement1; statement2" which does not work with
|
||||
# prepared statements. Because this test should not behave differently with
|
||||
# or without prepared statements we disable them so the test does not fail
|
||||
# if someone runs ./mysql-test-run.pl --ps-protocol
|
||||
-- disable_ps_protocol
|
||||
|
||||
-- disable_warnings
|
||||
DROP TABLE IF EXISTS t1, t2, t3, t4, t5_nontrans;
|
||||
-- enable_warnings
|
||||
|
||||
# we will create a simple deadlock with t1, t2 and two connections
|
||||
CREATE TABLE t1 (a INT);
|
||||
CREATE TABLE t2 (a INT);
|
||||
|
||||
# auxiliary table with a bulk of rows which will be locked by a
|
||||
# transaction to increase its weight
|
||||
CREATE TABLE t3 (a INT);
|
||||
|
||||
# auxiliary empty table which will be inserted by a
|
||||
# transaction to increase its weight
|
||||
CREATE TABLE t4 (a INT);
|
||||
|
||||
# auxiliary non-transactional table which will be edited by a
|
||||
# transaction to tremendously increase its weight
|
||||
CREATE TABLE t5_nontrans (a INT) ENGINE=MyISAM;
|
||||
|
||||
INSERT INTO t1 VALUES (1);
|
||||
INSERT INTO t2 VALUES (1);
|
||||
# insert a lot of rows in t3
|
||||
INSERT INTO t3 VALUES (1);
|
||||
INSERT INTO t3 SELECT * FROM t3;
|
||||
INSERT INTO t3 SELECT * FROM t3;
|
||||
INSERT INTO t3 SELECT * FROM t3;
|
||||
INSERT INTO t3 SELECT * FROM t3;
|
||||
INSERT INTO t3 SELECT * FROM t3;
|
||||
INSERT INTO t3 SELECT * FROM t3;
|
||||
INSERT INTO t3 SELECT * FROM t3;
|
||||
INSERT INTO t3 SELECT * FROM t3;
|
||||
INSERT INTO t3 SELECT * FROM t3;
|
||||
INSERT INTO t3 SELECT * FROM t3;
|
||||
INSERT INTO t3 SELECT * FROM t3;
|
||||
|
||||
# test locking weight
|
||||
|
||||
-- let $con1_extra_sql =
|
||||
-- let $con1_extra_sql_present = 0
|
||||
-- let $con2_extra_sql = SELECT * FROM t3 FOR UPDATE
|
||||
-- let $con2_extra_sql_present = 1
|
||||
-- let $con1_should_be_rolledback = 1
|
||||
-- source include/innodb_trx_weight.inc
|
||||
|
||||
-- let $con1_extra_sql = INSERT INTO t4 VALUES (1), (1)
|
||||
-- let $con1_extra_sql_present = 1
|
||||
-- let $con2_extra_sql = SELECT * FROM t3 FOR UPDATE
|
||||
-- let $con2_extra_sql_present = 1
|
||||
-- let $con1_should_be_rolledback = 1
|
||||
-- source include/innodb_trx_weight.inc
|
||||
|
||||
-- let $con1_extra_sql = INSERT INTO t4 VALUES (1), (1), (1), (1), (1), (1)
|
||||
-- let $con1_extra_sql_present = 1
|
||||
-- let $con2_extra_sql = SELECT * FROM t3 FOR UPDATE
|
||||
-- let $con2_extra_sql_present = 1
|
||||
-- let $con1_should_be_rolledback = 0
|
||||
-- source include/innodb_trx_weight.inc
|
||||
|
||||
# test weight when non-transactional tables are edited
|
||||
|
||||
-- let $con1_extra_sql = INSERT INTO t4 VALUES (1), (1), (1)
|
||||
-- let $con1_extra_sql_present = 1
|
||||
-- let $con2_extra_sql =
|
||||
-- let $con2_extra_sql_present = 0
|
||||
-- let $con1_should_be_rolledback = 0
|
||||
-- source include/innodb_trx_weight.inc
|
||||
|
||||
-- let $con1_extra_sql = INSERT INTO t4 VALUES (1), (1), (1)
|
||||
-- let $con1_extra_sql_present = 1
|
||||
-- let $con2_extra_sql = INSERT INTO t5_nontrans VALUES (1)
|
||||
-- let $con2_extra_sql_present = 1
|
||||
-- let $con1_should_be_rolledback = 1
|
||||
-- source include/innodb_trx_weight.inc
|
||||
|
||||
-- let $con1_extra_sql = INSERT INTO t4 VALUES (1), (1), (1)
|
||||
-- let $con1_extra_sql = $con1_extra_sql; INSERT INTO t5_nontrans VALUES (1)
|
||||
-- let $con1_extra_sql_present = 1
|
||||
-- let $con2_extra_sql = INSERT INTO t5_nontrans VALUES (1)
|
||||
-- let $con2_extra_sql_present = 1
|
||||
-- let $con1_should_be_rolledback = 0
|
||||
-- source include/innodb_trx_weight.inc
|
||||
|
||||
DROP TABLE t1, t2, t3, t4, t5_nontrans;
|
@ -2570,7 +2570,7 @@ extern "C" int thd_non_transactional_update(const MYSQL_THD thd)
|
||||
return(thd->no_trans_update.all);
|
||||
}
|
||||
|
||||
extern "C" int thd_binlog_format(const THD *thd)
|
||||
extern "C" int thd_binlog_format(const MYSQL_THD thd)
|
||||
{
|
||||
return (int) thd->variables.binlog_format;
|
||||
}
|
||||
|
@ -25,102 +25,146 @@ INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include \
|
||||
-I$(top_srcdir)/sql \
|
||||
-I$(srcdir)
|
||||
|
||||
AUTOMAKE_OPTIONS = foreign
|
||||
TAR = gtar
|
||||
DEFS = @DEFS@
|
||||
|
||||
noinst_HEADERS =
|
||||
|
||||
SUBDIRS = os ut btr buf data dict dyn eval fil fsp fut \
|
||||
ha ibuf lock log mach mem mtr page \
|
||||
handler \
|
||||
pars que read rem row srv sync thr trx usr
|
||||
|
||||
EXTRA_DIST = include/btr0btr.h include/btr0btr.ic include/btr0cur.h include/btr0cur.ic \
|
||||
include/btr0pcur.h include/btr0pcur.ic include/btr0sea.h include/btr0sea.ic \
|
||||
include/btr0types.h \
|
||||
include/buf0buf.h include/buf0buf.ic include/buf0flu.h include/buf0flu.ic \
|
||||
include/buf0lru.h include/buf0lru.ic include/buf0rea.h include/buf0types.h \
|
||||
include/data0data.h include/data0data.ic include/data0type.h include/data0type.ic \
|
||||
include/data0types.h include/db0err.h \
|
||||
include/dict0boot.h include/dict0boot.ic include/dict0crea.h include/dict0crea.ic \
|
||||
include/dict0dict.h include/dict0dict.ic include/dict0load.h include/dict0load.ic \
|
||||
include/dict0mem.h include/dict0mem.ic include/dict0types.h \
|
||||
noinst_HEADERS = include/btr0btr.h include/btr0btr.ic \
|
||||
include/btr0cur.h include/btr0cur.ic \
|
||||
include/btr0pcur.h include/btr0pcur.ic \
|
||||
include/btr0sea.h include/btr0sea.ic \
|
||||
include/btr0types.h include/buf0buf.h \
|
||||
include/buf0buf.ic include/buf0flu.h \
|
||||
include/buf0flu.ic include/buf0lru.h \
|
||||
include/buf0lru.ic include/buf0rea.h \
|
||||
include/buf0types.h include/data0data.h \
|
||||
include/data0data.ic include/data0type.h \
|
||||
include/data0type.ic include/data0types.h \
|
||||
include/db0err.h include/dict0boot.h \
|
||||
include/dict0boot.ic include/dict0crea.h \
|
||||
include/dict0crea.ic include/dict0dict.h \
|
||||
include/dict0dict.ic include/dict0load.h \
|
||||
include/dict0load.ic include/dict0mem.h \
|
||||
include/dict0mem.ic include/dict0types.h \
|
||||
include/dyn0dyn.h include/dyn0dyn.ic \
|
||||
include/eval0eval.h include/eval0eval.ic include/eval0proc.h include/eval0proc.ic \
|
||||
include/fil0fil.h include/fsp0fsp.h include/fsp0fsp.ic \
|
||||
include/fut0fut.h include/fut0fut.ic include/fut0lst.h include/fut0lst.ic \
|
||||
include/ha0ha.h include/ha0ha.ic include/hash0hash.h include/hash0hash.ic \
|
||||
include/ibuf0ibuf.h include/ibuf0ibuf.ic include/ibuf0types.h \
|
||||
include/lock0lock.h include/lock0lock.ic include/lock0types.h \
|
||||
include/log0log.h include/log0log.ic include/log0recv.h include/log0recv.ic \
|
||||
include/mach0data.h include/mach0data.ic include/mem0dbg.h include/mem0dbg.ic \
|
||||
include/mem0mem.h include/mem0mem.ic include/mem0pool.h include/mem0pool.ic \
|
||||
include/mtr0log.h include/mtr0log.ic include/mtr0mtr.h include/mtr0mtr.ic \
|
||||
include/eval0eval.h include/eval0eval.ic \
|
||||
include/eval0proc.h include/eval0proc.ic \
|
||||
include/fil0fil.h include/fsp0fsp.h \
|
||||
include/fsp0fsp.ic include/fut0fut.h \
|
||||
include/fut0fut.ic include/fut0lst.h \
|
||||
include/fut0lst.ic include/ha0ha.h \
|
||||
include/ha0ha.ic include/hash0hash.h \
|
||||
include/hash0hash.ic include/ibuf0ibuf.h \
|
||||
include/ibuf0ibuf.ic include/ibuf0types.h \
|
||||
include/lock0lock.h include/lock0lock.ic \
|
||||
include/lock0types.h include/log0log.h \
|
||||
include/log0log.ic include/log0recv.h \
|
||||
include/log0recv.ic include/mach0data.h \
|
||||
include/mach0data.ic include/mem0dbg.h \
|
||||
include/mem0dbg.ic mem/mem0dbg.c \
|
||||
include/mem0mem.h include/mem0mem.ic \
|
||||
include/mem0pool.h include/mem0pool.ic \
|
||||
include/mtr0log.h include/mtr0log.ic \
|
||||
include/mtr0mtr.h include/mtr0mtr.ic \
|
||||
include/mtr0types.h include/os0file.h \
|
||||
include/os0proc.h include/os0proc.ic include/os0sync.h include/os0sync.ic \
|
||||
include/os0proc.h include/os0proc.ic \
|
||||
include/os0sync.h include/os0sync.ic \
|
||||
include/os0thread.h include/os0thread.ic \
|
||||
include/page0cur.h include/page0cur.ic include/page0page.h include/page0page.ic \
|
||||
include/page0types.h \
|
||||
include/pars0grm.h include/pars0opt.h include/pars0opt.ic \
|
||||
include/pars0pars.h include/pars0pars.ic include/pars0sym.h include/pars0sym.ic \
|
||||
include/pars0types.h \
|
||||
include/que0que.h include/que0que.ic include/que0types.h \
|
||||
include/read0read.h include/read0read.ic include/read0types.h \
|
||||
include/rem0cmp.h include/rem0cmp.ic include/rem0rec.h include/rem0rec.ic \
|
||||
include/rem0types.h \
|
||||
include/row0ins.h include/row0ins.ic include/row0mysql.h include/row0mysql.ic \
|
||||
include/row0purge.h include/row0purge.ic include/row0row.h include/row0row.ic \
|
||||
include/row0sel.h include/row0sel.ic include/row0types.h \
|
||||
include/row0uins.h include/row0uins.ic include/row0umod.h include/row0umod.ic \
|
||||
include/row0undo.h include/row0undo.ic include/row0upd.h include/row0upd.ic \
|
||||
include/row0vers.h include/row0vers.ic \
|
||||
include/srv0que.h include/srv0srv.h include/srv0srv.ic include/srv0start.h \
|
||||
include/sync0arr.h include/sync0arr.ic include/sync0rw.h include/sync0rw.ic \
|
||||
include/sync0sync.h include/sync0sync.ic include/sync0types.h \
|
||||
include/page0cur.h include/page0cur.ic \
|
||||
include/page0page.h include/page0page.ic \
|
||||
include/page0types.h include/pars0grm.h \
|
||||
include/pars0opt.h include/pars0opt.ic \
|
||||
include/pars0pars.h include/pars0pars.ic \
|
||||
include/pars0sym.h include/pars0sym.ic \
|
||||
include/pars0types.h include/que0que.h \
|
||||
include/que0que.ic include/que0types.h \
|
||||
include/read0read.h include/read0read.ic \
|
||||
include/read0types.h include/rem0cmp.h \
|
||||
include/rem0cmp.ic include/rem0rec.h \
|
||||
include/rem0rec.ic include/rem0types.h \
|
||||
include/row0ins.h include/row0ins.ic \
|
||||
include/row0mysql.h include/row0mysql.ic \
|
||||
include/row0purge.h include/row0purge.ic \
|
||||
include/row0row.h include/row0row.ic \
|
||||
include/row0sel.h include/row0sel.ic \
|
||||
include/row0types.h include/row0uins.h \
|
||||
include/row0uins.ic include/row0umod.h \
|
||||
include/row0umod.ic include/row0undo.h \
|
||||
include/row0undo.ic include/row0upd.h \
|
||||
include/row0upd.ic include/row0vers.h \
|
||||
include/row0vers.ic include/srv0que.h \
|
||||
include/srv0srv.h include/srv0srv.ic \
|
||||
include/srv0start.h include/sync0arr.h \
|
||||
include/sync0arr.ic include/sync0rw.h \
|
||||
include/sync0rw.ic include/sync0sync.h \
|
||||
include/sync0sync.ic include/sync0types.h \
|
||||
include/thr0loc.h include/thr0loc.ic \
|
||||
include/trx0purge.h include/trx0purge.ic include/trx0rec.h include/trx0rec.ic \
|
||||
include/trx0roll.h include/trx0roll.ic include/trx0rseg.h include/trx0rseg.ic \
|
||||
include/trx0sys.h include/trx0sys.ic include/trx0trx.h include/trx0trx.ic \
|
||||
include/trx0types.h include/trx0undo.h include/trx0undo.ic include/trx0xa.h \
|
||||
include/univ.i include/usr0sess.h include/usr0sess.ic include/usr0types.h \
|
||||
include/ut0byte.h include/ut0byte.ic include/ut0dbg.h include/ut0lst.h \
|
||||
include/ut0mem.h include/ut0mem.ic include/ut0rnd.h include/ut0rnd.ic \
|
||||
handler/ha_innodb.h \
|
||||
include/ut0sort.h include/ut0ut.h include/ut0ut.ic include/ut0vec.h include/ut0vec.ic include/ha_prototypes.h \
|
||||
include/ut0list.h include/ut0list.ic \
|
||||
include/ut0wqueue.h \
|
||||
include/trx0purge.h include/trx0purge.ic \
|
||||
include/trx0rec.h include/trx0rec.ic \
|
||||
include/trx0roll.h include/trx0roll.ic \
|
||||
include/trx0rseg.h include/trx0rseg.ic \
|
||||
include/trx0sys.h include/trx0sys.ic \
|
||||
include/trx0trx.h include/trx0trx.ic \
|
||||
include/trx0types.h include/trx0undo.h \
|
||||
include/trx0undo.ic include/trx0xa.h \
|
||||
include/univ.i include/usr0sess.h \
|
||||
include/usr0sess.ic include/usr0types.h \
|
||||
include/ut0byte.h include/ut0byte.ic \
|
||||
include/ut0dbg.h include/ut0lst.h \
|
||||
include/ut0mem.h include/ut0mem.ic \
|
||||
include/ut0rnd.h include/ut0rnd.ic \
|
||||
include/ut0sort.h include/ut0ut.h \
|
||||
include/ut0ut.ic include/ut0vec.h \
|
||||
include/ut0vec.ic include/ut0list.h \
|
||||
include/ut0list.ic include/ut0wqueue.h \
|
||||
include/ha_prototypes.h handler/ha_innodb.h
|
||||
|
||||
EXTRA_LIBRARIES = libinnobase.a
|
||||
noinst_LIBRARIES = @plugin_innobase_static_target@
|
||||
libinnobase_a_SOURCES = btr/btr0btr.c btr/btr0cur.c btr/btr0pcur.c \
|
||||
btr/btr0sea.c buf/buf0buf.c buf/buf0flu.c \
|
||||
buf/buf0lru.c buf/buf0rea.c data/data0data.c \
|
||||
data/data0type.c dict/dict0boot.c \
|
||||
dict/dict0crea.c dict/dict0dict.c \
|
||||
dict/dict0load.c dict/dict0mem.c dyn/dyn0dyn.c \
|
||||
eval/eval0eval.c eval/eval0proc.c \
|
||||
fil/fil0fil.c fsp/fsp0fsp.c fut/fut0fut.c \
|
||||
fut/fut0lst.c ha/ha0ha.c ha/hash0hash.c \
|
||||
ibuf/ibuf0ibuf.c lock/lock0lock.c \
|
||||
log/log0log.c log/log0recv.c mach/mach0data.c \
|
||||
mem/mem0mem.c mem/mem0pool.c mtr/mtr0log.c \
|
||||
mtr/mtr0mtr.c os/os0file.c os/os0proc.c \
|
||||
os/os0sync.c os/os0thread.c page/page0cur.c \
|
||||
page/page0page.c pars/lexyy.c pars/pars0grm.c \
|
||||
pars/pars0opt.c pars/pars0pars.c \
|
||||
pars/pars0sym.c que/que0que.c read/read0read.c \
|
||||
rem/rem0cmp.c rem/rem0rec.c row/row0ins.c \
|
||||
row/row0mysql.c row/row0purge.c row/row0row.c \
|
||||
row/row0sel.c row/row0uins.c row/row0umod.c \
|
||||
row/row0undo.c row/row0upd.c row/row0vers.c \
|
||||
srv/srv0que.c srv/srv0srv.c srv/srv0start.c \
|
||||
sync/sync0arr.c sync/sync0rw.c \
|
||||
sync/sync0sync.c thr/thr0loc.c trx/trx0purge.c \
|
||||
trx/trx0rec.c trx/trx0roll.c trx/trx0rseg.c \
|
||||
trx/trx0sys.c trx/trx0trx.c trx/trx0undo.c \
|
||||
usr/usr0sess.c ut/ut0byte.c ut/ut0dbg.c \
|
||||
ut/ut0list.c ut/ut0mem.c ut/ut0rnd.c \
|
||||
ut/ut0ut.c ut/ut0vec.c ut/ut0wqueue.c \
|
||||
handler/ha_innodb.cc
|
||||
|
||||
libinnobase_a_CXXFLAGS= $(AM_CFLAGS)
|
||||
libinnobase_a_CFLAGS = $(AM_CFLAGS)
|
||||
|
||||
EXTRA_LTLIBRARIES = ha_innodb.la
|
||||
pkglib_LTLIBRARIES = @plugin_innobase_shared_target@
|
||||
|
||||
ha_innodb_la_LDFLAGS = -module -rpath $(MYSQLLIBdir)
|
||||
ha_innodb_la_CXXFLAGS= $(AM_CFLAGS) -DMYSQL_DYNAMIC_PLUGIN
|
||||
ha_innodb_la_CFLAGS = $(AM_CFLAGS) -DMYSQL_DYNAMIC_PLUGIN
|
||||
ha_innodb_la_SOURCES = $(libinnobase_a_SOURCES)
|
||||
|
||||
EXTRA_DIST = CMakeLists.txt plug.in \
|
||||
pars/make_bison.sh pars/make_flex.sh \
|
||||
pars/pars0grm.y pars/pars0lex.l \
|
||||
CMakeLists.txt plug.in
|
||||
|
||||
noinst_LIBRARIES = libinnobase.a
|
||||
libinnobase_a_LIBADD = usr/libusr.a srv/libsrv.a dict/libdict.a \
|
||||
que/libque.a srv/libsrv.a ibuf/libibuf.a \
|
||||
row/librow.a pars/libpars.a btr/libbtr.a \
|
||||
trx/libtrx.a read/libread.a usr/libusr.a \
|
||||
buf/libbuf.a ibuf/libibuf.a eval/libeval.a \
|
||||
log/liblog.a fsp/libfsp.a fut/libfut.a \
|
||||
fil/libfil.a lock/liblock.a mtr/libmtr.a \
|
||||
page/libpage.a rem/librem.a thr/libthr.a \
|
||||
sync/libsync.a data/libdata.a mach/libmach.a \
|
||||
ha/libha.a dyn/libdyn.a mem/libmem.a \
|
||||
handler/libhandler.a \
|
||||
ut/libut.a os/libos.a ut/libut.a
|
||||
libinnobase_a_SOURCES =
|
||||
|
||||
|
||||
libinnobase.a: $(libinnobase_a_LIBADD)
|
||||
-rm -f $@
|
||||
if test "$(host_os)" = "netware" ; \
|
||||
then \
|
||||
$(libinnobase_a_AR) $@ $(libinnobase_a_LIBADD) ; \
|
||||
else \
|
||||
for arc in $(libinnobase_a_LIBADD); do \
|
||||
arpath=`echo $$arc|sed 's|[^/]*$$||'`; \
|
||||
$(AR) t $$arc|sed "s|^|$$arpath|"; \
|
||||
done | sort -u | xargs $(AR) cq $@ ; \
|
||||
$(RANLIB) $@ ; \
|
||||
fi
|
||||
pars/pars0grm.y pars/pars0lex.l
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
||||
|
@ -1,25 +0,0 @@
|
||||
# Copyright (C) 2001, 2003 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = libbtr.a
|
||||
|
||||
libbtr_a_SOURCES = btr0btr.c btr0cur.c btr0pcur.c btr0sea.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -2606,8 +2606,11 @@ btr_index_rec_validate(
|
||||
|
||||
rec_get_nth_field(rec, offsets, i, &len);
|
||||
|
||||
/* Note that prefix indexes are not fixed size even when
|
||||
their type is CHAR. */
|
||||
/* Note that if fixed_size != 0, it equals the
|
||||
length of a fixed-size column in the clustered index.
|
||||
A prefix index of the column is of fixed, but different
|
||||
length. When fixed_size == 0, prefix_len is the maximum
|
||||
length of the prefix index column. */
|
||||
|
||||
if ((dict_index_get_nth_field(index, i)->prefix_len == 0
|
||||
&& len != UNIV_SQL_NULL && fixed_size
|
||||
|
@ -1,25 +0,0 @@
|
||||
# Copyright (C) 2001, 2003 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = libbuf.a
|
||||
|
||||
libbuf_a_SOURCES = buf0buf.c buf0flu.c buf0lru.c buf0rea.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -1,25 +0,0 @@
|
||||
# Copyright (C) 2001, 2003 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = libdata.a
|
||||
|
||||
libdata_a_SOURCES = data0data.c data0type.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -18,6 +18,8 @@ Created 5/30/1994 Heikki Tuuri
|
||||
#include "dict0dict.h"
|
||||
#include "btr0cur.h"
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
byte data_error; /* data pointers of tuple fields are initialized
|
||||
to point here for error checking */
|
||||
|
@ -190,7 +190,8 @@ dtype_validate(
|
||||
dtype_t* type) /* in: type struct to validate */
|
||||
{
|
||||
ut_a(type);
|
||||
ut_a((type->mtype >= DATA_VARCHAR) && (type->mtype <= DATA_MYSQL));
|
||||
ut_a(type->mtype >= DATA_VARCHAR);
|
||||
ut_a(type->mtype <= DATA_MYSQL);
|
||||
|
||||
if (type->mtype == DATA_SYS) {
|
||||
ut_a((type->prtype & DATA_MYSQL_TYPE_MASK) < DATA_N_SYS_COLS);
|
||||
|
@ -1,26 +0,0 @@
|
||||
# Copyright (C) 2001, 2003 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = libdict.a
|
||||
|
||||
libdict_a_SOURCES = dict0boot.c dict0crea.c dict0dict.c dict0load.c\
|
||||
dict0mem.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -1195,7 +1195,8 @@ dict_create_or_check_foreign_constraint_tables(void)
|
||||
fprintf(stderr, "InnoDB: error %lu in creation\n",
|
||||
(ulong) error);
|
||||
|
||||
ut_a(error == DB_OUT_OF_FILE_SPACE);
|
||||
ut_a(error == DB_OUT_OF_FILE_SPACE
|
||||
|| error == DB_TOO_MANY_CONCURRENT_TRXS);
|
||||
|
||||
fprintf(stderr,
|
||||
"InnoDB: creation failed\n"
|
||||
|
@ -30,6 +30,8 @@ Created 1/8/1996 Heikki Tuuri
|
||||
# include "m_ctype.h" /* my_isspace() */
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
dict_sys_t* dict_sys = NULL; /* the dictionary system */
|
||||
|
||||
rw_lock_t dict_operation_lock; /* table create, drop, etc. reserve
|
||||
@ -1529,6 +1531,12 @@ dict_index_add_col(
|
||||
if (field->fixed_len > DICT_MAX_INDEX_COL_LEN) {
|
||||
field->fixed_len = 0;
|
||||
}
|
||||
#if DICT_MAX_INDEX_COL_LEN != 768
|
||||
/* The comparison limit above must be constant. If it were
|
||||
changed, the disk format of some fixed-length columns would
|
||||
change, which would be a disaster. */
|
||||
# error "DICT_MAX_INDEX_COL_LEN != 768"
|
||||
#endif
|
||||
|
||||
if (!(col->prtype & DATA_NOT_NULL)) {
|
||||
index->n_nullable++;
|
||||
@ -1585,9 +1593,6 @@ dict_index_copy_types(
|
||||
ifield = dict_index_get_nth_field(index, i);
|
||||
dfield_type = dfield_get_type(dtuple_get_nth_field(tuple, i));
|
||||
dict_col_copy_type(dict_field_get_col(ifield), dfield_type);
|
||||
if (UNIV_UNLIKELY(ifield->prefix_len)) {
|
||||
dfield_type->len = ifield->prefix_len;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -3361,7 +3366,8 @@ dict_create_foreign_constraints(
|
||||
ulint err;
|
||||
mem_heap_t* heap;
|
||||
|
||||
ut_a(trx && trx->mysql_thd);
|
||||
ut_a(trx);
|
||||
ut_a(trx->mysql_thd);
|
||||
|
||||
str = dict_strip_comments(sql_string);
|
||||
heap = mem_heap_create(10000);
|
||||
@ -3403,7 +3409,8 @@ dict_foreign_parse_drop_constraints(
|
||||
FILE* ef = dict_foreign_err_file;
|
||||
struct charset_info_st* cs;
|
||||
|
||||
ut_a(trx && trx->mysql_thd);
|
||||
ut_a(trx);
|
||||
ut_a(trx->mysql_thd);
|
||||
|
||||
cs = innobase_get_charset(trx->mysql_thd);
|
||||
|
||||
@ -3712,7 +3719,7 @@ dict_index_calc_min_rec_len(
|
||||
}
|
||||
|
||||
/* round the NULL flags up to full bytes */
|
||||
sum += (nullable + 7) / 8;
|
||||
sum += UT_BITS_IN_BYTES(nullable);
|
||||
|
||||
return(sum);
|
||||
}
|
||||
|
@ -1,25 +0,0 @@
|
||||
# Copyright (C) 2001, 2003 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = libdyn.a
|
||||
|
||||
libdyn_a_SOURCES = dyn0dyn.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -1,25 +0,0 @@
|
||||
# Copyright (C) 2001, 2003 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = libeval.a
|
||||
|
||||
libeval_a_SOURCES = eval0eval.c eval0proc.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -1,25 +0,0 @@
|
||||
# Copyright (C) 2001, 2003 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = libfil.a
|
||||
|
||||
libfil_a_SOURCES = fil0fil.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -1,26 +0,0 @@
|
||||
# Copyright (C) 2001, 2003 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = libfsp.a
|
||||
|
||||
libfsp_a_SOURCES = fsp0fsp.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -205,10 +205,9 @@ the extent are free and which contain old tuple version to clean. */
|
||||
space */
|
||||
#define XDES_FSEG 4 /* extent belongs to a segment */
|
||||
|
||||
/* File extent data structure size in bytes. The "+ 7 ) / 8" part in the
|
||||
definition rounds the number of bytes upward. */
|
||||
/* File extent data structure size in bytes. */
|
||||
#define XDES_SIZE \
|
||||
(XDES_BITMAP + (FSP_EXTENT_SIZE * XDES_BITS_PER_PAGE + 7) / 8)
|
||||
(XDES_BITMAP + UT_BITS_IN_BYTES(FSP_EXTENT_SIZE * XDES_BITS_PER_PAGE))
|
||||
|
||||
/* Offset of the descriptor array on a descriptor page */
|
||||
#define XDES_ARR_OFFSET (FSP_HEADER_OFFSET + FSP_HEADER_SIZE)
|
||||
@ -3649,7 +3648,11 @@ fsp_validate(
|
||||
n_full_frag_pages = FSP_EXTENT_SIZE
|
||||
* flst_get_len(header + FSP_FULL_FRAG, &mtr);
|
||||
|
||||
ut_a(free_limit <= size || (space != 0 && size < FSP_EXTENT_SIZE));
|
||||
if (UNIV_UNLIKELY(free_limit > size)) {
|
||||
|
||||
ut_a(space != 0);
|
||||
ut_a(size < FSP_EXTENT_SIZE);
|
||||
}
|
||||
|
||||
flst_validate(header + FSP_FREE, &mtr);
|
||||
flst_validate(header + FSP_FREE_FRAG, &mtr);
|
||||
|
@ -1,25 +0,0 @@
|
||||
# Copyright (C) 2001, 2003 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = libfut.a
|
||||
|
||||
libfut_a_SOURCES = fut0fut.c fut0lst.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -1,25 +0,0 @@
|
||||
# Copyright (C) 2001, 2003 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = libha.a
|
||||
|
||||
libha_a_SOURCES = ha0ha.c hash0hash.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -1,28 +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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
DEFS = -DMYSQL_SERVER @DEFS@
|
||||
|
||||
noinst_LIBRARIES = libhandler.a
|
||||
|
||||
libhandler_a_SOURCES = ha_innodb.cc
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
File diff suppressed because it is too large
Load Diff
@ -190,27 +190,50 @@ class ha_innobase: public handler
|
||||
uint table_changes);
|
||||
};
|
||||
|
||||
extern long innobase_mirrored_log_groups, innobase_log_files_in_group;
|
||||
extern long long innobase_buffer_pool_size, innobase_log_file_size;
|
||||
extern long innobase_log_buffer_size;
|
||||
extern long innobase_additional_mem_pool_size;
|
||||
extern long innobase_buffer_pool_awe_mem_mb;
|
||||
extern long innobase_file_io_threads, innobase_lock_wait_timeout;
|
||||
extern long innobase_force_recovery;
|
||||
extern long innobase_open_files;
|
||||
extern char *innobase_data_home_dir, *innobase_data_file_path;
|
||||
extern char *innobase_log_group_home_dir, *innobase_log_arch_dir;
|
||||
extern char *innobase_unix_file_flush_method;
|
||||
/* Some accessor functions which the InnoDB plugin needs, but which
|
||||
can not be added to mysql/plugin.h as part of the public interface;
|
||||
the definitions are bracketed with #ifdef INNODB_COMPATIBILITY_HOOKS */
|
||||
|
||||
#ifndef INNODB_COMPATIBILITY_HOOKS
|
||||
#error InnoDB needs MySQL to be built with #define INNODB_COMPATIBILITY_HOOKS
|
||||
#endif
|
||||
|
||||
extern "C" {
|
||||
extern ulong srv_max_buf_pool_modified_pct;
|
||||
extern ulong srv_max_purge_lag;
|
||||
extern ulong srv_auto_extend_increment;
|
||||
extern ulong srv_n_spin_wait_rounds;
|
||||
extern ulong srv_n_free_tickets_to_enter;
|
||||
extern ulong srv_thread_sleep_delay;
|
||||
extern ulong srv_thread_concurrency;
|
||||
extern ulong srv_commit_concurrency;
|
||||
extern ulong srv_flush_log_at_trx_commit;
|
||||
struct charset_info_st *thd_charset(MYSQL_THD thd);
|
||||
char **thd_query(MYSQL_THD thd);
|
||||
|
||||
/** Get the file name of the MySQL binlog.
|
||||
* @return the name of the binlog file
|
||||
*/
|
||||
const char* mysql_bin_log_file_name(void);
|
||||
|
||||
/** Get the current position of the MySQL binlog.
|
||||
* @return byte offset from the beginning of the binlog
|
||||
*/
|
||||
ulonglong mysql_bin_log_file_pos(void);
|
||||
|
||||
/**
|
||||
Check if a user thread is a replication slave thread
|
||||
@param thd user thread
|
||||
@retval 0 the user thread is not a replication slave thread
|
||||
@retval 1 the user thread is a replication slave thread
|
||||
*/
|
||||
int thd_slave_thread(const MYSQL_THD thd);
|
||||
|
||||
/**
|
||||
Check if a user thread is running a non-transactional update
|
||||
@param thd user thread
|
||||
@retval 0 the user thread is not running a non-transactional update
|
||||
@retval 1 the user thread is running a non-transactional update
|
||||
*/
|
||||
int thd_non_transactional_update(const MYSQL_THD thd);
|
||||
|
||||
/**
|
||||
Get the user thread's binary logging format
|
||||
@param thd user thread
|
||||
@return Value to be used as index into the binlog_format_names array
|
||||
*/
|
||||
int thd_binlog_format(const MYSQL_THD thd);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1,25 +0,0 @@
|
||||
# Copyright (C) 2001, 2003 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = libibuf.a
|
||||
|
||||
libibuf_a_SOURCES = ibuf0ibuf.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -150,9 +150,30 @@ ulint ibuf_flush_count = 0;
|
||||
#define IBUF_COUNT_N_PAGES 2000
|
||||
|
||||
/* Buffered entry counts for file pages, used in debugging */
|
||||
static ulint* ibuf_counts[IBUF_COUNT_N_SPACES];
|
||||
static ulint ibuf_counts[IBUF_COUNT_N_SPACES][IBUF_COUNT_N_PAGES];
|
||||
|
||||
static ibool ibuf_counts_inited = FALSE;
|
||||
/**********************************************************************
|
||||
Checks that the indexes to ibuf_counts[][] are within limits. */
|
||||
UNIV_INLINE
|
||||
void
|
||||
ibuf_count_check(
|
||||
/*=============*/
|
||||
ulint space_id, /* in: space identifier */
|
||||
ulint page_no) /* in: page number */
|
||||
{
|
||||
if (space_id < IBUF_COUNT_N_SPACES && page_no < IBUF_COUNT_N_PAGES) {
|
||||
return;
|
||||
}
|
||||
|
||||
fprintf(stderr,
|
||||
"InnoDB: UNIV_IBUF_DEBUG limits space_id and page_no\n"
|
||||
"InnoDB: and breaks crash recovery.\n"
|
||||
"InnoDB: space_id=%lu, should be 0<=space_id<%lu\n"
|
||||
"InnoDB: page_no=%lu, should be 0<=page_no<%lu\n",
|
||||
(ulint) space_id, (ulint) IBUF_COUNT_N_SPACES,
|
||||
(ulint) page_no, (ulint) IBUF_COUNT_N_PAGES);
|
||||
ut_error;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* The start address for an insert buffer bitmap page bitmap */
|
||||
@ -328,15 +349,9 @@ ibuf_count_get(
|
||||
ulint space, /* in: space id */
|
||||
ulint page_no)/* in: page number */
|
||||
{
|
||||
ut_ad(space < IBUF_COUNT_N_SPACES);
|
||||
ut_ad(page_no < IBUF_COUNT_N_PAGES);
|
||||
ibuf_count_check(space, page_no);
|
||||
|
||||
if (!ibuf_counts_inited) {
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
return(*(ibuf_counts[space] + page_no));
|
||||
return(ibuf_counts[space][page_no]);
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
@ -349,11 +364,10 @@ ibuf_count_set(
|
||||
ulint page_no,/* in: page number */
|
||||
ulint val) /* in: value to set */
|
||||
{
|
||||
ut_a(space < IBUF_COUNT_N_SPACES);
|
||||
ut_a(page_no < IBUF_COUNT_N_PAGES);
|
||||
ibuf_count_check(space, page_no);
|
||||
ut_a(val < UNIV_PAGE_SIZE);
|
||||
|
||||
*(ibuf_counts[space] + page_no) = val;
|
||||
ibuf_counts[space][page_no] = val;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -378,22 +392,6 @@ ibuf_init_at_db_start(void)
|
||||
|
||||
ibuf->size = 0;
|
||||
|
||||
#ifdef UNIV_IBUF_DEBUG
|
||||
{
|
||||
ulint i, j;
|
||||
|
||||
for (i = 0; i < IBUF_COUNT_N_SPACES; i++) {
|
||||
|
||||
ibuf_counts[i] = mem_alloc(sizeof(ulint)
|
||||
* IBUF_COUNT_N_PAGES);
|
||||
for (j = 0; j < IBUF_COUNT_N_PAGES; j++) {
|
||||
ibuf_count_set(i, j, 0);
|
||||
}
|
||||
}
|
||||
|
||||
ibuf_counts_inited = TRUE;
|
||||
}
|
||||
#endif
|
||||
mutex_create(&ibuf_pessimistic_insert_mutex,
|
||||
SYNC_IBUF_PESS_INSERT_MUTEX);
|
||||
|
||||
@ -567,7 +565,8 @@ ibuf_bitmap_page_init(
|
||||
|
||||
bit_offset = XDES_DESCRIBED_PER_PAGE * IBUF_BITS_PER_PAGE;
|
||||
|
||||
byte_offset = bit_offset / 8 + 1; /* better: (bit_offset + 7) / 8 */
|
||||
byte_offset = bit_offset / 8 + 1;
|
||||
/* better: byte_offset = UT_BITS_IN_BYTES(bit_offset); */
|
||||
|
||||
fil_page_set_type(page, FIL_PAGE_IBUF_BITMAP);
|
||||
|
||||
@ -1441,6 +1440,9 @@ ibuf_entry_build(
|
||||
*buf2++ = 0; /* write the compact format indicator */
|
||||
}
|
||||
for (i = 0; i < n_fields; i++) {
|
||||
ulint fixed_len;
|
||||
const dict_field_t* ifield;
|
||||
|
||||
/* We add 4 below because we have the 4 extra fields at the
|
||||
start of an ibuf record */
|
||||
|
||||
@ -1448,10 +1450,30 @@ ibuf_entry_build(
|
||||
entry_field = dtuple_get_nth_field(entry, i);
|
||||
dfield_copy(field, entry_field);
|
||||
|
||||
ifield = dict_index_get_nth_field(index, i);
|
||||
/* Prefix index columns of fixed-length columns are of
|
||||
fixed length. However, in the function call below,
|
||||
dfield_get_type(entry_field) contains the fixed length
|
||||
of the column in the clustered index. Replace it with
|
||||
the fixed length of the secondary index column. */
|
||||
fixed_len = ifield->fixed_len;
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
if (fixed_len) {
|
||||
/* dict_index_add_col() should guarantee these */
|
||||
ut_ad(fixed_len <= (ulint) entry_field->type.len);
|
||||
if (ifield->prefix_len) {
|
||||
ut_ad(ifield->prefix_len == fixed_len);
|
||||
} else {
|
||||
ut_ad(fixed_len
|
||||
== (ulint) entry_field->type.len);
|
||||
}
|
||||
}
|
||||
#endif /* UNIV_DEBUG */
|
||||
|
||||
dtype_new_store_for_order_and_null_size(
|
||||
buf2 + i * DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE,
|
||||
dfield_get_type(entry_field),
|
||||
dict_index_get_nth_field(index, i)->prefix_len);
|
||||
dfield_get_type(entry_field), fixed_len);
|
||||
}
|
||||
|
||||
/* Store the type info in buf2 to field 3 of tuple */
|
||||
|
@ -1,10 +0,0 @@
|
||||
# Makefile included in Makefile.am in every subdirectory
|
||||
|
||||
INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include \
|
||||
-I$(top_srcdir)/regex \
|
||||
-I$(top_srcdir)/storage/innobase/include \
|
||||
-I$(top_srcdir)/sql \
|
||||
-I$(srcdir)
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -62,6 +62,11 @@ Created 5/24/1996 Heikki Tuuri
|
||||
lead to a duplicate key in some
|
||||
table */
|
||||
|
||||
#define DB_TOO_MANY_CONCURRENT_TRXS 47 /* when InnoDB runs out of the
|
||||
preconfigured undo slots, this can
|
||||
only happen when there are too many
|
||||
concurrent transactions */
|
||||
|
||||
/* The following are partial failure codes */
|
||||
#define DB_FAIL 1000
|
||||
#define DB_OVERFLOW 1001
|
||||
|
@ -92,6 +92,17 @@ dict_col_copy_type_noninline(
|
||||
/*=========================*/
|
||||
const dict_col_t* col, /* in: column */
|
||||
dtype_t* type); /* out: data type */
|
||||
#ifdef UNIV_DEBUG
|
||||
/*************************************************************************
|
||||
Assert that a column and a data type match. */
|
||||
UNIV_INLINE
|
||||
ibool
|
||||
dict_col_type_assert_equal(
|
||||
/*=======================*/
|
||||
/* out: TRUE */
|
||||
const dict_col_t* col, /* in: column */
|
||||
const dtype_t* type); /* in: data type */
|
||||
#endif /* UNIV_DEBUG */
|
||||
/***************************************************************************
|
||||
Returns the minimum size of the column. */
|
||||
UNIV_INLINE
|
||||
|
@ -30,6 +30,30 @@ dict_col_copy_type(
|
||||
type->mbmaxlen = col->mbmaxlen;
|
||||
}
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
/*************************************************************************
|
||||
Assert that a column and a data type match. */
|
||||
UNIV_INLINE
|
||||
ibool
|
||||
dict_col_type_assert_equal(
|
||||
/*=======================*/
|
||||
/* out: TRUE */
|
||||
const dict_col_t* col, /* in: column */
|
||||
const dtype_t* type) /* in: data type */
|
||||
{
|
||||
ut_ad(col);
|
||||
ut_ad(type);
|
||||
|
||||
ut_ad(col->mtype == type->mtype);
|
||||
ut_ad(col->prtype == type->prtype);
|
||||
ut_ad(col->len == type->len);
|
||||
ut_ad(col->mbminlen == type->mbminlen);
|
||||
ut_ad(col->mbmaxlen == type->mbmaxlen);
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
#endif /* UNIV_DEBUG */
|
||||
|
||||
/***************************************************************************
|
||||
Returns the minimum size of the column. */
|
||||
UNIV_INLINE
|
||||
|
@ -158,10 +158,13 @@ struct dict_col_struct{
|
||||
of an index */
|
||||
};
|
||||
|
||||
/* DICT_MAX_INDEX_COL_LEN is measured in bytes and is the max index column
|
||||
length + 1. Starting from 4.1.6, we set it to < 3 * 256, so that one can
|
||||
create a column prefix index on 255 characters of a TEXT field also in the
|
||||
UTF-8 charset. In that charset, a character may take at most 3 bytes. */
|
||||
/* DICT_MAX_INDEX_COL_LEN is measured in bytes and is the maximum
|
||||
indexed column length (or indexed prefix length). It is set to 3*256,
|
||||
so that one can create a column prefix index on 256 characters of a
|
||||
TEXT or VARCHAR column also in the UTF-8 charset. In that charset,
|
||||
a character may take at most 3 bytes.
|
||||
This constant MUST NOT BE CHANGED, or the compatibility of InnoDB data
|
||||
files would be at risk! */
|
||||
|
||||
#define DICT_MAX_INDEX_COL_LEN 768
|
||||
|
||||
|
@ -1,6 +1,9 @@
|
||||
#ifndef HA_INNODB_PROTOTYPES_H
|
||||
#define HA_INNODB_PROTOTYPES_H
|
||||
|
||||
#include "univ.i" /* ulint, uint */
|
||||
#include "m_ctype.h" /* CHARSET_INFO */
|
||||
|
||||
/* Prototypes for global functions in ha_innodb.cc that are called by
|
||||
InnoDB's C-code. */
|
||||
|
||||
@ -19,4 +22,30 @@ innobase_convert_string(
|
||||
CHARSET_INFO* from_cs,
|
||||
uint* errors);
|
||||
|
||||
/**********************************************************************
|
||||
Returns true if the thread is the replication thread on the slave
|
||||
server. Used in srv_conc_enter_innodb() to determine if the thread
|
||||
should be allowed to enter InnoDB - the replication thread is treated
|
||||
differently than other threads. Also used in
|
||||
srv_conc_force_exit_innodb(). */
|
||||
|
||||
ibool
|
||||
thd_is_replication_slave_thread(
|
||||
/*============================*/
|
||||
/* out: true if thd is the replication thread */
|
||||
void* thd); /* in: thread handle (THD*) */
|
||||
|
||||
/**********************************************************************
|
||||
Returns true if the transaction this thread is processing has edited
|
||||
non-transactional tables. Used by the deadlock detector when deciding
|
||||
which transaction to rollback in case of a deadlock - we try to avoid
|
||||
rolling back transactions that have edited non-transactional tables. */
|
||||
|
||||
ibool
|
||||
thd_has_edited_nontrans_tables(
|
||||
/*===========================*/
|
||||
/* out: true if non-transactional tables have
|
||||
been edited */
|
||||
void* thd); /* in: thread handle (THD*) */
|
||||
|
||||
#endif
|
||||
|
@ -94,7 +94,8 @@ log. */
|
||||
#define OS_FILE_PATH_ERROR 74
|
||||
#define OS_FILE_AIO_RESOURCES_RESERVED 75 /* wait for OS aio resources
|
||||
to become available again */
|
||||
#define OS_FILE_ERROR_NOT_SPECIFIED 76
|
||||
#define OS_FILE_SHARING_VIOLATION 76
|
||||
#define OS_FILE_ERROR_NOT_SPECIFIED 77
|
||||
|
||||
/* Types for aio operations */
|
||||
#define OS_FILE_READ 10
|
||||
|
@ -795,7 +795,8 @@ UNIV_INLINE
|
||||
void
|
||||
rec_offs_set_n_alloc(
|
||||
/*=================*/
|
||||
ulint* offsets, /* in: array for rec_get_offsets() */
|
||||
ulint* offsets, /* out: array for rec_get_offsets(),
|
||||
must be allocated */
|
||||
ulint n_alloc) /* in: number of elements */
|
||||
{
|
||||
ut_ad(offsets);
|
||||
@ -1282,7 +1283,8 @@ UNIV_INLINE
|
||||
void
|
||||
rec_offs_set_n_fields(
|
||||
/*==================*/
|
||||
ulint* offsets, /* in: array returned by rec_get_offsets() */
|
||||
ulint* offsets, /* in/out: array returned by
|
||||
rec_get_offsets() */
|
||||
ulint n_fields) /* in: number of fields */
|
||||
{
|
||||
ut_ad(offsets);
|
||||
|
@ -460,6 +460,19 @@ row_check_table_for_mysql(
|
||||
/* out: DB_ERROR or DB_SUCCESS */
|
||||
row_prebuilt_t* prebuilt); /* in: prebuilt struct in MySQL
|
||||
handle */
|
||||
/*************************************************************************
|
||||
Get the min of the maximum possible row sizes. */
|
||||
|
||||
ulint
|
||||
page_get_free_space_of_empty_noninline(
|
||||
/*===================================*/
|
||||
/* out: The (approx) maximum size
|
||||
of a row, this is a conservative
|
||||
estimate, since the size can be
|
||||
slightly larger depending upon
|
||||
the ROW_FORMAT setting.*/
|
||||
dict_table_t* table); /* in: table for which max record
|
||||
size required.*/
|
||||
|
||||
/* A struct describing a place for an individual column in the MySQL
|
||||
row format which is presented to the table handler in ha_innobase.
|
||||
|
@ -371,6 +371,18 @@ trx_is_interrupted(
|
||||
#define trx_is_interrupted(trx) FALSE
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
|
||||
/***********************************************************************
|
||||
Compares the "weight" (or size) of two transactions. The weight of one
|
||||
transaction is estimated as the number of altered rows + the number of
|
||||
locked rows. Transactions that have edited non-transactional tables are
|
||||
considered heavier than ones that have not. */
|
||||
|
||||
int
|
||||
trx_weight_cmp(
|
||||
/*===========*/
|
||||
/* out: <0, 0 or >0; similar to strcmp(3) */
|
||||
trx_t* a, /* in: the first transaction to be compared */
|
||||
trx_t* b); /* in: the second transaction to be compared */
|
||||
|
||||
/* Signal to a transaction */
|
||||
struct trx_sig_struct{
|
||||
@ -453,7 +465,8 @@ struct trx_struct{
|
||||
dulint table_id; /* table id if the preceding field is
|
||||
TRUE */
|
||||
/*------------------------------*/
|
||||
int active_trans; /* 1 - if a transaction in MySQL
|
||||
unsigned duplicates:2; /* TRX_DUP_IGNORE | TRX_DUP_REPLACE */
|
||||
unsigned active_trans:2; /* 1 - if a transaction in MySQL
|
||||
is active. 2 - if prepare_commit_mutex
|
||||
was taken */
|
||||
void* mysql_thd; /* MySQL thread handle corresponding
|
||||
@ -610,7 +623,7 @@ struct trx_struct{
|
||||
NULL */
|
||||
ibool was_chosen_as_deadlock_victim;
|
||||
/* when the transaction decides to wait
|
||||
for a lock, this it sets this to FALSE;
|
||||
for a lock, it sets this to FALSE;
|
||||
if another transaction chooses this
|
||||
transaction as a victim in deadlock
|
||||
resolution, it sets this to TRUE */
|
||||
@ -651,7 +664,12 @@ struct trx_struct{
|
||||
cannot be any activity in the undo
|
||||
logs! */
|
||||
dulint undo_no; /* next undo log record number to
|
||||
assign */
|
||||
assign; since the undo log is
|
||||
private for a transaction, this
|
||||
is a simple ascending sequence
|
||||
with no gaps; thus it represents
|
||||
the number of modified/inserted
|
||||
rows in a transaction */
|
||||
trx_savept_t last_sql_stat_start;
|
||||
/* undo_no when the last sql statement
|
||||
was started: in case of an error, trx
|
||||
@ -681,19 +699,19 @@ struct trx_struct{
|
||||
single operation of a
|
||||
transaction, e.g., a parallel
|
||||
query */
|
||||
/* Transaction concurrency states */
|
||||
/* Transaction concurrency states (trx->conc_state) */
|
||||
#define TRX_NOT_STARTED 1
|
||||
#define TRX_ACTIVE 2
|
||||
#define TRX_COMMITTED_IN_MEMORY 3
|
||||
#define TRX_PREPARED 4 /* Support for 2PC/XA */
|
||||
|
||||
/* Transaction execution states when trx state is TRX_ACTIVE */
|
||||
/* Transaction execution states when trx->conc_state == TRX_ACTIVE */
|
||||
#define TRX_QUE_RUNNING 1 /* transaction is running */
|
||||
#define TRX_QUE_LOCK_WAIT 2 /* transaction is waiting for a lock */
|
||||
#define TRX_QUE_ROLLING_BACK 3 /* transaction is rolling back */
|
||||
#define TRX_QUE_COMMITTING 4 /* transaction is committing */
|
||||
|
||||
/* Transaction isolation levels */
|
||||
/* Transaction isolation levels (trx->isolation_level) */
|
||||
#define TRX_ISO_READ_UNCOMMITTED 1 /* dirty read: non-locking
|
||||
SELECTs are performed so that
|
||||
we do not look at a possible
|
||||
@ -728,6 +746,12 @@ struct trx_struct{
|
||||
converted to LOCK IN SHARE
|
||||
MODE reads */
|
||||
|
||||
/* Treatment of duplicate values (trx->duplicates; for example, in inserts).
|
||||
Multiple flags can be combined with bitwise OR. */
|
||||
#define TRX_DUP_IGNORE 1 /* duplicate rows are to be updated */
|
||||
#define TRX_DUP_REPLACE 2 /* duplicate rows are to be replaced */
|
||||
|
||||
|
||||
/* Types of a trx signal */
|
||||
#define TRX_SIG_NO_SIGNAL 100
|
||||
#define TRX_SIG_TOTAL_ROLLBACK 1
|
||||
|
@ -222,11 +222,14 @@ trx_undo_lists_init(
|
||||
Assigns an undo log for a transaction. A new undo log is created or a cached
|
||||
undo log reused. */
|
||||
|
||||
trx_undo_t*
|
||||
ulint
|
||||
trx_undo_assign_undo(
|
||||
/*=================*/
|
||||
/* out: the undo log, NULL if did not succeed: out of
|
||||
space */
|
||||
/* out: DB_SUCCESS if undo log assign
|
||||
* successful, possible error codes are:
|
||||
* ER_TOO_MANY_CONCURRENT_TRXS
|
||||
* DB_OUT_OF_FILE_SPAC
|
||||
* DB_OUT_OF_MEMORY */
|
||||
trx_t* trx, /* in: transaction */
|
||||
ulint type); /* in: TRX_UNDO_INSERT or TRX_UNDO_UPDATE */
|
||||
/**********************************************************************
|
||||
|
@ -121,6 +121,11 @@ ut_2_power_up(
|
||||
/* out: first power of 2 which is >= n */
|
||||
ulint n) /* in: number != 0 */
|
||||
__attribute__((const));
|
||||
|
||||
/* Determine how many bytes (groups of 8 bits) are needed to
|
||||
store the given number of bits. */
|
||||
#define UT_BITS_IN_BYTES(b) (((b) + 7) / 8)
|
||||
|
||||
/****************************************************************
|
||||
Sort function for ulint arrays. */
|
||||
|
||||
|
@ -1,25 +0,0 @@
|
||||
# Copyright (C) 2001, 2003 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = liblock.a
|
||||
|
||||
liblock_a_SOURCES = lock0lock.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -3174,7 +3174,8 @@ lock_deadlock_occurs(
|
||||
ulint ret;
|
||||
ulint cost = 0;
|
||||
|
||||
ut_ad(trx && lock);
|
||||
ut_ad(trx);
|
||||
ut_ad(lock);
|
||||
ut_ad(mutex_own(&kernel_mutex));
|
||||
retry:
|
||||
/* We check that adding this trx to the waits-for graph
|
||||
@ -3246,7 +3247,9 @@ lock_deadlock_recursive(
|
||||
trx_t* lock_trx;
|
||||
ulint ret;
|
||||
|
||||
ut_a(trx && start && wait_lock);
|
||||
ut_a(trx);
|
||||
ut_a(start);
|
||||
ut_a(wait_lock);
|
||||
ut_ad(mutex_own(&kernel_mutex));
|
||||
|
||||
if (trx->deadlock_mark == 1) {
|
||||
@ -3357,8 +3360,8 @@ lock_deadlock_recursive(
|
||||
return(LOCK_VICTIM_IS_START);
|
||||
}
|
||||
|
||||
if (ut_dulint_cmp(wait_lock->trx->undo_no,
|
||||
start->undo_no) >= 0) {
|
||||
if (trx_weight_cmp(wait_lock->trx,
|
||||
start) >= 0) {
|
||||
/* Our recursion starting point
|
||||
transaction is 'smaller', let us
|
||||
choose 'start' as the victim and roll
|
||||
@ -4423,12 +4426,9 @@ lock_table_queue_validate(
|
||||
dict_table_t* table) /* in: table */
|
||||
{
|
||||
lock_t* lock;
|
||||
ibool is_waiting;
|
||||
|
||||
ut_ad(mutex_own(&kernel_mutex));
|
||||
|
||||
is_waiting = FALSE;
|
||||
|
||||
lock = UT_LIST_GET_FIRST(table->locks);
|
||||
|
||||
while (lock) {
|
||||
@ -4438,13 +4438,10 @@ lock_table_queue_validate(
|
||||
|
||||
if (!lock_get_wait(lock)) {
|
||||
|
||||
ut_a(!is_waiting);
|
||||
|
||||
ut_a(!lock_table_other_has_incompatible(
|
||||
lock->trx, 0, table,
|
||||
lock_get_mode(lock)));
|
||||
} else {
|
||||
is_waiting = TRUE;
|
||||
|
||||
ut_a(lock_table_has_to_wait_in_queue(lock));
|
||||
}
|
||||
|
@ -1,25 +0,0 @@
|
||||
# Copyright (C) 2001, 2003 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = liblog.a
|
||||
|
||||
liblog_a_SOURCES = log0log.c log0recv.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -3039,10 +3039,22 @@ loop:
|
||||
|
||||
mutex_enter(&kernel_mutex);
|
||||
|
||||
/* Check that there are no longer transactions. We need this wait
|
||||
even for the 'very fast' shutdown, because the InnoDB layer may have
|
||||
committed or prepared transactions and we don't want to lose
|
||||
them. */
|
||||
/* We need the monitor threads to stop before we proceed with a
|
||||
normal shutdown. In case of very fast shutdown, however, we can
|
||||
proceed without waiting for monitor threads. */
|
||||
|
||||
if (srv_fast_shutdown < 2
|
||||
&& (srv_error_monitor_active
|
||||
|| srv_lock_timeout_and_monitor_active)) {
|
||||
|
||||
mutex_exit(&kernel_mutex);
|
||||
|
||||
goto loop;
|
||||
}
|
||||
|
||||
/* Check that there are no longer transactions. We need this wait even
|
||||
for the 'very fast' shutdown, because the InnoDB layer may have
|
||||
committed or prepared transactions and we don't want to lose them. */
|
||||
|
||||
if (trx_n_mysql_transactions > 0
|
||||
|| UT_LIST_GET_LEN(trx_sys->trx_list) > 0) {
|
||||
@ -3163,22 +3175,8 @@ loop:
|
||||
goto loop;
|
||||
}
|
||||
|
||||
/* The lock timeout thread should now have exited */
|
||||
|
||||
if (srv_lock_timeout_and_monitor_active) {
|
||||
|
||||
goto loop;
|
||||
}
|
||||
|
||||
/* We now let also the InnoDB error monitor thread to exit */
|
||||
|
||||
srv_shutdown_state = SRV_SHUTDOWN_LAST_PHASE;
|
||||
|
||||
if (srv_error_monitor_active) {
|
||||
|
||||
goto loop;
|
||||
}
|
||||
|
||||
/* Make some checks that the server really is quiet */
|
||||
ut_a(srv_n_threads_active[SRV_MASTER] == 0);
|
||||
ut_a(buf_all_freed());
|
||||
|
@ -1,25 +0,0 @@
|
||||
# Copyright (C) 2001, 2003 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = libmach.a
|
||||
|
||||
libmach_a_SOURCES = mach0data.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -1,27 +0,0 @@
|
||||
# Copyright (C) 2001, 2003 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = libmem.a
|
||||
|
||||
libmem_a_SOURCES = mem0mem.c mem0pool.c
|
||||
|
||||
EXTRA_DIST = mem0dbg.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -1,25 +0,0 @@
|
||||
# Copyright (C) 2001, 2003 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = libmtr.a
|
||||
|
||||
libmtr_a_SOURCES = mtr0mtr.c mtr0log.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -1,25 +0,0 @@
|
||||
# Copyright (C) 2001, 2003-2004 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = libos.a
|
||||
|
||||
libos_a_SOURCES = os0proc.c os0sync.c os0thread.c os0file.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -250,6 +250,15 @@ os_file_get_last_error(
|
||||
"InnoDB: the directory. It may also be"
|
||||
" you have created a subdirectory\n"
|
||||
"InnoDB: of the same name as a data file.\n");
|
||||
} else if (err == ERROR_SHARING_VIOLATION
|
||||
|| err == ERROR_LOCK_VIOLATION) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: The error means that another program"
|
||||
" is using InnoDB's files.\n"
|
||||
"InnoDB: This might be a backup or antivirus"
|
||||
" software or another instance\n"
|
||||
"InnoDB: of MySQL."
|
||||
" Please close it to get rid of this error.\n");
|
||||
} else {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Some operating system error numbers"
|
||||
@ -268,6 +277,9 @@ os_file_get_last_error(
|
||||
return(OS_FILE_DISK_FULL);
|
||||
} else if (err == ERROR_FILE_EXISTS) {
|
||||
return(OS_FILE_ALREADY_EXISTS);
|
||||
} else if (err == ERROR_SHARING_VIOLATION
|
||||
|| err == ERROR_LOCK_VIOLATION) {
|
||||
return(OS_FILE_SHARING_VIOLATION);
|
||||
} else {
|
||||
return(100 + err);
|
||||
}
|
||||
@ -388,6 +400,10 @@ os_file_handle_error_cond_exit(
|
||||
|| err == OS_FILE_PATH_ERROR) {
|
||||
|
||||
return(FALSE);
|
||||
} else if (err == OS_FILE_SHARING_VIOLATION) {
|
||||
|
||||
os_thread_sleep(10000000); /* 10 sec */
|
||||
return(TRUE);
|
||||
} else {
|
||||
if (name) {
|
||||
fprintf(stderr, "InnoDB: File name %s\n", name);
|
||||
|
@ -1,25 +0,0 @@
|
||||
# Copyright (C) 2001, 2003 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = libpage.a
|
||||
|
||||
libpage_a_SOURCES = page0page.c page0cur.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -1,27 +0,0 @@
|
||||
# Copyright (C) 2001, 2003 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = libpars.a
|
||||
|
||||
noinst_HEADERS = pars0grm.h
|
||||
|
||||
libpars_a_SOURCES = pars0grm.c lexyy.c pars0opt.c pars0pars.c pars0sym.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -2,6 +2,7 @@ MYSQL_STORAGE_ENGINE(innobase, innodb, [InnoDB Storage Engine],
|
||||
[Transactional Tables using InnoDB], [max,max-no-ndb])
|
||||
MYSQL_PLUGIN_DIRECTORY(innobase, [storage/innobase])
|
||||
MYSQL_PLUGIN_STATIC(innobase, [libinnobase.a])
|
||||
MYSQL_PLUGIN_DYNAMIC(innobase, [ha_innodb.la])
|
||||
MYSQL_PLUGIN_ACTIONS(innobase, [
|
||||
AC_CHECK_LIB(rt, aio_read, [innodb_system_libs="-lrt"])
|
||||
AC_SUBST(innodb_system_libs)
|
||||
@ -38,37 +39,5 @@ MYSQL_PLUGIN_ACTIONS(innobase, [
|
||||
openbsd*)
|
||||
CFLAGS="$CFLAGS -DUNIV_MUST_NOT_INLINE";;
|
||||
esac
|
||||
AC_CONFIG_FILES(
|
||||
storage/innobase/ut/Makefile
|
||||
storage/innobase/btr/Makefile
|
||||
storage/innobase/buf/Makefile
|
||||
storage/innobase/data/Makefile
|
||||
storage/innobase/dict/Makefile
|
||||
storage/innobase/dyn/Makefile
|
||||
storage/innobase/eval/Makefile
|
||||
storage/innobase/fil/Makefile
|
||||
storage/innobase/fsp/Makefile
|
||||
storage/innobase/fut/Makefile
|
||||
storage/innobase/ha/Makefile
|
||||
storage/innobase/ibuf/Makefile
|
||||
storage/innobase/lock/Makefile
|
||||
storage/innobase/log/Makefile
|
||||
storage/innobase/mach/Makefile
|
||||
storage/innobase/mem/Makefile
|
||||
storage/innobase/mtr/Makefile
|
||||
storage/innobase/os/Makefile
|
||||
storage/innobase/page/Makefile
|
||||
storage/innobase/pars/Makefile
|
||||
storage/innobase/que/Makefile
|
||||
storage/innobase/read/Makefile
|
||||
storage/innobase/rem/Makefile
|
||||
storage/innobase/row/Makefile
|
||||
storage/innobase/srv/Makefile
|
||||
storage/innobase/sync/Makefile
|
||||
storage/innobase/thr/Makefile
|
||||
storage/innobase/trx/Makefile
|
||||
storage/innobase/handler/Makefile
|
||||
storage/innobase/usr/Makefile)
|
||||
])
|
||||
MYSQL_PLUGIN_DEPENDS_ON_MYSQL_INTERNALS(innobase, [handler/ha_innodb.cc])
|
||||
|
||||
|
@ -1,25 +0,0 @@
|
||||
# Copyright (C) 2001, 2003 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = libque.a
|
||||
|
||||
libque_a_SOURCES = que0que.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -1,25 +0,0 @@
|
||||
# Copyright (C) 2001, 2003 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = libread.a
|
||||
|
||||
libread_a_SOURCES = read0read.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -1,25 +0,0 @@
|
||||
# Copyright (C) 2001, 2003 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = librem.a
|
||||
|
||||
librem_a_SOURCES = rem0rec.c rem0cmp.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -153,7 +153,6 @@ static
|
||||
void
|
||||
rec_init_offsets(
|
||||
/*=============*/
|
||||
/* out: the offsets */
|
||||
rec_t* rec, /* in: physical record */
|
||||
dict_index_t* index, /* in: record descriptor */
|
||||
ulint* offsets)/* in/out: array of offsets;
|
||||
@ -189,7 +188,7 @@ rec_init_offsets(
|
||||
}
|
||||
|
||||
nulls = rec - (REC_N_NEW_EXTRA_BYTES + 1);
|
||||
lens = nulls - (index->n_nullable + 7) / 8;
|
||||
lens = nulls - UT_BITS_IN_BYTES(index->n_nullable);
|
||||
offs = 0;
|
||||
null_mask = 1;
|
||||
|
||||
@ -304,7 +303,7 @@ rec_get_offsets_func(
|
||||
/* out: the new offsets */
|
||||
rec_t* rec, /* in: physical record */
|
||||
dict_index_t* index, /* in: record descriptor */
|
||||
ulint* offsets,/* in: array consisting of offsets[0]
|
||||
ulint* offsets,/* in/out: array consisting of offsets[0]
|
||||
allocated elements, or an array from
|
||||
rec_get_offsets(), or NULL */
|
||||
ulint n_fields,/* in: maximum number of initialized fields
|
||||
@ -440,7 +439,7 @@ rec_get_converted_size_new(
|
||||
dtuple_t* dtuple) /* in: data tuple */
|
||||
{
|
||||
ulint size = REC_N_NEW_EXTRA_BYTES
|
||||
+ (index->n_nullable + 7) / 8;
|
||||
+ UT_BITS_IN_BYTES(index->n_nullable);
|
||||
ulint i;
|
||||
ulint n_fields;
|
||||
ut_ad(index && dtuple);
|
||||
@ -459,10 +458,10 @@ rec_get_converted_size_new(
|
||||
break;
|
||||
case REC_STATUS_INFIMUM:
|
||||
case REC_STATUS_SUPREMUM:
|
||||
/* infimum or supremum record, 8 bytes */
|
||||
return(size + 8); /* no extra data needed */
|
||||
/* infimum or supremum record, 8 data bytes */
|
||||
return(REC_N_NEW_EXTRA_BYTES + 8);
|
||||
default:
|
||||
ut_a(0);
|
||||
ut_error;
|
||||
return(ULINT_UNDEFINED);
|
||||
}
|
||||
|
||||
@ -476,21 +475,31 @@ rec_get_converted_size_new(
|
||||
len = dtuple_get_nth_field(dtuple, i)->len;
|
||||
col = dict_field_get_col(field);
|
||||
|
||||
ut_ad(len != UNIV_SQL_NULL || !(col->prtype & DATA_NOT_NULL));
|
||||
ut_ad(dict_col_type_assert_equal(
|
||||
col, dfield_get_type(dtuple_get_nth_field(
|
||||
dtuple, i))));
|
||||
|
||||
if (len == UNIV_SQL_NULL) {
|
||||
/* No length is stored for NULL fields. */
|
||||
ut_ad(!(col->prtype & DATA_NOT_NULL));
|
||||
continue;
|
||||
}
|
||||
|
||||
ut_ad(len <= col->len || col->mtype == DATA_BLOB);
|
||||
ut_ad(!field->fixed_len || len == field->fixed_len);
|
||||
|
||||
if (field->fixed_len) {
|
||||
ut_ad(len == field->fixed_len);
|
||||
/* dict_index_add_col() should guarantee this */
|
||||
ut_ad(!field->prefix_len
|
||||
|| field->fixed_len == field->prefix_len);
|
||||
} else if (len < 128
|
||||
|| (col->len < 256 && col->mtype != DATA_BLOB)) {
|
||||
size++;
|
||||
} else {
|
||||
/* For variable-length columns, we look up the
|
||||
maximum length from the column itself. If this
|
||||
is a prefix index column shorter than 256 bytes,
|
||||
this will waste one byte. */
|
||||
size += 2;
|
||||
}
|
||||
size += len;
|
||||
@ -586,7 +595,7 @@ rec_set_nth_field_extern_bit_new(
|
||||
we do not write to log about the change */
|
||||
{
|
||||
byte* nulls = rec - (REC_N_NEW_EXTRA_BYTES + 1);
|
||||
byte* lens = nulls - (index->n_nullable + 7) / 8;
|
||||
byte* lens = nulls - UT_BITS_IN_BYTES(index->n_nullable);
|
||||
ulint i;
|
||||
ulint n_fields;
|
||||
ulint null_mask = 1;
|
||||
@ -875,7 +884,7 @@ rec_convert_dtuple_to_rec_new(
|
||||
|
||||
/* Calculate the offset of the origin in the physical record.
|
||||
We must loop over all fields to do this. */
|
||||
rec += (index->n_nullable + 7) / 8;
|
||||
rec += UT_BITS_IN_BYTES(index->n_nullable);
|
||||
|
||||
for (i = 0; i < n_fields; i++) {
|
||||
if (UNIV_UNLIKELY(i == n_node_ptr_field)) {
|
||||
@ -892,6 +901,11 @@ rec_convert_dtuple_to_rec_new(
|
||||
len = dfield_get_len(field);
|
||||
fixed_len = dict_index_get_nth_field(index, i)->fixed_len;
|
||||
|
||||
ut_ad(dict_col_type_assert_equal(
|
||||
dict_field_get_col(dict_index_get_nth_field(
|
||||
index, i)),
|
||||
dfield_get_type(field)));
|
||||
|
||||
if (!(dtype_get_prtype(type) & DATA_NOT_NULL)) {
|
||||
if (len == UNIV_SQL_NULL)
|
||||
continue;
|
||||
@ -915,7 +929,7 @@ rec_convert_dtuple_to_rec_new(
|
||||
init:
|
||||
end = rec;
|
||||
nulls = rec - (REC_N_NEW_EXTRA_BYTES + 1);
|
||||
lens = nulls - (index->n_nullable + 7) / 8;
|
||||
lens = nulls - UT_BITS_IN_BYTES(index->n_nullable);
|
||||
/* clear the SQL-null flags */
|
||||
memset (lens + 1, 0, nulls - lens);
|
||||
|
||||
@ -1172,7 +1186,7 @@ rec_copy_prefix_to_buf(
|
||||
}
|
||||
|
||||
nulls = rec - (REC_N_NEW_EXTRA_BYTES + 1);
|
||||
lens = nulls - (index->n_nullable + 7) / 8;
|
||||
lens = nulls - UT_BITS_IN_BYTES(index->n_nullable);
|
||||
UNIV_PREFETCH_R(lens);
|
||||
prefix_len = 0;
|
||||
null_mask = 1;
|
||||
|
@ -1,26 +0,0 @@
|
||||
# Copyright (C) 2001, 2003 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = librow.a
|
||||
|
||||
librow_a_SOURCES = row0ins.c row0mysql.c row0purge.c row0row.c row0sel.c\
|
||||
row0uins.c row0umod.c row0undo.c row0upd.c row0vers.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -51,21 +51,6 @@ innobase_invalidate_query_cache(
|
||||
ulint full_name_len); /* in: full name length where also the null
|
||||
chars count */
|
||||
|
||||
/**********************************************************************
|
||||
This function returns true if
|
||||
|
||||
1) SQL-query in the current thread
|
||||
is either REPLACE or LOAD DATA INFILE REPLACE.
|
||||
|
||||
2) SQL-query in the current thread
|
||||
is INSERT ON DUPLICATE KEY UPDATE.
|
||||
|
||||
NOTE that /mysql/innobase/row/row0ins.c must contain the
|
||||
prototype for this function ! */
|
||||
|
||||
ibool
|
||||
innobase_query_is_update(void);
|
||||
|
||||
/*************************************************************************
|
||||
Creates an insert node struct. */
|
||||
|
||||
@ -448,7 +433,11 @@ row_ins_cascade_calc_update_vec(
|
||||
ulint i;
|
||||
ulint j;
|
||||
|
||||
ut_a(node && foreign && cascade && table && index);
|
||||
ut_a(node);
|
||||
ut_a(foreign);
|
||||
ut_a(cascade);
|
||||
ut_a(table);
|
||||
ut_a(index);
|
||||
|
||||
/* Calculate the appropriate update vector which will set the fields
|
||||
in the child index record to the same value (possibly padded with
|
||||
@ -791,7 +780,10 @@ row_ins_foreign_check_on_constraint(
|
||||
trx_t* trx;
|
||||
mem_heap_t* tmp_heap = NULL;
|
||||
|
||||
ut_a(thr && foreign && pcur && mtr);
|
||||
ut_a(thr);
|
||||
ut_a(foreign);
|
||||
ut_a(pcur);
|
||||
ut_a(mtr);
|
||||
|
||||
trx = thr_get_trx(thr);
|
||||
|
||||
@ -1308,7 +1300,8 @@ run_again:
|
||||
goto exit_func;
|
||||
}
|
||||
|
||||
ut_a(check_table && check_index);
|
||||
ut_a(check_table);
|
||||
ut_a(check_index);
|
||||
|
||||
if (check_table != table) {
|
||||
/* We already have a LOCK_IX on table, but not necessarily
|
||||
@ -1336,11 +1329,9 @@ run_again:
|
||||
/* Scan index records and check if there is a matching record */
|
||||
|
||||
for (;;) {
|
||||
page_t* page;
|
||||
rec = btr_pcur_get_rec(&pcur);
|
||||
page = buf_frame_align(rec);
|
||||
|
||||
if (rec == page_get_infimum_rec(page)) {
|
||||
if (page_rec_is_infimum(rec)) {
|
||||
|
||||
goto next_rec;
|
||||
}
|
||||
@ -1348,7 +1339,7 @@ run_again:
|
||||
offsets = rec_get_offsets(rec, check_index,
|
||||
offsets, ULINT_UNDEFINED, &heap);
|
||||
|
||||
if (rec == page_get_supremum_rec(page)) {
|
||||
if (page_rec_is_supremum(rec)) {
|
||||
|
||||
err = row_ins_set_shared_rec_lock(
|
||||
LOCK_ORDINARY, rec, check_index, offsets, thr);
|
||||
@ -1654,6 +1645,7 @@ row_ins_scan_sec_index_for_duplicate(
|
||||
btr_pcur_t pcur;
|
||||
ulint err = DB_SUCCESS;
|
||||
ibool moved;
|
||||
unsigned allow_duplicates;
|
||||
mtr_t mtr;
|
||||
mem_heap_t* heap = NULL;
|
||||
ulint offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
@ -1684,12 +1676,14 @@ row_ins_scan_sec_index_for_duplicate(
|
||||
|
||||
btr_pcur_open(index, entry, PAGE_CUR_GE, BTR_SEARCH_LEAF, &pcur, &mtr);
|
||||
|
||||
allow_duplicates = thr_get_trx(thr)->duplicates & TRX_DUP_IGNORE;
|
||||
|
||||
/* Scan index records and check if there is a duplicate */
|
||||
|
||||
for (;;) {
|
||||
rec = btr_pcur_get_rec(&pcur);
|
||||
|
||||
if (rec == page_get_infimum_rec(buf_frame_align(rec))) {
|
||||
if (page_rec_is_infimum(rec)) {
|
||||
|
||||
goto next_rec;
|
||||
}
|
||||
@ -1697,7 +1691,7 @@ row_ins_scan_sec_index_for_duplicate(
|
||||
offsets = rec_get_offsets(rec, index, offsets,
|
||||
ULINT_UNDEFINED, &heap);
|
||||
|
||||
if (innobase_query_is_update()) {
|
||||
if (allow_duplicates) {
|
||||
|
||||
/* If the SQL-query will update or replace
|
||||
duplicate key we will take X-lock for
|
||||
@ -1826,7 +1820,7 @@ row_ins_duplicate_error_in_clust(
|
||||
sure that in roll-forward we get the same duplicate
|
||||
errors as in original execution */
|
||||
|
||||
if (innobase_query_is_update()) {
|
||||
if (trx->duplicates & TRX_DUP_IGNORE) {
|
||||
|
||||
/* If the SQL-query will update or replace
|
||||
duplicate key we will take X-lock for
|
||||
@ -1864,7 +1858,7 @@ row_ins_duplicate_error_in_clust(
|
||||
offsets = rec_get_offsets(rec, cursor->index, offsets,
|
||||
ULINT_UNDEFINED, &heap);
|
||||
|
||||
if (innobase_query_is_update()) {
|
||||
if (trx->duplicates & TRX_DUP_IGNORE) {
|
||||
|
||||
/* If the SQL-query will update or replace
|
||||
duplicate key we will take X-lock for
|
||||
|
@ -476,7 +476,8 @@ handle_new_error:
|
||||
/* MySQL will roll back the latest SQL statement */
|
||||
} else if (err == DB_ROW_IS_REFERENCED
|
||||
|| err == DB_NO_REFERENCED_ROW
|
||||
|| err == DB_CANNOT_ADD_CONSTRAINT) {
|
||||
|| err == DB_CANNOT_ADD_CONSTRAINT
|
||||
|| err == DB_TOO_MANY_CONCURRENT_TRXS) {
|
||||
if (savept) {
|
||||
/* Roll back the latest, possibly incomplete
|
||||
insertion or update */
|
||||
@ -4058,3 +4059,25 @@ row_check_table_for_mysql(
|
||||
|
||||
return(ret);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
Get the maximum row size. */
|
||||
|
||||
ulint
|
||||
page_get_free_space_of_empty_noninline(
|
||||
/*===================================*/
|
||||
/* out: The (approx) maximum size
|
||||
of a row, this is a conservative
|
||||
estimate, since the size can be
|
||||
slightly larger depending upon
|
||||
the ROW_FORMAT setting.*/
|
||||
dict_table_t* table) /* in: table for which max record
|
||||
size is required.*/
|
||||
{
|
||||
ibool compact;
|
||||
|
||||
compact = dict_table_is_comp(table);
|
||||
|
||||
return(page_get_free_space_of_empty(compact) / 2);
|
||||
}
|
||||
|
||||
|
@ -142,21 +142,16 @@ row_build_index_entry(
|
||||
dfield_copy(dfield, dfield2);
|
||||
|
||||
/* If a column prefix index, take only the prefix */
|
||||
if (ind_field->prefix_len) {
|
||||
if (dfield_get_len(dfield2) != UNIV_SQL_NULL) {
|
||||
if (ind_field->prefix_len > 0
|
||||
&& dfield_get_len(dfield2) != UNIV_SQL_NULL) {
|
||||
|
||||
storage_len = dtype_get_at_most_n_mbchars(
|
||||
col->prtype,
|
||||
col->mbminlen, col->mbmaxlen,
|
||||
col->prtype, col->mbminlen, col->mbmaxlen,
|
||||
ind_field->prefix_len,
|
||||
dfield_get_len(dfield2),
|
||||
dfield2->data);
|
||||
dfield_get_len(dfield2), dfield2->data);
|
||||
|
||||
dfield_set_len(dfield, storage_len);
|
||||
}
|
||||
|
||||
dfield_get_type(dfield)->len = ind_field->prefix_len;
|
||||
}
|
||||
}
|
||||
|
||||
ut_ad(dtuple_check_typed(entry));
|
||||
@ -478,7 +473,9 @@ row_build_row_ref_in_tuple(
|
||||
ulint* offsets = offsets_;
|
||||
*offsets_ = (sizeof offsets_) / sizeof *offsets_;
|
||||
|
||||
ut_a(ref && index && rec);
|
||||
ut_a(ref);
|
||||
ut_a(index);
|
||||
ut_a(rec);
|
||||
|
||||
if (UNIV_UNLIKELY(!index->table)) {
|
||||
fputs("InnoDB: table ", stderr);
|
||||
|
@ -3619,6 +3619,32 @@ shortcut_fails_too_big_rec:
|
||||
pcur, 0, &mtr);
|
||||
|
||||
pcur->trx_if_known = trx;
|
||||
|
||||
rec = btr_pcur_get_rec(pcur);
|
||||
|
||||
if (!moves_up
|
||||
&& !page_rec_is_supremum(rec)
|
||||
&& set_also_gap_locks
|
||||
&& !(srv_locks_unsafe_for_binlog
|
||||
|| trx->isolation_level == TRX_ISO_READ_COMMITTED)
|
||||
&& prebuilt->select_lock_type != LOCK_NONE) {
|
||||
|
||||
/* Try to place a gap lock on the next index record
|
||||
to prevent phantoms in ORDER BY ... DESC queries */
|
||||
|
||||
offsets = rec_get_offsets(page_rec_get_next(rec),
|
||||
index, offsets,
|
||||
ULINT_UNDEFINED, &heap);
|
||||
err = sel_set_rec_lock(page_rec_get_next(rec),
|
||||
index, offsets,
|
||||
prebuilt->select_lock_type,
|
||||
LOCK_GAP, thr);
|
||||
|
||||
if (err != DB_SUCCESS) {
|
||||
|
||||
goto lock_wait_or_error;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (mode == PAGE_CUR_G) {
|
||||
btr_pcur_open_at_index_side(
|
||||
|
@ -1,25 +0,0 @@
|
||||
# Copyright (C) 2001, 2003-2004 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = libsrv.a
|
||||
|
||||
libsrv_a_SOURCES = srv0srv.c srv0que.c srv0start.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -47,6 +47,7 @@ Created 10/8/1995 Heikki Tuuri
|
||||
#include "dict0boot.h"
|
||||
#include "srv0start.h"
|
||||
#include "row0mysql.h"
|
||||
#include "ha_prototypes.h"
|
||||
|
||||
/* This is set to TRUE if the MySQL user has set it in MySQL; currently
|
||||
affects only FOREIGN KEY definition parsing */
|
||||
@ -180,6 +181,16 @@ dulint srv_archive_recovery_limit_lsn;
|
||||
|
||||
ulint srv_lock_wait_timeout = 1024 * 1024 * 1024;
|
||||
|
||||
/* This parameter is used to throttle the number of insert buffers that are
|
||||
merged in a batch. By increasing this parameter on a faster disk you can
|
||||
possibly reduce the number of I/O operations performed to complete the
|
||||
merge operation. The value of this parameter is used as is by the
|
||||
background loop when the system is idle (low load), on a busy system
|
||||
the parameter is scaled down by a factor of 4, this is to avoid putting
|
||||
a heavier load on the I/O sub system. */
|
||||
|
||||
ulong srv_insert_buffer_batch_size = 20;
|
||||
|
||||
char* srv_file_flush_method_str = NULL;
|
||||
ulint srv_unix_file_flush_method = SRV_UNIX_FDATASYNC;
|
||||
ulint srv_win_file_flush_method = SRV_WIN_IO_UNBUFFERED;
|
||||
@ -977,6 +988,17 @@ srv_conc_enter_innodb(
|
||||
srv_conc_slot_t* slot = NULL;
|
||||
ulint i;
|
||||
|
||||
if (trx->mysql_thd != NULL
|
||||
&& thd_is_replication_slave_thread(trx->mysql_thd)) {
|
||||
|
||||
/* TODO Do something more interesting (based on a config
|
||||
parameter). Some users what to give the replication
|
||||
thread very low priority, see http://bugs.mysql.com/25078
|
||||
This can be done by introducing
|
||||
innodb_replication_delay(ms) config parameter */
|
||||
return;
|
||||
}
|
||||
|
||||
/* If trx has 'free tickets' to enter the engine left, then use one
|
||||
such ticket */
|
||||
|
||||
@ -1017,7 +1039,7 @@ retry:
|
||||
if (!has_slept && !trx->has_search_latch
|
||||
&& NULL == UT_LIST_GET_FIRST(trx->trx_locks)) {
|
||||
|
||||
has_slept = TRUE; /* We let is sleep only once to avoid
|
||||
has_slept = TRUE; /* We let it sleep only once to avoid
|
||||
starvation */
|
||||
|
||||
srv_conc_n_waiting_threads++;
|
||||
@ -1130,7 +1152,7 @@ srv_conc_force_enter_innodb(
|
||||
|
||||
srv_conc_n_threads++;
|
||||
trx->declared_to_be_inside_innodb = TRUE;
|
||||
trx->n_tickets_to_enter_innodb = 0;
|
||||
trx->n_tickets_to_enter_innodb = 1;
|
||||
|
||||
os_fast_mutex_unlock(&srv_conc_mutex);
|
||||
}
|
||||
@ -1152,6 +1174,12 @@ srv_conc_force_exit_innodb(
|
||||
return;
|
||||
}
|
||||
|
||||
if (trx->mysql_thd != NULL
|
||||
&& thd_is_replication_slave_thread(trx->mysql_thd)) {
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (trx->declared_to_be_inside_innodb == FALSE) {
|
||||
|
||||
return;
|
||||
@ -1853,6 +1881,7 @@ srv_lock_timeout_and_monitor_thread(
|
||||
double time_elapsed;
|
||||
time_t current_time;
|
||||
time_t last_table_monitor_time;
|
||||
time_t last_tablespace_monitor_time;
|
||||
time_t last_monitor_time;
|
||||
ibool some_waits;
|
||||
double wait_time;
|
||||
@ -1865,6 +1894,7 @@ srv_lock_timeout_and_monitor_thread(
|
||||
UT_NOT_USED(arg);
|
||||
srv_last_monitor_time = time(NULL);
|
||||
last_table_monitor_time = time(NULL);
|
||||
last_tablespace_monitor_time = time(NULL);
|
||||
last_monitor_time = time(NULL);
|
||||
loop:
|
||||
srv_lock_timeout_and_monitor_active = TRUE;
|
||||
@ -1901,9 +1931,9 @@ loop:
|
||||
}
|
||||
|
||||
if (srv_print_innodb_tablespace_monitor
|
||||
&& difftime(current_time, last_table_monitor_time) > 60) {
|
||||
|
||||
last_table_monitor_time = time(NULL);
|
||||
&& difftime(current_time,
|
||||
last_tablespace_monitor_time) > 60) {
|
||||
last_tablespace_monitor_time = time(NULL);
|
||||
|
||||
fputs("========================"
|
||||
"========================\n",
|
||||
@ -2100,7 +2130,7 @@ loop:
|
||||
|
||||
os_thread_sleep(2000000);
|
||||
|
||||
if (srv_shutdown_state < SRV_SHUTDOWN_LAST_PHASE) {
|
||||
if (srv_shutdown_state < SRV_SHUTDOWN_CLEANUP) {
|
||||
|
||||
goto loop;
|
||||
}
|
||||
@ -2270,7 +2300,8 @@ loop:
|
||||
+ buf_pool->n_pages_written;
|
||||
if (n_pend_ios < 3 && (n_ios - n_ios_old < 5)) {
|
||||
srv_main_thread_op_info = "doing insert buffer merge";
|
||||
ibuf_contract_for_n_pages(TRUE, 5);
|
||||
ibuf_contract_for_n_pages(
|
||||
TRUE, srv_insert_buffer_batch_size / 4);
|
||||
|
||||
srv_main_thread_op_info = "flushing log";
|
||||
|
||||
@ -2331,7 +2362,7 @@ loop:
|
||||
even if the server were active */
|
||||
|
||||
srv_main_thread_op_info = "doing insert buffer merge";
|
||||
ibuf_contract_for_n_pages(TRUE, 5);
|
||||
ibuf_contract_for_n_pages(TRUE, srv_insert_buffer_batch_size / 4);
|
||||
|
||||
srv_main_thread_op_info = "flushing log";
|
||||
log_buffer_flush_to_disk();
|
||||
@ -2469,7 +2500,8 @@ background_loop:
|
||||
if (srv_fast_shutdown && srv_shutdown_state > 0) {
|
||||
n_bytes_merged = 0;
|
||||
} else {
|
||||
n_bytes_merged = ibuf_contract_for_n_pages(TRUE, 20);
|
||||
n_bytes_merged = ibuf_contract_for_n_pages(
|
||||
TRUE, srv_insert_buffer_batch_size);
|
||||
}
|
||||
|
||||
srv_main_thread_op_info = "reserving kernel mutex";
|
||||
|
@ -1025,6 +1025,12 @@ innobase_start_or_create_for_mysql(void)
|
||||
"InnoDB: !!!!!!!! UNIV_DEBUG switched on !!!!!!!!!\n");
|
||||
#endif
|
||||
|
||||
#ifdef UNIV_IBUF_DEBUG
|
||||
fprintf(stderr,
|
||||
"InnoDB: !!!!!!!! UNIV_IBUF_DEBUG switched on !!!!!!!!!\n"
|
||||
"InnoDB: Crash recovery will fail with UNIV_IBUF_DEBUG\n");
|
||||
#endif
|
||||
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
fprintf(stderr,
|
||||
"InnoDB: !!!!!!!! UNIV_SYNC_DEBUG switched on !!!!!!!!!\n");
|
||||
|
@ -1,25 +0,0 @@
|
||||
# Copyright (C) 2001, 2003-2004 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = libsync.a
|
||||
|
||||
libsync_a_SOURCES = sync0arr.c sync0rw.c sync0sync.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -670,7 +670,9 @@ sync_array_detect_deadlock(
|
||||
ibool ret;
|
||||
rw_lock_debug_t*debug;
|
||||
|
||||
ut_a(arr && start && cell);
|
||||
ut_a(arr);
|
||||
ut_a(start);
|
||||
ut_a(cell);
|
||||
ut_ad(cell->wait_object);
|
||||
ut_ad(os_thread_get_curr_id() == start->thread);
|
||||
ut_ad(depth < 100);
|
||||
|
@ -1,25 +0,0 @@
|
||||
# Copyright (C) 2001, 2003 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = libthr.a
|
||||
|
||||
libthr_a_SOURCES = thr0loc.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -1,26 +0,0 @@
|
||||
# Copyright (C) 2001, 2003 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = libtrx.a
|
||||
|
||||
libtrx_a_SOURCES = trx0purge.c trx0rec.c trx0roll.c trx0rseg.c\
|
||||
trx0sys.c trx0trx.c trx0undo.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -1024,6 +1024,7 @@ trx_undo_report_row_operation(
|
||||
ibool is_insert;
|
||||
trx_rseg_t* rseg;
|
||||
mtr_t mtr;
|
||||
ulint err = DB_SUCCESS;
|
||||
mem_heap_t* heap = NULL;
|
||||
ulint offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
ulint* offsets = offsets_;
|
||||
@ -1035,7 +1036,7 @@ trx_undo_report_row_operation(
|
||||
|
||||
*roll_ptr = ut_dulint_zero;
|
||||
|
||||
return(DB_SUCCESS);
|
||||
return(err);
|
||||
}
|
||||
|
||||
ut_ad(thr);
|
||||
@ -1053,7 +1054,7 @@ trx_undo_report_row_operation(
|
||||
|
||||
if (trx->insert_undo == NULL) {
|
||||
|
||||
trx_undo_assign_undo(trx, TRX_UNDO_INSERT);
|
||||
err = trx_undo_assign_undo(trx, TRX_UNDO_INSERT);
|
||||
}
|
||||
|
||||
undo = trx->insert_undo;
|
||||
@ -1063,7 +1064,7 @@ trx_undo_report_row_operation(
|
||||
|
||||
if (trx->update_undo == NULL) {
|
||||
|
||||
trx_undo_assign_undo(trx, TRX_UNDO_UPDATE);
|
||||
err = trx_undo_assign_undo(trx, TRX_UNDO_UPDATE);
|
||||
|
||||
}
|
||||
|
||||
@ -1071,11 +1072,11 @@ trx_undo_report_row_operation(
|
||||
is_insert = FALSE;
|
||||
}
|
||||
|
||||
if (undo == NULL) {
|
||||
/* Did not succeed: out of space */
|
||||
if (err != DB_SUCCESS) {
|
||||
/* Did not succeed: return the error encountered */
|
||||
mutex_exit(&(trx->undo_mutex));
|
||||
|
||||
return(DB_OUT_OF_FILE_SPACE);
|
||||
return(err);
|
||||
}
|
||||
|
||||
page_no = undo->last_page_no;
|
||||
@ -1107,7 +1108,9 @@ trx_undo_report_row_operation(
|
||||
if (offset == 0) {
|
||||
/* The record did not fit on the page. We erase the
|
||||
end segment of the undo log page and write a log
|
||||
record of it to to ensure deterministic contents. */
|
||||
record of it: this is to ensure that in the debug
|
||||
version the replicate page constructed using the log
|
||||
records stays identical to the original page */
|
||||
|
||||
trx_undo_erase_page_end(undo_page, &mtr);
|
||||
}
|
||||
@ -1163,7 +1166,7 @@ trx_undo_report_row_operation(
|
||||
if (UNIV_LIKELY_NULL(heap)) {
|
||||
mem_heap_free(heap);
|
||||
}
|
||||
return(DB_SUCCESS);
|
||||
return(err);
|
||||
}
|
||||
|
||||
/*============== BUILDING PREVIOUS VERSION OF A RECORD ===============*/
|
||||
|
@ -25,6 +25,7 @@ Created 3/26/1996 Heikki Tuuri
|
||||
#include "btr0sea.h"
|
||||
#include "os0proc.h"
|
||||
#include "trx0xa.h"
|
||||
#include "ha_prototypes.h"
|
||||
|
||||
/* Copy of the prototype for innobase_mysql_print_thd: this
|
||||
copy MUST be equal to the one in mysql/sql/ha_innodb.cc ! */
|
||||
@ -130,6 +131,8 @@ trx_create(
|
||||
|
||||
trx->mysql_thd = NULL;
|
||||
trx->mysql_query_str = NULL;
|
||||
trx->active_trans = 0;
|
||||
trx->duplicates = 0;
|
||||
|
||||
trx->n_mysql_tables_in_use = 0;
|
||||
trx->mysql_n_tables_locked = 0;
|
||||
@ -1771,6 +1774,61 @@ trx_print(
|
||||
}
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
Compares the "weight" (or size) of two transactions. The weight of one
|
||||
transaction is estimated as the number of altered rows + the number of
|
||||
locked rows. Transactions that have edited non-transactional tables are
|
||||
considered heavier than ones that have not. */
|
||||
|
||||
int
|
||||
trx_weight_cmp(
|
||||
/*===========*/
|
||||
/* out: <0, 0 or >0; similar to strcmp(3) */
|
||||
trx_t* a, /* in: the first transaction to be compared */
|
||||
trx_t* b) /* in: the second transaction to be compared */
|
||||
{
|
||||
ibool a_notrans_edit;
|
||||
ibool b_notrans_edit;
|
||||
|
||||
/* If mysql_thd is NULL for a transaction we assume that it has
|
||||
not edited non-transactional tables. */
|
||||
|
||||
a_notrans_edit = a->mysql_thd != NULL
|
||||
&& thd_has_edited_nontrans_tables(a->mysql_thd);
|
||||
|
||||
b_notrans_edit = b->mysql_thd != NULL
|
||||
&& thd_has_edited_nontrans_tables(b->mysql_thd);
|
||||
|
||||
if (a_notrans_edit && !b_notrans_edit) {
|
||||
|
||||
return(1);
|
||||
}
|
||||
|
||||
if (!a_notrans_edit && b_notrans_edit) {
|
||||
|
||||
return(-1);
|
||||
}
|
||||
|
||||
/* Either both had edited non-transactional tables or both had
|
||||
not, we fall back to comparing the number of altered/locked
|
||||
rows. */
|
||||
|
||||
#if 0
|
||||
fprintf(stderr,
|
||||
"%s TRX_WEIGHT(a): %lld+%lu, TRX_WEIGHT(b): %lld+%lu\n",
|
||||
__func__,
|
||||
ut_conv_dulint_to_longlong(a->undo_no),
|
||||
UT_LIST_GET_LEN(a->trx_locks),
|
||||
ut_conv_dulint_to_longlong(b->undo_no),
|
||||
UT_LIST_GET_LEN(b->trx_locks));
|
||||
#endif
|
||||
|
||||
#define TRX_WEIGHT(t) \
|
||||
ut_dulint_add((t)->undo_no, UT_LIST_GET_LEN((t)->trx_locks))
|
||||
|
||||
return(ut_dulint_cmp(TRX_WEIGHT(a), TRX_WEIGHT(b)));
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
Prepares a transaction. */
|
||||
|
||||
@ -1889,7 +1947,7 @@ Does the transaction prepare for MySQL. */
|
||||
|
||||
ulint
|
||||
trx_prepare_for_mysql(
|
||||
/*====-=============*/
|
||||
/*==================*/
|
||||
/* out: 0 or error number */
|
||||
trx_t* trx) /* in: trx handle */
|
||||
{
|
||||
|
@ -373,26 +373,31 @@ trx_undo_page_init(
|
||||
/*******************************************************************
|
||||
Creates a new undo log segment in file. */
|
||||
static
|
||||
page_t*
|
||||
ulint
|
||||
trx_undo_seg_create(
|
||||
/*================*/
|
||||
/* out: segment header page x-latched, NULL
|
||||
if no space left */
|
||||
/* out: DB_SUCCESS if page creation OK
|
||||
possible error codes are:
|
||||
DB_TOO_MANY_CONCURRENT_TRXS
|
||||
DB_OUT_OF_FILE_SPACE */
|
||||
trx_rseg_t* rseg __attribute__((unused)),/* in: rollback segment */
|
||||
trx_rsegf_t* rseg_hdr,/* in: rollback segment header, page
|
||||
x-latched */
|
||||
ulint type, /* in: type of the segment: TRX_UNDO_INSERT or
|
||||
TRX_UNDO_UPDATE */
|
||||
ulint* id, /* out: slot index within rseg header */
|
||||
page_t** undo_page,
|
||||
/* out: segment header page x-latched, NULL
|
||||
if there was an error */
|
||||
mtr_t* mtr) /* in: mtr */
|
||||
{
|
||||
ulint slot_no;
|
||||
ulint space;
|
||||
page_t* undo_page;
|
||||
trx_upagef_t* page_hdr;
|
||||
trx_usegf_t* seg_hdr;
|
||||
ulint n_reserved;
|
||||
ibool success;
|
||||
ulint err = DB_SUCCESS;
|
||||
|
||||
ut_ad(mtr && id && rseg_hdr);
|
||||
ut_ad(mutex_own(&(rseg->mutex)));
|
||||
@ -410,7 +415,7 @@ trx_undo_seg_create(
|
||||
"InnoDB: many active transactions"
|
||||
" running concurrently?\n");
|
||||
|
||||
return(NULL);
|
||||
return(DB_TOO_MANY_CONCURRENT_TRXS);
|
||||
}
|
||||
|
||||
space = buf_frame_get_space_id(rseg_hdr);
|
||||
@ -419,30 +424,30 @@ trx_undo_seg_create(
|
||||
mtr);
|
||||
if (!success) {
|
||||
|
||||
return(NULL);
|
||||
return(DB_OUT_OF_FILE_SPACE);
|
||||
}
|
||||
|
||||
/* Allocate a new file segment for the undo log */
|
||||
undo_page = fseg_create_general(space, 0,
|
||||
*undo_page = fseg_create_general(space, 0,
|
||||
TRX_UNDO_SEG_HDR
|
||||
+ TRX_UNDO_FSEG_HEADER, TRUE, mtr);
|
||||
|
||||
fil_space_release_free_extents(space, n_reserved);
|
||||
|
||||
if (undo_page == NULL) {
|
||||
if (*undo_page == NULL) {
|
||||
/* No space left */
|
||||
|
||||
return(NULL);
|
||||
return(DB_OUT_OF_FILE_SPACE);
|
||||
}
|
||||
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
buf_page_dbg_add_level(undo_page, SYNC_TRX_UNDO_PAGE);
|
||||
buf_page_dbg_add_level(*undo_page, SYNC_TRX_UNDO_PAGE);
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
|
||||
page_hdr = undo_page + TRX_UNDO_PAGE_HDR;
|
||||
seg_hdr = undo_page + TRX_UNDO_SEG_HDR;
|
||||
page_hdr = *undo_page + TRX_UNDO_PAGE_HDR;
|
||||
seg_hdr = *undo_page + TRX_UNDO_SEG_HDR;
|
||||
|
||||
trx_undo_page_init(undo_page, type, mtr);
|
||||
trx_undo_page_init(*undo_page, type, mtr);
|
||||
|
||||
mlog_write_ulint(page_hdr + TRX_UNDO_PAGE_FREE,
|
||||
TRX_UNDO_SEG_HDR + TRX_UNDO_SEG_HDR_SIZE,
|
||||
@ -456,10 +461,11 @@ trx_undo_seg_create(
|
||||
page_hdr + TRX_UNDO_PAGE_NODE, mtr);
|
||||
|
||||
trx_rsegf_set_nth_undo(rseg_hdr, slot_no,
|
||||
buf_frame_get_page_no(undo_page), mtr);
|
||||
buf_frame_get_page_no(*undo_page), mtr);
|
||||
|
||||
*id = slot_no;
|
||||
|
||||
return(undo_page);
|
||||
return(err);
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
@ -1387,6 +1393,11 @@ trx_undo_mem_create(
|
||||
|
||||
undo = mem_alloc(sizeof(trx_undo_t));
|
||||
|
||||
if (undo == NULL) {
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
undo->id = id;
|
||||
undo->type = type;
|
||||
undo->state = TRX_UNDO_ACTIVE;
|
||||
@ -1464,11 +1475,15 @@ trx_undo_mem_free(
|
||||
/**************************************************************************
|
||||
Creates a new undo log. */
|
||||
static
|
||||
trx_undo_t*
|
||||
ulint
|
||||
trx_undo_create(
|
||||
/*============*/
|
||||
/* out: undo log object, NULL if did not
|
||||
succeed: out of space */
|
||||
/* out: DB_SUCCESS if successful in creating
|
||||
the new undo lob object, possible error
|
||||
codes are:
|
||||
DB_TOO_MANY_CONCURRENT_TRXS
|
||||
DB_OUT_OF_FILE_SPACE
|
||||
DB_OUT_OF_MEMORY*/
|
||||
trx_t* trx, /* in: transaction */
|
||||
trx_rseg_t* rseg, /* in: rollback segment memory copy */
|
||||
ulint type, /* in: type of the log: TRX_UNDO_INSERT or
|
||||
@ -1476,34 +1491,37 @@ trx_undo_create(
|
||||
dulint trx_id, /* in: id of the trx for which the undo log
|
||||
is created */
|
||||
XID* xid, /* in: X/Open transaction identification*/
|
||||
trx_undo_t** undo, /* out: the new undo log object, undefined
|
||||
* if did not succeed */
|
||||
mtr_t* mtr) /* in: mtr */
|
||||
{
|
||||
trx_rsegf_t* rseg_header;
|
||||
ulint page_no;
|
||||
ulint offset;
|
||||
ulint id;
|
||||
trx_undo_t* undo;
|
||||
page_t* undo_page;
|
||||
ulint err;
|
||||
|
||||
ut_ad(mutex_own(&(rseg->mutex)));
|
||||
|
||||
if (rseg->curr_size == rseg->max_size) {
|
||||
|
||||
return(NULL);
|
||||
return(DB_OUT_OF_FILE_SPACE);
|
||||
}
|
||||
|
||||
rseg->curr_size++;
|
||||
|
||||
rseg_header = trx_rsegf_get(rseg->space, rseg->page_no, mtr);
|
||||
|
||||
undo_page = trx_undo_seg_create(rseg, rseg_header, type, &id, mtr);
|
||||
err = trx_undo_seg_create(rseg, rseg_header, type, &id,
|
||||
&undo_page, mtr);
|
||||
|
||||
if (undo_page == NULL) {
|
||||
if (err != DB_SUCCESS) {
|
||||
/* Did not succeed */
|
||||
|
||||
rseg->curr_size--;
|
||||
|
||||
return(NULL);
|
||||
return(err);
|
||||
}
|
||||
|
||||
page_no = buf_frame_get_page_no(undo_page);
|
||||
@ -1515,9 +1533,14 @@ trx_undo_create(
|
||||
undo_page + offset, mtr);
|
||||
}
|
||||
|
||||
undo = trx_undo_mem_create(rseg, id, type, trx_id, xid,
|
||||
*undo = trx_undo_mem_create(rseg, id, type, trx_id, xid,
|
||||
page_no, offset);
|
||||
return(undo);
|
||||
if (*undo == NULL) {
|
||||
|
||||
err = DB_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
return(err);
|
||||
}
|
||||
|
||||
/*================ UNDO LOG ASSIGNMENT AND CLEANUP =====================*/
|
||||
@ -1634,17 +1657,20 @@ trx_undo_mark_as_dict_operation(
|
||||
Assigns an undo log for a transaction. A new undo log is created or a cached
|
||||
undo log reused. */
|
||||
|
||||
trx_undo_t*
|
||||
ulint
|
||||
trx_undo_assign_undo(
|
||||
/*=================*/
|
||||
/* out: the undo log, NULL if did not succeed: out of
|
||||
space */
|
||||
/* out: DB_SUCCESS if undo log assign
|
||||
successful, possible error codes are:
|
||||
DD_TOO_MANY_CONCURRENT_TRXS
|
||||
DB_OUT_OF_FILE_SPACE DB_OUT_OF_MEMORY*/
|
||||
trx_t* trx, /* in: transaction */
|
||||
ulint type) /* in: TRX_UNDO_INSERT or TRX_UNDO_UPDATE */
|
||||
{
|
||||
trx_rseg_t* rseg;
|
||||
trx_undo_t* undo;
|
||||
mtr_t mtr;
|
||||
ulint err = DB_SUCCESS;
|
||||
|
||||
ut_ad(trx);
|
||||
ut_ad(trx->rseg);
|
||||
@ -1662,15 +1688,11 @@ trx_undo_assign_undo(
|
||||
undo = trx_undo_reuse_cached(trx, rseg, type, trx->id, &trx->xid,
|
||||
&mtr);
|
||||
if (undo == NULL) {
|
||||
undo = trx_undo_create(trx, rseg, type, trx->id, &trx->xid,
|
||||
&mtr);
|
||||
if (undo == NULL) {
|
||||
/* Did not succeed */
|
||||
err = trx_undo_create(trx, rseg, type, trx->id, &trx->xid,
|
||||
&undo, &mtr);
|
||||
if (err != DB_SUCCESS) {
|
||||
|
||||
mutex_exit(&(rseg->mutex));
|
||||
mtr_commit(&mtr);
|
||||
|
||||
return(NULL);
|
||||
goto func_exit;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1688,10 +1710,11 @@ trx_undo_assign_undo(
|
||||
trx_undo_mark_as_dict_operation(trx, undo, &mtr);
|
||||
}
|
||||
|
||||
func_exit:
|
||||
mutex_exit(&(rseg->mutex));
|
||||
mtr_commit(&mtr);
|
||||
|
||||
return(undo);
|
||||
return err;
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
|
@ -1,25 +0,0 @@
|
||||
# Copyright (C) 2001, 2003 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = libusr.a
|
||||
|
||||
libusr_a_SOURCES = usr0sess.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -1,25 +0,0 @@
|
||||
# Copyright (C) 2001, 2003 MySQL 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; version 2 of the License.
|
||||
#
|
||||
# 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
|
||||
|
||||
include ../include/Makefile.i
|
||||
|
||||
noinst_LIBRARIES = libut.a
|
||||
|
||||
libut_a_SOURCES = ut0byte.c ut0dbg.c ut0mem.c ut0rnd.c ut0ut.c ut0vec.c ut0list.c ut0wqueue.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
@ -14,6 +14,7 @@ Created 5/11/1994 Heikki Tuuri
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include "ut0sort.h"
|
||||
#include "trx0trx.h"
|
||||
|
Reference in New Issue
Block a user