merging
This commit is contained in:
commit
ddc9a19550
@ -250,7 +250,11 @@ static int d_search(register MI_INFO *info, register MI_KEYDEF *keyinfo,
|
||||
if (info->ft1_to_ft2)
|
||||
{
|
||||
/* we're in ft1->ft2 conversion mode. Saving key data */
|
||||
insert_dynamic(info->ft1_to_ft2, (char*) (lastkey+off));
|
||||
if (insert_dynamic(info->ft1_to_ft2, (char*) (lastkey+off)))
|
||||
{
|
||||
DBUG_PRINT("error",("Out of memory"));
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -550,7 +550,14 @@ int _mi_insert(register MI_INFO *info, register MI_KEYDEF *keyinfo,
|
||||
we cannot easily dispatch an empty page here */
|
||||
b+=blen+ft2len+2;
|
||||
for (a=anc_buff+a_length ; b < a ; b+=ft2len+2)
|
||||
insert_dynamic(info->ft1_to_ft2, (char*) b);
|
||||
{
|
||||
if (insert_dynamic(info->ft1_to_ft2, (char*) b))
|
||||
{
|
||||
mi_print_error(info->s, HA_ERR_OUT_OF_MEM);
|
||||
my_errno= HA_ERR_OUT_OF_MEM;
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
}
|
||||
|
||||
/* fixing the page's length - it contains only one key now */
|
||||
mi_putint(anc_buff,2+blen+ft2len+2,0);
|
||||
|
@ -522,8 +522,7 @@ int Instance_options::add_option(const char* option)
|
||||
switch (selected_options->type) {
|
||||
case SAVE_WHOLE_AND_ADD:
|
||||
*(selected_options->value)= tmp;
|
||||
insert_dynamic(&options_array,(gptr) &tmp);
|
||||
return 0;
|
||||
return insert_dynamic(&options_array,(gptr) &tmp);
|
||||
case SAVE_VALUE:
|
||||
*(selected_options->value)= strchr(tmp, '=') + 1;
|
||||
return 0;
|
||||
|
@ -1053,8 +1053,7 @@ int add_wild_table_rule(DYNAMIC_ARRAY* a, const char* table_spec)
|
||||
e->tbl_name = e->db + (dot - table_spec) + 1;
|
||||
e->key_len = len;
|
||||
memcpy(e->db, table_spec, len);
|
||||
insert_dynamic(a, (gptr)&e);
|
||||
return 0;
|
||||
return insert_dynamic(a, (gptr)&e);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1929,17 +1929,16 @@ sp_head::restore_lex(THD *thd)
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
sp_head::push_backpatch(sp_instr *i, sp_label_t *lab)
|
||||
{
|
||||
bp_t *bp= (bp_t *)sql_alloc(sizeof(bp_t));
|
||||
|
||||
if (bp)
|
||||
{
|
||||
bp->lab= lab;
|
||||
bp->instr= i;
|
||||
(void)m_backpatch.push_front(bp);
|
||||
}
|
||||
if (!bp)
|
||||
return 1;
|
||||
bp->lab= lab;
|
||||
bp->instr= i;
|
||||
return m_backpatch.push_front(bp);
|
||||
}
|
||||
|
||||
void
|
||||
@ -2014,7 +2013,7 @@ sp_head::fill_field_definition(THD *thd, LEX *lex,
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
int
|
||||
sp_head::new_cont_backpatch(sp_instr_opt_meta *i)
|
||||
{
|
||||
m_cont_level+= 1;
|
||||
@ -2022,15 +2021,17 @@ sp_head::new_cont_backpatch(sp_instr_opt_meta *i)
|
||||
{
|
||||
/* Use the cont. destination slot to store the level */
|
||||
i->m_cont_dest= m_cont_level;
|
||||
(void)m_cont_backpatch.push_front(i);
|
||||
if (m_cont_backpatch.push_front(i))
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
sp_head::add_cont_backpatch(sp_instr_opt_meta *i)
|
||||
{
|
||||
i->m_cont_dest= m_cont_level;
|
||||
(void)m_cont_backpatch.push_front(i);
|
||||
return m_cont_backpatch.push_front(i);
|
||||
}
|
||||
|
||||
void
|
||||
@ -2212,7 +2213,7 @@ sp_head::show_create_procedure(THD *thd)
|
||||
instr Instruction
|
||||
*/
|
||||
|
||||
void sp_head::add_instr(sp_instr *instr)
|
||||
int sp_head::add_instr(sp_instr *instr)
|
||||
{
|
||||
instr->free_list= m_thd->free_list;
|
||||
m_thd->free_list= 0;
|
||||
@ -2223,7 +2224,7 @@ void sp_head::add_instr(sp_instr *instr)
|
||||
entire stored procedure, as their life span is equal.
|
||||
*/
|
||||
instr->mem_root= &main_mem_root;
|
||||
insert_dynamic(&m_instr, (gptr)&instr);
|
||||
return insert_dynamic(&m_instr, (gptr)&instr);
|
||||
}
|
||||
|
||||
|
||||
|
@ -226,7 +226,7 @@ public:
|
||||
int
|
||||
show_create_function(THD *thd);
|
||||
|
||||
void
|
||||
int
|
||||
add_instr(sp_instr *instr);
|
||||
|
||||
inline uint
|
||||
@ -254,7 +254,7 @@ public:
|
||||
restore_lex(THD *thd);
|
||||
|
||||
// Put the instruction on the backpatch list, associated with the label.
|
||||
void
|
||||
int
|
||||
push_backpatch(sp_instr *, struct sp_label *);
|
||||
|
||||
// Update all instruction with this label in the backpatch list to
|
||||
@ -263,11 +263,11 @@ public:
|
||||
backpatch(struct sp_label *);
|
||||
|
||||
// Start a new cont. backpatch level. If 'i' is NULL, the level is just incr.
|
||||
void
|
||||
int
|
||||
new_cont_backpatch(sp_instr_opt_meta *i);
|
||||
|
||||
// Add an instruction to the current level
|
||||
void
|
||||
int
|
||||
add_cont_backpatch(sp_instr_opt_meta *i);
|
||||
|
||||
// Backpatch (and pop) the current level to the current position.
|
||||
|
@ -263,7 +263,8 @@ sp_pcontext::push_variable(LEX_STRING *name, enum enum_field_types type,
|
||||
p->mode= mode;
|
||||
p->offset= current_var_count();
|
||||
p->dflt= NULL;
|
||||
insert_dynamic(&m_vars, (gptr)&p);
|
||||
if (insert_dynamic(&m_vars, (gptr)&p))
|
||||
return NULL;
|
||||
|
||||
return p;
|
||||
}
|
||||
@ -308,18 +309,17 @@ sp_pcontext::find_label(char *name)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
sp_pcontext::push_cond(LEX_STRING *name, sp_cond_type_t *val)
|
||||
{
|
||||
sp_cond_t *p= (sp_cond_t *)sql_alloc(sizeof(sp_cond_t));
|
||||
|
||||
if (p)
|
||||
{
|
||||
p->name.str= name->str;
|
||||
p->name.length= name->length;
|
||||
p->val= val;
|
||||
insert_dynamic(&m_conds, (gptr)&p);
|
||||
}
|
||||
if (p == NULL)
|
||||
return 1;
|
||||
p->name.str= name->str;
|
||||
p->name.length= name->length;
|
||||
p->val= val;
|
||||
return insert_dynamic(&m_conds, (gptr)&p);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -382,7 +382,7 @@ sp_pcontext::find_handler(sp_cond_type_t *cond)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
sp_pcontext::push_cursor(LEX_STRING *name)
|
||||
{
|
||||
LEX_STRING n;
|
||||
@ -391,7 +391,7 @@ sp_pcontext::push_cursor(LEX_STRING *name)
|
||||
m_max_cursor_index+= 1;
|
||||
n.str= name->str;
|
||||
n.length= name->length;
|
||||
insert_dynamic(&m_cursors, (gptr)&n);
|
||||
return insert_dynamic(&m_cursors, (gptr)&n);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -323,7 +323,7 @@ public:
|
||||
// Conditions
|
||||
//
|
||||
|
||||
void
|
||||
int
|
||||
push_cond(LEX_STRING *name, sp_cond_type_t *val);
|
||||
|
||||
inline void
|
||||
@ -365,7 +365,7 @@ public:
|
||||
// Cursors
|
||||
//
|
||||
|
||||
void
|
||||
int
|
||||
push_cursor(LEX_STRING *name);
|
||||
|
||||
my_bool
|
||||
|
@ -3371,10 +3371,6 @@ add_key_fields(JOIN *join, KEY_FIELD **key_fields, uint *and_level,
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Add all keys with uses 'field' for some keypart
|
||||
If field->and_level != and_level then only mark key_part as const_part
|
||||
*/
|
||||
|
||||
static uint
|
||||
max_part_bit(key_part_map bits)
|
||||
@ -3384,7 +3380,16 @@ max_part_bit(key_part_map bits)
|
||||
return found;
|
||||
}
|
||||
|
||||
static void
|
||||
/*
|
||||
Add all keys with uses 'field' for some keypart
|
||||
If field->and_level != and_level then only mark key_part as const_part
|
||||
|
||||
RETURN
|
||||
0 - OK
|
||||
1 - Out of memory.
|
||||
*/
|
||||
|
||||
static bool
|
||||
add_key_part(DYNAMIC_ARRAY *keyuse_array,KEY_FIELD *key_field)
|
||||
{
|
||||
Field *field=key_field->field;
|
||||
@ -3414,24 +3419,26 @@ add_key_part(DYNAMIC_ARRAY *keyuse_array,KEY_FIELD *key_field)
|
||||
keyuse.optimize= key_field->optimize & KEY_OPTIMIZE_REF_OR_NULL;
|
||||
keyuse.null_rejecting= key_field->null_rejecting;
|
||||
keyuse.cond_guard= key_field->cond_guard;
|
||||
VOID(insert_dynamic(keyuse_array,(gptr) &keyuse));
|
||||
if (insert_dynamic(keyuse_array,(gptr) &keyuse))
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
#define FT_KEYPART (MAX_REF_PARTS+10)
|
||||
|
||||
static void
|
||||
static bool
|
||||
add_ft_keys(DYNAMIC_ARRAY *keyuse_array,
|
||||
JOIN_TAB *stat,COND *cond,table_map usable_tables)
|
||||
{
|
||||
Item_func_match *cond_func=NULL;
|
||||
|
||||
if (!cond)
|
||||
return;
|
||||
return FALSE;
|
||||
|
||||
if (cond->type() == Item::FUNC_ITEM)
|
||||
{
|
||||
@ -3465,13 +3472,16 @@ add_ft_keys(DYNAMIC_ARRAY *keyuse_array,
|
||||
{
|
||||
Item *item;
|
||||
while ((item=li++))
|
||||
add_ft_keys(keyuse_array,stat,item,usable_tables);
|
||||
{
|
||||
if (add_ft_keys(keyuse_array,stat,item,usable_tables))
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!cond_func || cond_func->key == NO_SUCH_KEY ||
|
||||
!(usable_tables & cond_func->table->map))
|
||||
return;
|
||||
return FALSE;
|
||||
|
||||
KEYUSE keyuse;
|
||||
keyuse.table= cond_func->table;
|
||||
@ -3481,7 +3491,7 @@ add_ft_keys(DYNAMIC_ARRAY *keyuse_array,
|
||||
keyuse.used_tables=cond_func->key_item()->used_tables();
|
||||
keyuse.optimize= 0;
|
||||
keyuse.keypart_map= 0;
|
||||
VOID(insert_dynamic(keyuse_array,(gptr) &keyuse));
|
||||
return insert_dynamic(keyuse_array,(gptr) &keyuse);
|
||||
}
|
||||
|
||||
|
||||
@ -3631,7 +3641,8 @@ update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse,JOIN_TAB *join_tab,
|
||||
sargables);
|
||||
for (; field != end ; field++)
|
||||
{
|
||||
add_key_part(keyuse,field);
|
||||
if (add_key_part(keyuse,field))
|
||||
return TRUE;
|
||||
/* Mark that we can optimize LEFT JOIN */
|
||||
if (field->val->type() == Item::NULL_ITEM &&
|
||||
!field->field->real_maybe_null())
|
||||
@ -3669,11 +3680,15 @@ update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse,JOIN_TAB *join_tab,
|
||||
|
||||
/* fill keyuse with found key parts */
|
||||
for ( ; field != end ; field++)
|
||||
add_key_part(keyuse,field);
|
||||
{
|
||||
if (add_key_part(keyuse,field))
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (select_lex->ftfunc_list->elements)
|
||||
{
|
||||
add_ft_keys(keyuse,join_tab,cond,normal_tables);
|
||||
if (add_ft_keys(keyuse,join_tab,cond,normal_tables))
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -3694,7 +3709,8 @@ update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse,JOIN_TAB *join_tab,
|
||||
(qsort_cmp) sort_keyuse);
|
||||
|
||||
bzero((char*) &key_end,sizeof(key_end)); /* Add for easy testing */
|
||||
VOID(insert_dynamic(keyuse,(gptr) &key_end));
|
||||
if (insert_dynamic(keyuse,(gptr) &key_end))
|
||||
return TRUE;
|
||||
|
||||
use=save_pos=dynamic_element(keyuse,0,KEYUSE*);
|
||||
prev= &key_end;
|
||||
|
172
sql/sql_yacc.yy
172
sql/sql_yacc.yy
@ -234,9 +234,7 @@ int case_stmt_action_expr(LEX *lex, Item* expr)
|
||||
parsing_ctx, case_expr_id, expr, lex);
|
||||
|
||||
sp->add_cont_backpatch(i);
|
||||
sp->add_instr(i);
|
||||
|
||||
return 0;
|
||||
return sp->add_instr(i);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -247,7 +245,7 @@ int case_stmt_action_expr(LEX *lex, Item* expr)
|
||||
@param simple true for simple cases, false for searched cases
|
||||
*/
|
||||
|
||||
void case_stmt_action_when(LEX *lex, Item *when, bool simple)
|
||||
int case_stmt_action_when(LEX *lex, Item *when, bool simple)
|
||||
{
|
||||
sp_head *sp= lex->sphead;
|
||||
sp_pcontext *ctx= lex->spcont;
|
||||
@ -279,9 +277,10 @@ void case_stmt_action_when(LEX *lex, Item *when, bool simple)
|
||||
(jump_if_not from instruction 2 to 5, 5 to 8 ... in the example)
|
||||
*/
|
||||
|
||||
sp->push_backpatch(i, ctx->push_label((char *)"", 0));
|
||||
sp->add_cont_backpatch(i);
|
||||
sp->add_instr(i);
|
||||
return !test(i) ||
|
||||
sp->push_backpatch(i, ctx->push_label((char *)"", 0)) ||
|
||||
sp->add_cont_backpatch(i) ||
|
||||
sp->add_instr(i);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -290,13 +289,14 @@ void case_stmt_action_when(LEX *lex, Item *when, bool simple)
|
||||
@param lex the parser lex context
|
||||
*/
|
||||
|
||||
void case_stmt_action_then(LEX *lex)
|
||||
int case_stmt_action_then(LEX *lex)
|
||||
{
|
||||
sp_head *sp= lex->sphead;
|
||||
sp_pcontext *ctx= lex->spcont;
|
||||
uint ip= sp->instructions();
|
||||
sp_instr_jump *i = new sp_instr_jump(ip, ctx);
|
||||
sp->add_instr(i);
|
||||
if (!test(i) || sp->add_instr(i))
|
||||
return 1;
|
||||
|
||||
/*
|
||||
BACKPATCH: Resolving forward jump from
|
||||
@ -312,7 +312,7 @@ void case_stmt_action_then(LEX *lex)
|
||||
(jump from instruction 4 to 12, 7 to 12 ... in the example)
|
||||
*/
|
||||
|
||||
sp->push_backpatch(i, ctx->last_label());
|
||||
return sp->push_backpatch(i, ctx->last_label());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1905,10 +1905,9 @@ sp_decl:
|
||||
var_type,
|
||||
lex,
|
||||
(i == num_vars - 1));
|
||||
if (is == NULL)
|
||||
if (is == NULL ||
|
||||
lex->sphead->add_instr(is))
|
||||
MYSQL_YYABORT;
|
||||
|
||||
lex->sphead->add_instr(is);
|
||||
}
|
||||
|
||||
pctx->declare_var_boundary(0);
|
||||
@ -1927,7 +1926,8 @@ sp_decl:
|
||||
my_error(ER_SP_DUP_COND, MYF(0), $2.str);
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
YYTHD->lex->spcont->push_cond(&$2, $5);
|
||||
if(YYTHD->lex->spcont->push_cond(&$2, $5))
|
||||
MYSQL_YYABORT;
|
||||
$$.vars= $$.hndlrs= $$.curs= 0;
|
||||
$$.conds= 1;
|
||||
}
|
||||
@ -1942,10 +1942,10 @@ sp_decl:
|
||||
sp_instr_hpush_jump *i=
|
||||
new sp_instr_hpush_jump(sp->instructions(), ctx, $2,
|
||||
ctx->current_var_count());
|
||||
if (i == NULL)
|
||||
if (i == NULL ||
|
||||
sp->add_instr(i))
|
||||
MYSQL_YYABORT;
|
||||
|
||||
sp->add_instr(i);
|
||||
sp->push_backpatch(i, ctx->push_label((char *)"", 0));
|
||||
}
|
||||
sp_hcond_list sp_proc_stmt
|
||||
@ -1960,17 +1960,17 @@ sp_decl:
|
||||
{
|
||||
i= new sp_instr_hreturn(sp->instructions(), ctx,
|
||||
ctx->current_var_count());
|
||||
if (i == NULL )
|
||||
if (i == NULL ||
|
||||
sp->add_instr(i))
|
||||
MYSQL_YYABORT;
|
||||
sp->add_instr(i);
|
||||
}
|
||||
else
|
||||
{ /* EXIT or UNDO handler, just jump to the end of the block */
|
||||
i= new sp_instr_hreturn(sp->instructions(), ctx, 0);
|
||||
if (i == NULL)
|
||||
if (i == NULL ||
|
||||
sp->add_instr(i) ||
|
||||
sp->push_backpatch(i, lex->spcont->last_label())) /* Block end */
|
||||
MYSQL_YYABORT;
|
||||
sp->add_instr(i);
|
||||
sp->push_backpatch(i, lex->spcont->last_label()); /* Block end */
|
||||
}
|
||||
lex->sphead->backpatch(hlab);
|
||||
|
||||
@ -1996,10 +1996,10 @@ sp_decl:
|
||||
}
|
||||
i= new sp_instr_cpush(sp->instructions(), ctx, $5,
|
||||
ctx->current_cursor_count());
|
||||
if (i == NULL)
|
||||
if (i == NULL ||
|
||||
sp->add_instr(i) ||
|
||||
ctx->push_cursor(&$2))
|
||||
MYSQL_YYABORT;
|
||||
sp->add_instr(i);
|
||||
ctx->push_cursor(&$2);
|
||||
$$.vars= $$.conds= $$.hndlrs= 0;
|
||||
$$.curs= 1;
|
||||
}
|
||||
@ -2223,10 +2223,11 @@ sp_proc_stmt:
|
||||
i->m_query.length= lip->ptr - sp->m_tmp_query;
|
||||
else
|
||||
i->m_query.length= lip->tok_end - sp->m_tmp_query;
|
||||
i->m_query.str= strmake_root(thd->mem_root,
|
||||
sp->m_tmp_query,
|
||||
i->m_query.length);
|
||||
sp->add_instr(i);
|
||||
if (!(i->m_query.str= strmake_root(thd->mem_root,
|
||||
sp->m_tmp_query,
|
||||
i->m_query.length)) ||
|
||||
sp->add_instr(i))
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
sp->restore_lex(thd);
|
||||
}
|
||||
@ -2251,9 +2252,9 @@ sp_proc_stmt:
|
||||
|
||||
i= new sp_instr_freturn(sp->instructions(), lex->spcont, $3,
|
||||
sp->m_return_field_def.sql_type, lex);
|
||||
if (i == NULL)
|
||||
if (i == NULL ||
|
||||
sp->add_instr(i))
|
||||
MYSQL_YYABORT;
|
||||
sp->add_instr(i);
|
||||
sp->m_flags|= sp_head::HAS_RETURN;
|
||||
}
|
||||
sp->restore_lex(YYTHD);
|
||||
@ -2311,23 +2312,23 @@ sp_proc_stmt:
|
||||
if (n)
|
||||
{
|
||||
sp_instr_hpop *hpop= new sp_instr_hpop(ip++, ctx, n);
|
||||
if (hpop == NULL)
|
||||
if (hpop == NULL ||
|
||||
sp->add_instr(hpop))
|
||||
MYSQL_YYABORT;
|
||||
sp->add_instr(hpop);
|
||||
}
|
||||
n= ctx->diff_cursors(lab->ctx, exclusive);
|
||||
if (n)
|
||||
{
|
||||
sp_instr_cpop *cpop= new sp_instr_cpop(ip++, ctx, n);
|
||||
if (cpop == NULL)
|
||||
if (cpop == NULL ||
|
||||
sp->add_instr(cpop))
|
||||
MYSQL_YYABORT;
|
||||
sp->add_instr(cpop);
|
||||
}
|
||||
i= new sp_instr_jump(ip, ctx);
|
||||
if (i == NULL)
|
||||
if (i == NULL ||
|
||||
sp->push_backpatch(i, lab) || /* Jumping forward */
|
||||
sp->add_instr(i))
|
||||
MYSQL_YYABORT;
|
||||
sp->push_backpatch(i, lab); /* Jumping forward */
|
||||
sp->add_instr(i);
|
||||
}
|
||||
}
|
||||
| ITERATE_SYM label_ident
|
||||
@ -2352,22 +2353,22 @@ sp_proc_stmt:
|
||||
if (n)
|
||||
{
|
||||
sp_instr_hpop *hpop= new sp_instr_hpop(ip++, ctx, n);
|
||||
if (hpop == NULL)
|
||||
if (hpop == NULL ||
|
||||
sp->add_instr(hpop))
|
||||
MYSQL_YYABORT;
|
||||
sp->add_instr(hpop);
|
||||
}
|
||||
n= ctx->diff_cursors(lab->ctx, FALSE); /* Inclusive the dest. */
|
||||
if (n)
|
||||
{
|
||||
sp_instr_cpop *cpop= new sp_instr_cpop(ip++, ctx, n);
|
||||
if (cpop == NULL)
|
||||
if (cpop == NULL ||
|
||||
sp->add_instr(cpop))
|
||||
MYSQL_YYABORT;
|
||||
sp->add_instr(cpop);
|
||||
}
|
||||
i= new sp_instr_jump(ip, ctx, lab->ip); /* Jump back */
|
||||
if (i == NULL)
|
||||
if (i == NULL ||
|
||||
sp->add_instr(i))
|
||||
MYSQL_YYABORT;
|
||||
sp->add_instr(i);
|
||||
}
|
||||
}
|
||||
| OPEN_SYM ident
|
||||
@ -2383,9 +2384,9 @@ sp_proc_stmt:
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
i= new sp_instr_copen(sp->instructions(), lex->spcont, offset);
|
||||
if (i == NULL)
|
||||
if (i == NULL ||
|
||||
sp->add_instr(i))
|
||||
MYSQL_YYABORT;
|
||||
sp->add_instr(i);
|
||||
}
|
||||
| FETCH_SYM sp_opt_fetch_noise ident INTO
|
||||
{
|
||||
@ -2400,9 +2401,9 @@ sp_proc_stmt:
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
i= new sp_instr_cfetch(sp->instructions(), lex->spcont, offset);
|
||||
if (i == NULL)
|
||||
if (i == NULL ||
|
||||
sp->add_instr(i))
|
||||
MYSQL_YYABORT;
|
||||
sp->add_instr(i);
|
||||
}
|
||||
sp_fetch_list
|
||||
{ }
|
||||
@ -2419,9 +2420,9 @@ sp_proc_stmt:
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
i= new sp_instr_cclose(sp->instructions(), lex->spcont, offset);
|
||||
if (i == NULL)
|
||||
if (i == NULL ||
|
||||
sp->add_instr(i))
|
||||
MYSQL_YYABORT;
|
||||
sp->add_instr(i);
|
||||
}
|
||||
;
|
||||
|
||||
@ -2488,11 +2489,11 @@ sp_if:
|
||||
uint ip= sp->instructions();
|
||||
sp_instr_jump_if_not *i = new sp_instr_jump_if_not(ip, ctx,
|
||||
$2, lex);
|
||||
if (i == NULL)
|
||||
if (i == NULL ||
|
||||
sp->push_backpatch(i, ctx->push_label((char *)"", 0)) ||
|
||||
sp->add_cont_backpatch(i) ||
|
||||
sp->add_instr(i))
|
||||
MYSQL_YYABORT;
|
||||
sp->push_backpatch(i, ctx->push_label((char *)"", 0));
|
||||
sp->add_cont_backpatch(i);
|
||||
sp->add_instr(i);
|
||||
sp->restore_lex(YYTHD);
|
||||
}
|
||||
sp_proc_stmts1
|
||||
@ -2501,9 +2502,9 @@ sp_if:
|
||||
sp_pcontext *ctx= Lex->spcont;
|
||||
uint ip= sp->instructions();
|
||||
sp_instr_jump *i = new sp_instr_jump(ip, ctx);
|
||||
if (i == NULL)
|
||||
if (i == NULL ||
|
||||
sp->add_instr(i))
|
||||
MYSQL_YYABORT;
|
||||
sp->add_instr(i);
|
||||
sp->backpatch(ctx->pop_label());
|
||||
sp->push_backpatch(i, ctx->push_label((char *)"", 0));
|
||||
}
|
||||
@ -2589,14 +2590,16 @@ simple_when_clause:
|
||||
/* Simple case: <caseval> = <whenval> */
|
||||
|
||||
LEX *lex= Lex;
|
||||
case_stmt_action_when(lex, $3, true);
|
||||
if (case_stmt_action_when(lex, $3, true))
|
||||
MYSQL_YYABORT;
|
||||
lex->sphead->restore_lex(YYTHD); /* For expr $3 */
|
||||
}
|
||||
THEN_SYM
|
||||
sp_proc_stmts1
|
||||
{
|
||||
LEX *lex= Lex;
|
||||
case_stmt_action_then(lex);
|
||||
if (case_stmt_action_then(lex))
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
;
|
||||
|
||||
@ -2609,14 +2612,16 @@ searched_when_clause:
|
||||
expr
|
||||
{
|
||||
LEX *lex= Lex;
|
||||
case_stmt_action_when(lex, $3, false);
|
||||
if (case_stmt_action_when(lex, $3, false))
|
||||
MYSQL_YYABORT;
|
||||
lex->sphead->restore_lex(YYTHD); /* For expr $3 */
|
||||
}
|
||||
THEN_SYM
|
||||
sp_proc_stmts1
|
||||
{
|
||||
LEX *lex= Lex;
|
||||
case_stmt_action_then(lex);
|
||||
if (case_stmt_action_then(lex))
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
;
|
||||
|
||||
@ -2628,9 +2633,9 @@ else_clause_opt:
|
||||
uint ip= sp->instructions();
|
||||
sp_instr_error *i= new sp_instr_error(ip, lex->spcont,
|
||||
ER_SP_CASE_NOT_FOUND);
|
||||
if (i == NULL)
|
||||
if (i == NULL ||
|
||||
sp->add_instr(i))
|
||||
MYSQL_YYABORT;
|
||||
sp->add_instr(i);
|
||||
}
|
||||
| ELSE sp_proc_stmts1
|
||||
;
|
||||
@ -2744,17 +2749,17 @@ sp_block_content:
|
||||
{
|
||||
sp_instr_hpop *hpop= new sp_instr_hpop(sp->instructions(), ctx,
|
||||
$3.hndlrs);
|
||||
if (hpop == NULL)
|
||||
if (hpop == NULL ||
|
||||
sp->add_instr(hpop))
|
||||
MYSQL_YYABORT;
|
||||
sp->add_instr(hpop);
|
||||
}
|
||||
if ($3.curs)
|
||||
{
|
||||
sp_instr_cpop *cpop= new sp_instr_cpop(sp->instructions(), ctx,
|
||||
$3.curs);
|
||||
if (cpop == NULL)
|
||||
if (cpop == NULL ||
|
||||
sp->add_instr(cpop))
|
||||
MYSQL_YYABORT;
|
||||
sp->add_instr(cpop);
|
||||
}
|
||||
lex->spcont= ctx->pop_context();
|
||||
}
|
||||
@ -2768,9 +2773,9 @@ sp_unlabeled_control:
|
||||
uint ip= lex->sphead->instructions();
|
||||
sp_label_t *lab= lex->spcont->last_label(); /* Jumping back */
|
||||
sp_instr_jump *i = new sp_instr_jump(ip, lex->spcont, lab->ip);
|
||||
if (i == NULL)
|
||||
if (i == NULL ||
|
||||
lex->sphead->add_instr(i))
|
||||
MYSQL_YYABORT;
|
||||
lex->sphead->add_instr(i);
|
||||
}
|
||||
| WHILE_SYM
|
||||
{
|
||||
@ -2784,12 +2789,12 @@ sp_unlabeled_control:
|
||||
uint ip= sp->instructions();
|
||||
sp_instr_jump_if_not *i = new sp_instr_jump_if_not(ip, lex->spcont,
|
||||
$3, lex);
|
||||
if (i == NULL)
|
||||
MYSQL_YYABORT;
|
||||
if (i == NULL ||
|
||||
/* Jumping forward */
|
||||
sp->push_backpatch(i, lex->spcont->last_label());
|
||||
sp->new_cont_backpatch(i);
|
||||
sp->add_instr(i);
|
||||
sp->push_backpatch(i, lex->spcont->last_label()) ||
|
||||
sp->new_cont_backpatch(i) ||
|
||||
sp->add_instr(i))
|
||||
MYSQL_YYABORT;
|
||||
sp->restore_lex(YYTHD);
|
||||
}
|
||||
sp_proc_stmts1 END WHILE_SYM
|
||||
@ -2798,9 +2803,9 @@ sp_unlabeled_control:
|
||||
uint ip= lex->sphead->instructions();
|
||||
sp_label_t *lab= lex->spcont->last_label(); /* Jumping back */
|
||||
sp_instr_jump *i = new sp_instr_jump(ip, lex->spcont, lab->ip);
|
||||
if (i == NULL)
|
||||
if (i == NULL ||
|
||||
lex->sphead->add_instr(i))
|
||||
MYSQL_YYABORT;
|
||||
lex->sphead->add_instr(i);
|
||||
lex->sphead->do_cont_backpatch();
|
||||
}
|
||||
| REPEAT_SYM sp_proc_stmts1 UNTIL_SYM
|
||||
@ -2816,9 +2821,9 @@ sp_unlabeled_control:
|
||||
sp_instr_jump_if_not *i = new sp_instr_jump_if_not(ip, lex->spcont,
|
||||
$5, lab->ip,
|
||||
lex);
|
||||
if (i == NULL)
|
||||
if (i == NULL ||
|
||||
lex->sphead->add_instr(i))
|
||||
MYSQL_YYABORT;
|
||||
lex->sphead->add_instr(i);
|
||||
lex->sphead->restore_lex(YYTHD);
|
||||
/* We can shortcut the cont_backpatch here */
|
||||
i->m_cont_dest= ip+1;
|
||||
@ -9649,7 +9654,8 @@ option_type_value:
|
||||
qbuff.length);
|
||||
qbuff.length+= 4;
|
||||
i->m_query= qbuff;
|
||||
sp->add_instr(i);
|
||||
if (sp->add_instr(i))
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
lex->sphead->restore_lex(thd);
|
||||
}
|
||||
@ -9731,7 +9737,8 @@ sys_option_value:
|
||||
lex->trg_table_fields.link_in_list((byte *)trg_fld,
|
||||
(byte **)&trg_fld->next_trg_field);
|
||||
|
||||
lex->sphead->add_instr(sp_fld);
|
||||
if (lex->sphead->add_instr(sp_fld))
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
else if ($2.var)
|
||||
{ /* System variable */
|
||||
@ -9761,11 +9768,12 @@ sys_option_value:
|
||||
it= spv->dflt;
|
||||
else
|
||||
it= new Item_null();
|
||||
if (it == NULL)
|
||||
if (it == NULL ||
|
||||
(sp_set= new sp_instr_set(lex->sphead->instructions(), ctx,
|
||||
spv->offset, it, spv->type, lex,
|
||||
TRUE)) == NULL ||
|
||||
lex->sphead->add_instr(sp_set))
|
||||
MYSQL_YYABORT;
|
||||
sp_set= new sp_instr_set(lex->sphead->instructions(), ctx,
|
||||
spv->offset, it, spv->type, lex, TRUE);
|
||||
lex->sphead->add_instr(sp_set);
|
||||
}
|
||||
}
|
||||
| option_type TRANSACTION_SYM ISOLATION LEVEL_SYM isolation_types
|
||||
|
Loading…
x
Reference in New Issue
Block a user