My Project
Public Types | Public Member Functions
sp_pcontext Class Reference

#include <sp_pcontext.h>

Inheritance diagram for sp_pcontext:
Sql_alloc

List of all members.

Public Types

enum  enum_scope { REGULAR_SCOPE, HANDLER_SCOPE }

Public Member Functions

sp_pcontextpush_context (THD *thd, enum_scope scope)
 Create and push a new context in the tree.
sp_pcontextpop_context ()
sp_pcontextparent_context () const
int get_level () const
uint diff_handlers (const sp_pcontext *ctx, bool exclusive) const
uint diff_cursors (const sp_pcontext *ctx, bool exclusive) const
uint max_var_index () const
uint current_var_count () const
uint context_var_count () const
uint var_context2runtime (uint i) const
sp_variableadd_variable (THD *thd, LEX_STRING name, enum enum_field_types type, sp_variable::enum_mode mode)
void retrieve_field_definitions (List< Create_field > *field_def_lst) const
sp_variablefind_variable (LEX_STRING name, bool current_scope_only) const
sp_variablefind_variable (uint offset) const
void declare_var_boundary (uint n)
int get_num_case_exprs () const
int push_case_expr_id ()
void pop_case_expr_id ()
int get_current_case_expr_id () const
sp_labelpush_label (THD *thd, LEX_STRING name, uint ip)
sp_labelfind_label (LEX_STRING name)
sp_labellast_label ()
sp_labelpop_label ()
bool add_condition (THD *thd, LEX_STRING name, sp_condition_value *value)
sp_condition_valuefind_condition (LEX_STRING name, bool current_scope_only) const
 See comment for find_variable() above.
sp_handleradd_handler (THD *thd, sp_handler::enum_type type)
bool check_duplicate_handler (const sp_condition_value *cond_value) const
sp_handlerfind_handler (const char *sql_state, uint sql_errno, Sql_condition::enum_warning_level level) const
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.
const LEX_STRING * find_cursor (uint offset) const
 Find cursor by offset (for debugging only).
uint max_cursor_index () const
uint current_cursor_count () const

Detailed Description

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:


Member Enumeration Documentation

Enumerator:
REGULAR_SCOPE 

REGULAR_SCOPE designates regular BEGIN ... END blocks.

HANDLER_SCOPE 

HANDLER_SCOPE designates SQL-handler blocks.


Member Function Documentation

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.

Parameters:
thdThread context.
nameName of the SP-variable.
typeType of the SP-variable.
modeMode of the SP-variable.
Returns:
instance of newly added SP-variable.
bool sp_pcontext::check_duplicate_handler ( const sp_condition_value cond_value) const

This is an auxilary 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).

Parameters:
condition_valuethe handler condition value (not SQL-condition!).
Return values:
trueif such SQL-handler exists.
falseotherwise.
uint sp_pcontext::context_var_count ( ) const [inline]
Returns:
the number of variables in this context alone.
uint sp_pcontext::current_var_count ( ) const [inline]
Returns:
the current number of variables used in the parent contexts (from the root), including this context.
void sp_pcontext::declare_var_boundary ( uint  n) [inline]

Set the current scope boundary (for default values).

Parameters:
nThe number of variables to skip.
uint 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.

Parameters:
ctxthe other parsing context.
exclusivespecifies if the last scope should be excluded.
Returns:
the number of cursors to pop between the given context and this one. If 'exclusive' is true, don't count the last scope we are leaving; this is used for LEAVE where we will jump to the cpop instructions.
uint 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.

Parameters:
ctxthe other parsing context.
exclusivespecifies if the last scope should be excluded.
Returns:
the number of handlers to pop between the given context and this one. If 'exclusive' is true, don't count the last scope we are leaving; this is used for LEAVE where we will jump to the hpop instructions.
sp_handler * sp_pcontext::find_handler ( const char *  sql_state,
uint  sql_errno,
Sql_condition::enum_warning_level  level 
) const

Find an SQL handler for the given SQL condition according to the SQL-handler resolution rules. This function is used at runtime.

Parameters:
sql_stateThe SQL condition state
sql_errnoThe error code
levelThe SQL condition level
Returns:
a pointer to the found SQL-handler or NULL.
sp_variable * sp_pcontext::find_variable ( LEX_STRING  name,
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.

Parameters:
nameVariable name.
current_scope_onlyA flag if we search only in current scope.
Returns:
instance of found SP-variable, or NULL if not found.
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:

  • When evaluating parameters at the beginning, and setting out parameters at the end, of invocation. (Top frame only, so no recursion then.)
  • For printing of sp_instr_set. (Debug mode only.)
Parameters:
offsetVariable offset in the root parsing context.
Returns:
instance of found SP-variable, or NULL if not found.
uint sp_pcontext::max_var_index ( ) const [inline]
Returns:
the maximum number of variables used in this and all child contexts. For the root parsing context, this gives us the number of slots needed for variables during the runtime phase.

Pop a node from the parsing context tree.

Returns:
the parent node.

Create and push a new context in the tree.

Parameters:
thdthread context.
scopescope of the new parsing context.
Returns:
the node created.
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.

Parameters:
field_def_lst[out]Container to store type information.
uint sp_pcontext::var_context2runtime ( uint  i) const [inline]
Returns:
map index in this parsing context to runtime offset.

The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines