1 /*
2 * Copyright (c) 2015, 2021, Oracle and/or its affiliates.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License, version 2.0,
6 * as published by the Free Software Foundation.
7 *
8 * This program is also distributed with certain software (including
9 * but not limited to OpenSSL) that is licensed under separate terms,
10 * as designated in a particular file or component or in included license
11 * documentation. The authors of MySQL hereby grant you an additional
12 * permission to link the program and your derivative works with the
13 * separately licensed software that they have included with MySQL.
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
23 * 02110-1301 USA
24 */
25
26 #include <algorithm>
27 #include "mysql_function_names.h"
28
29 namespace xpl {
30
31 namespace {
32 // list of built-in function names for MySQL
33 // taken from item_create.cc
34 // keep in ASC order
35 const char *const native_mysql_functions[] = {
36 "ABS", "ACOS",
37 "ADDTIME", "AES_DECRYPT",
38 "AES_ENCRYPT", "ANY_VALUE",
39 "AREA", "ASBINARY",
40 "ASIN", "ASTEXT",
41 "ASWKB", "ASWKT",
42 "ATAN", "ATAN2",
43 "AVG", "BENCHMARK",
44 "BIN", "BIT_COUNT",
45 "BIT_LENGTH", "BUFFER",
46 "CEIL", "CEILING",
47 "CENTROID", "CHARACTER_LENGTH",
48 "CHAR_LENGTH", "COERCIBILITY",
49 "COMPRESS", "CONCAT",
50 "CONCAT_WS", "CONNECTION_ID",
51 "CONV", "CONVERT_TZ",
52 "CONVEXHULL", "COS",
53 "COT", "CRC32",
54 "CROSSES", "DATEDIFF",
55 "DATE_FORMAT", "DAYNAME",
56 "DAYOFMONTH", "DAYOFWEEK",
57 "DAYOFYEAR", "DECODE",
58 "DEGREES", "DES_DECRYPT",
59 "DES_ENCRYPT", "DIMENSION",
60 "DISJOINT", "DISTANCE",
61 "ELT", "ENCODE",
62 "ENCRYPT", "ENDPOINT",
63 "ENVELOPE", "EQUALS",
64 "EXP", "EXPORT_SET",
65 "EXTERIORRING", "EXTRACTVALUE",
66 "FIELD", "FIND_IN_SET",
67 "FLOOR", "FOUND_ROWS",
68 "FROM_BASE64", "FROM_DAYS",
69 "FROM_UNIXTIME", "GEOMCOLLFROMTEXT",
70 "GEOMCOLLFROMWKB", "GEOMETRYCOLLECTIONFROMTEXT",
71 "GEOMETRYCOLLECTIONFROMWKB", "GEOMETRYFROMTEXT",
72 "GEOMETRYFROMWKB", "GEOMETRYN",
73 "GEOMETRYTYPE", "GEOMFROMTEXT",
74 "GEOMFROMWKB", "GET_LOCK",
75 "GLENGTH", "GREATEST",
76 "GTID_SUBSET", "GTID_SUBTRACT",
77 "HEX", "IFNULL",
78 "INET6_ATON", "INET6_NTOA",
79 "INET_ATON", "INET_NTOA",
80 "INSTR", "INTERIORRINGN",
81 "INTERSECTS", "ISCLOSED",
82 "ISEMPTY", "ISNULL",
83 "ISSIMPLE", "IS_FREE_LOCK",
84 "IS_IPV4", "IS_IPV4_COMPAT",
85 "IS_IPV4_MAPPED", "IS_IPV6",
86 "IS_USED_LOCK", "JSON_ARRAY",
87 "JSON_ARRAY_APPEND", "JSON_ARRAY_INSERT",
88 "JSON_CONTAINS", "JSON_CONTAINS_PATH",
89 "JSON_DEPTH", "JSON_EXTRACT",
90 "JSON_INSERT", "JSON_KEYS",
91 "JSON_LENGTH", "JSON_MERGE",
92 "JSON_OBJECT", "JSON_QUOTE",
93 "JSON_REMOVE", "JSON_REPLACE",
94 "JSON_SEARCH", "JSON_SET",
95 "JSON_TYPE", "JSON_UNQUOTE",
96 "JSON_VALID", "LAST_DAY",
97 "LAST_INSERT_ID", "LCASE",
98 "LEAST", "LENGTH",
99 "LIKE_RANGE_MAX", "LIKE_RANGE_MIN",
100 "LINEFROMTEXT", "LINEFROMWKB",
101 "LINESTRINGFROMTEXT", "LINESTRINGFROMWKB",
102 "LN", "LOAD_FILE",
103 "LOCATE", "LOG",
104 "LOG10", "LOG2",
105 "LOWER", "LPAD",
106 "LTRIM", "MAKEDATE",
107 "MAKETIME", "MAKE_SET",
108 "MASTER_POS_WAIT", "MBRCONTAINS",
109 "MBRCOVEREDBY", "MBRCOVERS",
110 "MBRDISJOINT", "MBREQUAL",
111 "MBREQUALS", "MBRINTERSECTS",
112 "MBROVERLAPS", "MBRTOUCHES",
113 "MBRWITHIN", "MD5",
114 "MLINEFROMTEXT", "MLINEFROMWKB",
115 "MONTHNAME", "MPOINTFROMTEXT",
116 "MPOINTFROMWKB", "MPOLYFROMTEXT",
117 "MPOLYFROMWKB", "MULTILINESTRINGFROMTEXT",
118 "MULTILINESTRINGFROMWKB", "MULTIPOINTFROMTEXT",
119 "MULTIPOINTFROMWKB", "MULTIPOLYGONFROMTEXT",
120 "MULTIPOLYGONFROMWKB", "NAME_CONST",
121 "NULLIF", "NUMGEOMETRIES",
122 "NUMINTERIORRINGS", "NUMPOINTS",
123 "OCT", "OCTET_LENGTH",
124 "ORD", "OVERLAPS",
125 "PERIOD_ADD", "PERIOD_DIFF",
126 "PI", "POINTFROMTEXT",
127 "POINTFROMWKB", "POINTN",
128 "POLYFROMTEXT", "POLYFROMWKB",
129 "POLYGONFROMTEXT", "POLYGONFROMWKB",
130 "POW", "POWER",
131 "QUOTE", "RADIANS",
132 "RAND", "RANDOM_BYTES",
133 "RELEASE_ALL_LOCKS", "RELEASE_LOCK",
134 "REVERSE", "ROUND",
135 "RPAD", "RTRIM",
136 "SEC_TO_TIME", "SHA",
137 "SHA1", "SHA2",
138 "SIGN", "SIN",
139 "SLEEP", "SOUNDEX",
140 "SPACE", "SQRT",
141 "SRID", "STARTPOINT",
142 "STRCMP", "STR_TO_DATE",
143 "ST_AREA", "ST_ASBINARY",
144 "ST_ASGEOJSON", "ST_ASTEXT",
145 "ST_ASWKB", "ST_ASWKT",
146 "ST_BUFFER", "ST_BUFFER_STRATEGY",
147 "ST_CENTROID", "ST_CONTAINS",
148 "ST_CONVEXHULL", "ST_CROSSES",
149 "ST_DIFFERENCE", "ST_DIMENSION",
150 "ST_DISJOINT", "ST_DISTANCE",
151 "ST_DISTANCE_SPHERE", "ST_ENDPOINT",
152 "ST_ENVELOPE", "ST_EQUALS",
153 "ST_EXTERIORRING", "ST_GEOHASH",
154 "ST_GEOMCOLLFROMTEXT", "ST_GEOMCOLLFROMTXT",
155 "ST_GEOMCOLLFROMWKB", "ST_GEOMETRYCOLLECTIONFROMTEXT",
156 "ST_GEOMETRYCOLLECTIONFROMWKB", "ST_GEOMETRYFROMTEXT",
157 "ST_GEOMETRYFROMWKB", "ST_GEOMETRYN",
158 "ST_GEOMETRYTYPE", "ST_GEOMFROMGEOJSON",
159 "ST_GEOMFROMTEXT", "ST_GEOMFROMWKB",
160 "ST_INTERIORRINGN", "ST_INTERSECTION",
161 "ST_INTERSECTS", "ST_ISCLOSED",
162 "ST_ISEMPTY", "ST_ISSIMPLE",
163 "ST_ISVALID", "ST_LATFROMGEOHASH",
164 "ST_LENGTH", "ST_LINEFROMTEXT",
165 "ST_LINEFROMWKB", "ST_LINESTRINGFROMTEXT",
166 "ST_LINESTRINGFROMWKB", "ST_LONGFROMGEOHASH",
167 "ST_MAKEENVELOPE", "ST_MLINEFROMTEXT",
168 "ST_MLINEFROMWKB", "ST_MPOINTFROMTEXT",
169 "ST_MPOINTFROMWKB", "ST_MPOLYFROMTEXT",
170 "ST_MPOLYFROMWKB", "ST_MULTILINESTRINGFROMTEXT",
171 "ST_MULTILINESTRINGFROMWKB", "ST_MULTIPOINTFROMTEXT",
172 "ST_MULTIPOINTFROMWKB", "ST_MULTIPOLYGONFROMTEXT",
173 "ST_MULTIPOLYGONFROMWKB", "ST_NUMGEOMETRIES",
174 "ST_NUMINTERIORRING", "ST_NUMINTERIORRINGS",
175 "ST_NUMPOINTS", "ST_OVERLAPS",
176 "ST_POINTFROMGEOHASH", "ST_POINTFROMTEXT",
177 "ST_POINTFROMWKB", "ST_POINTN",
178 "ST_POLYFROMTEXT", "ST_POLYFROMWKB",
179 "ST_POLYGONFROMTEXT", "ST_POLYGONFROMWKB",
180 "ST_SIMPLIFY", "ST_SRID",
181 "ST_STARTPOINT", "ST_SYMDIFFERENCE",
182 "ST_TOUCHES", "ST_UNION",
183 "ST_VALIDATE", "ST_WITHIN",
184 "ST_X", "ST_Y",
185 "SUBSTRING_INDEX", "SUBTIME",
186 "TAN", "TIMEDIFF",
187 "TIME_FORMAT", "TIME_TO_SEC",
188 "TOUCHES", "TO_BASE64",
189 "TO_DAYS", "TO_SECONDS",
190 "UCASE", "UNCOMPRESS",
191 "UNCOMPRESSED_LENGTH", "UNHEX",
192 "UNIX_TIMESTAMP", "UPDATEXML",
193 "UPPER", "UUID",
194 "UUID_SHORT", "VALIDATE_PASSWORD_STRENGTH",
195 "VERSION", "WAIT_FOR_EXECUTED_GTID_SET",
196 "WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS", "WEEKDAY",
197 "WEEKOFYEAR", "WITHIN",
198 "X", "Y",
199 "YEARWEEK"};
200 const char *const *native_mysql_functions_end =
201 get_array_end(native_mysql_functions);
202
203 // taken from lex.h (SYM_FN)
204 // keep in ASC order
205 const char *const special_mysql_functions[] = {
206 "ADDDATE", "BIT_AND", "BIT_OR", "BIT_XOR", "CAST",
207 "COUNT", "CURDATE", "CURTIME", "DATE_ADD", "DATE_SUB",
208 "DISTINCT", "EXTRACT", "GROUP_CONCAT", "MAX", "MID",
209 "MIN", "NOW", "POSITION", "SESSION_USER", "STD",
210 "STDDEV", "STDDEV_POP", "STDDEV_SAMP", "SUBDATE", "SUBSTR",
211 "SUBSTRING", "SUM", "SYSDATE", "SYSTEM_USER", "TRIM",
212 "VARIANCE", "VAR_POP", "VAR_SAMP"};
213 const char *const *special_mysql_functions_end =
214 get_array_end(special_mysql_functions);
215
216 // taken from sql_yacc.yy
217 // keep in ASC order
218 const char *const other_mysql_functions[] = {
219 "ASCII", "BINARY", "CHAR",
220 "CHARSET", "COALESCE", "COLLATION",
221 "CONTAINS", "CURDATE", "CURRENT_USER",
222 "CURTIME", "DATABASE", "DATE",
223 "DATE_ADD_INTERVAL", "DATE_SUB_INTERVAL", "DAY",
224 "EXTRACT", "FORMAT", "GEOMETRYCOLLECTION",
225 "HOUR", "IF", "IN",
226 "INSERT", "INTERVAL", "LEFT",
227 "LINESTRING", "MICROSECOND", "MINUTE",
228 "MOD", "MONTH", "MULTILINESTRING",
229 "MULTIPOINT", "MULTIPOLYGON", "MY_STRXFRM_PAD_WITH_SPACE",
230 "PASSWORD", "POINT", "POLYGON",
231 "POSITION", "QUARTER", "REPEAT",
232 "REPLACE", "REVERSE", "RIGHT",
233 "ROW_COUNT", "SECOND", "STRONGLY",
234 "SUBDATE", "SUBSTRING", "SYSDATE",
235 "TIME", "TIMESTAMP", "TIMESTAMP_ADD",
236 "TIMESTAMP_DIFF", "TRIM", "TRIM_LEADING",
237 "TRUNCATE", "USER", "USING",
238 "UTC_DATE", "UTC_TIME", "UTC_TIMESTAMP",
239 "WEEK", "WEIGHT_STRING", "YEAR"};
240 const char *const *other_mysql_functions_end =
241 get_array_end(other_mysql_functions);
242 } // namespace
243
is_native_mysql_function(const std::string & name)244 bool is_native_mysql_function(const std::string &name) {
245 std::string source;
246 source.resize(name.size());
247 std::transform(name.begin(), name.end(), source.begin(), ::toupper);
248 return std::binary_search(native_mysql_functions, native_mysql_functions_end,
249 source.c_str(), Is_less()) ||
250 std::binary_search(special_mysql_functions,
251 special_mysql_functions_end, source.c_str(),
252 Is_less()) ||
253 std::binary_search(other_mysql_functions, other_mysql_functions_end,
254 source.c_str(), Is_less());
255 }
256
257 } // namespace xpl
258