Documentation Home
MySQL Internals Manual

MySQL Internals Manual  /  Writing a Custom Storage Engine  /  Adding Support for UPDATE to a Storage Engine

23.13 Adding Support for UPDATE to a Storage Engine

The MySQL server executes UPDATE statements by performing a (table/index/range/etc.) scan until it locates a row matching the WHERE clause of the UPDATE statement, then calling the [custom-engine.html#custom-engine-api-reference-update_row update_row() method:]

int ha_foo::update_row(const byte *old_data, byte *new_data)

The *old_data parameter contains the data that existed in the row prior to the update, while the *new_data parameter contains the new contents of the row (in the MySQL internal row format).

Performing an update will depend on row format and storage implementation. Some storage engines will replace data in-place, while other implementations delete the existing row and append the new row at the end of the data file.

Non-indexed storage engines can typically ignore the contents of the *old_data parameter and just deal with the *new_data buffer. Transactional engines may need to compare the buffers to determine what changes have been made for a later rollback.

If the table being updated contains timestamp columns, the updating of the timestamp will have to be managed in the update_row() call. The following example is from the CSV engine:

int ha_tina::update_row(const byte * old_data, byte * new_data)
   int size;


   if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_UPDATE)

   size= encode_quote(new_data);

   if (chain_append())

   if (my_write(share->data_file, buffer.ptr(), size, MYF(MY_WME | MY_NABP)))

Note the setting of the timestamp in the previous example.