diff options
Diffstat (limited to 'sql/sp_instr.h')
-rw-r--r-- | sql/sp_instr.h | 192 |
1 files changed, 145 insertions, 47 deletions
diff --git a/sql/sp_instr.h b/sql/sp_instr.h index 2eb9d340e67..79d78d7acfd 100644 --- a/sql/sp_instr.h +++ b/sql/sp_instr.h @@ -233,7 +233,24 @@ public: virtual void invalidate() = 0; + /** + Return the query string, which can be passed to the parser. I.e. the + operation should return a valid SQL-statement query string. + + @param[out] sql_query SQL-statement query string. + */ + virtual void get_query(String *sql_query) const; + protected: + /** + @return the expression query string. This string can not be passed directly + to the parser as it is most likely not a valid SQL-statement. + */ + virtual LEX_CSTRING get_expr_query() const + { + return null_clex_str; + } + sp_lex_keeper m_lex_keeper; }; @@ -252,17 +269,13 @@ class sp_instr_stmt : public sp_lex_instr */ bool m_valid; -public: - LEX_STRING m_query; ///< For thd->query - sp_instr_stmt(uint ip, sp_pcontext *ctx, LEX *lex) +public: + sp_instr_stmt(uint ip, sp_pcontext *ctx, LEX *lex, LEX_STRING query) : sp_lex_instr(ip, ctx, lex, true), - m_valid{true} - { - m_query.str= 0; - m_query.length= 0; - } + m_valid(true), m_query(query) + {} int execute(THD *thd, uint *nextp) override; @@ -280,6 +293,11 @@ public: m_valid= false; } + void get_query(String *sql_query) const override + { + sql_query->append(m_query.str, m_query.length); + } + PSI_statement_info* get_psi_info() override { return & psi_info; } static PSI_statement_info psi_info; }; @@ -295,9 +313,10 @@ public: sp_instr_set(uint ip, sp_pcontext *ctx, const Sp_rcontext_handler *rh, uint offset, Item *val, - LEX *lex, bool lex_resp) + LEX *lex, bool lex_resp, LEX_CSTRING expr_str) : sp_lex_instr(ip, ctx, lex, lex_resp), - m_rcontext_handler(rh), m_offset(offset), m_value(val) + m_rcontext_handler(rh), m_offset(offset), m_value(val), + m_expr_str(expr_str) {} int execute(THD *thd, uint *nextp) override; @@ -310,15 +329,22 @@ public: void invalidate() override { m_value= nullptr; } + PSI_statement_info* get_psi_info() override { return & psi_info; } + static PSI_statement_info psi_info; + protected: + LEX_CSTRING get_expr_query() const override + { + return m_expr_str; + } + sp_rcontext *get_rcontext(THD *thd) const; const Sp_rcontext_handler *m_rcontext_handler; uint m_offset; ///< Frame offset Item *m_value; -public: - PSI_statement_info* get_psi_info() override { return & psi_info; } - static PSI_statement_info psi_info; +private: + LEX_CSTRING m_expr_str; }; @@ -340,8 +366,9 @@ public: const Sp_rcontext_handler *rh, uint offset, uint field_offset, Item *val, - LEX *lex, bool lex_resp) - : sp_instr_set(ip, ctx, rh, offset, val, lex, lex_resp), + LEX *lex, bool lex_resp, + LEX_CSTRING value_query) + : sp_instr_set(ip, ctx, rh, offset, val, lex, lex_resp, value_query), m_field_offset(field_offset) {} @@ -381,8 +408,9 @@ public: const Sp_rcontext_handler *rh, uint offset, const LEX_CSTRING &field_name, Item *val, - LEX *lex, bool lex_resp) - : sp_instr_set(ip, ctx, rh, offset, val, lex, lex_resp), + LEX *lex, bool lex_resp, + LEX_CSTRING value_query) + : sp_instr_set(ip, ctx, rh, offset, val, lex, lex_resp, value_query), m_field_name(field_name) {} @@ -405,10 +433,11 @@ public: sp_instr_set_trigger_field(uint ip, sp_pcontext *ctx, Item_trigger_field *trg_fld, - Item *val, LEX *lex) + Item *val, LEX *lex, LEX_CSTRING value_query) : sp_lex_instr(ip, ctx, lex, true), trigger_field(trg_fld), - value(val) + value(val), + m_expr_str(value_query) {} int execute(THD *thd, uint *nextp) override; @@ -427,13 +456,22 @@ public: value= nullptr; } + PSI_statement_info* get_psi_info() override { return & psi_info; } + static PSI_statement_info psi_info; + +protected: + LEX_CSTRING get_expr_query() const override + { + return m_expr_str; + } + private: Item_trigger_field *trigger_field; Item *value; - -public: - PSI_statement_info* get_psi_info() override { return & psi_info; } - static PSI_statement_info psi_info; + /** + SQL clause corresponding to the expression value. + */ + LEX_CSTRING m_expr_str; }; // class sp_instr_trigger_field : public sp_instr @@ -528,16 +566,18 @@ class sp_instr_jump_if_not : public sp_instr_opt_meta, public sp_lex_instr public: - sp_instr_jump_if_not(uint ip, sp_pcontext *ctx, Item *i, LEX *lex) + sp_instr_jump_if_not(uint ip, sp_pcontext *ctx, Item *i, LEX *lex, + LEX_CSTRING expr_query) : sp_instr_opt_meta(0), sp_lex_instr(ip, ctx, lex, true), - m_expr(i) + m_expr(i), m_expr_str(expr_query) {} - sp_instr_jump_if_not(uint ip, sp_pcontext *ctx, Item *i, uint dest, LEX *lex) + sp_instr_jump_if_not(uint ip, sp_pcontext *ctx, Item *i, uint dest, LEX *lex, + LEX_CSTRING expr_query) : sp_instr_opt_meta(dest), sp_lex_instr(ip, ctx, lex, true), - m_expr(i) + m_expr(i), m_expr_str(expr_query) {} int execute(THD *thd, uint *nextp) override; @@ -586,13 +626,21 @@ public: m_expr= nullptr; } -private: - - Item *m_expr; ///< The condition - -public: PSI_statement_info* get_psi_info() override { return & psi_info; } static PSI_statement_info psi_info; + +protected: + LEX_CSTRING get_expr_query() const override + { + return m_expr_str; + } + +private: + Item *m_expr; ///< The condition + /** + SQL clause corresponding to the expression value. + */ + LEX_CSTRING m_expr_str; }; @@ -631,7 +679,8 @@ class sp_instr_freturn : public sp_lex_instr public: sp_instr_freturn(uint ip, sp_pcontext *ctx, - Item *val, const Type_handler *handler, LEX *lex) + Item *val, const Type_handler *handler, LEX *lex, + LEX_CSTRING expr_query) : sp_lex_instr(ip, ctx, lex, true), m_value(val), m_type_handler(handler) {} @@ -656,14 +705,23 @@ public: m_value= nullptr; } + PSI_statement_info* get_psi_info() override { return & psi_info; } + static PSI_statement_info psi_info; + protected: + LEX_CSTRING get_expr_query() const override + { + return m_expr_str; + } Item *m_value; const Type_handler *m_type_handler; -public: - PSI_statement_info* get_psi_info() override { return & psi_info; } - static PSI_statement_info psi_info; +private: + /** + SQL-query corresponding to the RETURN-expression. + */ + LEX_CSTRING m_expr_str; }; @@ -800,15 +858,17 @@ public: /** This is DECLARE CURSOR */ -class sp_instr_cpush : public sp_instr, public sp_cursor +class sp_instr_cpush : public sp_lex_instr, public sp_cursor { sp_instr_cpush(const sp_instr_cpush &); /**< Prevent use of these */ void operator=(sp_instr_cpush &); public: - sp_instr_cpush(uint ip, sp_pcontext *ctx, LEX *lex, uint offset) - : sp_instr(ip, ctx), m_lex_keeper(lex, true), m_cursor(offset) + sp_instr_cpush(uint ip, sp_pcontext *ctx, LEX *lex, uint offset, + LEX_CSTRING cursor_query) + : sp_lex_instr(ip, ctx, lex, true), m_cursor(offset), + m_cursor_query(cursor_query), m_metadata_changed(false) {} int execute(THD *thd, uint *nextp) override; @@ -822,10 +882,39 @@ public: */ void cleanup_stmt(bool /*restore_set_statement_vars*/) override { /* no op */ } + + void get_query(String *sql_query) const override + { + sql_query->append(m_cursor_query.str, m_cursor_query.length); + } + + bool is_invalid() const override + { + return m_metadata_changed; + } + + void invalidate() override + { + m_metadata_changed= true; + } + + sp_lex_keeper *get_lex_keeper() override + { + return &m_lex_keeper; + } private: - sp_lex_keeper m_lex_keeper; uint m_cursor; /**< Frame offset (for debugging) */ + /** + This attribute keeps the cursor SELECT statement. + */ + LEX_CSTRING m_cursor_query; + + /** + Flag if the statement's metadata has been changed in result of running DDL + on depending database objects used in the statement. + */ + bool m_metadata_changed; public: PSI_statement_info* get_psi_info() override { return & psi_info; } @@ -1091,9 +1180,10 @@ class sp_instr_set_case_expr : public sp_instr_opt_meta, public sp_lex_instr public: sp_instr_set_case_expr(uint ip, sp_pcontext *ctx, uint case_expr_id, - Item *case_expr, LEX *lex) + Item *case_expr, LEX *lex, LEX_CSTRING case_expr_query) : sp_instr_opt_meta(0), sp_lex_instr(ip, ctx, lex, true), - m_case_expr_id(case_expr_id), m_case_expr(case_expr) + m_case_expr_id(case_expr_id), m_case_expr(case_expr), + m_expr_str(case_expr_query) {} int execute(THD *thd, uint *nextp) override; @@ -1127,14 +1217,22 @@ public: m_case_expr= nullptr; } -private: + PSI_statement_info* get_psi_info() override { return & psi_info; } + static PSI_statement_info psi_info; + +protected: + LEX_CSTRING get_expr_query() const override + { + return m_expr_str; + } +private: uint m_case_expr_id; Item *m_case_expr; - -public: - PSI_statement_info* get_psi_info() override { return & psi_info; } - static PSI_statement_info psi_info; + /** + SQL clause corresponding to the expression value. + */ + LEX_CSTRING m_expr_str; }; #endif // _SP_HEAD_H_ |