MySQL 9.2.0
Source Code Documentation
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
rules_parser.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_RULES_PARSER_H_
25#define ROUTER_SRC_ROUTING_GUIDELINES_SRC_RULES_PARSER_H_
26
27#include <array>
28#include <functional>
29#include <string>
30#include <string_view>
31#include <vector>
32
33#include "rpn.h"
34
35namespace routing_guidelines {
36class Rules_parser;
37
38const std::array<std::string_view, 4> k_member_roles{
39 kUndefinedRole, "PRIMARY", "SECONDARY", "READ_REPLICA"};
40
41const std::array<std::string_view, 3> k_cluster_roles{kUndefinedRole, "PRIMARY",
42 "REPLICA"};
43
44const std::array<std::string_view, 2> k_routing_strategies{"round-robin",
45 "first-available"};
46
47bool is_member_role(const std::string &s);
48
49bool is_cluster_role(const std::string &s);
50
51struct Exp_info {
52 int toks;
54};
55
56using List_info = std::vector<Exp_info>;
57
58} // namespace routing_guidelines
59
60union YYSTYPE;
61struct YYLTYPE;
62
64int yylex(union YYSTYPE *lvalp, YYLTYPE *llocp,
66void yyerror(YYLTYPE *llocp, routing_guidelines::Rules_parser *rp,
67 const char *msg);
68
69namespace routing_guidelines {
70
71/// Conducting the whole scanning and parsing of routing guidelines rules
72class Rules_parser final {
73 public:
74 explicit Rules_parser(
75 std::function<void(const std::string &)> tracer = nullptr)
76 : tracer_(tracer) {}
77
78 rpn::Expression parse(const std::string &buf, rpn::Context *context);
79
82 }
83
85
86 static std::vector<std::string> get_keyword_names();
87 static std::vector<std::string> get_function_names();
88
89 private:
90 Rules_parser(const Rules_parser &) = delete;
94
95 // RPN creation
96 void emit(rpn::Token::Type type, const YYLTYPE &loc);
97 void emit_null();
99 void emit_string(std::string_view str,
101 void emit_log_operation(rpn::Token::Type type, double arg_split,
102 const YYLTYPE &loc);
103 bool emit_in_op(const Exp_info &e, List_info *list, YYLTYPE *llocp,
104 Exp_info *ret);
105 bool emit_like_op(const Exp_info &str, const Exp_info &pattern,
106 YYLTYPE *llocp, Exp_info *ret);
107 bool emit_function(const rpn::Function_definition *function,
108 List_info *arguments, YYLTYPE *llocp, Exp_info *ret);
109 bool emit_resolve(YYLTYPE *llocp, Exp_info *ret,
110 rpn::Token::Type resolve_ver);
111 bool emit_concat(const List_info *arguments, YYLTYPE *llocp, Exp_info *ret);
112 bool emit_regexp(const List_info *arguments, YYLTYPE *llocp, Exp_info *ret);
113 bool emit_reference(std::string_view name, YYLTYPE *llocp, Exp_info *ret);
114 bool emit_network(Exp_info *ret);
115
116 bool check_role_types(const Exp_info &left, const Exp_info &right,
117 YYLTYPE *llocp);
118
119 bool type_error(YYLTYPE *llocp, const std::string &msg,
120 rpn::Token::Type expected, rpn::Token::Type got);
121
122 void trace(const std::string &s) {
123 if (tracer_) tracer_(s);
124 }
125
126 void is_extended_session_info(std::string_view name);
127
128 void uses_session_rand(std::string_view name);
129
130 // Parser state
131 std::vector<rpn::Token> rpn_;
132 std::string error_;
136
137 // Scanner state
138 const std::string *buf_{nullptr};
139 std::string::size_type pos_{0};
140
141 // Function for trace output
142 std::function<void(const std::string &)> tracer_;
143
144 // friend yy::Parser::symbol_type yylex(Rules_parser *rp);
146 friend int ::yylex(union YYSTYPE *lvalp, YYLTYPE *llocp,
149 const char *msg);
150};
151} // namespace routing_guidelines
152#endif // ROUTER_SRC_ROUTING_GUIDELINES_SRC_RULES_PARSER_H_
Conducting the whole scanning and parsing of routing guidelines rules.
Definition: rules_parser.h:72
rpn::Expression parse(const std::string &buf, rpn::Context *context)
Definition: rules_parser.cc:366
bool session_rand_used() const
Definition: rules_parser.h:84
std::vector< rpn::Token > rpn_
Definition: rules_parser.h:131
bool emit_concat(const List_info *arguments, YYLTYPE *llocp, Exp_info *ret)
Definition: rules_parser.cc:644
Rules_parser(const Rules_parser &)=delete
bool emit_resolve(YYLTYPE *llocp, Exp_info *ret, rpn::Token::Type resolve_ver)
Definition: rules_parser.cc:617
bool extended_session_info_used() const
Definition: rules_parser.h:80
bool emit_in_op(const Exp_info &e, List_info *list, YYLTYPE *llocp, Exp_info *ret)
Definition: rules_parser.cc:419
bool type_error(YYLTYPE *llocp, const std::string &msg, rpn::Token::Type expected, rpn::Token::Type got)
Definition: rules_parser.cc:755
void emit_null()
Definition: rules_parser.cc:391
bool emit_like_op(const Exp_info &str, const Exp_info &pattern, YYLTYPE *llocp, Exp_info *ret)
Definition: rules_parser.cc:448
void emit(rpn::Token::Type type, const YYLTYPE &loc)
Definition: rules_parser.cc:386
bool extended_session_info_in_use_
Definition: rules_parser.h:134
Rules_parser(Rules_parser &&)=delete
rpn::Context * context_
Definition: rules_parser.h:133
bool emit_function(const rpn::Function_definition *function, List_info *arguments, YYLTYPE *llocp, Exp_info *ret)
Definition: rules_parser.cc:515
Rules_parser & operator=(Rules_parser &&)=delete
bool emit_regexp(const List_info *arguments, YYLTYPE *llocp, Exp_info *ret)
Definition: rules_parser.cc:658
void trace(const std::string &s)
Definition: rules_parser.h:122
const std::string * buf_
Definition: rules_parser.h:138
void emit_string(std::string_view str, rpn::Token::Type type=rpn::Token::Type::STR)
Definition: rules_parser.cc:401
std::string error_
Definition: rules_parser.h:132
void is_extended_session_info(std::string_view name)
Definition: rules_parser.cc:674
void uses_session_rand(std::string_view name)
Definition: rules_parser.cc:681
std::function< void(const std::string &)> tracer_
Definition: rules_parser.h:142
bool check_role_types(const Exp_info &left, const Exp_info &right, YYLTYPE *llocp)
Definition: rules_parser.cc:704
void emit_log_operation(rpn::Token::Type type, double arg_split, const YYLTYPE &loc)
Definition: rules_parser.cc:406
static std::vector< std::string > get_keyword_names()
Definition: rules_parser.cc:768
std::string::size_type pos_
Definition: rules_parser.h:139
void emit_num(double val, rpn::Token::Type type=rpn::Token::Type::NUM)
Definition: rules_parser.cc:396
bool emit_reference(std::string_view name, YYLTYPE *llocp, Exp_info *ret)
Definition: rules_parser.cc:685
bool session_rand_value_used_
Definition: rules_parser.h:135
Rules_parser & operator=(const Rules_parser &)=delete
bool emit_network(Exp_info *ret)
Definition: rules_parser.cc:610
static std::vector< std::string > get_function_names()
Definition: rules_parser.cc:776
Rules_parser(std::function< void(const std::string &)> tracer=nullptr)
Definition: rules_parser.h:74
Type
Definition: rpn.h:51
std::string str(const mysqlrouter::ConfigGenerator::Options::Endpoint &ep)
Definition: config_generator.cc:1117
Definition: buf0block_hint.cc:30
Definition: routing_guidelines_datatypes.h:30
bool is_member_role(const std::string &s)
Definition: rules_parser.cc:43
const std::array< std::string_view, 4 > k_member_roles
Definition: rules_parser.h:38
const std::array< std::string_view, 2 > k_routing_strategies
Definition: rules_parser.h:44
const std::array< std::string_view, 3 > k_cluster_roles
Definition: rules_parser.h:41
bool is_cluster_role(const std::string &s)
Definition: rules_parser.cc:47
constexpr char kUndefinedRole[]
Keyword meaning that the member/cluster role is undefined.
Definition: routing_guidelines.h:54
std::vector< Exp_info > List_info
Definition: rules_parser.h:56
std::list< T, ut::allocator< T > > list
Specialization of list which uses ut_allocator.
Definition: ut0new.h:2880
required string type
Definition: replication_group_member_actions.proto:34
int yyparse(routing_guidelines::Rules_parser *rp)
int yylex(union YYSTYPE *lvalp, YYLTYPE *llocp, routing_guidelines::Rules_parser *rp)
Definition: rules_parser.cc:232
void yyerror(YYLTYPE *llocp, routing_guidelines::Rules_parser *rp, const char *msg)
Definition: rules_parser.cc:353
Definition: rules_parser.h:51
rpn::Token::Type type
Definition: rules_parser.h:53
int toks
Definition: rules_parser.h:52
Definition: fts0pars.cc:155