List:Commits« Previous MessageNext Message »
From:Alex Ivanov Notebook Date:March 29 2006 9:04pm
Subject:bk commit into 5.0 tree (aivanov:1.2107)
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of alexi. When alexi does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet
  1.2107 06/03/29 23:04:32 aivanov@stripped +18 -0
  Applied innodb-5.0-ss368 snapshot
    Fixed bugs:
    #16814: SHOW INNODB STATUS format error in LATEST FOREIGN KEY ERROR section
      dict_foreign_key_error_report(): Always print a newline after invoking
      dict_print_info_on_foreign_key_in_create_format().
    #16827: Better InnoDB error message if ibdata files omitted from my.cnf.
    #17126: CHECK TABLE on InnoDB causes a short hang during check of adaptive hash.
      CHECK TABLE blocking other queries, by releasing the btr_search_latch
      periodically during the adaptive hash table validation.
    #17405: Valgrind: conditional jump or move depends on uninitialised valuesw.
      buf_block_init(): Reset magic_n, buf_fix_count, and io_fix to avoid testing
      uninitialised variables.
    #18077: InnoDB uses full explicit table locks in stored FUNCTION.
    #18238: When locks exhaust the buffer pool, InnoDB does not roll back the trx.
      Check in pessimistic insert and update if the buffer pool is exhausted by locks.
    #18252: Disk space leaks in updates of InnoDB BLOB rows.
      btr_cur_pessimistic_update(): Invoke rec_get_offset() after
rec_set_field_extern_bits().
      btr_store_big_rec_extern_fields(): Note that offsets will no longer be valid
      after calling this function.
    #18283: When InnoDB returns error 'lock table full', MySQL can write to binlog too
much.
    #18384: InnoDB memory leak on duplicate key errors if row has many columns.
      row_ins_duplicate_error_in_clust(): Call mem_heap_free(heap) at func_exit if needed.
    #18350: Use consistent read in CREATE ... SELECT .. if innodb_locks_unsafe_for_binlog
is used.

  sql/ha_innodb.cc
    1.290 06/03/29 23:04:27 aivanov@stripped +49 -41
    Applied innodb-5.0-ss368 snapshot
      Fix memory allocation bug (by changing MY_WME to MY_FAE) in get_share.
      Also partially fix coding style of the function.

  mysql-test/t/innodb.test
    1.127 06/03/29 23:04:27 aivanov@stripped +1 -3
    Applied innodb-5.0-ss368 snapshot

  innobase/row/row0upd.c
    1.42 06/03/29 23:04:27 aivanov@stripped +5 -0
    Applied innodb-5.0-ss368 snapshot

  innobase/row/row0sel.c
    1.106 06/03/29 23:04:27 aivanov@stripped +5 -5
    Applied innodb-5.0-ss368 snapshot
      Remove UNIV_RELEASE_NOT_YET_STABLE and related checks.
      page_rec_is_comp(): Remove the bounds check.
      row_sel_field_store_in_mysql_format(): Turn the assertions
      on mbminlen, mbmaxlen, and templ->type into debug assertions.

  innobase/row/row0ins.c
    1.77 06/03/29 23:04:27 aivanov@stripped +25 -3
    Applied innodb-5.0-ss368 snapshot

  innobase/include/univ.i
    1.46 06/03/29 23:04:27 aivanov@stripped +0 -4
    Applied innodb-5.0-ss368 snapshot
      Remove UNIV_RELEASES_NOT_YET_STABLE and related checks.

  innobase/include/page0page.ic
    1.16 06/03/29 23:04:27 aivanov@stripped +0 -13
    Applied innodb-5.0-ss368 snapshot
      Remove UNIV_RELEASE_NOT_YET_STABLE and related checks.

  innobase/include/ha0ha.h
    1.8 06/03/29 23:04:27 aivanov@stripped +5 -3
    Applied innodb-5.0-ss368 snapshot

  innobase/include/buf0lru.h
    1.9 06/03/29 23:04:27 aivanov@stripped +2 -2
    Applied innodb-5.0-ss368 snapshot

  innobase/include/btr0cur.h
    1.16 06/03/29 23:04:27 aivanov@stripped +4 -1
    Applied innodb-5.0-ss368 snapshot

  innobase/ha/ha0ha.c
    1.16 06/03/29 23:04:27 aivanov@stripped +10 -4
    Applied innodb-5.0-ss368 snapshot

  innobase/fil/fil0fil.c
    1.64 06/03/29 23:04:27 aivanov@stripped +33 -17
    Applied innodb-5.0-ss368 snapshot
      fil_extend_space_to_desired_size(): in UNIV_HOTBACKUP builds,
      do not touch srv_data_file_sizes[] or srv_n_data_files.

  innobase/dict/dict0dict.c
    1.73 06/03/29 23:04:27 aivanov@stripped +2 -1
    Applied innodb-5.0-ss368 snapshot

  innobase/data/data0type.c
    1.22 06/03/29 23:04:27 aivanov@stripped +1 -1
    Applied innodb-5.0-ss368 snapshot
      dtype_print(): Fix printing of prtype.

  innobase/buf/buf0lru.c
    1.27 06/03/29 23:04:27 aivanov@stripped +8 -8
    Applied innodb-5.0-ss368 snapshot

  innobase/buf/buf0buf.c
    1.52 06/03/29 23:04:27 aivanov@stripped +5 -0
    Applied innodb-5.0-ss368 snapshot

  innobase/btr/btr0sea.c
    1.39 06/03/29 23:04:26 aivanov@stripped +30 -4
    Applied innodb-5.0-ss368 snapshot

  innobase/btr/btr0cur.c
    1.55 06/03/29 23:04:26 aivanov@stripped +8 -5
    Applied innodb-5.0-ss368 snapshot

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	aivanov
# Host:	mysqld.creware.com
# Root:	/home/alexi/innodb/mysql-5.0-ss368

