53#include "mysqld_error.h"
117#define portable_sizeof_char_ptr 8
253#define IS_EQUAL_YES 1
254#define IS_EQUAL_PACK_LENGTH 2
256#define my_charset_numeric my_charset_latin1
257#define MY_REPERTOIRE_NUMERIC MY_REPERTOIRE_ASCII
285 return elements < 256 ? 1 : 2;
289 uint len = (elements + 7) / 8;
290 return len > 4 ? 8 : len;
332#define ASSERT_COLUMN_MARKED_FOR_READ \
334 (!table->read_set || bitmap_is_set(table->read_set, field_index())))
335#define ASSERT_COLUMN_MARKED_FOR_WRITE \
336 assert(!table || (!table->write_set || \
337 bitmap_is_set(table->write_set, field_index())))
417 switch (pack_length) {
450template <
bool Is_big_endian>
453 if (to_length == 0)
return;
455 std::copy(from, from + std::min(to_length, from_length), to);
457 to[0] =
static_cast<char>(to[0] ^ 128);
459 const uchar *from_end = from + from_length;
460 const uchar *from_start = from_end - std::min(from_length, to_length);
461 std::reverse_copy(from_start, from_end, to);
463 to[0] =
static_cast<char>(to[0] ^ 128);
870 uchar null_bit_arg,
uchar auto_flags_arg,
const char *field_name_arg);
925 return store(nr,
false);
1062 return field_metadata;
1178 uint max_len [[maybe_unused]])
const {
1183 uint32 max_length [[maybe_unused]] = ~0
L)
const {
1267 void set_null(ptrdiff_t row_offset = 0);
1343 uchar *new_null_ptr,
uint new_null_bit)
const {
1345 field->
move_field(new_ptr, new_null_ptr, new_null_bit);
1350 uchar *new_null_ptr,
uint new_null_bit)
const;
1435 return return_value;
1511 uint max_length)
const {
1512 return pack(to, from, max_length);
1538 ulonglong value_options [[maybe_unused]])
const {
1552 void copy_data(ptrdiff_t src_record_offset);
1603 int cut_increment) {
1604 return set_warning(level, code, cut_increment,
nullptr,
nullptr);
1608 int cut_increment,
const char *view_db,
1609 const char *view_name);
1637 bool *has_overflow);
1689 virtual void hash(ulong *nr, ulong *nr2)
const;
1753 KEY *cur_index_info)
const;
1814 [[maybe_unused]])
const {
1928 const char *field_name_arg,
uint8 dec_arg,
bool zero_arg,
1949 size_t length,
const char *int_end,
2011 const char *well_formed_error_pos,
const char *cannot_convert_error_pos,
2012 const char *from_end_pos,
const char *
end,
bool count_spaces,
2018 const char *field_name_arg,
const CHARSET_INFO *charset_arg)
2019 :
Field_str(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2020 field_name_arg, charset_arg) {}
2033 TR_POSITIVE_OVERFLOW = 1,
2034 TR_NEGATIVE_OVERFLOW = 2
2039 const char *field_name_arg,
uint8 dec_arg,
bool zero_arg,
2041 :
Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2042 field_name_arg, dec_arg, zero_arg, unsigned_arg),
2059 const char *field_name_arg,
uint8 dec_arg,
bool zero_arg,
2061 :
Field_real(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2062 field_name_arg, dec_arg, zero_arg, unsigned_arg) {}
2076 void overflow(
bool negative);
2105 bool m_keep_precision{
false};
2120 const char *field_name_arg,
uint8 dec_arg,
bool zero_arg,
2123 const char *field_name_arg,
uint8 dec_arg,
2130 void set_value_on_overflow(
my_decimal *decimal_value,
bool sign) const;
2151 int *order_var)
const final;
2158 static Field *create_from_item(
const Item *item);
2167 const char *field_name_arg,
bool zero_arg,
bool unsigned_arg)
2168 :
Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2169 field_name_arg, 0, zero_arg, unsigned_arg) {}
2174 field_name_arg, 0, false, unsigned_arg) {}
2198 if (max_length > 0) *to = *from;
2203 uint param_data [[maybe_unused]])
final {
2217 const char *field_name_arg,
bool zero_arg,
bool unsigned_arg)
2218 :
Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2219 field_name_arg, 0, zero_arg, unsigned_arg) {}
2224 field_name_arg, 0, false, unsigned_arg) {}
2226 :
Field_short(len_arg, false, field_name_arg, unsigned_arg) {}
2254 uint param_data [[maybe_unused]])
final {
2267 const char *field_name_arg,
bool zero_arg,
bool unsigned_arg)
2268 :
Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2269 field_name_arg, 0, zero_arg, unsigned_arg) {}
2274 field_name_arg, 0, false, unsigned_arg) {}
2304 static const int PACK_LENGTH = 4;
2308 const char *field_name_arg,
bool zero_arg,
bool unsigned_arg)
2309 :
Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2310 field_name_arg, 0, zero_arg, unsigned_arg) {}
2315 field_name_arg, 0, false, unsigned_arg) {}
2344 uint param_data [[maybe_unused]])
final {
2349 return is_unsigned() ? 0xFFFFFFFFULL : 0x7FFFFFFFULL;
2355 static const int PACK_LENGTH = 8;
2359 const char *field_name_arg,
bool zero_arg,
bool unsigned_arg)
2360 :
Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2361 field_name_arg, 0, zero_arg, unsigned_arg) {}
2363 const char *field_name_arg,
bool unsigned_arg)
2366 field_name_arg, 0, false, unsigned_arg) {}
2394 uint param_data [[maybe_unused]])
final {
2399 return is_unsigned() ? 0xFFFFFFFFFFFFFFFFULL : 0x7FFFFFFFFFFFFFFFULL;
2407 const char *field_name_arg,
uint8 dec_arg,
bool zero_arg,
2409 :
Field_real(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2410 field_name_arg, dec_arg, zero_arg, unsigned_arg) {}
2412 uint8 dec_arg,
bool unsigned_arg)
2415 field_name_arg, dec_arg, false, unsigned_arg) {}
2439 return 0x1000000ULL;
2450 const char *field_name_arg,
uint8 dec_arg,
bool zero_arg,
2452 :
Field_real(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2453 field_name_arg, dec_arg, zero_arg, unsigned_arg) {}
2458 field_name_arg, dec_arg, false, false) {}
2460 uint8 dec_arg,
bool unsigned_arg)
2463 field_name_arg, dec_arg, false, unsigned_arg) {}
2465 uint8 dec_arg,
bool unsigned_arg,
bool not_fixed_arg)
2468 field_name_arg, dec_arg, false, unsigned_arg) {
2469 not_fixed = not_fixed_arg;
2494 return 0x20000000000000ULL;
2509 field_name_arg,
cs) {}
2698 [[nodiscard]]
bool set_datetime_warning(
2701 int truncate_increment);
2715 uchar auto_flags_arg,
const char *field_name_arg,
2719 ((normalize_dec(dec_arg)) ? normalize_dec(dec_arg) + 1 : 0),
2720 null_ptr_arg, null_bit_arg, auto_flags_arg, field_name_arg) {
2722 dec = normalize_dec(dec_arg);
2765 return get_date_internal(ltime);
2773 bool get_internal_check_zero(
MYSQL_TIME *ltime,
2784 int *warnings)
final;
2800 const char *field_name_arg,
uint8 int_length_arg,
2802 :
Field_temporal(ptr_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2803 field_name_arg, int_length_arg, dec_arg) {}
2840 void init_timestamp_flags();
2862 const char *field_name_arg,
uint8 dec_arg)
2864 auto_flags_arg, field_name_arg,
2893 const char *field_name_arg,
uint8 dec_arg)
2895 auto_flags_arg, field_name_arg,
2922 bool get_date_internal(
MYSQL_TIME *ltime)
const final;
2923 bool get_date_internal_at_utc(
MYSQL_TIME *ltime)
const final;
2924 void store_timestamp_internal(
const my_timeval *tm)
final;
2927 static const int PACK_LENGTH = 4;
2930 const char *field_name_arg);
2952 uint param_data [[maybe_unused]])
final {
2977 bool get_date_internal(
MYSQL_TIME *ltime)
const final;
2978 bool get_date_internal_at_utc(
MYSQL_TIME *ltime)
const final;
2982 void store_timestamp_internal(
const my_timeval *tm)
override;
2995 uchar auto_flags_arg,
const char *field_name_arg,
3046 enum Limits { MIN_YEAR = 1901, MAX_YEAR = 2155 };
3048 uchar auto_flags_arg,
const char *field_name_arg)
3049 :
Field_tiny(ptr_arg, 4, null_ptr_arg, null_bit_arg, auto_flags_arg,
3050 field_name_arg, true, true) {}
3053 0,
NONE, field_name_arg, true, true) {}
3074 static const int PACK_LENGTH = 3;
3076 bool get_date_internal(
MYSQL_TIME *ltime)
const final;
3082 uchar auto_flags_arg,
const char *field_name_arg)
3133 int *
error)
override = 0;
3139 int *warnings)
final;
3155 uchar auto_flags_arg,
const char *field_name_arg,
3157 :
Field_temporal(ptr_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
3177 uchar auto_flags_arg,
const char *field_name_arg)
3179 field_name_arg, 0) {}
3224 uchar auto_flags_arg,
const char *field_name_arg,
uint8 dec_arg)
3226 field_name_arg, dec_arg) {}
3236 NONE, field_name_arg, dec_arg) {}
3279 bool get_date_internal(
MYSQL_TIME *ltime)
const final;
3281 void store_timestamp_internal(
const my_timeval *tm)
final;
3284 static const int PACK_LENGTH = 8;
3299 uchar auto_flags_arg,
const char *field_name_arg)
3301 auto_flags_arg, field_name_arg, 0) {}
3304 field_name_arg, 0) {}
3326 uint param_data [[maybe_unused]])
final {
3336 bool get_date_internal(
MYSQL_TIME *ltime)
const final;
3340 void store_timestamp_internal(
const my_timeval *tm)
final;
3353 uchar auto_flags_arg,
const char *field_name_arg,
3356 auto_flags_arg, field_name_arg,
3368 field_name_arg, dec_arg) {}
3397 :
Field_longstr(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
3398 auto_flags_arg, field_name_arg,
cs) {}
3403 field_name_arg,
cs) {}
3429 const char *
string = pointer_cast<const char *>(
ptr);
3440 DBUG_PRINT(
"debug", (
"field_metadata: 0x%04x", field_metadata));
3442 return (((field_metadata >> 4) & 0x300) ^ 0x300) +
3443 (field_metadata & 0x00ff);
3446 uint16 mflags,
int *order_var)
const final;
3503 uint32 max_length = ~0
L)
const final;
3514 uchar *new_null_ptr,
uint new_null_bit)
const final;
3521 void hash(ulong *nr, ulong *nr2)
const final;
3609 bool m_uses_backup{
false};
3618 memmove(
ptr + packlength, &from,
sizeof(
char *));
3623 uchar auto_flags_arg,
const char *field_name_arg,
3630 field_name_arg,
cs),
3632 m_keep_old_value(false) {
3634 if (set_packlength) {
3635 packlength = len_arg <= 255
3637 : len_arg <= 65535 ? 2 : len_arg <= 16777215 ? 3 : 4;
3644 packlength(field.packlength),
3647 m_keep_old_value(field.m_keep_old_value),
3678 uint32 max_length = ~0
L)
const override;
3703 store_length(
ptr, packlength, number);
3706 return get_length(row_offset);
3708 uint32 get_length(ptrdiff_t row_offset = 0)
const;
3716 return get_blob_data(
ptr + packlength + row_offset);
3728 memcpy(&data, position,
sizeof(data));
3735 memcpy(
ptr + packlength, &data,
sizeof(
char *));
3739 store_length(ptr_ofs, packlength,
length);
3740 memcpy(ptr_ofs + packlength, &data,
sizeof(
char *));
3743 set_ptr_offset(0,
length, data);
3756 uint max_length)
const final;
3796 m_keep_old_value = old_value_flag;
3839 if (m_keep_old_value) {
3841 m_keep_old_value =
false;
3849 store_ptr_and_length(from,
length);
3860 bool backup_blob_field();
3866 void restore_blob_backup();
3883 uchar auto_flags_arg,
const char *field_name_arg,
3885 enum geometry_type geom_type_arg, std::optional<gis::srid_t> srid)
3886 :
Field_blob(ptr_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
3889 geom_type(geom_type_arg) {}
3891 enum geometry_type geom_type_arg, std::optional<gis::srid_t> srid)
3895 geom_type(geom_type_arg) {}
3913 if (res !=
TYPE_OK)
return res;
3926 std::optional<gis::srid_t>
get_srid()
const {
return m_srid; }
3936 uchar auto_flags_arg,
const char *field_name_arg,
3938 :
Field_blob(ptr_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
3995 longlong get_diff_vector_and_length(
4002 bool is_before_image_equal_to_after_image()
const;
4013 bool unpack_diff(
const uchar **from);
4055 uint32 max_length = ~0
L)
const final;
4072 const char *get_binary(ptrdiff_t row_offset = 0)
const;
4125 size_t elt_length,
uint elt_decimals,
uchar *ptr_arg,
4127 uchar auto_flags_arg,
const char *field_name_arg,