53#include "mysqld_error.h"
117#define portable_sizeof_char_ptr 8
252#define IS_EQUAL_YES 1
253#define IS_EQUAL_PACK_LENGTH 2
255#define my_charset_numeric my_charset_latin1
256#define MY_REPERTOIRE_NUMERIC MY_REPERTOIRE_ASCII
284 return elements < 256 ? 1 : 2;
288 uint len = (elements + 7) / 8;
289 return len > 4 ? 8 : len;
331#define ASSERT_COLUMN_MARKED_FOR_READ \
333 (!table->read_set || bitmap_is_set(table->read_set, field_index())))
334#define ASSERT_COLUMN_MARKED_FOR_WRITE \
335 assert(!table || (!table->write_set || \
336 bitmap_is_set(table->write_set, field_index())))
416 switch (pack_length) {
449template <
bool Is_big_endian>
452 if (to_length == 0)
return;
454 std::copy(from, from + std::min(to_length, from_length), to);
456 to[0] =
static_cast<char>(to[0] ^ 128);
458 const uchar *from_end = from + from_length;
459 const uchar *from_start = from_end - std::min(from_length, to_length);
460 std::reverse_copy(from_start, from_end, to);
462 to[0] =
static_cast<char>(to[0] ^ 128);
869 uchar null_bit_arg,
uchar auto_flags_arg,
const char *field_name_arg);
924 return store(nr,
false);
1061 return field_metadata;
1177 uint max_len [[maybe_unused]])
const {
1182 uint32 max_length [[maybe_unused]] = ~0
L)
const {
1266 void set_null(ptrdiff_t row_offset = 0);
1342 uchar *new_null_ptr,
uint new_null_bit)
const {
1344 field->
move_field(new_ptr, new_null_ptr, new_null_bit);
1349 uchar *new_null_ptr,
uint new_null_bit)
const;
1434 return return_value;
1510 uint max_length)
const {
1511 return pack(to, from, max_length);
1537 ulonglong value_options [[maybe_unused]])
const {
1551 void copy_data(ptrdiff_t src_record_offset);
1602 int cut_increment) {
1603 return set_warning(level, code, cut_increment,
nullptr,
nullptr);
1607 int cut_increment,
const char *view_db,
1608 const char *view_name);
1636 bool *has_overflow);
1688 virtual void hash(ulong *nr, ulong *nr2)
const;
1752 KEY *cur_index_info)
const;
1813 [[maybe_unused]])
const {
1927 const char *field_name_arg,
uint8 dec_arg,
bool zero_arg,
1948 size_t length,
const char *int_end,
2010 const char *well_formed_error_pos,
const char *cannot_convert_error_pos,
2011 const char *from_end_pos,
const char *
end,
bool count_spaces,
2017 const char *field_name_arg,
const CHARSET_INFO *charset_arg)
2018 :
Field_str(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2019 field_name_arg, charset_arg) {}
2032 TR_POSITIVE_OVERFLOW = 1,
2033 TR_NEGATIVE_OVERFLOW = 2
2038 const char *field_name_arg,
uint8 dec_arg,
bool zero_arg,
2040 :
Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2041 field_name_arg, dec_arg, zero_arg, unsigned_arg),
2058 const char *field_name_arg,
uint8 dec_arg,
bool zero_arg,
2060 :
Field_real(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2061 field_name_arg, dec_arg, zero_arg, unsigned_arg) {}
2075 void overflow(
bool negative);
2104 bool m_keep_precision{
false};
2119 const char *field_name_arg,
uint8 dec_arg,
bool zero_arg,
2122 const char *field_name_arg,
uint8 dec_arg,
2129 void set_value_on_overflow(
my_decimal *decimal_value,
bool sign) const;
2150 int *order_var)
const final;
2157 static Field *create_from_item(
const Item *item);
2166 const char *field_name_arg,
bool zero_arg,
bool unsigned_arg)
2167 :
Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2168 field_name_arg, 0, zero_arg, unsigned_arg) {}
2173 field_name_arg, 0, false, unsigned_arg) {}
2197 if (max_length > 0) *to = *from;
2202 uint param_data [[maybe_unused]])
final {
2216 const char *field_name_arg,
bool zero_arg,
bool unsigned_arg)
2217 :
Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2218 field_name_arg, 0, zero_arg, unsigned_arg) {}
2223 field_name_arg, 0, false, unsigned_arg) {}
2225 :
Field_short(len_arg, false, field_name_arg, unsigned_arg) {}
2253 uint param_data [[maybe_unused]])
final {
2266 const char *field_name_arg,
bool zero_arg,
bool unsigned_arg)
2267 :
Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2268 field_name_arg, 0, zero_arg, unsigned_arg) {}
2273 field_name_arg, 0, false, unsigned_arg) {}
2303 static const int PACK_LENGTH = 4;
2307 const char *field_name_arg,
bool zero_arg,
bool unsigned_arg)
2308 :
Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2309 field_name_arg, 0, zero_arg, unsigned_arg) {}
2314 field_name_arg, 0, false, unsigned_arg) {}
2343 uint param_data [[maybe_unused]])
final {
2348 return is_unsigned() ? 0xFFFFFFFFULL : 0x7FFFFFFFULL;
2354 static const int PACK_LENGTH = 8;
2358 const char *field_name_arg,
bool zero_arg,
bool unsigned_arg)
2359 :
Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2360 field_name_arg, 0, zero_arg, unsigned_arg) {}
2362 const char *field_name_arg,
bool unsigned_arg)
2365 field_name_arg, 0, false, unsigned_arg) {}
2393 uint param_data [[maybe_unused]])
final {
2398 return is_unsigned() ? 0xFFFFFFFFFFFFFFFFULL : 0x7FFFFFFFFFFFFFFFULL;
2406 const char *field_name_arg,
uint8 dec_arg,
bool zero_arg,
2408 :
Field_real(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2409 field_name_arg, dec_arg, zero_arg, unsigned_arg) {}
2411 uint8 dec_arg,
bool unsigned_arg)
2414 field_name_arg, dec_arg, false, unsigned_arg) {}
2438 return 0x1000000ULL;
2449 const char *field_name_arg,
uint8 dec_arg,
bool zero_arg,
2451 :
Field_real(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2452 field_name_arg, dec_arg, zero_arg, unsigned_arg) {}
2457 field_name_arg, dec_arg, false, false) {}
2459 uint8 dec_arg,
bool unsigned_arg)
2462 field_name_arg, dec_arg, false, unsigned_arg) {}
2464 uint8 dec_arg,
bool unsigned_arg,
bool not_fixed_arg)
2467 field_name_arg, dec_arg, false, unsigned_arg) {
2468 not_fixed = not_fixed_arg;
2493 return 0x20000000000000ULL;
2508 field_name_arg,
cs) {}
2697 [[nodiscard]]
bool set_datetime_warning(
2700 int truncate_increment);
2714 uchar auto_flags_arg,
const char *field_name_arg,
2718 ((normalize_dec(dec_arg)) ? normalize_dec(dec_arg) + 1 : 0),
2719 null_ptr_arg, null_bit_arg, auto_flags_arg, field_name_arg) {
2721 dec = normalize_dec(dec_arg);
2763 return get_date_internal(ltime);
2771 bool get_internal_check_zero(
MYSQL_TIME *ltime,
2782 int *warnings)
final;
2798 const char *field_name_arg,
uint8 int_length_arg,
2800 :
Field_temporal(ptr_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2801 field_name_arg, int_length_arg, dec_arg) {}
2838 void init_timestamp_flags();
2860 const char *field_name_arg,
uint8 dec_arg)
2862 auto_flags_arg, field_name_arg,
2891 const char *field_name_arg,
uint8 dec_arg)
2893 auto_flags_arg, field_name_arg,
2920 bool get_date_internal(
MYSQL_TIME *ltime)
const final;
2921 bool get_date_internal_at_utc(
MYSQL_TIME *ltime)
const final;
2922 void store_timestamp_internal(
const my_timeval *tm)
final;
2925 static const int PACK_LENGTH = 4;
2928 const char *field_name_arg);
2950 uint param_data [[maybe_unused]])
final {
2975 bool get_date_internal(
MYSQL_TIME *ltime)
const final;
2976 bool get_date_internal_at_utc(
MYSQL_TIME *ltime)
const final;
2980 void store_timestamp_internal(
const my_timeval *tm)
override;
2993 uchar auto_flags_arg,
const char *field_name_arg,
3044 enum Limits { MIN_YEAR = 1901, MAX_YEAR = 2155 };
3046 uchar auto_flags_arg,
const char *field_name_arg)
3047 :
Field_tiny(ptr_arg, 4, null_ptr_arg, null_bit_arg, auto_flags_arg,
3048 field_name_arg, true, true) {}
3051 0,
NONE, field_name_arg, true, true) {}
3072 static const int PACK_LENGTH = 3;
3074 bool get_date_internal(
MYSQL_TIME *ltime)
const final;
3080 uchar auto_flags_arg,
const char *field_name_arg)
3131 int *
error)
override = 0;
3137 int *warnings)
final;
3153 uchar auto_flags_arg,
const char *field_name_arg,
3155 :
Field_temporal(ptr_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
3175 uchar auto_flags_arg,
const char *field_name_arg)
3177 field_name_arg, 0) {}
3222 uchar auto_flags_arg,
const char *field_name_arg,
uint8 dec_arg)
3224 field_name_arg, dec_arg) {}
3234 NONE, field_name_arg, dec_arg) {}
3277 bool get_date_internal(
MYSQL_TIME *ltime)
const final;
3279 void store_timestamp_internal(
const my_timeval *tm)
final;
3282 static const int PACK_LENGTH = 8;
3297 uchar auto_flags_arg,
const char *field_name_arg)
3299 auto_flags_arg, field_name_arg, 0) {}
3302 field_name_arg, 0) {}
3324 uint param_data [[maybe_unused]])
final {
3334 bool get_date_internal(
MYSQL_TIME *ltime)
const final;
3338 void store_timestamp_internal(
const my_timeval *tm)
final;
3351 uchar auto_flags_arg,
const char *field_name_arg,
3354 auto_flags_arg, field_name_arg,
3366 field_name_arg, dec_arg) {}
3395 :
Field_longstr(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
3396 auto_flags_arg, field_name_arg,
cs) {}
3401 field_name_arg,
cs) {}
3427 const char *
string = pointer_cast<const char *>(
ptr);
3438 DBUG_PRINT(
"debug", (
"field_metadata: 0x%04x", field_metadata));
3440 return (((field_metadata >> 4) & 0x300) ^ 0x300) +
3441 (field_metadata & 0x00ff);
3444 uint16 mflags,
int *order_var)
const final;
3501 uint32 max_length = ~0
L)
const final;
3512 uchar *new_null_ptr,
uint new_null_bit)
const final;
3519 void hash(ulong *nr, ulong *nr2)
const final;
3607 bool m_uses_backup{
false};
3616 memmove(
ptr + packlength, &from,
sizeof(
char *));
3621 uchar auto_flags_arg,
const char *field_name_arg,
3628 field_name_arg,
cs),
3630 m_keep_old_value(false) {
3632 if (set_packlength) {
3633 packlength = len_arg <= 255
3635 : len_arg <= 65535 ? 2 : len_arg <= 16777215 ? 3 : 4;
3642 packlength(field.packlength),
3645 m_keep_old_value(field.m_keep_old_value),
3676 uint32 max_length = ~0
L)
const override;
3701 store_length(
ptr, packlength, number);
3704 return get_length(row_offset);
3706 uint32 get_length(ptrdiff_t row_offset = 0)
const;
3714 return get_blob_data(
ptr + packlength + row_offset);
3726 memcpy(&data, position,
sizeof(data));
3733 memcpy(
ptr + packlength, &data,
sizeof(
char *));
3737 store_length(ptr_ofs, packlength,
length);
3738 memcpy(ptr_ofs + packlength, &data,
sizeof(
char *));
3741 set_ptr_offset(0,
length, data);
3754 uint max_length)
const final;
3794 m_keep_old_value = old_value_flag;
3837 if (m_keep_old_value) {
3839 m_keep_old_value =
false;
3847 store_ptr_and_length(from,
length);
3858 bool backup_blob_field();
3864 void restore_blob_backup();
3881 uchar auto_flags_arg,
const char *field_name_arg,
3883 enum geometry_type geom_type_arg, std::optional<gis::srid_t> srid)
3884 :
Field_blob(ptr_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
3887 geom_type(geom_type_arg) {}
3889 enum geometry_type geom_type_arg, std::optional<gis::srid_t> srid)
3893 geom_type(geom_type_arg) {}
3911 if (res !=
TYPE_OK)
return res;
3924 std::optional<gis::srid_t>
get_srid()
const {
return m_srid; }
3948 uchar auto_flags_arg,
const char *field_name_arg,
3950 :
Field_blob(ptr_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
4007 longlong get_diff_vector_and_length(
4014 bool is_before_image_equal_to_after_image()
const;
4025 bool unpack_diff(
const uchar **from);
4067 uint32 max_length = ~0
L)
const final;
4084 const char *get_binary(ptrdiff_t row_offset = 0)
const;
4137 size_t elt_length,
uint elt_decimals,
uchar *ptr_arg,
4139 uchar auto_flags_arg,
const char *field_name_arg,