MySQL 9.3.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, 2025, 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 designed to work 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 either included with
14 * the program or referenced in the documentation.
15 *
16 * This program is distributed in the hope that it will be useful, but
17 * WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
19 * the GNU General Public License, version 2.0, for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24 */
25
26#ifndef ROUTER_SRC_ROUTING_GUIDELINES_SRC_RULES_PARSER_H_
27#define ROUTER_SRC_ROUTING_GUIDELINES_SRC_RULES_PARSER_H_
28
29#include <array>
30#include <functional>
31#include <string>
32#include <string_view>
33#include <vector>
34
35#include "rpn.h"
36
37namespace routing_guidelines {
38class Rules_parser;
39
40const std::array<std::string_view, 4> k_member_roles{
41 kUndefinedRole, "PRIMARY", "SECONDARY", "READ_REPLICA"};
42
43const std::array<std::string_view, 3> k_cluster_roles{kUndefinedRole, "PRIMARY",
44 "REPLICA"};
45
46const std::array<std::string_view, 2> k_routing_strategies{"round-robin",
47 "first-available"};
48
49bool is_member_role(const std::string &s);
50
51bool is_cluster_role(const std::string &s);
52
53struct Exp_info {
54 int toks;
56};
57
58using List_info = std::vector<Exp_info>;
59
60} // namespace routing_guidelines
61
62union YYSTYPE;
63struct YYLTYPE;
64
66int yylex(union YYSTYPE *lvalp, YYLTYPE *llocp,
68void yyerror(YYLTYPE *llocp, routing_guidelines::Rules_parser *rp,
69 const char *msg);
70
71namespace routing_guidelines {
72
73/// Conducting the whole scanning and parsing of routing guidelines rules
74class Rules_parser final {
75 public:
76 explicit Rules_parser(
77 std::function<void(const std::string &)> tracer = nullptr)
78 : tracer_(tracer) {}
79
80 rpn::Expression parse(std::string buf, rpn::Context *context);
81
84 }
85
87
88 static std::vector<std::string> get_keyword_names();
89 static std::vector<std::string> get_function_names();
90
91 private:
92 Rules_parser(const Rules_parser &) = delete;
96
97 // RPN creation
98 void emit(rpn::Token::Type type, const YYLTYPE &loc);
99 void emit_null();
101 void emit_string(std::string_view str,
103 void emit_log_operation(rpn::Token::Type type, double arg_split,
104 const YYLTYPE &loc);
105 bool emit_in_op(const Exp_info &e, List_info *list, YYLTYPE *llocp,
106 Exp_info *ret);
107 bool emit_like_op(const Exp_info &str, const Exp_info &pattern,
108 YYLTYPE *llocp, Exp_info *ret);
109 bool emit_function(const rpn::Function_definition *function,
110 List_info *arguments, YYLTYPE *llocp, Exp_info *ret);
111 bool emit_resolve(YYLTYPE *llocp, Exp_info *ret,
112 rpn::Token::Type resolve_ver);
113 bool emit_concat(const List_info *arguments, YYLTYPE *llocp, Exp_info *ret);
114 bool emit_regexp(const List_info *arguments, YYLTYPE *llocp, Exp_info *ret);
115 bool emit_reference(std::string_view name, YYLTYPE *llocp, Exp_info *ret);
116 bool emit_network(Exp_info *ret);
117
118 bool check_role_types(const Exp_info &left, const Exp_info &right,
119 YYLTYPE *llocp);
120
121 bool type_error(YYLTYPE *llocp, const std::string &msg,
122 rpn::Token::Type expected, rpn::Token::Type got);
123
124 void trace(const std::string &s) {
125 if (tracer_) tracer_(s);
126 }
127
128 void is_extended_session_info(std::string_view name);
129
130 void uses_session_rand(std::string_view name);
131
132 // Parser state
133 std::vector<rpn::Token> rpn_;
134 std::string error_;
138
139 // Scanner state
140 std::string buf_;
141 std::string::size_type pos_{0};
142
143 // Function for trace output
144 std::function<void(const std::string &)> tracer_;
145
146 // friend yy::Parser::symbol_type yylex(Rules_parser *rp);
148 friend int ::yylex(union YYSTYPE *lvalp, YYLTYPE *llocp,
151 const char *msg);
152};
153} // namespace routing_guidelines
154#endif // ROUTER_SRC_ROUTING_GUIDELINES_SRC_RULES_PARSER_H_
Conducting the whole scanning and parsing of routing guidelines rules.
Definition: rules_parser.h:74
bool session_rand_used() const
Definition: rules_parser.h:86
std::vector< rpn::Token > rpn_
Definition: rules_parser.h:133
bool emit_concat(const List_info *arguments, YYLTYPE *llocp, Exp_info *ret)
Definition: rules_parser.cc:687
std::string buf_
Definition: rules_parser.h:140
Rules_parser(const Rules_parser &)=delete
bool emit_resolve(YYLTYPE *llocp, Exp_info *ret, rpn::Token::Type resolve_ver)
Definition: rules_parser.cc:660
bool extended_session_info_used() const
Definition: rules_parser.h:82
bool emit_in_op(const Exp_info &e, List_info *list, YYLTYPE *llocp, Exp_info *ret)
Definition: rules_parser.cc:462
bool type_error(YYLTYPE *llocp, const std::string &msg, rpn::Token::Type expected, rpn::Token::Type got)
Definition: rules_parser.cc:803
void emit_null()
Definition: rules_parser.cc:434
bool emit_like_op(const Exp_info &str, const Exp_info &pattern, YYLTYPE *llocp, Exp_info *ret)
Definition: rules_parser.cc:491
void emit(rpn::Token::Type type, const YYLTYPE &loc)
Definition: rules_parser.cc:429
bool extended_session_info_in_use_
Definition: rules_parser.h:136
Rules_parser(Rules_parser &&)=delete
rpn::Context * context_
Definition: rules_parser.h:135
bool emit_function(const rpn::Function_definition *function, List_info *arguments, YYLTYPE *llocp, Exp_info *ret)
Definition: rules_parser.cc:558
Rules_parser & operator=(Rules_parser &&)=delete
bool emit_regexp(const List_info *arguments, YYLTYPE *llocp, Exp_info *ret)
Definition: rules_parser.cc:701
void trace(const std::string &s)
Definition: rules_parser.h:124
void emit_string(std::string_view str, rpn::Token::Type type=rpn::Token::Type::STR)
Definition: rules_parser.cc:444
std::string error_
Definition: rules_parser.h:134
void is_extended_session_info(std::string_view name)
Definition: rules_parser.cc:717
void uses_session_rand(std::string_view name)
Definition: rules_parser.cc:724
std::function< void(const std::string &)> tracer_
Definition: rules_parser.h:144
bool check_role_types(const Exp_info &left, const Exp_info &right, YYLTYPE *llocp)
Definition: rules_parser.cc:752
void emit_log_operation(rpn::Token::Type type, double arg_split, const YYLTYPE &loc)
Definition: rules_parser.cc:449
static std::vector< std::string > get_keyword_names()
Definition: rules_parser.cc:816
std::string::size_type pos_
Definition: rules_parser.h:141
void emit_num(double val, rpn::Token::Type type=rpn::Token::Type::NUM)
Definition: rules_parser.cc:439
bool emit_reference(std::string_view name, YYLTYPE *llocp, Exp_info *ret)
Definition: rules_parser.cc:728
bool session_rand_value_used_
Definition: rules_parser.h:137
Rules_parser & operator=(const Rules_parser &)=delete
rpn::Expression parse(std::string buf, rpn::Context *context)
Definition: rules_parser.cc:410
bool emit_network(Exp_info *ret)
Definition: rules_parser.cc:653
static std::vector< std::string > get_function_names()
Definition: rules_parser.cc:824
Rules_parser(std::function< void(const std::string &)> tracer=nullptr)
Definition: rules_parser.h:76
Type
Definition: rpn.h:55
std::string str(const mysqlrouter::ConfigGenerator::Options::Endpoint &ep)
Definition: config_generator.cc:1084
Definition: buf0block_hint.cc:30
void right(std::string *to_trim)
Definition: trim.h:41
void left(std::string *to_trim)
Definition: trim.h:35
Definition: routing_guidelines_datatypes.h:31
bool is_member_role(const std::string &s)
Definition: rules_parser.cc:45
const std::array< std::string_view, 4 > k_member_roles
Definition: rules_parser.h:40
const std::array< std::string_view, 2 > k_routing_strategies
Definition: rules_parser.h:46
const std::array< std::string_view, 3 > k_cluster_roles
Definition: rules_parser.h:43
bool is_cluster_role(const std::string &s)
Definition: rules_parser.cc:49
constexpr char kUndefinedRole[]
Keyword meaning that the member/cluster role is undefined.
Definition: routing_guidelines.h:56
std::vector< Exp_info > List_info
Definition: rules_parser.h:58
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:244
void yyerror(YYLTYPE *llocp, routing_guidelines::Rules_parser *rp, const char *msg)
Definition: rules_parser.cc:397
Definition: rules_parser.h:53
rpn::Token::Type type
Definition: rules_parser.h:55
int toks
Definition: rules_parser.h:54
Definition: fts0pars.cc:155