54#include "mysqld_error.h"
118#define portable_sizeof_char_ptr 8
254#define IS_EQUAL_YES 1
255#define IS_EQUAL_PACK_LENGTH 2
257#define my_charset_numeric my_charset_latin1
258#define MY_REPERTOIRE_NUMERIC MY_REPERTOIRE_ASCII
286 return elements < 256 ? 1 : 2;
290 const uint len = (elements + 7) / 8;
291 return len > 4 ? 8 : len;
333#define ASSERT_COLUMN_MARKED_FOR_READ \
335 (!table->read_set || bitmap_is_set(table->read_set, field_index())))
336#define ASSERT_COLUMN_MARKED_FOR_WRITE \
337 assert(!table || (!table->write_set || \
338 bitmap_is_set(table->write_set, field_index())))
418 switch (pack_length) {
451template <
bool Is_big_endian>
454 if (to_length == 0)
return;
456 std::copy(from, from + std::min(to_length, from_length), to);
458 to[0] =
static_cast<char>(to[0] ^ 128);
460 const uchar *from_end = from + from_length;
461 const uchar *from_start = from_end - std::min(from_length, to_length);
462 std::reverse_copy(from_start, from_end, to);
464 to[0] =
static_cast<char>(to[0] ^ 128);
871 uchar null_bit_arg,
uchar auto_flags_arg,
const char *field_name_arg);
926 return store(nr,
false);
1063 return field_metadata;
1179 uint max_len [[maybe_unused]])
const {
1184 uint32 max_length [[maybe_unused]] = ~0
L)
const {
1268 void set_null(ptrdiff_t row_offset = 0);
1344 uchar *new_null_ptr, uint new_null_bit)
const {
1346 field->
move_field(new_ptr, new_null_ptr, new_null_bit);
1351 uchar *new_null_ptr, uint new_null_bit)
const;
1436 return return_value;
1512 uint max_length)
const {
1513 return pack(to, from, max_length);
1539 ulonglong value_options [[maybe_unused]])
const {
1553 void copy_data(ptrdiff_t src_record_offset);
1604 int cut_increment) {
1605 return set_warning(level, code, cut_increment,
nullptr,
nullptr);
1609 int cut_increment,
const char *view_db,
1610 const char *view_name);
1638 bool *has_overflow);
1690 virtual void hash(ulong *nr, ulong *nr2)
const;
1754 KEY *cur_index_info)
const;
1815 [[maybe_unused]])
const {
1929 const char *field_name_arg,
uint8 dec_arg,
bool zero_arg,
1950 size_t length,
const char *int_end,
2012 const char *well_formed_error_pos,
const char *cannot_convert_error_pos,
2013 const char *from_end_pos,
const char *
end,
bool count_spaces,
2019 const char *field_name_arg,
const CHARSET_INFO *charset_arg)
2020 :
Field_str(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2021 field_name_arg, charset_arg) {}
2034 TR_POSITIVE_OVERFLOW = 1,
2035 TR_NEGATIVE_OVERFLOW = 2
2040 const char *field_name_arg,
uint8 dec_arg,
bool zero_arg,
2042 :
Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2043 field_name_arg, dec_arg, zero_arg, unsigned_arg),
2060 const char *field_name_arg,
uint8 dec_arg,
bool zero_arg,
2062 :
Field_real(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2063 field_name_arg, dec_arg, zero_arg, unsigned_arg) {}
2077 void overflow(
bool negative);
2106 bool m_keep_precision{
false};
2121 const char *field_name_arg,
uint8 dec_arg,
bool zero_arg,
2124 const char *field_name_arg,
uint8 dec_arg,
2131 void set_value_on_overflow(
my_decimal *decimal_value,
bool sign) const;
2152 int *order_var)
const final;
2159 static Field *create_from_item(
const Item *item);
2168 const char *field_name_arg,
bool zero_arg,
bool unsigned_arg)
2169 :
Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2170 field_name_arg, 0, zero_arg, unsigned_arg) {}
2175 field_name_arg, 0, false, unsigned_arg) {}
2199 if (max_length > 0) *to = *from;
2204 uint param_data [[maybe_unused]])
final {
2218 const char *field_name_arg,
bool zero_arg,
bool unsigned_arg)
2219 :
Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2220 field_name_arg, 0, zero_arg, unsigned_arg) {}
2225 field_name_arg, 0, false, unsigned_arg) {}
2227 :
Field_short(len_arg, false, field_name_arg, unsigned_arg) {}
2255 uint param_data [[maybe_unused]])
final {
2268 const char *field_name_arg,
bool zero_arg,
bool unsigned_arg)
2269 :
Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2270 field_name_arg, 0, zero_arg, unsigned_arg) {}
2275 field_name_arg, 0, false, unsigned_arg) {}
2305 static const int PACK_LENGTH = 4;
2309 const char *field_name_arg,
bool zero_arg,
bool unsigned_arg)
2310 :
Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2311 field_name_arg, 0, zero_arg, unsigned_arg) {}
2316 field_name_arg, 0, false, unsigned_arg) {}
2345 uint param_data [[maybe_unused]])
final {
2350 return is_unsigned() ? 0xFFFFFFFFULL : 0x7FFFFFFFULL;
2356 static const int PACK_LENGTH = 8;
2360 const char *field_name_arg,
bool zero_arg,
bool unsigned_arg)
2361 :
Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2362 field_name_arg, 0, zero_arg, unsigned_arg) {}
2364 const char *field_name_arg,
bool unsigned_arg)
2367 field_name_arg, 0, false, unsigned_arg) {}
2395 uint param_data [[maybe_unused]])
final {
2400 return is_unsigned() ? 0xFFFFFFFFFFFFFFFFULL : 0x7FFFFFFFFFFFFFFFULL;
2408 const char *field_name_arg,
uint8 dec_arg,
bool zero_arg,
2410 :
Field_real(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2411 field_name_arg, dec_arg, zero_arg, unsigned_arg) {}
2413 uint8 dec_arg,
bool unsigned_arg)
2416 field_name_arg, dec_arg, false, unsigned_arg) {}
2440 return 0x1000000ULL;
2451 const char *field_name_arg,
uint8 dec_arg,
bool zero_arg,
2453 :
Field_real(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2454 field_name_arg, dec_arg, zero_arg, unsigned_arg) {}
2459 field_name_arg, dec_arg, false, false) {}
2461 uint8 dec_arg,
bool unsigned_arg)
2464 field_name_arg, dec_arg, false, unsigned_arg) {}
2466 uint8 dec_arg,
bool unsigned_arg,
bool not_fixed_arg)
2469 field_name_arg, dec_arg, false, unsigned_arg) {
2470 not_fixed = not_fixed_arg;
2495 return 0x20000000000000ULL;
2510 field_name_arg,
cs) {}
2699 [[nodiscard]]
bool set_datetime_warning(
2702 int truncate_increment);
2716 uchar auto_flags_arg,
const char *field_name_arg,
2720 ((normalize_dec(dec_arg)) ? normalize_dec(dec_arg) + 1 : 0),
2721 null_ptr_arg, null_bit_arg, auto_flags_arg, field_name_arg) {
2723 dec = normalize_dec(dec_arg);
2766 return get_date_internal(ltime);
2774 bool get_internal_check_zero(
MYSQL_TIME *ltime,
2785 int *warnings)
final;
2801 const char *field_name_arg,
uint8 int_length_arg,
2803 :
Field_temporal(ptr_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2804 field_name_arg, int_length_arg, dec_arg) {}
2841 void init_timestamp_flags();
2863 const char *field_name_arg,
uint8 dec_arg)
2865 auto_flags_arg, field_name_arg,
2894 const char *field_name_arg,
uint8 dec_arg)
2896 auto_flags_arg, field_name_arg,
2923 bool get_date_internal(
MYSQL_TIME *ltime)
const final;
2924 bool get_date_internal_at_utc(
MYSQL_TIME *ltime)
const final;
2925 void store_timestamp_internal(
const my_timeval *tm)
final;
2928 static const int PACK_LENGTH = 4;
2931 const char *field_name_arg);
2953 uint param_data [[maybe_unused]])
final {
2978 bool get_date_internal(
MYSQL_TIME *ltime)
const final;
2979 bool get_date_internal_at_utc(
MYSQL_TIME *ltime)
const final;
2983 void store_timestamp_internal(
const my_timeval *tm)
override;
2996 uchar auto_flags_arg,
const char *field_name_arg,
3047 enum Limits { MIN_YEAR = 1901, MAX_YEAR = 2155 };
3049 uchar auto_flags_arg,
const char *field_name_arg)
3050 :
Field_tiny(ptr_arg, 4, null_ptr_arg, null_bit_arg, auto_flags_arg,
3051 field_name_arg, true, true) {}
3054 0,
NONE, field_name_arg, true, true) {}
3075 static const int PACK_LENGTH = 3;
3077 bool get_date_internal(
MYSQL_TIME *ltime)
const final;
3083 uchar auto_flags_arg,
const char *field_name_arg)
3134 int *
error)
override = 0;
3140 int *warnings)
final;
3156 uchar auto_flags_arg,
const char *field_name_arg,
3158 :
Field_temporal(ptr_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
3178 uchar auto_flags_arg,
const char *field_name_arg)
3180 field_name_arg, 0) {}
3225 uchar auto_flags_arg,
const char *field_name_arg,
uint8 dec_arg)
3227 field_name_arg, dec_arg) {}
3237 NONE, field_name_arg, dec_arg) {}
3280 bool get_date_internal(
MYSQL_TIME *ltime)
const final;
3282 void store_timestamp_internal(
const my_timeval *tm)
final;
3285 static const int PACK_LENGTH = 8;
3300 uchar auto_flags_arg,
const char *field_name_arg)
3302 auto_flags_arg, field_name_arg, 0) {}
3305 field_name_arg, 0) {}
3327 uint param_data [[maybe_unused]])
final {
3337 bool get_date_internal(
MYSQL_TIME *ltime)
const final;
3341 void store_timestamp_internal(
const my_timeval *tm)
final;
3354 uchar auto_flags_arg,
const char *field_name_arg,
3357 auto_flags_arg, field_name_arg,
3369 field_name_arg, dec_arg) {}
3398 :
Field_longstr(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
3399 auto_flags_arg, field_name_arg,
cs) {}
3404 field_name_arg,
cs) {}
3430 const char *
string = pointer_cast<const char *>(
ptr);
3441 DBUG_PRINT(
"debug", (
"field_metadata: 0x%04x", field_metadata));
3443 return (((field_metadata >> 4) & 0x300) ^ 0x300) +
3444 (field_metadata & 0x00ff);
3447 uint16 mflags,
int *order_var)
const final;
3504 uint32 max_length = ~0
L)
const final;
3515 uchar *new_null_ptr, uint new_null_bit)
const final;
3522 void hash(ulong *nr, ulong *nr2)
const final;
3610 bool m_uses_backup{
false};
3619 memmove(
ptr + packlength, &from,
sizeof(
char *));
3624 uchar auto_flags_arg,
const char *field_name_arg,
3631 field_name_arg,
cs),
3633 m_keep_old_value(false) {
3635 if (set_packlength) {
3636 packlength = len_arg <= 255
3638 : len_arg <= 65535 ? 2 : len_arg <= 16777215 ? 3 : 4;
3645 packlength(field.packlength),
3648 m_keep_old_value(field.m_keep_old_value),
3679 uint32 max_length = ~0
L)
const override;
3702 void store_length(
uchar *i_ptr, uint i_packlength,
uint32 i_number);
3704 store_length(
ptr, packlength, number);
3707 return get_length(row_offset);
3709 uint32 get_length(ptrdiff_t row_offset = 0)
const;
3717 return get_blob_data(
ptr + packlength + row_offset);
3729 memcpy(&data, position,
sizeof(data));
3736 memcpy(
ptr + packlength, &data,
sizeof(
char *));
3740 store_length(ptr_ofs, packlength,
length);
3741 memcpy(ptr_ofs + packlength, &data,
sizeof(
char *));
3744 set_ptr_offset(0,
length, data);
3757 uint max_length)
const final;
3797 m_keep_old_value = old_value_flag;
3840 if (m_keep_old_value) {
3842 m_keep_old_value =
false;
3850 store_ptr_and_length(from,
length);
3861 bool backup_blob_field();
3867 void restore_blob_backup();
3884 uchar auto_flags_arg,
const char *field_name_arg,
3886 enum geometry_type geom_type_arg, std::optional<gis::srid_t> srid)
3887 :
Field_blob(ptr_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
3890 geom_type(geom_type_arg) {}
3892 enum geometry_type geom_type_arg, std::optional<gis::srid_t> srid)
3896 geom_type(geom_type_arg) {}
3914 if (res !=
TYPE_OK)
return res;
3927 std::optional<gis::srid_t>
get_srid()
const {
return m_srid; }
3937 uchar auto_flags_arg,
const char *field_name_arg,
3939 :
Field_blob(ptr_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
3996 longlong get_diff_vector_and_length(
4003 bool is_before_image_equal_to_after_image()
const;
4014 bool unpack_diff(
const uchar **from);
4056 uint32 max_length = ~0
L)
const final;
4073 const char *get_binary(ptrdiff_t row_offset = 0)
const;
4126 size_t elt_length, uint elt_decimals,
uchar *ptr_arg,
4127 uchar *null_ptr_arg, uint null_bit_arg,
4128 uchar auto_flags_arg,
const char *field_name_arg,
4147 uint
decimals()
const override {
return m_elt_decimals; }