MySQL 8.0.37
Source Code Documentation
field.h
Go to the documentation of this file.
1#ifndef FIELD_INCLUDED
2#define FIELD_INCLUDED
3
4/* Copyright (c) 2000, 2024, Oracle and/or its affiliates.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License, version 2.0,
8 as published by the Free Software Foundation.
9
10 This program is designed to work with certain software (including
11 but not limited to OpenSSL) that is licensed under separate terms,
12 as designated in a particular file or component or in included license
13 documentation. The authors of MySQL hereby grant you an additional
14 permission to link the program and your derivative works with the
15 separately licensed software that they have either included with
16 the program or referenced in the documentation.
17
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License, version 2.0, for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
26
27#include <assert.h>
28#include <limits.h>
29#include <stddef.h>
30#include <stdio.h>
31#include <stdlib.h>
32#include <string.h>
33#include <sys/types.h>
34
35#include <algorithm>
36#include <optional>
37
38#include "decimal.h" // E_DEC_OOM
39#include "field_types.h" // enum_field_types
40#include "lex_string.h"
41#include "libbinlogevents/export/binary_log_funcs.h" // my_time_binary_length
42#include "m_ctype.h"
43#include "my_alloc.h"
44#include "my_base.h" // ha_storage_media
45#include "my_bitmap.h"
46#include "my_dbug.h"
47#include "my_double2ulonglong.h"
48#include "my_inttypes.h"
49#include "my_sys.h"
50#include "my_time.h" // MYSQL_TIME_NOTE_TRUNCATED
52#include "mysql_com.h"
53#include "mysql_time.h"
54#include "mysqld_error.h" // ER_*
55#include "sql/dd/types/column.h"
57#include "sql/gis/srid.h"
58#include "sql/sql_bitmap.h"
59#include "sql/sql_const.h"
60#include "sql/sql_error.h" // Sql_condition
61#include "sql/table.h"
62#include "sql_string.h" // String
63#include "template_utils.h"
64
65class Create_field;
66class Field;
67class Field_bit;
69class Field_blob;
70class Field_datetime;
71class Field_decimal;
72class Field_double;
73class Field_enum;
74class Field_float;
75class Field_json;
76class Field_long;
77class Field_longlong;
78class Field_medium;
80class Field_newdate;
81class Field_num;
82class Field_real;
83class Field_set;
84class Field_short;
85class Field_str;
86class Field_string;
87class Field_temporal;
91class Field_time;
93class Field_timef;
94class Field_timestamp;
95class Field_tiny;
96class Field_varstring;
97class Field_year;
98class Item;
99class Item_field;
100class Json_array;
101class Json_diff_vector;
102class Json_wrapper;
103class KEY;
104class Protocol;
105class Relay_log_info;
106class Send_field;
107class THD;
108class Time_zone;
109class my_decimal;
110struct TYPELIB;
111struct timeval;
112
113/*
114 Inside an in-memory data record, memory pointers to pieces of the
115 record (like BLOBs) are stored in their native byte order and in
116 this amount of bytes.
117*/
118#define portable_sizeof_char_ptr 8
119
120/*
121
122Field class hierarchy
123
124
125Field (abstract)
126|
127+--Field_bit
128| +--Field_bit_as_char
129|
130+--Field_num (abstract)
131| | +--Field_real (abstract)
132| | +--Field_decimal
133| | +--Field_float
134| | +--Field_double
135| |
136| +--Field_new_decimal
137| +--Field_short
138| +--Field_medium
139| +--Field_long
140| +--Field_longlong
141| +--Field_tiny
142| +--Field_year
143|
144+--Field_str (abstract)
145| +--Field_longstr
146| | +--Field_string
147| | +--Field_varstring
148| | +--Field_blob
149| | +--Field_geom
150| | +--Field_json
151| | +--Field_typed_array
152| |
153| +--Field_null
154| +--Field_enum
155| +--Field_set
156|
157+--Field_temporal (abstract)
158 +--Field_time_common (abstract)
159 | +--Field_time
160 | +--Field_timef
161 |
162 +--Field_temporal_with_date (abstract)
163 +--Field_newdate
164 +--Field_temporal_with_date_and_time (abstract)
165 +--Field_timestamp
166 +--Field_datetime
167 +--Field_temporal_with_date_and_timef (abstract)
168 +--Field_timestampf
169 +--Field_datetimef
170*/
171
177
178/// For use @see DTCollation::aggregate()
188
189/* Specifies data storage format for individual columns */
191 COLUMN_FORMAT_TYPE_DEFAULT = 0, /* Not specified (use engine default) */
192 COLUMN_FORMAT_TYPE_FIXED = 1, /* FIXED format */
193 COLUMN_FORMAT_TYPE_DYNAMIC = 2 /* DYNAMIC format */
195
196/**
197 Status when storing a value in a field or converting from one
198 datatype to another. The values should be listed in order of
199 increasing seriousness so that if two type_conversion_status
200 variables are compared, the bigger one is most serious.
201*/
203 /// Storage/conversion went fine.
205 /**
206 A minor problem when converting between temporal values, e.g.
207 if datetime is converted to date the time information is lost.
208 */
210 /**
211 Value was stored, but something was cut. What was cut is
212 considered insignificant enough to only issue a note. Example:
213 trying to store a number with 5 decimal places into a field that
214 can only store 3 decimals. The number rounded to 3 decimal places
215 should be stored. Another example: storing the string "foo " into
216 a VARCHAR(3). The string "foo" is stored in this case, so only
217 whitespace is cut.
218 */
220 /**
221 Value outside min/max limit of datatype. The min/max value is
222 stored by Field::store() instead (if applicable)
223 */
225 /**
226 Value was stored, but something was cut. What was cut is
227 considered significant enough to issue a warning. Example: storing
228 the string "foo" into a VARCHAR(2). The string "fo" is stored in
229 this case. Another example: storing the string "2010-01-01foo"
230 into a DATE. The garbage in the end of the string is cut in this
231 case.
232 */
234 /**
235 Value has invalid string data. When present in a predicate with
236 equality operator, range optimizer returns an impossible where.
237 */
239 /// Trying to store NULL in a NOT NULL field.
241 /**
242 Store/convert incompatible values, like converting "foo" to a
243 date.
244 */
246 /// Out of memory
249
250/*
251 Some defines for exit codes for ::is_equal class functions.
252*/
253#define IS_EQUAL_NO 0
254#define IS_EQUAL_YES 1
255#define IS_EQUAL_PACK_LENGTH 2
256
257#define my_charset_numeric my_charset_latin1
258#define MY_REPERTOIRE_NUMERIC MY_REPERTOIRE_ASCII
259
260/**
261 Check if one can copy from “from” to “to” with a simple memcpy(), with
262 pack_length() as the length. This is the case if the types of the two fields
263 are the same and we don't have special copying rules for the type
264 (e.g., blobs, which require allocation, or time functions that require
265 checking for special SQL modes).
266
267 You should never call this with to == from, as such copies are no-ops
268 and memcpy() has undefined behavior with overlapping memory areas.
269 */
270bool fields_are_memcpyable(const Field *to, const Field *from);
271
272/**
273 Copy the value in "from" (assumed to be non-NULL) to "to", doing any
274 required conversions in the process.
275
276 Note that you should only call this if fields_are_memcpyable() is false,
277 since it does an actual conversion on the slow path (and it is not properly
278 tested whether it gives the correct result in all cases if
279 fields_are_memcpyable() is true).
280
281 You should never call this with to == from, as they are no-ops.
282 */
284
285inline uint get_enum_pack_length(int elements) {
286 return elements < 256 ? 1 : 2;
287}
288
289inline uint get_set_pack_length(int elements) {
290 uint len = (elements + 7) / 8;
291 return len > 4 ? 8 : len;
292}
293
295 if (dec_error & E_DEC_OOM) return TYPE_ERR_OOM;
296
297 if (dec_error & (E_DEC_DIV_ZERO | E_DEC_BAD_NUM)) return TYPE_ERR_BAD_VALUE;
298
299 if (dec_error & E_DEC_TRUNCATED) return TYPE_NOTE_TRUNCATED;
300
301 if (dec_error & E_DEC_OVERFLOW) return TYPE_WARN_OUT_OF_RANGE;
302
303 if (dec_error == E_DEC_OK) return TYPE_OK;
304
305 // impossible
306 assert(false);
307 return TYPE_ERR_BAD_VALUE;
308}
309
310/**
311 Convert warnings returned from str_to_time() and str_to_datetime()
312 to their corresponding type_conversion_status codes.
313*/
315 const int warn) {
317
319
321
323 return TYPE_ERR_BAD_VALUE;
324
326 // date was fine but pointed to daylight saving time switch gap
327 return TYPE_OK;
328
329 assert(!warn);
330 return TYPE_OK;
331}
332
333#define ASSERT_COLUMN_MARKED_FOR_READ \
334 assert(!table || \
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())))
339
340/**
341 Tests if field real type is temporal, i.e. represents
342 all existing implementations of
343 DATE, TIME, DATETIME or TIMESTAMP types in SQL.
344
345 @param type Field real type, as returned by field->real_type()
346 @retval true If field real type is temporal
347 @retval false If field real type is not temporal
348*/
350 switch (type) {
351 case MYSQL_TYPE_TIME2:
354 return true;
355 default:
356 return is_temporal_type(type);
357 }
358}
359
360/**
361 Tests if field real type can have "DEFAULT CURRENT_TIMESTAMP",
362 i.e. represents TIMESTAMP types in SQL.
363
364 @param type Field type, as returned by field->real_type().
365 @retval true If field real type can have "DEFAULT CURRENT_TIMESTAMP".
366 @retval false If field real type can not have "DEFAULT CURRENT_TIMESTAMP".
367*/
371}
372
373/**
374 Tests if field real type can have "ON UPDATE CURRENT_TIMESTAMP",
375 i.e. represents TIMESTAMP types in SQL.
376
377 @param type Field type, as returned by field->real_type().
378 @retval true If field real type can have "ON UPDATE CURRENT_TIMESTAMP".
379 @retval false If field real type can not have "ON UPDATE CURRENT_TIMESTAMP".
380*/
384}
385
386/**
387 Convert temporal real types as returned by field->real_type()
388 to field type as returned by field->type().
389
390 @param real_type Real type.
391 @retval Field type.
392*/
394 switch (real_type) {
395 case MYSQL_TYPE_TIME2:
396 return MYSQL_TYPE_TIME;
398 return MYSQL_TYPE_DATETIME;
402 return MYSQL_TYPE_DATE;
403 /* Note: NEWDECIMAL is a type, not only a real_type */
404 default:
405 return real_type;
406 }
407}
408
409/**
410 Return the appropriate MYSQL_TYPE_X_BLOB value based on the
411 pack_length.
412
413 @param pack_length pack_length for BLOB
414 @retval MYSQL_TYPE_X_BLOB corresponding to pack_length.
415*/
418 switch (pack_length) {
419 case 1:
421 case 2:
422 return MYSQL_TYPE_BLOB;
423 case 3:
425 case 4:
427 default:
428 assert(false);
430 }
431}
432
433/**
434 Copies an integer value to a format comparable with memcmp(). The
435 format is characterized by the following:
436
437 - The sign bit goes first and is unset for negative values.
438 - The representation is big endian.
439
440 The function template can be instantiated to copy from little or
441 big endian values.
442
443 @tparam Is_big_endian True if the source integer is big endian.
444
445 @param to Where to write the integer.
446 @param to_length Size in bytes of the destination buffer.
447 @param from Where to read the integer.
448 @param from_length Size in bytes of the source integer
449 @param is_unsigned True if the source integer is an unsigned value.
450*/
451template <bool Is_big_endian>
452void copy_integer(uchar *to, size_t to_length, const uchar *from,
453 size_t from_length, bool is_unsigned) {
454 if (to_length == 0) return;
455 if (Is_big_endian) {
456 std::copy(from, from + std::min(to_length, from_length), to);
457 if (!is_unsigned)
458 to[0] = static_cast<char>(to[0] ^ 128); // Reverse the sign bit.
459 } else {
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);
463 if (!is_unsigned)
464 to[0] = static_cast<char>(to[0] ^ 128); // Reverse the sign bit.
465 }
466}
467
468/**
469 Enum to indicate source for which value generator is used. This is needed
470 while unpacking value generator expression and pre-validating the
471 expression for generated column, default expression or check constraint.
472*/
474 VGS_GENERATED_COLUMN = 0, // Value generator for GENERATED_COLUMN.
475 VGS_DEFAULT_EXPRESSION, // Value generator for Default expression.
476 VGS_CHECK_CONSTRAINT // Value generator for check constraints.
478
479/**
480 Used for storing information associated with generated column, default
481 values generated from expression or check constraint expression.
482*/
484 public:
485 /**
486 Item representing the generation expression.
487 This is non-NULL for every Field of a TABLE, if that field is a generated
488 column.
489 Contrast this with the Field of a TABLE_SHARE, which has expr_item==NULL
490 even if it's a generated column; that makes sense, as an Item tree cannot
491 be shared.
492 */
493 Item *expr_item{nullptr};
494 /**
495 Text of the expression. Used in only one case:
496 - the text read from the DD is put into the Value_generator::expr_str of
497 the Field of the TABLE_SHARE; then this expr_str is used as source
498 to produce expr_item for the Field of every TABLE derived from this
499 TABLE_SHARE.
500 */
501 LEX_STRING expr_str{nullptr, 0};
502
503 /**
504 Bit field indicating the type of statement for binary logging.
505 It needs to be saved because this is determined only once when it is parsed
506 but it needs to be set on the lex for each statement that uses this
507 value generator. And since unpacking is done once on table open, it will
508 be set for the rest of the statements in bind_value_generator_to_fields.
509 */
511
512 /// List of all items created when parsing and resolving generated expression
513 Item *item_list{nullptr};
514 /// Bitmap records base columns which a generated column depends on.
516
518
519 void set_field_type(enum_field_types fld_type) { field_type = fld_type; }
520
521 /**
522 Set the binary log flags in m_backup_binlog_stmt_flags
523 @param backup_binlog_stmt_flags the flags to be backed up
524 */
525 void backup_stmt_unsafe_flags(uint32 backup_binlog_stmt_flags) {
526 m_backup_binlog_stmt_flags = backup_binlog_stmt_flags;
527 }
528
529 /**
530 Get the binary log flags from m_backup_binlog_stmt_flags
531 @return the flags backed up by unpack_value_generator
532 */
534
535 bool get_field_stored() const { return stored_in_db; }
536 void set_field_stored(bool stored) { stored_in_db = stored; }
537 bool register_base_columns(TABLE *table);
538 /**
539 Get the number of non virtual base columns that this generated
540 column needs.
541
542 @return number of non virtual base columns
543 */
545
546 /**
547 Duplicates a string into expr_str.
548
549 @param root MEM_ROOT to use for allocation
550 @param src source string
551 @param len length of 'src' in bytes
552 */
553 void dup_expr_str(MEM_ROOT *root, const char *src, size_t len);
554
555 /**
556 Writes the generation expression into a String with proper syntax.
557 @param thd THD
558 @param out output String
559 */
560 void print_expr(THD *thd, String *out);
561
562 /*
563 The following data is only updated by the parser and read
564 when a Create_field object is created/initialized.
565 */
566 private:
567 /// Real field type
569 /// Indicates if the field is physically stored in the database
570 bool stored_in_db{false};
571 /// How many non-virtual base columns in base_columns_map
573};
574
575class Field {
576 public:
577 /*
578 Field(const Item &) = delete;
579 The original intention was seemingly for Field to be non-copyable,
580 but due to a typo, this was never enforced, and now there's lots of
581 code that copies Field objects around. Thus, the default copy
582 constructor needs to stay (assignment is blocked off), but it's probably
583 better not to write code that depends on it.
584 */
585 Field(const Field &) = default;
586 void operator=(Field &) = delete;
587
588 /**
589 Checks if the field is marked as having a general expression to generate
590 default values.
591
592 @retval true The field has general expression as default
593 @retval false The field doesn't have any general expression as default
594 */
597 }
598
599 /**
600 Checks if the field is marked as having a datetime value expression to
601 generate default values on inserts.
602
603 @retval true The field has datetime expression as default
604 @retval false The field doesn't have a datime value expression as default
605 */
607 return auto_flags & DEFAULT_NOW;
608 }
609
610 /**
611 Checks if the field is marked as having a datetime value expression to
612 generate default values on updates.
613
614 @retval true The field has datetime expression as default for on update
615 @retval false The field doesn't have a datime value expression as default
616 for on update
617 */
619 return auto_flags & ON_UPDATE_NOW;
620 }
621
622 /**
623 Checks if the field is marked as having a constant expression to generate
624 default values. Relevant when re-creating a Create_field from a Field
625 during ALTER.
626
627 @retval true The field has a constant expression as default
628 @retval false The field doesn't have a constant expression as default
629 */
631 // For now this is true whenever neither GENERATED_FROM_EXPRESSION nor
632 // DEFAULT_NOW is set. If this changes in the future, we can add a separate
633 // flag for this.
635 }
636
637 protected:
638 /// Holds the position to the field in record
640
641 private:
643
644 /**
645 Byte where the @c NULL bit is stored inside a record. If this Field is a
646 @c NOT @c NULL field, this member is @c NULL.
647 */
649
650 /**
651 Flag: if the NOT-NULL field can be temporary NULL.
652 */
654
655 /**
656 This is a flag with the following semantics:
657 - it can be changed only when m_is_tmp_nullable is true;
658 - it specifies if this field in the first current record
659 (TABLE::record[0]) was set to NULL (temporary NULL).
660
661 This flag is used for trigger handling.
662 */
664
665 /**
666 The value of THD::check_for_truncated_fields at the moment of setting
667 m_is_tmp_null attribute.
668 */
670
671 protected:
672 /*
673 null_ptr buffer to be used for Fields that are nullable but
674 cannot store null. Typically used from create_tmp_field().
675 */
677
678 public:
680 /// Pointer to TABLE object that owns this field
682 /// Pointer to original database name, only non-NULL for a temporary table
683 const char *orig_db_name{nullptr};
684 /// Pointer to original table name, only non-NULL for a temporary table
685 const char *orig_table_name{nullptr};
686 const char **table_name, *field_name;
688 /* Field is part of the following keys */
689 Key_map key_start; /* Keys that starts with this field */
690 Key_map part_of_key; ///< Keys that includes this field
691 ///< except of prefix keys.
692 Key_map part_of_prefixkey; ///< Prefix keys
693 Key_map part_of_sortkey; /* ^ but only keys usable for sorting */
694 /**
695 All keys that include this field, but not extended by the storage engine to
696 include primary key columns.
697 */
699
700 /**
701 Flags for Field::auto_flags / Create_field::auto_flags bitmaps.
702
703 @note NEXT_NUMBER and DEFAULT_NOW/ON_UPDATE_NOW/GENERATED flags should
704 never be set at the same time. Also DEFAULT_NOW and GENERATED
705 should not be set at the same time.
706
707 @warning The values of this enum are used as bit masks for uchar
708 Field::auto_flags.
709 */
711 NONE = 0,
712 NEXT_NUMBER = 1, ///< AUTO_INCREMENT
713 DEFAULT_NOW = 2, ///< DEFAULT CURRENT_TIMESTAMP
714 ON_UPDATE_NOW = 4, ///< ON UPDATE CURRENT_TIMESTAMP
715 GENERATED_FROM_EXPRESSION = 8 ///< DEFAULT (expression)
716 };
717
727 };
729
730 // Max width for a VARCHAR column, in number of bytes
731 static constexpr size_t MAX_VARCHAR_WIDTH{65535};
732
733 // Maximum sizes of the four BLOB types, in number of bytes
734 static constexpr size_t MAX_TINY_BLOB_WIDTH{255};
735 static constexpr size_t MAX_SHORT_BLOB_WIDTH{65535};
736 static constexpr size_t MAX_MEDIUM_BLOB_WIDTH{16777215};
737 static constexpr size_t MAX_LONG_BLOB_WIDTH{4294967295};
738
739 // Length of field. Never write to this member directly; instead, use
740 // set_field_length().
743
744 private:
746 uint16 m_field_index; // field number in fields array
747
748 public:
749 bool is_flag_set(unsigned flag) const { return flags & flag; }
750 void set_flag(unsigned flag) { flags |= flag; }
751 void clear_flag(unsigned flag) { flags &= ~flag; }
752 // Avoid using this function as it makes it harder to change the internal
753 // representation.
754 uint32 all_flags() const { return flags; }
755 uchar null_bit; // Bit used to test null bit
756 /**
757 Bitmap of flags indicating if field value is auto-generated by default
758 and/or on update, and in which way.
759
760 @sa Field::enum_auto_flags for possible options.
761
762 @sa Field::utype and Field::unireg_check in pre-8.0 versions of server
763 for historical perspective.
764 */
766 /**
767 If true, this field was created in create_tmp_field_from_item from a NULL
768 value. This means that the type of the field is just a guess, and the type
769 may be freely coerced to another type.
770
771 @see create_tmp_field_from_item
772 @see Item_type_holder::get_real_type
773
774 */
776 /**
777 True if this field belongs to some index (unlike part_of_key, the index
778 might have only a prefix).
779 */
781
784
785 private:
790 };
791
792 /*
793 Bitmask specifying which warnings have been already pushed in order
794 not to repeat the same warning for the collmn multiple times.
795 Uses values of enum_pushed_warnings to control pushed warnings.
796 */
797 unsigned int m_warnings_pushed;
798
799 public:
800 /* Generated column data */
802 /**
803 Indication that the field is physically stored in tables
804 rather than just generated on SQL queries.
805 As of now, false can only be set for virtual generated columns.
806 */
808 /**
809 Whether the field is signed or not. Meaningful only for numeric fields
810 and numeric arrays.
811 */
812 virtual bool is_unsigned() const { return false; }
813 bool is_gcol() const { return gcol_info; }
814 bool is_virtual_gcol() const { return gcol_info && !stored_in_db; }
815
816 /// Holds the expression to be used to generate default values.
818
819 /**
820 Sets the hidden type for this field.
821
822 @param hidden the new hidden type to set.
823 */
825
826 /// @returns the hidden type for this field.
828
829 /**
830 @retval true if this field should be hidden away from users.
831 @retval false is this field is visible to the user.
832 */
833 bool is_hidden() const {
835 DBUG_EVALUATE_IF("show_hidden_columns", false, true);
836 }
837
838 /**
839 @retval true If this column is hidden either in the storage engine
840 or SQL layer. Either way, it is completely hidden from
841 the user.
842 @retval false Otherwise.
843 */
844 bool is_hidden_by_system() const {
847 DBUG_EVALUATE_IF("show_hidden_columns", false, true);
848 }
849
850 /**
851 @retval true If this column is hidden by the user.
852 @retval false otherwise.
853 */
854 bool is_hidden_by_user() const {
856 }
857
858 /**
859 @returns true if this is a hidden field that is used for implementing
860 functional indexes. Note that if we need different types of hidden
861 fields in the future (like invisible columns), this function needs
862 to be changed so it can distinguish between the different "types"
863 of hidden.
864 */
867 gcol_info != nullptr;
868 }
869
870 Field(uchar *ptr_arg, uint32 length_arg, uchar *null_ptr_arg,
871 uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg);
872
873 virtual ~Field() = default;
874
876
877 /**
878 Turn on temporary nullability for the field.
879 */
881
882 /**
883 Turn off temporary nullability for the field.
884 */
886
887 /**
888 Reset temporary NULL value for field
889 */
890 void reset_tmp_null() { m_is_tmp_null = false; }
891
892 void set_tmp_null();
893
894 /**
895 @return temporary NULL-ability flag.
896 @retval true if NULL can be assigned temporary to the Field.
897 @retval false if NULL can not be assigned even temporary to the Field.
898 */
899 bool is_tmp_nullable() const { return m_is_tmp_nullable; }
900
901 /**
902 @return whether Field has temporary value NULL.
903 @retval true if the Field has temporary value NULL.
904 @retval false if the Field's value is NOT NULL, or if the temporary
905 NULL-ability flag is reset.
906 */
907 bool is_tmp_null() const { return is_tmp_nullable() && m_is_tmp_null; }
908
909 /* Store functions returns 1 on overflow and -1 on fatal error */
910 virtual type_conversion_status store(const char *to, size_t length,
911 const CHARSET_INFO *cs) = 0;
912 virtual type_conversion_status store(double nr) = 0;
913 virtual type_conversion_status store(longlong nr, bool unsigned_val) = 0;
914 /**
915 Store a temporal value in packed longlong format into a field.
916 The packed value is compatible with TIME_to_longlong_time_packed(),
917 TIME_to_longlong_date_packed() or TIME_to_longlong_datetime_packed().
918 Note, the value must be properly rounded or truncated according
919 according to field->decimals().
920
921 @param nr temporal value in packed longlong format.
922 @retval false on success
923 @retval true on error
924 */
926 return store(nr, false);
927 }
929 /**
930 Store MYSQL_TIME value with the given amount of decimal digits
931 into a field.
932
933 Note, the "dec" parameter represents number of digits of the Item
934 that previously created the MYSQL_TIME value. It's needed when we
935 store the value into a CHAR/VARCHAR/TEXT field to display
936 the proper amount of fractional digits.
937 For other field types the "dec" value does not matter and is ignored.
938
939 @param ltime Time, date or datetime value.
940 @param dec_arg Number of decimals in ltime.
941 @retval false on success
942 @retval true on error
943 */
944 virtual type_conversion_status store_time(MYSQL_TIME *ltime, uint8 dec_arg);
945 /**
946 Store MYSQL_TYPE value into a field when the number of fractional
947 digits is not important or is not know.
948
949 @param ltime Time, date or datetime value.
950 @retval false on success
951 @retval true on error
952 */
954 return store_time(ltime, 0);
955 }
956 type_conversion_status store(const char *to, size_t length,
957 const CHARSET_INFO *cs,
958 enum_check_fields check_level);
959 virtual double val_real() const = 0;
960 virtual longlong val_int() const = 0;
961 /**
962 Returns TIME value in packed longlong format.
963 This method should not be called for non-temporal types.
964 Temporal field types override the default method.
965 */
966 virtual longlong val_time_temporal() const {
967 assert(0);
968 return 0;
969 }
970 /**
971 Returns DATE/DATETIME value in packed longlong format.
972 This method should not be called for non-temporal types.
973 Temporal field types override the default method.
974 */
975 virtual longlong val_date_temporal() const {
976 assert(0);
977 return 0;
978 }
979
981 return val_time_temporal();
982 }
983
985 return val_date_temporal();
986 }
987
988 /**
989 Returns "native" packed longlong representation of
990 a TIME or DATE/DATETIME field depending on field type.
991 */
993 // Return longlong TIME or DATETIME representation, depending on field type
994 const enum_field_types field_type = type();
995 if (field_type == MYSQL_TYPE_TIME) return val_time_temporal();
996 assert(is_temporal_type_with_date(field_type));
997 return val_date_temporal();
998 }
999 virtual my_decimal *val_decimal(my_decimal *) const = 0;
1000 String *val_str(String *str) const { return val_str(str, str); }
1001 /*
1002 val_str(buf1, buf2) gets two buffers and should use them as follows:
1003 if it needs a temp buffer to convert result to string - use buf1
1004 example Field_tiny::val_str()
1005 if the value exists as a string already - use buf2
1006 example Field_string::val_str()
1007 consequently, buf2 may be created as 'String buf;' - no memory
1008 will be allocated for it. buf1 will be allocated to hold a
1009 value if it's too small. Using allocated buffer for buf2 may result in
1010 an unnecessary free (and later, may be an alloc).
1011 This trickery is used to decrease a number of malloc calls.
1012 */
1013 virtual String *val_str(String *, String *) const = 0;
1014 String *val_int_as_str(String *val_buffer, bool unsigned_flag) const;
1015 /*
1016 str_needs_quotes() returns true if the value returned by val_str() needs
1017 to be quoted when used in constructing an SQL query.
1018 */
1019 virtual bool str_needs_quotes() const { return false; }
1020 virtual Item_result result_type() const = 0;
1021 /**
1022 Returns Item_result type of a field when it appears
1023 in numeric context such as:
1024 SELECT time_column + 1;
1025 SELECT SUM(time_column);
1026 Examples:
1027 - a column of type TIME, DATETIME, TIMESTAMP act as INT.
1028 - a column of type TIME(1), DATETIME(1), TIMESTAMP(1)
1029 act as DECIMAL with 1 fractional digits.
1030 */
1032 return result_type();
1033 }
1034 virtual Item_result cmp_type() const { return result_type(); }
1035 virtual Item_result cast_to_int_type() const { return result_type(); }
1039 bool gcol_expr_is_equal(const Create_field *field) const;
1040 virtual bool eq(const Field *field) const {
1041 return (ptr == field->ptr && m_null_ptr == field->m_null_ptr &&
1042 null_bit == field->null_bit && field->type() == type());
1043 }
1044 virtual bool eq_def(const Field *field) const;
1045
1046 /*
1047 pack_length() returns size (in bytes) used to store field data in memory
1048 (i.e. it returns the maximum size of the field in a row of the table,
1049 which is located in RAM).
1050 */
1051 virtual uint32 pack_length() const { return (uint32)field_length; }
1052
1053 /*
1054 pack_length_in_rec() returns size (in bytes) used to store field data on
1055 storage (i.e. it returns the maximal size of the field in a row of the
1056 table, which is located on disk).
1057 */
1058 virtual uint32 pack_length_in_rec() const { return pack_length(); }
1059 virtual bool compatible_field_size(uint metadata, Relay_log_info *, uint16,
1060 int *order) const;
1061 virtual uint pack_length_from_metadata(uint field_metadata) const {
1062 DBUG_TRACE;
1063 return field_metadata;
1064 }
1065 virtual uint row_pack_length() const { return 0; }
1066 int save_field_metadata(uchar *first_byte) {
1067 return do_save_field_metadata(first_byte);
1068 }
1069
1070 /*
1071 data_length() return the "real size" of the data in memory.
1072 Useful only for variable length datatypes where it's overloaded.
1073 By default assume the length is constant.
1074 */
1075 virtual uint32 data_length(ptrdiff_t row_offset [[maybe_unused]] = 0) const {
1076 return pack_length();
1077 }
1078
1079 /**
1080 Get the maximum size of the data in packed format.
1081
1082 @return Maximum data length of the field when packed using the
1083 Field::pack() function.
1084 */
1085 virtual uint32 max_data_length() const { return pack_length(); }
1086
1088 memset(ptr, 0, pack_length());
1089 return TYPE_OK;
1090 }
1091 /**
1092 Returns a UTC component in `struct timeval` format. This interface
1093 makes any column appear to be `TIMESTAMP`, i.e. stored in UTC, and
1094 returns the UTC component in (optionally fractional) seconds. This means
1095 converting _to_ UTC from the current session's time zone for types other
1096 than `TIMESTAMP`.
1097
1098 This method was expressly written for `SELECT UNIX_TIMESTAMP(field)`
1099 to avoid conversion from timestamp to MYSQL_TIME and back.
1100 */
1101 virtual bool get_timestamp(my_timeval *tm, int *warnings) const;
1102 /**
1103 Stores a timestamp value in timeval format in a field.
1104
1105 @note
1106 - store_timestamp(), get_timestamp() and store_time() do not depend on
1107 timezone and always work "in UTC".
1108
1109 - The default implementation of this interface expects that storing the
1110 value will not fail. For most Field descendent classes, this is not the
1111 case. However, this interface is only used when the function
1112 CURRENT_TIMESTAMP is used as a column default expression, and currently we
1113 only allow TIMESTAMP and DATETIME columns to be declared with this as the
1114 column default. Hence it is enough that the classes implementing columns
1115 with these types either override this interface, or that
1116 store_time(MYSQL_TIME*, uint8) does not fail.
1117
1118 - The column types above interpret decimals() to mean the scale of the
1119 fractional seconds.
1120
1121 - We also have the limitation that the scale of a column must be the same as
1122 the scale of the CURRENT_TIMESTAMP. I.e. we only allow
1123
1124 @code
1125
1126 [ TIMESTAMP | DATETIME ] (n) [ DEFAULT | ON UPDATE ] CURRENT_TIMESTAMP (n)
1127
1128 @endcode
1129
1130 Since this interface relies on the caller to truncate the value according to
1131 this Field's scale, it will work with all constructs that we currently allow.
1132 */
1133 virtual void store_timestamp(const my_timeval *) { assert(false); }
1134
1135 virtual void set_default();
1136
1137 /**
1138 Evaluates the @c INSERT default function and stores the result in the
1139 field. If no such function exists for the column, or the function is not
1140 valid for the column's data type, invoking this function has no effect.
1141 */
1143
1144 /**
1145 Evaluates the @c UPDATE default function, if one exists, and stores the
1146 result in the record buffer. If no such function exists for the column,
1147 or the function is not valid for the column's data type, invoking this
1148 function has no effect.
1149 */
1151 virtual bool binary() const { return true; }
1152 virtual bool zero_pack() const { return true; }
1153 virtual enum ha_base_keytype key_type() const { return HA_KEYTYPE_BINARY; }
1154 virtual uint32 key_length() const { return pack_length(); }
1155 virtual enum_field_types type() const = 0;
1156 virtual enum_field_types real_type() const { return type(); }
1158 /*
1159 Binlog stores field->type() as type code by default.
1160 This puts MYSQL_TYPE_STRING in case of CHAR, VARCHAR, SET and ENUM,
1161 with extra data type details put into metadata.
1162
1163 We cannot store field->type() in case of temporal types with
1164 fractional seconds: TIME(n), DATETIME(n) and TIMESTAMP(n),
1165 because binlog records with MYSQL_TYPE_TIME, MYSQL_TYPE_DATETIME
1166 type codes do not have metadata.
1167 So for temporal data types with fractional seconds we'll store
1168 real_type() type codes instead, i.e.
1169 MYSQL_TYPE_TIME2, MYSQL_TYPE_DATETIME2, MYSQL_TYPE_TIMESTAMP2,
1170 and put precision into metatada.
1171
1172 Note: perhaps binlog should eventually be modified to store
1173 real_type() instead of type() for all column types.
1174 */
1175 return type();
1176 }
1177 int cmp(const uchar *str) const { return cmp(ptr, str); }
1178 virtual int cmp_max(const uchar *a, const uchar *b,
1179 uint max_len [[maybe_unused]]) const {
1180 return cmp(a, b);
1181 }
1182 virtual int cmp(const uchar *, const uchar *) const = 0;
1183 virtual int cmp_binary(const uchar *a, const uchar *b,
1184 uint32 max_length [[maybe_unused]] = ~0L) const {
1185 return memcmp(a, b, pack_length());
1186 }
1187 virtual int cmp_offset(ptrdiff_t row_offset) const {
1188 return cmp(ptr, ptr + row_offset);
1189 }
1190 virtual int cmp_binary_offset(ptrdiff_t row_offset) const {
1191 return cmp_binary(ptr, ptr + row_offset);
1192 }
1193 virtual int key_cmp(const uchar *a, const uchar *b) const {
1194 return cmp(a, b);
1195 }
1196 virtual int key_cmp(const uchar *str, uint length [[maybe_unused]]) const {
1197 return cmp(ptr, str);
1198 }
1199 virtual uint decimals() const { return 0; }
1200 virtual bool is_text_key_type() const { return false; }
1201
1202 /*
1203 Caller beware: sql_type can change str.Ptr, so check
1204 ptr() to see if it changed if you are using your own buffer
1205 in str and restore it with set() if needed
1206 */
1207 virtual void sql_type(String &str) const = 0;
1208
1209 /**
1210 Check whether the full table's row is NULL or the Field has value NULL.
1211
1212 @return true if the full table's row is NULL or the Field has value NULL
1213 false if neither table's row nor the Field has value NULL
1214 */
1215 bool is_null(ptrdiff_t row_offset = 0) const {
1216 /*
1217 if the field is NULLable, it returns NULLity based
1218 on m_null_ptr[row_offset] value. Otherwise it returns
1219 NULL flag depending on TABLE::has_null_row() value.
1220
1221 The table may have been marked as containing only NULL values
1222 for all fields if it is a NULL-complemented row of an OUTER JOIN
1223 or if the query is an implicitly grouped query (has aggregate
1224 functions but no GROUP BY clause) with no qualifying rows. If
1225 this is the case (in which TABLE::has_null_row() is true) and the
1226 field is not nullable, the field is considered to be NULL.
1227
1228 Do not change the order of testing. Fields may be associated
1229 with a TABLE object without being part of the current row.
1230 For NULL value check to work for these fields, they must
1231 have a valid m_null_ptr, and this pointer must be checked before
1232 TABLE::has_null_row().
1233 */
1234 if (is_nullable()) return (m_null_ptr[row_offset] & null_bit);
1235
1236 if (is_tmp_nullable()) return m_is_tmp_null;
1237
1238 return table->has_null_row();
1239 }
1240
1241 /**
1242 Check whether the Field has value NULL (temporary or actual).
1243
1244 @return true if the Field has value NULL (temporary or actual)
1245 false if the Field has value NOT NULL.
1246 */
1247 bool is_real_null(ptrdiff_t row_offset = 0) const {
1248 if (is_nullable()) return (m_null_ptr[row_offset] & null_bit);
1249
1250 if (is_tmp_nullable()) return m_is_tmp_null;
1251
1252 return false;
1253 }
1254
1255 /**
1256 Check if the Field has value NULL or the record specified by argument
1257 has value NULL for this Field.
1258
1259 @return true if the Field has value NULL or the record has value NULL
1260 for thois Field.
1261 */
1262 bool is_null_in_record(const uchar *record) const {
1263 if (is_nullable()) return (record[null_offset()] & null_bit);
1264
1265 return is_tmp_nullable() ? m_is_tmp_null : false;
1266 }
1267
1268 void set_null(ptrdiff_t row_offset = 0);
1269
1270 void set_notnull(ptrdiff_t row_offset = 0);
1271
1272 // Cannot be const as it calls set_warning
1274
1275 /**
1276 Remember the value of THD::check_for_truncated_fields to handle possible
1277 NOT-NULL constraint errors after BEFORE-trigger execution is finished.
1278 We should save the value of THD::check_for_truncated_fields before starting
1279 BEFORE-trigger processing since during triggers execution the
1280 value of THD::check_for_truncated_fields could be changed.
1281 */
1283 enum_check_fields check_for_truncated_fields) {
1284 m_check_for_truncated_fields_saved = check_for_truncated_fields;
1285 }
1286
1287 /// @return true if this field is NULL-able, false otherwise.
1288 bool is_nullable() const { return m_null_ptr != nullptr; }
1289
1291 return (uint)(m_null_ptr - record);
1292 }
1293
1294 uint null_offset() const;
1295
1296 void set_null_ptr(uchar *p_null_ptr, uint p_null_bit) {
1297 m_null_ptr = p_null_ptr;
1298 null_bit = p_null_bit;
1299 }
1300
1301 /**
1302 Populates a Send_field object with metadata about the column represented by
1303 this Field object. The Send_field object is used for sending column metadata
1304 to the client.
1305
1306 @param[out] send_field the Send_field object to populate
1307 */
1308 virtual void make_send_field(Send_field *send_field) const;
1309
1310 /**
1311 Writes a copy of the current value in the record buffer, suitable for
1312 sorting using byte-by-byte comparison. Integers are always in big-endian
1313 regardless of hardware architecture. At most length bytes are written
1314 into the buffer.
1315
1316 @param buff The buffer, assumed to be at least length bytes.
1317
1318 @param length Number of bytes to write.
1319
1320 @retval The number of bytes actually written.
1321
1322 @note This is now only used by replication; filesort makes its own
1323 sort keys based off of Items, not Fields.
1324 */
1325 virtual size_t make_sort_key(uchar *buff, size_t length) const = 0;
1326
1327 /**
1328 Writes a copy of the current value in the record buffer, suitable for
1329 sorting using byte-by-byte comparison. Integers are always in big-endian
1330 regardless of hardware architecture. At most length bytes are written
1331 into the buffer. Field_string, Field_varstring and Field_blob classes
1332 are truncated after pos number of characters.
1333
1334 @param buff The buffer, assumed to be at least length bytes.
1335
1336 @param length Number of bytes to write.
1337
1338 @param trunc_pos Number of characters which should be included before
1339 truncation.
1340
1341 @retval The number of bytes actually written.
1342
1343 @note This is now only used by replication; filesort makes its own
1344 sort keys based off of Items, not Fields.
1345 */
1346 virtual size_t make_sort_key(uchar *buff, size_t length,
1347 size_t trunc_pos [[maybe_unused]]) const {
1348 return make_sort_key(buff, length);
1349 }
1350
1351 /**
1352 Whether this field can be used for index range scans when in
1353 the given keypart of the given index.
1354 */
1355 virtual bool optimize_range(uint idx, uint part) const;
1356 /*
1357 This should be true for fields which, when compared with constant
1358 items, can be casted to longlong. In this case we will at 'fix_fields'
1359 stage cast the constant items to longlongs and at the execution stage
1360 use field->val_int() for comparison. Used to optimize clauses like
1361 'a_column BETWEEN date_const, date_const'.
1362 */
1363 virtual bool can_be_compared_as_longlong() const { return false; }
1364 virtual void mem_free() {}
1365
1366 virtual Field *new_field(MEM_ROOT *root, TABLE *new_table) const;
1367
1368 Field *new_field(MEM_ROOT *root, TABLE *new_table, uchar *new_ptr,
1369 uchar *new_null_ptr, uint new_null_bit) const {
1370 Field *field = new_field(root, new_table);
1371 field->move_field(new_ptr, new_null_ptr, new_null_bit);
1372 return field;
1373 }
1374
1375 virtual Field *new_key_field(MEM_ROOT *root, TABLE *new_table, uchar *new_ptr,
1376 uchar *new_null_ptr, uint new_null_bit) const;
1377
1378 Field *new_key_field(MEM_ROOT *root, TABLE *new_table, uchar *new_ptr) const {
1379 return new_key_field(root, new_table, new_ptr, m_null_ptr, null_bit);
1380 }
1381
1382 /**
1383 Makes a shallow copy of the Field object.
1384
1385 @note This member function must be overridden in all concrete
1386 subclasses. Several of the Field subclasses are concrete even though they
1387 are not leaf classes, so the compiler will not always catch this.
1388
1389 @param mem_root MEM_ROOT to use for memory allocation.
1390 @retval NULL If memory allocation failed.
1391 */
1392 virtual Field *clone(MEM_ROOT *mem_root) const = 0;
1393
1394 void move_field(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg) {
1395 ptr = ptr_arg;
1396 m_null_ptr = null_ptr_arg;
1397 null_bit = null_bit_arg;
1398 }
1399
1400 virtual void move_field_offset(ptrdiff_t ptr_diff) {
1401 ptr += ptr_diff;
1402 if (is_nullable()) m_null_ptr += ptr_diff;
1403 }
1404
1405 virtual void get_image(uchar *buff, size_t length,
1406 const CHARSET_INFO *) const {
1407 memcpy(buff, ptr, length);
1408 }
1409
1410 virtual void set_image(const uchar *buff, size_t length,
1411 const CHARSET_INFO *) {
1412 memcpy(ptr, buff, length);
1413 }
1414
1415 /*
1416 Copy a field part into an output buffer.
1417
1418 SYNOPSIS
1419 Field::get_key_image()
1420 buff [out] output buffer
1421 length output buffer size
1422 type itMBR for geometry blobs, otherwise itRAW
1423
1424 DESCRIPTION
1425 This function makes a copy of field part of size equal to or
1426 less than "length" parameter value.
1427 For fields of string types (CHAR, VARCHAR, TEXT) the rest of buffer
1428 is padded by zero byte.
1429
1430 NOTES
1431 For variable length character fields (i.e. UTF-8) the "length"
1432 parameter means a number of output buffer bytes as if all field
1433 characters have maximal possible size (mbmaxlen). In the other words,
1434 "length" parameter is a number of characters multiplied by
1435 field_charset->mbmaxlen.
1436
1437 RETURN
1438 Number of copied bytes (excluding padded zero bytes -- see above).
1439 */
1440
1441 virtual size_t get_key_image(uchar *buff, size_t length,
1442 imagetype type [[maybe_unused]]) const {
1444 return length;
1445 }
1446 virtual void set_key_image(const uchar *buff, size_t length) {
1448 }
1449 longlong val_int_offset(ptrdiff_t row_offset) {
1450 ptr += row_offset;
1451 longlong tmp = val_int();
1452 ptr -= row_offset;
1453 return tmp;
1454 }
1456 uchar *old_ptr = ptr;
1457 longlong return_value;
1458 ptr = new_ptr;
1459 return_value = val_int();
1460 ptr = old_ptr;
1461 return return_value;
1462 }
1464 uchar *old_ptr = ptr;
1465 ptr = new_ptr;
1466 val_str(str);
1467 ptr = old_ptr;
1468 return str;
1469 }
1470
1471 /**
1472 Send the value of this field over the protocol using the correct
1473 Protocol::store*() function which matches the type of the field.
1474 */
1475 virtual bool send_to_protocol(Protocol *protocol) const;
1476
1477 /**
1478 Pack the field into a format suitable for storage and transfer.
1479
1480 To implement packing functionality, only the virtual function
1481 should be overridden. The other functions are just convenience
1482 functions and hence should not be overridden.
1483
1484 The actual format is opaque and will vary between types of Field
1485 (it is meant to be unpacked by unpack(), but be aware that it is
1486 used among others in the replication log, so you cannot change it
1487 without incurring a format break.
1488
1489 @note The default implementation just copies the raw bytes
1490 of the record into the destination, but never more than
1491 <code>max_length</code> characters.
1492
1493 @param to
1494 Pointer to memory area where representation of field should be put.
1495
1496 @param from
1497 Pointer to memory area where record representation of field is
1498 stored, typically field->field_ptr().
1499
1500 @param max_length
1501 Available space in “to”, in bytes. pack() will not write more bytes than
1502 this; if the field is too short, the contents _are not unpackable by
1503 unpack()_. (It is nominally supposed to be a prefix of what would have
1504 been written with a full buffer, ie., the same as packing and then
1505 truncating the output, but not all Field classes follow this.)
1506
1507 @return The byte after the last byte in “to” written to. If the return
1508 value is equal to (to + max_length), it could either be that the value
1509 fit exactly, or that the buffer was too small; you cannot distinguish
1510 between the two cases based on the return value alone.
1511 */
1512 virtual uchar *pack(uchar *to, const uchar *from, size_t max_length) const;
1513
1514 uchar *pack(uchar *to) const { return pack(to, ptr, UINT_MAX); }
1515
1516 virtual const uchar *unpack(uchar *to, const uchar *from, uint param_data);
1517
1518 const uchar *unpack(const uchar *from) { return unpack(ptr, from, 0U); }
1519
1520 /**
1521 This function does the same thing as pack(), except for the difference
1522 that max_length does not mean the number of bytes in the output, but the
1523 maximum field length from the input (which must be exactly
1524 field->max_field_length()). The difference is currently only relevant for
1525 Field_blob, but can be summed up as follows:
1526
1527 - If the actual field length is longer than "max_length", by way of
1528 software bug or otherwise, the function may behave as if it were shorter,
1529 and write something that is still readable by unpack().
1530 - There is no bounds checking; the caller must verify that there is
1531 sufficient space in "to". Even in the case of truncation, "to" must
1532 be long enough to hold the untruncated field, as the return pointer
1533 would otherwise be invalid, causing undefined behavior as per the C++
1534 standard.
1535 */
1536 virtual uchar *pack_with_metadata_bytes(uchar *to, const uchar *from,
1537 uint max_length) const {
1538 return pack(to, from, max_length);
1539 }
1540
1541 /**
1542 Write the field for the binary log in diff format.
1543
1544 This should only write the field if the diff format is smaller
1545 than the full format. Otherwise it should leave the buffer
1546 untouched.
1547
1548 @param[in,out] to Pointer to buffer where the field will be
1549 written. This will be changed to point to the next byte after the
1550 last byte that was written.
1551
1552 @param value_options bitmap that indicates if full or partial
1553 JSON format is to be used.
1554
1555 @retval true The field was not written, either because the data
1556 type does not support it, or because it was disabled according to
1557 value_options, or because there was no diff information available
1558 from the optimizer, or because the the diff format was bigger than
1559 the full format. The 'to' parameter is unchanged in this case.
1560
1561 @retval false The field was written.
1562 */
1563 virtual bool pack_diff(uchar **to [[maybe_unused]],
1564 ulonglong value_options [[maybe_unused]]) const {
1565 return true;
1566 }
1567
1568 /**
1569 This is a wrapper around pack_length() used by filesort() to determine
1570 how many bytes we need for packing "addon fields".
1571 @returns maximum size of a row when stored in the filesort buffer.
1572 */
1573
1574 virtual uint max_packed_col_length() const { return pack_length(); }
1575
1576 uint offset(uchar *record) const { return (uint)(ptr - record); }
1577
1578 void copy_data(ptrdiff_t src_record_offset);
1579
1580 virtual bool get_date(MYSQL_TIME *ltime, my_time_flags_t fuzzydate) const;
1581
1582 virtual bool get_time(MYSQL_TIME *ltime) const;
1583
1584 virtual const CHARSET_INFO *charset() const { return &my_charset_bin; }
1585
1587 return binary() ? &my_charset_bin : charset();
1588 }
1589 virtual const CHARSET_INFO *sort_charset() const { return charset(); }
1590 virtual bool has_charset() const { return false; }
1591 /*
1592 match_collation_to_optimize_range() is to distinguish in
1593 range optimizer (see opt_range.cc) between real string types:
1594 CHAR, VARCHAR, TEXT
1595 and the other string-alike types with result_type() == STRING_RESULT:
1596 DATE, TIME, DATETIME, TIMESTAMP
1597 We need it to decide whether to test if collation of the operation
1598 matches collation of the field (needed only for real string types).
1599 QQ: shouldn't DATE/TIME types have their own XXX_RESULT types eventually?
1600 */
1601
1602 virtual bool match_collation_to_optimize_range() const { return false; }
1603 virtual enum Derivation derivation() const { return DERIVATION_IMPLICIT; }
1604 virtual uint repertoire() const { return MY_REPERTOIRE_UNICODE30; }
1605 virtual void set_derivation(enum Derivation) {}
1606
1607 /**
1608 Produce warning or note about data saved into field.
1609
1610 @param level - level of message (Note/Warning/Error)
1611 @param code - error code of message to be produced
1612 @param cut_increment - whenever we should increase cut fields count
1613
1614 @note
1615 This function won't produce warning and increase cut fields counter
1616 if check_for_truncated_fields == CHECK_FIELD_IGNORE for current thread.
1617
1618 if check_for_truncated_fields == CHECK_FIELD_IGNORE then we ignore notes.
1619 This allows us to avoid notes in optimization, like
1620 convert_constant_item().
1621
1622 @retval
1623 1 if check_for_truncated_fields == CHECK_FIELD_IGNORE and error level
1624 is not NOTE
1625 @retval
1626 0 otherwise
1627 */
1629 int cut_increment) {
1630 return set_warning(level, code, cut_increment, nullptr, nullptr);
1631 }
1632
1634 int cut_increment, const char *view_db,
1635 const char *view_name);
1636
1637 bool warn_if_overflow(int op_result);
1638 virtual void init(TABLE *table_arg);
1639
1640 /* maximum possible display length */
1641 virtual uint32 max_display_length() const = 0;
1642
1643 /**
1644 Whether a field being created is type-compatible with an existing one.
1645
1646 Used by the ALTER TABLE code to evaluate whether the new definition
1647 of a table is compatible with the old definition so that it can
1648 determine if data needs to be copied over (table data change).
1649 Constraints and generation clause (default value, generation expression)
1650 are not checked by this function.
1651
1652 @param new_field new field definition from alter.
1653 @retval IS_EQUAL_YES if there is no change.
1654 @retval IS_EQUAL_PACK_LENGTH if the data are unchanged, but the length
1655 requirements have changed
1656 @retval IS_EQUAL_NO if there is an incompatible change requiring copy.
1657 */
1658
1659 virtual uint is_equal(const Create_field *new_field) const;
1660
1661 /* convert decimal to longlong with overflow check */
1662 longlong convert_decimal2longlong(const my_decimal *val, bool unsigned_flag,
1663 bool *has_overflow);
1664 /* The max. number of characters */
1665 virtual uint32 char_length() const {
1666 return field_length / charset()->mbmaxlen;
1667 }
1668
1670 /* shouldn't get here. */
1671 assert(0);
1672 return GEOM_GEOMETRY;
1673 }
1674#ifndef NDEBUG
1675 /* Print field value into debug trace, in NULL-aware way. */
1676 void dbug_print() const {
1677 if (is_real_null())
1678 fprintf(DBUG_FILE, "NULL");
1679 else {
1680 char buf[256];
1681 String str(buf, sizeof(buf), &my_charset_bin);
1682 str.length(0);
1683 String *pstr;
1684 pstr = val_str(&str);
1685 fprintf(DBUG_FILE, "'%s'", pstr->c_ptr_safe());
1686 }
1687 }
1688#endif
1689
1692 }
1693
1694 void set_storage_type(ha_storage_media storage_type_arg) {
1695 assert(field_storage_type() == HA_SM_DEFAULT);
1696 flags |= (storage_type_arg << FIELD_FLAGS_STORAGE_MEDIA);
1697 }
1698
1701 }
1702
1703 void set_column_format(column_format_type column_format_arg) {
1705 flags |= (column_format_arg << FIELD_FLAGS_COLUMN_FORMAT);
1706 }
1707
1708 /* Validate the value stored in a field */
1710 [[maybe_unused]]) {
1711 return TYPE_OK;
1712 }
1713
1714 /* Hash value */
1715 virtual void hash(ulong *nr, ulong *nr2) const;
1716
1717 /**
1718 Get the upper limit of the MySQL integral and floating-point type.
1719
1720 @return maximum allowed value for the field
1721 */
1723 assert(false);
1724 return 0ULL;
1725 }
1726
1727 /**
1728 Return a const pointer to the actual data in the record buffer.
1729
1730 For most fields, this is the same as field_ptr(), but BLOBs and VARCHARs
1731 it is not. Ideally this function should not be used as it makes it hard
1732 to change the internal representation of Field.
1733 */
1734 virtual const uchar *data_ptr() const { return ptr; }
1735
1736 /**
1737 Return a const pointer to where the field is stored in the record buffer.
1738
1739 Ideally this function should not be used as it makes it hard
1740 to change the internal representation of Field.
1741 */
1742 const uchar *field_ptr() const { return ptr; }
1743
1744 /**
1745 Return a pointer to where the field is stored in the record buffer.
1746
1747 Ideally this function should not be used as it makes it hard
1748 to change the internal representation of Field.
1749 */
1750 uchar *field_ptr() { return ptr; }
1751
1752 void set_field_ptr(uchar *ptr_arg) { ptr = ptr_arg; }
1753
1754 /**
1755 Checks whether a string field is part of write_set.
1756
1757 @return
1758 false - If field is not char/varchar/....
1759 - If field is char/varchar/.. and is not part of write set.
1760 true - If field is char/varchar/.. and is part of write set.
1761 */
1762 virtual bool is_updatable() const { return false; }
1763
1764 /**
1765 Check whether field is part of the index taking the index extensions flag
1766 into account. Index extensions are also not applicable to UNIQUE indexes
1767 for loose index scans.
1768
1769 @param[in] thd THD object
1770 @param[in] cur_index Index of the key
1771 @param[in] cur_index_info key_info object
1772
1773 @retval true Field is part of the key
1774 @retval false otherwise
1775
1776 */
1777
1778 bool is_part_of_actual_key(THD *thd, uint cur_index,
1779 KEY *cur_index_info) const;
1780
1781 /**
1782 Get covering prefix keys.
1783
1784 @retval covering prefix keys.
1785 */
1787
1788 /// Whether the field is a typed array
1789 virtual bool is_array() const { return false; }
1790
1791 /**
1792 Return number of bytes the field's length takes
1793
1794 Valid only for varchar and typed arrays of varchar
1795 */
1796 virtual uint32 get_length_bytes() const {
1797 assert(0);
1798 return 0;
1799 }
1800
1801 /**
1802 Whether field's old valued have to be handled.
1803
1804 @returns
1805 true if field is virtual an either one of BLOB types or typed array
1806 false otherwise
1807 */
1808 bool handle_old_value() const {
1809 return (is_flag_set(BLOB_FLAG) || is_array()) && is_virtual_gcol();
1810 }
1811
1812 /**
1813 Sets field index.
1814
1815 @param[in] field_index Field index.
1816 */
1819 }
1820
1821 /**
1822 Returns field index.
1823
1824 @returns Field index.
1825 */
1827
1828 private:
1829 /**
1830 Retrieve the field metadata for fields.
1831
1832 This default implementation returns 0 and saves 0 in the metadata_ptr
1833 value.
1834
1835 @param metadata_ptr First byte of field metadata
1836
1837 @returns 0 no bytes written.
1838 */
1839 virtual int do_save_field_metadata(uchar *metadata_ptr
1840 [[maybe_unused]]) const {
1841 return 0;
1842 }
1843
1844 protected:
1845 uchar *pack_int16(uchar *to, const uchar *from, size_t max_length) const;
1846
1847 const uchar *unpack_int16(uchar *to, const uchar *from) const;
1848
1849 uchar *pack_int24(uchar *to, const uchar *from, size_t max_length) const;
1850
1851 const uchar *unpack_int24(uchar *to, const uchar *from) const;
1852
1853 uchar *pack_int32(uchar *to, const uchar *from, size_t max_length) const;
1854
1855 const uchar *unpack_int32(uchar *to, const uchar *from) const;
1856
1857 uchar *pack_int64(uchar *to, const uchar *from, size_t max_length) const;
1858
1859 const uchar *unpack_int64(uchar *to, const uchar *from) const;
1860};
1861
1862/**
1863 This class is a substitute for the Field classes during CREATE TABLE
1864
1865 When adding a functional index at table creation, we need to resolve the
1866 expression we are indexing. All functions that references one or more
1867 columns expect a Field to be available. But during CREATE TABLE, we only
1868 have access to Create_field. So this class acts as a substitute for the
1869 Field classes so that expressions can be properly resolved. Thus, trying
1870 to call store or val_* on this class will cause an assertion.
1871*/
1872class Create_field_wrapper final : public Field {
1874
1875 public:
1877 Item_result result_type() const final;
1879 enum_field_types type() const final;
1880 uint32 max_display_length() const final;
1881
1882 const CHARSET_INFO *charset() const final;
1883
1884 uint32 pack_length() const final;
1885
1886 // Since it's not a real field, functions below shouldn't be used.
1887 /* purecov: begin deadcode */
1888 type_conversion_status store(const char *, size_t,
1889 const CHARSET_INFO *) final {
1890 assert(false);
1891 return TYPE_ERR_BAD_VALUE;
1892 }
1894 assert(false);
1895 return TYPE_ERR_BAD_VALUE;
1896 }
1898 assert(false);
1899 return TYPE_ERR_BAD_VALUE;
1900 }
1902 assert(false);
1903 return TYPE_ERR_BAD_VALUE;
1904 }
1905 double val_real(void) const final {
1906 assert(false);
1907 return 0.0;
1908 }
1909 longlong val_int(void) const final {
1910 assert(false);
1911 return 0;
1912 }
1914 assert(false);
1915 return nullptr;
1916 }
1917 String *val_str(String *, String *) const final {
1918 assert(false);
1919 return nullptr;
1920 }
1921 int cmp(const uchar *, const uchar *) const final {
1922 assert(false);
1923 return -1;
1924 }
1925 void sql_type(String &) const final { assert(false); }
1927 size_t make_sort_key(uchar *, size_t) const final {
1928 assert(false);
1929 return 0;
1930 }
1931 Field *clone(MEM_ROOT *mem_root) const final {
1932 return new (mem_root) Create_field_wrapper(*this);
1933 }
1934 /* purecov: end */
1935};
1936
1937class Field_num : public Field {
1938 private:
1939 /**
1940 Whether the field is signed or not. Meaningful only for numeric fields
1941 and numeric arrays.
1942 */
1943 const bool unsigned_flag;
1944
1945 public:
1946 const uint8 dec;
1947 /**
1948 True if the column was declared with the ZEROFILL attribute. If it has the
1949 attribute, values should be zero-padded up to the declared display width
1950 when they are converted to strings.
1951 */
1952 bool zerofill; // Purify cannot handle bit fields
1953 Field_num(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
1954 uchar null_bit_arg, uchar auto_flags_arg,
1955 const char *field_name_arg, uint8 dec_arg, bool zero_arg,
1956 bool unsigned_arg);
1957 bool is_unsigned() const final { return unsigned_flag; }
1958 Item_result result_type() const override { return REAL_RESULT; }
1959 enum Derivation derivation() const final { return DERIVATION_NUMERIC; }
1960 uint repertoire() const final { return MY_REPERTOIRE_NUMERIC; }
1961 const CHARSET_INFO *charset() const final { return &my_charset_numeric; }
1962 void prepend_zeros(String *value) const;
1963 uint decimals() const final { return (uint)dec; }
1964 bool eq_def(const Field *field) const final;
1967 my_decimal *val_decimal(my_decimal *) const override;
1968 bool get_date(MYSQL_TIME *ltime, my_time_flags_t fuzzydate) const override;
1969 bool get_time(MYSQL_TIME *ltime) const override;
1970 uint is_equal(const Create_field *new_field) const override;
1971 uint row_pack_length() const final { return pack_length(); }
1973 return pack_length();
1974 }
1976 size_t length, const char *int_end,
1977 int error);
1978 type_conversion_status get_int(const CHARSET_INFO *cs, const char *from,
1979 size_t len, longlong *rnd,
1980 ulonglong unsigned_max, longlong signed_min,
1981 longlong signed_max);
1982};
1983
1984class Field_str : public Field {
1985 protected:
1988
1989 public:
1990 Field_str(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
1991 uchar null_bit_arg, uchar auto_flags_arg,
1992 const char *field_name_arg, const CHARSET_INFO *charset);
1993 Item_result result_type() const override { return STRING_RESULT; }
1995 uint decimals() const override { return DECIMAL_NOT_SPECIFIED; }
1996 void make_send_field(Send_field *field) const override;
1997 type_conversion_status store(double nr) override;
1998 type_conversion_status store(longlong nr, bool unsigned_val) override = 0;
2000 type_conversion_status store(const char *to, size_t length,
2001 const CHARSET_INFO *cs) override = 0;
2002
2004 const CHARSET_INFO *charset() const override { return field_charset; }
2005 void set_charset(const CHARSET_INFO *charset_arg) {
2006 field_charset = charset_arg;
2008 }
2012 }
2013 enum Derivation derivation() const final { return field_derivation; }
2014 void set_derivation(enum Derivation derivation_arg) final {
2015 field_derivation = derivation_arg;
2016 }
2017 bool binary() const override { return field_charset == &my_charset_bin; }
2018 uint32 max_display_length() const override { return field_length; }
2019 bool str_needs_quotes() const final { return true; }
2020 uint is_equal(const Create_field *new_field) const override;
2021
2022 // An always-updated cache of the result of char_length(), because
2023 // dividing by charset()->mbmaxlen can be surprisingly costly compared
2024 // to the rest of e.g. make_sort_key().
2026};
2027
2028/* base class for Field_string, Field_varstring and Field_blob */
2029
2030class Field_longstr : public Field_str {
2031 private:
2033 const char *end,
2034 bool count_spaces);
2035
2036 protected:
2038 const char *well_formed_error_pos, const char *cannot_convert_error_pos,
2039 const char *from_end_pos, const char *end, bool count_spaces,
2040 const CHARSET_INFO *cs);
2041
2042 public:
2043 Field_longstr(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
2044 uchar null_bit_arg, uchar auto_flags_arg,
2045 const char *field_name_arg, const CHARSET_INFO *charset_arg)
2046 : Field_str(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2047 field_name_arg, charset_arg) {}
2048
2050 uint32 max_data_length() const override;
2051 bool is_updatable() const final;
2052};
2053
2054/* base class for float and double and decimal (old one) */
2055class Field_real : public Field_num {
2056 public:
2059 TR_OK = 0,
2060 TR_POSITIVE_OVERFLOW = 1,
2061 TR_NEGATIVE_OVERFLOW = 2
2063
2064 Field_real(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
2065 uchar null_bit_arg, uchar auto_flags_arg,
2066 const char *field_name_arg, uint8 dec_arg, bool zero_arg,
2067 bool unsigned_arg)
2068 : Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2069 field_name_arg, dec_arg, zero_arg, unsigned_arg),
2070 not_fixed(dec_arg >= DECIMAL_NOT_SPECIFIED) {}
2073 my_decimal *val_decimal(my_decimal *) const final;
2074 bool get_date(MYSQL_TIME *ltime, my_time_flags_t fuzzydate) const final;
2075 bool get_time(MYSQL_TIME *ltime) const final;
2076 Truncate_result truncate(double *nr, double max_length);
2077 uint32 max_display_length() const final { return field_length; }
2078 const uchar *unpack(uchar *to, const uchar *from, uint param_data) override;
2079 uchar *pack(uchar *to, const uchar *from, size_t max_length) const override;
2080};
2081
2082class Field_decimal final : public Field_real {
2083 public:
2084 Field_decimal(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
2085 uchar null_bit_arg, uchar auto_flags_arg,
2086 const char *field_name_arg, uint8 dec_arg, bool zero_arg,
2087 bool unsigned_arg)
2088 : Field_real(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2089 field_name_arg, dec_arg, zero_arg, unsigned_arg) {}
2090 enum_field_types type() const final { return MYSQL_TYPE_DECIMAL; }
2091 enum ha_base_keytype key_type() const final {
2093 }
2094 type_conversion_status store(const char *to, size_t length,
2095 const CHARSET_INFO *charset) final;
2096 type_conversion_status store(double nr) final;
2097 type_conversion_status store(longlong nr, bool unsigned_val) final;
2098 double val_real() const final;
2099 longlong val_int() const final;
2100 String *val_str(String *, String *) const final;
2101 int cmp(const uchar *, const uchar *) const final;
2103 size_t make_sort_key(uchar *buff, size_t length) const final;
2104 void overflow(bool negative);
2105 bool zero_pack() const final { return false; }
2106 void sql_type(String &str) const final;
2108 assert(type() == MYSQL_TYPE_DECIMAL);
2109 return new (mem_root) Field_decimal(*this);
2110 }
2111 const uchar *unpack(uchar *to, const uchar *from, uint param_data) final {
2112 return Field::unpack(to, from, param_data);
2113 }
2114 uchar *pack(uchar *to, const uchar *from, size_t max_length) const final {
2115 return Field::pack(to, from, max_length);
2116 }
2117};
2118
2119/* New decimal/numeric field which use fixed point arithmetic */
2121 private:
2122 /**
2123 Normally, the underlying decimal code will degrade values' excessive
2124 precision. E.g. value 0.0 stored as decimal(10,4) will be returned as
2125 decimal(4,4). This is fine for general purpose, but isn't usable for
2126 multi-valued index. Field_typed_array uses a field for conversion and it
2127 expects the value read from it to be exactly same as it would be stored
2128 in SE, i.e with preserved precision. Otherwise, SE won't be able to
2129 index it.
2130 TRUE here tells underlying DECIMAL reading code to keep the precision as
2131 is.
2132 */
2133 bool m_keep_precision{false};
2134 int do_save_field_metadata(uchar *first_byte) const final;
2135
2136 public:
2137 /* The maximum number of decimal digits can be stored */
2140 /*
2141 Constructors take max_length of the field as a parameter - not the
2142 precision as the number of decimal digits allowed.
2143 So for example we need to count length from precision handling
2144 CREATE TABLE ( DECIMAL(x,y))
2145 */
2146 Field_new_decimal(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
2147 uchar null_bit_arg, uchar auto_flags_arg,
2148 const char *field_name_arg, uint8 dec_arg, bool zero_arg,
2149 bool unsigned_arg);
2150 Field_new_decimal(uint32 len_arg, bool is_nullable_arg,
2151 const char *field_name_arg, uint8 dec_arg,
2152 bool unsigned_arg);
2154 enum ha_base_keytype key_type() const final { return HA_KEYTYPE_BINARY; }
2155 Item_result result_type() const final { return DECIMAL_RESULT; }
2157 type_conversion_status store_value(const my_decimal *decimal_value);
2158 void set_value_on_overflow(my_decimal *decimal_value, bool sign) const;
2159 type_conversion_status store(const char *to, size_t length,
2160 const CHARSET_INFO *charset) final;
2161 type_conversion_status store(double nr) final;
2162 type_conversion_status store(longlong nr, bool unsigned_val) final;
2165 double val_real() const final;
2166 longlong val_int() const final;
2167 my_decimal *val_decimal(my_decimal *) const final;
2168 bool get_date(MYSQL_TIME *ltime, my_time_flags_t fuzzydate) const final;
2169 bool get_time(MYSQL_TIME *ltime) const final;
2170 String *val_str(String *, String *) const final;
2171 int cmp(const uchar *, const uchar *) const final;
2172 using Field_num::make_sort_key;
2173 size_t make_sort_key(uchar *buff, size_t length) const final;
2174 bool zero_pack() const final { return false; }
2175 void sql_type(String &str) const final;
2176 uint32 max_display_length() const final { return field_length; }
2177 uint32 pack_length() const final { return (uint32)bin_size; }
2178 uint pack_length_from_metadata(uint field_metadata) const final;
2179 bool compatible_field_size(uint field_metadata, Relay_log_info *, uint16,
2180 int *order_var) const final;
2181 uint is_equal(const Create_field *new_field) const final;
2183 assert(type() == MYSQL_TYPE_NEWDECIMAL);
2184 return new (mem_root) Field_new_decimal(*this);
2185 }
2186 const uchar *unpack(uchar *to, const uchar *from, uint param_data) final;
2187 static Field *create_from_item(const Item *item);
2188 bool send_to_protocol(Protocol *protocol) const final;
2189 void set_keep_precision(bool arg) { m_keep_precision = arg; }
2190};
2191
2192class Field_tiny : public Field_num {
2193 public:
2194 Field_tiny(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
2195 uchar null_bit_arg, uchar auto_flags_arg,
2196 const char *field_name_arg, bool zero_arg, bool unsigned_arg)
2197 : Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2198 field_name_arg, 0, zero_arg, unsigned_arg) {}
2199 Field_tiny(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg,
2200 bool unsigned_arg)
2201 : Field_num(nullptr, len_arg,
2202 is_nullable_arg ? &dummy_null_buffer : nullptr, 0, NONE,
2203 field_name_arg, 0, false, unsigned_arg) {}
2204 enum Item_result result_type() const final { return INT_RESULT; }
2205 enum_field_types type() const override { return MYSQL_TYPE_TINY; }
2206 enum ha_base_keytype key_type() const final {
2208 }
2209 type_conversion_status store(const char *to, size_t length,
2210 const CHARSET_INFO *charset) override;
2211 type_conversion_status store(double nr) override;
2212 type_conversion_status store(longlong nr, bool unsigned_val) override;
2213 double val_real() const override;
2214 longlong val_int() const override;
2215 String *val_str(String *, String *) const override;
2216 bool send_to_protocol(Protocol *protocol) const override;
2217 int cmp(const uchar *, const uchar *) const final;
2219 size_t make_sort_key(uchar *buff, size_t length) const final;
2220 uint32 pack_length() const final { return 1; }
2221 void sql_type(String &str) const override;
2222 uint32 max_display_length() const final { return 4; }
2223 Field_tiny *clone(MEM_ROOT *mem_root) const override {
2224 assert(type() == MYSQL_TYPE_TINY);
2225 return new (mem_root) Field_tiny(*this);
2226 }
2227 uchar *pack(uchar *to, const uchar *from, size_t max_length) const final {
2228 if (max_length > 0) *to = *from;
2229 return to + 1;
2230 }
2231
2232 const uchar *unpack(uchar *to, const uchar *from,
2233 uint param_data [[maybe_unused]]) final {
2234 *to = *from;
2235 return from + 1;
2236 }
2237
2239 return is_unsigned() ? 0xFFULL : 0x7FULL;
2240 }
2241};
2242
2243class Field_short final : public Field_num {
2244 public:
2245 Field_short(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
2246 uchar null_bit_arg, uchar auto_flags_arg,
2247 const char *field_name_arg, bool zero_arg, bool unsigned_arg)
2248 : Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2249 field_name_arg, 0, zero_arg, unsigned_arg) {}
2250 Field_short(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg,
2251 bool unsigned_arg)
2252 : Field_num(nullptr, len_arg,
2253 is_nullable_arg ? &dummy_null_buffer : nullptr, 0, NONE,
2254 field_name_arg, 0, false, unsigned_arg) {}
2255 Field_short(uint32 len_arg, const char *field_name_arg, bool unsigned_arg)
2256 : Field_short(len_arg, false, field_name_arg, unsigned_arg) {}
2257 enum Item_result result_type() const final { return INT_RESULT; }
2258 enum_field_types type() const final { return MYSQL_TYPE_SHORT; }
2259 enum ha_base_keytype key_type() const final {
2261 }
2262 type_conversion_status store(const char *to, size_t length,
2263 const CHARSET_INFO *charset) final;
2264 type_conversion_status store(double nr) final;
2265 type_conversion_status store(longlong nr, bool unsigned_val) final;
2266 double val_real() const final;
2267 longlong val_int() const final;
2268 String *val_str(String *, String *) const final;
2269 bool send_to_protocol(Protocol *protocol) const final;
2270 int cmp(const uchar *, const uchar *) const final;
2271 using Field_num::make_sort_key;
2272 size_t make_sort_key(uchar *buff, size_t length) const final;
2273 uint32 pack_length() const final { return 2; }
2274 void sql_type(String &str) const final;
2275 uint32 max_display_length() const final { return 6; }
2277 assert(type() == MYSQL_TYPE_SHORT);
2278 return new (mem_root) Field_short(*this);
2279 }
2280 uchar *pack(uchar *to, const uchar *from, size_t max_length) const final {
2281 return pack_int16(to, from, max_length);
2282 }
2283
2284 const uchar *unpack(uchar *to, const uchar *from,
2285 uint param_data [[maybe_unused]]) final {
2286 return unpack_int16(to, from);
2287 }
2288
2290 return is_unsigned() ? 0xFFFFULL : 0x7FFFULL;
2291 }
2292};
2293
2294class Field_medium final : public Field_num {
2295 public:
2296 Field_medium(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
2297 uchar null_bit_arg, uchar auto_flags_arg,
2298 const char *field_name_arg, bool zero_arg, bool unsigned_arg)
2299 : Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2300 field_name_arg, 0, zero_arg, unsigned_arg) {}
2301 Field_medium(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg,
2302 bool unsigned_arg)
2303 : Field_num(nullptr, len_arg,
2304 is_nullable_arg ? &dummy_null_buffer : nullptr, 0, NONE,
2305 field_name_arg, 0, false, unsigned_arg) {}
2306 enum Item_result result_type() const final { return INT_RESULT; }
2307 enum_field_types type() const final { return MYSQL_TYPE_INT24; }
2308 enum ha_base_keytype key_type() const final {
2310 }
2311 type_conversion_status store(const char *to, size_t length,
2312 const CHARSET_INFO *charset) final;
2313 type_conversion_status store(double nr) final;
2314 type_conversion_status store(longlong nr, bool unsigned_val) final;
2315 double val_real() const final;
2316 longlong val_int() const final;
2317 String *val_str(String *, String *) const final;
2318 bool send_to_protocol(Protocol *protocol) const final;
2319 int cmp(const uchar *, const uchar *) const final;
2320 using Field_num::make_sort_key;
2321 size_t make_sort_key(uchar *buff, size_t length) const final;
2322 uint32 pack_length() const final { return 3; }
2323 void sql_type(String &str) const final;
2324 uint32 max_display_length() const final { return 8; }
2326 assert(type() == MYSQL_TYPE_INT24);
2327 return new (mem_root) Field_medium(*this);
2328 }
2330 return is_unsigned() ? 0xFFFFFFULL : 0x7FFFFFULL;
2331 }
2332};
2333
2334class Field_long : public Field_num {
2335 public:
2336 static const int PACK_LENGTH = 4;
2337
2338 Field_long(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
2339 uchar null_bit_arg, uchar auto_flags_arg,
2340 const char *field_name_arg, bool zero_arg, bool unsigned_arg)
2341 : Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2342 field_name_arg, 0, zero_arg, unsigned_arg) {}
2343 Field_long(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg,
2344 bool unsigned_arg)
2345 : Field_num(nullptr, len_arg,
2346 is_nullable_arg ? &dummy_null_buffer : nullptr, 0, NONE,
2347 field_name_arg, 0, false, unsigned_arg) {}
2348 enum Item_result result_type() const final { return INT_RESULT; }
2349 enum_field_types type() const final { return MYSQL_TYPE_LONG; }
2350 enum ha_base_keytype key_type() const final {
2352 }
2353 type_conversion_status store(const char *to, size_t length,
2354 const CHARSET_INFO *charset) final;
2355 type_conversion_status store(double nr) final;
2356 type_conversion_status store(longlong nr, bool unsigned_val) override;
2357 double val_real() const final;
2358 longlong val_int() const final;
2359 bool send_to_protocol(Protocol *protocol) const final;
2360 String *val_str(String *, String *) const final;
2361 int cmp(const uchar *, const uchar *) const final;
2362 using Field_num::make_sort_key;
2363 size_t make_sort_key(uchar *buff, size_t length) const final;
2364 uint32 pack_length() const final { return PACK_LENGTH; }
2365 void sql_type(String &str) const final;
2368 }
2370 assert(type() == MYSQL_TYPE_LONG);
2371 return new (mem_root) Field_long(*this);
2372 }
2373 uchar *pack(uchar *to, const uchar *from, size_t max_length) const final {
2374 return pack_int32(to, from, max_length);
2375 }
2376 const uchar *unpack(uchar *to, const uchar *from,
2377 uint param_data [[maybe_unused]]) final {
2378 return unpack_int32(to, from);
2379 }
2380
2382 return is_unsigned() ? 0xFFFFFFFFULL : 0x7FFFFFFFULL;
2383 }
2384};
2385
2387 public:
2388 static const int PACK_LENGTH = 8;
2389
2390 Field_longlong(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
2391 uchar null_bit_arg, uchar auto_flags_arg,
2392 const char *field_name_arg, bool zero_arg, bool unsigned_arg)
2393 : Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2394 field_name_arg, 0, zero_arg, unsigned_arg) {}
2395 Field_longlong(uint32 len_arg, bool is_nullable_arg,
2396 const char *field_name_arg, bool unsigned_arg)
2397 : Field_num(nullptr, len_arg,
2398 is_nullable_arg ? &dummy_null_buffer : nullptr, 0, NONE,
2399 field_name_arg, 0, false, unsigned_arg) {}
2400 enum Item_result result_type() const final { return INT_RESULT; }
2402 enum ha_base_keytype key_type() const final {
2404 }
2405 type_conversion_status store(const char *to, size_t length,
2406 const CHARSET_INFO *charset) final;
2407 type_conversion_status store(double nr) final;
2408 type_conversion_status store(longlong nr, bool unsigned_val) override;
2409 double val_real() const final;
2410 longlong val_int() const override;
2411 String *val_str(String *, String *) const final;
2412 bool send_to_protocol(Protocol *protocol) const final;
2413 int cmp(const uchar *, const uchar *) const final;
2414 using Field_num::make_sort_key;
2415 size_t make_sort_key(uchar *buff, size_t length) const final;
2416 uint32 pack_length() const final { return PACK_LENGTH; }
2417 void sql_type(String &str) const final;
2418 bool can_be_compared_as_longlong() const final { return true; }
2419 uint32 max_display_length() const final { return 20; }
2421 assert(type() == MYSQL_TYPE_LONGLONG);
2422 return new (mem_root) Field_longlong(*this);
2423 }
2424 uchar *pack(uchar *to, const uchar *from, size_t max_length) const final {
2425 return pack_int64(to, from, max_length);
2426 }
2427 const uchar *unpack(uchar *to, const uchar *from,
2428 uint param_data [[maybe_unused]]) final {
2429 return unpack_int64(to, from);
2430 }
2431
2433 return is_unsigned() ? 0xFFFFFFFFFFFFFFFFULL : 0x7FFFFFFFFFFFFFFFULL;
2434 }
2435};
2436
2437class Field_float final : public Field_real {
2438 public:
2439 Field_float(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
2440 uchar null_bit_arg, uchar auto_flags_arg,
2441 const char *field_name_arg, uint8 dec_arg, bool zero_arg,
2442 bool unsigned_arg)
2443 : Field_real(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2444 field_name_arg, dec_arg, zero_arg, unsigned_arg) {}
2445 Field_float(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg,
2446 uint8 dec_arg, bool unsigned_arg)
2447 : Field_real(nullptr, len_arg,
2448 is_nullable_arg ? &dummy_null_buffer : nullptr, 0, NONE,
2449 field_name_arg, dec_arg, false, unsigned_arg) {}
2450 enum_field_types type() const final { return MYSQL_TYPE_FLOAT; }
2451 enum ha_base_keytype key_type() const final { return HA_KEYTYPE_FLOAT; }
2452 type_conversion_status store(const char *to, size_t length,
2453 const CHARSET_INFO *charset) final;
2454 type_conversion_status store(double nr) final;
2455 type_conversion_status store(longlong nr, bool unsigned_val) final;
2456 double val_real() const final;
2457 longlong val_int() const final;
2458 String *val_str(String *, String *) const final;
2459 bool send_to_protocol(Protocol *protocol) const final;
2460 int cmp(const uchar *, const uchar *) const final;
2462 size_t make_sort_key(uchar *buff, size_t length) const final;
2463 uint32 pack_length() const final { return sizeof(float); }
2464 void sql_type(String &str) const final;
2466 assert(type() == MYSQL_TYPE_FLOAT);
2467 return new (mem_root) Field_float(*this);
2468 }
2469
2471 /*
2472 We use the maximum as per IEEE754-2008 standard, 2^24
2473 */
2474 return 0x1000000ULL;
2475 }
2476
2477 private:
2478 int do_save_field_metadata(uchar *first_byte) const final;
2479};
2480
2481class Field_double final : public Field_real {
2482 public:
2483 Field_double(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
2484 uchar null_bit_arg, uchar auto_flags_arg,
2485 const char *field_name_arg, uint8 dec_arg, bool zero_arg,
2486 bool unsigned_arg)
2487 : Field_real(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2488 field_name_arg, dec_arg, zero_arg, unsigned_arg) {}
2489 Field_double(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg,
2490 uint8 dec_arg)
2491 : Field_real(nullptr, len_arg,
2492 is_nullable_arg ? &dummy_null_buffer : nullptr, 0, NONE,
2493 field_name_arg, dec_arg, false, false) {}
2494 Field_double(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg,
2495 uint8 dec_arg, bool unsigned_arg)
2496 : Field_real(nullptr, len_arg,
2497 is_nullable_arg ? &dummy_null_buffer : nullptr, 0, NONE,
2498 field_name_arg, dec_arg, false, unsigned_arg) {}
2499 Field_double(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg,
2500 uint8 dec_arg, bool unsigned_arg, bool not_fixed_arg)
2501 : Field_real(nullptr, len_arg,
2502 is_nullable_arg ? &dummy_null_buffer : nullptr, 0, NONE,
2503 field_name_arg, dec_arg, false, unsigned_arg) {
2504 not_fixed = not_fixed_arg;
2505 }
2506 enum_field_types type() const final { return MYSQL_TYPE_DOUBLE; }
2507 enum ha_base_keytype key_type() const final { return HA_KEYTYPE_DOUBLE; }
2508 type_conversion_status store(const char *to, size_t length,
2509 const CHARSET_INFO *charset) final;
2510 type_conversion_status store(double nr) final;
2511 type_conversion_status store(longlong nr, bool unsigned_val) final;
2512 double val_real() const final;
2513 longlong val_int() const final;
2514 String *val_str(String *, String *) const final;
2515 bool send_to_protocol(Protocol *protocol) const final;
2516 int cmp(const uchar *, const uchar *) const final;
2518 size_t make_sort_key(uchar *buff, size_t length) const final;
2519 uint32 pack_length() const final { return sizeof(double); }
2520 void sql_type(String &str) const final;
2522 assert(type() == MYSQL_TYPE_DOUBLE);
2523 return new (mem_root) Field_double(*this);
2524 }
2525
2527 /*
2528 We use the maximum as per IEEE754-2008 standard, 2^53
2529 */
2530 return 0x20000000000000ULL;
2531 }
2532
2533 private:
2534 int do_save_field_metadata(uchar *first_byte) const final;
2535};
2536
2537/* Everything saved in this will disappear. It will always return NULL */
2538
2539class Field_null final : public Field_str {
2540 public:
2541 Field_null(uchar *ptr_arg, uint32 len_arg, uchar auto_flags_arg,
2542 const char *field_name_arg, const CHARSET_INFO *cs)
2543 // (dummy_null_buffer & 32) is true, so is_null() always returns true.
2544 : Field_str(ptr_arg, len_arg, &dummy_null_buffer, 32, auto_flags_arg,
2545 field_name_arg, cs) {}
2546 enum_field_types type() const final { return MYSQL_TYPE_NULL; }
2547 type_conversion_status store(const char *, size_t,
2548 const CHARSET_INFO *) final {
2549 return TYPE_OK;
2550 }
2551 type_conversion_status store(double) final { return TYPE_OK; }
2554 return TYPE_OK;
2555 }
2557 double val_real() const final { return 0.0; }
2558 longlong val_int() const final { return 0; }
2559 my_decimal *val_decimal(my_decimal *) const final { return nullptr; }
2560 String *val_str(String *, String *value2) const final {
2561 value2->length(0);
2562 return value2;
2563 }
2564 int cmp(const uchar *, const uchar *) const final { return 0; }
2566 size_t make_sort_key(uchar *, size_t len) const final { return len; }
2567 uint32 pack_length() const final { return 0; }
2568 void sql_type(String &str) const final;
2569 uint32 max_display_length() const final { return 4; }
2571 assert(type() == MYSQL_TYPE_NULL);
2572 return new (mem_root) Field_null(*this);
2573 }
2574};
2575
2576/*
2577 Abstract class for TIME, DATE, DATETIME, TIMESTAMP
2578 with and without fractional part.
2579*/
2580class Field_temporal : public Field {
2581 protected:
2582 uint8 dec; // Number of fractional digits
2583
2584 /**
2585 Adjust number of decimal digits from DECIMAL_NOT_SPECIFIED to
2586 DATETIME_MAX_DECIMALS
2587 */
2588 static uint8 normalize_dec(uint8 dec_arg) {
2589 return dec_arg == DECIMAL_NOT_SPECIFIED ? DATETIME_MAX_DECIMALS : dec_arg;
2590 }
2591
2592 /**
2593 Low level routine to store a MYSQL_TIME value into a field.
2594 The value must be already properly rounded or truncated
2595 and checked for being a valid TIME/DATE/DATETIME value.
2596
2597 @param[in] ltime MYSQL_TIME value.
2598 @param[out] error Error flag vector, set in case of error.
2599 @retval false In case of success.
2600 @retval true In case of error.
2601 */
2603 int *error) = 0;
2604
2605 /**
2606 Low level routine to store a MYSQL_TIME value into a field
2607 with rounding/truncation according to the field decimals() value and
2608 sql_mode.
2609
2610 @param[in] ltime MYSQL_TIME value.
2611 @param[out] warnings Error flag vector, set in case of error.
2612 @retval false In case of success.
2613 @retval true In case of error.
2614 */
2616 int *warnings) = 0;
2617
2618 /**
2619 Store a temporal value in lldiv_t into a field,
2620 with rounding according to the field decimals() value.
2621
2622 @param[in] lld Temporal value.
2623 @param[out] warning Warning flag vector.
2624 @retval false In case of success.
2625 @retval true In case of error.
2626 */
2627 type_conversion_status store_lldiv_t(const lldiv_t *lld, int *warning);
2628
2629 /**
2630 Convert a string to MYSQL_TIME, according to the field type.
2631
2632 @param[in] str String
2633 @param[in] len String length
2634 @param[in] cs String character set
2635 @param[out] ltime The value is stored here
2636 @param[out] status Conversion status
2637 @retval false Conversion went fine, ltime contains a valid time
2638 @retval true Conversion failed, ltime was reset and contains nothing
2639 */
2640 virtual bool convert_str_to_TIME(const char *str, size_t len,
2641 const CHARSET_INFO *cs, MYSQL_TIME *ltime,
2643 /**
2644 Convert a number with fractional part with nanosecond precision
2645 into MYSQL_TIME, according to the field type. Nanoseconds
2646 are rounded to milliseconds and added to ltime->second_part.
2647
2648 @param[in] nr Number
2649 @param[in] unsigned_val SIGNED/UNSIGNED flag
2650 @param[in] nanoseconds Fractional part in nanoseconds
2651 @param[out] ltime The value is stored here
2652 @param[in,out] warning Warnings found during execution
2653
2654 @return Conversion status
2655 @retval false On success
2656 @retval true On error
2657 */
2659 bool unsigned_val,
2660 int nanoseconds,
2661 MYSQL_TIME *ltime,
2662 int *warning) = 0;
2663
2664 /**
2665 Convert an integer number into MYSQL_TIME, according to the field type.
2666
2667 @param[in] nr Number
2668 @param[in] unsigned_val SIGNED/UNSIGNED flag
2669 @param[out] ltime The value is stored here
2670 @param[in,out] warnings Warnings found during execution
2671
2672 @retval false On success
2673 @retval true On error
2674 */
2675 longlong convert_number_to_datetime(longlong nr, bool unsigned_val,
2676 MYSQL_TIME *ltime, int *warnings);
2677
2678 /**
2679 Set warnings from a warning vector.
2680 Note, multiple warnings can be set at the same time.
2681 Every warning in the bit vector is set by an individual
2682 set_datetime_warning() call.
2683
2684 @param str Value.
2685 @param warnings Warning vector.
2686
2687 @retval false Function reported warning
2688 @retval true Function reported error
2689
2690 @note STRICT mode can convert warnings to error.
2691 */
2692 [[nodiscard]] bool set_warnings(const ErrConvString &str, int warnings);
2693
2694 /**
2695 Flags that are passed as "flag" argument to
2696 check_date(), number_to_datetime(), str_to_datetime().
2697
2698 Flags depend on the session sql_mode settings, such as
2699 MODE_NO_ZERO_DATE, MODE_NO_ZERO_IN_DATE.
2700 Also, Field_newdate, Field_datetime, Field_datetimef add TIME_FUZZY_DATE
2701 to the session sql_mode settings, to allow relaxed date format,
2702 while Field_timestamp, Field_timestampf do not.
2703
2704 @param thd THD
2705 @retval sql_mode flags mixed with the field type flags.
2706 */
2707 virtual my_time_flags_t date_flags(const THD *thd [[maybe_unused]]) const {
2708 return 0;
2709 }
2710
2711 /**
2712 Flags that are passed as "flag" argument to
2713 check_date(), number_to_datetime(), str_to_datetime().
2714 Similar to the above when we don't have a THD value.
2715 */
2716 my_time_flags_t date_flags() const;
2717
2718 /**
2719 Produce warning or note about double datetime data saved into field.
2720
2721 @param level level of message (Note/Warning/Error)
2722 @param code error code of message to be produced
2723 @param val error parameter (the value)
2724 @param ts_type type of datetime value (datetime/date/time)
2725 @param truncate_increment whether we should increase truncated fields count
2726
2727 @retval false Function reported warning
2728 @retval true Function reported error
2729
2730 @note
2731 This function will always produce some warning but won't increase
2732 truncated fields counter if check_for_truncated_fields == FIELD_CHECK_IGNORE
2733 for current thread.
2734 */
2735 [[nodiscard]] bool set_datetime_warning(
2737 const ErrConvString &val, enum_mysql_timestamp_type ts_type,
2738 int truncate_increment);
2739
2740 public:
2741 /**
2742 Constructor for Field_temporal
2743 @param ptr_arg See Field definition
2744 @param null_ptr_arg See Field definition
2745 @param null_bit_arg See Field definition
2746 @param auto_flags_arg See Field definition
2747 @param field_name_arg See Field definition
2748 @param len_arg Number of characters in the integer part.
2749 @param dec_arg Number of second fraction digits, 0..6.
2750 */
2751 Field_temporal(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
2752 uchar auto_flags_arg, const char *field_name_arg,
2753 uint32 len_arg, uint8 dec_arg)
2754 : Field(ptr_arg,
2755 len_arg +
2756 ((normalize_dec(dec_arg)) ? normalize_dec(dec_arg) + 1 : 0),
2757 null_ptr_arg, null_bit_arg, auto_flags_arg, field_name_arg) {
2759 dec = normalize_dec(dec_arg);
2760 }
2761 Item_result result_type() const final { return STRING_RESULT; }
2762 uint32 max_display_length() const final { return field_length; }
2763 bool str_needs_quotes() const final { return true; }
2764 uint is_equal(const Create_field *new_field) const final;
2766 return dec ? DECIMAL_RESULT : INT_RESULT;
2767 }
2768 enum Item_result cmp_type() const final { return INT_RESULT; }
2769 enum Derivation derivation() const final { return DERIVATION_NUMERIC; }
2770 uint repertoire() const final { return MY_REPERTOIRE_NUMERIC; }
2771 const CHARSET_INFO *charset() const final { return &my_charset_numeric; }
2772 bool can_be_compared_as_longlong() const final { return true; }
2773 bool binary() const final { return true; }
2774 type_conversion_status store(const char *str, size_t len,
2775 const CHARSET_INFO *cs) final;
2776 type_conversion_status store_decimal(const my_decimal *decimal) final;
2777 type_conversion_status store(longlong nr, bool unsigned_val) override;
2778 type_conversion_status store(double nr) final;
2779 double val_real() const override // FSP-enable types redefine it.
2780 {
2781 return (double)val_int();
2782 }
2783 [[nodiscard]] uint8 get_dec() const { return dec; }
2785 my_decimal *decimal_value) const override; // FSP types redefine it
2786};
2787
2788/**
2789 Abstract class for types with date
2790 with optional time, with or without fractional part:
2791 DATE, DATETIME, DATETIME(N), TIMESTAMP, TIMESTAMP(N).
2792*/
2794 protected:
2795 /**
2796 Low level function to get value into MYSQL_TIME,
2797 without checking for being valid.
2798 */
2799 virtual bool get_date_internal(MYSQL_TIME *ltime) const = 0;
2800
2801 virtual bool get_date_internal_at_utc(MYSQL_TIME *ltime) const {
2802 return get_date_internal(ltime);
2803 }
2804
2805 /**
2806 Get value into MYSQL_TIME and check TIME_NO_ZERO_DATE flag.
2807 @retval True on error: we get a zero value but flags disallow zero dates.
2808 @retval False on success.
2809 */
2810 bool get_internal_check_zero(MYSQL_TIME *ltime,
2811 my_time_flags_t fuzzydate) const;
2812
2813 type_conversion_status convert_number_to_TIME(longlong nr, bool unsigned_val,
2814 int nanoseconds,
2815 MYSQL_TIME *ltime,
2816 int *warning) final;
2817 bool convert_str_to_TIME(const char *str, size_t len, const CHARSET_INFO *cs,
2818 MYSQL_TIME *ltime, MYSQL_TIME_STATUS *status) final;
2819
2820 type_conversion_status store_internal_adjust_frac(MYSQL_TIME *ltime,
2821 int *warnings) final;
2823
2824 public:
2825 /**
2826 Constructor for Field_temporal
2827 @param ptr_arg See Field definition
2828 @param null_ptr_arg See Field definition
2829 @param null_bit_arg See Field definition
2830 @param auto_flags_arg See Field definition
2831 @param field_name_arg See Field definition
2832 @param int_length_arg Number of characters in the integer part.
2833 @param dec_arg Number of second fraction digits, 0..6.
2834 */
2835 Field_temporal_with_date(uchar *ptr_arg, uchar *null_ptr_arg,
2836 uchar null_bit_arg, uchar auto_flags_arg,
2837 const char *field_name_arg, uint8 int_length_arg,
2838 uint8 dec_arg)
2839 : Field_temporal(ptr_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
2840 field_name_arg, int_length_arg, dec_arg) {}
2841 bool send_to_protocol(Protocol *protocol) const override;
2843 String *val_str(String *, String *) const override;
2844 longlong val_time_temporal() const override;
2845 longlong val_date_temporal() const override;
2846 longlong val_time_temporal_at_utc() const override;
2847 longlong val_date_temporal_at_utc() const override;
2848 bool get_time(MYSQL_TIME *ltime) const final {
2849 return get_date(ltime, TIME_FUZZY_DATE);
2850 }
2851 /* Validate the value stored in a field */
2853};
2854
2855/**
2856 Abstract class for types with date and time,
2857 with or without fractional part:
2858 DATETIME, DATETIME(N), TIMESTAMP, TIMESTAMP(N).
2859*/
2861 private:
2862 int do_save_field_metadata(uchar *metadata_ptr) const override {
2863 if (decimals()) {
2864 *metadata_ptr = decimals();
2865 return 1;
2866 }
2867 return 0;
2868 }
2869
2870 protected:
2871 /**
2872 Initialize flags for TIMESTAMP DEFAULT CURRENT_TIMESTAMP / ON UPDATE
2873 CURRENT_TIMESTAMP columns.
2874
2875 @todo get rid of TIMESTAMP_FLAG and ON_UPDATE_NOW_FLAG.
2876 */
2877 void init_timestamp_flags();
2878 /**
2879 Store "struct timeval" value into field.
2880 The value must be properly rounded or truncated according
2881 to the number of fractional second digits.
2882 */
2883 virtual void store_timestamp_internal(const my_timeval *tm) = 0;
2884 bool convert_TIME_to_timestamp(const MYSQL_TIME *ltime, const Time_zone &tz,
2885 my_timeval *tm, int *error);
2886
2887 public:
2888 /**
2889 Constructor for Field_temporal_with_date_and_time
2890 @param ptr_arg See Field definition
2891 @param null_ptr_arg See Field definition
2892 @param null_bit_arg See Field definition
2893 @param auto_flags_arg See Field definition
2894 @param field_name_arg See Field definition
2895 @param dec_arg Number of second fraction digits, 0..6.
2896 */
2898 uchar null_bit_arg, uchar auto_flags_arg,
2899 const char *field_name_arg, uint8 dec_arg)
2900 : Field_temporal_with_date(ptr_arg, null_ptr_arg, null_bit_arg,
2901 auto_flags_arg, field_name_arg,
2902 MAX_DATETIME_WIDTH, dec_arg) {}
2903 void store_timestamp(const my_timeval *tm) override;
2904};
2905
2906/**
2907 Abstract class for types with date and time, with fractional part:
2908 DATETIME, DATETIME(N), TIMESTAMP, TIMESTAMP(N).
2909*/
2912 private:
2913 int do_save_field_metadata(uchar *metadata_ptr) const final {
2914 *metadata_ptr = decimals();
2915 return 1;
2916 }
2917
2918 public:
2919 /**
2920 Constructor for Field_temporal_with_date_and_timef
2921 @param ptr_arg See Field definition
2922 @param null_ptr_arg See Field definition
2923 @param null_bit_arg See Field definition
2924 @param auto_flags_arg See Field definition
2925 @param field_name_arg See Field definition
2926 @param dec_arg Number of second fraction digits, 0..6.
2927 */
2929 uchar null_bit_arg, uchar auto_flags_arg,
2930 const char *field_name_arg, uint8 dec_arg)
2931 : Field_temporal_with_date_and_time(ptr_arg, null_ptr_arg, null_bit_arg,
2932 auto_flags_arg, field_name_arg,
2933 dec_arg) {}
2934
2935 uint decimals() const final { return dec; }
2936 const CHARSET_INFO *sort_charset() const final { return &my_charset_bin; }
2938 size_t make_sort_key(uchar *to, size_t length) const final {
2939 memcpy(to, ptr, length);
2940 return length;
2941 }
2942 int cmp(const uchar *a_ptr, const uchar *b_ptr) const final {
2943 return memcmp(a_ptr, b_ptr, pack_length());
2944 }
2945 uint row_pack_length() const final { return pack_length(); }
2946 double val_real() const final;
2947 longlong val_int() const final;
2948 my_decimal *val_decimal(my_decimal *decimal_value) const final;
2949};
2950
2951/*
2952 Field implementing TIMESTAMP data type without fractional seconds.
2953 We will be removed eventually.
2954*/
2956 protected:
2957 my_time_flags_t date_flags(const THD *thd) const final;
2958 type_conversion_status store_internal(const MYSQL_TIME *ltime,
2959 int *error) final;
2960 bool get_date_internal(MYSQL_TIME *ltime) const final;
2961 bool get_date_internal_at_utc(MYSQL_TIME *ltime) const final;
2962 void store_timestamp_internal(const my_timeval *tm) final;
2963
2964 public:
2965 static const int PACK_LENGTH = 4;
2966 Field_timestamp(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
2967 uchar null_bit_arg, uchar auto_flags_arg,
2968 const char *field_name_arg);
2969 Field_timestamp(bool is_nullable_arg, const char *field_name_arg);
2971 enum ha_base_keytype key_type() const final { return HA_KEYTYPE_ULONG_INT; }
2973 longlong val_int() const final;
2974 int cmp(const uchar *, const uchar *) const final;
2976 size_t make_sort_key(uchar *buff, size_t length) const final;
2977 uint32 pack_length() const final { return PACK_LENGTH; }
2978 void sql_type(String &str) const final;
2979 bool zero_pack() const final { return false; }
2980 /* Get TIMESTAMP field value as seconds since begging of Unix Epoch */
2981 bool get_timestamp(my_timeval *tm, int *warnings) const final;
2982 bool get_date(MYSQL_TIME *ltime, my_time_flags_t fuzzydate) const final;
2984 assert(type() == MYSQL_TYPE_TIMESTAMP);
2985 return new (mem_root) Field_timestamp(*this);
2986 }
2987 uchar *pack(uchar *to, const uchar *from, size_t max_length) const final {
2988 return pack_int32(to, from, max_length);
2989 }
2990 const uchar *unpack(uchar *to, const uchar *from,
2991 uint param_data [[maybe_unused]]) final {
2992 return unpack_int32(to, from);
2993 }
2994 /* Validate the value stored in a field */
2996
2997 private:
2998 /**
2999 Retrieves a value from a record, without checking fuzzy date flags.
3000
3001 @param tz The time zone to convert to
3002 @param[out] ltime The timestamp value in the time zone.
3003
3004 @retval true Means that the timestamp value read is 0. ltime is not touched
3005 in this case.
3006 @retval false If timestamp is non-zero.
3007 */
3008 bool get_date_internal_at(const Time_zone *tz, MYSQL_TIME *ltime) const;
3009};
3010
3011/*
3012 Field implementing TIMESTAMP(N) data type, where N=0..6.
3013*/
3015 protected:
3016 bool get_date_internal(MYSQL_TIME *ltime) const final;
3017 bool get_date_internal_at_utc(MYSQL_TIME *ltime) const final;
3018 type_conversion_status store_internal(const MYSQL_TIME *ltime,
3019 int *error) final;
3020 my_time_flags_t date_flags(const THD *thd) const final;
3021 void store_timestamp_internal(const my_timeval *tm) override;
3022
3023 public:
3024 /**
3025 Field_timestampf constructor
3026 @param ptr_arg See Field definition
3027 @param null_ptr_arg See Field definition
3028 @param null_bit_arg See Field definition
3029 @param auto_flags_arg See Field definition
3030 @param field_name_arg See Field definition
3031 @param dec_arg Number of fractional second digits, 0..6.
3032 */
3033 Field_timestampf(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
3034 uchar auto_flags_arg, const char *field_name_arg,
3035 uint8 dec_arg);
3036 /**
3037 Field_timestampf constructor
3038 @param is_nullable_arg See Field definition
3039 @param field_name_arg See Field definition
3040 @param dec_arg Number of fractional second digits, 0..6.
3041 */
3042 Field_timestampf(bool is_nullable_arg, const char *field_name_arg,
3043 uint8 dec_arg);
3045 assert(type() == MYSQL_TYPE_TIMESTAMP);
3046 return new (mem_root) Field_timestampf(*this);
3047 }
3048
3052 bool zero_pack() const final { return false; }
3053
3055 uint pack_length_from_metadata(uint field_metadata) const final {
3056 DBUG_TRACE;
3057 uint tmp = my_timestamp_binary_length(field_metadata);
3058 return tmp;
3059 }
3060
3062 bool get_date(MYSQL_TIME *ltime, my_time_flags_t fuzzydate) const final;
3063 void sql_type(String &str) const final;
3064
3065 bool get_timestamp(my_timeval *tm, int *warnings) const final;
3066 /* Validate the value stored in a field */
3068
3069 private:
3070 /**
3071 Retrieves a value from a record, without checking fuzzy date flags.
3072
3073 @param tz The time zone to convert to
3074 @param[out] ltime The timestamp value in the time zone.
3075
3076 @retval true Means that the timestamp value read is 0. ltime is not touched
3077 in this case.
3078 @retval false If timestamp is non-zero.
3079 */
3080 bool get_date_internal_at(const Time_zone *tz, MYSQL_TIME *ltime) const;
3081};
3082
3083class Field_year final : public Field_tiny {
3084 public:
3085 enum Limits { MIN_YEAR = 1901, MAX_YEAR = 2155 };
3086 Field_year(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
3087 uchar auto_flags_arg, const char *field_name_arg)
3088 : Field_tiny(ptr_arg, 4, null_ptr_arg, null_bit_arg, auto_flags_arg,
3089 field_name_arg, true, true) {}
3090 Field_year(bool is_nullable_arg, const char *field_name_arg)
3091 : Field_tiny(nullptr, 4, is_nullable_arg ? &dummy_null_buffer : nullptr,
3092 0, NONE, field_name_arg, true, true) {}
3093 enum_field_types type() const final { return MYSQL_TYPE_YEAR; }
3094 type_conversion_status store(const char *to, size_t length,
3095 const CHARSET_INFO *charset) final;
3096 type_conversion_status store(double nr) final;
3097 type_conversion_status store(longlong nr, bool unsigned_val) final;
3099 double val_real() const final;
3100 longlong val_int() const final;
3101 String *val_str(String *, String *) const final;
3102 bool send_to_protocol(Protocol *protocol) const final;
3103 void sql_type(String &str) const final;
3104 bool can_be_compared_as_longlong() const final { return true; }
3106 assert(type() == MYSQL_TYPE_YEAR);
3107 return new (mem_root) Field_year(*this);
3108 }
3109};
3110
3112 protected:
3113 static const int PACK_LENGTH = 3;
3114 my_time_flags_t date_flags(const THD *thd) const final;
3115 bool get_date_internal(MYSQL_TIME *ltime) const final;
3116 type_conversion_status store_internal(const MYSQL_TIME *ltime,
3117 int *error) final;
3118
3119 public:
3120 Field_newdate(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
3121 uchar auto_flags_arg, const char *field_name_arg)
3122 : Field_temporal_with_date(ptr_arg, null_ptr_arg, null_bit_arg,
3123 auto_flags_arg, field_name_arg, MAX_DATE_WIDTH,
3124 0) {}
3125 Field_newdate(bool is_nullable_arg, const char *field_name_arg)
3127 is_nullable_arg ? &dummy_null_buffer : nullptr,
3128 0, NONE, field_name_arg, MAX_DATE_WIDTH, 0) {}
3129 enum_field_types type() const final { return MYSQL_TYPE_DATE; }
3131 enum ha_base_keytype key_type() const final { return HA_KEYTYPE_UINT24; }
3133 longlong val_int() const final;
3134 longlong val_time_temporal() const final;
3135 longlong val_date_temporal() const final;
3136 String *val_str(String *, String *) const final;
3137 bool send_to_protocol(Protocol *protocol) const final;
3138 int cmp(const uchar *, const uchar *) const final;
3140 size_t make_sort_key(uchar *buff, size_t length) const final;
3141 uint32 pack_length() const final { return PACK_LENGTH; }
3142 void sql_type(String &str) const final;
3143 bool zero_pack() const final { return true; }
3144 bool get_date(MYSQL_TIME *ltime, my_time_flags_t fuzzydate) const final;
3146 assert(type() == MYSQL_TYPE_DATE);
3147 assert(real_type() == MYSQL_TYPE_NEWDATE);
3148 return new (mem_root) Field_newdate(*this);
3149 }
3150};
3151
3152/**
3153 Abstract class for TIME and TIME(N).
3154*/
3156 protected:
3157 bool convert_str_to_TIME(const char *str, size_t len, const CHARSET_INFO *cs,
3158 MYSQL_TIME *ltime, MYSQL_TIME_STATUS *status) final;
3159 /**
3160 @todo: convert_number_to_TIME returns conversion status through
3161 two different interfaces: return value and warning. It should be
3162 refactored to only use return value.
3163 */
3164 type_conversion_status convert_number_to_TIME(longlong nr, bool unsigned_val,
3165 int nanoseconds,
3166 MYSQL_TIME *ltime,
3167 int *warning) final;
3168 /**
3169 Low-level function to store MYSQL_TIME value.
3170 The value must be rounded or truncated according to decimals().
3171 */
3173 int *error) override = 0;
3174 /**
3175 Function to store time value.
3176 The value is rounded/truncated according to decimals() and sql_mode.
3177 */
3178 type_conversion_status store_internal_adjust_frac(MYSQL_TIME *ltime,
3179 int *warnings) final;
3180
3181 my_time_flags_t date_flags(const THD *thd) const final;
3183
3184 public:
3185 /**
3186 Constructor for Field_time_common
3187 @param ptr_arg See Field definition
3188 @param null_ptr_arg See Field definition
3189 @param null_bit_arg See Field definition
3190 @param auto_flags_arg See Field definition
3191 @param field_name_arg See Field definition
3192 @param dec_arg Number of second fraction digits, 0..6.
3193 */
3194 Field_time_common(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
3195 uchar auto_flags_arg, const char *field_name_arg,
3196 uint8 dec_arg)
3197 : Field_temporal(ptr_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
3198 field_name_arg, MAX_TIME_WIDTH, dec_arg) {}
3200 String *val_str(String *, String *) const final;
3201 bool get_date(MYSQL_TIME *ltime, my_time_flags_t fuzzydate) const final;
3202 longlong val_date_temporal() const final;
3203 bool send_to_protocol(Protocol *protocol) const final;
3204};
3205
3206/*
3207 Field implementing TIME data type without fractional seconds.
3208 It will be removed eventually.
3209*/
3210class Field_time final : public Field_time_common {
3211 protected:
3212 type_conversion_status store_internal(const MYSQL_TIME *ltime,
3213 int *error) final;
3214
3215 public:
3216 Field_time(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
3217 uchar auto_flags_arg, const char *field_name_arg)
3218 : Field_time_common(ptr_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
3219 field_name_arg, 0) {}
3220 Field_time(const char *field_name_arg)
3221 : Field_time_common(nullptr, nullptr, 0, NONE, field_name_arg, 0) {}
3222 enum_field_types type() const final { return MYSQL_TYPE_TIME; }
3223 enum ha_base_keytype key_type() const final { return HA_KEYTYPE_INT24; }
3225 longlong val_int() const final;
3226 longlong val_time_temporal() const final;
3227 bool get_time(MYSQL_TIME *ltime) const final;
3228 int cmp(const uchar *, const uchar *) const final;
3230 size_t make_sort_key(uchar *buff, size_t length) const final;
3231 uint32 pack_length() const final { return 3; }
3232 void sql_type(String &str) const final;
3233 bool zero_pack() const final { return true; }
3235 assert(type() == MYSQL_TYPE_TIME);
3236 return new (mem_root) Field_time(*this);
3237 }
3238};
3239
3240/*
3241 Field implementing TIME(N) data type, where N=0..6.
3242*/
3243class Field_timef final : public Field_time_common {
3244 private:
3245 int do_save_field_metadata(uchar *metadata_ptr) const final {
3246 *metadata_ptr = decimals();
3247 return 1;
3248 }
3249
3250 protected:
3251 type_conversion_status store_internal(const MYSQL_TIME *ltime,
3252 int *error) final;
3253
3254 public:
3255 /**
3256 Constructor for Field_timef
3257 @param ptr_arg See Field definition
3258 @param null_ptr_arg See Field definition
3259 @param null_bit_arg See Field definition
3260 @param auto_flags_arg See Field definition
3261 @param field_name_arg See Field definition
3262 @param dec_arg Number of second fraction digits, 0..6.
3263 */
3264 Field_timef(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
3265 uchar auto_flags_arg, const char *field_name_arg, uint8 dec_arg)
3266 : Field_time_common(ptr_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
3267 field_name_arg, dec_arg) {}
3268 /**
3269 Constructor for Field_timef
3270 @param is_nullable_arg See Field definition
3271 @param field_name_arg See Field definition
3272 @param dec_arg Number of second fraction digits, 0..6.
3273 */
3274 Field_timef(bool is_nullable_arg, const char *field_name_arg, uint8 dec_arg)
3276 is_nullable_arg ? &dummy_null_buffer : nullptr, 0,
3277 NONE, field_name_arg, dec_arg) {}
3279 assert(type() == MYSQL_TYPE_TIME);
3280 return new (mem_root) Field_timef(*this);
3281 }
3282 uint decimals() const final { return dec; }
3283 enum_field_types type() const final { return MYSQL_TYPE_TIME; }
3288 double val_real() const final;
3289 longlong val_int() const final;
3290 longlong val_time_temporal() const final;
3291 bool get_time(MYSQL_TIME *ltime) const final;
3292 my_decimal *val_decimal(my_decimal *) const final;
3293 uint32 pack_length() const final { return my_time_binary_length(dec); }
3294 uint pack_length_from_metadata(uint field_metadata) const final {
3295 DBUG_TRACE;
3296 uint tmp = my_time_binary_length(field_metadata);
3297 return tmp;
3298 }
3299 uint row_pack_length() const final { return pack_length(); }
3300 void sql_type(String &str) const final;
3301 bool zero_pack() const final { return true; }
3302 const CHARSET_INFO *sort_charset() const final { return &my_charset_bin; }
3304 size_t make_sort_key(uchar *to, size_t length) const final {
3305 memcpy(to, ptr, length);
3306 return length;
3307 }
3308 int cmp(const uchar *a_ptr, const uchar *b_ptr) const final {
3309 return memcmp(a_ptr, b_ptr, pack_length());
3310 }
3311};
3312
3313/*
3314 Field implementing DATETIME data type without fractional seconds.
3315 We will be removed eventually.
3316*/
3318 protected:
3319 type_conversion_status store_internal(const MYSQL_TIME *ltime,
3320 int *error) final;
3321 bool get_date_internal(MYSQL_TIME *ltime) const final;
3322 my_time_flags_t date_flags(const THD *thd) const final;
3323 void store_timestamp_internal(const my_timeval *tm) final;
3324
3325 public:
3326 static const int PACK_LENGTH = 8;
3327
3328 /**
3329 DATETIME columns can be defined as having CURRENT_TIMESTAMP as the
3330 default value on inserts or updates. This constructor accepts a
3331 auto_flags argument which controls the column default expressions.
3332
3333 For DATETIME columns this argument is a bitmap combining two flags:
3334
3335 - DEFAULT_NOW - means that column has DEFAULT CURRENT_TIMESTAMP attribute.
3336 - ON_UPDATE_NOW - means that column has ON UPDATE CURRENT_TIMESTAMP.
3337
3338 (these two flags can be used orthogonally to each other).
3339 */
3340 Field_datetime(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
3341 uchar auto_flags_arg, const char *field_name_arg)
3342 : Field_temporal_with_date_and_time(ptr_arg, null_ptr_arg, null_bit_arg,
3343 auto_flags_arg, field_name_arg, 0) {}
3344 Field_datetime(const char *field_name_arg)
3346 field_name_arg, 0) {}
3348 enum ha_base_keytype key_type() const final { return HA_KEYTYPE_ULONGLONG; }
3349 using Field_temporal_with_date_and_time::store; // Make -Woverloaded-virtual
3350 type_conversion_status store(longlong nr, bool unsigned_val) final;
3352 longlong val_int() const final;
3353 String *val_str(String *, String *) const final;
3354 int cmp(const uchar *, const uchar *) const final;
3356 size_t make_sort_key(uchar *buff, size_t length) const final;
3357 uint32 pack_length() const final { return PACK_LENGTH; }
3358 void sql_type(String &str) const final;
3359 bool zero_pack() const final { return true; }
3360 bool get_date(MYSQL_TIME *ltime, my_time_flags_t fuzzydate) const final;
3362 assert(type() == MYSQL_TYPE_DATETIME);
3363 return new (mem_root) Field_datetime(*this);
3364 }
3365 uchar *pack(uchar *to, const uchar *from, size_t max_length) const final {
3366 return pack_int64(to, from, max_length);
3367 }
3368 const uchar *unpack(uchar *to, const uchar *from,
3369 uint param_data [[maybe_unused]]) final {
3370 return unpack_int64(to, from);
3371 }
3372};
3373
3374/*
3375 Field implementing DATETIME(N) data type, where N=0..6.
3376*/
3378 protected:
3379 bool get_date_internal(MYSQL_TIME *ltime) const final;
3380 type_conversion_status store_internal(const MYSQL_TIME *ltime,
3381 int *error) final;
3382 my_time_flags_t date_flags(const THD *thd) const final;
3383 void store_timestamp_internal(const my_timeval *tm) final;
3384
3385 public:
3386 /**
3387 Constructor for Field_datetimef
3388 @param ptr_arg See Field definition
3389 @param null_ptr_arg See Field definition
3390 @param null_bit_arg See Field definition
3391 @param auto_flags_arg See Field definition
3392 @param field_name_arg See Field definition
3393 @param dec_arg Number of second fraction digits, 0..6.
3394 */
3395 Field_datetimef(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
3396 uchar auto_flags_arg, const char *field_name_arg,
3397 uint8 dec_arg)
3398 : Field_temporal_with_date_and_timef(ptr_arg, null_ptr_arg, null_bit_arg,
3399 auto_flags_arg, field_name_arg,
3400 dec_arg) {}
3401 /**
3402 Constructor for Field_datetimef
3403 @param is_nullable_arg See Field definition
3404 @param field_name_arg See Field definition
3405 @param dec_arg Number of second fraction digits, 0..6.
3406 */
3407 Field_datetimef(bool is_nullable_arg, const char *field_name_arg,
3408 uint8 dec_arg)
3410 nullptr, is_nullable_arg ? &dummy_null_buffer : nullptr, 0, NONE,
3411 field_name_arg, dec_arg) {}
3413 assert(type() == MYSQL_TYPE_DATETIME);
3414 return new (mem_root) Field_datetimef(*this);
3415 }
3416
3421 uint pack_length_from_metadata(uint field_metadata) const final {
3422 DBUG_TRACE;
3423 uint tmp = my_datetime_binary_length(field_metadata);
3424 return tmp;
3425 }
3426 bool zero_pack() const final { return true; }
3427
3430 longlong val_date_temporal() const final;
3431 bool get_date(MYSQL_TIME *ltime, my_time_flags_t fuzzydate) const final;
3432 void sql_type(String &str) const final;
3433};
3434
3436 public:
3437 Field_string(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
3438 uchar null_bit_arg, uchar auto_flags_arg,
3439 const char *field_name_arg, const CHARSET_INFO *cs)
3440 : Field_longstr(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
3441 auto_flags_arg, field_name_arg, cs) {}
3442 Field_string(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg,
3443 const CHARSET_INFO *cs)
3444 : Field_longstr(nullptr, len_arg,
3445 is_nullable_arg ? &dummy_null_buffer : nullptr, 0, NONE,
3446 field_name_arg, cs) {}
3447
3448 enum_field_types type() const final { return MYSQL_TYPE_STRING; }
3449 bool match_collation_to_optimize_range() const final { return true; }
3450 enum ha_base_keytype key_type() const final {
3452 }
3453 bool zero_pack() const final { return false; }
3455 charset()->cset->fill(charset(), (char *)ptr, field_length,
3456 (has_charset() ? ' ' : 0));
3457 return TYPE_OK;
3458 }
3459 type_conversion_status store(const char *to, size_t length,
3460 const CHARSET_INFO *charset) final;
3461 type_conversion_status store(longlong nr, bool unsigned_val) final;
3462 // Inherit the store() overloads that have not been overridden.
3464 double val_real() const final;
3465 longlong val_int() const final;
3466 String *val_str(String *, String *) const final;
3467 /**
3468 Get the C-string value, without using String class.
3469 @returns The C-string value of this field.
3470 */
3471 LEX_CSTRING val_str_quick() const {
3472 const char *string = pointer_cast<const char *>(ptr);
3473 return {string,
3475 }
3476 my_decimal *val_decimal(my_decimal *) const final;
3477 int cmp(const uchar *, const uchar *) const final;
3478 size_t make_sort_key(uchar *buff, size_t length) const final;
3479 size_t make_sort_key(uchar *to, size_t length, size_t trunc_pos) const final;
3480 void sql_type(String &str) const final;
3481 uchar *pack(uchar *to, const uchar *from, size_t max_length) const final;
3482 const uchar *unpack(uchar *to, const uchar *from, uint param_data) final;
3483 uint pack_length_from_metadata(uint field_metadata) const final {
3484 DBUG_PRINT("debug", ("field_metadata: 0x%04x", field_metadata));
3485 if (field_metadata == 0) return row_pack_length();
3486 return (((field_metadata >> 4) & 0x300) ^ 0x300) +
3487 (field_metadata & 0x00ff);
3488 }
3489 bool compatible_field_size(uint field_metadata, Relay_log_info *rli,
3490 uint16 mflags, int *order_var) const final;
3491 uint row_pack_length() const final { return field_length; }
3492 uint max_packed_col_length() const final;
3494 bool has_charset() const final {
3495 return charset() == &my_charset_bin ? false : true;
3496 }
3498 assert(real_type() == MYSQL_TYPE_STRING);
3499 return new (mem_root) Field_string(*this);
3500 }
3501 size_t get_key_image(uchar *buff, size_t length, imagetype type) const final;
3502 bool is_text_key_type() const final { return binary() ? false : true; }
3503
3504 private:
3505 int do_save_field_metadata(uchar *first_byte) const final;
3506};
3507
3509 public:
3510 Field_varstring(uchar *ptr_arg, uint32 len_arg, uint length_bytes_arg,
3511 uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg,
3512 const char *field_name_arg, TABLE_SHARE *share,
3513 const CHARSET_INFO *cs);
3514 Field_varstring(uint32 len_arg, bool is_nullable_arg,
3515 const char *field_name_arg, TABLE_SHARE *share,
3516 const CHARSET_INFO *cs);
3517
3518 enum_field_types type() const final { return MYSQL_TYPE_VARCHAR; }
3519 bool match_collation_to_optimize_range() const final { return true; }
3520 enum ha_base_keytype key_type() const final;
3521 uint row_pack_length() const final { return field_length; }
3522 bool zero_pack() const final { return false; }
3523 uint32 pack_length() const final {
3524 return (uint32)field_length + length_bytes;
3525 }
3526 uint32 key_length() const final { return (uint32)field_length; }
3527 type_conversion_status store(const char *to, size_t length,
3528 const CHARSET_INFO *charset) override;
3529 type_conversion_status store(longlong nr, bool unsigned_val) final;
3530 // Inherit the store() overloads that have not been overridden.
3532 double val_real() const final;
3533 longlong val_int() const final;
3534 String *val_str(String *, String *) const override;
3535 my_decimal *val_decimal(my_decimal *) const final;
3536 int cmp_max(const uchar *, const uchar *, uint max_length) const final;
3537 int cmp(const uchar *a, const uchar *b) const final {
3538 return cmp_max(a, b, ~0U);
3539 }
3540 size_t make_sort_key(uchar *buff, size_t length) const final;
3541 size_t make_sort_key(uchar *to, size_t length, size_t trunc_pos) const final;
3542 size_t get_key_image(uchar *buff, size_t length, imagetype type) const final;
3543 void set_key_image(const uchar *buff, size_t length) final;
3544 void sql_type(String &str) const final;
3545 uchar *pack(uchar *to, const uchar *from, size_t max_length) const final;
3546 const uchar *unpack(uchar *to, const uchar *from, uint param_data) final;
3547 int cmp_binary(const uchar *a, const uchar *b,
3548 uint32 max_length = ~0L) const final;
3549 int key_cmp(const uchar *, const uchar *) const final;
3550 int key_cmp(const uchar *str, uint length) const final;
3551
3552 uint32 data_length(ptrdiff_t row_offset = 0) const final;
3554 bool has_charset() const final {
3555 return charset() == &my_charset_bin ? false : true;
3556 }
3557 Field *new_field(MEM_ROOT *root, TABLE *new_table) const final;
3558 Field *new_key_field(MEM_ROOT *root, TABLE *new_table, uchar *new_ptr,
3559 uchar *new_null_ptr, uint new_null_bit) const final;
3561 assert(type() == MYSQL_TYPE_VARCHAR);
3562 assert(real_type() == MYSQL_TYPE_VARCHAR);
3563 return new (mem_root) Field_varstring(*this);
3564 }
3565 uint is_equal(const Create_field *new_field) const final;
3566 void hash(ulong *nr, ulong *nr2) const final;
3567 const uchar *data_ptr() const final { return ptr + length_bytes; }
3568 bool is_text_key_type() const final { return binary() ? false : true; }
3569 uint32 get_length_bytes() const override { return length_bytes; }
3570
3571 private:
3572 /* Store number of bytes used to store length (1 or 2) */
3574
3575 int do_save_field_metadata(uchar *first_byte) const final;
3576};
3577
3579 virtual type_conversion_status store_internal(const char *from, size_t length,
3580 const CHARSET_INFO *cs);
3581 /**
3582 Copy value to memory storage.
3583 */
3584 type_conversion_status store_to_mem(const char *from, size_t length,
3585 const CHARSET_INFO *cs, size_t max_length,
3587
3588 protected:
3589 /**
3590 The number of bytes used to represent the length of the blob.
3591 */
3593
3594 /**
3595 The 'value'-object is a cache fronting the storage engine.
3596 */
3598
3599 private:
3600 /**
3601 In order to support update of virtual generated columns of blob type,
3602 we need to allocate the space blob needs on server for old_row and
3603 new_row respectively. This variable is used to record the
3604 allocated blob space for old_row.
3605 */
3607
3608 /**
3609 Whether we need to move the content of 'value' to 'old_value' before
3610 updating the BLOB stored in 'value'. This needs to be done for
3611 updates of BLOB columns that are virtual since the storage engine
3612 does not have its own copy of the old 'value'. This variable is set
3613 to true when we read the data into 'value'. It is reset when we move
3614 'value' to 'old_value'. The purpose of having this is to avoid that we
3615 do the move operation from 'value' to 'old_value' more than one time per
3616 record.
3617 Currently, this variable is introduced because the following call in
3618 sql_data_change.cc:
3619 \/\**
3620 @todo combine this call to update_generated_write_fields() with the one
3621 in fill_record() to avoid updating virtual generated fields twice.
3622 *\/
3623 if (table->has_gcol())
3624 update_generated_write_fields(table->write_set, table);
3625 When the @todo is done, m_keep_old_value can be deleted.
3626 */
3628
3629 /**
3630 Backup String for table's blob fields.
3631 UPDATE of a virtual field (for index update) requires two values to be
3632 kept at the same time - 'new' and 'old' since SE (InnoDB) doesn't know the
3633 latter. In the case when there was an indexed record, it got deleted and
3634 When INSERT inserts into an index a record that coincides with a
3635 previously deleted one, InnoDB needs to recalculate value that was
3636 deleted in order to properly insert the new one.
3637 When two above overlap, a field have to keep 3 different values at the
3638 same time - 'new', 'old' and 'deleted'.
3639 This backup_value is used by @see my_eval_gcolumn_expr_helper() to save
3640 'new' and provide space for 'deleted' to avoid thrashing the former.
3641 Unlike the old_value, backup_value is allocated once and reused for each
3642 new re-calculation, to avoid excessive [re-]allocations. It's freed at the
3643 end of statement. Since InnoDB consumes calculated values only after all
3644 needed table's virtual fields were calculated, we have to have such backup
3645 buffer for each field.
3646 */
3648
3649#ifndef NDEBUG
3650 /**
3651 Whether the field uses table's backup value storage. @see
3652 TABLE::m_blob_backup. Used only for debug.
3653 */
3654 bool m_uses_backup{false};
3655#endif
3656
3657 protected:
3658 /**
3659 Store ptr and length.
3660 */
3661 void store_ptr_and_length(const char *from, uint32 length) {
3662 store_length(length);
3663 memmove(ptr + packlength, &from, sizeof(char *));
3664 }
3665
3666 public:
3667 Field_blob(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
3668 uchar auto_flags_arg, const char *field_name_arg,
3669 TABLE_SHARE *share, uint blob_pack_length, const CHARSET_INFO *cs);
3670
3671 Field_blob(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg,
3672 const CHARSET_INFO *cs, bool set_packlength)
3673 : Field_longstr(nullptr, len_arg,
3674 is_nullable_arg ? &dummy_null_buffer : nullptr, 0, NONE,
3675 field_name_arg, cs),
3676 packlength(4),
3677 m_keep_old_value(false) {
3679 if (set_packlength) {
3680 packlength = len_arg <= 255
3681 ? 1
3682 : len_arg <= 65535 ? 2 : len_arg <= 16777215 ? 3 : 4;
3683 }
3684 }
3685
3686 /// Copy static information and reset dynamic information.
3688 : Field_longstr(field),
3689 packlength(field.packlength),
3690 value(),
3691 old_value(),
3692 m_keep_old_value(field.m_keep_old_value),
3693 m_blob_backup() {
3694#ifndef NDEBUG
3695 m_uses_backup = field.m_uses_backup;
3696#endif
3697 }
3698
3699 explicit Field_blob(uint32 packlength_arg);
3700
3701 /* Note that the default copy constructor is used, in clone() */
3702 enum_field_types type() const override { return MYSQL_TYPE_BLOB; }
3703 bool match_collation_to_optimize_range() const override { return true; }
3704 enum ha_base_keytype key_type() const override {
3706 }
3707 type_conversion_status store(const char *to, size_t length,
3708 const CHARSET_INFO *charset) override;
3709 type_conversion_status store(double nr) override;
3710 type_conversion_status store(longlong nr, bool unsigned_val) override;
3711 type_conversion_status store(const Field *from);
3712 double val_real() const override;
3713 longlong val_int() const override;
3714 String *val_str(String *, String *) const override;
3715 my_decimal *val_decimal(my_decimal *) const override;
3716 int cmp_max(const uchar *, const uchar *, uint max_length) const final;
3717 int cmp(const uchar *a, const uchar *b) const final {
3718 return cmp_max(a, b, ~0U);
3719 }
3720 int cmp(const uchar *a, uint32 a_length, const uchar *b,
3721 uint32 b_length) const; // No override.
3722 int cmp_binary(const uchar *a, const uchar *b,
3723 uint32 max_length = ~0L) const override;
3724 int key_cmp(const uchar *, const uchar *) const override;
3725 int key_cmp(const uchar *str, uint length) const override;
3726 uint32 key_length() const override { return 0; }
3727 size_t make_sort_key(uchar *buff, size_t length) const override;
3728 size_t make_sort_key(uchar *to, size_t length, size_t trunc_pos) const final;
3729 uint32 pack_length() const final {
3730 return (uint32)(packlength + portable_sizeof_char_ptr);
3731 }
3732
3733 /**
3734 Return the packed length without the pointer size added.
3735
3736 This is used to determine the size of the actual data in the row
3737 buffer.
3738
3739 @returns The length of the raw data itself without the pointer.
3740 */
3741 uint32 pack_length_no_ptr() const { return (uint32)(packlength); }
3742 uint row_pack_length() const final { return pack_length_no_ptr(); }
3743 uint32 max_data_length() const final {
3744 return (uint32)(((ulonglong)1 << (packlength * 8)) - 1);
3745 }
3746 size_t get_field_buffer_size() { return value.alloced_length(); }
3747 void store_length(uchar *i_ptr, uint i_packlength, uint32 i_number);
3748 inline void store_length(uint32 number) {
3749 store_length(ptr, packlength, number);
3750 }
3751 uint32 data_length(ptrdiff_t row_offset = 0) const final {
3752 return get_length(row_offset);
3753 }
3754 uint32 get_length(ptrdiff_t row_offset = 0) const;
3755 uint32 get_length(const uchar *ptr, uint packlength) const;
3756 uint32 get_length(const uchar *ptr_arg) const;
3757 /** Get a const pointer to the BLOB data of this field. */
3758 const uchar *get_blob_data() const { return get_blob_data(ptr + packlength); }
3759 /** Get a non-const pointer to the BLOB data of this field. */
3760 uchar *get_blob_data(ptrdiff_t row_offset = 0) {
3761 // row_offset is only used by NDB
3762 return get_blob_data(ptr + packlength + row_offset);
3763 }
3764 /** Get a const pointer to the BLOB data of this field. */
3765 const uchar *data_ptr() const final { return get_blob_data(); }
3766
3767 protected:
3768 /**
3769 Get the BLOB data pointer stored at the specified position in the record
3770 buffer.
3771 */
3772 static uchar *get_blob_data(const uchar *position) {
3773 uchar *data;
3774 memcpy(&data, position, sizeof(data));
3775 return data;
3776 }
3777
3778 public:
3779 void set_ptr(const uchar *length, const uchar *data) {
3780 memcpy(ptr, length, packlength);
3781 memcpy(ptr + packlength, &data, sizeof(char *));
3782 }
3783 void set_ptr_offset(ptrdiff_t ptr_diff, uint32 length, const uchar *data) {
3784 uchar *ptr_ofs = ptr + ptr_diff;
3785 store_length(ptr_ofs, packlength, length);
3786 memcpy(ptr_ofs + packlength, &data, sizeof(char *));
3787 }
3788 void set_ptr(uint32 length, const uchar *data) {
3789 set_ptr_offset(0, length, data);
3790 }
3791 size_t get_key_image(uchar *buff, size_t length,
3792 imagetype type) const override;
3793 void set_key_image(const uchar *buff, size_t length) final;
3794 void sql_type(String &str) const override;
3795 bool copy();
3796 Field_blob *clone(MEM_ROOT *mem_root) const override {
3797 assert(type() == MYSQL_TYPE_BLOB);
3798 return new (mem_root) Field_blob(*this);
3799 }
3800 uchar *pack(uchar *to, const uchar *from, size_t max_length) const final;
3801 uchar *pack_with_metadata_bytes(uchar *to, const uchar *from,
3802 uint max_length) const final;
3803 const uchar *unpack(uchar *, const uchar *from, uint param_data) final;
3804 uint max_packed_col_length() const final;
3805 void mem_free() final {
3806 // Free all allocated space
3807 value.mem_free();
3808 old_value.mem_free();
3809 m_blob_backup.mem_free();
3810 }
3811 bool has_charset() const override {
3812 return charset() == &my_charset_bin ? false : true;
3813 }
3814 uint32 max_display_length() const final;
3815 uint32 char_length() const override;
3816 bool copy_blob_value(MEM_ROOT *mem_root);
3817 uint is_equal(const Create_field *new_field) const override;
3818 bool is_text_key_type() const final { return binary() ? false : true; }
3819
3820 /**
3821 Mark that the BLOB stored in value should be copied before updating it.
3822
3823 When updating virtual generated columns we need to keep the old
3824 'value' for BLOBs since this can be needed when the storage engine
3825 does the update. During read of the record the old 'value' for the
3826 BLOB is evaluated and stored in 'value'. This function is to be used
3827 to specify that we need to copy this BLOB 'value' into 'old_value'
3828 before we compute the new BLOB 'value'. For more information @see
3829 Field_blob::keep_old_value().
3830 */
3831 void set_keep_old_value(bool old_value_flag) {
3832 /*
3833 We should only need to keep a copy of the blob 'value' in the case
3834 where this is a virtual generated column (that is indexed).
3835 */
3836 assert(is_virtual_gcol());
3837
3838 /*
3839 If set to true, ensure that 'value' is copied to 'old_value' when
3840 keep_old_value() is called.
3841 */
3842 m_keep_old_value = old_value_flag;
3843 }
3844
3845 /**
3846 Save the current BLOB value to avoid that it gets overwritten.
3847
3848 This is used when updating virtual generated columns that are
3849 BLOBs. Some storage engines require that we have both the old and
3850 new BLOB value for virtual generated columns that are indexed in
3851 order for the storage engine to be able to maintain the index. This
3852 function will transfer the buffer storing the current BLOB value
3853 from 'value' to 'old_value'. This avoids that the current BLOB value
3854 is over-written when the new BLOB value is saved into this field.
3855
3856 The reason this requires special handling when updating/deleting
3857 virtual columns of BLOB type is that the BLOB value is not known to
3858 the storage engine. For stored columns, the "old" BLOB value is read
3859 by the storage engine, Field_blob is made to point to the engine's
3860 internal buffer; Field_blob's internal buffer (Field_blob::value)
3861 isn't used and remains available to store the "new" value. For
3862 virtual generated columns, the "old" value is written directly into
3863 Field_blob::value when reading the record to be
3864 updated/deleted. This is done in update_generated_read_fields().
3865 Since, in this case, the "old" value already occupies the place to
3866 store the "new" value, we must call this function before we write
3867 the "new" value into Field_blob::value object so that the "old"
3868 value does not get over-written. The table->record[1] buffer will
3869 have a pointer that points to the memory buffer inside
3870 old_value. The storage engine will use table->record[1] to read the
3871 old value for the BLOB and use table->record[0] to read the new
3872 value.
3873
3874 This function must be called before we store the new BLOB value in
3875 this field object.
3876 */
3878 /*
3879 We should only need to keep a copy of the blob value in the case
3880 where this is a virtual generated column (that is indexed).
3881 */
3882 assert(is_virtual_gcol());
3883
3884 // Transfer ownership of the current BLOB value to old_value
3885 if (m_keep_old_value) {
3886 old_value.takeover(value);
3887 m_keep_old_value = false;
3888 }
3889 }
3890
3891 /**
3892 Use to store the blob value into an allocated space.
3893 */
3894 void store_in_allocated_space(const char *from, uint32 length) {
3895 store_ptr_and_length(from, length);
3896 }
3897
3898 /**
3899 Backup data stored in 'value' into the backup_value
3900 @see Field_blob::backup_value
3901
3902 @returns
3903 true if backup fails
3904 false otherwise
3905 */
3906 bool backup_blob_field();
3907
3908 /**
3909 Restore backup value
3910 @see Field_blob::backup_value
3911 */
3912 void restore_blob_backup();
3913
3914 private:
3915 int do_save_field_metadata(uchar *first_byte) const override;
3916};
3917
3918class Field_geom final : public Field_blob {
3919 private:
3920 const std::optional<gis::srid_t> m_srid;
3921
3922 type_conversion_status store_internal(const char *from, size_t length,
3923 const CHARSET_INFO *cs) final;
3924
3925 public:
3927
3928 Field_geom(uchar *ptr_arg, uchar *null_ptr_arg, uint null_bit_arg,
3929 uchar auto_flags_arg, const char *field_name_arg,
3930 TABLE_SHARE *share, uint blob_pack_length,
3931 enum geometry_type geom_type_arg, std::optional<gis::srid_t> srid)
3932 : Field_blob(ptr_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
3933 field_name_arg, share, blob_pack_length, &my_charset_bin),
3934 m_srid(srid),
3935 geom_type(geom_type_arg) {}
3936 Field_geom(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg,
3937 enum geometry_type geom_type_arg, std::optional<gis::srid_t> srid)
3938 : Field_blob(len_arg, is_nullable_arg, field_name_arg, &my_charset_bin,
3939 false),
3940 m_srid(srid),
3941 geom_type(geom_type_arg) {}
3942 enum ha_base_keytype key_type() const final { return HA_KEYTYPE_VARBINARY2; }
3944 bool match_collation_to_optimize_range() const final { return false; }
3945 void sql_type(String &str) const final;
3946 using Field_blob::store;
3947 type_conversion_status store(double nr) final;
3948 type_conversion_status store(longlong nr, bool unsigned_val) final;
3950 type_conversion_status store(const char *from, size_t length,
3951 const CHARSET_INFO *cs) final;
3952
3953 /**
3954 Non-nullable GEOMETRY types cannot have defaults,
3955 but the underlying blob must still be reset.
3956 */
3959 if (res != TYPE_OK) return res;
3960 return (is_nullable() || table->is_nullable())
3961 ? TYPE_OK
3963 }
3964
3965 geometry_type get_geometry_type() const final { return geom_type; }
3967 assert(type() == MYSQL_TYPE_GEOMETRY);
3968 return new (mem_root) Field_geom(*this);
3969 }
3970 uint is_equal(const Create_field *new_field) const final;
3971
3972 std::optional<gis::srid_t> get_srid() const { return m_srid; }
3973};
3974
3975/// A field that stores a JSON value.
3976class Field_json : public Field_blob {
3977 type_conversion_status unsupported_conversion();
3978 type_conversion_status store_binary(const char *ptr, size_t length);
3979
3980 public:
3981 Field_json(uchar *ptr_arg, uchar *null_ptr_arg, uint null_bit_arg,
3982 uchar auto_flags_arg, const char *field_name_arg,
3983 TABLE_SHARE *share, uint blob_pack_length)
3984 : Field_blob(ptr_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
3985 field_name_arg, share, blob_pack_length, &my_charset_bin) {}
3986
3987 Field_json(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg)
3988 : Field_blob(len_arg, is_nullable_arg, field_name_arg, &my_charset_bin,
3989 false) {}
3990
3991 enum_field_types type() const override { return MYSQL_TYPE_JSON; }
3992 void sql_type(String &str) const override;
3993 /**
3994 Return a text charset so that string functions automatically
3995 convert the field value to string and treat it as a non-binary
3996 string.
3997 */
3998 const CHARSET_INFO *charset() const override {
3999 return &my_charset_utf8mb4_bin;
4000 }
4001 /**
4002 Sort should treat the field as binary and not attempt any
4003 conversions.
4004 */
4005 const CHARSET_INFO *sort_charset() const final { return field_charset; }
4006 /**
4007 JSON columns don't have an associated charset. Returning false
4008 here prevents SHOW CREATE TABLE from attaching a CHARACTER SET
4009 clause to the column.
4010 */
4011 bool has_charset() const final { return false; }
4012 type_conversion_status store(const char *to, size_t length,
4013 const CHARSET_INFO *charset) override;
4014 type_conversion_status store(double nr) override;
4015 type_conversion_status store(longlong nr, bool unsigned_val) override;
4017 type_conversion_status store_json(const Json_wrapper *json);
4018 type_conversion_status store_time(MYSQL_TIME *ltime, uint8 dec_arg) final;
4020
4021 bool pack_diff(uchar **to, ulonglong value_options) const final;
4022 /**
4023 Return the length of this field, taking into consideration that it may be in
4024 partial format.
4025
4026 This is the format used when writing the binary log in row format
4027 and using a partial format according to
4028 @@session.binlog_row_value_options.
4029
4030 @param[in] value_options The value of binlog_row_value options.
4031
4032 @param[out] diff_vector_p If this is not NULL, the pointer it
4033 points to will be set to NULL if the field is to be stored in full
4034 format, or to the Json_diff_vector if the field is to be stored in
4035 partial format.
4036
4037 @return The number of bytes needed when writing to the binlog: the
4038 size of the full format if stored in full format and the size of
4039 the diffs if stored in partial format.
4040 */
4041 longlong get_diff_vector_and_length(
4042 ulonglong value_options,
4043 const Json_diff_vector **diff_vector_p = nullptr) const;
4044 /**
4045 Return true if the before-image and after-image for this field are
4046 equal.
4047 */
4048 bool is_before_image_equal_to_after_image() const;
4049 /**
4050 Read the binary diff from the given buffer, and apply it to this field.
4051
4052 @param[in,out] from Pointer to buffer where the binary diff is stored.
4053 This will be changed to point to the next byte after the field.
4054
4055 @retval false Success
4056 @retval true Error (e.g. failed to apply the diff). The error has
4057 been reported through my_error.
4058 */
4059 bool unpack_diff(const uchar **from);
4060
4061 /**
4062 Retrieve the field's value as a JSON wrapper. It
4063 there is an error, wr is not modified and we return
4064 false, else true.
4065
4066 @param[out] wr the JSON value
4067 @return true if a value is retrieved (or NULL), false if error
4068 */
4069 bool val_json(Json_wrapper *wr) const;
4070
4071 /**
4072 Retrieve the JSON as an int if possible. This requires a JSON scalar
4073 of suitable type.
4074
4075 @returns the JSON value as an int
4076 */
4077 longlong val_int() const final;
4078
4079 /**
4080 Retrieve the JSON as a double if possible. This requires a JSON scalar
4081 of suitable type.
4082
4083 @returns the JSON value as a double
4084 */
4085 double val_real() const final;
4086
4087 /**
4088 Retrieve the JSON value stored in this field as text
4089
4090 @param[in,out] buf1 string buffer for converting JSON value to string
4091 @param[in,out] buf2 unused
4092 */
4093 String *val_str(String *buf1, String *buf2) const final;
4094 my_decimal *val_decimal(my_decimal *m) const final;
4095 bool get_time(MYSQL_TIME *ltime) const final;
4096 bool get_date(MYSQL_TIME *ltime, my_time_flags_t fuzzydate) const final;
4097 Field_json *clone(MEM_ROOT *mem_root) const override;
4098 uint is_equal(const Create_field *new_field) const final;
4099 Item_result cast_to_int_type() const final { return INT_RESULT; }
4100 int cmp_binary(const uchar *a, const uchar *b,
4101 uint32 max_length = ~0L) const final;
4103 size_t make_sort_key(uchar *to, size_t length) const override;
4104
4105 /**
4106 Make a hash key that can be used by sql_executor.cc/unique_hash
4107 in order to support SELECT DISTINCT
4108
4109 @param[in] hash_val An initial hash value.
4110 */
4111 ulonglong make_hash_key(ulonglong hash_val) const;
4112
4113 /**
4114 Get a read-only pointer to the binary representation of the JSON document
4115 in this field.
4116
4117 @param row_offset Field's data offset
4118 */
4119 const char *get_binary(ptrdiff_t row_offset = 0) const;
4120};
4121
4122/**
4123 Field that stores array of values of the same type.
4124
4125 This Field class is used together with Item_func_array_cast class
4126 (CAST( .. AS .. ARRAY) function) in implementation of multi-valued index.
4127 Effectively it's a JSON field that contains a single JSON array. When a
4128 JSON value is stored, it's checked to be either a scalar, or an array.
4129 All source values are converted using the internal conversion field and
4130 stored as an array. Field_typed_array ensures that all values stored
4131 in the array have the same type and precision - the one specified by user.
4132 This way InnoDB doesn't have to do the conversion on its own and can easily
4133 index them.
4134
4135 The Field_typed_array always reports type of its element and from this
4136 point of view it's undistinguishable from regular field having the same
4137 type. Due to that, fields are differentiated by is_array() property.
4138 Field_typed_array returns true, all other fields - false.
4139
4140 For conversion and index applicability tests, Field_typed_array employs a
4141 conversion field, which is a regular Field class of array's element type.
4142 It's stored in the m_conv_field. All Field_typed_array::store_*() methods
4143 store values to the conversion field. Conversion field and typed array
4144 field are sharing same field_index, to allow correct read/write_set
4145 checks. So the field always have to be marked for read in order to allow
4146 read of conversions' results.
4147
4148 @see Item_func_array_cast
4149*/
4150
4151class Field_typed_array final : public Field_json {
4152 /// Conversion item_field
4153 Item_field *m_conv_item{nullptr};
4154 /// The array element's real type.
4156 /// Element's decimals
4158 /// Element's charset
4160 const bool unsigned_flag;
4161
4162 public:
4163 /**
4164 Constructs a Field_typed_array that is a copy of another Field_typed_array.
4165 @param other the other Field_typed_array object
4166 */
4168 /**
4169 Constructs a Field_typed_array object.
4170 */
4171 Field_typed_array(enum_field_types elt_type, bool elt_is_unsigned,
4172 size_t elt_length, uint elt_decimals, uchar *ptr_arg,
4173 uchar *null_ptr_arg, uint null_bit_arg,
4174 uchar auto_flags_arg, const char *field_name_arg,
4175 TABLE_SHARE *share, uint blob_pack_length,
4176 const CHARSET_INFO *cs);
4177 uint32 char_length() const override {
4178 return field_length / charset()->mbmaxlen;
4179 }
4180 void init(TABLE *table_arg) override;
4181 enum_field_types type() const override {
4182 return real_type_to_type(m_elt_type);
4183 }
4184 enum_field_types real_type() const override { return m_elt_type; }
4187 }
4188 uint32 key_length() const override;
4189 Field_typed_array *clone(MEM_ROOT *mem_root) const override;
4190 bool is_unsigned() const final { return unsigned_flag; }
4191 bool is_array() const override { return true; }
4192 Item_result result_type() const override;
4193 uint decimals() const override { return m_elt_decimals; }
4194 bool binary() const override {
4195 return (m_elt_type != MYSQL_TYPE_VARCHAR ||
4196 m_elt_charset == &my_charset_bin);
4197 }
4198 const CHARSET_INFO *charset() const override { return m_elt_charset; }
4199 type_conversion_status store(const char *to, size_t length,
4200 const CHARSET_INFO *charset) override;
4201 type_conversion_status store(double nr) override;
4202 type_conversion_status store(longlong nr, bool unsigned_val) override;
4203 /**
4204 Store a value as an array.
4205 @param data the value to store as an array
4206 @param array scratch space for building the array to store
4207 @return the status of the operation
4208 */
4209 type_conversion_status store_array(const Json_wrapper *data,
4210 Json_array *array);
4211 size_t get_key_image(uchar *buff, size_t length,
4212 imagetype type) const override;
4213 Field *new_key_field(MEM_ROOT *root, TABLE *new_table, uchar *new_ptr,
4214 uchar *, uint) const override;
4215 /**
4216 These methods are used by handler to prevent returning a row past the
4217 end_range during range access. Since there's no order defined for sorting
4218 set of arrays, always return -1 here, allowing all records fetched from
4219 SE to be returned to server. They will be filtered by WHERE condition later.
4220 */
4221 int key_cmp(const uchar *, const uchar *) const override { return -1; }
4222 /**
4223 * @brief This function will behave similarly to MEMBER OF json operation,
4224 * unlike regular key_cmp. The key value will be checked against
4225 * members of the array and the presence of the key will be considered
4226 * as the record matching the given key. This particular definition is
4227 * used in descending ref index scans. Descending index scan uses
4228 * handler::ha_index_prev() function to read from the storage engine
4229 * which does not compare the index key with the search key [unlike
4230 * handler::ha_index_next_same()]. Hence each retrieved record needs
4231 * to be validated to find a stop point. Refer key_cmp_if_same() and
4232 * RefIterator<true>::Read() for more details.
4233 *
4234 * @param key_ptr Pointer to the key
4235 * @param key_length Key length
4236 * @return
4237 * 0 Key found in the record
4238 * -1 Key not found in the record
4239 */
4240 int key_cmp(const uchar *key_ptr, uint key_length) const override;
4241 /**
4242 Multi-valued index always works only as a pre-filter for actual
4243 condition check, and the latter always use binary collation, so no point
4244 to match collations in optimizer.
4245 */
4246 bool match_collation_to_optimize_range() const override { return false; }
4247
4248 /**
4249 Convert arbitrary JSON value to the array's type using the conversion field.
4250 If conversion fails and it's not a coercion test (no_error= false) then an
4251 error is thrown. The converted value is guaranteed to match the field's
4252 type and can be indexed by SE without any additional handling.
4253
4254 @param[in] wr Source data
4255 @param[in] no_error Whether an error should be thrown if value can't be
4256 coerced. Error should be thrown when inserting data
4257 into the index, and shouldn't be thrown when the range
4258 optimizer tests index applicability.
4259 @param[out] coerced The converted value. Can be nullptr if no_error is
4260 true.
4261
4262 @returns
4263 true conversion failed
4264 false conversion succeeded
4265 */
4266 bool coerce_json_value(const Json_wrapper *wr, bool no_error,
4267 Json_wrapper *coerced) const;
4268
4269 /**
4270 Get name of the index defined over this field.
4271
4272 Since typed array fields can be created only as an underlying GC field of
4273 a multi-valued functional index, there's always only one index defined
4274 over the field.
4275
4276 @returns
4277 name of the index defined over the field.
4278 */
4279 const char *get_index_name() const;
4280 uint32 get_length_bytes() const override {
4281 assert(m_elt_type == MYSQL_TYPE_VARCHAR);
4282 return field_length > 255 ? 2 : 1;
4283 }
4285 size_t make_sort_key(uchar *to, size_t max_len) const override {
4286 // Not supported yet
4287 assert(false);
4288 // Dummy
4289 return Field_json::make_sort_key(to, max_len);
4290 }
4291 /**
4292 Create sort key out of given JSON value according to array's element type
4293
4294 @param wr JSON value to create sort key from
4295 @param to buffer to create sort key in
4296 @param length buffer's length
4297
4298 @returns
4299 actual sort key length
4300 */
4301 size_t make_sort_key(Json_wrapper *wr, uchar *to, size_t length) const;
4302 /**
4303 Save the field metadata for typed array fields.
4304
4305 Saved metadata contains element type (1 byte) and up to 3 bytes of
4306 metadata - the same as each respective Field class saves
4307 (e.g Field_new_decimal for DECIMAL type). The only difference is that
4308 for VARCHAR type length is stored in 3 bytes. This allows to store longer
4309 strings, as its supported by JSON storage.
4310
4311 @param metadata_ptr First byte of field metadata
4312
4313 @returns number of bytes written to metadata_ptr
4314 */
4315 int do_save_field_metadata(uchar *metadata_ptr) const override;
4317 return pack_length_no_ptr();
4318 }
4319 void sql_type(String &str) const final;
4320 void make_send_field(Send_field *field) const final;
4321 void set_field_index(uint16 f_index) final;
4322 Field *get_conv_field();
4323};
4324
4325class Field_enum : public Field_str {
4326 protected:
4328
4329 public:
4331 Field_enum(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
4332 uchar null_bit_arg, uchar auto_flags_arg,
4333 const char *field_name_arg, uint packlength_arg,
4334 TYPELIB *typelib_arg, const CHARSET_INFO *charset_arg)
4335 : Field_str(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
4336 field_name_arg, charset_arg),
4337 packlength(packlength_arg),
4338 typelib(typelib_arg) {
4340 }
4341 Field_enum(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg,
4342 uint packlength_arg, TYPELIB *typelib_arg,
4343 const CHARSET_INFO *charset_arg)
4344 : Field_enum(nullptr, len_arg,
4345 is_nullable_arg ? &dummy_null_buffer : nullptr, 0, NONE,
4346 field_name_arg, packlength_arg, typelib_arg, charset_arg) {}
4347 Field *new_field(MEM_ROOT *root, TABLE *new_table) const final;
4348 enum_field_types type() const final { return MYSQL_TYPE_STRING; }
4349 bool match_collation_to_optimize_range() const final { return false; }
4350 enum Item_result cmp_type() const final { return INT_RESULT; }
4351 enum Item_result cast_to_int_type() const final { return INT_RESULT; }
4352 enum ha_base_keytype key_type() const final;
4353 type_conversion_status store(const char *to, size_t length,
4354 const CHARSET_INFO *charset) override;
4355 type_conversion_status store(double nr) override;
4356 type_conversion_status store(longlong nr, bool unsigned_val) override;
4357 double val_real() const final;
4358 my_decimal *val_decimal(my_decimal *decimal_value) const final;
4359 longlong val_int() const final;
4360 String *val_str(String *, String *) const override;
4361 int cmp(const uchar *, const uchar *) const final;
4362 using Field_str::make_sort_key;
4363 size_t make_sort_key(uchar *buff, size_t length) const final;
4364 uint32 pack_length() const final { return (uint32)packlength; }
4365 void store_type(ulonglong value);
4366 void sql_type(String &str) const override;
4367 enum_field_types real_type() const override { return MYSQL_TYPE_ENUM; }
4368 uint pack_length_from_metadata(uint field_metadata) const final {
4369 return (field_metadata & 0x00ff);
4370 }
4371 uint row_pack_length() const final { return pack_length(); }
4372 bool zero_pack() const override { return false; }
4373 bool optimize_range(uint, uint) const final { return false; }
4374 bool eq_def(const Field *field) const final;
4375 bool has_charset() const override { return true; }
4376 /* enum and set are sorted as integers */
4377 const CHARSET_INFO *sort_charset() const final { return &my_charset_bin; }
4378 Field_enum *clone(MEM_ROOT *mem_root) const override {
4379 assert(real_type() == MYSQL_TYPE_ENUM);
4380 return new (mem_root) Field_enum(*this);
4381 }
4382 uchar *pack(uchar *to, const uchar *from, size_t max_length) const final;
4383 const uchar *unpack(uchar *to, const uchar *from, uint param_data) final;
4384
4385 private:
4386 int do_save_field_metadata(uchar *first_byte) const final;
4387 uint is_equal(const Create_field *new_field) const final;
4388};
4389
4390class Field_set final : public Field_enum {
4391 public:
4392 Field_set(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
4393 uchar null_bit_arg, uchar auto_flags_arg,
4394 const char *field_name_arg, uint32 packlength_arg,
4395 TYPELIB *typelib_arg, const CHARSET_INFO *charset_arg)
4396 : Field_enum(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, auto_flags_arg,
4397 field_name_arg, packlength_arg, typelib_arg, charset_arg),
4398 empty_set_string("", 0, charset_arg) {
4401 }
4402 Field_set(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg,
4403 uint32 packlength_arg, TYPELIB *typelib_arg,
4404 const CHARSET_INFO *charset_arg)
4405 : Field_set(nullptr, len_arg,
4406 is_nullable_arg ? &dummy_null_buffer : nullptr, 0, NONE,
4407 field_name_arg, packlength_arg, typelib_arg, charset_arg) {}
4408 type_conversion_status store(const char *to, size_t length,
4409 const CHARSET_INFO *charset) final;
4411 if (nr < LLONG_MIN)
4412 return Field_set::store(static_cast<longlong>(LLONG_MIN), false);
4413 if (nr > LLONG_MAX_DOUBLE)
4414 return Field_set::store(static_cast<longlong>(LLONG_MAX), false);
4415 return Field_set::store(static_cast<longlong>(nr), false);
4416 }
4417 type_conversion_status store(longlong nr, bool unsigned_val) final;
4418 bool zero_pack() const final { return true; }
4419 String *val_str(String *, String *) const final;
4420 void sql_type(String &str) const final;
4422 bool has_charset() const final { return true; }
4424 assert(real_type() == MYSQL_TYPE_SET);
4425 return new (mem_root) Field_set(*this);
4426 }
4427
4428 private:
4430};
4431
4432/*
4433 Note:
4434 To use Field_bit::cmp_binary() you need to copy the bits stored in
4435 the beginning of the record (the NULL bytes) to each memory you
4436 want to compare (where the arguments point).
4437
4438 This is the reason:
4439 - Field_bit::cmp_binary() is only implemented in the base class
4440 (Field::cmp_binary()).
4441 - Field::cmp_binary() currently uses pack_length() to calculate how
4442 long the data is.
4443 - pack_length() includes size of the bits stored in the NULL bytes
4444 of the record.
4445*/
4446class Field_bit : public Field {
4447 public:
4448 uchar *bit_ptr; // position in record where 'uneven' bits store
4449 uchar bit_ofs; // offset to 'uneven' high bits
4450 uint bit_len; // number of 'uneven' high bits
4452 Field_bit(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
4453 uchar null_bit_arg, uchar *bit_ptr_arg, uchar bit_ofs_arg,
4454 uchar auto_flags_arg, const char *field_name_arg);
4455 enum_field_types type() const final { return MYSQL_TYPE_BIT; }
4456 enum ha_base_keytype key_type() const override { return HA_KEYTYPE_BIT; }
4457 uint32 max_display_length() const final { return field_length; }
4458 Item_result result_type() const final { return INT_RESULT; }
4460 type_conversion_status store(const char *to, size_t length,
4461 const CHARSET_INFO *charset) override;
4462 type_conversion_status store(double nr) final;
4463 type_conversion_status store(longlong nr, bool unsigned_val) final;
4465 double val_real() const final;
4466 longlong val_int() const final;
4467 String *val_str(String *, String *) const final;
4468 bool str_needs_quotes() const final { return true; }
4469 my_decimal *val_decimal(my_decimal *) const final;
4470 int cmp(const uchar *a, const uchar *b) const final {
4471 assert(ptr == a || ptr == b);
4472 const uint cmp_len = bytes_in_rec + (bit_len != 0 ? 1 : 0);
4473 if (ptr == a)
4474 return Field_bit::key_cmp(b, cmp_len);
4475 else
4476 return -Field_bit::key_cmp(a, cmp_len);
4477 }
4478 int cmp_binary_offset(ptrdiff_t row_offset) const final {
4479 return cmp_offset(row_offset);
4480 }
4481 int cmp_max(const uchar *a, const uchar *b, uint max_length) const final;
4482 int key_cmp(const uchar *a, const uchar *b) const final {
4483 return cmp_binary(a, b);
4484 }
4485 int key_cmp(const uchar *str, uint length) const final;
4486 int cmp_offset(ptrdiff_t row_offset) const final;
4487 void get_image(uchar *buff, size_t length, const CHARSET_INFO *) const final {
4488 get_key_image(buff, length, itRAW);
4489 }
4490 void set_image(const uchar *buff, size_t length,
4491 const CHARSET_INFO *cs) final {
4492 Field_bit::store(pointer_cast<const char *>(buff), length, cs);
4493 }
4494 size_t get_key_image(uchar *buff, size_t length, imagetype type) const final;
4495 void set_key_image(const uchar *buff, size_t length) final {
4496 Field_bit::store(pointer_cast<const char *>(buff), length, &my_charset_bin);
4497 }
4499 size_t make_sort_key(uchar *buff, size_t length) const final {
4500 get_key_image(buff, length, itRAW);
4501 return length;
4502 }
4503 uint32 pack_length() const final { return (uint32)(field_length + 7) / 8; }
4504 uint32 pack_length_in_rec() const final { return bytes_in_rec; }
4505 uint pack_length_from_metadata(uint field_metadata) const final;
4506 uint row_pack_length() const final {
4507 return (bytes_in_rec + ((bit_len > 0) ? 1 : 0));
4508 }
4509 bool compatible_field_size(uint metadata, Relay_log_info *, uint16 mflags,
4510 int *order_var) const final;
4511 void sql_type(String &str) const override;
4512 uchar *pack(uchar *to, const uchar *from, size_t max_length) const final;
4513 const uchar *unpack(uchar *to, const uchar *from, uint param_data) final;
4514 void set_default() final;
4515
4516 Field *new_key_field(MEM_ROOT *root, TABLE *new_table, uchar *new_ptr,
4517 uchar *new_null_ptr, uint new_null_bit) const final;
4518 void set_bit_ptr(uchar *bit_ptr_arg, uchar bit_ofs_arg) {
4519 bit_ptr = bit_ptr_arg;
4520 bit_ofs = bit_ofs_arg;
4521 }
4522 bool eq(const Field *field) const final {
4523 return (Field::eq(field) &&
4524 bit_ptr == down_cast<const Field_bit *>(field)->bit_ptr &&
4525 bit_ofs == down_cast<const Field_bit *>(field)->bit_ofs);
4526 }
4527 uint is_equal(const Create_field *new_field) const final;
4528 void move_field_offset(ptrdiff_t ptr_diff) final {
4529 Field::move_field_offset(ptr_diff);
4530 if (bit_ptr != nullptr) bit_ptr += ptr_diff;
4531 }
4532 void hash(ulong *nr, ulong *nr2) const final;
4533 Field_bit *clone(MEM_ROOT *mem_root) const override {
4534 assert(type() == MYSQL_TYPE_BIT);
4535 return new (mem_root) Field_bit(*this);
4536 }
4537
4538 private:
4539 int do_save_field_metadata(uchar *first_byte) const final;
4540};
4541
4542/**
4543 BIT field represented as chars for non-MyISAM tables.
4544
4545 @todo The inheritance relationship is backwards since Field_bit is
4546 an extended version of Field_bit_as_char and not the other way
4547 around. Hence, we should refactor it to fix the hierarchy order.
4548 */
4549class Field_bit_as_char final : public Field_bit {
4550 public:
4551 Field_bit_as_char(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
4552 uchar null_bit_arg, uchar auto_flags_arg,
4553 const char *field_name_arg);
4554 Field_bit_as_char(uint32 len_arg, bool is_nullable_arg,
4555 const char *field_name_arg)
4556 : Field_bit_as_char(nullptr, len_arg,
4557 is_nullable_arg ? &dummy_null_buffer : nullptr, 0,
4558 NONE, field_name_arg) {}
4559 enum ha_base_keytype key_type() const final { return HA_KEYTYPE_BINARY; }
4560 type_conversion_status store(const char *to, size_t length,
4561 const CHARSET_INFO *charset) final;
4562 // Inherit the store() overloads that have not been overridden.
4563 using Field_bit::store;
4564 void sql_type(String &str) const final;
4566 return new (mem_root) Field_bit_as_char(*this);
4567 }
4568};
4569
4570/// This function should only be called from legacy code.
4571Field *make_field(MEM_ROOT *mem_root_arg, TABLE_SHARE *share, uchar *ptr,
4572 size_t field_length, uchar *null_pos, uchar null_bit,
4573 enum_field_types field_type,
4576 TYPELIB *interval, const char *field_name, bool is_nullable,
4577 bool is_zerofill, bool is_unsigned, uint decimals,
4578 bool treat_bit_as_char, uint pack_length_override,
4579 std::optional<gis::srid_t> srid, bool is_array);
4580
4581/**
4582 Instantiates a Field object with the given name and record buffer values.
4583 @param create_field The column meta data.
4584 @param share The table share object.
4585
4586 @param field_name Create_field::field_name is overridden with this value
4587 when instantiating the Field object.
4588 @param field_length Create_field::length is overridden with this value
4589 when instantiating the Field object.
4590
4591 @param ptr The address of the data bytes.
4592 @param null_pos The address of the null bytes.
4593 @param null_bit The position of the column's null bit within the row's null
4594 bytes.
4595*/
4596Field *make_field(const Create_field &create_field, TABLE_SHARE *share,
4597 const char *field_name, size_t field_length, uchar *ptr,
4598 uchar *null_pos, size_t null_bit);
4599
4600/**
4601 Instantiates a Field object with the given record buffer values.
4602 @param create_field The column meta data.
4603 @param share The table share object.
4604 @param ptr The start of the record buffer.
4605 @param null_pos The address of the null bytes.
4606
4607 @param null_bit The position of the column's null bit within the row's null
4608 bytes.
4609*/
4610Field *make_field(const Create_field &create_field, TABLE_SHARE *share,
4611 uchar *ptr, uchar *null_pos, size_t null_bit);
4612
4613/**
4614 Instantiates a Field object without a record buffer.
4615 @param create_field The column meta data.
4616 @param share The table share object.
4617*/
4618Field *make_field(const Create_field &create_field, TABLE_SHARE *share);
4619
4620/*
4621 A class for sending info to the client
4622*/
4623
4625 public:
4626 const char *db_name;
4628 const char *col_name, *org_col_name;
4629 ulong length;
4632 /*
4633 true <=> source item is an Item_field. Needed to workaround lack of
4634 architecture in legacy Protocol_text implementation. Needed only for
4635 Protocol_classic and descendants.
4636 */
4637 bool field;
4638 Send_field() = default;
4639};
4640
4642 /**
4643 Convenience definition of a copy function returned by
4644 get_copy_func. The parameters are:
4645 Copy_field* Instance of this class. Used for accessing 'tmp' and
4646 calling invoke_do_copy2().
4647 const Field* Field copying from.
4648 Field* Field copying to.
4649 Note that 'from' is 'm_to_field' if invoke_do_copy()
4650 is called with 'reverse' = true.
4651 */
4652 using Copy_func = void(Copy_field *, const Field *, Field *);
4653 Copy_func *get_copy_func();
4654
4655 public:
4656 String tmp; // For items
4657
4658 Copy_field() = default;
4659
4660 Copy_field(Field *to, Field *from) : Copy_field() { set(to, from); }
4661
4662 void set(Field *to, Field *from); // Field to field
4663
4664 private:
4665 void (*m_do_copy)(Copy_field *, const Field *, Field *);
4666 void (*m_do_copy2)(Copy_field *, const Field *,
4667 Field *); // Used to handle null values
4668
4669 Field *m_from_field{nullptr};
4670 Field *m_to_field{nullptr};
4671
4672 public:
4673 void invoke_do_copy(bool reverse = false);
4674 void invoke_do_copy2(const Field *from_field, Field *to_field);
4675
4676 Field *from_field() const { return m_from_field; }
4677
4678 Field *to_field() const { return m_to_field; }
4679};
4680
4683
4684/**
4685 Calculate the length of the in-memory representation of the column from
4686 information which can be retrieved from dd::Column or Ha_fk_column_type
4687 describing it.
4688
4689 This function calculates the amount of memory necessary to store values
4690 in the record buffer. It is used in cases when we want to calculate
4691 this value from the description of column in the form compatible with
4692 dd::Column without constructing full-blown Field object.
4693
4694 @note The implementation is based on Create_field::init() and
4695 Create_field::create_length_to_internal_length().
4696
4697 @param type Column DD type.
4698 @param char_length Column length as stored in DD.
4699 @param elements_count Number of elements in column of ENUM/SET type.
4700 @param treat_bit_as_char Indicates whether this BIT column is represented
4701 as char column internally.
4702 @param numeric_scale Column numeric scale as stored in DD.
4703 @param is_unsigned Column unsignedness.
4704*/
4705
4707 size_t elements_count, bool treat_bit_as_char,
4708 uint numeric_scale, bool is_unsigned);
4709
4711 uint32 decimals, bool is_unsigned, uint32 elements);
4714 bool no_conversions);
4716 int conversion_err,
4717 my_decimal *value);
4718
4719/**
4720 Generate a Create_field from an Item.
4721
4722 This function generates a Create_field from an Item by first creating a
4723 temporary table Field from the Item, and then creating the Create_field from
4724 this Field (there is currently no way to go directly from Item to
4725 Create_field). It is used several places:
4726 - In CREATE TABLE AS SELECT for creating the target table definition.
4727 - In functional indexes for creating the hidden generated column from the
4728 indexed expression.
4729
4730 @param thd Thread handler
4731 @param source_item The item to generate a Create_field from
4732 @param tmp_table A table object which is used to generate a temporary table
4733 field, as described above. This doesn't need to be an
4734 existing table.
4735 @return A Create_field generated from the input item, or nullptr
4736 in case of errors.
4737*/
4738Create_field *generate_create_field(THD *thd, Item *source_item,
4739 TABLE *tmp_table);
4740
4744}
4745
4746/**
4747 @returns the expression if the input field is a hidden generated column that
4748 represents a functional key part. If not, return the field name. In case of
4749 a functional index; the expression is allocated on the THD's MEM_ROOT.
4750*/
4751const char *get_field_name_or_expression(THD *thd, const Field *field);
4752
4753/**
4754 Perform per item-type checks to determine if the expression is allowed for
4755 a generated column, default value expression, a functional index or a check
4756 constraint. Note that validation of the specific function is done later in
4757 procedures open_table_from_share and fix_value_generator_fields.
4758
4759 @param expression the expression to check for validity
4760 @param name used for error reporting
4761 @param source Source of value generator(a generated column, a
4762 regular column with generated default value or
4763 a check constraint).
4764 @return false if ok, true otherwise
4765*/
4766bool pre_validate_value_generator_expr(Item *expression, const char *name,
4768#endif /* FIELD_INCLUDED */
unsigned int my_time_binary_length(unsigned int dec)
Calculate binary size of packed numeric time representation.
Definition: binary_log_funcs.cpp:56
unsigned int my_timestamp_binary_length(unsigned int dec)
Calculate on-disk size of a timestamp value.
Definition: binary_log_funcs.cpp:85
unsigned int my_datetime_binary_length(unsigned int dec)
Calculate binary size of packed datetime representation.
Definition: binary_log_funcs.cpp:70
Definition: sql_bitmap.h:138
Class is used as a BLOB field value storage for intermediate GROUP_CONCAT results.
Definition: table.h:1275
Definition: field.h:4641
String tmp
Definition: field.h:4656
Copy_field()=default
void(Copy_field *, const Field *, Field *) Copy_func
Convenience definition of a copy function returned by get_copy_func.
Definition: field.h:4652
Field * to_field() const
Definition: field.h:4678
Copy_field(Field *to, Field *from)
Definition: field.h:4660
Field * from_field() const
Definition: field.h:4676
This class is a substitute for the Field classes during CREATE TABLE.
Definition: field.h:1872
my_decimal * val_decimal(my_decimal *) const final
Definition: field.h:1913
type_conversion_status store(longlong, bool) final
Definition: field.h:1897
const Create_field * m_field
Definition: field.h:1873
Create_field_wrapper(const Create_field *fld)
Definition: field.cc:10402
size_t make_sort_key(uchar *, size_t) const final
Writes a copy of the current value in the record buffer, suitable for sorting using byte-by-byte comp...
Definition: field.h:1927
int cmp(const uchar *, const uchar *) const final
Definition: field.h:1921
void sql_type(String &) const final
Definition: field.h:1925
Item_result numeric_context_result_type() const final
Returns Item_result type of a field when it appears in numeric context such as: SELECT time_column + ...
Definition: field.cc:10415
Item_result result_type() const final
Definition: field.cc:10411
longlong val_int(void) const final
Definition: field.h:1909
String * val_str(String *, String *) const final
Definition: field.h:1917
type_conversion_status store(const char *, size_t, const CHARSET_INFO *) final
Definition: field.h:1888
type_conversion_status store(double) final
Definition: field.h:1893
uint32 pack_length() const final
Definition: field.cc:10428
double val_real(void) const final
Definition: field.h:1905
const CHARSET_INFO * charset() const final
Definition: field.cc:10424
Field * clone(MEM_ROOT *mem_root) const final
Makes a shallow copy of the Field object.
Definition: field.h:1931
uint32 max_display_length() const final
Definition: field.cc:10432
type_conversion_status store_decimal(const my_decimal *) final
Definition: field.h:1901
enum_field_types type() const final
Definition: field.cc:10420
Create_field is a description a field/column that may or may not exists in a table.
Definition: create_field.h:51
Definition: sql_error.h:225
BIT field represented as chars for non-MyISAM tables.
Definition: field.h:4549
enum ha_base_keytype key_type() const final
Definition: field.h:4559
Field_bit_as_char(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg)
Definition: field.h:4554
Field_bit_as_char * clone(MEM_ROOT *mem_root) const final
Makes a shallow copy of the Field object.
Definition: field.h:4565
Definition: field.h:4446
uchar * bit_ptr
Definition: field.h:4448
uchar bit_ofs
Definition: field.h:4449
bool eq(const Field *field) const final
Definition: field.h:4522
void get_image(uchar *buff, size_t length, const CHARSET_INFO *) const final
Definition: field.h:4487
uint row_pack_length() const final
Definition: field.h:4506
int cmp(const uchar *a, const uchar *b) const final
Definition: field.h:4470
enum_field_types type() const final
Definition: field.h:4455
uint bit_len
Definition: field.h:4450
void set_image(const uchar *buff, size_t length, const CHARSET_INFO *cs) final
Definition: field.h:4490
int cmp_binary_offset(ptrdiff_t row_offset) const final
Definition: field.h:4478
uint32 pack_length() const final
Definition: field.h:4503
Field_bit * clone(MEM_ROOT *mem_root) const override
Makes a shallow copy of the Field object.
Definition: field.h:4533
uint bytes_in_rec
Definition: field.h:4451
uint32 pack_length_in_rec() const final
Definition: field.h:4504
uint32 max_display_length() const final
Definition: field.h:4457
void set_key_image(const uchar *buff, size_t length) final
Definition: field.h:4495
enum ha_base_keytype key_type() const override
Definition: field.h:4456
type_conversion_status store(const char *to, size_t length, const CHARSET_INFO *charset) override
Definition: field.cc:8705
size_t make_sort_key(uchar *buff, size_t length) const final
Writes a copy of the current value in the record buffer, suitable for sorting using byte-by-byte comp...
Definition: field.h:4499
Item_result result_type() const final
Definition: field.h:4458
void move_field_offset(ptrdiff_t ptr_diff) final
Definition: field.h:4528
int key_cmp(const uchar *a, const uchar *b) const final
Definition: field.h:4482
Definition: field.h:3578
type_conversion_status store(const char *to, size_t length, const CHARSET_INFO *charset) override
Definition: field.cc:7087
bool match_collation_to_optimize_range() const override
Definition: field.h:3703
const uchar * data_ptr() const final
Get a const pointer to the BLOB data of this field.
Definition: field.h:3765
String old_value
In order to support update of virtual generated columns of blob type, we need to allocate the space b...
Definition: field.h:3606
const uchar * get_blob_data() const
Get a const pointer to the BLOB data of this field.
Definition: field.h:3758
size_t get_field_buffer_size()
Definition: field.h:3746
bool m_uses_backup
Whether the field uses table's backup value storage.
Definition: field.h:3654
Field_blob(const Field_blob &field)
Copy static information and reset dynamic information.
Definition: field.h:3687
Field_blob * clone(MEM_ROOT *mem_root) const override
Makes a shallow copy of the Field object.
Definition: field.h:3796
uint32 pack_length_no_ptr() const
Return the packed length without the pointer size added.
Definition: field.h:3741
uint row_pack_length() const final
Definition: field.h:3742
uint packlength
The number of bytes used to represent the length of the blob.
Definition: field.h:3592
void set_keep_old_value(bool old_value_flag)
Mark that the BLOB stored in value should be copied before updating it.
Definition: field.h:3831
uint32 pack_length() const final
Definition: field.h:3729
void store_length(uint32 number)
Definition: field.h:3748
enum_field_types type() const override
Definition: field.h:3702
uchar * get_blob_data(ptrdiff_t row_offset=0)
Get a non-const pointer to the BLOB data of this field.
Definition: field.h:3760
Field_blob(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg, const CHARSET_INFO *cs, bool set_packlength)
Definition: field.h:3671
uint32 max_data_length() const final
Get the maximum size of the data in packed format.
Definition: field.h:3743
static uchar * get_blob_data(const uchar *position)
Get the BLOB data pointer stored at the specified position in the record buffer.
Definition: field.h:3772
uint32 key_length() const override
Definition: field.h:3726
String value
The 'value'-object is a cache fronting the storage engine.
Definition: field.h:3597
void keep_old_value()
Save the current BLOB value to avoid that it gets overwritten.
Definition: field.h:3877
void set_ptr(const uchar *length, const uchar *data)
Definition: field.h:3779
int cmp(const uchar *a, const uchar *b) const final
Definition: field.h:3717
size_t make_sort_key(uchar *buff, size_t length) const override
Writes a copy of the current value in the record buffer, suitable for sorting using byte-by-byte comp...
Definition: field.cc:7291
void store_in_allocated_space(const char *from, uint32 length)
Use to store the blob value into an allocated space.
Definition: field.h:3894
enum ha_base_keytype key_type() const override
Definition: field.h:3704
void set_ptr_offset(ptrdiff_t ptr_diff, uint32 length, const uchar *data)
Definition: field.h:3783
bool has_charset() const override
Definition: field.h:3811
void store_ptr_and_length(const char *from, uint32 length)
Store ptr and length.
Definition: field.h:3661
void set_ptr(uint32 length, const uchar *data)
Definition: field.h:3788
String m_blob_backup
Backup String for table's blob fields.
Definition: field.h:3647
uint32 data_length(ptrdiff_t row_offset=0) const final
Definition: field.h:3751
bool m_keep_old_value
Whether we need to move the content of 'value' to 'old_value' before updating the BLOB stored in 'val...
Definition: field.h:3627
Definition: field.h:3317
enum_field_types type() const final
Definition: field.h:3347
uchar * pack(uchar *to, const uchar *from, size_t max_length) const final
Pack the field into a format suitable for storage and transfer.
Definition: field.h:3365
const uchar * unpack(uchar *to, const uchar *from, uint param_data) final
Unpack a field from row data.
Definition: field.h:3368
enum ha_base_keytype key_type() const final
Definition: field.h:3348
Field_datetime * clone(MEM_ROOT *mem_root) const final
Makes a shallow copy of the Field object.
Definition: field.h:3361
Field_datetime(const char *field_name_arg)
Definition: field.h:3344
bool zero_pack() const final
Definition: field.h:3359
Field_datetime(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg)
DATETIME columns can be defined as having CURRENT_TIMESTAMP as the default value on inserts or update...
Definition: field.h:3340
Definition: field.h:3377
uint pack_length_from_metadata(uint field_metadata) const final
Definition: field.h:3421
enum_field_types real_type() const final
Definition: field.h:3418
Field_datetimef * clone(MEM_ROOT *mem_root) const final
Makes a shallow copy of the Field object.
Definition: field.h:3412
enum_field_types type() const final
Definition: field.h:3417
Field_datetimef(bool is_nullable_arg, const char *field_name_arg, uint8 dec_arg)
Constructor for Field_datetimef.
Definition: field.h:3407
bool zero_pack() const final
Definition: field.h:3426
uint32 pack_length() const final
Definition: field.h:3420
enum_field_types binlog_type() const final
Definition: field.h:3419
Field_datetimef(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg, uint8 dec_arg)
Constructor for Field_datetimef.
Definition: field.h:3395
Definition: field.h:2082
enum ha_base_keytype key_type() const final
Definition: field.h:2091
const uchar * unpack(uchar *to, const uchar *from, uint param_data) final
Unpack a field from row data.
Definition: field.h:2111
enum_field_types type() const final
Definition: field.h:2090
uchar * pack(uchar *to, const uchar *from, size_t max_length) const final
Pack the field into a format suitable for storage and transfer.
Definition: field.h:2114
Field_decimal(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg, uint8 dec_arg, bool zero_arg, bool unsigned_arg)
Definition: field.h:2084
Field_decimal * clone(MEM_ROOT *mem_root) const final
Makes a shallow copy of the Field object.
Definition: field.h:2107
Definition: field.h:2481
Field_double(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg, uint8 dec_arg, bool unsigned_arg)
Definition: field.h:2494
Field_double * clone(MEM_ROOT *mem_root) const final
Makes a shallow copy of the Field object.
Definition: field.h:2521
enum ha_base_keytype key_type() const final
Definition: field.h:2507
Field_double(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg, uint8 dec_arg, bool zero_arg, bool unsigned_arg)
Definition: field.h:2483
Field_double(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg, uint8 dec_arg)
Definition: field.h:2489
ulonglong get_max_int_value() const final
Get the upper limit of the MySQL integral and floating-point type.
Definition: field.h:2526
Field_double(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg, uint8 dec_arg, bool unsigned_arg, bool not_fixed_arg)
Definition: field.h:2499
enum_field_types type() const final
Definition: field.h:2506
Definition: field.h:4325
bool has_charset() const override
Definition: field.h:4375
bool optimize_range(uint, uint) const final
Whether this field can be used for index range scans when in the given keypart of the given index.
Definition: field.h:4373
uint pack_length_from_metadata(uint field_metadata) const final
Definition: field.h:4368
Field_enum(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg, uint packlength_arg, TYPELIB *typelib_arg, const CHARSET_INFO *charset_arg)
Definition: field.h:4331
enum_field_types real_type() const override
Definition: field.h:4367
bool match_collation_to_optimize_range() const final
Definition: field.h:4349
Field_enum * clone(MEM_ROOT *mem_root) const override
Makes a shallow copy of the Field object.
Definition: field.h:4378
TYPELIB * typelib
Definition: field.h:4330
Field_enum(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg, uint packlength_arg, TYPELIB *typelib_arg, const CHARSET_INFO *charset_arg)
Definition: field.h:4341
uint packlength
Definition: field.h:4327
enum Item_result cast_to_int_type() const final
Definition: field.h:4351
const CHARSET_INFO * sort_charset() const final
Definition: field.h:4377
enum Item_result cmp_type() const final
Definition: field.h:4350
bool zero_pack() const override
Definition: field.h:4372
uint row_pack_length() const final
Definition: field.h:4371
enum_field_types type() const final
Definition: field.h:4348
Definition: field.h:2437
ulonglong get_max_int_value() const final
Get the upper limit of the MySQL integral and floating-point type.
Definition: field.h:2470
Field_float(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg, uint8 dec_arg, bool zero_arg, bool unsigned_arg)
Definition: field.h:2439
Field_float(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg, uint8 dec_arg, bool unsigned_arg)
Definition: field.h:2445
Field_float * clone(MEM_ROOT *mem_root) const final
Makes a shallow copy of the Field object.
Definition: field.h:2465
enum ha_base_keytype key_type() const final
Definition: field.h:2451
enum_field_types type() const final
Definition: field.h:2450
Definition: field.h:3918
std::optional< gis::srid_t > get_srid() const
Definition: field.h:3972
enum geometry_type geom_type
Definition: field.h:3926
type_conversion_status reset() final
Non-nullable GEOMETRY types cannot have defaults, but the underlying blob must still be reset.
Definition: field.h:3957
geometry_type get_geometry_type() const final
Definition: field.h:3965
Field_geom * clone(MEM_ROOT *mem_root) const final
Makes a shallow copy of the Field object.
Definition: field.h:3966
Field_geom(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg, enum geometry_type geom_type_arg, std::optional< gis::srid_t > srid)
Definition: field.h:3936
bool match_collation_to_optimize_range() const final
Definition: field.h:3944
const std::optional< gis::srid_t > m_srid
Definition: field.h:3920
Field_geom(uchar *ptr_arg, uchar *null_ptr_arg, uint null_bit_arg, uchar auto_flags_arg, const char *field_name_arg, TABLE_SHARE *share, uint blob_pack_length, enum geometry_type geom_type_arg, std::optional< gis::srid_t > srid)
Definition: field.h:3928
enum_field_types type() const final
Definition: field.h:3943
enum ha_base_keytype key_type() const final
Definition: field.h:3942
A field that stores a JSON value.
Definition: field.h:3976
size_t make_sort_key(uchar *to, size_t length) const override
Writes a copy of the current value in the record buffer, suitable for sorting using byte-by-byte comp...
Definition: field.cc:8044
Field_json(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg)
Definition: field.h:3987
bool has_charset() const final
JSON columns don't have an associated charset.
Definition: field.h:4011
Field_json(uchar *ptr_arg, uchar *null_ptr_arg, uint null_bit_arg, uchar auto_flags_arg, const char *field_name_arg, TABLE_SHARE *share, uint blob_pack_length)
Definition: field.h:3981
const CHARSET_INFO * charset() const override
Return a text charset so that string functions automatically convert the field value to string and tr...
Definition: field.h:3998
const CHARSET_INFO * sort_charset() const final
Sort should treat the field as binary and not attempt any conversions.
Definition: field.h:4005
enum_field_types type() const override
Definition: field.h:3991
Definition: field.h:2334
Field_long * clone(MEM_ROOT *mem_root) const final
Makes a shallow copy of the Field object.
Definition: field.h:2369
enum_field_types type() const final
Definition: field.h:2349
uchar * pack(uchar *to, const uchar *from, size_t max_length) const final
Pack the field into a format suitable for storage and transfer.
Definition: field.h:2373
uint32 max_display_length() const final
Definition: field.h:2366
enum ha_base_keytype key_type() const final
Definition: field.h:2350
enum Item_result result_type() const final
Definition: field.h:2348
Field_long(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg, bool unsigned_arg)
Definition: field.h:2343
ulonglong get_max_int_value() const final
Get the upper limit of the MySQL integral and floating-point type.
Definition: field.h:2381
const uchar * unpack(uchar *to, const uchar *from, uint param_data) final
Unpack a field from row data.
Definition: field.h:2376
Field_long(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg, bool zero_arg, bool unsigned_arg)
Definition: field.h:2338
Definition: field.h:2386
ulonglong get_max_int_value() const final
Get the upper limit of the MySQL integral and floating-point type.
Definition: field.h:2432
Field_longlong(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg, bool zero_arg, bool unsigned_arg)
Definition: field.h:2390
enum_field_types type() const final
Definition: field.h:2401
uchar * pack(uchar *to, const uchar *from, size_t max_length) const final
Pack the field into a format suitable for storage and transfer.
Definition: field.h:2424
uint32 max_display_length() const final
Definition: field.h:2419
enum Item_result result_type() const final
Definition: field.h:2400
Field_longlong * clone(MEM_ROOT *mem_root) const final
Makes a shallow copy of the Field object.
Definition: field.h:2420
bool can_be_compared_as_longlong() const final
Definition: field.h:2418
const uchar * unpack(uchar *to, const uchar *from, uint param_data) final
Unpack a field from row data.
Definition: field.h:2427
Field_longlong(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg, bool unsigned_arg)
Definition: field.h:2395
enum ha_base_keytype key_type() const final
Definition: field.h:2402
Definition: field.h:2030
bool is_updatable() const final
Checks whether a string field is part of write_set.
Definition: field.cc:10343
type_conversion_status report_if_important_data(const char *ptr, const char *end, bool count_spaces)
Definition: field.cc:6100
uint32 max_data_length() const override
Get the maximum size of the data in packed format.
Definition: field.cc:6231
type_conversion_status check_string_copy_error(const char *well_formed_error_pos, const char *cannot_convert_error_pos, const char *from_end_pos, const char *end, bool count_spaces, const CHARSET_INFO *cs)
Report "not well formed" or "cannot convert" error after storing a character string info a field.
Definition: field.cc:6057
Field_longstr(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg, const CHARSET_INFO *charset_arg)
Definition: field.h:2043
type_conversion_status store_decimal(const my_decimal *d) override
Decimal representation of Field_str.
Definition: field.cc:6225
Definition: field.h:2294
uint32 max_display_length() const final
Definition: field.h:2324
enum Item_result result_type() const final
Definition: field.h:2306
Field_medium * clone(MEM_ROOT *mem_root) const final
Makes a shallow copy of the Field object.
Definition: field.h:2325
Field_medium(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg, bool unsigned_arg)
Definition: field.h:2301
ulonglong get_max_int_value() const final
Get the upper limit of the MySQL integral and floating-point type.
Definition: field.h:2329
enum_field_types type() const final
Definition: field.h:2307
enum ha_base_keytype key_type() const final
Definition: field.h:2308
Field_medium(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg, bool zero_arg, bool unsigned_arg)
Definition: field.h:2296
Definition: field.h:2120
uint precision
Definition: field.h:2138
enum_field_types type() const final
Definition: field.h:2153
Field_new_decimal * clone(MEM_ROOT *mem_root) const final
Makes a shallow copy of the Field object.
Definition: field.h:2182
uint32 max_display_length() const final
Definition: field.h:2176
uint bin_size
Definition: field.h:2139
Item_result result_type() const final
Definition: field.h:2155
uint32 pack_length() const final
Definition: field.h:2177
void set_keep_precision(bool arg)
Definition: field.h:2189
enum ha_base_keytype key_type() const final
Definition: field.h:2154
Definition: field.h:3111
bool zero_pack() const final
Definition: field.h:3143
Field_newdate(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg)
Definition: field.h:3120
enum ha_base_keytype key_type() const final
Definition: field.h:3131
enum_field_types type() const final
Definition: field.h:3129
Field_newdate(bool is_nullable_arg, const char *field_name_arg)
Definition: field.h:3125
Field_newdate * clone(MEM_ROOT *mem_root) const final
Makes a shallow copy of the Field object.
Definition: field.h:3145
enum_field_types real_type() const final
Definition: field.h:3130
Definition: field.h:2539
int cmp(const uchar *, const uchar *) const final
Definition: field.h:2564
double val_real() const final
Definition: field.h:2557
enum_field_types type() const final
Definition: field.h:2546
type_conversion_status store(const char *, size_t, const CHARSET_INFO *) final
Definition: field.h:2547
type_conversion_status reset() final
Definition: field.h:2556
String * val_str(String *, String *value2) const final
Definition: field.h:2560
my_decimal * val_decimal(my_decimal *) const final
Definition: field.h:2559
type_conversion_status store(double) final
Store double value in Field_string or Field_varstring.
Definition: field.h:2551
longlong val_int() const final
Definition: field.h:2558
type_conversion_status store(longlong, bool) final
Definition: field.h:2552
size_t make_sort_key(uchar *, size_t len) const final
Writes a copy of the current value in the record buffer, suitable for sorting using byte-by-byte comp...
Definition: field.h:2566
Field_null(uchar *ptr_arg, uint32 len_arg, uchar auto_flags_arg, const char *field_name_arg, const CHARSET_INFO *cs)
Definition: field.h:2541
type_conversion_status store_decimal(const my_decimal *) final
Decimal representation of Field_str.
Definition: field.h:2553
uint32 max_display_length() const final
Definition: field.h:2569
uint32 pack_length() const final
Definition: field.h:2567
Field_null * clone(MEM_ROOT *mem_root) const final
Makes a shallow copy of the Field object.
Definition: field.h:2570
Definition: field.h:1937
uint repertoire() const final
Definition: field.h:1960
uint row_pack_length() const final
Definition: field.h:1971
uint decimals() const final
Definition: field.h:1963
bool zerofill
True if the column was declared with the ZEROFILL attribute.
Definition: field.h:1952
bool eq_def(const Field *field) const final
Definition: field.cc:8585
bool get_time(MYSQL_TIME *ltime) const override
Definition: field.cc:2045
my_decimal * val_decimal(my_decimal *) const override
Return decimal value of integer field.
Definition: field.cc:2032
bool is_unsigned() const final
Whether the field is signed or not.
Definition: field.h:1957
const CHARSET_INFO * charset() const final
Definition: field.h:1961
Field_num(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg, uint8 dec_arg, bool zero_arg, bool unsigned_arg)
Numeric fields base class constructor.
Definition: field.cc:1501
type_conversion_status check_int(const CHARSET_INFO *cs, const char *str, size_t length, const char *int_end, int error)
Test if given number is a int.
Definition: field.cc:1545
Item_result result_type() const override
Definition: field.h:1958
bool get_date(MYSQL_TIME *ltime, my_time_flags_t fuzzydate) const override
Definition: field.cc:2040
uint32 pack_length_from_metadata(uint) const override
Definition: field.h:1972
type_conversion_status get_int(const CHARSET_INFO *cs, const char *from, size_t len, longlong *rnd, ulonglong unsigned_max, longlong signed_min, longlong signed_max)
Definition: field.cc:1588
enum Derivation derivation() const final
Definition: field.h:1959
const uint8 dec
Definition: field.h:1946
const bool unsigned_flag
Whether the field is signed or not.
Definition: field.h:1943
uint is_equal(const Create_field *new_field) const override
Check whether two numeric fields can be considered 'equal' for table alteration purposes.
Definition: field.cc:8601
type_conversion_status store_time(MYSQL_TIME *ltime, uint8 dec) override
Store MYSQL_TIME value with the given amount of decimal digits into a field.
Definition: field.cc:1629
type_conversion_status store_decimal(const my_decimal *) override
Storing decimal in integer fields.
Definition: field.cc:2010
void prepend_zeros(String *value) const
Definition: field.cc:1514
Definition: field.h:2055
bool not_fixed
Definition: field.h:2057
uint32 max_display_length() const final
Definition: field.h:2077
Field_real(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg, uint8 dec_arg, bool zero_arg, bool unsigned_arg)
Definition: field.h:2064
Truncate_result
Definition: field.h:2058
Definition: field.h:4390
bool has_charset() const final
Definition: field.h:4422
const String empty_set_string
Definition: field.h:4429
Field_set * clone(MEM_ROOT *mem_root) const final
Makes a shallow copy of the Field object.
Definition: field.h:4423
enum_field_types real_type() const final
Definition: field.h:4421
type_conversion_status store(double nr) final
Store double value in Field_string or Field_varstring.
Definition: field.h:4410
Field_set(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg, uint32 packlength_arg, TYPELIB *typelib_arg, const CHARSET_INFO *charset_arg)
Definition: field.h:4402
Field_set(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg, uint32 packlength_arg, TYPELIB *typelib_arg, const CHARSET_INFO *charset_arg)
Definition: field.h:4392
bool zero_pack() const final
Definition: field.h:4418
type_conversion_status store(const char *to, size_t length, const CHARSET_INFO *charset) final
Definition: field.cc:8324
Definition: field.h:2243
uint32 max_display_length() const final
Definition: field.h:2275
ulonglong get_max_int_value() const final
Get the upper limit of the MySQL integral and floating-point type.
Definition: field.h:2289
const uchar * unpack(uchar *to, const uchar *from, uint param_data) final
Unpack a field from row data.
Definition: field.h:2284
Field_short(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg, bool zero_arg, bool unsigned_arg)
Definition: field.h:2245
Field_short(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg, bool unsigned_arg)
Definition: field.h:2250
enum_field_types type() const final
Definition: field.h:2258
uchar * pack(uchar *to, const uchar *from, size_t max_length) const final
Pack the field into a format suitable for storage and transfer.
Definition: field.h:2280
Field_short * clone(MEM_ROOT *mem_root) const final
Makes a shallow copy of the Field object.
Definition: field.h:2276
enum ha_base_keytype key_type() const final
Definition: field.h:2259
enum Item_result result_type() const final
Definition: field.h:2257
Field_short(uint32 len_arg, const char *field_name_arg, bool unsigned_arg)
Definition: field.h:2255
Definition: field.h:1984
enum Derivation field_derivation
Definition: field.h:1987
void set_field_length(uint32 length) final
Definition: field.h:2009
Item_result numeric_context_result_type() const final
Returns Item_result type of a field when it appears in numeric context such as: SELECT time_column + ...
Definition: field.h:1994
type_conversion_status store(double nr) override
Store double value in Field_string or Field_varstring.
Definition: field.cc:6160
type_conversion_status store(longlong nr, bool unsigned_val) override=0
uint is_equal(const Create_field *new_field) const override
Whether a field being created is type-compatible with an existing one.
Definition: field.cc:6195
type_conversion_status store(const char *to, size_t length, const CHARSET_INFO *cs) override=0
uint repertoire() const final
Definition: field.h:2003
type_conversion_status store_decimal(const my_decimal *) override
Decimal representation of Field_str.
Definition: field.cc:2087
uint decimals() const override
Definition: field.h:1995
uint32 max_display_length() const override
Definition: field.h:2018
bool binary() const override
Definition: field.h:2017
void set_charset(const CHARSET_INFO *charset_arg)
Definition: field.h:2005
Field_str(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg, const CHARSET_INFO *charset)
Definition: field.cc:2050
Item_result result_type() const override
Definition: field.h:1993
void make_send_field(Send_field *field) const override
Populates a Send_field object with metadata about the column represented by this Field object.
Definition: field.cc:2062
const CHARSET_INFO * charset() const override
Definition: field.h:2004
uint32 char_length_cache
Definition: field.h:2025
bool str_needs_quotes() const final
Definition: field.h:2019
void set_derivation(enum Derivation derivation_arg) final
Definition: field.h:2014
const CHARSET_INFO * field_charset
Definition: field.h:1986
enum Derivation derivation() const final
Definition: field.h:2013
Definition: field.h:3435
bool is_text_key_type() const final
Definition: field.h:3502
bool match_collation_to_optimize_range() const final
Definition: field.h:3449
uint row_pack_length() const final
Definition: field.h:3491
bool has_charset() const final
Definition: field.h:3494
type_conversion_status reset() final
Definition: field.h:3454
Field_string(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg, const CHARSET_INFO *cs)
Definition: field.h:3437
uint pack_length_from_metadata(uint field_metadata) const final
Definition: field.h:3483
enum ha_base_keytype key_type() const final
Definition: field.h:3450
bool zero_pack() const final
Definition: field.h:3453
Field_string * clone(MEM_ROOT *mem_root) const final
Makes a shallow copy of the Field object.
Definition: field.h:3497
Field_string(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg, const CHARSET_INFO *cs)
Definition: field.h:3442
enum_field_types type() const final
Definition: field.h:3448
Abstract class for types with date and time, with or without fractional part: DATETIME,...
Definition: field.h:2860
Field_temporal_with_date_and_time(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg, uint8 dec_arg)
Constructor for Field_temporal_with_date_and_time.
Definition: field.h:2897
virtual void store_timestamp_internal(const my_timeval *tm)=0
Store "struct timeval" value into field.
int do_save_field_metadata(uchar *metadata_ptr) const override
Retrieve the field metadata for fields.
Definition: field.h:2862
Abstract class for types with date and time, with fractional part: DATETIME, DATETIME(N),...
Definition: field.h:2911
int cmp(const uchar *a_ptr, const uchar *b_ptr) const final
Definition: field.h:2942
uint decimals() const final
Definition: field.h:2935
size_t make_sort_key(uchar *to, size_t length) const final
Writes a copy of the current value in the record buffer, suitable for sorting using byte-by-byte comp...
Definition: field.h:2938
int do_save_field_metadata(uchar *metadata_ptr) const final
Retrieve the field metadata for fields.
Definition: field.h:2913
uint row_pack_length() const final
Definition: field.h:2945
Field_temporal_with_date_and_timef(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg, uint8 dec_arg)
Constructor for Field_temporal_with_date_and_timef.
Definition: field.h:2928
const CHARSET_INFO * sort_charset() const final
Definition: field.h:2936
Abstract class for types with date with optional time, with or without fractional part: DATE,...
Definition: field.h:2793
bool get_time(MYSQL_TIME *ltime) const final
Definition: field.h:2848
virtual bool get_date_internal(MYSQL_TIME *ltime) const =0
Low level function to get value into MYSQL_TIME, without checking for being valid.
virtual bool get_date_internal_at_utc(MYSQL_TIME *ltime) const
Definition: field.h:2801
Field_temporal_with_date(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg, uint8 int_length_arg, uint8 dec_arg)
Constructor for Field_temporal.
Definition: field.h:2835
Definition: field.h:2580
Item_result numeric_context_result_type() const final
Returns Item_result type of a field when it appears in numeric context such as: SELECT time_column + ...
Definition: field.h:2765
virtual type_conversion_status convert_number_to_TIME(longlong nr, bool unsigned_val, int nanoseconds, MYSQL_TIME *ltime, int *warning)=0
Convert a number with fractional part with nanosecond precision into MYSQL_TIME, according to the fie...
type_conversion_status store(const char *str, size_t len, const CHARSET_INFO *cs) final
Store string into a date/time/datetime field.
Definition: field.cc:4595
enum Item_result cmp_type() const final
Definition: field.h:2768
uint repertoire() const final
Definition: field.h:2770
bool str_needs_quotes() const final
Definition: field.h:2763
virtual type_conversion_status store_internal(const MYSQL_TIME *ltime, int *error)=0
Low level routine to store a MYSQL_TIME value into a field.
bool can_be_compared_as_longlong() const final
Definition: field.h:2772
const CHARSET_INFO * charset() const final
Definition: field.h:2771
uint32 max_display_length() const final
Definition: field.h:2762
bool binary() const final
Definition: field.h:2773
my_time_flags_t date_flags() const
Flags that are passed as "flag" argument to check_date(), number_to_datetime(), str_to_datetime().
Definition: field.cc:4467
static uint8 normalize_dec(uint8 dec_arg)
Adjust number of decimal digits from DECIMAL_NOT_SPECIFIED to DATETIME_MAX_DECIMALS.
Definition: field.h:2588
uint8 get_dec() const
Definition: field.h:2783
virtual my_time_flags_t date_flags(const THD *thd) const
Flags that are passed as "flag" argument to check_date(), number_to_datetime(), str_to_datetime().
Definition: field.h:2707
virtual bool convert_str_to_TIME(const char *str, size_t len, const CHARSET_INFO *cs, MYSQL_TIME *ltime, MYSQL_TIME_STATUS *status)=0
Convert a string to MYSQL_TIME, according to the field type.
virtual type_conversion_status store_internal_adjust_frac(MYSQL_TIME *ltime, int *warnings)=0
Low level routine to store a MYSQL_TIME value into a field with rounding/truncation according to the ...
Item_result result_type() const final
Definition: field.h:2761
enum Derivation derivation() const final
Definition: field.h:2769
Field_temporal(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg, uint32 len_arg, uint8 dec_arg)
Constructor for Field_temporal.
Definition: field.h:2751
double val_real() const override
Definition: field.h:2779
uint8 dec
Definition: field.h:2582
Abstract class for TIME and TIME(N).
Definition: field.h:3155
type_conversion_status store_internal(const MYSQL_TIME *ltime, int *error) override=0
Low-level function to store MYSQL_TIME value.
Field_time_common(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg, uint8 dec_arg)
Constructor for Field_time_common.
Definition: field.h:3194
Definition: field.h:3210
bool zero_pack() const final
Definition: field.h:3233
enum ha_base_keytype key_type() const final
Definition: field.h:3223
Field_time * clone(MEM_ROOT *mem_root) const final
Makes a shallow copy of the Field object.
Definition: field.h:3234
enum_field_types type() const final
Definition: field.h:3222
Field_time(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg)
Definition: field.h:3216
Field_time(const char *field_name_arg)
Definition: field.h:3220
Definition: field.h:3243
enum_field_types real_type() const final
Definition: field.h:3284
uint decimals() const final
Definition: field.h:3282
uint row_pack_length() const final
Definition: field.h:3299
Field_timef(bool is_nullable_arg, const char *field_name_arg, uint8 dec_arg)
Constructor for Field_timef.
Definition: field.h:3274
int cmp(const uchar *a_ptr, const uchar *b_ptr) const final
Definition: field.h:3308
size_t make_sort_key(uchar *to, size_t length) const final
Writes a copy of the current value in the record buffer, suitable for sorting using byte-by-byte comp...
Definition: field.h:3304
int do_save_field_metadata(uchar *metadata_ptr) const final
Retrieve the field metadata for fields.
Definition: field.h:3245
Field_timef * clone(MEM_ROOT *mem_root) const final
Makes a shallow copy of the Field object.
Definition: field.h:3278
enum_field_types type() const final
Definition: field.h:3283
const CHARSET_INFO * sort_charset() const final
Definition: field.h:3302
bool zero_pack() const final
Definition: field.h:3301
uint pack_length_from_metadata(uint field_metadata) const final
Definition: field.h:3294
Field_timef(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg, uint8 dec_arg)
Constructor for Field_timef.
Definition: field.h:3264
enum_field_types binlog_type() const final
Definition: field.h:3285
Definition: field.h:2955
bool zero_pack() const final
Definition: field.h:2979
Field_timestamp * clone(MEM_ROOT *mem_root) const final
Makes a shallow copy of the Field object.
Definition: field.h:2983
uchar * pack(uchar *to, const uchar *from, size_t max_length) const final
Pack the field into a format suitable for storage and transfer.
Definition: field.h:2987
enum_field_types type() const final
Definition: field.h:2970
const uchar * unpack(uchar *to, const uchar *from, uint param_data) final
Unpack a field from row data.
Definition: field.h:2990
enum ha_base_keytype key_type() const final
Definition: field.h:2971
Definition: field.h:3014
bool zero_pack() const final
Definition: field.h:3052
uint pack_length_from_metadata(uint field_metadata) const final
Definition: field.h:3055
enum_field_types real_type() const final
Definition: field.h:3050
enum_field_types type() const final
Definition: field.h:3049
uint32 pack_length() const final
Definition: field.h:3054
enum_field_types binlog_type() const final
Definition: field.h:3051
Field_timestampf * clone(MEM_ROOT *mem_root) const final
Makes a shallow copy of the Field object.
Definition: field.h:3044
Definition: field.h:2192
ulonglong get_max_int_value() const final
Get the upper limit of the MySQL integral and floating-point type.
Definition: field.h:2238
Field_tiny(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg, bool zero_arg, bool unsigned_arg)
Definition: field.h:2194
uint32 max_display_length() const final
Definition: field.h:2222
enum_field_types type() const override
Definition: field.h:2205
uchar * pack(uchar *to, const uchar *from, size_t max_length) const final
Pack the field into a format suitable for storage and transfer.
Definition: field.h:2227
enum Item_result result_type() const final
Definition: field.h:2204
Field_tiny * clone(MEM_ROOT *mem_root) const override
Makes a shallow copy of the Field object.
Definition: field.h:2223
const uchar * unpack(uchar *to, const uchar *from, uint param_data) final
Unpack a field from row data.
Definition: field.h:2232
enum ha_base_keytype key_type() const final
Definition: field.h:2206
uint32 pack_length() const final
Definition: field.h:2220
Field_tiny(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg, bool unsigned_arg)
Definition: field.h:2199
Field that stores array of values of the same type.
Definition: field.h:4151
bool binary() const override
Definition: field.h:4194
enum_field_types m_elt_type
The array element's real type.
Definition: field.h:4155
bool is_array() const override
Whether the field is a typed array.
Definition: field.h:4191
uint decimals() const override
Definition: field.h:4193
const CHARSET_INFO * charset() const override
Return a text charset so that string functions automatically convert the field value to string and tr...
Definition: field.h:4198
enum_field_types real_type() const override
Definition: field.h:4184
uint pack_length_from_metadata(uint) const override
Definition: field.h:4316
bool match_collation_to_optimize_range() const override
Multi-valued index always works only as a pre-filter for actual condition check, and the latter alway...
Definition: field.h:4246
enum_field_types binlog_type() const override
Definition: field.h:4185
int key_cmp(const uchar *, const uchar *) const override
These methods are used by handler to prevent returning a row past the end_range during range access.
Definition: field.h:4221
uint m_elt_decimals
Element's decimals.
Definition: field.h:4157
const bool unsigned_flag
Definition: field.h:4160
enum_field_types type() const override
Definition: field.h:4181
uint32 get_length_bytes() const override
Return number of bytes the field's length takes.
Definition: field.h:4280
uint32 char_length() const override
maximum possible character length for blob.
Definition: field.h:4177
const CHARSET_INFO * m_elt_charset
Element's charset.
Definition: field.h:4159
bool is_unsigned() const final
Whether the field is signed or not.
Definition: field.h:4190
size_t make_sort_key(uchar *to, size_t max_len) const override
Writes a copy of the current value in the record buffer, suitable for sorting using byte-by-byte comp...
Definition: field.h:4285
Definition: field.h:3508
bool match_collation_to_optimize_range() const final
Definition: field.h:3519
uint32 pack_length() const final
Definition: field.h:3523
bool is_text_key_type() const final
Definition: field.h:3568
const uchar * data_ptr() const final
Return a const pointer to the actual data in the record buffer.
Definition: field.h:3567
bool zero_pack() const final
Definition: field.h:3522
Field_varstring * clone(MEM_ROOT *mem_root) const final
Makes a shallow copy of the Field object.
Definition: field.h:3560
bool has_charset() const final
Definition: field.h:3554
uint32 key_length() const final
Definition: field.h:3526
uint32 length_bytes
Definition: field.h:3573
enum_field_types type() const final
Definition: field.h:3518
uint32 get_length_bytes() const override
Return number of bytes the field's length takes.
Definition: field.h:3569
Definition: field.h:3083
Limits
Definition: field.h:3085
Field_year(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, const char *field_name_arg)
Definition: field.h:3086
Field_year * clone(MEM_ROOT *mem_root) const final
Makes a shallow copy of the Field object.
Definition: field.h:3105
enum_field_types type() const final
Definition: field.h:3093
Field_year(bool is_nullable_arg, const char *field_name_arg)
Definition: field.h:3090
Definition: field.h:575
Field(const Field &)=default
Key_map get_covering_prefix_keys() const
Get covering prefix keys.
Definition: field.cc:10166
uchar * pack(uchar *to) const
Definition: field.h:1514
uchar * pack_int16(uchar *to, const uchar *from, size_t max_length) const
Definition: field.cc:10299
virtual void set_default()
Definition: field.cc:10180
void reset_warnings()
Definition: field.h:875
virtual int cmp_binary(const uchar *a, const uchar *b, uint32 max_length=~0L) const
Definition: field.h:1183
virtual enum_field_types real_type() const
Definition: field.h:1156
virtual type_conversion_status store(double nr)=0
virtual bool pack_diff(uchar **to, ulonglong value_options) const
Write the field for the binary log in diff format.
Definition: field.h:1563
virtual uint max_packed_col_length() const
This is a wrapper around pack_length() used by filesort() to determine how many bytes we need for pac...
Definition: field.h:1574
Key_map part_of_sortkey
Definition: field.h:693
const char * orig_table_name
Pointer to original table name, only non-NULL for a temporary table.
Definition: field.h:685
virtual const uchar * data_ptr() const
Return a const pointer to the actual data in the record buffer.
Definition: field.h:1734
bool is_virtual_gcol() const
Definition: field.h:814
const uchar * unpack_int24(uchar *to, const uchar *from) const
Definition: field.cc:10316
virtual uint32 pack_length_in_rec() const
Definition: field.h:1058
const char ** table_name
Definition: field.h:686
uint null_offset() const
Definition: field.cc:10188
const uchar * unpack_int16(uchar *to, const uchar *from) const
Definition: field.cc:10305
virtual bool compatible_field_size(uint metadata, Relay_log_info *, uint16, int *order) const
Check to see if field size is compatible with destination.
Definition: field.cc:1850
imagetype
Definition: field.h:728
@ itRAW
Definition: field.h:728
@ itMBR
Definition: field.h:728
const CHARSET_INFO * charset_for_protocol() const
Definition: field.h:1586
void reset_tmp_nullable()
Turn off temporary nullability for the field.
Definition: field.h:885
virtual int do_save_field_metadata(uchar *metadata_ptr) const
Retrieve the field metadata for fields.
Definition: field.h:1839
virtual ulonglong get_max_int_value() const
Get the upper limit of the MySQL integral and floating-point type.
Definition: field.h:1722
void set_tmp_null()
Set field to temporary value NULL.
Definition: field.cc:1221
virtual longlong val_time_temporal() const
Returns TIME value in packed longlong format.
Definition: field.h:966
virtual bool send_to_protocol(Protocol *protocol) const
Send the value of this field over the protocol using the correct Protocol::store*() function which ma...
Definition: field.cc:1811
virtual uint decimals() const
Definition: field.h:1199
virtual Field * new_key_field(MEM_ROOT *root, TABLE *new_table, uchar *new_ptr, uchar *new_null_ptr, uint new_null_bit) const
Definition: field.cc:2168
uint32 field_length
Definition: field.h:741
static constexpr size_t MAX_SHORT_BLOB_WIDTH
Definition: field.h:735
virtual Item_result cast_to_int_type() const
Definition: field.h:1035
void set_null_ptr(uchar *p_null_ptr, uint p_null_bit)
Definition: field.h:1296
void copy_data(ptrdiff_t src_record_offset)
Definition: field.cc:1799
bool m_is_tmp_null
This is a flag with the following semantics:
Definition: field.h:663
static constexpr size_t MAX_LONG_BLOB_WIDTH
Definition: field.h:737
type_conversion_status store_time(MYSQL_TIME *ltime)
Store MYSQL_TYPE value into a field when the number of fractional digits is not important or is not k...
Definition: field.h:953
void operator=(Field &)=delete
virtual type_conversion_status validate_stored_val(THD *thd)
Definition: field.h:1709
static uchar dummy_null_buffer
Definition: field.h:676
virtual bool is_array() const
Whether the field is a typed array.
Definition: field.h:1789
virtual bool optimize_range(uint idx, uint part) const
Whether this field can be used for index range scans when in the given keypart of the given index.
Definition: field.cc:2136
bool has_insert_default_general_value_expression() const
Checks if the field is marked as having a general expression to generate default values.
Definition: field.h:595
Key_map key_start
Definition: field.h:689
void set_null(ptrdiff_t row_offset=0)
Set field to value NULL.
Definition: field.cc:1759
virtual type_conversion_status store_decimal(const my_decimal *d)=0
virtual bool binary() const
Definition: field.h:1151
longlong val_int(uchar *new_ptr)
Definition: field.h:1455
Value_generator * gcol_info
Definition: field.h:801
ha_storage_media field_storage_type() const
Definition: field.h:1690
int cmp(const uchar *str) const
Definition: field.h:1177
virtual bool str_needs_quotes() const
Definition: field.h:1019
static constexpr size_t MAX_VARCHAR_WIDTH
Definition: field.h:731
virtual void get_image(uchar *buff, size_t length, const CHARSET_INFO *) const
Definition: field.h:1405
static constexpr size_t MAX_TINY_BLOB_WIDTH
Definition: field.h:734
const char * field_name
Definition: field.h:686
void set_field_ptr(uchar *ptr_arg)
Definition: field.h:1752
void clear_flag(unsigned flag)
Definition: field.h:751
uchar * pack_int24(uchar *to, const uchar *from, size_t max_length) const
Definition: field.cc:10310
Value_generator * m_default_val_expr
Holds the expression to be used to generate default values.
Definition: field.h:817
const uchar * field_ptr() const
Return a const pointer to where the field is stored in the record buffer.
Definition: field.h:1742
virtual longlong val_date_temporal() const
Returns DATE/DATETIME value in packed longlong format.
Definition: field.h:975
virtual uint32 pack_length() const
Definition: field.h:1051
void set_hidden(dd::Column::enum_hidden_type hidden)
Sets the hidden type for this field.
Definition: field.h:824
LEX_CSTRING comment
Definition: field.h:687
uint16 m_field_index
Definition: field.h:746
virtual const CHARSET_INFO * charset() const
Definition: field.h:1584
void set_notnull(ptrdiff_t row_offset=0)
Set field to value NOT NULL.
Definition: field.cc:1774
virtual uint32 get_length_bytes() const
Return number of bytes the field's length takes.
Definition: field.h:1796
virtual size_t make_sort_key(uchar *buff, size_t length, size_t trunc_pos) const
Writes a copy of the current value in the record buffer, suitable for sorting using byte-by-byte comp...
Definition: field.h:1346
bool gcol_expr_is_equal(const Create_field *field) const
Check whether generated columns' expressions are the same.
Definition: field.cc:6190
virtual uint32 max_display_length() const =0
enum_auto_flags
Flags for Field::auto_flags / Create_field::auto_flags bitmaps.
Definition: field.h:710
@ ON_UPDATE_NOW
ON UPDATE CURRENT_TIMESTAMP.
Definition: field.h:714
@ GENERATED_FROM_EXPRESSION
DEFAULT (expression)
Definition: field.h:715
@ NONE
Definition: field.h:711
@ DEFAULT_NOW
DEFAULT CURRENT_TIMESTAMP.
Definition: field.h:713
@ NEXT_NUMBER
AUTO_INCREMENT.
Definition: field.h:712
String * val_int_as_str(String *val_buffer, bool unsigned_flag) const
Interpret field value as an integer but return the result as a string.
Definition: field.cc:1663
virtual uint32 data_length(ptrdiff_t row_offset=0) const
Definition: field.h:1075
virtual void set_image(const uchar *buff, size_t length, const CHARSET_INFO *)
Definition: field.h:1410
virtual bool has_charset() const
Definition: field.h:1590
virtual void set_derivation(enum Derivation)
Definition: field.h:1605
bool is_null_in_record(const uchar *record) const
Check if the Field has value NULL or the record specified by argument has value NULL for this Field.
Definition: field.h:1262
void reset_tmp_null()
Reset temporary NULL value for field.
Definition: field.h:890
virtual uchar * pack_with_metadata_bytes(uchar *to, const uchar *from, uint max_length) const
This function does the same thing as pack(), except for the difference that max_length does not mean ...
Definition: field.h:1536
virtual enum_field_types type() const =0
virtual bool zero_pack() const
Definition: field.h:1152
virtual void move_field_offset(ptrdiff_t ptr_diff)
Definition: field.h:1400
Key_map part_of_key
Keys that includes this field except of prefix keys.
Definition: field.h:690
virtual type_conversion_status store_packed(longlong nr)
Store a temporal value in packed longlong format into a field.
Definition: field.h:925
bool is_hidden_by_user() const
Definition: field.h:854
Field * new_field(MEM_ROOT *root, TABLE *new_table, uchar *new_ptr, uchar *new_null_ptr, uint new_null_bit) const
Definition: field.h:1368
bool handle_old_value() const
Whether field's old valued have to be handled.
Definition: field.h:1808
TABLE * table
Pointer to TABLE object that owns this field.
Definition: field.h:681
uint16 field_index() const
Returns field index.
Definition: field.h:1826
virtual type_conversion_status store(longlong nr, bool unsigned_val)=0
virtual bool get_timestamp(my_timeval *tm, int *warnings) const
Returns a UTC component in struct timeval format.
Definition: field.cc:2111
void move_field(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg)
Definition: field.h:1394
const uchar * unpack_int32(uchar *to, const uchar *from) const
Definition: field.cc:10327
virtual void init(TABLE *table_arg)
Definition: field.cc:10190
bool is_null(ptrdiff_t row_offset=0) const
Check whether the full table's row is NULL or the Field has value NULL.
Definition: field.h:1215
virtual my_decimal * val_decimal(my_decimal *) const =0
bool has_insert_default_datetime_value_expression() const
Checks if the field is marked as having a datetime value expression to generate default values on ins...
Definition: field.h:606
void evaluate_update_default_function()
Evaluates the UPDATE default function, if one exists, and stores the result in the record buffer.
Definition: field.cc:2187
LEX_CSTRING m_engine_attribute
Definition: field.h:782
void set_tmp_nullable()
Turn on temporary nullability for the field.
Definition: field.h:880
const uchar * unpack_int64(uchar *to, const uchar *from) const
Definition: field.cc:10338
virtual void set_field_index(uint16 field_index)
Sets field index.
Definition: field.h:1817
type_conversion_status check_constraints(int mysql_errno)
Check NOT NULL constraint on the field after temporary nullability is disabled.
Definition: field.cc:1716
Key_map part_of_prefixkey
Prefix keys.
Definition: field.h:692
bool is_real_null(ptrdiff_t row_offset=0) const
Check whether the Field has value NULL (temporary or actual).
Definition: field.h:1247
bool is_tmp_nullable() const
Definition: field.h:899
String * val_str(String *str, uchar *new_ptr)
Definition: field.h:1463
uchar null_bit
Definition: field.h:755
virtual double val_real() const =0
virtual bool can_be_compared_as_longlong() const
Definition: field.h:1363
virtual longlong val_int() const =0
uchar * pack_int32(uchar *to, const uchar *from, size_t max_length) const
Definition: field.cc:10321
bool m_is_tmp_nullable
Flag: if the NOT-NULL field can be temporary NULL.
Definition: field.h:653
virtual void make_send_field(Send_field *send_field) const
Populates a Send_field object with metadata about the column represented by this Field object.
Definition: field.cc:1947
virtual size_t make_sort_key(uchar *buff, size_t length) const =0
Writes a copy of the current value in the record buffer, suitable for sorting using byte-by-byte comp...
virtual const CHARSET_INFO * sort_charset() const
Definition: field.h:1589
virtual Item_result numeric_context_result_type() const
Returns Item_result type of a field when it appears in numeric context such as: SELECT time_column + ...
Definition: field.h:1031
bool m_indexed
True if this field belongs to some index (unlike part_of_key, the index might have only a prefix).
Definition: field.h:780
virtual int cmp_binary_offset(ptrdiff_t row_offset) const
Definition: field.h:1190
virtual bool is_updatable() const
Checks whether a string field is part of write_set.
Definition: field.h:1762
virtual bool eq_def(const Field *field) const
Definition: field.cc:8436
const uchar * unpack(const uchar *from)
Definition: field.h:1518
virtual bool get_date(MYSQL_TIME *ltime, my_time_flags_t fuzzydate) const
Definition: field.cc:2098
geometry_type
Definition: field.h:718
@ GEOM_GEOMETRYCOLLECTION
Definition: field.h:726
@ GEOM_POLYGON
Definition: field.h:722
@ GEOM_MULTILINESTRING
Definition: field.h:724
@ GEOM_POINT
Definition: field.h:720
@ GEOM_MULTIPOINT
Definition: field.h:723
@ GEOM_MULTIPOLYGON
Definition: field.h:725
@ GEOM_LINESTRING
Definition: field.h:721
@ GEOM_GEOMETRY
Definition: field.h:719
virtual int cmp_max(const uchar *a, const uchar *b, uint max_len) const
Definition: field.h:1178
virtual Item_result result_type() const =0
uint32 flags
Definition: field.h:745
bool is_nullable() const
Definition: field.h:1288
bool warn_if_overflow(int op_result)
Process decimal library return codes and issue warnings for overflow and truncation.
Definition: field.cc:1645
static bool type_can_have_key_part(enum_field_types)
Check whether a field type can be partially indexed by a key.
Definition: field.cc:1482
bool set_warning(Sql_condition::enum_severity_level level, unsigned int code, int cut_increment)
Produce warning or note about data saved into field.
Definition: field.h:1628
virtual type_conversion_status store_time(MYSQL_TIME *ltime, uint8 dec_arg)
Store MYSQL_TIME value with the given amount of decimal digits into a field.
Definition: field.cc:2125
virtual type_conversion_status store(const char *to, size_t length, const CHARSET_INFO *cs)=0
virtual geometry_type get_geometry_type() const
Definition: field.h:1669
uint null_offset(const uchar *record) const
Definition: field.h:1290
virtual bool is_text_key_type() const
Definition: field.h:1200
virtual String * val_str(String *, String *) const =0
virtual uchar * pack(uchar *to, const uchar *from, size_t max_length) const
Pack the field into a format suitable for storage and transfer.
Definition: field.cc:1871
static Item_result result_merge_type(enum_field_types)
Detect Item_result by given field type of UNION merge result.
Definition: field.cc:1359
virtual bool eq(const Field *field) const
Definition: field.h:1040
Field * new_key_field(MEM_ROOT *root, TABLE *new_table, uchar *new_ptr) const
Definition: field.h:1378
bool is_tmp_null() const
Definition: field.h:907
virtual uint32 key_length() const
Definition: field.h:1154
bool is_gcol() const
Definition: field.h:813
dd::Column::enum_hidden_type m_hidden
Definition: field.h:642
void set_storage_type(ha_storage_media storage_type_arg)
Definition: field.h:1694
static enum_field_types field_type_merge(enum_field_types, enum_field_types)
Return type of which can carry value of both given types in UNION result.
Definition: field.cc:1240
uchar * m_null_ptr
Byte where the NULL bit is stored inside a record.
Definition: field.h:648
virtual uint32 max_data_length() const
Get the maximum size of the data in packed format.
Definition: field.h:1085
virtual Item_result cmp_type() const
Definition: field.h:1034
column_format_type column_format() const
Definition: field.h:1699
virtual const uchar * unpack(uchar *to, const uchar *from, uint param_data)
Unpack a field from row data.
Definition: field.cc:1902
virtual longlong val_time_temporal_at_utc() const
Definition: field.h:980
uchar auto_flags
Bitmap of flags indicating if field value is auto-generated by default and/or on update,...
Definition: field.h:765
bool is_hidden_by_system() const
Definition: field.h:844
virtual int cmp(const uchar *, const uchar *) const =0
String * val_str(String *str) const
Definition: field.h:1000
unsigned int m_warnings_pushed
Definition: field.h:797
void set_check_for_truncated_fields(enum_check_fields check_for_truncated_fields)
Remember the value of THD::check_for_truncated_fields to handle possible NOT-NULL constraint errors a...
Definition: field.h:1282
uchar * pack_int64(uchar *to, const uchar *from, size_t max_length) const
Definition: field.cc:10332
virtual longlong val_date_temporal_at_utc() const
Definition: field.h:984
const char * orig_db_name
Pointer to original database name, only non-NULL for a temporary table.
Definition: field.h:683
uchar * get_null_ptr()
Definition: field.h:679
virtual uint32 char_length() const
Definition: field.h:1665
bool is_field_for_functional_index() const
Definition: field.h:865
virtual uint pack_length_from_metadata(uint field_metadata) const
Definition: field.h:1061
LEX_CSTRING m_secondary_engine_attribute
Definition: field.h:783
virtual int key_cmp(const uchar *str, uint length) const
Definition: field.h:1196
bool is_hidden() const
Definition: field.h:833
virtual void store_timestamp(const my_timeval *)
Stores a timestamp value in timeval format in a field.
Definition: field.h:1133
enum_check_fields m_check_for_truncated_fields_saved
The value of THD::check_for_truncated_fields at the moment of setting m_is_tmp_null attribute.
Definition: field.h:669
void evaluate_insert_default_function()
Evaluates the INSERT default function and stores the result in the field.
Definition: field.cc:2179
virtual int cmp_offset(ptrdiff_t row_offset) const
Definition: field.h:1187
bool is_created_from_null_item
If true, this field was created in create_tmp_field_from_item from a NULL value.
Definition: field.h:775
uint32 all_flags() const
Definition: field.h:754
int save_field_metadata(uchar *first_byte)
Definition: field.h:1066
virtual Field * clone(MEM_ROOT *mem_root) const =0
Makes a shallow copy of the Field object.
virtual bool get_time(MYSQL_TIME *ltime) const
Definition: field.cc:2105
bool stored_in_db
Indication that the field is physically stored in tables rather than just generated on SQL queries.
Definition: field.h:807
virtual enum Derivation derivation() const
Definition: field.h:1603
uchar * ptr
Holds the position to the field in record.
Definition: field.h:639
static constexpr size_t MAX_MEDIUM_BLOB_WIDTH
Definition: field.h:736
virtual void set_field_length(uint32 length)
Definition: field.h:742
virtual int key_cmp(const uchar *a, const uchar *b) const
Definition: field.h:1193
virtual bool is_unsigned() const
Whether the field is signed or not.
Definition: field.h:812
longlong val_temporal_by_field_type() const
Returns "native" packed longlong representation of a TIME or DATE/DATETIME field depending on field t...
Definition: field.h:992
bool has_update_default_datetime_value_expression() const
Checks if the field is marked as having a datetime value expression to generate default values on upd...
Definition: field.h:618
virtual enum_field_types binlog_type() const
Definition: field.h:1157
bool is_part_of_actual_key(THD *thd, uint cur_index, KEY *cur_index_info) const
Check whether field is part of the index taking the index extensions flag into account.
Definition: field.cc:9754
dd::Column::enum_hidden_type hidden() const
Definition: field.h:827
void dbug_print() const
Definition: field.h:1676
longlong convert_decimal2longlong(const my_decimal *val, bool unsigned_flag, bool *has_overflow)
Conversion from decimal to longlong.
Definition: field.cc:1973
virtual ~Field()=default
uchar * field_ptr()
Return a pointer to where the field is stored in the record buffer.
Definition: field.h:1750
virtual enum ha_base_keytype key_type() const
Definition: field.h:1153
virtual uint is_equal(const Create_field *new_field) const
Whether a field being created is type-compatible with an existing one.
Definition: field.cc:1227
virtual size_t get_key_image(uchar *buff, size_t length, imagetype type) const
Definition: field.h:1441
virtual void mem_free()
Definition: field.h:1364
virtual bool match_collation_to_optimize_range() const
Definition: field.h:1602
virtual uint repertoire() const
Definition: field.h:1604
virtual void hash(ulong *nr, ulong *nr2) const
Definition: field.cc:1783
bool has_insert_default_constant_expression() const
Checks if the field is marked as having a constant expression to generate default values.
Definition: field.h:630
virtual uint row_pack_length() const
Definition: field.h:1065
virtual void sql_type(String &str) const =0
virtual type_conversion_status reset()
Definition: field.h:1087
void set_flag(unsigned flag)
Definition: field.h:750
enum_pushed_warnings
Definition: field.h:786
@ NO_DEFAULT_FOR_FIELD_PUSHED
Definition: field.h:788
@ NO_DEFAULT_FOR_VIEW_FIELD_PUSHED
Definition: field.h:789
@ BAD_NULL_ERROR_PUSHED
Definition: field.h:787
virtual Field * new_field(MEM_ROOT *root, TABLE *new_table) const
Definition: field.cc:2140
void set_column_format(column_format_type column_format_arg)
Definition: field.h:1703
uint offset(uchar *record) const
Definition: field.h:1576
virtual void set_key_image(const uchar *buff, size_t length)
Definition: field.h:1446
bool is_flag_set(unsigned flag) const
Definition: field.h:749
Key_map part_of_key_not_extended
All keys that include this field, but not extended by the storage engine to include primary key colum...
Definition: field.h:698
longlong val_int_offset(ptrdiff_t row_offset)
Definition: field.h:1449
Definition: item.h:4170
Base class that is used to represent any kind of expression in a relational query.
Definition: item.h:851
Represents a JSON array container, i.e.
Definition: json_dom.h:520
Vector of logical diffs describing changes to a JSON column.
Definition: json_diff.h:141
Abstraction for accessing JSON values irrespective of whether they are (started out as) binary JSON v...
Definition: json_dom.h:1161
Definition: key.h:113
Definition: protocol.h:33
Definition: rpl_rli.h:203
Definition: field.h:4624
const char * col_name
Definition: field.h:4628
ulong length
Definition: field.h:4629
uint charsetnr
Definition: field.h:4630
bool field
Definition: field.h:4637
enum_field_types type
Definition: field.h:4631
Send_field()=default
const char * db_name
Definition: field.h:4626
const char * org_table_name
Definition: field.h:4627
enum_severity_level
Enumeration value describing the severity of the condition.
Definition: sql_error.h:63
Using this class is fraught with peril, and you need to be very careful when doing so.
Definition: sql_string.h:168
void takeover(String &s)
Takeover the buffer owned by another string.
Definition: sql_string.h:459
void mem_free()
Definition: sql_string.h:379
char * c_ptr_safe()
Definition: sql_string.h:267
size_t length() const
Definition: sql_string.h:242
size_t alloced_length() const
Definition: sql_string.h:243
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:34
This class represents abstract time zone and provides basic interface for MYSQL_TIME <-> my_time_t co...
Definition: tztime.h:49
Used for storing information associated with generated column, default values generated from expressi...
Definition: field.h:483
void set_field_stored(bool stored)
Definition: field.h:536
void set_field_type(enum_field_types fld_type)
Definition: field.h:519
uint num_non_virtual_base_cols
How many non-virtual base columns in base_columns_map.
Definition: field.h:572
bool stored_in_db
Indicates if the field is physically stored in the database.
Definition: field.h:570
bool register_base_columns(TABLE *table)
Calculate the base_columns_map and num_non_virtual_base_cols members of this generated column.
Definition: table.cc:2529
enum_field_types field_type
Real field type.
Definition: field.h:568
void backup_stmt_unsafe_flags(uint32 backup_binlog_stmt_flags)
Set the binary log flags in m_backup_binlog_stmt_flags.
Definition: field.h:525
uint non_virtual_base_columns() const
Get the number of non virtual base columns that this generated column needs.
Definition: field.h:544
Item * expr_item
Item representing the generation expression.
Definition: field.h:493
void dup_expr_str(MEM_ROOT *root, const char *src, size_t len)
Duplicates a string into expr_str.
Definition: table.cc:2553
uint32 get_stmt_unsafe_flags()
Get the binary log flags from m_backup_binlog_stmt_flags.
Definition: field.h:533
MY_BITMAP base_columns_map
Bitmap records base columns which a generated column depends on.
Definition: field.h:515
uint32 m_backup_binlog_stmt_flags
Bit field indicating the type of statement for binary logging.
Definition: field.h:510
void print_expr(THD *thd, String *out)
Writes the generation expression into a String with proper syntax.
Definition: table.cc:2559
Item * item_list
List of all items created when parsing and resolving generated expression.
Definition: field.h:513
bool get_field_stored() const
Definition: field.h:535
enum_field_types get_real_type() const
Definition: field.h:517
LEX_STRING expr_str
Text of the expression.
Definition: field.h:501
enum_hidden_type
Definition: column.h:95
@ HT_HIDDEN_SQL
The column is visible to the server, but hidden from the user.
@ HT_HIDDEN_SE
The column is completely invisible to the server.
@ HT_VISIBLE
The column is visible (a normal column)
@ HT_HIDDEN_USER
User table column marked as INVISIBLE by using the column visibility attribute.
my_decimal class limits 'decimal_t' type to what we need in MySQL.
Definition: my_decimal.h:94
static MEM_ROOT mem_root
Definition: client_plugin.cc:110
#define L
Definition: ctype-tis620.cc:76
#define E_DEC_TRUNCATED
Definition: decimal.h:143
#define E_DEC_DIV_ZERO
Definition: decimal.h:145
static constexpr int DECIMAL_NOT_SPECIFIED
Definition: decimal.h:154
#define E_DEC_BAD_NUM
Definition: decimal.h:146
#define E_DEC_OK
Definition: decimal.h:142
#define E_DEC_OOM
Definition: decimal.h:147
#define E_DEC_OVERFLOW
Definition: decimal.h:144
Fido Client Authentication nullptr
Definition: fido_client_plugin.cc:222
This file contains basic method for field types.
bool is_temporal_type(enum_field_types type)
Tests if field type is temporal, i.e.
Definition: field_common_properties.h:115
bool is_temporal_type_with_date(enum_field_types type)
Tests if field type is temporal and has date part, i.e.
Definition: field_common_properties.h:156
This file contains the field type.
enum_field_types
Column types for MySQL.
Definition: field_types.h:53
@ MYSQL_TYPE_TIME2
Internal to MySQL.
Definition: field_types.h:73
@ MYSQL_TYPE_VARCHAR
Definition: field_types.h:69
@ MYSQL_TYPE_LONGLONG
Definition: field_types.h:62
@ MYSQL_TYPE_LONG_BLOB
Definition: field_types.h:83
@ MYSQL_TYPE_BLOB
Definition: field_types.h:84
@ MYSQL_TYPE_TINY
Definition: field_types.h:55
@ MYSQL_TYPE_TIME
Definition: field_types.h:65
@ MYSQL_TYPE_SET
Definition: field_types.h:80
@ MYSQL_TYPE_NEWDATE
Internal to MySQL.
Definition: field_types.h:68
@ MYSQL_TYPE_JSON
Definition: field_types.h:77
@ MYSQL_TYPE_STRING
Definition: field_types.h:86
@ MYSQL_TYPE_NULL
Definition: field_types.h:60
@ MYSQL_TYPE_ENUM
Definition: field_types.h:79
@ MYSQL_TYPE_TINY_BLOB
Definition: field_types.h:81
@ MYSQL_TYPE_LONG
Definition: field_types.h:57
@ MYSQL_TYPE_BIT
Definition: field_types.h:70
@ MYSQL_TYPE_INVALID
Definition: field_types.h:75
@ MYSQL_TYPE_GEOMETRY
Definition: field_types.h:87
@ MYSQL_TYPE_NEWDECIMAL
Definition: field_types.h:78
@ MYSQL_TYPE_DECIMAL
Definition: field_types.h:54
@ MYSQL_TYPE_TYPED_ARRAY
Used for replication only.
Definition: field_types.h:74
@ MYSQL_TYPE_DOUBLE
Definition: field_types.h:59
@ MYSQL_TYPE_MEDIUM_BLOB
Definition: field_types.h:82
@ MYSQL_TYPE_DATETIME2
Internal to MySQL.
Definition: field_types.h:72
@ MYSQL_TYPE_SHORT
Definition: field_types.h:56
@ MYSQL_TYPE_DATE
Definition: field_types.h:64
@ MYSQL_TYPE_FLOAT
Definition: field_types.h:58
@ MYSQL_TYPE_TIMESTAMP
Definition: field_types.h:61
@ MYSQL_TYPE_INT24
Definition: field_types.h:63
@ MYSQL_TYPE_DATETIME
Definition: field_types.h:66
@ MYSQL_TYPE_TIMESTAMP2
Definition: field_types.h:71
@ MYSQL_TYPE_YEAR
Definition: field_types.h:67
static const std::string dec("DECRYPTION")
#define ENUM_FLAG
field is an enum
Definition: mysql_com.h:164
#define FIELD_FLAGS_COLUMN_FORMAT
Field column format, bit 24-25.
Definition: mysql_com.h:187
#define BLOB_FLAG
Field is a blob.
Definition: mysql_com.h:158
#define SET_FLAG
field is a set
Definition: mysql_com.h:167
#define BINARY_FLAG
Field is binary
Definition: mysql_com.h:161
#define FIELD_FLAGS_STORAGE_MEDIA
Field storage media, bit 22-23.
Definition: mysql_com.h:185
static int flag
Definition: hp_test1.cc:40
static int rnd(int max_value)
Definition: hp_test2.cc:548
constexpr const LEX_CSTRING EMPTY_CSTR
Definition: lex_string.h:48
A better implementation of the UNIX ctype(3) library.
#define MY_REPERTOIRE_UNICODE30
Definition: m_ctype.h:154
CHARSET_INFO my_charset_utf8mb4_bin
Definition: ctype-utf8.cc:7795
MYSQL_PLUGIN_IMPORT CHARSET_INFO my_charset_bin
Definition: ctype-bin.cc:511
uint my_charset_repertoire(const CHARSET_INFO *cs)
Definition: ctype.cc:797
This file follows Google coding style, except for the name MEM_ROOT (which is kept for historical rea...
This file includes constants used by all storage engines.
ha_base_keytype
Definition: my_base.h:439
@ HA_KEYTYPE_VARBINARY2
Definition: my_base.h:460
@ HA_KEYTYPE_BINARY
Definition: my_base.h:442
@ HA_KEYTYPE_USHORT_INT
Definition: my_base.h:448
@ HA_KEYTYPE_ULONGLONG
Definition: my_base.h:451
@ HA_KEYTYPE_UINT24
Definition: my_base.h:453
@ HA_KEYTYPE_VARTEXT2
Definition: my_base.h:459
@ HA_KEYTYPE_FLOAT
Definition: my_base.h:445
@ HA_KEYTYPE_BIT
Definition: my_base.h:461
@ HA_KEYTYPE_ULONG_INT
Definition: my_base.h:449
@ HA_KEYTYPE_SHORT_INT
Definition: my_base.h:443
@ HA_KEYTYPE_NUM
Definition: my_base.h:447
@ HA_KEYTYPE_DOUBLE
Definition: my_base.h:446
@ HA_KEYTYPE_LONG_INT
Definition: my_base.h:444
@ HA_KEYTYPE_INT8
Definition: my_base.h:454
@ HA_KEYTYPE_INT24
Definition: my_base.h:452
@ HA_KEYTYPE_TEXT
Definition: my_base.h:441
@ HA_KEYTYPE_LONGLONG
Definition: my_base.h:450
ha_storage_media
Definition: my_base.h:115
@ HA_SM_DEFAULT
Definition: my_base.h:116
#define DBUG_PRINT(keyword, arglist)
Definition: my_dbug.h:181
#define DBUG_FILE
Definition: my_dbug.h:194
#define DBUG_EVALUATE_IF(keyword, a1, a2)
Definition: my_dbug.h:179
#define DBUG_TRACE
Definition: my_dbug.h:146
Utility functions for converting between ulonglong and double.
static constexpr double LLONG_MAX_DOUBLE
Definition: my_double2ulonglong.h:57
Some integer typedefs for easier portability.
unsigned long long int ulonglong
Definition: my_inttypes.h:56
uint8_t uint8
Definition: my_inttypes.h:63
unsigned char uchar
Definition: my_inttypes.h:52
long long int longlong
Definition: my_inttypes.h:55
#define MY_INT32_NUM_DECIMAL_DIGITS
Definition: my_inttypes.h:100
uint16_t uint16
Definition: my_inttypes.h:65
uint32_t uint32
Definition: my_inttypes.h:67
Common header for many mysys elements.
Interface for low level time utilities.
constexpr const int MYSQL_TIME_WARN_INVALID_TIMESTAMP
Definition: my_time.h:120
constexpr const int MYSQL_TIME_NOTE_TRUNCATED
Definition: my_time.h:122
constexpr const int MYSQL_TIME_WARN_TRUNCATED
Conversion warnings.
Definition: my_time.h:118
constexpr const int DATETIME_MAX_DECIMALS
Definition: my_time.h:143
constexpr const int MYSQL_TIME_WARN_ZERO_IN_DATE
Definition: my_time.h:123
constexpr const my_time_flags_t TIME_FUZZY_DATE
Allow zero day and zero month.
Definition: my_time.h:97
constexpr const int MYSQL_TIME_WARN_OUT_OF_RANGE
Definition: my_time.h:119
unsigned int my_time_flags_t
Flags to str_to_datetime and number_to_datetime.
Definition: my_time.h:94
constexpr const int MYSQL_TIME_WARN_ZERO_DATE
Definition: my_time.h:121
unsigned int STDCALL mysql_errno(MYSQL *mysql)
Definition: client.cc:9086
Common definition between mysql server & client.
Time declarations shared between the server and client API: you should not add anything to this heade...
enum_mysql_timestamp_type
Definition: mysql_time.h:45
static int interval
Definition: mysqladmin.cc:65
void warning(const char *format,...)
static int record
Definition: mysqltest.cc:188
void copy(Shards< COUNT > &dst, const Shards< COUNT > &src) noexcept
Copy the counters, overwrite destination.
Definition: ut0counter.h:354
std::string str(const mysqlrouter::ConfigGenerator::Options::Endpoint &ep)
Definition: config_generator.cc:1044
Definition: buf0block_hint.cc:30
constexpr value_type zerofill
Definition: classic_protocol_constants.h:274
constexpr value_type is_unsigned
Definition: classic_protocol_constants.h:273
Definition: commit_order_queue.h:34
enum_column_types
Definition: column.h:53
bool length(const dd::Spatial_reference_system *srs, const Geometry *g1, double *length, bool *null) noexcept
Computes the length of linestrings and multilinestrings.
Definition: length.cc:76
RangeReverse< Range > reverse(Range &x)
Iterate over a range in reverse.
Definition: utilities.h:132
Cursor end()
A past-the-end Cursor.
Definition: rules_table_service.cc:192
std::set< Key, Compare, ut::allocator< Key > > set
Specialization of set which uses ut_allocator.
Definition: ut0new.h:2882
required uint32 status
Definition: replication_asynchronous_connection_failover.proto:61
repeated Source source
Definition: replication_asynchronous_connection_failover.proto:42
required string type
Definition: replication_group_member_actions.proto:34
static void make_hash_key(const char *username, const char *hostname, std::string &key)
Make hash key.
Definition: sha2_password.cc:767
Create_field * generate_create_field(THD *thd, Item *source_item, TABLE *tmp_table)
Generate a Create_field from an Item.
Definition: field.cc:10436
bool is_temporal_real_type(enum_field_types type)
Tests if field real type is temporal, i.e.
Definition: field.h:349
Field * make_field(MEM_ROOT *mem_root_arg, TABLE_SHARE *share, uchar *ptr, size_t field_length, uchar *null_pos, uchar null_bit, enum_field_types field_type, const CHARSET_INFO *field_charset, Field::geometry_type geom_type, uchar auto_flags, TYPELIB *interval, const char *field_name, bool is_nullable, bool is_zerofill, bool is_unsigned, uint decimals, bool treat_bit_as_char, uint pack_length_override, std::optional< gis::srid_t > srid, bool is_array)
This function should only be called from legacy code.
Definition: field.cc:9302
type_conversion_status
Status when storing a value in a field or converting from one datatype to another.
Definition: field.h:202
@ TYPE_ERR_BAD_VALUE
Store/convert incompatible values, like converting "foo" to a date.
Definition: field.h:245
@ TYPE_OK
Storage/conversion went fine.
Definition: field.h:204
@ TYPE_NOTE_TIME_TRUNCATED
A minor problem when converting between temporal values, e.g.
Definition: field.h:209
@ TYPE_ERR_OOM
Out of memory.
Definition: field.h:247
@ TYPE_NOTE_TRUNCATED
Value was stored, but something was cut.
Definition: field.h:219
@ TYPE_ERR_NULL_CONSTRAINT_VIOLATION
Trying to store NULL in a NOT NULL field.
Definition: field.h:240
@ TYPE_WARN_OUT_OF_RANGE
Value outside min/max limit of datatype.
Definition: field.h:224
@ TYPE_WARN_TRUNCATED
Value was stored, but something was cut.
Definition: field.h:233
@ TYPE_WARN_INVALID_STRING
Value has invalid string data.
Definition: field.h:238
enum_check_fields
Definition: field.h:172
@ CHECK_FIELD_ERROR_FOR_NULL
Definition: field.h:175
@ CHECK_FIELD_IGNORE
Definition: field.h:173
@ CHECK_FIELD_WARN
Definition: field.h:174
void copy_integer(uchar *to, size_t to_length, const uchar *from, size_t from_length, bool is_unsigned)
Copies an integer value to a format comparable with memcmp().
Definition: field.h:452
type_conversion_status set_field_to_null_with_conversions(Field *field, bool no_conversions)
Set field to NULL or TIMESTAMP or to next auto_increment number.
Definition: field_conv.cc:154
uint32 calc_key_length(enum_field_types sql_type, uint32 length, uint32 decimals, bool is_unsigned, uint32 elements)
Calculate key length for field from its type, length and other attributes.
Definition: field.cc:9140
bool pre_validate_value_generator_expr(Item *expression, const char *name, Value_generator_source source)
Perform per item-type checks to determine if the expression is allowed for a generated column,...
Definition: field.cc:1184
#define MY_REPERTOIRE_NUMERIC
Definition: field.h:258
enum_field_types real_type_to_type(enum_field_types real_type)
Convert temporal real types as returned by field->real_type() to field type as returned by field->typ...
Definition: field.h:393
Value_generator_source
Enum to indicate source for which value generator is used.
Definition: field.h:473
@ VGS_DEFAULT_EXPRESSION
Definition: field.h:475
@ VGS_CHECK_CONSTRAINT
Definition: field.h:476
@ VGS_GENERATED_COLUMN
Definition: field.h:474
type_conversion_status decimal_err_to_type_conv_status(int dec_error)
Definition: field.h:294
enum_field_types blob_type_from_pack_length(uint pack_length)
Return the appropriate MYSQL_TYPE_X_BLOB value based on the pack_length.
Definition: field.h:416
uint get_set_pack_length(int elements)
Definition: field.h:289
bool fields_are_memcpyable(const Field *to, const Field *from)
Check if one can copy from “from” to “to” with a simple memcpy(), with pack_length() as the length.
Definition: field_conv.cc:705
#define my_charset_numeric
Definition: field.h:257
type_conversion_status set_field_to_null(Field *field)
Definition: field_conv.cc:94
uint get_enum_pack_length(int elements)
Definition: field.h:285
size_t calc_pack_length(enum_field_types type, size_t length)
Definition: field.cc:9183
type_conversion_status field_conv_slow(Field *to, const Field *from)
Copy the value in "from" (assumed to be non-NULL) to "to", doing any required conversions in the proc...
Definition: field_conv.cc:765
bool is_blob(enum_field_types sql_type)
Definition: field.h:4741
const char * get_field_name_or_expression(THD *thd, const Field *field)
Definition: field.cc:10523
#define portable_sizeof_char_ptr
Definition: field.h:118
column_format_type
Definition: field.h:190
@ COLUMN_FORMAT_TYPE_DEFAULT
Definition: field.h:191
@ COLUMN_FORMAT_TYPE_FIXED
Definition: field.h:192
@ COLUMN_FORMAT_TYPE_DYNAMIC
Definition: field.h:193
type_conversion_status time_warning_to_type_conversion_status(const int warn)
Convert warnings returned from str_to_time() and str_to_datetime() to their corresponding type_conver...
Definition: field.h:314
type_conversion_status store_internal_with_error_check(Field_new_decimal *field, int conversion_err, my_decimal *value)
Definition: field.cc:2918
enum_field_types get_blob_type_from_length(size_t length)
Definition: field.cc:9170
bool real_type_with_now_as_default(enum_field_types type)
Tests if field real type can have "DEFAULT CURRENT_TIMESTAMP", i.e.
Definition: field.h:368
bool real_type_with_now_on_update(enum_field_types type)
Tests if field real type can have "ON UPDATE CURRENT_TIMESTAMP", i.e.
Definition: field.h:381
Derivation
For use.
Definition: field.h:179
@ DERIVATION_COERCIBLE
Definition: field.h:182
@ DERIVATION_SYSCONST
Definition: field.h:183
@ DERIVATION_EXPLICIT
Definition: field.h:186
@ DERIVATION_NONE
Definition: field.h:185
@ DERIVATION_NUMERIC
Definition: field.h:181
@ DERIVATION_IMPLICIT
Definition: field.h:184
@ DERIVATION_IGNORABLE
Definition: field.h:180
File containing constants that can be used throughout the server.
constexpr const int MAX_TIME_WIDTH
-838:59:59
Definition: sql_const.h:71
constexpr const int MAX_DATE_WIDTH
YYYY-MM-DD.
Definition: sql_const.h:69
constexpr const int MAX_DATETIME_WIDTH
YYYY-MM-DD HH:MM:SS.
Definition: sql_const.h:77
Our own string classes, used pervasively throughout the executor.
Truncate_result
Definition: sql_truncate.cc:139
case opt name
Definition: sslopt-case.h:33
Definition: m_ctype.h:385
uint mbmaxlen
Definition: m_ctype.h:409
MY_CHARSET_HANDLER * cset
Definition: m_ctype.h:417
The MEM_ROOT is a simple arena, where allocations are carved out of larger blocks.
Definition: my_alloc.h:83
Definition: mysql_lex_string.h:40
Definition: mysql_lex_string.h:35
Structure to return status from str_to_datetime(), str_to_time(), number_to_datetime(),...
Definition: my_time.h:170
Definition: mysql_time.h:82
Definition: my_bitmap.h:43
size_t(* lengthsp)(const CHARSET_INFO *, const char *ptr, size_t length)
Given a pointer and a length in bytes, returns a new length in bytes where all trailing space charact...
Definition: m_ctype.h:333
void(* fill)(const CHARSET_INFO *, char *to, size_t len, int fill)
Definition: m_ctype.h:359
This structure is shared between different table objects.
Definition: table.h:689
Definition: table.h:1398
bool has_null_row() const
Definition: table.h:2092
bool is_nullable() const
Return whether table is nullable.
Definition: table.h:1994
Definition: typelib.h:35
Replacement of system's struct timeval to ensure we can carry 64 bit values even on a platform which ...
Definition: my_time_t.h:45
unsigned int uint
Definition: uca9-dump.cc:75
Item_result
Type of the user defined function return slot and arguments.
Definition: udf_registration_types.h:39
@ STRING_RESULT
not valid for UDFs
Definition: udf_registration_types.h:41
@ DECIMAL_RESULT
not valid for UDFs
Definition: udf_registration_types.h:45
@ REAL_RESULT
char *
Definition: udf_registration_types.h:42
@ INT_RESULT
double
Definition: udf_registration_types.h:43
Definition: dtoa.cc:595