YoushouldhavereceivedacopyoftheGNUGeneralPublicLicense alongwiththisprogram;ifnot,writetotheFreeSoftware
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
/// This class represents a stored program variable or a parameter /// (also referenced as 'SP-variable').
class sp_variable : public Sql_alloc
{ public: enum enum_mode
{
MODE_IN,
MODE_OUT,
MODE_INOUT
};
/// Name of the SP-variable.
Lex_ident_column name;
/// Mode of the SP-variable.
enum_mode mode;
/// The index to the variable's value in the runtime frame. /// /// It is calculated during parsing and used when creating sp_instr_set /// instructions and Item_splocal items. I.e. values are set/referred by /// array indexing in runtime.
uint offset;
/// Default value of the SP-variable (if any).
Item *default_value;
/// Full type information (field meta-data) of the SP-variable.
Spvar_definition field_def;
/// Field-type of the SP-variable. const Type_handler *type_handler() const
{ return field_def.type_handler(); }
/// This class represents an SQL/PSM label. Can refer to the identifier /// used with the "label_name:" construct which may precede some SQL/PSM /// statements, or to an implicit implementation-dependent identifier which /// the parser inserts before a high-level flow control statement such as /// IF/WHILE/REPEAT/LOOP, when such statement is rewritten into a /// combination of low-level jump/jump_if instructions and labels.
class sp_label : public Sql_alloc
{ public: enum enum_type
{ /// Implicit label generated by parser.
IMPLICIT,
/// This class represents condition-value term in DECLARE CONDITION or /// DECLARE HANDLER statements. sp_condition_value has little to do with /// SQL-conditions. /// /// In some sense, this class is a union -- a set of filled attributes /// depends on the sp_condition_value::type value.
class sp_condition_value : public Sql_alloc, public Sql_state_errno
{ bool m_is_user_defined; public: enum enum_type
{
ERROR_CODE,
SQLSTATE,
WARNING,
NOT_FOUND,
EXCEPTION
};
/// Check if two instances of sp_condition_value are equal or not. /// /// @param cv another instance of sp_condition_value to check. /// /// @return true if the instances are equal, false otherwise. bool equals(const sp_condition_value *cv) const;
/// This class represents 'DECLARE HANDLER' statement.
class sp_handler : public Sql_alloc
{ public: /// Enumeration of possible handler types. /// Note: UNDO handlers are not (and have never been) supported. enum enum_type
{ EXIT, CONTINUE
};
/// Handler type.
enum_type type;
/// Conditions caught by this handler.
List<sp_condition_value> condition_values;
/// The class represents parse-time context, which keeps track of declared /// variables/parameters, conditions, handlers, cursors and labels. /// /// sp_pcontext objects are organized in a tree according to the following /// rules: /// - one sp_pcontext object corresponds for each BEGIN..END block; /// - one sp_pcontext object corresponds for each exception handler; /// - one additional sp_pcontext object is created to contain /// Stored Program parameters. /// /// sp_pcontext objects are used both at parse-time and at runtime. /// /// During the parsing stage sp_pcontext objects are used: /// - to look up defined names (e.g. declared variables and visible /// labels); /// - to check for duplicates; /// - for error checking; /// - to calculate offsets to be used at runtime. /// /// During the runtime phase, a tree of sp_pcontext objects is used: /// - for error checking (e.g. to check correct number of parameters); /// - to resolve SQL-handlers.
class sp_pcontext : public Sql_alloc, public sp_type_def_list
{ public: enum enum_scope
{ /// REGULAR_SCOPE designates regular BEGIN ... END blocks.
REGULAR_SCOPE,
/// Calculate and return the number of handlers to pop between the given /// context and this one. /// /// @param ctx the other parsing context. /// @param exclusive specifies if the last scope should be excluded. /// /// @return 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.
uint diff_handlers(const sp_pcontext *ctx, bool exclusive) const;
/// Calculate and return the number of cursors to pop between the given /// context and this one. /// /// @param ctx the other parsing context. /// @param exclusive specifies if the last scope should be excluded. /// /// @return 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 diff_cursors(const sp_pcontext *ctx, bool exclusive) const;
///////////////////////////////////////////////////////////////////////// // SP-variables (parameters and variables). /////////////////////////////////////////////////////////////////////////
/// @return 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.
uint max_var_index() const
{ return m_max_var_index; }
/// @return the offset of the first variable on this context
uint first_variable_offset() const
{ return m_var_offset; }
/// @return the offset of the variable which will be /// declared immediately after this context. /// Such a declaration is possible after a cursor with parameters /// CURSOR cur(c0 INT,c1 INT); /// x1 INT; /// In the above example, the context containing c0 and c1 will return /// the offset of x1.
uint after_last_variable_offset() const
{ return m_var_offset + m_max_var_index; }
/// @return the current number of variables used in the parent contexts /// (from the root), including this context.
uint current_var_count() const
{ return m_var_offset + (uint)m_vars.elements(); }
/// @return the number of variables in this context alone.
uint context_var_count() const
{ return (uint)m_vars.elements(); }
/// return the i-th variable on the current context
sp_variable *get_context_variable(uint i) const
{
DBUG_ASSERT(i < m_vars.elements()); return m_vars.at(i);
}
/// @return the number of variables with default values in this context.
uint default_context_var_count() const;
/* Setdatatypeforthelastnvarscontextvariablesto"def".
*/ void set_type_for_last_context_variables(const Column_definition &def,
uint nvars)
{
DBUG_ASSERT(nvars <= m_vars.elements()); for (uint i= 0 ; i < nvars; i++)
{
uint offset= (uint) nvars - 1 - i;
sp_variable *spvar= get_last_context_variable(offset);
spvar->field_def.set_type(def);
spvar->field_def.field_name= spvar->name;
}
} /// Add SP-variable to the parsing context. /// /// @param thd Thread context. /// @param name Name of the SP-variable. /// /// @return instance of newly added SP-variable.
sp_variable *add_variable(THD *thd, const LEX_CSTRING *name);
/// Retrieve full type information about SP-variables in this parsing /// context and its children. /// /// @param field_def_lst[out] Container to store type information. void retrieve_field_definitions(List<Spvar_definition> *field_def_lst) 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. /// /// @param name Variable name. /// @param current_scope_only A flag if we search only in current scope. /// /// @return instance of found SP-variable, or NULL if not found.
sp_variable *find_variable(const LEX_CSTRING *name, bool current_scope_only) const;
/// Find an SP-variable by name, raise an error if not found
sp_variable *find_variable_or_error(const LEX_CSTRING &name, bool current_scope_only) const
{
DBUG_ASSERT(name.str[name.length] == '\0');
sp_variable *res= find_variable(&name, current_scope_only); if (!res)
my_error(ER_SP_UNDECLARED_VAR, MYF(0), name.str); return res;
}
/// 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.) /// /// @param offset Variable offset in the root parsing context. /// /// @return instance of found SP-variable, or NULL if not found.
sp_variable *find_variable(uint offset) const;
/// Set the current scope boundary (for default values). /// /// @param n The number of variables to skip. void declare_var_boundary(uint n)
{ m_pboundary= n; }
///////////////////////////////////////////////////////////////////////// // CASE expressions. /////////////////////////////////////////////////////////////////////////
int register_case_expr()
{ return m_num_case_exprs++; }
int get_num_case_exprs() const
{ return m_num_case_exprs; }
/// 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). /// /// @param condition_value the handler condition value /// (not SQL-condition!). /// /// @retval true if such SQL-handler exists. /// @retval false otherwise. bool check_duplicate_handler(const sp_condition_value *cond_value) const;
/// Find an SQL handler for the given SQL condition according to the /// SQL-handler resolution rules. This function is used at runtime. /// /// @param value The error code and the SQL state /// @param level The SQL condition level /// /// @return a pointer to the found SQL-handler or NULL.
sp_handler *find_handler(const Sql_condition_identity &identity) const;
private: /// Constructor for a tree node. /// @param prev the parent parsing context /// @param scope scope of this parsing context
sp_pcontext(sp_pcontext *prev, enum_scope scope);
void init(uint var_offset, uint cursor_offset, int num_case_expressions);
/* Prevent use of these */
sp_pcontext(const sp_pcontext &); voidoperator=(sp_pcontext &);
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.elements(). /// /// m_max_var_index of the root parsing context contains number of all /// variables (including arguments) in all enclosed contexts.
uint m_max_var_index;
/// The maximum sub context's framesizes.
uint m_max_cursor_index;
/// Parent context.
sp_pcontext *m_parent;
/// An index of the first SP-variable in this parsing context. The index /// belongs to a runtime table of SP-variables. /// /// Note: /// - m_var_offset is 0 for root parsing context; /// - m_var_offset is different for all nested parsing contexts.
uint m_var_offset;
/// Cursor offset for this context.
uint m_cursor_offset;
/// 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.
uint m_pboundary;
BEGIN <<lab>> FORiINa..10LOOP ... GOTOlab; ... CONTINUElab; ... ENDLOOP; END;
*/ /// List of block labels
List<sp_label> m_labels; /// List of goto labels
List<sp_label> m_goto_labels;
/// Children contexts, used for destruction.
Dynamic_array<sp_pcontext *> m_children;
/// Scope of this parsing context.
enum_scope m_scope;
/// FOR LOOP characteristics
Lex_for_loop m_for_loop;
}; // class sp_pcontext : public Sql_alloc
#endif/* _SP_PCONTEXT_H_ */
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.13 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.