polardbxengine/plugin/polarx_rpc/executor/meta.cc

115 lines
3.3 KiB
C++

#include "../global_defines.h"
#ifndef MYSQL8
#define MYSQL_SERVER
#endif
#include "sql/key.h"
#include "sql/field.h"
#include "meta.h"
#include "log.h"
using namespace Polarx;
namespace rpc_executor {
int SearchKey::store_to_buffer(ExecKeyMeta *exec_key,
const ExecKeyMap &expr) {
int ret = HA_EXEC_SUCCESS;
KEY *key_info = exec_key->key();
KeyPartMap current_bit = 1;
/* Max column supported is 4096 */
assert(expr.parts() <= 4096);
assert(expr.parts() <= key_info->user_defined_key_parts);
key_buffer_.reset(new uchar[key_info->key_length]);
if (!key_buffer_) {
ret = HA_ERR_OUT_OF_MEM;
log_exec_error("new key buffer failed, ret: %d, key_length: %u",
ret, key_info->key_length);
} else {
// search_key -> key_info -> my_table->record[0]
int prefix_flag = 1;
for (uint32_t i = 0; i < key_info->user_defined_key_parts; ++i) {
KEY_PART_INFO *key_part = &key_info->key_part[i];
Field *field = key_part->field;
DataRep data;
if ((ret = expr.get_field(field->field_name, data))) {
// Some field is not given by user.
// This is not an error but should stop here because we can only support
// prefix seek.
if (HA_ERR_KEY_NOT_FOUND == ret) {
prefix_flag = 0;
ret = HA_EXEC_SUCCESS;
} else {
log_exec_error("unexpected error occurd when getting field from "
"search_key, ret: %d, field: %s",
ret, field->field_name);
}
} else {
if (prefix_flag == 0) {
ret = HA_ERR_KEY_NOT_FOUND;
break;
}
bitmap_set_bit(field->table->write_set, field->field_index);
switch (data.type_) {
case DataRep::SIGNED_INT:
field->set_notnull();
field->store(data.v_int_, false);
break;
case DataRep::UNSIGNED_INT:
field->set_notnull();
field->store(data.v_uint_, true);
break;
case DataRep::NULL_TYPE:
if (field->real_maybe_null()) {
field->set_null();
} else {
impossible_where_ = true;
}
break;
case DataRep::DOUBLE:
field->set_notnull();
field->store(data.v_double_);
break;
case DataRep::FLOAT:
field->set_notnull();
field->store(data.v_float_);
break;
case DataRep::BOOL:
field->set_notnull();
field->store(data.v_bool_);
break;
case DataRep::STRING:
field->set_notnull();
field->store(data.v_string_->data(),
data.size_,
field->charset());
break;
default:
ret = HA_ERR_UNSUPPORTED;
}
if (ret) {
break;
}
used_length_ += key_part->store_length;
used_part_map_ |= current_bit;
current_bit <<= 1;
}
}
}
if (!ret) {
// my_table->record[0] -> key_buffer
key_copy(key_buffer_.get(), key_info->table->record[0], key_info,
used_length_);
using_full_key_ = (((KeyPartMap)1 << key_info->actual_key_parts) - 1) ==
used_part_map_;
}
return ret;
}
} // namespace executor