MySQL 9.2.0
Source Code Documentation
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
rpn.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2024 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, as
10 * 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 * This program is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
17 * the GNU General Public License, version 2.0, for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software Foundation, Inc.,
21 * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 */
23
24#ifndef ROUTER_SRC_ROUTING_GUIDELINES_SRC_RPN_H_
25#define ROUTER_SRC_ROUTING_GUIDELINES_SRC_RPN_H_
26
27#include <cmath>
28#include <concepts>
29#include <exception>
30#include <functional>
31#include <memory>
32#include <string>
33#include <type_traits>
34#include <unordered_map>
35#include <utility>
36#include <variant>
37#include <vector>
39
40namespace routing_guidelines {
41class Rules_parser;
42class Routing_guidelines_parser_test;
43class Routing_guidelines_document_parser;
44
45namespace rpn {
46
47struct Function_definition;
48
49class Token final {
50 public:
51 enum class Type {
52 NUM,
53 STR,
54 BOOL,
55 ROLE,
56 LIST,
57 NONE,
58 ADD,
59 MIN,
60 DIV,
61 MUL,
62 MOD,
63 NEG,
64 LT,
65 GT,
66 NE,
67 LE,
68 GE,
69 EQ,
70 IN_OP,
71 NOT,
72 AND,
73 MID_AND,
74 OR,
75 MID_OR,
76 TAG_REF,
77 VAR_REF,
78 FUNC,
81 CONCAT,
82 REGEXP,
84 };
85
86 struct Location {
87 int start;
88 int end;
89 };
90
91 struct Function {
94 };
95
96 Token() : type_(Type::NONE), value_(0.0) {}
97
98 Token(Type type, int start, int end)
99 : type_(type), value_(Location{start, end}) {}
100
101 template <typename T>
102 requires std::is_arithmetic_v<T>
103 explicit Token(T v, Type type = Type::NUM)
104 : type_(type), value_(static_cast<double>(v)) {}
105
106 template <typename T>
107 requires std::is_constructible_v<std::string, T>
108 explicit Token(T &&s, Type type = Type::STR)
109 : type_(type), value_(std::string(std::forward<T>(s))) {}
110
111 explicit Token(bool val) : type_(Type::BOOL), value_(val ? 1.0 : 0.0) {}
112
113 Token(const Function_definition &function, int start, int end)
114 : type_(Type::FUNC), value_(Function{&function, {start, end}}) {}
115
116 Token(const Token &i) = default;
117 Token(Token &&i) noexcept = default;
118
119 static Token regexp(const std::string &rgx);
120
121 Token &operator=(const Token &i) = default;
122 Token &operator=(Token &&i) noexcept = default;
123
124 bool is_num() const { return type_ == Type::NUM; }
125
126 bool is_role() const { return type_ == Type::ROLE; }
127
128 double get_num() const { return std::get<double>(value_); }
129
130 bool is_bool() const { return type_ == Type::BOOL; }
131
132 bool get_bool(const char *exception_msg = nullptr) const;
133
134 bool is_string() const { return type_ == Type::STR; }
135
136 const std::string &get_string() const {
137 if (std::holds_alternative<std::string>(value_)) {
138 return std::get<std::string>(value_);
139 }
140 throw std::runtime_error("Type error, expected string");
141 }
142
143 bool is_null() const { return type_ == Type::NONE; }
144
145 double &number() { return std::get<double>(value_); }
146
147 const double &number() const { return std::get<double>(value_); }
148
149 const std::string &string() const { return std::get<std::string>(value_); }
150
151 std::string &string() { return std::get<std::string>(value_); }
152
153 bool has_location() const {
154 return std::holds_alternative<Location>(value_) ||
155 std::holds_alternative<Function>(value_);
156 }
157
158 const Location &location() const {
159 return std::holds_alternative<Function>(value_)
160 ? std::get<Function>(value_).location
161 : std::get<Location>(value_);
162 }
163
164 const Function_definition &function() const {
165 return *std::get<Function>(value_).definition;
166 }
167
168 Type type() const { return type_; }
169
170 template <class Visitor>
171 constexpr auto visit(Visitor &&vis) const {
172 return std::visit(vis, value_);
173 }
174
175 private:
177
178 std::variant<double, std::string, Location, Function> value_;
179
180 friend bool operator==(const Token &lhs, const Token &rhs);
181 friend bool operator<(const Token &lhs, const Token &rhs);
182 friend bool operator<=(const Token &lhs, const Token &rhs);
183};
184
185inline bool operator!=(const Token &lhs, const Token &rhs) {
186 return !(lhs == rhs);
187}
188inline bool operator>(const Token &lhs, const Token &rhs) { return rhs < lhs; }
189inline bool operator>=(const Token &lhs, const Token &rhs) {
190 return rhs <= lhs;
191}
192
193std::string to_string(const Token::Type tt);
194std::string to_string(const Token &token, bool print_value = false);
195
197 const char *name;
198 std::vector<rpn::Token::Type> args;
200 void (*reducer)(std::vector<Token> *);
201
202 void reduce(std::vector<rpn::Token> *stack) const;
203};
204
205class Context final {
206 public:
207 Context();
208 Context(const Context &) = delete;
209 Context &operator=(const Context &) = delete;
210
211 Token get_tag(std::string_view name) const;
212 Token get(const std::string &name) const;
213 Token get(int offset) const { return context_vars_[offset](); }
214 Token::Type get_type(std::string_view name, int *offset) const;
215 std::optional<std::string> get_var_name(const Token &tok) const;
216
217 template <class T>
218 void set(const std::string &name, T &&value) {
219 context_vars_.emplace_back(
220 [t = Token(std::forward<T>(value))]() { return t; });
221 context_[name] = context_vars_.size() - 1;
222 }
223
225 server_ = &server_info;
226 }
227
228 void clear_server_info() { server_ = nullptr; }
229
231 session_ = &session_info;
232 }
233
234 void clear_session_info() { session_ = nullptr; }
235
237 sql_ = &sql_info;
238 }
239
240 void clear_sql_info() { sql_ = nullptr; }
241
243 router_ = &router_info;
244 }
245
246 void clear_router_info() { router_ = nullptr; }
247
248 private:
249 std::unique_ptr<bool, std::function<void(bool *)>> start_parse_mode() {
250 parse_mode_ = true;
251 return std::unique_ptr<bool, std::function<void(bool *)>>(
252 &parse_mode_, [](bool *b) { *b = false; });
253 }
254
255 Token handle_miss(std::string_view name) const;
256
257 const routing_guidelines::Router_info *router_{nullptr};
258 const routing_guidelines::Server_info *server_ = nullptr;
259 const routing_guidelines::Session_info *session_ = nullptr;
260 const routing_guidelines::Sql_info *sql_ = nullptr;
261
262 std::map<std::string, int, std::less<>> context_;
263 std::vector<std::function<Token()>> context_vars_;
264 bool parse_mode_{false};
265 bool extended_session_info_{false};
266
268};
269
271 public:
272 Expression() = default;
273 Expression(const std::vector<Token> &rpn, const std::string &code)
274 : rpn_(rpn), code_(code) {}
275 Expression(std::vector<Token> &&rpn, const std::string &code)
276 : rpn_(std::move(rpn)), code_(code) {}
277
278 Token eval(Context *variables,
279 const Routing_guidelines_engine::ResolveCache *cache = nullptr,
280 const bool dry_run = false) const;
281
282 bool verify(Context *variables) const;
283
284 std::string variable() const { return rpn_.back().string(); }
285
286 bool empty() { return rpn_.empty(); }
287 void clear();
288
289 friend bool operator==(const Expression &lhs, const Expression &rhs);
290 friend bool operator!=(const Expression &lhs, const Expression &rhs);
291
292 private:
293 std::vector<Token> rpn_;
294 std::string code_;
295
298};
299
300std::string error_msg(const char *msg, const std::string &exp, int beg,
301 int end);
302
303std::vector<std::string_view> get_variables_names();
304
305} // namespace rpn
306} // namespace routing_guidelines
307
308#endif // ROUTER_SRC_ROUTING_GUIDELINES_SRC_RPN_H_
std::unordered_map< std::string, net::ip::address > ResolveCache
Map with preprocessed resolved hostnames.
Definition: routing_guidelines.h:186
Conducting the whole scanning and parsing of routing guidelines rules.
Definition: rules_parser.h:72
void clear_sql_info()
Definition: rpn.h:240
std::unique_ptr< bool, std::function< void(bool *)> > start_parse_mode()
Definition: rpn.h:249
Context & operator=(const Context &)=delete
void clear_server_info()
Definition: rpn.h:228
void set_server_info(const routing_guidelines::Server_info &server_info)
Definition: rpn.h:224
void set_sql_info(const routing_guidelines::Sql_info &sql_info)
Definition: rpn.h:236
Context(const Context &)=delete
void set(const std::string &name, T &&value)
Definition: rpn.h:218
void set_router_info(const routing_guidelines::Router_info &router_info)
Definition: rpn.h:242
Token get(int offset) const
Definition: rpn.h:213
std::vector< std::function< Token()> > context_vars_
Definition: rpn.h:263
void clear_router_info()
Definition: rpn.h:246
std::map< std::string, int, std::less<> > context_
Definition: rpn.h:262
void set_session_info(const routing_guidelines::Session_info &session_info)
Definition: rpn.h:230
void clear_session_info()
Definition: rpn.h:234
friend Routing_guidelines_document_parser
Definition: rpn.h:297
Expression(std::vector< Token > &&rpn, const std::string &code)
Definition: rpn.h:275
std::string code_
Definition: rpn.h:294
bool empty()
Definition: rpn.h:286
friend Routing_guidelines_parser_test
Definition: rpn.h:296
Expression(const std::vector< Token > &rpn, const std::string &code)
Definition: rpn.h:273
std::string variable() const
Definition: rpn.h:284
std::vector< Token > rpn_
Definition: rpn.h:293
Definition: rpn.h:49
Token(Token &&i) noexcept=default
bool has_location() const
Definition: rpn.h:153
Token(const Token &i)=default
bool is_string() const
Definition: rpn.h:134
const Function_definition & function() const
Definition: rpn.h:164
std::variant< double, std::string, Location, Function > value_
Definition: rpn.h:178
bool is_num() const
Definition: rpn.h:124
std::string & string()
Definition: rpn.h:151
bool is_role() const
Definition: rpn.h:126
double & number()
Definition: rpn.h:145
Type type_
Definition: rpn.h:176
Type
Definition: rpn.h:51
Token(T &&s, Type type=Type::STR)
Definition: rpn.h:108
bool is_null() const
Definition: rpn.h:143
const double & number() const
Definition: rpn.h:147
Token(const Function_definition &function, int start, int end)
Definition: rpn.h:113
Token()
Definition: rpn.h:96
Token(Type type, int start, int end)
Definition: rpn.h:98
bool is_bool() const
Definition: rpn.h:130
Token & operator=(const Token &i)=default
Token(T v, Type type=Type::NUM)
Definition: rpn.h:103
Type type() const
Definition: rpn.h:168
Token & operator=(Token &&i) noexcept=default
const Location & location() const
Definition: rpn.h:158
double get_num() const
Definition: rpn.h:128
Token(bool val)
Definition: rpn.h:111
const std::string & get_string() const
Definition: rpn.h:136
constexpr auto visit(Visitor &&vis) const
Definition: rpn.h:171
const std::string & string() const
Definition: rpn.h:149
static Gcs_tagged_lock::Tag get_tag(std::uint64_t const &lock_word)
Definition: gcs_tagged_lock.cc:38
static void start(mysql_harness::PluginFuncEnv *env)
Definition: http_auth_backend_plugin.cc:180
static std::string to_string(const LEX_STRING &str)
Definition: lex_string.h:50
bool operator==(const my_thread_handle &a, const my_thread_handle &b)
Definition: my_thread.h:151
static void print_value(FILE *file, MYSQL_RES *result, MYSQL_ROW row, const char *prefix, const char *name, int string_value)
Definition: mysqldump.cc:5674
@ NONE
Definition: base.h:45
static mysql_service_status_t get(THD **thd) noexcept
Definition: mysql_current_thread_reader_all_empty.cc:31
bool verify(const std::string &digest, const std::string &message, const std::string &public_key_content)
Verify a message signed by the private key pair of the provided public key.
Definition: my_base64_encode.cc:115
static mysql_service_status_t clear(reference_caching_channel channel) noexcept
Definition: component.cc:146
Definition: errors.cc:45
Type
Definition: resource_group_basic_types.h:33
std::vector< std::string_view > get_variables_names()
Definition: rpn.cc:841
bool operator<(const Token &lhs, const Token &rhs)
Definition: rpn.cc:124
bool operator>(const Token &lhs, const Token &rhs)
Definition: rpn.h:188
bool operator<=(const Token &lhs, const Token &rhs)
Definition: rpn.cc:138
bool operator==(const Token &lhs, const Token &rhs)
Definition: rpn.cc:105
std::string error_msg(const char *msg, const std::string &exp, int beg, int end)
Definition: rpn.cc:828
bool operator>=(const Token &lhs, const Token &rhs)
Definition: rpn.h:189
bool operator!=(const Token &lhs, const Token &rhs)
Definition: rpn.h:185
Definition: routing_guidelines_datatypes.h:30
Definition: gcs_xcom_synode.h:64
std::vector< T, ut::allocator< T > > vector
Specialization of vector which uses allocator.
Definition: ut0new.h:2876
std::conditional_t< !std::is_array< T >::value, std::unique_ptr< T, detail::Deleter< T > >, std::conditional_t< detail::is_unbounded_array_v< T >, std::unique_ptr< T, detail::Array_deleter< std::remove_extent_t< T > > >, void > > unique_ptr
The following is a common type that is returned by all the ut::make_unique (non-aligned) specializati...
Definition: ut0new.h:2440
@ NUM
Definition: sql_yacc.h:425
case opt name
Definition: sslopt-case.h:29
Information about this Router instance.
Definition: routing_guidelines.h:57
Information about one server destination.
Definition: routing_guidelines.h:78
Information about incoming session.
Definition: routing_guidelines.h:101
Information about query details.
Definition: routing_guidelines.h:115
rpn::Token::Type ret_val
Definition: rpn.h:199
std::vector< rpn::Token::Type > args
Definition: rpn.h:198
const char * name
Definition: rpn.h:197
Location location
Definition: rpn.h:93
const Function_definition * definition
Definition: rpn.h:92
task_env * stack
Definition: task.cc:896
const char * get_type(TYPELIB *typelib, unsigned int nr)