summaryrefslogtreecommitdiff
path: root/sql/sql_type_fixedbin.h
diff options
context:
space:
mode:
Diffstat (limited to 'sql/sql_type_fixedbin.h')
-rw-r--r--sql/sql_type_fixedbin.h72
1 files changed, 49 insertions, 23 deletions
diff --git a/sql/sql_type_fixedbin.h b/sql/sql_type_fixedbin.h
index 5c6d496be5f..b7dcfdde9d3 100644
--- a/sql/sql_type_fixedbin.h
+++ b/sql/sql_type_fixedbin.h
@@ -111,6 +111,12 @@ public:
return fbt;
}
+ static Fbt record_to_memory(const char *ptr)
+ {
+ Fbt fbt;
+ FbtImpl::record_to_memory(fbt.m_buffer, ptr);
+ return fbt;
+ }
/*
Check at Item's fix_fields() time if "item" can return a nullable value
on conversion to Fbt, or conversion produces a NOT NULL Fbt value.
@@ -132,10 +138,10 @@ public:
{
*error= make_from_item(item, warn);
}
- void to_binary(char *str, size_t str_size) const
+ void to_record(char *str, size_t str_size) const
{
DBUG_ASSERT(str_size >= sizeof(m_buffer));
- memcpy(str, m_buffer, sizeof(m_buffer));
+ FbtImpl::memory_to_record(str, m_buffer);
}
bool to_binary(String *to) const
{
@@ -154,18 +160,13 @@ public:
FbtImpl::max_char_length()+1));
return false;
}
- int cmp(const char *str, size_t length) const
- {
- DBUG_ASSERT(length == sizeof(m_buffer));
- return memcmp(m_buffer, str, length);
- }
int cmp(const Binary_string &other) const
{
- return cmp(other.ptr(), other.length());
+ return FbtImpl::cmp(FbtImpl::to_lex_cstring(), other.to_lex_cstring());
}
int cmp(const Fbt &other) const
{
- return memcmp(m_buffer, other.m_buffer, sizeof(m_buffer));
+ return FbtImpl::cmp(FbtImpl::to_lex_cstring(), other.to_lex_cstring());
}
};
@@ -191,9 +192,9 @@ public:
DBUG_ASSERT(!is_null());
return *this;
}
- void to_binary(char *str, size_t str_size) const
+ void to_record(char *str, size_t str_size) const
{
- to_fbt().to_binary(str, str_size);
+ to_fbt().to_record(str, str_size);
}
bool to_binary(String *to) const
{
@@ -257,6 +258,10 @@ public:
{
return FbtImpl::default_value();
}
+ ulong KEY_pack_flags(uint column_nr) const override
+ {
+ return FbtImpl::KEY_pack_flags(column_nr);
+ }
protocol_send_type_t protocol_send_type() const override
{
return PROTOCOL_SEND_STRING;
@@ -480,7 +485,7 @@ public:
DBUG_ASSERT(!item->null_value);
DBUG_ASSERT(FbtImpl::binary_length() == tmp.length());
DBUG_ASSERT(FbtImpl::binary_length() == sort_field->length);
- memcpy(to, tmp.ptr(), tmp.length());
+ FbtImpl::memory_to_record((char*) to, tmp.ptr());
}
uint make_packed_sort_key_part(uchar *to, Item *item,
const SORT_FIELD_ATTR *sort_field,
@@ -501,7 +506,7 @@ public:
DBUG_ASSERT(!item->null_value);
DBUG_ASSERT(FbtImpl::binary_length() == tmp.length());
DBUG_ASSERT(FbtImpl::binary_length() == sort_field->length);
- memcpy(to, tmp.ptr(), tmp.length());
+ FbtImpl::memory_to_record((char*) to, tmp.ptr());
return tmp.length();
}
void sort_length(THD *thd, const Type_std_attributes *item,
@@ -700,9 +705,7 @@ public:
}
int cmp_native(const Native &a, const Native &b) const override
{
- DBUG_ASSERT(a.length() == FbtImpl::binary_length());
- DBUG_ASSERT(b.length() == FbtImpl::binary_length());
- return memcmp(a.ptr(), b.ptr(), FbtImpl::binary_length());
+ return FbtImpl::cmp(a.to_lex_cstring(), b.to_lex_cstring());
}
bool set_comparator_func(THD *thd, Arg_comparator *cmp) const override
{
@@ -1107,7 +1110,7 @@ public:
if (fbt.is_null())
return maybe_null() ? set_null_with_warn(err)
: set_min_value_with_warn(err);
- fbt.to_binary((char *) ptr, FbtImpl::binary_length());
+ fbt.to_record((char *) ptr, FbtImpl::binary_length());
return 0;
}
@@ -1184,11 +1187,27 @@ public:
return false;
}
- String *val_str(String *val_buffer, String *) override
+ bool val_native(Native *to) override
+ {
+ DBUG_ASSERT(marked_for_read());
+ DBUG_ASSERT(!is_null());
+ if (to->alloc(FbtImpl::binary_length()))
+ return true;
+ to->length(FbtImpl::binary_length());
+ FbtImpl::record_to_memory((char*) to->ptr(), (const char*) ptr);
+ return false;
+ }
+
+ Fbt to_fbt() const
{
DBUG_ASSERT(marked_for_read());
- Fbt_null tmp((const char *) ptr, pack_length());
- return tmp.to_string(val_buffer) ? NULL : val_buffer;
+ DBUG_ASSERT(!is_null());
+ return Fbt::record_to_memory((const char*) ptr);
+ }
+
+ String *val_str(String *val_buffer, String *) override
+ {
+ return to_fbt().to_string(val_buffer) ? NULL : val_buffer;
}
my_decimal *val_decimal(my_decimal *to) override
@@ -1227,7 +1246,7 @@ public:
{
DBUG_ASSERT(marked_for_write_or_computed());
DBUG_ASSERT(value.length() == FbtImpl::binary_length());
- memcpy(ptr, value.ptr(), value.length());
+ FbtImpl::memory_to_record((char*) ptr, value.ptr());
return 0;
}
@@ -1409,6 +1428,13 @@ public:
item->type_handler() == type_handler());
return true;
}
+ void hash(ulong *nr, ulong *nr2)
+ {
+ if (is_null())
+ *nr^= (*nr << 1) | 1;
+ else
+ FbtImpl::hash_record(ptr, nr, nr2);
+ }
SEL_ARG *get_mm_leaf(RANGE_OPT_PARAM *prm, KEY_PART *key_part,
const Item_bool_func *cond,
scalar_comparison_op op, Item *value) override
@@ -1450,13 +1476,13 @@ public:
uchar *pack(uchar *to, const uchar *from, uint max_length) override
{
DBUG_PRINT("debug", ("Packing field '%s'", field_name.str));
- return StringPack(&my_charset_bin, FbtImpl::binary_length()).pack(to, from, max_length);
+ return FbtImpl::pack(to, from, max_length);
}
const uchar *unpack(uchar *to, const uchar *from, const uchar *from_end,
uint param_data) override
{
- return StringPack(&my_charset_bin, FbtImpl::binary_length()).unpack(to, from, from_end, param_data);
+ return FbtImpl::unpack(to, from, from_end, param_data);
}
uint max_packed_col_length(uint max_length) override