--- 1.54/innobase/btr/btr0cur.c	2005-07-05 13:10:10 +04:00
+++ 1.55/innobase/btr/btr0cur.c	2006-03-29 23:04:26 +04:00
@@ -1915,13 +1915,13 @@
 	ut_a(rec || optim_err != DB_UNDERFLOW);
 
 	if (rec) {
-		offsets = rec_get_offsets(rec, index, offsets,
-					ULINT_UNDEFINED, &heap);
-
 		lock_rec_restore_from_page_infimum(rec, page);
 		rec_set_field_extern_bits(rec, index,
 						ext_vect, n_ext_vect, mtr);
-		
+
+		offsets = rec_get_offsets(rec, index, offsets,
+					ULINT_UNDEFINED, &heap);
+
 		if (!rec_get_deleted_flag(rec, rec_offs_comp(offsets))) {
 			/* The new inserted record owns its possible externally
 			stored fields */
@@ -3329,7 +3329,10 @@
 	dict_index_t*	index,		/* in: index of rec; the index tree
 					MUST be X-latched */
 	rec_t*		rec,		/* in: record */
-	const ulint*	offsets,	/* in: rec_get_offsets(rec, index) */
+	const ulint*	offsets,	/* in: rec_get_offsets(rec, index);
+					the "external storage" flags in offsets
+					will not correspond to rec when
+					this function returns */
 	big_rec_t*	big_rec_vec,	/* in: vector containing fields
 					to be stored externally */
 	mtr_t*		local_mtr __attribute__((unused))) /* in: mtr

--- 1.38/innobase/btr/btr0sea.c	2006-01-31 21:41:42 +03:00
+++ 1.39/innobase/btr/btr0sea.c	2006-03-29 23:04:26 +04:00
@@ -1600,14 +1600,29 @@
 	ulint		n_page_dumps	= 0;
 	ibool		ok		= TRUE;
 	ulint		i;
+	ulint		cell_count;
 	mem_heap_t*	heap		= NULL;
 	ulint		offsets_[REC_OFFS_NORMAL_SIZE];
 	ulint*		offsets		= offsets_;
 	*offsets_ = (sizeof offsets_) / sizeof *offsets_;
+
+	/* How many cells to check before temporarily releasing
+	btr_search_latch. */
+	ulint		chunk_size = 10000;
 	
 	rw_lock_x_lock(&btr_search_latch);
 
-	for (i = 0; i < hash_get_n_cells(btr_search_sys->hash_index); i++) {
+	cell_count = hash_get_n_cells(btr_search_sys->hash_index);
+	
+	for (i = 0; i < cell_count; i++) {
+		/* We release btr_search_latch every once in a while to
+		give other queries a chance to run. */
+		if ((i != 0) && ((i % chunk_size) == 0)) {
+			rw_lock_x_unlock(&btr_search_latch);
+			os_thread_yield();
+			rw_lock_x_lock(&btr_search_latch);
+		}
+		
 		node = hash_get_nth_cell(btr_search_sys->hash_index, i)->node;
 
 		while (node != NULL) {
@@ -1660,10 +1675,21 @@
 			node = node->next;
 		}
 	}
-	
-	if (!ha_validate(btr_search_sys->hash_index)) {
 
-		ok = FALSE;
+	for (i = 0; i < cell_count; i += chunk_size) {
+		ulint end_index = ut_min(i + chunk_size - 1, cell_count - 1);
+		
+		/* We release btr_search_latch every once in a while to
+		give other queries a chance to run. */
+		if (i != 0) {
+			rw_lock_x_unlock(&btr_search_latch);
+			os_thread_yield();
+			rw_lock_x_lock(&btr_search_latch);
+		}
+
+		if (!ha_validate(btr_search_sys->hash_index, i, end_index)) {
+			ok = FALSE;
+		}
 	}
 
 	rw_lock_x_unlock(&btr_search_latch);

--- 1.51/innobase/buf/buf0buf.c	2005-09-28 12:14:22 +04:00
+++ 1.52/innobase/buf/buf0buf.c	2006-03-29 23:04:27 +04:00
@@ -464,11 +464,16 @@
 	byte*		frame)	/* in: pointer to buffer frame, or NULL if in
 				the case of AWE there is no frame */
 {
+	block->magic_n = 0;
+
 	block->state = BUF_BLOCK_NOT_USED;
 	
 	block->frame = frame;
 
 	block->awe_info = NULL;
+
+	block->buf_fix_count = 0;
+	block->io_fix = 0;
 
 	block->modify_clock = ut_dulint_zero;
 	

--- 1.26/innobase/buf/buf0lru.c	2005-06-15 13:50:18 +04:00
+++ 1.27/innobase/buf/buf0lru.c	2006-03-29 23:04:27 +04:00
@@ -294,14 +294,14 @@
 }	
 
 /**********************************************************************
-Returns TRUE if less than 15 % of the buffer pool is available. This can be
+Returns TRUE if less than 25 % of the buffer pool is available. This can be
 used in heuristics to prevent huge transactions eating up the whole buffer
 pool for their locks. */
 
 ibool
 buf_LRU_buf_pool_running_out(void)
 /*==============================*/
-				/* out: TRUE if less than 15 % of buffer pool
+				/* out: TRUE if less than 25 % of buffer pool
 				left */
 {
 	ibool	ret	= FALSE;
@@ -309,7 +309,7 @@
 	mutex_enter(&(buf_pool->mutex));
 
 	if (!recv_recovery_on && UT_LIST_GET_LEN(buf_pool->free)
-	   + UT_LIST_GET_LEN(buf_pool->LRU) < buf_pool->max_size / 7) {
+	   + UT_LIST_GET_LEN(buf_pool->LRU) < buf_pool->max_size / 4) {
 		
 		ret = TRUE;
 	}
@@ -340,11 +340,11 @@
 	mutex_enter(&(buf_pool->mutex));
 
 	if (!recv_recovery_on && UT_LIST_GET_LEN(buf_pool->free)
-	   + UT_LIST_GET_LEN(buf_pool->LRU) < buf_pool->max_size / 10) {
+	   + UT_LIST_GET_LEN(buf_pool->LRU) < buf_pool->max_size / 20) {
 	   	ut_print_timestamp(stderr);
 
 	   	fprintf(stderr,
-"  InnoDB: ERROR: over 9 / 10 of the buffer pool is occupied by\n"
+"  InnoDB: ERROR: over 95 percent of the buffer pool is occupied by\n"
 "InnoDB: lock heaps or the adaptive hash index! Check that your\n"
 "InnoDB: transactions do not set too many row locks.\n"
 "InnoDB: Your buffer pool size is %lu MB. Maybe you should make\n"
@@ -356,17 +356,17 @@
 		ut_error;
 	   
 	} else if (!recv_recovery_on && UT_LIST_GET_LEN(buf_pool->free)
-	   + UT_LIST_GET_LEN(buf_pool->LRU) < buf_pool->max_size / 5) {
+	   + UT_LIST_GET_LEN(buf_pool->LRU) < buf_pool->max_size / 3) {
 
 		if (!buf_lru_switched_on_innodb_mon) {
 
-	   		/* Over 80 % of the buffer pool is occupied by lock
+	   		/* Over 67 % of the buffer pool is occupied by lock
 			heaps or the adaptive hash index. This may be a memory
 			leak! */
 
 	   		ut_print_timestamp(stderr);
 	   		fprintf(stderr,
-"  InnoDB: WARNING: over 4 / 5 of the buffer pool is occupied by\n"
+"  InnoDB: WARNING: over 67 percent of the buffer pool is occupied by\n"
 "InnoDB: lock heaps or the adaptive hash index! Check that your\n"
 "InnoDB: transactions do not set too many row locks.\n"
 "InnoDB: Your buffer pool size is %lu MB. Maybe you should make\n"

--- 1.21/innobase/data/data0type.c	2005-05-13 13:55:51 +04:00
+++ 1.22/innobase/data/data0type.c	2006-03-29 23:04:27 +04:00
@@ -252,7 +252,7 @@
 		} else if (prtype == DATA_ENGLISH) {
 			fputs("DATA_ENGLISH", stderr);
 		} else {
-			fprintf(stderr, "prtype %lu", (ulong) mtype);
+			fprintf(stderr, "prtype %lu", (ulong) prtype);
 		}
 	}
 

--- 1.72/innobase/dict/dict0dict.c	2006-01-31 21:41:42 +03:00
+++ 1.73/innobase/dict/dict0dict.c	2006-03-29 23:04:27 +04:00
@@ -2194,8 +2194,9 @@
 	fputs(msg, file);
 	fputs(" Constraint:\n", file);
 	dict_print_info_on_foreign_key_in_create_format(file, NULL, fk, TRUE);
+	putc('\n', file);
 	if (fk->foreign_index) {
-		fputs("\nThe index in the foreign key in table is ", file);
+		fputs("The index in the foreign key in table is ", file);
 		ut_print_name(file, NULL, fk->foreign_index->name);
 		fputs(
 "\nSee http://dev.mysql.com/doc/mysql/en/InnoDB_foreign_key_constraints.html\n"

--- 1.63/innobase/fil/fil0fil.c	2006-01-31 21:41:42 +03:00
+++ 1.64/innobase/fil/fil0fil.c	2006-03-29 23:04:27 +04:00
@@ -3557,6 +3557,7 @@
 
 	*actual_size = space->size;
 
+#ifndef UNIV_HOTBACKUP
 	if (space_id == 0) {
 		ulint pages_per_mb = (1024 * 1024) / UNIV_PAGE_SIZE;
 
@@ -3566,6 +3567,7 @@
 		srv_data_file_sizes[srv_n_data_files - 1] =
 				(node->size / pages_per_mb) * pages_per_mb;
 	}
+#endif /* !UNIV_HOTBACKUP */
 
 	/*
         printf("Extended %s to %lu, actual size %lu pages\n", space->name,
@@ -3821,6 +3823,31 @@
 }
 
 /************************************************************************
+Report information about an invalid page access. */
+static
+void
+fil_report_invalid_page_access(
+/*===========================*/
+	ulint		block_offset,	/* in: block offset */
+	ulint		space_id,	/* in: space id */
+	const char*	space_name,	/* in: space name */
+	ulint		byte_offset,	/* in: byte offset */
+	ulint		len,		/* in: I/O length */
+	ulint		type)		/* in: I/O type */
+{
+	fprintf(stderr,
+	"InnoDB: Error: trying to access page number %lu in space %lu,\n"
+	"InnoDB: space name %s,\n"
+	"InnoDB: which is outside the tablespace bounds.\n"
+	"InnoDB: Byte offset %lu, len %lu, i/o type %lu.\n"
+	"InnoDB: If you get this error at mysqld startup, please check that\n"
+	"InnoDB: your my.cnf matches the ibdata files that you have in the\n"
+	"InnoDB: MySQL server.\n",
+		(ulong) block_offset, (ulong) space_id, space_name,
+		(ulong) byte_offset, (ulong) len, (ulong) type);
+}
+
+/************************************************************************
 Reads or writes data. This operation is asynchronous (aio). */
 
 ulint
@@ -3926,14 +3953,8 @@
 
 	for (;;) {
 		if (node == NULL) {
-			fprintf(stderr,
-	"InnoDB: Error: trying to access page number %lu in space %lu,\n"
-	"InnoDB: space name %s,\n"
-	"InnoDB: which is outside the tablespace bounds.\n"
-	"InnoDB: Byte offset %lu, len %lu, i/o type %lu\n", 
- 			(ulong) block_offset, (ulong) space_id,
-			space->name, (ulong) byte_offset, (ulong) len,
-			(ulong) type);
+			fil_report_invalid_page_access(block_offset, space_id,
+				space->name, byte_offset, len, type);
  			
 			ut_error;
 		}
@@ -3962,15 +3983,10 @@
 	if (space->purpose == FIL_TABLESPACE && space->id != 0
 	    && node->size <= block_offset) {
 
-	        fprintf(stderr,
-	"InnoDB: Error: trying to access page number %lu in space %lu,\n"
-	"InnoDB: space name %s,\n"
-	"InnoDB: which is outside the tablespace bounds.\n"
-	"InnoDB: Byte offset %lu, len %lu, i/o type %lu\n", 
- 			(ulong) block_offset, (ulong) space_id,
-			space->name, (ulong) byte_offset, (ulong) len,
-			(ulong) type);
- 		ut_a(0);
+		fil_report_invalid_page_access(block_offset, space_id,
+			space->name, byte_offset, len, type);
+
+		ut_error;
 	}
 
 	/* Now we have made the changes in the data structures of system */

--- 1.15/innobase/ha/ha0ha.c	2004-12-08 15:34:51 +03:00
+++ 1.16/innobase/ha/ha0ha.c	2006-03-29 23:04:27 +04:00
@@ -276,20 +276,26 @@
 }
 
 /*****************************************************************
-Validates a hash table. */
+Validates a given range of the cells in hash table. */
 
 ibool
 ha_validate(
 /*========*/
-				/* out: TRUE if ok */
-	hash_table_t*	table)	/* in: hash table */
+					/* out: TRUE if ok */
+	hash_table_t*	table,		/* in: hash table */
+	ulint		start_index,	/* in: start index */
+	ulint		end_index)	/* in: end index */
 {
 	hash_cell_t*	cell;
 	ha_node_t*	node;
 	ibool		ok	= TRUE;
 	ulint		i;
 
-	for (i = 0; i < hash_get_n_cells(table); i++) {
+	ut_a(start_index <= end_index);
+	ut_a(start_index < hash_get_n_cells(table));
+	ut_a(end_index < hash_get_n_cells(table));
+
+	for (i = start_index; i <= end_index; i++) {
 
 		cell = hash_get_nth_cell(table, i);
 

--- 1.15/innobase/include/btr0cur.h	2005-04-18 16:12:21 +04:00
+++ 1.16/innobase/include/btr0cur.h	2006-03-29 23:04:27 +04:00
@@ -459,7 +459,10 @@
 	dict_index_t*	index,		/* in: index of rec; the index tree
 					MUST be X-latched */
 	rec_t*		rec,		/* in: record */
-	const ulint*	offsets,	/* in: rec_get_offsets(rec, index) */
+	const ulint*	offsets,	/* in: rec_get_offsets(rec, index);
+					the "external storage" flags in offsets
+					will not correspond to rec when
+					this function returns */
 	big_rec_t*	big_rec_vec,	/* in: vector containing fields
 					to be stored externally */
 	mtr_t*		local_mtr);	/* in: mtr containing the latch to

--- 1.8/innobase/include/buf0lru.h	2005-06-13 12:39:23 +04:00
+++ 1.9/innobase/include/buf0lru.h	2006-03-29 23:04:27 +04:00
@@ -26,14 +26,14 @@
 buf_LRU_try_free_flushed_blocks(void);
 /*==================================*/
 /**********************************************************************
-Returns TRUE if less than 15 % of the buffer pool is available. This can be
+Returns TRUE if less than 25 % of the buffer pool is available. This can be
 used in heuristics to prevent huge transactions eating up the whole buffer
 pool for their locks. */
 
 ibool
 buf_LRU_buf_pool_running_out(void);
 /*==============================*/
-				/* out: TRUE if less than 15 % of buffer pool
+				/* out: TRUE if less than 25 % of buffer pool
 				left */
 
 /*#######################################################################

--- 1.7/innobase/include/ha0ha.h	2004-12-08 15:34:51 +03:00
+++ 1.8/innobase/include/ha0ha.h	2006-03-29 23:04:27 +04:00
@@ -114,13 +114,15 @@
 	ulint		fold,	/* in: fold value */
 	page_t*		page);	/* in: buffer page */
 /*****************************************************************
-Validates a hash table. */
+Validates a given range of the cells in hash table. */
 
 ibool
 ha_validate(
 /*========*/
-				/* out: TRUE if ok */
-	hash_table_t*	table);	/* in: hash table */
+					/* out: TRUE if ok */
+	hash_table_t*	table,		/* in: hash table */
+	ulint		start_index,	/* in: start index */
+	ulint		end_index);	/* in: end index */
 /*****************************************************************
 Prints info of a hash table. */
 

--- 1.15/innobase/include/page0page.ic	2005-09-03 20:15:13 +04:00
+++ 1.16/innobase/include/page0page.ic	2006-03-29 23:04:27 +04:00
@@ -175,19 +175,6 @@
 				/* out: nonzero if in compact format */
 	const rec_t*	rec)	/* in: record */
 {
-#ifdef UNIV_RELEASE_NOT_YET_STABLE
-	if (UNIV_UNLIKELY((ulint)rec < (ulint)(buf_pool->frame_zero))
-	    || UNIV_UNLIKELY((ulint)rec >= (ulint)(buf_pool->high_end))) {
-
-		ut_print_timestamp(stderr);	
-		fprintf(stderr,
-"InnoDB: Error: trying to read a stray page rec %p\n"
-"InnoDB: buf pool start is at %p, end at %p\n",
- 			rec, buf_pool->frame_zero,
-			buf_pool->high_end);
-		ut_error;
-	}
-#endif
 	return(page_is_comp(ut_align_down((rec_t*) rec, UNIV_PAGE_SIZE)));
 }
 

--- 1.45/innobase/include/univ.i	2006-01-31 21:41:42 +03:00
+++ 1.46/innobase/include/univ.i	2006-03-29 23:04:27 +04:00
@@ -80,10 +80,6 @@
 
 /* Make a non-inline debug version */
 
-/* You can remove this define when the release is stable. This define adds
-some consistency checks to code. They use a little CPU time. */
-#define UNIV_RELEASE_NOT_YET_STABLE
-
 /*
 #define UNIV_DEBUG
 #define UNIV_MEM_DEBUG

--- 1.76/innobase/row/row0ins.c	2006-01-16 14:03:55 +03:00
+++ 1.77/innobase/row/row0ins.c	2006-03-29 23:04:27 +04:00
@@ -28,6 +28,7 @@
 #include "eval0eval.h"
 #include "data0data.h"
 #include "usr0sess.h"
+#include "buf0lru.h"
 
 #define	ROW_INS_PREV	1
 #define	ROW_INS_NEXT	2
@@ -278,10 +279,17 @@
 		}
 	} else  {
 		ut_a(mode == BTR_MODIFY_TREE);
+		if (buf_LRU_buf_pool_running_out()) {
+	
+			err = DB_LOCK_TABLE_FULL;
+		
+			goto func_exit;
+		}
+
 		err = btr_cur_pessimistic_update(BTR_KEEP_SYS_FLAG, cursor,
 					&dummy_big_rec, update, 0, thr, mtr);
 	}
-
+func_exit:
 	mem_heap_free(heap);
 
 	return(err);
@@ -342,10 +350,16 @@
 		}
 	} else  {
 		ut_a(mode == BTR_MODIFY_TREE);
+		if (buf_LRU_buf_pool_running_out()) {
+	
+			err = DB_LOCK_TABLE_FULL;
+
+			goto func_exit;
+		}
 		err = btr_cur_pessimistic_update(0, cursor, big_rec, update,
 								0, thr, mtr);
 	}
-	
+func_exit:	
 	mem_heap_free(heap);
 
 	return(err);
@@ -1860,7 +1874,6 @@
 				err = DB_DUPLICATE_KEY;
 				goto func_exit;
 			}
-			mem_heap_free(heap);
 		}
 
 		ut_a(!(cursor->index->type & DICT_CLUSTERED));
@@ -1869,6 +1882,9 @@
 
 	err = DB_SUCCESS;
 func_exit:
+	if (UNIV_LIKELY_NULL(heap)) {
+		mem_heap_free(heap);
+	}
 	return(err);
 #else /* UNIV_HOTBACKUP */
 	/* This function depends on MySQL code that is not included in
@@ -2068,6 +2084,12 @@
 					&insert_rec, &big_rec, thr, &mtr);
 		} else {
 			ut_a(mode == BTR_MODIFY_TREE);
+			if (buf_LRU_buf_pool_running_out()) {
+	
+				err = DB_LOCK_TABLE_FULL;
+
+				goto function_exit;
+			}
 			err = btr_cur_pessimistic_insert(0, &cursor, entry,
 					&insert_rec, &big_rec, thr, &mtr);
 		}

--- 1.105/innobase/row/row0sel.c	2006-01-16 14:03:55 +03:00
+++ 1.106/innobase/row/row0sel.c	2006-03-29 23:04:27 +04:00
@@ -2358,16 +2358,16 @@
 	} else if (templ->type == DATA_MYSQL) {
 		memcpy(dest, data, len);
 
-		ut_a(templ->mysql_col_len >= len);
-		ut_a(templ->mbmaxlen >= templ->mbminlen);
+		ut_ad(templ->mysql_col_len >= len);
+		ut_ad(templ->mbmaxlen >= templ->mbminlen);
 
-		ut_a(templ->mbmaxlen > templ->mbminlen
+		ut_ad(templ->mbmaxlen > templ->mbminlen
 			|| templ->mysql_col_len == len);
 		/* The following assertion would fail for old tables
 		containing UTF-8 ENUM columns due to Bug #9526. */
 		ut_ad(!templ->mbmaxlen
 			|| !(templ->mysql_col_len % templ->mbmaxlen));
-		ut_a(len * templ->mbmaxlen >= templ->mysql_col_len);
+		ut_ad(len * templ->mbmaxlen >= templ->mysql_col_len);
 
 		if (templ->mbminlen != templ->mbmaxlen) {
 			/* Pad with spaces. This undoes the stripping
@@ -2377,7 +2377,7 @@
 			memset(dest + len, 0x20, templ->mysql_col_len - len);
 		}
 	} else {
-		ut_a(templ->type == DATA_CHAR
+		ut_ad(templ->type == DATA_CHAR
 			|| templ->type == DATA_FIXBINARY
 			/*|| templ->type == DATA_SYS_CHILD
 			|| templ->type == DATA_SYS*/

--- 1.41/innobase/row/row0upd.c	2005-10-19 21:20:16 +04:00
+++ 1.42/innobase/row/row0upd.c	2006-03-29 23:04:27 +04:00
@@ -28,6 +28,7 @@
 #include "log0log.h"
 #include "pars0sym.h"
 #include "eval0eval.h"
+#include "buf0lru.h"
 
 
 /* What kind of latch and lock can we assume when the control comes to
@@ -1523,6 +1524,10 @@
 		return(err);
 	}
 
+	if (buf_LRU_buf_pool_running_out()) {
+	
+		return(DB_LOCK_TABLE_FULL);
+	}
 	/* We may have to modify the tree structure: do a pessimistic descent
 	down the index tree */
 

--- 1.126/mysql-test/t/innodb.test	2006-02-24 19:34:08 +03:00
+++ 1.127/mysql-test/t/innodb.test	2006-03-29 23:04:27 +04:00
@@ -1762,7 +1762,6 @@
 
 set foreign_key_checks=0;
 create table t2 (a int primary key, b int, foreign key (b) references t1(a)) engine =
innodb;
---replace_result $MYSQLTEST_VARDIR . master-data/ ''
 -- error 1005
 create table t1(a char(10) primary key, b varchar(20)) engine = innodb;
 set foreign_key_checks=1;
@@ -1773,7 +1772,6 @@
 
 set foreign_key_checks=0;
 create table t1(a varchar(10) primary key) engine = innodb DEFAULT CHARSET=latin1;
---replace_result $MYSQLTEST_VARDIR . master-data/ ''
 -- error 1005
 create table t2 (a varchar(10), foreign key (a) references t1(a)) engine = innodb DEFAULT
CHARSET=utf8;
 set foreign_key_checks=1;
@@ -1803,7 +1801,6 @@
 set foreign_key_checks=0;
 create table t2 (a varchar(10), foreign key (a) references t1(a)) engine = innodb DEFAULT
CHARSET=latin1;
 create table t3(a varchar(10) primary key) engine = innodb DEFAULT CHARSET=utf8;
---replace_result $MYSQLTEST_VARDIR . master-data/ ''
 -- error 1025
 rename table t3 to t1;
 set foreign_key_checks=1;
@@ -2124,5 +2121,6 @@
 drop trigger t3t;
 drop trigger t4t;
 drop table t1, t2, t3, t4, t5;
+connection default;
 disconnect a;
 disconnect b;

--- 1.289/sql/ha_innodb.cc	2006-03-24 16:21:41 +03:00
+++ 1.290/sql/ha_innodb.cc	2006-03-29 23:04:27 +04:00
@@ -513,13 +513,13 @@
 
     		return(HA_ERR_NO_SAVEPOINT);
   	} else if (error == (int) DB_LOCK_TABLE_FULL) {
-          /* Since we rolled back the whole transaction, we must
-          tell it also to MySQL so that MySQL knows to empty the
-          cached binlog for this transaction */
-
-          if (thd) {
-                  ha_rollback(thd);
-          }
+ 		/* Since we rolled back the whole transaction, we must
+ 		tell it also to MySQL so that MySQL knows to empty the
+ 		cached binlog for this transaction */
+
+ 		if (thd) {
+ 			ha_rollback(thd);
+ 		}
 
     		return(HA_ERR_LOCK_TABLE_FULL);
     	} else {
@@ -6726,32 +6726,37 @@
 
 static INNOBASE_SHARE *get_share(const char *table_name)
 {
-  INNOBASE_SHARE *share;
-  pthread_mutex_lock(&innobase_share_mutex);
-  uint length=(uint) strlen(table_name);
-  if (!(share=(INNOBASE_SHARE*) hash_search(&innobase_open_tables,
-					(mysql_byte*) table_name,
-					    length)))
-  {
-    if ((share=(INNOBASE_SHARE *) my_malloc(sizeof(*share)+length+1,
-				       MYF(MY_WME | MY_ZEROFILL))))
-    {
-      share->table_name_length=length;
-      share->table_name=(char*) (share+1);
-      strmov(share->table_name,table_name);
-      if (my_hash_insert(&innobase_open_tables, (mysql_byte*) share))
-      {
-        pthread_mutex_unlock(&innobase_share_mutex);
-	my_free((gptr) share,0);
-	return 0;
-      }
-      thr_lock_init(&share->lock);
-      pthread_mutex_init(&share->mutex,MY_MUTEX_INIT_FAST);
-    }
-  }
-  share->use_count++;
-  pthread_mutex_unlock(&innobase_share_mutex);
-  return share;
+	INNOBASE_SHARE *share;
+	pthread_mutex_lock(&innobase_share_mutex);
+	uint length=(uint) strlen(table_name);
+	
+	if (!(share=(INNOBASE_SHARE*) hash_search(&innobase_open_tables,
+				(mysql_byte*) table_name,
+				length))) {
+
+		share = (INNOBASE_SHARE *) my_malloc(sizeof(*share)+length+1,
+			MYF(MY_FAE | MY_ZEROFILL));
+
+		share->table_name_length=length;
+		share->table_name=(char*) (share+1);
+		strmov(share->table_name,table_name);
+
+		if (my_hash_insert(&innobase_open_tables,
+				(mysql_byte*) share)) {
+			pthread_mutex_unlock(&innobase_share_mutex);
+			my_free((gptr) share,0);
+			
+			return 0;
+		}
+		
+		thr_lock_init(&share->lock);
+		pthread_mutex_init(&share->mutex,MY_MUTEX_INIT_FAST);
+	}
+	
+	share->use_count++;
+	pthread_mutex_unlock(&innobase_share_mutex);
+	
+	return share;
 }
 
 static void free_share(INNOBASE_SHARE *share)
@@ -6825,14 +6830,16 @@
 		    prebuilt->trx->isolation_level != TRX_ISO_SERIALIZABLE &&
 		    (lock_type == TL_READ || lock_type == TL_READ_NO_INSERT) &&
 		    (thd->lex->sql_command == SQLCOM_INSERT_SELECT ||
-		     thd->lex->sql_command == SQLCOM_UPDATE)) {
+		     thd->lex->sql_command == SQLCOM_UPDATE ||
+		     thd->lex->sql_command == SQLCOM_CREATE_TABLE)) {
 
 			/* In case we have innobase_locks_unsafe_for_binlog
 			option set and isolation level of the transaction
 			is not set to serializable and MySQL is doing
-			INSERT INTO...SELECT or UPDATE ... = (SELECT ...)
-			without FOR UPDATE or IN SHARE MODE in select, then
-			we use consistent read for select. */
+			INSERT INTO...SELECT or UPDATE ... = (SELECT ...) or
+			CREATE  ... SELECT... without FOR UPDATE or
+			IN SHARE MODE in select, then we use consistent
+			read for select. */
 
 			prebuilt->select_lock_type = LOCK_NONE;
 			prebuilt->stored_select_lock_type = LOCK_NONE;
@@ -6885,14 +6892,15 @@
 		writers. Note that ALTER TABLE uses a TL_WRITE_ALLOW_READ
 		< TL_WRITE_CONCURRENT_INSERT.
 
-		We especially allow multiple writers if MySQL is at the 
-		start of a stored procedure call (SQLCOM_CALL) 
-		(MySQL does have thd->in_lock_tables TRUE there). */
+		We especially allow multiple writers if MySQL is at the
+		start of a stored procedure call (SQLCOM_CALL) or a
+		stored function call (MySQL does have thd->in_lock_tables
+		TRUE there). */
 
     		if ((lock_type >= TL_WRITE_CONCURRENT_INSERT 
 		    && lock_type <= TL_WRITE)
 		    && !(thd->in_lock_tables
-                         && thd->lex->sql_command == SQLCOM_LOCK_TABLES)
+			    && thd->lex->sql_command == SQLCOM_LOCK_TABLES)
 		    && !thd->tablespace_op
 		    && thd->lex->sql_command != SQLCOM_TRUNCATE
 		    && thd->lex->sql_command != SQLCOM_OPTIMIZE
Thread
bk commit into 5.0 tree (aivanov:1.2107)Alex Ivanov Notebook29 Mar