data0type.h
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:13k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. Data types
  3. (c) 1996 Innobase Oy
  4. Created 1/16/1996 Heikki Tuuri
  5. *******************************************************/
  6. #ifndef data0type_h
  7. #define data0type_h
  8. #include "univ.i"
  9. extern ulint data_mysql_default_charset_coll;
  10. extern ulint data_mysql_latin1_swedish_charset_coll;
  11. /* SQL data type struct */
  12. typedef struct dtype_struct dtype_t;
  13. /* This variable is initialized as the standard binary variable length
  14. data type */
  15. extern dtype_t*  dtype_binary;
  16. /*-------------------------------------------*/
  17. /* The 'MAIN TYPE' of a column */
  18. #define DATA_VARCHAR 1 /* character varying of the
  19. latin1_swedish_ci charset-collation */
  20. #define DATA_CHAR 2 /* fixed length character of the
  21. latin1_swedish_ci charset-collation */
  22. #define DATA_FIXBINARY 3 /* binary string of fixed length */
  23. #define DATA_BINARY 4 /* binary string */
  24. #define DATA_BLOB 5 /* binary large object, or a TEXT type;
  25. if prtype & DATA_BINARY_TYPE == 0, then this is
  26. actually a TEXT column (or a BLOB created
  27. with < 4.0.14) */
  28. #define DATA_INT 6 /* integer: can be any size 1 - 8 bytes */
  29. #define DATA_SYS_CHILD 7 /* address of the child page in node pointer */
  30. #define DATA_SYS 8 /* system column */
  31. /* Data types >= DATA_FLOAT must be compared using the whole field, not as
  32. binary strings */
  33. #define DATA_FLOAT 9
  34. #define DATA_DOUBLE 10
  35. #define DATA_DECIMAL 11 /* decimal number stored as an ASCII string */
  36. #define DATA_VARMYSQL 12 /* any charset varying length char */
  37. #define DATA_MYSQL 13 /* any charset fixed length char */
  38. /* NOTE that 4.1.1 used DATA_MYSQL and
  39. DATA_VARMYSQL for all character sets, and the
  40. charset-collation for tables created with it
  41. can also be latin1_swedish_ci */
  42. #define DATA_MTYPE_MAX 63 /* dtype_store_for_order_and_null_size()
  43. requires the values are <= 63 */
  44. /*-------------------------------------------*/
  45. /* The 'PRECISE TYPE' of a column */
  46. /*
  47. Tables created by a MySQL user have the following convention:
  48. - In the least significant byte in the precise type we store the MySQL type
  49. code (not applicable for system columns).
  50. - In the second least significant byte we OR flags DATA_NOT_NULL,
  51. DATA_UNSIGNED, DATA_BINARY_TYPE.
  52. - In the third least significant byte of the precise type of string types we
  53. store the MySQL charset-collation code. In DATA_BLOB columns created with
  54. < 4.0.14 we do not actually know if it is a BLOB or a TEXT column. Since there
  55. are no indexes on prefixes of BLOB or TEXT columns in < 4.0.14, this is no
  56. problem, though.
  57. Note that versions < 4.1.2 or < 5.0.1 did not store the charset code to the
  58. precise type, since the charset was always the default charset of the MySQL
  59. installation. If the stored charset code is 0 in the system table SYS_COLUMNS
  60. of InnoDB, that means that the default charset of this MySQL installation
  61. should be used.
  62. When loading a table definition from the system tables to the InnoDB data
  63. dictionary cache in main memory, InnoDB versions >= 4.1.2 and >= 5.0.1 check
  64. if the stored charset-collation is 0, and if that is the case and the type is
  65. a non-binary string, replace that 0 by the default charset-collation code of
  66. this MySQL installation. In short, in old tables, the charset-collation code
  67. in the system tables on disk can be 0, but in in-memory data structures
  68. (dtype_t), the charset-collation code is always != 0 for non-binary string
  69. types.
  70. In new tables, in binary string types, the charset-collation code is the
  71. MySQL code for the 'binary charset', that is, != 0.
  72. For binary string types and for DATA_CHAR, DATA_VARCHAR, and for those
  73. DATA_BLOB which are binary or have the charset-collation latin1_swedish_ci,
  74. InnoDB performs all comparisons internally, without resorting to the MySQL
  75. comparison functions. This is to save CPU time.
  76. InnoDB's own internal system tables have different precise types for their
  77. columns, and for them the precise type is usually not used at all.
  78. */
  79. #define DATA_ENGLISH    4       /* English language character string: this
  80. is a relic from pre-MySQL time and only used
  81. for InnoDB's own system tables */
  82. #define DATA_ERROR 111 /* another relic from pre-MySQL time */
  83. #define DATA_MYSQL_TYPE_MASK 255 /* AND with this mask to extract the MySQL
  84.  type from the precise type */
  85. /* Precise data types for system columns and the length of those columns;
  86. NOTE: the values must run from 0 up in the order given! All codes must
  87. be less than 256 */
  88. #define DATA_ROW_ID 0 /* row id: a dulint */
  89. #define DATA_ROW_ID_LEN 6 /* stored length for row id */
  90. #define DATA_TRX_ID 1 /* transaction id: 6 bytes */
  91. #define DATA_TRX_ID_LEN 6
  92. #define DATA_ROLL_PTR 2 /* rollback data pointer: 7 bytes */
  93. #define DATA_ROLL_PTR_LEN 7
  94. #define DATA_MIX_ID 3 /* mixed index label: a dulint, stored in
  95. a row in a compressed form */
  96. #define DATA_MIX_ID_LEN 9 /* maximum stored length for mix id (in a
  97. compressed dulint form) */
  98. #define DATA_N_SYS_COLS 4  /* number of system columns defined above */
  99. /* Flags ORed to the precise data type */
  100. #define DATA_NOT_NULL 256 /* this is ORed to the precise type when
  101. the column is declared as NOT NULL */
  102. #define DATA_UNSIGNED 512 /* this id ORed to the precise type when
  103. we have an unsigned integer type */
  104. #define DATA_BINARY_TYPE 1024 /* if the data type is a binary character
  105. string, this is ORed to the precise type:
  106. this only holds for tables created with
  107. >= MySQL-4.0.14 */
  108. /* #define DATA_NONLATIN1 2048 This is a relic from < 4.1.2 and < 5.0.1.
  109. In earlier versions this was set for some
  110. BLOB columns.
  111. */
  112. /*-------------------------------------------*/
  113. /* This many bytes we need to store the type information affecting the
  114. alphabetical order for a single field and decide the storage size of an
  115. SQL null*/
  116. #define DATA_ORDER_NULL_TYPE_BUF_SIZE 4
  117. /* In the >= 4.1.x storage format we add 2 bytes more so that we can also
  118. store the charset-collation number; one byte is left unused, though */
  119. #define DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE 6
  120. /*************************************************************************
  121. Checks if a string type has to be compared by the MySQL comparison functions.
  122. InnoDB internally only handles binary byte string comparisons, as well as
  123. latin1_swedish_ci strings. For example, UTF-8 strings have to be compared
  124. by MySQL. */
  125. ibool
  126. dtype_str_needs_mysql_cmp(
  127. /*======================*/
  128. /* out: TRUE if a string type that requires
  129. comparison with MySQL functions */
  130. dtype_t* dtype); /* in: type struct */
  131. /*************************************************************************
  132. For the documentation of this function, see innobase_get_at_most_n_mbchars()
  133. in ha_innodb.cc. */
  134. ulint
  135. dtype_get_at_most_n_mbchars(
  136. /*========================*/
  137. dtype_t* dtype,
  138. ulint prefix_len,
  139. ulint data_len,
  140. const char* str);
  141. /*************************************************************************
  142. Checks if a data main type is a string type. Also a BLOB is considered a
  143. string type. */
  144. ibool
  145. dtype_is_string_type(
  146. /*=================*/
  147. /* out: TRUE if string type */
  148. ulint mtype); /* in: InnoDB main data type code: DATA_CHAR, ... */
  149. /*************************************************************************
  150. Checks if a type is a binary string type. Note that for tables created with
  151. < 4.0.14, we do not know if a DATA_BLOB column is a BLOB or a TEXT column. For
  152. those DATA_BLOB columns this function currently returns FALSE. */
  153. ibool
  154. dtype_is_binary_string_type(
  155. /*========================*/
  156. /* out: TRUE if binary string type */
  157. ulint mtype, /* in: main data type */
  158. ulint prtype);/* in: precise type */
  159. /*************************************************************************
  160. Checks if a type is a non-binary string type. That is, dtype_is_string_type is
  161. TRUE and dtype_is_binary_string_type is FALSE. Note that for tables created
  162. with < 4.0.14, we do not know if a DATA_BLOB column is a BLOB or a TEXT column.
  163. For those DATA_BLOB columns this function currently returns TRUE. */
  164. ibool
  165. dtype_is_non_binary_string_type(
  166. /*============================*/
  167. /* out: TRUE if non-binary string type */
  168. ulint mtype, /* in: main data type */
  169. ulint prtype);/* in: precise type */
  170. /*************************************************************************
  171. Sets a data type structure. */
  172. UNIV_INLINE
  173. void
  174. dtype_set(
  175. /*======*/
  176. dtype_t* type, /* in: type struct to init */
  177. ulint mtype, /* in: main data type */
  178. ulint prtype, /* in: precise type */
  179. ulint len, /* in: length of type */
  180. ulint prec); /* in: precision of type */
  181. /*************************************************************************
  182. Copies a data type structure. */
  183. UNIV_INLINE
  184. void
  185. dtype_copy(
  186. /*=======*/
  187. dtype_t* type1, /* in: type struct to copy to */
  188. dtype_t* type2); /* in: type struct to copy from */
  189. /*************************************************************************
  190. Gets the SQL main data type. */
  191. UNIV_INLINE
  192. ulint
  193. dtype_get_mtype(
  194. /*============*/
  195. dtype_t* type);
  196. /*************************************************************************
  197. Gets the precise data type. */
  198. UNIV_INLINE
  199. ulint
  200. dtype_get_prtype(
  201. /*=============*/
  202. dtype_t* type);
  203. /*************************************************************************
  204. Gets the MySQL charset-collation code for MySQL string types. */
  205. ulint
  206. dtype_get_charset_coll_noninline(
  207. /*=============================*/
  208. ulint prtype);/* in: precise data type */
  209. /*************************************************************************
  210. Gets the MySQL charset-collation code for MySQL string types. */
  211. UNIV_INLINE
  212. ulint
  213. dtype_get_charset_coll(
  214. /*===================*/
  215. ulint prtype);/* in: precise data type */
  216. /*************************************************************************
  217. Forms a precise type from the < 4.1.2 format precise type plus the
  218. charset-collation code. */
  219. ulint
  220. dtype_form_prtype(
  221. /*==============*/
  222. ulint old_prtype, /* in: the MySQL type code and the flags
  223. DATA_BINARY_TYPE etc. */
  224. ulint charset_coll); /* in: MySQL charset-collation code */
  225. /*************************************************************************
  226. Gets the type length. */
  227. UNIV_INLINE
  228. ulint
  229. dtype_get_len(
  230. /*==========*/
  231. dtype_t* type);
  232. /*************************************************************************
  233. Gets the type precision. */
  234. UNIV_INLINE
  235. ulint
  236. dtype_get_prec(
  237. /*===========*/
  238. dtype_t* type);
  239. /*************************************************************************
  240. Gets the padding character code for the type. */
  241. UNIV_INLINE
  242. ulint
  243. dtype_get_pad_char(
  244. /*===============*/
  245. /* out: padding character code, or
  246. ULINT_UNDEFINED if no padding specified */
  247. dtype_t* type); /* in: type */
  248. /***************************************************************************
  249. Returns the size of a fixed size data type, 0 if not a fixed size type. */
  250. UNIV_INLINE
  251. ulint
  252. dtype_get_fixed_size(
  253. /*=================*/
  254. /* out: fixed size, or 0 */
  255. dtype_t* type); /* in: type */
  256. /***************************************************************************
  257. Returns a stored SQL NULL size for a type. For fixed length types it is
  258. the fixed length of the type, otherwise 0. */
  259. UNIV_INLINE
  260. ulint
  261. dtype_get_sql_null_size(
  262. /*====================*/
  263. /* out: SQL null storage size */
  264. dtype_t* type); /* in: type */
  265. /***************************************************************************
  266. Returns TRUE if a type is of a fixed size. */
  267. UNIV_INLINE
  268. ibool
  269. dtype_is_fixed_size(
  270. /*================*/
  271. /* out: TRUE if fixed size */
  272. dtype_t* type); /* in: type */
  273. /**************************************************************************
  274. Reads to a type the stored information which determines its alphabetical
  275. ordering and the storage size of an SQL NULL value. */
  276. UNIV_INLINE
  277. void
  278. dtype_read_for_order_and_null_size(
  279. /*===============================*/
  280. dtype_t* type, /* in: type struct */
  281. byte* buf); /* in: buffer for the stored order info */
  282. /**************************************************************************
  283. Stores for a type the information which determines its alphabetical ordering
  284. and the storage size of an SQL NULL value. This is the >= 4.1.x storage
  285. format. */
  286. UNIV_INLINE
  287. void
  288. dtype_new_store_for_order_and_null_size(
  289. /*====================================*/
  290. byte* buf, /* in: buffer for
  291. DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE
  292. bytes where we store the info */
  293. dtype_t* type); /* in: type struct */
  294. /**************************************************************************
  295. Reads to a type the stored information which determines its alphabetical
  296. ordering and the storage size of an SQL NULL value. This is the 4.1.x storage
  297. format. */
  298. UNIV_INLINE
  299. void
  300. dtype_new_read_for_order_and_null_size(
  301. /*===================================*/
  302. dtype_t* type, /* in: type struct */
  303. byte* buf); /* in: buffer for stored type order info */
  304. /*************************************************************************
  305. Validates a data type structure. */
  306. ibool
  307. dtype_validate(
  308. /*===========*/
  309. /* out: TRUE if ok */
  310. dtype_t* type); /* in: type struct to validate */
  311. /*************************************************************************
  312. Prints a data type structure. */
  313. void
  314. dtype_print(
  315. /*========*/
  316. dtype_t* type); /* in: type */
  317. /* Structure for an SQL data type */
  318. struct dtype_struct{
  319. ulint mtype; /* main data type */
  320. ulint prtype; /* precise type; MySQL data type */
  321. /* the remaining two fields do not affect alphabetical ordering: */
  322. ulint len; /* length */
  323. ulint prec; /* precision */
  324. };
  325. #ifndef UNIV_NONINL
  326. #include "data0type.ic"
  327. #endif
  328. #endif