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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. Data types
  3. (c) 1996 Innobase Oy
  4. Created 1/16/1996 Heikki Tuuri
  5. *******************************************************/
  6. #include "mach0data.h"
  7. /*************************************************************************
  8. Sets a data type structure. */
  9. UNIV_INLINE
  10. void
  11. dtype_set(
  12. /*======*/
  13. dtype_t* type, /* in: type struct to init */
  14. ulint mtype, /* in: main data type */
  15. ulint prtype, /* in: precise type */
  16. ulint len, /* in: length of type */
  17. ulint prec) /* in: precision of type */
  18. {
  19. ut_ad(type);
  20. ut_ad(mtype <= DATA_MTYPE_MAX);
  21. type->mtype = mtype;
  22. type->prtype = prtype;
  23. type->len = len;
  24. type->prec = prec;
  25. ut_ad(dtype_validate(type));
  26. }
  27. /*************************************************************************
  28. Copies a data type structure. */
  29. UNIV_INLINE
  30. void
  31. dtype_copy(
  32. /*=======*/
  33. dtype_t* type1, /* in: type struct to copy to */
  34. dtype_t* type2) /* in: type struct to copy from */
  35. {
  36. *type1 = *type2;
  37. ut_ad(dtype_validate(type1));
  38. }
  39. /*************************************************************************
  40. Gets the SQL main data type. */
  41. UNIV_INLINE
  42. ulint
  43. dtype_get_mtype(
  44. /*============*/
  45. dtype_t* type)
  46. {
  47. ut_ad(type);
  48. return(type->mtype);
  49. }
  50. /*************************************************************************
  51. Gets the precise data type. */
  52. UNIV_INLINE
  53. ulint
  54. dtype_get_prtype(
  55. /*=============*/
  56. dtype_t* type)
  57. {
  58. ut_ad(type);
  59. return(type->prtype);
  60. }
  61. /*************************************************************************
  62. Gets the MySQL charset-collation code for MySQL string types. */
  63. UNIV_INLINE
  64. ulint
  65. dtype_get_charset_coll(
  66. /*===================*/
  67. ulint prtype) /* in: precise data type */
  68. {
  69. return((prtype >> 16) & 0xFFUL);
  70. }
  71. /*************************************************************************
  72. Gets the type length. */
  73. UNIV_INLINE
  74. ulint
  75. dtype_get_len(
  76. /*==========*/
  77. dtype_t* type)
  78. {
  79. ut_ad(type);
  80. return(type->len);
  81. }
  82. /*************************************************************************
  83. Gets the type precision. */
  84. UNIV_INLINE
  85. ulint
  86. dtype_get_prec(
  87. /*===========*/
  88. dtype_t* type)
  89. {
  90. ut_ad(type);
  91. return(type->prec);
  92. }
  93. /*************************************************************************
  94. Gets the padding character code for the type. */
  95. UNIV_INLINE
  96. ulint
  97. dtype_get_pad_char(
  98. /*===============*/
  99. /* out: padding character code, or
  100. ULINT_UNDEFINED if no padding specified */
  101. dtype_t* type) /* in: type */
  102. {
  103. if (type->mtype == DATA_CHAR
  104.     || type->mtype == DATA_VARCHAR
  105.     || type->mtype == DATA_BINARY
  106.     || type->mtype == DATA_FIXBINARY
  107.     || type->mtype == DATA_MYSQL
  108.     || type->mtype == DATA_VARMYSQL) {
  109. /* Space is the padding character for all char and binary
  110.         strings */
  111. return((ulint)' ');
  112. }
  113. /* No padding specified */
  114. return(ULINT_UNDEFINED);
  115. }
  116. /**************************************************************************
  117. Stores for a type the information which determines its alphabetical ordering
  118. and the storage size of an SQL NULL value. This is the >= 4.1.x storage
  119. format. */
  120. UNIV_INLINE
  121. void
  122. dtype_new_store_for_order_and_null_size(
  123. /*====================================*/
  124. byte* buf, /* in: buffer for
  125. DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE
  126. bytes where we store the info */
  127. dtype_t* type) /* in: type struct */
  128. {
  129. ut_ad(6 == DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE);
  130. buf[0] = (byte)(type->mtype & 0xFFUL);
  131. if (type->prtype & DATA_BINARY_TYPE) {
  132. buf[0] = buf[0] | 128;
  133. }
  134. /* In versions < 4.1.2 we had:  if (type->prtype & DATA_NONLATIN1) {
  135. buf[0] = buf[0] | 64;
  136. }
  137. */
  138. buf[1] = (byte)(type->prtype & 0xFFUL);
  139. mach_write_to_2(buf + 2, type->len & 0xFFFFUL);
  140. mach_write_to_2(buf + 4, dtype_get_charset_coll(type->prtype));
  141. /* Note that the second last byte is left unused, because the
  142. charset-collation code is always < 256 */
  143. }
  144. /**************************************************************************
  145. Reads to a type the stored information which determines its alphabetical
  146. ordering and the storage size of an SQL NULL value. This is the < 4.1.x
  147. storage format. */
  148. UNIV_INLINE
  149. void
  150. dtype_read_for_order_and_null_size(
  151. /*===============================*/
  152. dtype_t* type, /* in: type struct */
  153. byte* buf) /* in: buffer for stored type order info */
  154. {
  155. ut_ad(4 == DATA_ORDER_NULL_TYPE_BUF_SIZE);
  156. type->mtype = buf[0] & 63;
  157. type->prtype = buf[1];
  158. if (buf[0] & 128) {
  159.         type->prtype = type->prtype | DATA_BINARY_TYPE;
  160. }
  161. type->len = mach_read_from_2(buf + 2);
  162. type->prtype = dtype_form_prtype(type->prtype,
  163. data_mysql_default_charset_coll);
  164. }
  165. /**************************************************************************
  166. Reads to a type the stored information which determines its alphabetical
  167. ordering and the storage size of an SQL NULL value. This is the >= 4.1.x
  168. storage format. */
  169. UNIV_INLINE
  170. void
  171. dtype_new_read_for_order_and_null_size(
  172. /*===================================*/
  173. dtype_t* type, /* in: type struct */
  174. byte* buf) /* in: buffer for stored type order info */
  175. {
  176. ulint charset_coll;
  177. ut_ad(6 == DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE);
  178. type->mtype = buf[0] & 63;
  179. type->prtype = buf[1];
  180. if (buf[0] & 128) {
  181.         type->prtype = type->prtype | DATA_BINARY_TYPE;
  182. }
  183. type->len = mach_read_from_2(buf + 2);
  184. mach_read_from_2(buf + 4);
  185. charset_coll = mach_read_from_2(buf + 4);
  186. if (dtype_is_string_type(type->mtype)) {
  187. ut_a(charset_coll < 256);
  188. if (charset_coll == 0) {
  189. /* This insert buffer record was inserted with MySQL
  190. version < 4.1.2, and the charset-collation code was not
  191. explicitly stored to dtype->prtype at that time. It
  192. must be the default charset-collation of this MySQL
  193. installation. */
  194. charset_coll = data_mysql_default_charset_coll;
  195. }
  196. type->prtype = dtype_form_prtype(type->prtype, charset_coll);
  197. }
  198. }
  199. /***************************************************************************
  200. Returns the size of a fixed size data type, 0 if not a fixed size type. */
  201. UNIV_INLINE
  202. ulint
  203. dtype_get_fixed_size(
  204. /*=================*/
  205. /* out: fixed size, or 0 */
  206. dtype_t* type) /* in: type */
  207. {
  208. ulint mtype;
  209. mtype = dtype_get_mtype(type);
  210. switch (mtype) {
  211. case DATA_CHAR:
  212. case DATA_FIXBINARY:
  213. case DATA_INT:
  214. case DATA_FLOAT:
  215. case DATA_DOUBLE:
  216. case DATA_MYSQL:
  217. return(dtype_get_len(type));
  218. case DATA_SYS:  if (type->prtype == DATA_ROW_ID) {
  219. return(DATA_ROW_ID_LEN);
  220. } else if (type->prtype == DATA_TRX_ID) {
  221. return(DATA_TRX_ID_LEN);
  222. } else if (type->prtype == DATA_ROLL_PTR) {
  223. return(DATA_ROLL_PTR_LEN);
  224. } else {
  225. return(0);
  226. }
  227. case DATA_VARCHAR:
  228. case DATA_BINARY:
  229. case DATA_DECIMAL:
  230. case DATA_VARMYSQL:
  231. case DATA_BLOB:
  232. return(0); 
  233. default: ut_error;
  234. }
  235. return(0);
  236. }
  237. /***************************************************************************
  238. Returns a stored SQL NULL size for a type. For fixed length types it is
  239. the fixed length of the type, otherwise 0. */
  240. UNIV_INLINE
  241. ulint
  242. dtype_get_sql_null_size(
  243. /*====================*/
  244. /* out: SQL null storage size */
  245. dtype_t* type) /* in: type */
  246. {
  247. return(dtype_get_fixed_size(type));
  248. }
  249. /***************************************************************************
  250. Returns TRUE if a type is of a fixed size. */
  251. UNIV_INLINE
  252. ibool
  253. dtype_is_fixed_size(
  254. /*================*/
  255. /* out: TRUE if fixed size */
  256. dtype_t* type) /* in: type */
  257. {
  258. ulint size;
  259. size = dtype_get_fixed_size(type);
  260. if (size) {
  261. return(TRUE);
  262. }
  263. return(FALSE);
  264. }