1 | /***************************************************************************** |
2 | |
3 | Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. |
4 | Copyright (c) 2017, 2018, MariaDB Corporation. |
5 | |
6 | This program is free software; you can redistribute it and/or modify it under |
7 | the terms of the GNU General Public License as published by the Free Software |
8 | Foundation; version 2 of the License. |
9 | |
10 | This program is distributed in the hope that it will be useful, but WITHOUT |
11 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
12 | FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. |
13 | |
14 | You should have received a copy of the GNU General Public License along with |
15 | this program; if not, write to the Free Software Foundation, Inc., |
16 | 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA |
17 | |
18 | *****************************************************************************/ |
19 | |
20 | /**************************************************//** |
21 | @file include/data0type.h |
22 | Data types |
23 | |
24 | Created 1/16/1996 Heikki Tuuri |
25 | *******************************************************/ |
26 | |
27 | #ifndef data0type_h |
28 | #define data0type_h |
29 | |
30 | #include "univ.i" |
31 | |
32 | /** Special length indicating a missing instantly added column */ |
33 | #define UNIV_SQL_DEFAULT (UNIV_SQL_NULL - 1) |
34 | |
35 | /** @return whether a length is actually stored in a field */ |
36 | #define len_is_stored(len) (len != UNIV_SQL_NULL && len != UNIV_SQL_DEFAULT) |
37 | |
38 | extern ulint data_mysql_default_charset_coll; |
39 | #define DATA_MYSQL_BINARY_CHARSET_COLL 63 |
40 | |
41 | /* SQL data type struct */ |
42 | struct dtype_t; |
43 | |
44 | /** SQL Like operator comparison types */ |
45 | enum ib_like_t { |
46 | IB_LIKE_EXACT, /**< e.g. STRING */ |
47 | IB_LIKE_PREFIX /**< e.g., STRING% */ |
48 | }; |
49 | |
50 | /*-------------------------------------------*/ |
51 | /* The 'MAIN TYPE' of a column */ |
52 | #define DATA_MISSING 0 /* missing column */ |
53 | #define DATA_VARCHAR 1 /* character varying of the |
54 | latin1_swedish_ci charset-collation; note |
55 | that the MySQL format for this, DATA_BINARY, |
56 | DATA_VARMYSQL, is also affected by whether the |
57 | 'precise type' contains |
58 | DATA_MYSQL_TRUE_VARCHAR */ |
59 | #define DATA_CHAR 2 /* fixed length character of the |
60 | latin1_swedish_ci charset-collation */ |
61 | #define DATA_FIXBINARY 3 /* binary string of fixed length */ |
62 | #define DATA_BINARY 4 /* binary string */ |
63 | #define DATA_BLOB 5 /* binary large object, or a TEXT type; |
64 | if prtype & DATA_BINARY_TYPE == 0, then this is |
65 | actually a TEXT column (or a BLOB created |
66 | with < 4.0.14; since column prefix indexes |
67 | came only in 4.0.14, the missing flag in BLOBs |
68 | created before that does not cause any harm) */ |
69 | #define DATA_INT 6 /* integer: can be any size 1 - 8 bytes */ |
70 | #define DATA_SYS_CHILD 7 /* address of the child page in node pointer */ |
71 | #define DATA_SYS 8 /* system column */ |
72 | |
73 | /* Data types >= DATA_FLOAT must be compared using the whole field, not as |
74 | binary strings */ |
75 | |
76 | #define DATA_FLOAT 9 |
77 | #define DATA_DOUBLE 10 |
78 | #define DATA_DECIMAL 11 /* decimal number stored as an ASCII string */ |
79 | #define DATA_VARMYSQL 12 /* any charset varying length char */ |
80 | #define DATA_MYSQL 13 /* any charset fixed length char */ |
81 | /* NOTE that 4.1.1 used DATA_MYSQL and |
82 | DATA_VARMYSQL for all character sets, and the |
83 | charset-collation for tables created with it |
84 | can also be latin1_swedish_ci */ |
85 | |
86 | /* DATA_GEOMETRY includes all standard geometry datatypes as described in |
87 | OGC standard(point, line_string, polygon, multi_point, multi_polygon, |
88 | multi_line_string, geometry_collection, geometry). |
89 | Currently, geometry data is stored in the standard Well-Known Binary(WKB) |
90 | format (http://www.opengeospatial.org/standards/sfa). |
91 | We use BLOB as the underlying datatype. */ |
92 | #define DATA_GEOMETRY 14 /* geometry datatype of variable length */ |
93 | #define DATA_MTYPE_MAX 63 /* dtype_store_for_order_and_null_size() |
94 | requires the values are <= 63 */ |
95 | |
96 | #define DATA_MTYPE_CURRENT_MIN DATA_VARCHAR /* minimum value of mtype */ |
97 | #define DATA_MTYPE_CURRENT_MAX DATA_GEOMETRY /* maximum value of mtype */ |
98 | /*-------------------------------------------*/ |
99 | /* The 'PRECISE TYPE' of a column */ |
100 | /* |
101 | Tables created by a MySQL user have the following convention: |
102 | |
103 | - In the least significant byte in the precise type we store the MySQL type |
104 | code (not applicable for system columns). |
105 | |
106 | - In the second least significant byte we OR flags DATA_NOT_NULL, |
107 | DATA_UNSIGNED, DATA_BINARY_TYPE. |
108 | |
109 | - In the third least significant byte of the precise type of string types we |
110 | store the MySQL charset-collation code. In DATA_BLOB columns created with |
111 | < 4.0.14 we do not actually know if it is a BLOB or a TEXT column. Since there |
112 | are no indexes on prefixes of BLOB or TEXT columns in < 4.0.14, this is no |
113 | problem, though. |
114 | |
115 | Note that versions < 4.1.2 or < 5.0.1 did not store the charset code to the |
116 | precise type, since the charset was always the default charset of the MySQL |
117 | installation. If the stored charset code is 0 in the system table SYS_COLUMNS |
118 | of InnoDB, that means that the default charset of this MySQL installation |
119 | should be used. |
120 | |
121 | When loading a table definition from the system tables to the InnoDB data |
122 | dictionary cache in main memory, InnoDB versions >= 4.1.2 and >= 5.0.1 check |
123 | if the stored charset-collation is 0, and if that is the case and the type is |
124 | a non-binary string, replace that 0 by the default charset-collation code of |
125 | this MySQL installation. In short, in old tables, the charset-collation code |
126 | in the system tables on disk can be 0, but in in-memory data structures |
127 | (dtype_t), the charset-collation code is always != 0 for non-binary string |
128 | types. |
129 | |
130 | In new tables, in binary string types, the charset-collation code is the |
131 | MySQL code for the 'binary charset', that is, != 0. |
132 | |
133 | For binary string types and for DATA_CHAR, DATA_VARCHAR, and for those |
134 | DATA_BLOB which are binary or have the charset-collation latin1_swedish_ci, |
135 | InnoDB performs all comparisons internally, without resorting to the MySQL |
136 | comparison functions. This is to save CPU time. |
137 | |
138 | InnoDB's own internal system tables have different precise types for their |
139 | columns, and for them the precise type is usually not used at all. |
140 | */ |
141 | |
142 | #define DATA_ENGLISH 4 /* English language character string: this |
143 | is a relic from pre-MySQL time and only used |
144 | for InnoDB's own system tables */ |
145 | #define DATA_ERROR 111 /* another relic from pre-MySQL time */ |
146 | |
147 | #define DATA_MYSQL_TYPE_MASK 255U/* AND with this mask to extract the MySQL |
148 | type from the precise type */ |
149 | #define DATA_MYSQL_TRUE_VARCHAR 15 /* MySQL type code for the >= 5.0.3 |
150 | format true VARCHAR */ |
151 | |
152 | /* Precise data types for system columns and the length of those columns; |
153 | NOTE: the values must run from 0 up in the order given! All codes must |
154 | be less than 256 */ |
155 | #define DATA_ROW_ID 0 /* row id: a 48-bit integer */ |
156 | #define DATA_ROW_ID_LEN 6 /* stored length for row id */ |
157 | |
158 | #define DATA_TRX_ID 1 /* transaction id: 6 bytes */ |
159 | #define DATA_TRX_ID_LEN 6 |
160 | |
161 | #define DATA_ROLL_PTR 2 /* rollback data pointer: 7 bytes */ |
162 | #define DATA_ROLL_PTR_LEN 7 |
163 | |
164 | #define DATA_N_SYS_COLS 3 /* number of system columns defined above */ |
165 | |
166 | #define DATA_FTS_DOC_ID 3 /* Used as FTS DOC ID column */ |
167 | |
168 | #define DATA_SYS_PRTYPE_MASK 0xFU /* mask to extract the above from prtype */ |
169 | |
170 | /* Flags ORed to the precise data type */ |
171 | #define DATA_NOT_NULL 256U /* this is ORed to the precise type when |
172 | the column is declared as NOT NULL */ |
173 | #define DATA_UNSIGNED 512U /* this id ORed to the precise type when |
174 | we have an unsigned integer type */ |
175 | #define DATA_BINARY_TYPE 1024U /* if the data type is a binary character |
176 | string, this is ORed to the precise type: |
177 | this only holds for tables created with |
178 | >= MySQL-4.0.14 */ |
179 | /* #define DATA_NONLATIN1 2048 This is a relic from < 4.1.2 and < 5.0.1. |
180 | In earlier versions this was set for some |
181 | BLOB columns. |
182 | */ |
183 | #define DATA_GIS_MBR 2048U /* Used as GIS MBR column */ |
184 | #define DATA_MBR_LEN SPDIMS * 2 * sizeof(double) /* GIS MBR length*/ |
185 | |
186 | #define DATA_LONG_TRUE_VARCHAR 4096U /* this is ORed to the precise data |
187 | type when the column is true VARCHAR where |
188 | MySQL uses 2 bytes to store the data len; |
189 | for shorter VARCHARs MySQL uses only 1 byte */ |
190 | #define DATA_VIRTUAL 8192U /* Virtual column */ |
191 | |
192 | /** System Versioning */ |
193 | #define DATA_VERS_START 16384U /* start system field */ |
194 | #define DATA_VERS_END 32768U /* end system field */ |
195 | /** system-versioned user data column */ |
196 | #define DATA_VERSIONED (DATA_VERS_START|DATA_VERS_END) |
197 | |
198 | /** Check whether locking is disabled (never). */ |
199 | #define dict_table_is_locking_disabled(table) false |
200 | |
201 | /*-------------------------------------------*/ |
202 | |
203 | /* This many bytes we need to store the type information affecting the |
204 | alphabetical order for a single field and decide the storage size of an |
205 | SQL null*/ |
206 | #define DATA_ORDER_NULL_TYPE_BUF_SIZE 4 |
207 | /* In the >= 4.1.x storage format we add 2 bytes more so that we can also |
208 | store the charset-collation number; one byte is left unused, though */ |
209 | #define DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE 6 |
210 | |
211 | /* Maximum multi-byte character length in bytes, plus 1 */ |
212 | #define DATA_MBMAX 8 |
213 | |
214 | /* For checking if mtype is GEOMETRY datatype */ |
215 | #define DATA_GEOMETRY_MTYPE(mtype) ((mtype) == DATA_GEOMETRY) |
216 | |
217 | /* For checking if mtype is BLOB or GEOMETRY, since we use BLOB as |
218 | the underlying datatype of GEOMETRY data. */ |
219 | #define DATA_LARGE_MTYPE(mtype) ((mtype) == DATA_BLOB \ |
220 | || (mtype) == DATA_GEOMETRY) |
221 | |
222 | /* For checking if data type is big length data type. */ |
223 | #define DATA_BIG_LEN_MTYPE(len, mtype) ((len) > 255 || DATA_LARGE_MTYPE(mtype)) |
224 | |
225 | /* For checking if the column is a big length column. */ |
226 | #define DATA_BIG_COL(col) DATA_BIG_LEN_MTYPE((col)->len, (col)->mtype) |
227 | |
228 | /* For checking if data type is large binary data type. */ |
229 | #define DATA_LARGE_BINARY(mtype,prtype) ((mtype) == DATA_GEOMETRY || \ |
230 | ((mtype) == DATA_BLOB && !((prtype) & DATA_BINARY_TYPE))) |
231 | |
232 | /* We now support 15 bits (up to 32767) collation number */ |
233 | #define MAX_CHAR_COLL_NUM 32767 |
234 | |
235 | /* Mask to get the Charset Collation number (0x7fff) */ |
236 | #define CHAR_COLL_MASK MAX_CHAR_COLL_NUM |
237 | |
238 | /*********************************************************************//** |
239 | Gets the MySQL type code from a dtype. |
240 | @return MySQL type code; this is NOT an InnoDB type code! */ |
241 | UNIV_INLINE |
242 | ulint |
243 | dtype_get_mysql_type( |
244 | /*=================*/ |
245 | const dtype_t* type); /*!< in: type struct */ |
246 | /*********************************************************************//** |
247 | Determine how many bytes the first n characters of the given string occupy. |
248 | If the string is shorter than n characters, returns the number of bytes |
249 | the characters in the string occupy. |
250 | @return length of the prefix, in bytes */ |
251 | ulint |
252 | dtype_get_at_most_n_mbchars( |
253 | /*========================*/ |
254 | ulint prtype, /*!< in: precise type */ |
255 | ulint mbminlen, /*!< in: minimum length of |
256 | a multi-byte character, in bytes */ |
257 | ulint mbmaxlen, /*!< in: maximum length of |
258 | a multi-byte character, in bytes */ |
259 | ulint prefix_len, /*!< in: length of the requested |
260 | prefix, in characters, multiplied by |
261 | dtype_get_mbmaxlen(dtype) */ |
262 | ulint data_len, /*!< in: length of str (in bytes) */ |
263 | const char* str); /*!< in: the string whose prefix |
264 | length is being determined */ |
265 | /*********************************************************************//** |
266 | Checks if a data main type is a string type. Also a BLOB is considered a |
267 | string type. |
268 | @return TRUE if string type */ |
269 | ibool |
270 | dtype_is_string_type( |
271 | /*=================*/ |
272 | ulint mtype); /*!< in: InnoDB main data type code: DATA_CHAR, ... */ |
273 | /*********************************************************************//** |
274 | Checks if a type is a binary string type. Note that for tables created with |
275 | < 4.0.14, we do not know if a DATA_BLOB column is a BLOB or a TEXT column. For |
276 | those DATA_BLOB columns this function currently returns FALSE. |
277 | @return TRUE if binary string type */ |
278 | ibool |
279 | dtype_is_binary_string_type( |
280 | /*========================*/ |
281 | ulint mtype, /*!< in: main data type */ |
282 | ulint prtype);/*!< in: precise type */ |
283 | /*********************************************************************//** |
284 | Checks if a type is a non-binary string type. That is, dtype_is_string_type is |
285 | TRUE and dtype_is_binary_string_type is FALSE. Note that for tables created |
286 | with < 4.0.14, we do not know if a DATA_BLOB column is a BLOB or a TEXT column. |
287 | For those DATA_BLOB columns this function currently returns TRUE. |
288 | @return TRUE if non-binary string type */ |
289 | ibool |
290 | dtype_is_non_binary_string_type( |
291 | /*============================*/ |
292 | ulint mtype, /*!< in: main data type */ |
293 | ulint prtype);/*!< in: precise type */ |
294 | /*********************************************************************//** |
295 | Sets a data type structure. */ |
296 | UNIV_INLINE |
297 | void |
298 | dtype_set( |
299 | /*======*/ |
300 | dtype_t* type, /*!< in: type struct to init */ |
301 | ulint mtype, /*!< in: main data type */ |
302 | ulint prtype, /*!< in: precise type */ |
303 | ulint len); /*!< in: precision of type */ |
304 | /*********************************************************************//** |
305 | Copies a data type structure. */ |
306 | UNIV_INLINE |
307 | void |
308 | dtype_copy( |
309 | /*=======*/ |
310 | dtype_t* type1, /*!< in: type struct to copy to */ |
311 | const dtype_t* type2); /*!< in: type struct to copy from */ |
312 | /*********************************************************************//** |
313 | Gets the SQL main data type. |
314 | @return SQL main data type */ |
315 | UNIV_INLINE |
316 | ulint |
317 | dtype_get_mtype( |
318 | /*============*/ |
319 | const dtype_t* type); /*!< in: data type */ |
320 | /*********************************************************************//** |
321 | Gets the precise data type. |
322 | @return precise data type */ |
323 | UNIV_INLINE |
324 | ulint |
325 | dtype_get_prtype( |
326 | /*=============*/ |
327 | const dtype_t* type); /*!< in: data type */ |
328 | |
329 | /*********************************************************************//** |
330 | Compute the mbminlen and mbmaxlen members of a data type structure. */ |
331 | UNIV_INLINE |
332 | void |
333 | dtype_get_mblen( |
334 | /*============*/ |
335 | ulint mtype, /*!< in: main type */ |
336 | ulint prtype, /*!< in: precise type (and collation) */ |
337 | ulint* mbminlen, /*!< out: minimum length of a |
338 | multi-byte character */ |
339 | ulint* mbmaxlen); /*!< out: maximum length of a |
340 | multi-byte character */ |
341 | /*********************************************************************//** |
342 | Gets the MySQL charset-collation code for MySQL string types. |
343 | @return MySQL charset-collation code */ |
344 | UNIV_INLINE |
345 | ulint |
346 | dtype_get_charset_coll( |
347 | /*===================*/ |
348 | ulint prtype);/*!< in: precise data type */ |
349 | /** Form a precise type from the < 4.1.2 format precise type plus the |
350 | charset-collation code. |
351 | @param[in] old_prtype MySQL type code and the flags |
352 | DATA_BINARY_TYPE etc. |
353 | @param[in] charset_coll character-set collation code |
354 | @return precise type, including the charset-collation code */ |
355 | UNIV_INLINE |
356 | uint32_t |
357 | dtype_form_prtype(ulint old_prtype, ulint charset_coll) |
358 | { |
359 | ut_ad(old_prtype < 256 * 256); |
360 | ut_ad(charset_coll <= MAX_CHAR_COLL_NUM); |
361 | return(uint32_t(old_prtype + (charset_coll << 16))); |
362 | } |
363 | |
364 | /*********************************************************************//** |
365 | Determines if a MySQL string type is a subset of UTF-8. This function |
366 | may return false negatives, in case further character-set collation |
367 | codes are introduced in MySQL later. |
368 | @return whether a subset of UTF-8 */ |
369 | UNIV_INLINE |
370 | bool |
371 | dtype_is_utf8( |
372 | /*==========*/ |
373 | ulint prtype);/*!< in: precise data type */ |
374 | /*********************************************************************//** |
375 | Gets the type length. |
376 | @return fixed length of the type, in bytes, or 0 if variable-length */ |
377 | UNIV_INLINE |
378 | ulint |
379 | dtype_get_len( |
380 | /*==========*/ |
381 | const dtype_t* type); /*!< in: data type */ |
382 | |
383 | /*********************************************************************//** |
384 | Gets the minimum length of a character, in bytes. |
385 | @return minimum length of a char, in bytes, or 0 if this is not a |
386 | character type */ |
387 | UNIV_INLINE |
388 | ulint |
389 | dtype_get_mbminlen( |
390 | /*===============*/ |
391 | const dtype_t* type); /*!< in: type */ |
392 | /*********************************************************************//** |
393 | Gets the maximum length of a character, in bytes. |
394 | @return maximum length of a char, in bytes, or 0 if this is not a |
395 | character type */ |
396 | UNIV_INLINE |
397 | ulint |
398 | dtype_get_mbmaxlen( |
399 | /*===============*/ |
400 | const dtype_t* type); /*!< in: type */ |
401 | /***********************************************************************//** |
402 | Returns the size of a fixed size data type, 0 if not a fixed size type. |
403 | @return fixed size, or 0 */ |
404 | UNIV_INLINE |
405 | ulint |
406 | dtype_get_fixed_size_low( |
407 | /*=====================*/ |
408 | ulint mtype, /*!< in: main type */ |
409 | ulint prtype, /*!< in: precise type */ |
410 | ulint len, /*!< in: length */ |
411 | ulint mbminlen, /*!< in: minimum length of a |
412 | multibyte character, in bytes */ |
413 | ulint mbmaxlen, /*!< in: maximum length of a |
414 | multibyte character, in bytes */ |
415 | ulint comp); /*!< in: nonzero=ROW_FORMAT=COMPACT */ |
416 | |
417 | /***********************************************************************//** |
418 | Returns the minimum size of a data type. |
419 | @return minimum size */ |
420 | UNIV_INLINE |
421 | ulint |
422 | dtype_get_min_size_low( |
423 | /*===================*/ |
424 | ulint mtype, /*!< in: main type */ |
425 | ulint prtype, /*!< in: precise type */ |
426 | ulint len, /*!< in: length */ |
427 | ulint mbminlen, /*!< in: minimum length of a character */ |
428 | ulint mbmaxlen); /*!< in: maximum length of a character */ |
429 | /***********************************************************************//** |
430 | Returns the maximum size of a data type. Note: types in system tables may be |
431 | incomplete and return incorrect information. |
432 | @return maximum size */ |
433 | UNIV_INLINE |
434 | ulint |
435 | dtype_get_max_size_low( |
436 | /*===================*/ |
437 | ulint mtype, /*!< in: main type */ |
438 | ulint len); /*!< in: length */ |
439 | /***********************************************************************//** |
440 | Returns the ROW_FORMAT=REDUNDANT stored SQL NULL size of a type. |
441 | For fixed length types it is the fixed length of the type, otherwise 0. |
442 | @return SQL null storage size in ROW_FORMAT=REDUNDANT */ |
443 | UNIV_INLINE |
444 | ulint |
445 | dtype_get_sql_null_size( |
446 | /*====================*/ |
447 | const dtype_t* type, /*!< in: type */ |
448 | ulint comp); /*!< in: nonzero=ROW_FORMAT=COMPACT */ |
449 | |
450 | /**********************************************************************//** |
451 | Reads to a type the stored information which determines its alphabetical |
452 | ordering and the storage size of an SQL NULL value. */ |
453 | UNIV_INLINE |
454 | void |
455 | dtype_read_for_order_and_null_size( |
456 | /*===============================*/ |
457 | dtype_t* type, /*!< in: type struct */ |
458 | const byte* buf); /*!< in: buffer for the stored order info */ |
459 | /**********************************************************************//** |
460 | Stores for a type the information which determines its alphabetical ordering |
461 | and the storage size of an SQL NULL value. This is the >= 4.1.x storage |
462 | format. */ |
463 | UNIV_INLINE |
464 | void |
465 | dtype_new_store_for_order_and_null_size( |
466 | /*====================================*/ |
467 | byte* buf, /*!< in: buffer for |
468 | DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE |
469 | bytes where we store the info */ |
470 | const dtype_t* type, /*!< in: type struct */ |
471 | ulint prefix_len);/*!< in: prefix length to |
472 | replace type->len, or 0 */ |
473 | /**********************************************************************//** |
474 | Reads to a type the stored information which determines its alphabetical |
475 | ordering and the storage size of an SQL NULL value. This is the 4.1.x storage |
476 | format. */ |
477 | UNIV_INLINE |
478 | void |
479 | dtype_new_read_for_order_and_null_size( |
480 | /*===================================*/ |
481 | dtype_t* type, /*!< in: type struct */ |
482 | const byte* buf); /*!< in: buffer for stored type order info */ |
483 | |
484 | /*********************************************************************//** |
485 | Returns the type's SQL name (e.g. BIGINT UNSIGNED) from mtype,prtype,len |
486 | @return the SQL type name */ |
487 | UNIV_INLINE |
488 | char* |
489 | dtype_sql_name( |
490 | /*===========*/ |
491 | unsigned mtype, /*!< in: mtype */ |
492 | unsigned prtype, /*!< in: prtype */ |
493 | unsigned len, /*!< in: len */ |
494 | char* name, /*!< out: SQL name */ |
495 | unsigned name_sz);/*!< in: size of the name buffer */ |
496 | |
497 | /*********************************************************************//** |
498 | Validates a data type structure. |
499 | @return TRUE if ok */ |
500 | ibool |
501 | dtype_validate( |
502 | /*===========*/ |
503 | const dtype_t* type); /*!< in: type struct to validate */ |
504 | #ifdef UNIV_DEBUG |
505 | /** Print a data type structure. |
506 | @param[in] type data type */ |
507 | void |
508 | dtype_print( |
509 | const dtype_t* type); |
510 | #endif /* UNIV_DEBUG */ |
511 | |
512 | /* Structure for an SQL data type. |
513 | If you add fields to this structure, be sure to initialize them everywhere. |
514 | This structure is initialized in the following functions: |
515 | dtype_set() |
516 | dtype_read_for_order_and_null_size() |
517 | dtype_new_read_for_order_and_null_size() |
518 | sym_tab_add_null_lit() */ |
519 | |
520 | struct dtype_t{ |
521 | unsigned prtype:32; /*!< precise type; MySQL data |
522 | type, charset code, flags to |
523 | indicate nullability, |
524 | signedness, whether this is a |
525 | binary string, whether this is |
526 | a true VARCHAR where MySQL |
527 | uses 2 bytes to store the length */ |
528 | unsigned mtype:8; /*!< main data type */ |
529 | |
530 | /* the remaining fields do not affect alphabetical ordering: */ |
531 | |
532 | unsigned len:16; /*!< length; for MySQL data this |
533 | is field->pack_length(), |
534 | except that for a >= 5.0.3 |
535 | type true VARCHAR this is the |
536 | maximum byte length of the |
537 | string data (in addition to |
538 | the string, MySQL uses 1 or 2 |
539 | bytes to store the string length) */ |
540 | unsigned mbminlen:3; /*!< minimum length of a character, |
541 | in bytes */ |
542 | unsigned mbmaxlen:3; /*!< maximum length of a character, |
543 | in bytes */ |
544 | |
545 | /** @return whether this is system versioned user field */ |
546 | bool is_versioned() const { return !(~prtype & DATA_VERSIONED); } |
547 | /** @return whether this is the system field start */ |
548 | bool vers_sys_start() const |
549 | { |
550 | return (prtype & DATA_VERSIONED) == DATA_VERS_START; |
551 | } |
552 | /** @return whether this is the system field end */ |
553 | bool vers_sys_end() const |
554 | { |
555 | return (prtype & DATA_VERSIONED) == DATA_VERS_END; |
556 | } |
557 | }; |
558 | |
559 | /** The DB_TRX_ID,DB_ROLL_PTR values for "no history is available" */ |
560 | extern const byte reset_trx_id[DATA_TRX_ID_LEN + DATA_ROLL_PTR_LEN]; |
561 | |
562 | #include "data0type.ic" |
563 | |
564 | #endif |
565 | |