Commit 51c80fae authored by heikki@hundin.mysql.fi's avatar heikki@hundin.mysql.fi
Browse files

row0ins.c:

  Do not perform ON DELETE action for a FOREIGN KEY constraint if we are doing an UPDATE, not a DELETE
dict0dict.c:
  test
parent d909f4a5
Loading
Loading
Loading
Loading
+30 −7
Original line number Diff line number Diff line
@@ -270,7 +270,7 @@ void
dict_table_autoinc_initialize(
/*==========================*/
	dict_table_t*	table,	/* in: table */
	ib_longlong	value)	/* in: value which was assigned to a row */
	ib_longlong	value)	/* in: next value to assign to a row */
{
	mutex_enter(&(table->autoinc_mutex));

@@ -281,8 +281,8 @@ dict_table_autoinc_initialize(
}

/************************************************************************
Gets the next autoinc value, 0 if not yet initialized. If initialized,
increments the counter by 1. */
Gets the next autoinc value (== autoinc counter value), 0 if not yet
initialized. If initialized, increments the counter by 1. */

ib_longlong
dict_table_autoinc_get(
@@ -298,8 +298,8 @@ dict_table_autoinc_get(

		value = 0;
	} else {
		table->autoinc = table->autoinc + 1;
		value = table->autoinc;
		table->autoinc = table->autoinc + 1;
	}
	
	mutex_exit(&(table->autoinc_mutex));
@@ -334,20 +334,43 @@ dict_table_autoinc_read(
}

/************************************************************************
Updates the autoinc counter if the value supplied is bigger than the
Peeks the autoinc counter value, 0 if not yet initialized. Does not
increment the counter. The read not protected by any mutex! */

ib_longlong
dict_table_autoinc_peek(
/*====================*/
				/* out: value of the counter */
	dict_table_t*	table)	/* in: table */
{
	ib_longlong	value;

	if (!table->autoinc_inited) {

		value = 0;
	} else {
		value = table->autoinc;
	}

	return(value);
}

/************************************************************************
Updates the autoinc counter if the value supplied is equal or bigger than the
current value. If not inited, does nothing. */

void
dict_table_autoinc_update(
/*======================*/

	dict_table_t*	table,	/* in: table */
	ib_longlong	value)	/* in: value which was assigned to a row */
{
	mutex_enter(&(table->autoinc_mutex));

	if (table->autoinc_inited) {
		if (value > table->autoinc) {
			table->autoinc = value;
		if (value >= table->autoinc) {
			table->autoinc = value + 1;
		}
	}	

+12 −0
Original line number Diff line number Diff line
@@ -389,9 +389,21 @@ row_ins_foreign_delete_or_set_null(
	char		err_buf[1000];
	
	ut_a(thr && foreign && pcur && mtr);
	ut_a(que_node_get_type(node) == QUE_NODE_UPDATE);

	node = thr->run_node;

	if (!node->is_delete) {
	        /* According to SQL-92 an UPDATE with respect to FOREIGN
	        KEY constraints is not semantically equivalent to a
                DELETE + INSERT. Therefore we do not perform any action
	        here and consequently the child rows would be left
	        orphaned if we would let the UPDATE happen. Thus we return
		an error. */

	        return(DB_ROW_IS_REFERENCED);
	}

	if (node->cascade_node == NULL) {
		/* Extend our query graph by creating a child to current
		update node. The child is used in the cascade or set null