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