diff options
Diffstat (limited to 'storage/tokudb/ha_tokudb_update.cc')
-rw-r--r-- | storage/tokudb/ha_tokudb_update.cc | 96 |
1 files changed, 46 insertions, 50 deletions
diff --git a/storage/tokudb/ha_tokudb_update.cc b/storage/tokudb/ha_tokudb_update.cc index 105c12a569d..bb59d112680 100644 --- a/storage/tokudb/ha_tokudb_update.cc +++ b/storage/tokudb/ha_tokudb_update.cc @@ -23,8 +23,6 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #ident "Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved." -#if defined(TOKU_INCLUDE_UPSERT) - // Point updates and upserts // Restrictions: @@ -52,6 +50,7 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. // Support more complicated update expressions // Replace field_offset +#if defined(TOKU_INCLUDE_UPSERT) && TOKU_INCLUDE_UPSERT // Debug function to dump an Item static void dump_item(Item* item) { fprintf(stderr, "%u", item->type()); @@ -130,7 +129,7 @@ static void dump_item_list(const char* h, List<Item> &l) { } // Find a Field by its Item name -static Field* find_field_by_name(TABLE* table, Item* item) { +static Field* find_field_by_name(TOKUDB_UNUSED(TABLE* table), Item* item) { if (item->type() != Item::FIELD_ITEM) return NULL; Item_field* field_item = static_cast<Item_field*>(item); @@ -191,12 +190,9 @@ static uint32_t var_field_index( return v_index; } -static uint32_t blob_field_index( - TABLE* table, - KEY_AND_COL_INFO* kc_info, - uint idx, - uint field_num) { - +static uint32_t blob_field_index(TABLE* table, + KEY_AND_COL_INFO* kc_info, + uint field_num) { assert_always(field_num < table->s->fields); uint b_index; for (b_index = 0; b_index < kc_info->num_blobs; b_index++) { @@ -221,43 +217,46 @@ int ha_tokudb::fast_update( TOKUDB_HANDLER_DBUG_ENTER(""); int error = 0; + if (!tokudb::sysvars::enable_fast_update(thd)) { + error = ENOTSUP; + goto exit; + } + if (TOKUDB_UNLIKELY(TOKUDB_DEBUG_FLAGS(TOKUDB_DEBUG_UPSERT))) { dump_item_list("fields", update_fields); dump_item_list("values", update_values); if (conds) { - fprintf(stderr, "conds\n"); dump_item(conds); fprintf(stderr, "\n"); + fprintf(stderr, "conds\n"); + dump_item(conds); + fprintf(stderr, "\n"); } } if (update_fields.elements < 1 || update_fields.elements != update_values.elements) { error = ENOTSUP; // something is fishy with the parameters - goto return_error; + goto exit; } - + if (!check_fast_update(thd, update_fields, update_values, conds)) { - error = ENOTSUP; - goto check_error; + error = HA_ERR_UNSUPPORTED; + goto exit; } error = send_update_message( - update_fields, - update_values, - conds, - transaction); - if (error != 0) { - goto check_error; - } + update_fields, update_values, conds, transaction); -check_error: - if (error != 0) { - if (tokudb::sysvars::disable_slow_update(thd) != 0) + if (error) { + int mapped_error = map_to_handler_error(error); + if (mapped_error == error) error = HA_ERR_UNSUPPORTED; - if (error != ENOTSUP) - print_error(error, MYF(0)); } -return_error: +exit: + + if (error != 0 && error != ENOTSUP) + print_error(error, MYF(0)); + TOKUDB_HANDLER_DBUG_RETURN(error); } @@ -773,11 +772,7 @@ static void marshall_update( update_operation = '='; field_type = lhs_field->binary() ? UPDATE_TYPE_BLOB : UPDATE_TYPE_TEXT; offset = - blob_field_index( - table, - &share->kc_info, - table->s->primary_key, - lhs_field->field_index); + blob_field_index(table, &share->kc_info, lhs_field->field_index); v_str = *rhs_item->val_str(&v_str); v_length = v_str.length(); if (v_length >= lhs_field->max_data_length()) { @@ -953,9 +948,13 @@ int ha_tokudb::upsert( List<Item>& update_values) { TOKUDB_HANDLER_DBUG_ENTER(""); - int error = 0; + if (!tokudb::sysvars::enable_fast_upsert(thd)) { + error = ENOTSUP; + goto exit; + } + if (TOKUDB_UNLIKELY(TOKUDB_DEBUG_FLAGS(TOKUDB_DEBUG_UPSERT))) { fprintf(stderr, "upsert\n"); dump_item_list("update_fields", update_fields); @@ -966,28 +965,27 @@ int ha_tokudb::upsert( if (update_fields.elements < 1 || update_fields.elements != update_values.elements) { error = ENOTSUP; - goto return_error; + goto exit; } if (!check_upsert(thd, update_fields, update_values)) { - error = ENOTSUP; - goto check_error; - } - - error = send_upsert_message(thd, update_fields, update_values, transaction); - if (error != 0) { - goto check_error; + error = HA_ERR_UNSUPPORTED; + goto exit; } -check_error: - if (error != 0) { - if (tokudb::sysvars::disable_slow_upsert(thd) != 0) + error = send_upsert_message(update_fields, update_values, transaction); + + if (error) { + int mapped_error = map_to_handler_error(error); + if (mapped_error == error) error = HA_ERR_UNSUPPORTED; - if (error != ENOTSUP) - print_error(error, MYF(0)); } -return_error: +exit: + + if (error != 0 && error != ENOTSUP) + print_error(error, MYF(0)); + TOKUDB_HANDLER_DBUG_RETURN(error); } @@ -1036,7 +1034,6 @@ bool ha_tokudb::check_upsert( // Generate an upsert message and send it into the primary tree. // Return 0 if successful. int ha_tokudb::send_upsert_message( - THD* thd, List<Item>& update_fields, List<Item>& update_values, DB_TXN* txn) { @@ -1131,5 +1128,4 @@ int ha_tokudb::send_upsert_message( return error; } - -#endif +#endif // defined(TOKU_INCLUDE_UPSERT) && TOKU_INCLUDE_UPSERT |