diff options
author | unknown <heikki@hundin.mysql.fi> | 2002-07-21 12:58:14 +0300 |
---|---|---|
committer | unknown <heikki@hundin.mysql.fi> | 2002-07-21 12:58:14 +0300 |
commit | b6b2546c18faf4d72a879e5ef756a241144c7018 (patch) | |
tree | 81c39a68aa307f4493fbb83c4e27f12460766943 /innobase | |
parent | a9c52ff7172308af72f062a1cae86671cbb1ed7a (diff) | |
download | mariadb-git-b6b2546c18faf4d72a879e5ef756a241144c7018.tar.gz |
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
innobase/dict/dict0dict.c:
test
innobase/row/row0ins.c:
Do not perform ON DELETE action for a FOREIGN KEY constraint if we are doing an UPDATE, not a DELETE
Diffstat (limited to 'innobase')
-rw-r--r-- | innobase/dict/dict0dict.c | 37 | ||||
-rw-r--r-- | innobase/row/row0ins.c | 12 |
2 files changed, 42 insertions, 7 deletions
diff --git a/innobase/dict/dict0dict.c b/innobase/dict/dict0dict.c index 7c166ecd068..65f40d345d8 100644 --- a/innobase/dict/dict0dict.c +++ b/innobase/dict/dict0dict.c @@ -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; } } diff --git a/innobase/row/row0ins.c b/innobase/row/row0ins.c index ee4805d51d2..5badebf2011 100644 --- a/innobase/row/row0ins.c +++ b/innobase/row/row0ins.c @@ -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 |