Commit 5f6d8e65 authored by unknown's avatar unknown
Browse files

Merge hundin.mysql.fi:/home/heikki/mysql-4.0

into hundin.mysql.fi:/home/heikki/mysql-4.1


innobase/row/row0ins.c:
  Auto merged
innobase/row/row0mysql.c:
  Auto merged
parents 47efc5f3 a7b984d2
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -1415,8 +1415,34 @@ row_ins_check_foreign_constraints(
				row_mysql_freeze_data_dictionary(trx);
			}

			if (foreign->referenced_table) {
				mutex_enter(&(dict_sys->mutex));

				(foreign->referenced_table
					->n_foreign_key_checks_running)++;

				mutex_exit(&(dict_sys->mutex));
			}

			/* NOTE that if the thread ends up waiting for a lock
			we will release dict_operation_lock temporarily!
			But the counter on the table protects the referenced
			table from being dropped while the check is running. */

			err = row_ins_check_foreign_constraint(TRUE, foreign,
						table, entry, thr);

			if (foreign->referenced_table) {
				mutex_enter(&(dict_sys->mutex));

				ut_a(foreign->referenced_table
					->n_foreign_key_checks_running > 0);
				(foreign->referenced_table
					->n_foreign_key_checks_running)--;

				mutex_exit(&(dict_sys->mutex));
			}

			if (got_s_lock) {
				row_mysql_unfreeze_data_dictionary(trx);
			}
+11 −5
Original line number Diff line number Diff line
@@ -1833,6 +1833,12 @@ row_drop_table_for_mysql_in_background(

	trx = trx_allocate_for_background();

	/* If the original transaction was dropping a table referenced by
	foreign keys, we must set the following to be able to drop the
	table: */

	trx->check_foreigns = FALSE;

/*	fputs("InnoDB: Error: Dropping table ", stderr);
	ut_print_name(stderr, name);
	fputs(" in background drop list\n", stderr); */
@@ -1907,16 +1913,16 @@ row_drop_tables_for_mysql_in_background(void)
	        goto already_dropped;
	}
							
	if (table->n_mysql_handles_opened > 0
				|| table->n_foreign_key_checks_running > 0) {
	if (DB_SUCCESS != row_drop_table_for_mysql_in_background(
							drop->table_name)) {
		/* If the DROP fails for some table, we return, and let the
		main thread retry later */

		return(n_tables + n_tables_dropped);
	}

	n_tables_dropped++;

	row_drop_table_for_mysql_in_background(drop->table_name);

already_dropped:
	mutex_enter(&kernel_mutex);