summaryrefslogtreecommitdiff
path: root/sql/sp_instr.h
diff options
context:
space:
mode:
Diffstat (limited to 'sql/sp_instr.h')
-rw-r--r--sql/sp_instr.h192
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_