MySQL 9.1.0
Source Code Documentation
m_ctype.h
Go to the documentation of this file.
1/* Copyright (c) 2000, 2024, Oracle and/or its affiliates.
2
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License, version 2.0,
5 as published by the Free Software Foundation.
6
7 This program is designed to work with certain software (including
8 but not limited to OpenSSL) that is licensed under separate terms,
9 as designated in a particular file or component or in included license
10 documentation. The authors of MySQL hereby grant you an additional
11 permission to link the program and your derivative works with the
12 separately licensed software that they have either included with
13 the program or referenced in the documentation.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License, version 2.0, for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
23
24#ifndef INCLUDE_MYSQL_STRINGS_M_CTYPE_H_
25#define INCLUDE_MYSQL_STRINGS_M_CTYPE_H_
26
27/**
28 @file include/mysql/strings/m_ctype.h
29 A better implementation of the UNIX ctype(3) library.
30*/
31
32#include <sys/types.h>
33
34#include <cassert>
35#include <cstddef>
36#include <cstdint>
37#include <cstdlib>
38#include <cstring>
39#include <deque>
40
41#include "mysql/attribute.h"
42#include "mysql/my_loglevel.h"
43#include "mysql/strings/api.h"
44#include "template_utils.h"
45
46constexpr int MY_CS_NAME_SIZE = 32;
47
48constexpr const char *CHARSET_DIR = "charsets/";
49
50typedef int myf; /* Type of MyFlags in my_funcs */
51
52/**
53 Our own version of wchar_t, ie., a type that holds a single Unicode code point
54 ("wide character"). unsigned long is always big enough to hold any character
55 in the BMP.
56*/
57typedef unsigned long my_wc_t;
58
59static inline void MY_PUT_MB2(unsigned char *s, uint16_t code) {
60 s[0] = code >> 8;
61 s[1] = code & 0xFF;
62}
63
65 uint32_t toupper;
66 uint32_t tolower;
67 uint32_t sort;
68};
69
73};
74
75struct MY_UCA_INFO;
76
78 uint8_t pctype;
79 uint8_t *ctype;
80};
81
82/* wm_wc and wc_mb return codes */
83/* clang-format off */
84static constexpr int
85 MY_CS_ILSEQ = 0; /* Wrong by sequence: wb_wc */
86static constexpr int
87 MY_CS_ILUNI = 0; /* Cannot encode Unicode to charset: wc_mb */
88static constexpr int
89 MY_CS_TOOSMALL = -101; /* Need at least one byte: wc_mb and mb_wc */
90static constexpr int
91 MY_CS_TOOSMALL2 = -102; /* Need at least two bytes: wc_mb and mb_wc */
92static constexpr int
93 MY_CS_TOOSMALL3 = -103; /* Need at least three bytes: wc_mb and mb_wc */
94
95/* These following three are currently not really used */
96static constexpr int
97 MY_CS_TOOSMALL4 = -104; /* Need at least 4 bytes: wc_mb and mb_wc */
98static constexpr int
99 MY_CS_TOOSMALL5 = -105; /* Need at least 5 bytes: wc_mb and mb_wc */
100static constexpr int
101 MY_CS_TOOSMALL6 = -106; /* Need at least 6 bytes: wc_mb and mb_wc */
102/* clang-format on */
103
104static constexpr int MY_SEQ_INTTAIL = 1;
105static constexpr int MY_SEQ_SPACES = 2;
106
107/* CHARSET_INFO::state flags */
108/* clang-format off */
109static constexpr uint32_t
110 MY_CHARSET_UNDEFINED = 0; // for unit testing
111static constexpr uint32_t
112 MY_CS_COMPILED = 1 << 0; // compiled-in charsets
113static constexpr uint32_t
114 MY_CS_CONFIG_UNUSED = 1 << 1; // unused bitmask
115static constexpr uint32_t
116 MY_CS_INDEX_UNUSED = 1 << 2; // unused bitmask
117static constexpr uint32_t
118 MY_CS_LOADED = 1 << 3; // charsets that are currently loaded
119static constexpr uint32_t
120 MY_CS_BINSORT = 1 << 4; // if binary sort order
121static constexpr uint32_t
122 MY_CS_PRIMARY = 1 << 5; // if primary collation
123static constexpr uint32_t
124 MY_CS_STRNXFRM = 1 << 6; // if _not_ set, sort_order will
125 // give same result as strnxfrm --
126 // all new collations should have
127 // this flag set,
128 // do not check it in new code
129static constexpr uint32_t
130 MY_CS_UNICODE = 1 << 7; // if a charset is BMP Unicode
131static constexpr uint32_t
132 MY_CS_READY = 1 << 8; // if a charset is initialized
133static constexpr uint32_t
134 MY_CS_AVAILABLE = 1 << 9; // if either compiled-in or loaded
135static constexpr uint32_t
136 MY_CS_CSSORT = 1 << 10; // if case sensitive sort order
137static constexpr uint32_t
138 MY_CS_HIDDEN = 1 << 11; // don't display in SHOW
139static constexpr uint32_t
140 MY_CS_PUREASCII = 1 << 12; // if a charset is pure ascii
141static constexpr uint32_t
142 MY_CS_NONASCII = 1 << 13; // if not ASCII-compatible
143static constexpr uint32_t
144 MY_CS_UNICODE_SUPPLEMENT = 1 << 14; // Non-BMP Unicode characters
145static constexpr uint32_t
146 MY_CS_LOWER_SORT = 1 << 15; // if use lower case as weight
147static constexpr uint32_t
148 MY_CS_INLINE = 1 << 16; // CS definition is C++ source
149
150/* Character repertoire flags */
151static constexpr uint32_t
152 MY_REPERTOIRE_ASCII = 1; /* Pure ASCII U+0000..U+007F */
153static constexpr uint32_t
154 MY_REPERTOIRE_EXTENDED = 2; /* Extended characters: U+0080..U+FFFF */
155static constexpr uint32_t
156 MY_REPERTOIRE_UNICODE30 = 3; /* ASCII | EXTENDED: U+0000..U+FFFF */
157
158/* Flags for strxfrm */
159static constexpr uint32_t
160 MY_STRXFRM_PAD_TO_MAXLEN = 0x00000080; /* if pad tail(for filesort) */
161
162/* clang-format on */
163
165 uint16_t from;
166 uint16_t to;
167 const uint8_t *tab;
168};
169
171 unsigned end;
172 unsigned mb_len;
173};
174
175struct CHARSET_INFO;
176
177/**
178 Helper structure to return error messages from collation parser/initializer.
179*/
181 static constexpr int errmsg_size = 192;
182 unsigned errcode{0}; ///< See include/mysys_err.h
183 char errarg[errmsg_size]{}; ///< Error message text
184};
185
186/**
187 User-specified callback interface for collation parser/initializer
188*/
190 public:
191 MY_CHARSET_LOADER() = default;
192 virtual ~MY_CHARSET_LOADER();
193
196
199
200 /**
201 Intercepts error messages from collation parser/initializer
202
203 @param loglevel ERROR_LEVEL or WARNING_LEVEL
204 @param errcode See include/mysys_err.h
205 */
206 virtual void reporter(enum loglevel loglevel, unsigned errcode, ...) = 0;
207
208 /**
209 Loads a file by its OS path into collation parser/initializer
210
211 @param path '\0'-terminated file path to load
212 @param size Byte size of @p path
213
214 @returns Pointer to file data on success, otherwise nullptr.
215 This is a caller's responsibility to free this pointer
216 with free().
217 */
218 virtual void *read_file(const char *path, size_t *size) = 0;
219
220 /**
221 Collation parser helper function (not overloadable).
222
223 @param cs New collation object to register in the collation library
224
225 @return MY_XML_OK on success, otherwise MY_XML_ERROR
226 */
228
229 /**
230 Allocate-and-forget version of malloc().
231 */
232 virtual void *once_alloc(size_t);
233
234 virtual void *mem_malloc(size_t size) { return malloc(size); }
235 virtual void mem_free(void *ptr) { free(ptr); }
236
237 private:
238 std::deque<void *> m_delete_list;
239};
240
242
244
245/* See strings/CHARSET_INFO.txt for information about this structure */
249 /* Collation routines */
250 int (*strnncoll)(const CHARSET_INFO *, const uint8_t *s, size_t slen,
251 const uint8_t *t, size_t tlen, bool t_is_prefix);
252 /**
253 Compare the two strings under the pad rules given by the collation.
254
255 Thus, for NO PAD collations, this is identical to strnncoll with is_prefix
256 set to false. For PAD SPACE collations, the two strings are conceptually
257 extended infinitely at the end using space characters (0x20) and then
258 compared under the collation's normal comparison rules, so that e.g 'a' is
259 equal to 'a '.
260 */
261 int (*strnncollsp)(const CHARSET_INFO *, const uint8_t *, size_t,
262 const uint8_t *, size_t);
263 /**
264 Transform the string into a form such that memcmp() between transformed
265 strings yields the correct collation order.
266
267 @param [out] dst Buffer for the transformed string.
268 @param [out] dstlen Number of bytes available in dstlen.
269 Must be even.
270 @param num_codepoints Treat the string as if it were of type
271 CHAR(num_codepoints). In particular, this means that if the
272 collation is a pad collation (pad_attribute is PAD_SPACE) and
273 string has fewer than "num_codepoints" codepoints, the string
274 will be transformed as if it ended in (num_codepoints-n) extra spaces.
275 If the string has more than "num_codepoints" codepoints,
276 behavior is undefined; may truncate, may crash, or do something
277 else entirely. Note that MY_STRXFRM_PAD_TO_MAXLEN overrides this;
278 if it is given for a PAD SPACE collation, this value is taken to be
279 effectively infinity.
280 @param src The source string, in the required character set
281 for the collation.
282 @param srclen Number of bytes in src.
283 @param flags ORed bitmask of MY_STRXFRM_* flags.
284
285 @return Number of bytes written to dst.
286 */
287 size_t (*strnxfrm)(const CHARSET_INFO *, uint8_t *dst, size_t dstlen,
288 unsigned num_codepoints, const uint8_t *src, size_t srclen,
289 unsigned flags);
290
291 /**
292 Return the maximum number of output bytes needed for strnxfrm()
293 to output all weights for any string of the given input length.
294 You can use this to e.g. size buffers for sort keys.
295
296 @param num_bytes Number of bytes in the input string. Note that for
297 multibyte character sets, this _must_ be a pessimistic estimate,
298 ie., one that's cs->mbmaxlen * max_num_codepoints. So for e.g.
299 the utf8mb4 string "foo", you will need to give in 12, not 3.
300 */
301 size_t (*strnxfrmlen)(const CHARSET_INFO *, size_t num_bytes);
302 bool (*like_range)(const CHARSET_INFO *, const char *s, size_t s_length,
303 char w_prefix, char w_one, char w_many, size_t res_length,
304 char *min_str, char *max_str, size_t *min_len,
305 size_t *max_len);
306 int (*wildcmp)(const CHARSET_INFO *, const char *str, const char *str_end,
307 const char *wildstr, const char *wildend, int escape,
308 int w_one, int w_many);
309
310 int (*strcasecmp)(const CHARSET_INFO *, const char *, const char *);
311
312 bool (*strstr)(const CHARSET_INFO *, const char *b, size_t b_length,
313 const char *s, size_t s_length, my_match_t *match);
314
315 /**
316 Compute a sort hash for the given key. This hash must preserve equality
317 under the given collation, so that a=b => H(a)=H(b). Note that this hash
318 is used for hash-based partitioning (PARTITION KEY), so you cannot change
319 it except when writing a new collation; it needs to be unchanged across
320 releases, so that the on-disk format does not change. (It is also used
321 for testing equality in the MEMORY storage engine.)
322
323 nr1 and nr2 are both in/out parameters. nr1 is the actual hash value;
324 nr2 holds extra state between invocations.
325 */
326 void (*hash_sort)(const CHARSET_INFO *cs, const uint8_t *key, size_t len,
327 uint64_t *nr1, uint64_t *nr2);
328 bool (*propagate)(const CHARSET_INFO *cs, const uint8_t *str, size_t len);
329};
330
331/* Some typedef to make it easy for C++ to make function pointers */
333 const uint8_t *, const uint8_t *);
334typedef int (*my_charset_conv_wc_mb)(const CHARSET_INFO *, my_wc_t, uint8_t *,
335 uint8_t *);
336typedef size_t (*my_charset_conv_case)(const CHARSET_INFO *, char *, size_t,
337 char *, size_t);
338
339/* See strings/CHARSET_INFO.txt about information on this structure */
342 /* Multibyte routines */
343 unsigned (*ismbchar)(const CHARSET_INFO *, const char *, const char *);
344 unsigned (*mbcharlen)(const CHARSET_INFO *, unsigned c);
345 size_t (*numchars)(const CHARSET_INFO *, const char *b, const char *e);
346
347 /**
348 Return at which byte codepoint number "pos" begins, relative to
349 the start of the string. If the string is shorter than or is
350 exactly "pos" codepoints long, returns a value equal or greater to
351 (e-b).
352 */
353 size_t (*charpos)(const CHARSET_INFO *, const char *b, const char *e,
354 size_t pos);
355 size_t (*well_formed_len)(const CHARSET_INFO *, const char *b, const char *e,
356 size_t nchars, int *error);
357 /**
358 Given a pointer and a length in bytes, returns a new length in bytes where
359 all trailing space characters are stripped. This holds even for NO PAD
360 collations.
361
362 Exception: The "binary" collation, which is used behind-the-scenes to
363 implement the BINARY type (by mapping it to CHAR(n) COLLATE "binary"),
364 returns just the length back with no stripping. It's done that way so that
365 Field_string (implementing CHAR(n)) returns the full padded width on read
366 (as opposed to a normal CHAR, where we usually strip the spaces on read),
367 but it's suboptimal, since lengthsp() is also used in a number of other
368 places, e.g. stripping trailing spaces from enum values given in by the
369 user. If you call this function, be aware of this special exception and
370 consider the implications.
371 */
372 size_t (*lengthsp)(const CHARSET_INFO *, const char *ptr, size_t length);
373 size_t (*numcells)(const CHARSET_INFO *, const char *b, const char *e);
374
375 /* Unicode conversion */
378
379 /* CTYPE scanner */
380 int (*ctype)(const CHARSET_INFO *cs, int *ctype, const uint8_t *s,
381 const uint8_t *e);
382
383 /* Functions for case and sort conversion */
384 size_t (*caseup_str)(const CHARSET_INFO *, char *);
385 size_t (*casedn_str)(const CHARSET_INFO *, char *);
386
389
390 /* Charset dependant snprintf() */
391 size_t (*snprintf)(const CHARSET_INFO *, char *to, size_t n, const char *fmt,
392 ...) MY_ATTRIBUTE((format(printf, 4, 5)));
393
394 size_t (*long10_to_str)(const CHARSET_INFO *, char *to, size_t n, int radix,
395 long int val);
396 size_t (*longlong10_to_str)(const CHARSET_INFO *, char *to, size_t n,
397 int radix, long long val);
398
399 void (*fill)(const CHARSET_INFO *, char *to, size_t len, int fill);
400
401 /* String-to-number conversion routines */
402 long (*strntol)(const CHARSET_INFO *, const char *s, size_t l, int base,
403 const char **e, int *err);
404 unsigned long (*strntoul)(const CHARSET_INFO *, const char *s, size_t l,
405 int base, const char **e, int *err);
406 long long (*strntoll)(const CHARSET_INFO *, const char *s, size_t l, int base,
407 const char **e, int *err);
408 unsigned long long (*strntoull)(const CHARSET_INFO *, const char *s, size_t l,
409 int base, const char **e, int *err);
410 double (*strntod)(const CHARSET_INFO *, const char *s, size_t l,
411 const char **e, int *err);
412 long long (*strtoll10)(const CHARSET_INFO *cs, const char *nptr,
413 const char **endptr, int *error);
414 unsigned long long (*strntoull10rnd)(const CHARSET_INFO *cs, const char *str,
415 size_t length, int unsigned_fl,
416 const char **endptr, int *error);
417 size_t (*scan)(const CHARSET_INFO *, const char *b, const char *e, int sq);
418};
419
420/* See strings/CHARSET_INFO.txt about information on this structure */
422 unsigned number;
425 unsigned state;
426 const char *csname;
427 const char *m_coll_name;
428 const char *comment;
429 const char *tailoring;
431 const uint8_t *ctype;
432 const uint8_t *to_lower;
433 const uint8_t *to_upper;
434 const uint8_t *sort_order;
435 struct MY_UCA_INFO *uca; /* This can be changed in apply_one_rule() */
436 const uint16_t *tab_to_uni;
439 const struct lex_state_maps_st *state_maps; /* parser internal data */
440 const uint8_t *ident_map; /* parser internal data */
444 unsigned mbminlen;
445 unsigned mbmaxlen;
446 unsigned mbmaxlenlen;
448 my_wc_t max_sort_char; /* For LIKE optimization */
449 uint8_t pad_char;
452
455
456 /**
457 If this collation is PAD_SPACE, it collates as if all inputs were
458 padded with a given number of spaces at the end (see the "num_codepoints"
459 flag to strnxfrm). NO_PAD simply compares unextended strings.
460
461 Note that this is fundamentally about the behavior of coll->strnxfrm.
462 */
464};
465
466/*
467 NOTE: You cannot use a CHARSET_INFO without it having been initialized first.
468 In particular, they are not initialized when a unit test starts; do not use
469 these globals indiscriminately from here, and do not add more. Instead,
470 initialize them using my_collation_get_by_name().
471*/
472
478
487
488/**
489 @note Deprecated function, please call cs->coll->wildcmp(cs...) instead.
490*/
492 const char *str, const char *str_end,
493 const char *wildstr,
494 const char *wildend, int escape,
495 int w_one, int w_many);
496
498 const char *str, const char *end,
499 const char *reject,
500 size_t reject_length);
501
503 const char *str, size_t len);
504
506
507/**
508 Detect whether a character set is ASCII compatible.
509*/
511 return (cs->state & MY_CS_NONASCII) == 0;
512}
513
514inline bool my_charset_same(const CHARSET_INFO *cs1, const CHARSET_INFO *cs2) {
515 assert(0 != strcmp(cs1->csname, "utf8"));
516 assert(0 != strcmp(cs2->csname, "utf8"));
517 return ((cs1 == cs2) || !strcmp(cs1->csname, cs2->csname));
518}
519
521
523
524MYSQL_STRINGS_EXPORT size_t my_convert(char *to, size_t to_length,
525 const CHARSET_INFO *to_cs,
526 const char *from, size_t from_length,
527 const CHARSET_INFO *from_cs,
528 unsigned *errors);
529
531 const char *s, const char *e);
532
534 const char *wildstr,
535 const char *wildend, int escape,
536 int w_many, size_t *prefix_len);
537
538/* clang-format off */
539static constexpr uint8_t MY_CHAR_U = 01; /* Upper case */
540static constexpr uint8_t MY_CHAR_L = 02; /* Lower case */
541static constexpr uint8_t MY_CHAR_NMR = 04; /* Numeral (digit) */
542static constexpr uint8_t MY_CHAR_SPC = 010; /* Spacing character */
543static constexpr uint8_t MY_CHAR_PNT = 020; /* Punctuation */
544static constexpr uint8_t MY_CHAR_CTR = 040; /* Control character */
545static constexpr uint8_t MY_CHAR_B = 0100; /* Blank */
546static constexpr uint8_t MY_CHAR_X = 0200; /* heXadecimal digit */
547/* clang-format on */
548
549/* The following functions make sense only for one-byte character sets.
550They will not fail for multibyte character sets, but will not produce
551the expected results. They may have some limited usability like
552e.g. for utf8mb3/utf8mb4, meaningful results will be produced for
553values < 0x7F. */
554
555inline bool my_isascii(char ch) { return (ch & ~0177) == 0; }
556
557inline char my_toupper(const CHARSET_INFO *cs, char ch) {
558 return static_cast<char>(cs->to_upper[static_cast<uint8_t>(ch)]);
559}
560
561inline char my_tolower(const CHARSET_INFO *cs, char ch) {
562 return static_cast<char>(cs->to_lower[static_cast<uint8_t>(ch)]);
563}
564
565inline bool my_isalpha(const CHARSET_INFO *cs, char ch) {
566 return ((cs->ctype + 1)[static_cast<uint8_t>(ch)] &
567 (MY_CHAR_U | MY_CHAR_L)) != 0;
568}
569
570inline bool my_isupper(const CHARSET_INFO *cs, char ch) {
571 return ((cs->ctype + 1)[static_cast<uint8_t>(ch)] & MY_CHAR_U) != 0;
572}
573
574inline bool my_islower(const CHARSET_INFO *cs, char ch) {
575 return ((cs->ctype + 1)[static_cast<uint8_t>(ch)] & MY_CHAR_L) != 0;
576}
577
578inline bool my_isdigit(const CHARSET_INFO *cs, char ch) {
579 return ((cs->ctype + 1)[static_cast<uint8_t>(ch)] & MY_CHAR_NMR) != 0;
580}
581
582inline bool my_isxdigit(const CHARSET_INFO *cs, char ch) {
583 return ((cs->ctype + 1)[static_cast<uint8_t>(ch)] & MY_CHAR_X) != 0;
584}
585
586inline bool my_isalnum(const CHARSET_INFO *cs, char ch) {
587 return ((cs->ctype + 1)[static_cast<uint8_t>(ch)] &
588 (MY_CHAR_U | MY_CHAR_L | MY_CHAR_NMR)) != 0;
589}
590
591inline bool my_isspace(const CHARSET_INFO *cs, char ch) {
592 return ((cs->ctype + 1)[static_cast<uint8_t>(ch)] & MY_CHAR_SPC) != 0;
593}
594
595inline bool my_ispunct(const CHARSET_INFO *cs, char ch) {
596 return ((cs->ctype + 1)[static_cast<uint8_t>(ch)] & MY_CHAR_PNT) != 0;
597}
598
599inline bool my_isgraph(const CHARSET_INFO *cs, char ch) {
600 return ((cs->ctype + 1)[static_cast<uint8_t>(ch)] &
602}
603
604inline bool my_iscntrl(const CHARSET_INFO *cs, char ch) {
605 return ((cs->ctype + 1)[static_cast<uint8_t>(ch)] & MY_CHAR_CTR) != 0;
606}
607
608inline bool my_isvar(const CHARSET_INFO *cs, char ch) {
609 return my_isalnum(cs, ch) || (ch == '_');
610}
611
612inline bool my_isvar_start(const CHARSET_INFO *cs, char ch) {
613 return my_isalpha(cs, ch) || (ch == '_');
614}
615
616// Properties of character sets.
617inline bool my_binary_compare(const CHARSET_INFO *cs) {
618 return (cs->state & MY_CS_BINSORT) != 0;
619}
620
621inline bool use_strnxfrm(const CHARSET_INFO *cs) {
622 return (cs->state & MY_CS_STRNXFRM) != 0;
623}
624
625// Interfaces to member functions.
626inline size_t my_strnxfrm(const CHARSET_INFO *cs, uint8_t *dst, size_t dstlen,
627 const uint8_t *src, size_t srclen) {
628 return cs->coll->strnxfrm(cs, dst, dstlen, dstlen, src, srclen, 0);
629}
630
631inline int my_strnncoll(const CHARSET_INFO *cs, const uint8_t *a,
632 size_t a_length, const uint8_t *b, size_t b_length) {
633 return cs->coll->strnncoll(cs, a, a_length, b, b_length, false);
634}
635
636inline bool my_like_range(const CHARSET_INFO *cs, const char *s,
637 size_t s_length, char w_prefix, char w_one,
638 char w_many, size_t res_length, char *min_str,
639 char *max_str, size_t *min_len, size_t *max_len) {
640 return cs->coll->like_range(cs, s, s_length, w_prefix, w_one, w_many,
641 res_length, min_str, max_str, min_len, max_len);
642}
643
644inline int my_wildcmp(const CHARSET_INFO *cs, const char *str,
645 const char *str_end, const char *wildstr,
646 const char *wildend, int escape, int w_one, int w_many) {
647 return cs->coll->wildcmp(cs, str, str_end, wildstr, wildend, escape, w_one,
648 w_many);
649}
650
651inline int my_strcasecmp(const CHARSET_INFO *cs, const char *s1,
652 const char *s2) {
653 return cs->coll->strcasecmp(cs, s1, s2);
654}
655
656inline size_t my_charpos(const CHARSET_INFO *cs, const char *beg,
657 const char *end, size_t pos) {
658 return cs->cset->charpos(cs, beg, end, pos);
659}
660
661inline size_t my_charpos(const CHARSET_INFO *cs, const unsigned char *beg,
662 const unsigned char *end, size_t pos) {
663 return cs->cset->charpos(cs, pointer_cast<const char *>(beg),
664 pointer_cast<const char *>(end), pos);
665}
666
667inline bool use_mb(const CHARSET_INFO *cs) {
668 return cs->cset->ismbchar != nullptr;
669}
670
671inline unsigned my_ismbchar(const CHARSET_INFO *cs, const char *str,
672 const char *strend) {
673 return cs->cset->ismbchar(cs, str, strend);
674}
675
676inline unsigned my_ismbchar(const CHARSET_INFO *cs, const uint8_t *str,
677 const uint8_t *strend) {
678 return cs->cset->ismbchar(cs, pointer_cast<const char *>(str),
679 pointer_cast<const char *>(strend));
680}
681
682inline unsigned my_mbcharlen(const CHARSET_INFO *cs, unsigned first_byte) {
683 return cs->cset->mbcharlen(cs, first_byte);
684}
685
686/**
687 Get the length of gb18030 code by the given two leading bytes
688
689 @param[in] cs charset_info
690 @param[in] first_byte first byte of gb18030 code
691 @param[in] second_byte second byte of gb18030 code
692 @return the length of gb18030 code starting with given two bytes,
693 the length would be 2 or 4 for valid gb18030 code,
694 or 0 for invalid gb18030 code
695*/
696inline unsigned my_mbcharlen_2(const CHARSET_INFO *cs, uint8_t first_byte,
697 uint8_t second_byte) {
698 return cs->cset->mbcharlen(cs,
699 ((first_byte & 0xFF) << 8) + (second_byte & 0xFF));
700}
701
702/**
703 Get the maximum length of leading bytes needed to determine the length of a
704 multi-byte gb18030 code
705
706 @param[in] cs charset_info
707 @return number of leading bytes we need, would be 2 for gb18030
708 and 1 for all other charsets
709*/
710inline unsigned my_mbmaxlenlen(const CHARSET_INFO *cs) {
711 return cs->mbmaxlenlen;
712}
713
714/**
715 Judge if the given byte is a possible leading byte for a charset.
716 For gb18030 whose mbmaxlenlen is 2, we can't determine the length of
717 a multi-byte character by looking at the first byte only
718
719 @param[in] cs charset_info
720 @param[in] leading_byte possible leading byte
721 @return true if it is, otherwise false
722*/
723inline bool my_ismb1st(const CHARSET_INFO *cs, unsigned leading_byte) {
724 return my_mbcharlen(cs, leading_byte) > 1 ||
725 (my_mbmaxlenlen(cs) == 2 && my_mbcharlen(cs, leading_byte) == 0);
726}
727
728inline size_t my_caseup_str(const CHARSET_INFO *cs, char *str) {
729 return cs->cset->caseup_str(cs, str);
730}
731
732inline size_t my_casedn_str(const CHARSET_INFO *cs, char *str) {
733 return cs->cset->casedn_str(cs, str);
734}
735
736inline long my_strntol(const CHARSET_INFO *cs, const char *str, size_t length,
737 int base, const char **end, int *err) {
738 return cs->cset->strntol(cs, str, length, base, end, err);
739}
740
741inline unsigned long my_strntoul(const CHARSET_INFO *cs, const char *str,
742 size_t length, int base, const char **end,
743 int *err) {
744 return cs->cset->strntoul(cs, str, length, base, end, err);
745}
746
747inline int64_t my_strntoll(const CHARSET_INFO *cs, const char *str,
748 size_t length, int base, const char **end,
749 int *err) {
750 return cs->cset->strntoll(cs, str, length, base, end, err);
751}
752
753inline uint64_t my_strntoull(const CHARSET_INFO *cs, const char *str,
754 size_t length, int base, const char **end,
755 int *err) {
756 return cs->cset->strntoull(cs, str, length, base, end, err);
757}
758
759inline double my_strntod(const CHARSET_INFO *cs, const char *str, size_t length,
760 const char **end, int *err) {
761 return cs->cset->strntod(cs, str, length, end, err);
762}
763
765 return (cs->mbminlen == 1);
766}
767
768#endif // INCLUDE_MYSQL_STRINGS_M_CTYPE_H_
#define MYSQL_STRINGS_EXPORT
Definition: api.h:47
static Mysys_charset_loader * loader
Definition: charset.cc:185
User-specified callback interface for collation parser/initializer.
Definition: m_ctype.h:189
virtual ~MY_CHARSET_LOADER()
Definition: ctype.cc:1174
virtual void * mem_malloc(size_t size)
Definition: m_ctype.h:234
MY_CHARSET_LOADER()=default
virtual void * once_alloc(size_t)
Allocate-and-forget version of malloc().
Definition: ctype.cc:1302
MY_CHARSET_LOADER & operator=(const MY_CHARSET_LOADER &&)=delete
MY_CHARSET_LOADER(const MY_CHARSET_LOADER &)=delete
virtual void mem_free(void *ptr)
Definition: m_ctype.h:235
std::deque< void * > m_delete_list
Definition: m_ctype.h:238
int add_collation(CHARSET_INFO *cs)
Collation parser helper function (not overloadable).
Definition: ctype.cc:1180
MY_CHARSET_LOADER(const MY_CHARSET_LOADER &&)=delete
virtual void * read_file(const char *path, size_t *size)=0
Loads a file by its OS path into collation parser/initializer.
MY_CHARSET_LOADER & operator=(const MY_CHARSET_LOADER &)=delete
virtual void reporter(enum loglevel loglevel, unsigned errcode,...)=0
Intercepts error messages from collation parser/initializer.
static int flags[50]
Definition: hp_test1.cc:40
#define malloc(A)
Definition: lexyy.cc:914
#define free(A)
Definition: lexyy.cc:915
static constexpr int MY_CS_TOOSMALL4
Definition: m_ctype.h:97
static constexpr int MY_SEQ_SPACES
Definition: m_ctype.h:105
static constexpr uint32_t MY_CS_PUREASCII
Definition: m_ctype.h:140
static constexpr uint8_t MY_CHAR_CTR
Definition: m_ctype.h:544
static void MY_PUT_MB2(unsigned char *s, uint16_t code)
Definition: m_ctype.h:59
static constexpr int MY_CS_TOOSMALL
Definition: m_ctype.h:89
static constexpr uint8_t MY_CHAR_L
Definition: m_ctype.h:540
int myf
Definition: m_ctype.h:50
char my_tolower(const CHARSET_INFO *cs, char ch)
Definition: m_ctype.h:561
static constexpr uint8_t MY_CHAR_NMR
Definition: m_ctype.h:541
int my_strcasecmp(const CHARSET_INFO *cs, const char *s1, const char *s2)
Definition: m_ctype.h:651
bool my_like_range(const CHARSET_INFO *cs, const char *s, size_t s_length, char w_prefix, char w_one, char w_many, size_t res_length, char *min_str, char *max_str, size_t *min_len, size_t *max_len)
Definition: m_ctype.h:636
static constexpr uint32_t MY_REPERTOIRE_UNICODE30
Definition: m_ctype.h:156
static constexpr uint32_t MY_CS_READY
Definition: m_ctype.h:132
static constexpr uint32_t MY_CS_INLINE
Definition: m_ctype.h:148
static constexpr uint8_t MY_CHAR_PNT
Definition: m_ctype.h:543
MYSQL_STRINGS_EXPORT CHARSET_INFO my_charset_bin
Definition: ctype-bin.cc:500
static constexpr uint32_t MY_CS_NONASCII
Definition: m_ctype.h:142
int(* my_charset_conv_wc_mb)(const CHARSET_INFO *, my_wc_t, uint8_t *, uint8_t *)
Definition: m_ctype.h:334
static constexpr uint32_t MY_CS_STRNXFRM
Definition: m_ctype.h:124
bool my_isvar_start(const CHARSET_INFO *cs, char ch)
Definition: m_ctype.h:612
constexpr int MY_CS_NAME_SIZE
Definition: m_ctype.h:46
MYSQL_STRINGS_EXPORT CHARSET_INFO my_charset_utf8mb3_tolower_ci
Definition: ctype-utf8.cc:5829
MYSQL_STRINGS_EXPORT CHARSET_INFO my_charset_utf8mb4_bin
Definition: ctype-utf8.cc:7822
static constexpr uint32_t MY_CS_BINSORT
Definition: m_ctype.h:120
bool my_isxdigit(const CHARSET_INFO *cs, char ch)
Definition: m_ctype.h:582
MYSQL_STRINGS_EXPORT CHARSET_INFO my_charset_latin1_bin
Definition: ctype-latin1.cc:672
static constexpr int MY_CS_ILUNI
Definition: m_ctype.h:87
MYSQL_STRINGS_EXPORT CHARSET_INFO my_charset_utf8mb4_0900_ai_ci
Definition: ctype-uca.cc:9610
static constexpr uint32_t MY_STRXFRM_PAD_TO_MAXLEN
Definition: m_ctype.h:160
bool my_isupper(const CHARSET_INFO *cs, char ch)
Definition: m_ctype.h:570
int64_t my_strntoll(const CHARSET_INFO *cs, const char *str, size_t length, int base, const char **end, int *err)
Definition: m_ctype.h:747
MYSQL_STRINGS_EXPORT CHARSET_INFO my_charset_utf8mb3_unicode_ci
Definition: ctype-uca.cc:6131
size_t my_charpos(const CHARSET_INFO *cs, const char *beg, const char *end, size_t pos)
Definition: m_ctype.h:656
MYSQL_STRINGS_EXPORT size_t my_convert(char *to, size_t to_length, const CHARSET_INFO *to_cs, const char *from, size_t from_length, const CHARSET_INFO *from_cs, unsigned *errors)
Convert a string between two character sets.
Definition: ctype.cc:928
uint64_t my_strntoull(const CHARSET_INFO *cs, const char *str, size_t length, int base, const char **end, int *err)
Definition: m_ctype.h:753
bool my_isalnum(const CHARSET_INFO *cs, char ch)
Definition: m_ctype.h:586
static constexpr uint32_t MY_CS_LOWER_SORT
Definition: m_ctype.h:146
int my_wildcmp(const CHARSET_INFO *cs, const char *str, const char *str_end, const char *wildstr, const char *wildend, int escape, int w_one, int w_many)
Definition: m_ctype.h:644
size_t my_casedn_str(const CHARSET_INFO *cs, char *str)
Definition: m_ctype.h:732
static constexpr uint8_t MY_CHAR_SPC
Definition: m_ctype.h:542
MYSQL_STRINGS_EXPORT bool my_is_prefixidx_cand(const CHARSET_INFO *cs, const char *wildstr, const char *wildend, int escape, int w_many, size_t *prefix_len)
Identify whether given like pattern looks like a prefix pattern, which can become candidate for index...
Definition: ctype.cc:1015
bool my_ispunct(const CHARSET_INFO *cs, char ch)
Definition: m_ctype.h:595
static constexpr uint32_t MY_CS_UNICODE_SUPPLEMENT
Definition: m_ctype.h:144
bool my_isvar(const CHARSET_INFO *cs, char ch)
Definition: m_ctype.h:608
unsigned long my_strntoul(const CHARSET_INFO *cs, const char *str, size_t length, int base, const char **end, int *err)
Definition: m_ctype.h:741
bool my_isdigit(const CHARSET_INFO *cs, char ch)
Definition: m_ctype.h:578
static constexpr int MY_CS_TOOSMALL3
Definition: m_ctype.h:93
unsigned my_mbcharlen_2(const CHARSET_INFO *cs, uint8_t first_byte, uint8_t second_byte)
Get the length of gb18030 code by the given two leading bytes.
Definition: m_ctype.h:696
size_t(* my_charset_conv_case)(const CHARSET_INFO *, char *, size_t, char *, size_t)
Definition: m_ctype.h:336
MYSQL_STRINGS_EXPORT unsigned my_string_repertoire(const CHARSET_INFO *cs, const char *str, size_t len)
Definition: ctype.cc:794
int(* my_charset_conv_mb_wc)(const CHARSET_INFO *, my_wc_t *, const uint8_t *, const uint8_t *)
Definition: m_ctype.h:332
static constexpr uint32_t MY_CS_AVAILABLE
Definition: m_ctype.h:134
bool my_isspace(const CHARSET_INFO *cs, char ch)
Definition: m_ctype.h:591
double my_strntod(const CHARSET_INFO *cs, const char *str, size_t length, const char **end, int *err)
Definition: m_ctype.h:759
bool use_strnxfrm(const CHARSET_INFO *cs)
Definition: m_ctype.h:621
static constexpr uint32_t MY_REPERTOIRE_EXTENDED
Definition: m_ctype.h:154
unsigned long my_wc_t
Our own version of wchar_t, ie., a type that holds a single Unicode code point ("wide character").
Definition: m_ctype.h:57
static constexpr int MY_SEQ_INTTAIL
Definition: m_ctype.h:104
bool my_iscntrl(const CHARSET_INFO *cs, char ch)
Definition: m_ctype.h:604
MYSQL_STRINGS_EXPORT CHARSET_INFO my_charset_latin1
Definition: ctype-latin1.cc:366
unsigned my_mbcharlen(const CHARSET_INFO *cs, unsigned first_byte)
Definition: m_ctype.h:682
static constexpr uint32_t MY_CHARSET_UNDEFINED
Definition: m_ctype.h:110
static constexpr int MY_CS_TOOSMALL5
Definition: m_ctype.h:99
static constexpr uint32_t MY_CS_UNICODE
Definition: m_ctype.h:130
unsigned my_ismbchar(const CHARSET_INFO *cs, const char *str, const char *strend)
Definition: m_ctype.h:671
bool my_isascii(char ch)
Definition: m_ctype.h:555
MYSQL_STRINGS_EXPORT CHARSET_INFO my_charset_utf8mb4_general_ci
Definition: ctype-utf8.cc:7786
static constexpr uint32_t MY_CS_HIDDEN
Definition: m_ctype.h:138
MYSQL_STRINGS_EXPORT size_t my_strcspn(const CHARSET_INFO *cs, const char *str, const char *end, const char *reject, size_t reject_length)
Calculate the length of the initial segment of 'str' which consists entirely of characters not in 're...
Definition: my_strchr.cc:64
MYSQL_STRINGS_EXPORT unsigned my_mbcharlen_ptr(const CHARSET_INFO *cs, const char *s, const char *e)
Get the length of the first code in given sequence of chars.
Definition: ctype.cc:987
bool my_ismb1st(const CHARSET_INFO *cs, unsigned leading_byte)
Judge if the given byte is a possible leading byte for a charset.
Definition: m_ctype.h:723
static constexpr int MY_CS_ILSEQ
Definition: m_ctype.h:85
MYSQL_STRINGS_EXPORT CHARSET_INFO my_charset_utf8mb4_0900_bin
Definition: ctype-uca.cc:11481
bool my_charset_same(const CHARSET_INFO *cs1, const CHARSET_INFO *cs2)
Definition: m_ctype.h:514
size_t my_strnxfrm(const CHARSET_INFO *cs, uint8_t *dst, size_t dstlen, const uint8_t *src, size_t srclen)
Definition: m_ctype.h:626
MYSQL_STRINGS_EXPORT int(* my_string_stack_guard)(int)
Definition: collations_internal.cc:43
static constexpr uint32_t MY_CS_CONFIG_UNUSED
Definition: m_ctype.h:114
long my_strntol(const CHARSET_INFO *cs, const char *str, size_t length, int base, const char **end, int *err)
Definition: m_ctype.h:736
static constexpr uint32_t MY_CS_LOADED
Definition: m_ctype.h:118
static constexpr uint32_t MY_CS_INDEX_UNUSED
Definition: m_ctype.h:116
MYSQL_STRINGS_EXPORT CHARSET_INFO my_charset_utf8mb3_bin
Definition: ctype-utf8.cc:5899
constexpr const char * CHARSET_DIR
Definition: m_ctype.h:48
bool use_mb(const CHARSET_INFO *cs)
Definition: m_ctype.h:667
MYSQL_STRINGS_EXPORT unsigned my_charset_repertoire(const CHARSET_INFO *cs)
Definition: ctype.cc:816
unsigned my_mbmaxlenlen(const CHARSET_INFO *cs)
Get the maximum length of leading bytes needed to determine the length of a multi-byte gb18030 code.
Definition: m_ctype.h:710
bool my_isalpha(const CHARSET_INFO *cs, char ch)
Definition: m_ctype.h:565
size_t my_caseup_str(const CHARSET_INFO *cs, char *str)
Definition: m_ctype.h:728
static constexpr uint32_t MY_REPERTOIRE_ASCII
Definition: m_ctype.h:152
bool is_supported_parser_charset(const CHARSET_INFO *cs)
Definition: m_ctype.h:764
MYSQL_STRINGS_EXPORT CHARSET_INFO my_charset_utf8mb3_general_ci
Definition: ctype-utf8.cc:5794
MYSQL_STRINGS_EXPORT unsigned my_strxfrm_flag_normalize(unsigned flags)
Definition: ctype-simple.cc:1488
MYSQL_STRINGS_EXPORT bool my_charset_is_ascii_based(const CHARSET_INFO *cs)
Detect whether a character set is ASCII compatible.
Definition: m_ctype.h:510
static constexpr uint8_t MY_CHAR_X
Definition: m_ctype.h:546
static constexpr int MY_CS_TOOSMALL2
Definition: m_ctype.h:91
MYSQL_STRINGS_EXPORT int my_wildcmp_mb_bin(const CHARSET_INFO *cs, const char *str, const char *str_end, const char *wildstr, const char *wildend, int escape, int w_one, int w_many)
Definition: ctype-mb.cc:1030
bool my_islower(const CHARSET_INFO *cs, char ch)
Definition: m_ctype.h:574
static constexpr uint32_t MY_CS_PRIMARY
Definition: m_ctype.h:122
bool my_binary_compare(const CHARSET_INFO *cs)
Definition: m_ctype.h:617
static constexpr uint32_t MY_CS_COMPILED
Definition: m_ctype.h:112
static constexpr uint8_t MY_CHAR_B
Definition: m_ctype.h:545
int my_strnncoll(const CHARSET_INFO *cs, const uint8_t *a, size_t a_length, const uint8_t *b, size_t b_length)
Definition: m_ctype.h:631
bool my_isgraph(const CHARSET_INFO *cs, char ch)
Definition: m_ctype.h:599
MYSQL_STRINGS_EXPORT CHARSET_INFO my_charset_filename
Definition: ctype-utf8.cc:7056
static constexpr uint32_t MY_CS_CSSORT
Definition: m_ctype.h:136
char my_toupper(const CHARSET_INFO *cs, char ch)
Definition: m_ctype.h:557
MYSQL_STRINGS_EXPORT CHARSET_INFO my_charset_utf32_unicode_ci
Definition: ctype-uca.cc:7836
Pad_attribute
Definition: m_ctype.h:243
@ NO_PAD
Definition: m_ctype.h:243
@ PAD_SPACE
Definition: m_ctype.h:243
static constexpr int MY_CS_TOOSMALL6
Definition: m_ctype.h:101
static constexpr uint8_t MY_CHAR_U
Definition: m_ctype.h:539
static const char * strend(const char *s)
Definition: m_string.h:69
Definition of the global "loglevel" enumeration.
loglevel
Definition: my_loglevel.h:41
static char * path
Definition: mysqldump.cc:149
std::string str(const mysqlrouter::ConfigGenerator::Options::Endpoint &ep)
Definition: config_generator.cc:1105
Definition: commit_order_queue.h:34
static std::string escape(const std::string &str)
Escapes (only) apostrophes.
Definition: st_units_of_measure.cc:39
bool length(const dd::Spatial_reference_system *srs, const Geometry *g1, double *length, bool *null) noexcept
Computes the length of linestrings and multilinestrings.
Definition: length.cc:76
static Value err()
Create a Value object that represents an error condition.
Definition: json_binary.cc:908
size_t size(const char *const c)
Definition: base64.h:46
Cursor end()
A past-the-end Cursor.
Definition: rules_table_service.cc:192
required string key
Definition: replication_asynchronous_connection_failover.proto:60
Definition: m_ctype.h:421
uint8_t casedn_multiply
Definition: m_ctype.h:443
uint8_t pad_char
Definition: m_ctype.h:449
const struct lex_state_maps_st * state_maps
Definition: m_ctype.h:439
const uint16_t * tab_to_uni
Definition: m_ctype.h:436
unsigned binary_number
Definition: m_ctype.h:424
const uint8_t * ctype
Definition: m_ctype.h:431
const char * csname
Definition: m_ctype.h:426
my_wc_t max_sort_char
Definition: m_ctype.h:448
const MY_UNICASE_INFO * caseinfo
Definition: m_ctype.h:438
bool escape_with_backslash_is_dangerous
Definition: m_ctype.h:450
unsigned number
Definition: m_ctype.h:422
const uint8_t * to_lower
Definition: m_ctype.h:432
uint8_t caseup_multiply
Definition: m_ctype.h:442
unsigned mbmaxlenlen
Definition: m_ctype.h:446
unsigned mbmaxlen
Definition: m_ctype.h:445
unsigned strxfrm_multiply
Definition: m_ctype.h:441
MY_COLLATION_HANDLER * coll
Definition: m_ctype.h:454
const uint8_t * sort_order
Definition: m_ctype.h:434
MY_CHARSET_HANDLER * cset
Definition: m_ctype.h:453
const char * m_coll_name
Definition: m_ctype.h:427
const uint8_t * ident_map
Definition: m_ctype.h:440
uint8_t levels_for_compare
Definition: m_ctype.h:451
unsigned mbminlen
Definition: m_ctype.h:444
const MY_UNI_IDX * tab_from_uni
Definition: m_ctype.h:437
struct Coll_param * coll_param
Definition: m_ctype.h:430
struct MY_UCA_INFO * uca
Definition: m_ctype.h:435
const uint8_t * to_upper
Definition: m_ctype.h:433
my_wc_t min_sort_char
Definition: m_ctype.h:447
unsigned primary_number
Definition: m_ctype.h:423
enum Pad_attribute pad_attribute
If this collation is PAD_SPACE, it collates as if all inputs were padded with a given number of space...
Definition: m_ctype.h:463
const char * tailoring
Definition: m_ctype.h:429
unsigned state
Definition: m_ctype.h:425
const char * comment
Definition: m_ctype.h:428
Definition: str_uca_type.h:74
Helper structure to return error messages from collation parser/initializer.
Definition: m_ctype.h:180
unsigned errcode
See include/mysys_err.h.
Definition: m_ctype.h:182
char errarg[errmsg_size]
Error message text.
Definition: m_ctype.h:183
static constexpr int errmsg_size
Definition: m_ctype.h:181
Definition: m_ctype.h:340
size_t(* lengthsp)(const CHARSET_INFO *, const char *ptr, size_t length)
Given a pointer and a length in bytes, returns a new length in bytes where all trailing space charact...
Definition: m_ctype.h:372
double(* strntod)(const CHARSET_INFO *, const char *s, size_t l, const char **e, int *err)
Definition: m_ctype.h:410
long long(* strtoll10)(const CHARSET_INFO *cs, const char *nptr, const char **endptr, int *error)
Definition: m_ctype.h:412
int(* ctype)(const CHARSET_INFO *cs, int *ctype, const uint8_t *s, const uint8_t *e)
Definition: m_ctype.h:380
size_t(* well_formed_len)(const CHARSET_INFO *, const char *b, const char *e, size_t nchars, int *error)
Definition: m_ctype.h:355
size_t(* caseup_str)(const CHARSET_INFO *, char *)
Definition: m_ctype.h:384
unsigned long long(* strntoull10rnd)(const CHARSET_INFO *cs, const char *str, size_t length, int unsigned_fl, const char **endptr, int *error)
Definition: m_ctype.h:414
unsigned(* ismbchar)(const CHARSET_INFO *, const char *, const char *)
Definition: m_ctype.h:343
unsigned long long(* strntoull)(const CHARSET_INFO *, const char *s, size_t l, int base, const char **e, int *err)
Definition: m_ctype.h:408
unsigned long(* strntoul)(const CHARSET_INFO *, const char *s, size_t l, int base, const char **e, int *err)
Definition: m_ctype.h:404
bool(* init)(CHARSET_INFO *, MY_CHARSET_LOADER *loader, MY_CHARSET_ERRMSG *)
Definition: m_ctype.h:341
long(* strntol)(const CHARSET_INFO *, const char *s, size_t l, int base, const char **e, int *err)
Definition: m_ctype.h:402
size_t(* charpos)(const CHARSET_INFO *, const char *b, const char *e, size_t pos)
Return at which byte codepoint number "pos" begins, relative to the start of the string.
Definition: m_ctype.h:353
size_t(* longlong10_to_str)(const CHARSET_INFO *, char *to, size_t n, int radix, long long val)
Definition: m_ctype.h:396
size_t(* numchars)(const CHARSET_INFO *, const char *b, const char *e)
Definition: m_ctype.h:345
size_t(* numcells)(const CHARSET_INFO *, const char *b, const char *e)
Definition: m_ctype.h:373
void(* fill)(const CHARSET_INFO *, char *to, size_t len, int fill)
Definition: m_ctype.h:399
my_charset_conv_wc_mb wc_mb
Definition: m_ctype.h:377
size_t(* scan)(const CHARSET_INFO *, const char *b, const char *e, int sq)
Definition: m_ctype.h:417
long long(* strntoll)(const CHARSET_INFO *, const char *s, size_t l, int base, const char **e, int *err)
Definition: m_ctype.h:406
my_charset_conv_mb_wc mb_wc
Definition: m_ctype.h:376
unsigned(* mbcharlen)(const CHARSET_INFO *, unsigned c)
Definition: m_ctype.h:344
my_charset_conv_case caseup
Definition: m_ctype.h:387
size_t(* casedn_str)(const CHARSET_INFO *, char *)
Definition: m_ctype.h:385
size_t(* long10_to_str)(const CHARSET_INFO *, char *to, size_t n, int radix, long int val)
Definition: m_ctype.h:394
my_charset_conv_case casedn
Definition: m_ctype.h:388
size_t(* snprintf)(const CHARSET_INFO *, char *to, size_t n, const char *fmt,...)
Definition: m_ctype.h:391
Definition: m_ctype.h:246
int(* strcasecmp)(const CHARSET_INFO *, const char *, const char *)
Definition: m_ctype.h:310
size_t(* strnxfrm)(const CHARSET_INFO *, uint8_t *dst, size_t dstlen, unsigned num_codepoints, const uint8_t *src, size_t srclen, unsigned flags)
Transform the string into a form such that memcmp() between transformed strings yields the correct co...
Definition: m_ctype.h:287
bool(* like_range)(const CHARSET_INFO *, const char *s, size_t s_length, char w_prefix, char w_one, char w_many, size_t res_length, char *min_str, char *max_str, size_t *min_len, size_t *max_len)
Definition: m_ctype.h:302
void(* hash_sort)(const CHARSET_INFO *cs, const uint8_t *key, size_t len, uint64_t *nr1, uint64_t *nr2)
Compute a sort hash for the given key.
Definition: m_ctype.h:326
int(* strnncoll)(const CHARSET_INFO *, const uint8_t *s, size_t slen, const uint8_t *t, size_t tlen, bool t_is_prefix)
Definition: m_ctype.h:250
int(* wildcmp)(const CHARSET_INFO *, const char *str, const char *str_end, const char *wildstr, const char *wildend, int escape, int w_one, int w_many)
Definition: m_ctype.h:306
bool(* propagate)(const CHARSET_INFO *cs, const uint8_t *str, size_t len)
Definition: m_ctype.h:328
bool(* strstr)(const CHARSET_INFO *, const char *b, size_t b_length, const char *s, size_t s_length, my_match_t *match)
Definition: m_ctype.h:312
bool(* init)(CHARSET_INFO *, MY_CHARSET_LOADER *, MY_CHARSET_ERRMSG *)
Definition: m_ctype.h:247
int(* strnncollsp)(const CHARSET_INFO *, const uint8_t *, size_t, const uint8_t *, size_t)
Compare the two strings under the pad rules given by the collation.
Definition: m_ctype.h:261
size_t(* strnxfrmlen)(const CHARSET_INFO *, size_t num_bytes)
Return the maximum number of output bytes needed for strnxfrm() to output all weights for any string ...
Definition: m_ctype.h:301
void(* uninit)(CHARSET_INFO *, MY_CHARSET_LOADER *)
Definition: m_ctype.h:248
Definition: str_uca_type.h:125
Definition: m_ctype.h:64
uint32_t tolower
Definition: m_ctype.h:66
uint32_t toupper
Definition: m_ctype.h:65
uint32_t sort
Definition: m_ctype.h:67
Definition: m_ctype.h:70
const MY_UNICASE_CHARACTER ** page
Definition: m_ctype.h:72
my_wc_t maxchar
Definition: m_ctype.h:71
Definition: m_ctype.h:77
uint8_t * ctype
Definition: m_ctype.h:79
uint8_t pctype
Definition: m_ctype.h:78
Definition: m_ctype.h:164
uint16_t to
Definition: m_ctype.h:166
uint16_t from
Definition: m_ctype.h:165
const uint8_t * tab
Definition: m_ctype.h:167
Definition: sql_chars.h:90
Definition: m_ctype.h:170
unsigned mb_len
Definition: m_ctype.h:172
unsigned end
Definition: m_ctype.h:171
int n
Definition: xcom_base.cc:509