summaryrefslogtreecommitdiff
path: root/sql/sp_head.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/sp_head.cc')
-rw-r--r--sql/sp_head.cc33
1 files changed, 29 insertions, 4 deletions
diff --git a/sql/sp_head.cc b/sql/sp_head.cc
index 6ba72215e39..bc6251903c2 100644
--- a/sql/sp_head.cc
+++ b/sql/sp_head.cc
@@ -846,12 +846,36 @@ sp_head::backpatch(sp_label_t *lab)
List_iterator_fast<bp_t> li(m_backpatch);
while ((bp= li++))
- if (bp->lab == lab)
+ {
+ if (bp->lab == lab ||
+ (bp->lab->type == SP_LAB_REF &&
+ my_strcasecmp(system_charset_info, bp->lab->name, lab->name) == 0))
{
- sp_instr_jump *i= static_cast<sp_instr_jump *>(bp->instr);
+ sp_scope_t sdiff;
- i->set_destination(dest);
+ if (bp->lab->type == SP_LAB_REF)
+ bp->lab= lab;
+ m_pcont->diff_scopes(0, &sdiff);
+ bp->instr->backpatch(dest, sdiff.hndlrs, sdiff.curs);
}
+ }
+}
+
+int
+sp_head::check_backpatch(THD *thd)
+{
+ bp_t *bp;
+ List_iterator_fast<bp_t> li(m_backpatch);
+
+ while ((bp= li++))
+ {
+ if (bp->lab->type == SP_LAB_REF)
+ {
+ net_printf(thd, ER_SP_LILABEL_MISMATCH, "GOTO", bp->lab->name);
+ return -1;
+ }
+ }
+ return 0;
}
void
@@ -1199,8 +1223,9 @@ sp_instr_jump::print(String *str)
uint
sp_instr_jump::opt_mark(sp_head *sp)
{
- marked= 1;
m_dest= opt_shortcut_jump(sp);
+ if (m_dest != m_ip+1) /* Jumping to following instruction? */
+ marked= 1;
m_optdest= sp->get_instr(m_dest);
return m_dest;
}