Loading innobase/dict/dict0dict.c +30 −7 Original line number Diff line number Diff line Loading @@ -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)); Loading @@ -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( Loading @@ -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)); Loading Loading @@ -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; } } Loading innobase/row/row0ins.c +12 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading
innobase/dict/dict0dict.c +30 −7 Original line number Diff line number Diff line Loading @@ -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)); Loading @@ -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( Loading @@ -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)); Loading Loading @@ -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; } } Loading
innobase/row/row0ins.c +12 −0 Original line number Diff line number Diff line Loading @@ -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 Loading