data0type.c
上传用户: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 "data0type.h"
  7. #ifdef UNIV_NONINL
  8. #include "data0type.ic"
  9. #endif
  10. /**********************************************************************
  11. This function is used to find the storage length in bytes of the first n
  12. characters for prefix indexes using a multibyte character set. The function
  13. finds charset information and returns length of prefix_len characters in the
  14. index field in bytes.
  15. NOTE: the prototype of this function is copied from ha_innodb.cc! If you change
  16. this function, you MUST change also the prototype here! */
  17. ulint
  18. innobase_get_at_most_n_mbchars(
  19. /*===========================*/
  20. /* out: number of bytes occupied by the first
  21. n characters */
  22. ulint charset_id, /* in: character set id */
  23. ulint prefix_len, /* in: prefix length in bytes of the index
  24. (this has to be divided by mbmaxlen to get the
  25. number of CHARACTERS n in the prefix) */
  26. ulint data_len,         /* in: length of the string in bytes */
  27. const char* str); /* in: character string */
  28. /* At the database startup we store the default-charset collation number of
  29. this MySQL installation to this global variable. If we have < 4.1.2 format
  30. column definitions, or records in the insert buffer, we use this
  31. charset-collation code for them. */
  32. ulint data_mysql_default_charset_coll = 99999999;
  33. ulint data_mysql_latin1_swedish_charset_coll = 99999999;
  34. dtype_t dtype_binary_val = {DATA_BINARY, 0, 0, 0};
  35. dtype_t*  dtype_binary  = &dtype_binary_val;
  36. /*************************************************************************
  37. Checks if a string type has to be compared by the MySQL comparison functions.
  38. InnoDB internally only handles binary byte string comparisons, as well as
  39. latin1_swedish_ci strings. For example, UTF-8 strings have to be compared
  40. by MySQL. */
  41. ibool
  42. dtype_str_needs_mysql_cmp(
  43. /*======================*/
  44. /* out: TRUE if a string type that requires
  45. comparison with MySQL functions */
  46. dtype_t* dtype) /* in: type struct */
  47. {
  48. if (dtype->mtype == DATA_MYSQL
  49.     || dtype->mtype == DATA_VARMYSQL
  50.     || (dtype->mtype == DATA_BLOB
  51.         && 0 == (dtype->prtype & DATA_BINARY_TYPE)
  52. && dtype_get_charset_coll(dtype->prtype) !=
  53. data_mysql_latin1_swedish_charset_coll)) {
  54. return(TRUE);
  55. }
  56. return(FALSE);
  57. }
  58. /*************************************************************************
  59. For the documentation of this function, see innobase_get_at_most_n_mbchars()
  60. in ha_innodb.cc. */
  61. ulint
  62. dtype_get_at_most_n_mbchars(
  63. /*========================*/
  64. dtype_t* dtype,
  65. ulint prefix_len,
  66. ulint data_len,
  67. const char* str)
  68. {
  69. ut_a(data_len != UNIV_SQL_NULL);
  70. if (dtype_str_needs_mysql_cmp(dtype)) {
  71. return(innobase_get_at_most_n_mbchars(
  72. dtype_get_charset_coll(dtype->prtype),
  73. prefix_len, data_len, str));
  74. }
  75. /* We assume here that the string types that InnoDB itself can compare
  76. are single-byte charsets! */
  77. if (prefix_len < data_len) {
  78. return(prefix_len);
  79. }
  80. return(data_len);
  81. }
  82. /*************************************************************************
  83. Checks if a data main type is a string type. Also a BLOB is considered a
  84. string type. */
  85. ibool
  86. dtype_is_string_type(
  87. /*=================*/
  88. /* out: TRUE if string type */
  89. ulint mtype) /* in: InnoDB main data type code: DATA_CHAR, ... */
  90. {
  91.   if (mtype <= DATA_BLOB
  92.     || mtype == DATA_MYSQL
  93.     || mtype == DATA_VARMYSQL) {
  94. return(TRUE);
  95. }
  96. return(FALSE);
  97. }
  98. /*************************************************************************
  99. Checks if a type is a binary string type. Note that for tables created with
  100. < 4.0.14, we do not know if a DATA_BLOB column is a BLOB or a TEXT column. For
  101. those DATA_BLOB columns this function currently returns FALSE. */
  102. ibool
  103. dtype_is_binary_string_type(
  104. /*========================*/
  105. /* out: TRUE if binary string type */
  106. ulint mtype, /* in: main data type */
  107. ulint prtype) /* in: precise type */
  108. {
  109.         if ((mtype == DATA_FIXBINARY)
  110.     || (mtype == DATA_BINARY)
  111.     || (mtype == DATA_BLOB && (prtype & DATA_BINARY_TYPE))) {
  112. return(TRUE);
  113. }
  114. return(FALSE);
  115. }
  116. /*************************************************************************
  117. Checks if a type is a non-binary string type. That is, dtype_is_string_type is
  118. TRUE and dtype_is_binary_string_type is FALSE. Note that for tables created
  119. with < 4.0.14, we do not know if a DATA_BLOB column is a BLOB or a TEXT column.
  120. For those DATA_BLOB columns this function currently returns TRUE. */
  121. ibool
  122. dtype_is_non_binary_string_type(
  123. /*============================*/
  124. /* out: TRUE if non-binary string type */
  125. ulint mtype, /* in: main data type */
  126. ulint prtype) /* in: precise type */
  127. {
  128. if (dtype_is_string_type(mtype) == TRUE
  129.     && dtype_is_binary_string_type(mtype, prtype) == FALSE) {
  130. return(TRUE);
  131. }
  132. return(FALSE);
  133. }
  134. /*************************************************************************
  135. Gets the MySQL charset-collation code for MySQL string types. */
  136. ulint
  137. dtype_get_charset_coll_noninline(
  138. /*=============================*/
  139. ulint prtype) /* in: precise data type */
  140. {
  141. return(dtype_get_charset_coll(prtype));
  142. }
  143. /*************************************************************************
  144. Forms a precise type from the < 4.1.2 format precise type plus the
  145. charset-collation code. */
  146. ulint
  147. dtype_form_prtype(
  148. /*==============*/
  149. ulint old_prtype, /* in: the MySQL type code and the flags
  150. DATA_BINARY_TYPE etc. */
  151. ulint charset_coll) /* in: MySQL charset-collation code */
  152. {
  153. ut_a(old_prtype < 256 * 256);
  154. ut_a(charset_coll < 256);
  155. return(old_prtype + (charset_coll << 16));
  156. }
  157. /*************************************************************************
  158. Validates a data type structure. */
  159. ibool
  160. dtype_validate(
  161. /*===========*/
  162. /* out: TRUE if ok */
  163. dtype_t* type) /* in: type struct to validate */
  164. {
  165. ut_a(type);
  166. ut_a((type->mtype >= DATA_VARCHAR) && (type->mtype <= DATA_MYSQL));
  167. if (type->mtype == DATA_SYS) {
  168. ut_a(type->prtype <= DATA_MIX_ID);
  169. }
  170. return(TRUE);
  171. }
  172. /*************************************************************************
  173. Prints a data type structure. */
  174. void
  175. dtype_print(
  176. /*========*/
  177. dtype_t* type) /* in: type */
  178. {
  179. ulint mtype;
  180. ulint prtype;
  181. ulint len;
  182. ut_a(type);
  183. mtype = type->mtype;
  184. prtype = type->prtype;
  185. if (mtype == DATA_VARCHAR) {
  186. fputs("DATA_VARCHAR", stderr);
  187. } else if (mtype == DATA_CHAR) {
  188. fputs("DATA_CHAR", stderr);
  189. } else if (mtype == DATA_BINARY) {
  190. fputs("DATA_BINARY", stderr);
  191. } else if (mtype == DATA_INT) {
  192. fputs("DATA_INT", stderr);
  193. } else if (mtype == DATA_MYSQL) {
  194. fputs("DATA_MYSQL", stderr);
  195. } else if (mtype == DATA_SYS) {
  196. fputs("DATA_SYS", stderr);
  197. } else {
  198. fprintf(stderr, "type %lu", (ulong) mtype);
  199. }
  200. len = type->len;
  201. if ((type->mtype == DATA_SYS)
  202.    || (type->mtype == DATA_VARCHAR)
  203.    || (type->mtype == DATA_CHAR)) {
  204.   putc(' ', stderr);
  205. if (prtype == DATA_ROW_ID) {
  206. fputs("DATA_ROW_ID", stderr);
  207. len = DATA_ROW_ID_LEN;
  208. } else if (prtype == DATA_ROLL_PTR) {
  209. fputs("DATA_ROLL_PTR", stderr);
  210. len = DATA_ROLL_PTR_LEN;
  211. } else if (prtype == DATA_TRX_ID) {
  212. fputs("DATA_TRX_ID", stderr);
  213. len = DATA_TRX_ID_LEN;
  214. } else if (prtype == DATA_MIX_ID) {
  215. fputs("DATA_MIX_ID", stderr);
  216. } else if (prtype == DATA_ENGLISH) {
  217. fputs("DATA_ENGLISH", stderr);
  218. } else {
  219. fprintf(stderr, "prtype %lu", (ulong) mtype);
  220. }
  221. }
  222. fprintf(stderr, " len %lu prec %lu", (ulong) len, (ulong) type->prec);
  223. }