MySQL 9.0.0
Source Code Documentation
strfunc.h
Go to the documentation of this file.
1/* Copyright (c) 2006, 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 STRFUNC_INCLUDED
25#define STRFUNC_INCLUDED
26
27#include <stddef.h>
28#include <sys/types.h>
29#include <cstring>
30#include <utility>
31
32#include "lex_string.h"
33#include "my_inttypes.h"
34#include "mysql/mysql_lex_string.h" // MYSQL_LEX_CSTRING
36#include "sql_string.h"
37#include "template_utils.h"
38
39class THD;
40struct MEM_ROOT;
41struct TYPELIB;
42
43ulonglong find_set(const TYPELIB *lib, const char *x, size_t length,
44 const CHARSET_INFO *cs, const char **err_pos, uint *err_len,
45 bool *set_warning);
46uint find_type(const TYPELIB *lib, const char *find, size_t length,
47 bool part_match);
48uint find_type2(const TYPELIB *lib, const char *find, size_t length,
49 const CHARSET_INFO *cs);
50uint check_word(TYPELIB *lib, const char *val, const char *end,
51 const char **end_of_word);
53 const char *lib[]);
55 const char *lib[]);
57 const char *lib[], bool quoted);
58
59size_t strconvert(const CHARSET_INFO *from_cs, const char *from,
60 CHARSET_INFO *to_cs, char *to, size_t to_length,
61 uint *errors);
62
63bool copy_string(MEM_ROOT *mem_root, String *dst, const String *src);
64
65/**
66 Return a LEX_CSTRING handle to a std::string like (meaning something
67 which has the c_str() and length() member functions). Note that the
68 std::string-like object retains ownership of the character array,
69 and consequently the returned LEX_CSTRING is only valid as long as the
70 std::string-like object is valid.
71
72 @param s std::string-like object
73
74 @return LEX_CSTRING handle to string
75*/
76template <class STDSTRINGLIKE_TYPE>
77MYSQL_LEX_CSTRING lex_cstring_handle(const STDSTRINGLIKE_TYPE &s) {
78 return {s.c_str(), s.length()};
79}
80
81/**
82 Lowercase a string according to charset.
83
84 @param ci pointer to charset for conversion
85 @param s string to lower-case
86 @retval modified argument if r-value
87 @retval copy of modified argument if lvalue (meaningless, don't use)
88 */
89template <class STRLIKE_TYPE>
90STRLIKE_TYPE casedn(const CHARSET_INFO *ci, STRLIKE_TYPE &&s) {
91 s.resize(ci->casedn_multiply * s.size());
92 s.resize(my_casedn_str(ci, &s.front()));
93 return std::forward<STRLIKE_TYPE>(s);
94}
95
96/**
97 Lowercase a string according to charset. Overload for const T& which
98 copies argument and forwards to T&& overload.
99
100 @param ci pointer to charset for conversion
101 @param src string to lower-case
102 @retval modified copy of argument
103 */
104
105template <class STRLIKE_TYPE>
106STRLIKE_TYPE casedn(const CHARSET_INFO *ci, const STRLIKE_TYPE &src) {
107 return casedn(ci, STRLIKE_TYPE{src});
108}
109
110/**
111 Create a LEX_STRING in a MEM_ROOT and copy the given string
112 into it.
113
114 @param mem_root MEM_ROOT where to allocate the LEX_STRING.
115 @param str string to be copied into the LEX_STRING.
116 @param length length of str, in bytes
117
118 @return nullptr on failure, or pointer to the LEX_STRING object
119*/
121 size_t length);
122
123/**
124 Copy the given string into a LEX_STRING, allocating it in the
125 given MEM_ROOT.
126
127 @param mem_root MEM_ROOT where to allocate the string.
128 @param lex_str LEX_STRING to fill with the copied string.
129 @param str string to be copied into the LEX_STRING.
130 @param length length of str, in bytes
131
132 @return true on failure (OOM), false otherwise.
133*/
135 const char *str, size_t length);
136
137/**
138 Copy the given string into a LEX_CSTRING, allocating it in the
139 given MEM_ROOT.
140
141 @param mem_root MEM_ROOT where to allocate the string.
142 @param lex_str LEX_CSTRING to fill with the copied string.
143 @param str string to be copied into the LEX_CSTRING.
144 @param length length of str, in bytes
145
146 @return true on failure (OOM), false otherwise.
147*/
149 const char *str, size_t length);
150
151/**
152 Utility function for copying a LEX_STRING_TYPE (either LEX_STRING
153 or LEX_CSTRING) onto a mem_root.
154
155 @param mem_root Where to allocate
156 @param s Source string to copy.
157
158 @return LEX_STRING_TYPE referring to the mem_root allocated string.
159 */
160template <class LEX_STRING_TYPE>
161inline LEX_STRING_TYPE LexStringDupRoot(MEM_ROOT *mem_root, LEX_STRING_TYPE s) {
162 return {strmake_root(mem_root, s.str, s.length), s.length};
163}
164
165/**
166 Utility function for copying a LEX_STRING_TYPE (either LEX_STRING
167 or LEX_CSTRING) onto a mem_root, but which does not allocate space
168 for empty strings. If called on a zero-length string EMPTY_CSTR is
169 returned (where str is "").
170
171 @param mem_root Where to allocate
172 @param s Source string to copy.
173
174 @return LEX_STRING_TYPE referring to the mem_root allocated string,
175 or EMPTY_CSTR.
176 */
177template <class LEX_STRING_TYPE>
179 LEX_STRING_TYPE s) {
180 return s.length == 0 ? LEX_CSTRING{"", 0} : LexStringDupRoot(mem_root, s);
181}
182
183/**
184 Utility function for collating (using strnncoll) two LEX_STRING_TYPEs.
185 Saves the boiler plate and casting needed when calling the function directly.
186*/
187template <class LEX_STRING_TYPE>
188inline int strnncmp_nopads(const CHARSET_INFO &cs, LEX_STRING_TYPE &&a,
189 LEX_STRING_TYPE &&b) {
190 return cs.coll->strnncoll(
191 &cs, pointer_cast<const unsigned char *>(a.str), a.length,
192 pointer_cast<const unsigned char *>(b.str), b.length, false);
193}
194#endif /* STRFUNC_INCLUDED */
Using this class is fraught with peril, and you need to be very careful when doing so.
Definition: sql_string.h:167
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:36
static MEM_ROOT mem_root
Definition: client_plugin.cc:114
char * strmake_root(MEM_ROOT *root, const char *str, size_t len)
Definition: my_alloc.cc:287
#define quoted
Definition: lexyy.cc:960
A better implementation of the UNIX ctype(3) library.
size_t my_casedn_str(const CHARSET_INFO *cs, char *str)
Definition: m_ctype.h:732
Some integer typedefs for easier portability.
unsigned long long int ulonglong
Definition: my_inttypes.h:56
uint end_of_word(const char *pos)
Definition: mysqltest.cc:11332
std::string str(const mysqlrouter::ConfigGenerator::Options::Endpoint &ep)
Definition: config_generator.cc:1081
Definition: commit_order_queue.h:34
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
Container::const_iterator find(const Container &c, Value &&value)
Definition: generic.h:39
Cursor end()
A past-the-end Cursor.
Definition: rules_table_service.cc:192
std::set< Key, Compare, ut::allocator< Key > > set
Specialization of set which uses ut_allocator.
Definition: ut0new.h:2883
Our own string classes, used pervasively throughout the executor.
int strnncmp_nopads(const CHARSET_INFO &cs, LEX_STRING_TYPE &&a, LEX_STRING_TYPE &&b)
Utility function for collating (using strnncoll) two LEX_STRING_TYPEs.
Definition: strfunc.h:188
bool lex_string_strmake(MEM_ROOT *mem_root, LEX_STRING *lex_str, const char *str, size_t length)
Copy the given string into a LEX_STRING, allocating it in the given MEM_ROOT.
Definition: strfunc.cc:334
char * set_to_string(THD *thd, LEX_STRING *result, ulonglong set, const char *lib[])
Definition: strfunc.cc:298
MYSQL_LEX_CSTRING lex_cstring_handle(const STDSTRINGLIKE_TYPE &s)
Return a LEX_CSTRING handle to a std::string like (meaning something which has the c_str() and length...
Definition: strfunc.h:77
LEX_STRING_TYPE LexStringDupRoot(MEM_ROOT *mem_root, LEX_STRING_TYPE s)
Utility function for copying a LEX_STRING_TYPE (either LEX_STRING or LEX_CSTRING) onto a mem_root.
Definition: strfunc.h:161
ulonglong find_set(const TYPELIB *lib, const char *x, size_t length, const CHARSET_INFO *cs, const char **err_pos, uint *err_len, bool *set_warning)
Definition: strfunc.cc:60
STRLIKE_TYPE casedn(const CHARSET_INFO *ci, STRLIKE_TYPE &&s)
Lowercase a string according to charset.
Definition: strfunc.h:90
bool copy_string(MEM_ROOT *mem_root, String *dst, const String *src)
Definition: strfunc.cc:356
LEX_STRING * make_lex_string_root(MEM_ROOT *mem_root, const char *str, size_t length)
Create a LEX_STRING in a MEM_ROOT and copy the given string into it.
Definition: strfunc.cc:325
LEX_STRING_TYPE LexStringDupRootUnlessEmpty(MEM_ROOT *mem_root, LEX_STRING_TYPE s)
Utility function for copying a LEX_STRING_TYPE (either LEX_STRING or LEX_CSTRING) onto a mem_root,...
Definition: strfunc.h:178
char * flagset_to_string(THD *thd, LEX_STRING *result, ulonglong set, const char *lib[])
Definition: strfunc.cc:303
uint check_word(TYPELIB *lib, const char *val, const char *end, const char **end_of_word)
Definition: strfunc.cc:195
size_t strconvert(const CHARSET_INFO *from_cs, const char *from, CHARSET_INFO *to_cs, char *to, size_t to_length, uint *errors)
Definition: strfunc.cc:227
uint find_type2(const TYPELIB *lib, const char *find, size_t length, const CHARSET_INFO *cs)
Definition: strfunc.cc:157
uint find_type(const TYPELIB *lib, const char *find, size_t length, bool part_match)
Definition: strfunc.cc:120
Definition: m_ctype.h:421
uint8_t casedn_multiply
Definition: m_ctype.h:443
The MEM_ROOT is a simple arena, where allocations are carved out of larger blocks.
Definition: my_alloc.h:83
Definition: mysql_lex_string.h:40
size_t length
Definition: mysql_lex_string.h:42
Definition: mysql_lex_string.h:35
Definition: typelib.h:35
Definition: result.h:30