| 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 | |