class Optimizer_hint_tokenizer: public Extended_string_tokenizer
{ public:
Optimizer_hint_tokenizer(CHARSET_INFO *cs, const LEX_CSTRING &hint)
:Extended_string_tokenizer(cs, hint)
{ }
// Let's use "enum class" to easier distinguish token IDs vs rule names enumclass TokenID
{ // Special purpose tokens:
tNULL= 0, // returned if the tokenizer failed to detect a token // also used if the parser failed to parse a token
tEMPTY= 1, // returned on empty optional constructs in a grammar like: // rule ::= [ rule1 ] // when rule1 does not present in the input.
tEOF= 2, // returned when the end of input is reached
// One character tokens
tDOT= '.',
tCOMMA= ',',
tAT= '@',
tLPAREN= '(',
tRPAREN= ')', // Other token types
tIDENT= 'i',
tUNSIGNED_NUMBER= 'n',
// Keywords
keyword_BKA = 256, // Value must be greater than any of the above
keyword_BNL,
keyword_NO_BKA,
keyword_NO_BNL,
keyword_NO_ICP,
keyword_NO_MRR,
keyword_NO_RANGE_OPTIMIZATION,
keyword_MRR,
keyword_QB_NAME,
keyword_MAX_EXECUTION_TIME,
keyword_SEMIJOIN,
keyword_NO_SEMIJOIN,
keyword_SUBQUERY,
keyword_MATERIALIZATION,
keyword_FIRSTMATCH,
keyword_LOOSESCAN,
keyword_DUPSWEEDOUT,
keyword_INTOEXISTS,
keyword_JOIN_PREFIX,
keyword_JOIN_SUFFIX,
keyword_JOIN_ORDER,
keyword_JOIN_FIXED_ORDER,
keyword_DERIVED_CONDITION_PUSHDOWN,
keyword_NO_DERIVED_CONDITION_PUSHDOWN,
keyword_MERGE,
keyword_NO_MERGE,
keyword_SPLIT_MATERIALIZED,
keyword_NO_SPLIT_MATERIALIZED,
keyword_INDEX,
keyword_NO_INDEX,
keyword_JOIN_INDEX,
keyword_NO_JOIN_INDEX,
keyword_GROUP_INDEX,
keyword_NO_GROUP_INDEX,
keyword_ORDER_INDEX,
keyword_NO_ORDER_INDEX,
keyword_ROWID_FILTER,
keyword_NO_ROWID_FILTER,
keyword_INDEX_MERGE,
keyword_NO_INDEX_MERGE
};
using LParen= TokenParser<Parser, TokenID::tLPAREN>;
using RParen= TokenParser<Parser, TokenID::tRPAREN>;
// Rules consisting of multiple choices of tokens
// table_level_hint_type ::= BKA | BNL | NO_BKA | NO_BNL class Table_level_hint_type_cond
{ public: staticbool allowed_token_id(TokenID id)
{ return id == TokenID::keyword_BKA ||
id == TokenID::keyword_BNL ||
id == TokenID::keyword_NO_BKA ||
id == TokenID::keyword_NO_BNL ||
id == TokenID::keyword_DERIVED_CONDITION_PUSHDOWN ||
id == TokenID::keyword_NO_DERIVED_CONDITION_PUSHDOWN ||
id == TokenID::keyword_MERGE ||
id == TokenID::keyword_NO_MERGE ||
id == TokenID::keyword_SPLIT_MATERIALIZED ||
id == TokenID::keyword_NO_SPLIT_MATERIALIZED;
}
}; class Table_level_hint_type: public TokenChoice<Parser,
Table_level_hint_type_cond>
{ public: using TokenChoice::TokenChoice;
};
/* index_level_hint_type::=MRR|NO_RANGE_OPTIMIZATION|NO_ICP|NO_MRR| INDEX|NO_INDEX|JOIN_INDEX|NO_JOIN_INDEX|ORDER_INDEX| NO_ORDER_INDEX|GROUP_INDEX|NO_GROUP_INDEX
*/ class Index_level_hint_type_cond
{ public: staticbool allowed_token_id(TokenID id)
{ return id == TokenID::keyword_MRR ||
id == TokenID::keyword_NO_RANGE_OPTIMIZATION ||
id == TokenID::keyword_NO_ICP ||
id == TokenID::keyword_NO_MRR ||
id == TokenID::keyword_INDEX ||
id == TokenID::keyword_NO_INDEX ||
id == TokenID::keyword_JOIN_INDEX ||
id == TokenID::keyword_NO_JOIN_INDEX ||
id == TokenID::keyword_ORDER_INDEX ||
id == TokenID::keyword_NO_ORDER_INDEX ||
id == TokenID::keyword_GROUP_INDEX ||
id == TokenID::keyword_NO_GROUP_INDEX ||
id == TokenID::keyword_ROWID_FILTER ||
id == TokenID::keyword_NO_ROWID_FILTER ||
id == TokenID::keyword_INDEX_MERGE ||
id == TokenID::keyword_NO_INDEX_MERGE;
}
}; class Index_level_hint_type: public TokenChoice<Parser,
Index_level_hint_type_cond>
{ public: using TokenChoice::TokenChoice;
};
// Identifiers of various kinds
// query_block_name ::= identifier class Query_block_name: public Identifier
{ public: using Identifier::Identifier;
};
// table_name ::= identifier class Table_name: public Identifier
{ public: using Identifier::Identifier;
};
// hint_param_index ::= identifier class Hint_param_index: public Identifier
{ public: using Identifier::Identifier;
};
// More complex rules
/* at_query_block_name::=@query_block_name
*/ class At_query_block_name: public AND2<Parser, TokenAT, Query_block_name>
{ public: using AND2::AND2; using AND2::operator=;
};
/* opt_qb_name::=[@query_block_name]
*/ class Opt_qb_name: public OPT<Parser, At_query_block_name>
{ public: using OPT::OPT;
};
/* hint_param_table::=table_nameopt_qb_name
*/ class Hint_param_table: public AND2<Parser, Table_name, Opt_qb_name>
{ public: using AND2::AND2;
};
/* hint_param_table_list::=hint_param_table[{,hint_param_table}...] opt_hint_param_table_list::=[hint_param_table_list]
*/ using Hint_param_table_list_container= List_container<Hint_param_table,
Parser>;
class Opt_hint_param_table_list: public LIST<Parser,
Hint_param_table_list_container,
Hint_param_table,
TokenID::tCOMMA, 0>
{ using LIST::LIST;
};
/* table_name_list::=table_name[{,table_name}...] opt_table_name_list::=[table_name_list]
*/ using Table_name_list_container= List_container<Table_name, Parser>;
class Opt_table_name_list: public LIST<Parser,
Table_name_list_container,
Table_name, TokenID::tCOMMA, 0>
{ public: using LIST::LIST;
};
/* hint_param_index_list::=hint_param_index[{,hint_param_index}...] opt_hint_param_index_list::=[hint_param_index_list]
*/ using Hint_param_index_list_container= List_container<Hint_param_index,
Parser>;
class Opt_hint_param_index_list: public LIST<Parser,
Hint_param_index_list_container,
Hint_param_index,
TokenID::tCOMMA, 0>
{ public: using LIST::LIST;
};
/* hint_param_table_ext::=hint_param_table |@query_block_nametable_name
*/ class At_query_block_name_table_name: public AND2<Parser,
At_query_block_name,
Table_name>
{ public: using AND2::AND2;
};
class Hint_param_table_ext: public OR2C<Parser,
Hint_param_table_ext_container,
Hint_param_table,
At_query_block_name_table_name>
{ public: using OR2C::OR2C;
};
/* at_query_block_name_opt_table_name_list::= @query_block_nameopt_table_name_list
*/ class At_query_block_name_opt_table_name_list: public AND2<
Parser,
At_query_block_name,
Opt_table_name_list>
{ public: using AND2::AND2;
};
/* table_level_hint_body:@query_block_nameopt_table_name_list |opt_hint_param_table_list
*/ class Table_level_hint_body: public OR2<
Parser,
At_query_block_name_opt_table_name_list,
Opt_hint_param_table_list>
{ public: using OR2::OR2;
};
// table_level_hint ::= table_level_hint_type ( table_level_hint_body ) class Table_level_hint: public AND4<Parser,
Table_level_hint_type,
LParen,
Table_level_hint_body,
RParen>
{ public: using AND4::AND4;
bool resolve(Parse_context *pc) const;
};
// index_level_hint_body ::= hint_param_table_ext opt_hint_param_index_list class Index_level_hint_body: public AND2<Parser,
Hint_param_table_ext,
Opt_hint_param_index_list>
{ public: using AND2::AND2;
};
public: // index_level_hint ::= index_level_hint_type ( index_level_hint_body ) class Index_level_hint: public AND4<Parser,
Index_level_hint_type,
LParen,
Index_level_hint_body,
RParen>, public Printable_parser_rule
{ public: using AND4::AND4;
// qb_path_element_view_name ::= identifier class QB_path_element_view_name: public Identifier
{ public: using Identifier::Identifier;
};
// qb_path_element_select_num ::= identifier class QB_path_element_select_num: public Identifier
{ public: using Identifier::Identifier;
};
// at_qb_path_element_select_num ::= @ qb_path_element_select_num class At_QB_path_element_select_num: public AND2<Parser, TokenAT, QB_path_element_select_num>
{ public: using AND2::AND2; using AND2::operator=;
};
// just a clone of At_QB_path_element_select_num to avoid inheritance issues class At_QB_path_element_select_num2: public AND2<Parser, TokenAT, QB_path_element_select_num>
{ public: using AND2::AND2; using AND2::operator=;
};
class Opt_at_QB_path_element_select_num: public OPT<Parser, At_QB_path_element_select_num2>
{ public: using OPT::OPT;
};
/* qb_path_element_view_sel::=qb_path_element_view_name [@qb_path_element_select_num]
*/ class QB_path_element_view_sel: public AND2<Parser, QB_path_element_view_name,
Opt_at_QB_path_element_select_num>
{ public: using AND2::AND2;
};
// qb_path_element ::= @ qb_path_element_select_num | qb_path_element_view_sel class QB_path_element: public OR2<Parser, At_QB_path_element_select_num,
QB_path_element_view_sel>
{ public: using OR2::OR2;
};
// Container for query block path elements class Query_block_path_list: public List_container<QB_path_element, Parser>
{ public: static Query_block_path_list empty(const Parser &)
{ return Query_block_path_list();
}
};
/* query_block_path::=query_block_path_element [{,query_block_path_element}...]
*/ class Query_block_path: public LIST<Parser,
Query_block_path_list,
QB_path_element,
TokenID::tDOT, 0>
{ using LIST::LIST;
};
// opt_query_block_path ::= [, query_block_path] class Opt_query_block_path: public AND2<Parser,
TokenCOMMA,
Query_block_path>::Opt
{ public: using Opt::Opt;
};
// qb_name_with_opt_path ::= query_block_name [, query_block_path] class QB_name_with_opt_path: public AND2<Parser,
Query_block_name,
Opt_query_block_path>
{ public: using AND2::AND2;
};
// qb_name_hint ::= QB_NAME ( qb_name_with_opt_path ) class Qb_name_hint: public AND4<Parser,
Keyword_QB_NAME,
LParen,
QB_name_with_opt_path,
RParen>, public Printable_parser_rule
{ public: using AND4::AND4;
private: // semijoin_hint_type ::= SEMIJOIN | NO_SEMIJOIN class Semijoin_hint_type_cond
{ public: staticbool allowed_token_id(TokenID id)
{ return id == TokenID::keyword_SEMIJOIN ||
id == TokenID::keyword_NO_SEMIJOIN;
}
}; class Semijoin_hint_type: public TokenChoice<Parser,
Semijoin_hint_type_cond>
{ public: using TokenChoice::TokenChoice;
};
// semijoin_strategy ::= MATERIALIZATION | FIRSTMATCH | LOOSESCAN | DUPSWEEDOUT class Semijoin_strategy_cond
{ public: staticbool allowed_token_id(TokenID id)
{ return id == TokenID::keyword_MATERIALIZATION ||
id == TokenID::keyword_FIRSTMATCH ||
id == TokenID::keyword_LOOSESCAN ||
id == TokenID::keyword_DUPSWEEDOUT;
}
};
class Semijoin_strategy: public TokenChoice<Parser, Semijoin_strategy_cond>
{ public: using TokenChoice::TokenChoice;
};
/* strategy_list::=strategy_name[{,strategy_name}...] opt_strategy_list::=[strategy_list]
*/ using Semijoin_strategy_list_container= List_container<Semijoin_strategy,
Parser>; class Opt_sj_strategy_list: public LIST<Parser,
Semijoin_strategy_list_container,
Semijoin_strategy, TokenID::tCOMMA, 0>
{ public: using LIST::LIST;
};
class Hint_param_opt_sj_strategy_list: public LIST<Parser,
Semijoin_strategy_list_container,
Semijoin_strategy, TokenID::tCOMMA, 0>
{ public: using LIST::LIST;
};
/* at_query_block_name_opt_strategies_list::= @query_block_nameopt_strategies_list
*/ class At_query_block_name_opt_strategy_list: public AND2<
Parser,
At_query_block_name,
Opt_sj_strategy_list>
{ public: using AND2::AND2;
};
/* semijoin_hint_body:@query_block_nameopt_sj_strategy_list |opt_sj_strategy_list
*/ class Semijoin_hint_body: public OR2<Parser,
At_query_block_name_opt_strategy_list,
Hint_param_opt_sj_strategy_list>
{ public: using OR2::OR2;
};
public: /* semijoin_hint::=semijoin_hint_type(semijoin_hint_body)
*/ class Semijoin_hint: public AND4<Parser,
Semijoin_hint_type,
LParen,
Semijoin_hint_body,
RParen>, public Printable_parser_rule
{ public: using AND4::AND4;
private: // subquery_strategy ::= MATERIALIZATION | INTOEXISTS class Subquery_strategy_cond
{ public: staticbool allowed_token_id(TokenID id)
{ return id == TokenID::keyword_MATERIALIZATION ||
id == TokenID::keyword_INTOEXISTS;
}
};
class Subquery_strategy: public TokenChoice<Parser, Subquery_strategy_cond>
{ public: using TokenChoice::TokenChoice;
};
class Hint_param_subquery_strategy: public TokenChoice<Parser,
Subquery_strategy_cond>
{ public: using TokenChoice::TokenChoice;
};
/* at_query_block_name_subquery_strategy::= @query_block_namesubquery_strategy
*/ class At_query_block_name_subquery_strategy: public AND2<
Parser,
At_query_block_name,
Subquery_strategy>
{ public: using AND2::AND2;
};
/* subquery_hint_body:@query_block_namesubquery_strategy |subquery_strategy
*/ class Subquery_hint_body: public OR2<Parser,
At_query_block_name_subquery_strategy,
Hint_param_subquery_strategy>
{ public: using OR2::OR2;
};
public: // subquery_hint ::= SUBQUERY( subquery_hint_body ) class Subquery_hint: public AND4<Parser,
Keyword_SUBQUERY,
LParen,
Subquery_hint_body,
RParen>, public Printable_parser_rule
{ public: using AND4::AND4;
// // Structures required for join order hints // /* join_order_hint_type::=JOIN_FIXED_ORDER |JOIN_ORDER |JOIN_PREFIX |JOIN_SUFFIX
*/ class Join_order_hint_type_cond
{ public: staticbool allowed_token_id(TokenID id)
{ return id == TokenID::keyword_JOIN_FIXED_ORDER ||
id == TokenID::keyword_JOIN_ORDER ||
id == TokenID::keyword_JOIN_PREFIX ||
id == TokenID::keyword_JOIN_SUFFIX;
}
};
// table_name_ext ::= table_name opt_qb_name class Table_name_ext: public AND2<Parser, Table_name, Opt_qb_name>
{ public: using AND2::AND2;
};
using Table_name_ext_container= List_container<Table_name_ext,
Parser>;
/* table_name_ext_list::=table_name_ext[{,table_name_ext}...]
*/ class Table_name_ext_list: public LIST<Parser,
Table_name_ext_container,
Table_name_ext,
TokenID::tCOMMA, 0>
{ using LIST::LIST;
};
/* at_query_block_name_table_name_ext_list::=@query_block_nametable_name_ext_list
*/ class At_query_block_name_table_name_ext_list: public AND2<
Parser,
At_query_block_name,
Table_name_ext_list>
{ public: using AND2::AND2;
};
class Table_level_hint_body_extended_container
{ public:
At_query_block_name m_qb_name;
Table_name_ext_list m_tables;
class Table_level_hint_body_extended: public OR2C<
Parser,
Table_level_hint_body_extended_container,
At_query_block_name_table_name_ext_list,
Table_name_ext_list>
{ public: using OR2C::OR2C;
};
class Join_order_hint_type: public TokenChoice<Parser,
Join_order_hint_type_cond>
{ public: using TokenChoice::TokenChoice;
};
/* Structrepresentingtablenameslistedinoptimizerhintsbodies. Theymayoptionallyincludequeryblocknames,forexample: t1,t2@qb1,t3,t4@qb5
*/ struct Table_name_and_Qb: public Sql_alloc
{
Lex_ident_sys table_name;
Lex_ident_sys qb_name; // may be empty
/* join_order_hint::=join_order_hint_type(table_level_hint_body)
*/ class Join_order_hint: public AND4<Parser,
Join_order_hint_type,
LParen,
Table_level_hint_body_extended,
RParen>, public Printable_parser_rule
{ public: using AND4::AND4;
/* Tablenames(optionallyaugmentedwithqueryblocknames)listedin thehintbody.
*/
List<Table_name_and_Qb> table_names;
}; // // End of structures required for join order hints //
/* hint::=index_level_hint |table_level_hint |qb_name_hint |max_execution_time_hint |semijoin_hint |subquery_hint |join_order_hint
*/ class Hint: public OR7<Parser,
Index_level_hint,
Table_level_hint,
Qb_name_hint,
Max_execution_time_hint,
Semijoin_hint,
Subquery_hint,
Join_order_hint>
{ public: using OR7::OR7;
};
private: // hint_list ::= hint [ hint... ] using Hint_list_container= List_container<Hint, Parser>;
class Hint_list: public LIST<Parser, Hint_list_container,
Hint, TokenID::tNULL/*not separated list*/, 1>
{ public: using LIST::LIST;
bool resolve(Parse_context *pc) const;
};
public: /* Themainrule: hints::=hint_listEOF
*/ class Hints: public AND2<Parser, Hint_list, TokenEOF>
{ public: using AND2::AND2;
};
};
/* Thesewrapperclassisneededtouseaforwarddeclarationsinsql_lex.h insteadofincludingtheentireopt_hints_parser.h. (forwarddeclarationsofqualifiednestedclassesarenotpossibleinC++)
*/ class Optimizer_hint_parser_output: public Optimizer_hint_parser::Hints
{ public: using Hints::Hints;
};
#endif// OPT_HINTS_PARSER
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.26 Sekunden
(vorverarbeitet am 2026-10-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.