MySQL 8.4.2
Source Code Documentation
|
The class represents parse-time context, which keeps track of declared variables/parameters, conditions, handlers, cursors and labels. More...
#include <sp_pcontext.h>
Public Types | |
enum | enum_scope { REGULAR_SCOPE , HANDLER_SCOPE } |
Public Member Functions | |
sp_pcontext (THD *thd) | |
~sp_pcontext () | |
sp_pcontext * | push_context (THD *thd, enum_scope scope) |
Create and push a new context in the tree. More... | |
sp_pcontext * | pop_context () |
Pop a node from the parsing context tree. More... | |
sp_pcontext * | parent_context () const |
int | get_level () const |
size_t | diff_handlers (const sp_pcontext *ctx, bool exclusive) const |
Calculate and return the number of handlers to pop between the given context and this one. More... | |
size_t | diff_cursors (const sp_pcontext *ctx, bool exclusive) const |
Calculate and return the number of cursors to pop between the given context and this one. More... | |
uint | max_var_index () const |
uint | current_var_count () const |
uint | context_var_count () const |
uint | var_context2runtime (uint i) const |
sp_variable * | add_variable (THD *thd, LEX_STRING name, enum enum_field_types type, sp_variable::enum_mode mode) |
Add SP-variable to the parsing context. More... | |
void | retrieve_field_definitions (List< Create_field > *field_def_lst) const |
Retrieve full type information about SP-variables in this parsing context and its children. More... | |
sp_variable * | find_variable (const char *name, size_t name_len, bool current_scope_only) const |
Find SP-variable by name. More... | |
sp_variable * | find_variable (uint offset) const |
Find SP-variable by the offset in the root parsing context. More... | |
void | declare_var_boundary (uint n) |
Set the current scope boundary (for default values). More... | |
int | get_num_case_exprs () const |
int | push_case_expr_id () |
void | pop_case_expr_id () |
int | get_current_case_expr_id () const |
sp_label * | push_label (THD *thd, LEX_CSTRING name, uint ip) |
sp_label * | find_label (LEX_CSTRING name) |
sp_label * | last_label () |
sp_label * | pop_label () |
bool | add_condition (THD *thd, LEX_STRING name, sp_condition_value *value) |
sp_condition_value * | find_condition (LEX_STRING name, bool current_scope_only) const |
See comment for find_variable() above. More... | |
sp_handler * | add_handler (THD *thd, sp_handler::enum_type type) |
bool | check_duplicate_handler (const sp_condition_value *cond_value) const |
This is an auxiliary parsing-time function to check if an SQL-handler exists in the current parsing context (current scope) for the given SQL-condition. More... | |
sp_handler * | find_handler (const char *sql_state, uint sql_errno, Sql_condition::enum_severity_level severity) const |
Find an SQL handler for the given SQL condition according to the SQL-handler resolution rules. More... | |
bool | add_cursor (LEX_STRING name) |
bool | find_cursor (LEX_STRING name, uint *poff, bool current_scope_only) const |
See comment for find_variable() above. More... | |
const LEX_STRING * | find_cursor (uint offset) const |
Find cursor by offset (for debugging only). More... | |
uint | max_cursor_index () const |
uint | current_cursor_count () const |
Private Member Functions | |
sp_pcontext (THD *thd, sp_pcontext *prev, enum_scope scope) | |
Constructor for a tree node. More... | |
void | init (uint var_offset, uint cursor_offset, int num_case_expressions) |
sp_pcontext (const sp_pcontext &) | |
void | operator= (sp_pcontext &) |
Private Attributes | |
int | m_level |
Level of the corresponding BEGIN..END block (0 means the topmost block). More... | |
uint | m_max_var_index |
m_max_var_index – number of variables (including all types of arguments) in this context including all children contexts. More... | |
uint | m_max_cursor_index |
The maximum sub context's framesizes. More... | |
sp_pcontext * | m_parent |
Parent context. More... | |
uint | m_var_offset |
An index of the first SP-variable in this parsing context. More... | |
uint | m_cursor_offset |
Cursor offset for this context. More... | |
uint | m_pboundary |
Boundary for finding variables in this context. More... | |
int | m_num_case_exprs |
Mem_root_array< sp_variable * > | m_vars |
SP parameters/variables. More... | |
Mem_root_array< int > | m_case_expr_ids |
Stack of CASE expression ids. More... | |
Mem_root_array< sp_condition * > | m_conditions |
Stack of SQL-conditions. More... | |
Mem_root_array< LEX_STRING > | m_cursors |
Stack of cursors. More... | |
Mem_root_array< sp_handler * > | m_handlers |
Stack of SQL-handlers. More... | |
List< sp_label > | m_labels |
List of labels. More... | |
Mem_root_array< sp_pcontext * > | m_children |
Children contexts, used for destruction. More... | |
enum_scope | m_scope |
Scope of this parsing context. More... | |
The class represents parse-time context, which keeps track of declared variables/parameters, conditions, handlers, cursors and labels.
sp_context objects are organized in a tree according to the following rules:
sp_pcontext objects are used both at parse-time and at runtime.
During the parsing stage sp_pcontext objects are used:
During the runtime phase, a tree of sp_pcontext objects is used:
sp_pcontext::sp_pcontext | ( | THD * | thd | ) |
sp_pcontext::~sp_pcontext | ( | ) |
|
private |
Constructor for a tree node.
thd | thread context |
prev | the parent parsing context |
scope | scope of this parsing context |
|
private |
bool sp_pcontext::add_condition | ( | THD * | thd, |
LEX_STRING | name, | ||
sp_condition_value * | value | ||
) |
bool sp_pcontext::add_cursor | ( | LEX_STRING | name | ) |
sp_handler * sp_pcontext::add_handler | ( | THD * | thd, |
sp_handler::enum_type | type | ||
) |
sp_variable * sp_pcontext::add_variable | ( | THD * | thd, |
LEX_STRING | name, | ||
enum enum_field_types | type, | ||
sp_variable::enum_mode | mode | ||
) |
Add SP-variable to the parsing context.
thd | Thread context. |
name | Name of the SP-variable. |
type | Type of the SP-variable. |
mode | Mode of the SP-variable. |
bool sp_pcontext::check_duplicate_handler | ( | const sp_condition_value * | cond_value | ) | const |
This is an auxiliary parsing-time function to check if an SQL-handler exists in the current parsing context (current scope) for the given SQL-condition.
This function is used to check for duplicates during the parsing phase.
This function can not be used during the runtime phase to check SQL-handler existence because it searches for the SQL-handler in the current scope only (during runtime, current and parent scopes should be checked according to the SQL-handler resolution rules).
cond_value | the handler condition value (not SQL-condition!). |
true | if such SQL-handler exists. |
false | otherwise. |
|
inline |
|
inline |
|
inline |
|
inline |
Set the current scope boundary (for default values).
n | The number of variables to skip. |
size_t sp_pcontext::diff_cursors | ( | const sp_pcontext * | ctx, |
bool | exclusive | ||
) | const |
Calculate and return the number of cursors to pop between the given context and this one.
ctx | the other parsing context. |
exclusive | specifies if the last scope should be excluded. |
size_t sp_pcontext::diff_handlers | ( | const sp_pcontext * | ctx, |
bool | exclusive | ||
) | const |
Calculate and return the number of handlers to pop between the given context and this one.
ctx | the other parsing context. |
exclusive | specifies if the last scope should be excluded. |
sp_condition_value * sp_pcontext::find_condition | ( | LEX_STRING | name, |
bool | current_scope_only | ||
) | const |
See comment for find_variable() above.
bool sp_pcontext::find_cursor | ( | LEX_STRING | name, |
uint * | poff, | ||
bool | current_scope_only | ||
) | const |
See comment for find_variable() above.
const LEX_STRING * sp_pcontext::find_cursor | ( | uint | offset | ) | const |
Find cursor by offset (for debugging only).
sp_handler * sp_pcontext::find_handler | ( | const char * | sql_state, |
uint | sql_errno, | ||
Sql_condition::enum_severity_level | severity | ||
) | const |
Find an SQL handler for the given SQL condition according to the SQL-handler resolution rules.
This function is used at runtime.
sql_state | The SQL condition state |
sql_errno | The error code |
severity | The SQL condition severity level |
sp_label * sp_pcontext::find_label | ( | LEX_CSTRING | name | ) |
sp_variable * sp_pcontext::find_variable | ( | const char * | name, |
size_t | name_len, | ||
bool | current_scope_only | ||
) | const |
Find SP-variable by name.
The function does a linear search (from newer to older variables, in case we have shadowed names).
The function is called only at parsing time.
name | Variable name. |
name_len | Variable name length. |
current_scope_only | A flag if we search only in current scope. |
sp_variable * sp_pcontext::find_variable | ( | uint | offset | ) | const |
Find SP-variable by the offset in the root parsing context.
The function is used for two things:
offset | Variable offset in the root parsing context. |
|
inline |
|
inline |
|
inline |
|
private |
|
inline |
|
inline |
|
inline |
|
private |
|
inline |
|
inline |
sp_pcontext * sp_pcontext::pop_context | ( | ) |
Pop a node from the parsing context tree.
|
inline |
|
inline |
sp_pcontext * sp_pcontext::push_context | ( | THD * | thd, |
sp_pcontext::enum_scope | scope | ||
) |
Create and push a new context in the tree.
thd | thread context. |
scope | scope of the new parsing context. |
sp_label * sp_pcontext::push_label | ( | THD * | thd, |
LEX_CSTRING | name, | ||
uint | ip | ||
) |
void sp_pcontext::retrieve_field_definitions | ( | List< Create_field > * | field_def_lst | ) | const |
Retrieve full type information about SP-variables in this parsing context and its children.
[out] | field_def_lst | Container to store type information. |
|
inline |
|
private |
Stack of CASE expression ids.
|
private |
Children contexts, used for destruction.
|
private |
Stack of SQL-conditions.
|
private |
Cursor offset for this context.
|
private |
Stack of cursors.
|
private |
Stack of SQL-handlers.
|
private |
Level of the corresponding BEGIN..END block (0 means the topmost block).
|
private |
The maximum sub context's framesizes.
|
private |
m_max_var_index – number of variables (including all types of arguments) in this context including all children contexts.
m_max_var_index >= m_vars.size().
m_max_var_index of the root parsing context contains number of all variables (including arguments) in all enclosed contexts.
|
private |
|
private |
Parent context.
|
private |
Boundary for finding variables in this context.
This is the number of variables currently "invisible" to default clauses. This is normally 0, but will be larger during parsing of DECLARE ... DEFAULT, to get the scope right for DEFAULT values.
|
private |
Scope of this parsing context.
|
private |
An index of the first SP-variable in this parsing context.
The index belongs to a runtime table of SP-variables.
Note:
|
private |
SP parameters/variables.