mirror of
https://github.com/MariaDB/server.git
synced 2026-05-06 23:25:34 +02:00
Merge weblab.(none):/home/marcsql/TREE/mysql-5.0-runtime
into weblab.(none):/home/marcsql/TREE/mysql-5.1-26503-merge mysql-test/t/sp-error.test: Auto merged sql/handler.cc: Auto merged sql/item.cc: Auto merged sql/item.h: Auto merged sql/item_func.cc: Auto merged sql/item_subselect.cc: Auto merged sql/log_event.cc: Auto merged sql/sp_head.cc: Auto merged sql/sp_head.h: Auto merged sql/sql_base.cc: Auto merged sql/sql_show.cc: Auto merged sql/sql_table.cc: Auto merged sql/sql_yacc.yy: Auto merged
This commit is contained in:
commit
34a0de585a
15 changed files with 253 additions and 96 deletions
|
|
@ -2067,6 +2067,74 @@ drop function bug20701;
|
|||
--echo End of 5.1 tests
|
||||
|
||||
|
||||
#
|
||||
# Bug#26503 (Illegal SQL exception handler code causes the server to crash)
|
||||
#
|
||||
|
||||
delimiter //;
|
||||
|
||||
--error ER_SP_LILABEL_MISMATCH
|
||||
create procedure proc_26503_error_1()
|
||||
begin
|
||||
retry:
|
||||
repeat
|
||||
begin
|
||||
declare continue handler for sqlexception
|
||||
begin
|
||||
iterate retry;
|
||||
end
|
||||
|
||||
select "do something";
|
||||
end
|
||||
until true end repeat retry;
|
||||
end//
|
||||
|
||||
--error ER_SP_LILABEL_MISMATCH
|
||||
create procedure proc_26503_error_2()
|
||||
begin
|
||||
retry:
|
||||
repeat
|
||||
begin
|
||||
declare continue handler for sqlexception
|
||||
iterate retry;
|
||||
|
||||
select "do something";
|
||||
end
|
||||
until true end repeat retry;
|
||||
end//
|
||||
|
||||
--error ER_SP_LILABEL_MISMATCH
|
||||
create procedure proc_26503_error_3()
|
||||
begin
|
||||
retry:
|
||||
repeat
|
||||
begin
|
||||
declare continue handler for sqlexception
|
||||
begin
|
||||
leave retry;
|
||||
end
|
||||
|
||||
select "do something";
|
||||
end
|
||||
until true end repeat retry;
|
||||
end//
|
||||
|
||||
--error ER_SP_LILABEL_MISMATCH
|
||||
create procedure proc_26503_error_4()
|
||||
begin
|
||||
retry:
|
||||
repeat
|
||||
begin
|
||||
declare continue handler for sqlexception
|
||||
leave retry;
|
||||
|
||||
select "do something";
|
||||
end
|
||||
until true end repeat retry;
|
||||
end//
|
||||
|
||||
delimiter ;//
|
||||
|
||||
#
|
||||
# BUG#NNNN: New bug synopsis
|
||||
#
|
||||
|
|
|
|||
|
|
@ -1143,9 +1143,9 @@ bool mysql_xa_recover(THD *thd)
|
|||
XID_STATE *xs;
|
||||
DBUG_ENTER("mysql_xa_recover");
|
||||
|
||||
field_list.push_back(new Item_int("formatID",0,11));
|
||||
field_list.push_back(new Item_int("gtrid_length",0,11));
|
||||
field_list.push_back(new Item_int("bqual_length",0,11));
|
||||
field_list.push_back(new Item_int("formatID", 0, MY_INT32_NUM_DECIMAL_DIGITS));
|
||||
field_list.push_back(new Item_int("gtrid_length", 0, MY_INT32_NUM_DECIMAL_DIGITS));
|
||||
field_list.push_back(new Item_int("bqual_length", 0, MY_INT32_NUM_DECIMAL_DIGITS));
|
||||
field_list.push_back(new Item_empty_string("data",XIDDATASIZE));
|
||||
|
||||
if (protocol->send_fields(&field_list,
|
||||
|
|
|
|||
|
|
@ -148,7 +148,7 @@ void
|
|||
Hybrid_type_traits_integer::fix_length_and_dec(Item *item, Item *arg) const
|
||||
{
|
||||
item->decimals= 0;
|
||||
item->max_length= 21;
|
||||
item->max_length= MY_INT64_NUM_DECIMAL_DIGITS;
|
||||
item->unsigned_flag= 0;
|
||||
}
|
||||
|
||||
|
|
@ -2524,7 +2524,7 @@ bool Item_param::set_from_user_var(THD *thd, const user_var_entry *entry)
|
|||
item_result_type= REAL_RESULT;
|
||||
break;
|
||||
case INT_RESULT:
|
||||
set_int(*(longlong*)entry->value, 21);
|
||||
set_int(*(longlong*)entry->value, MY_INT64_NUM_DECIMAL_DIGITS);
|
||||
item_type= Item::INT_ITEM;
|
||||
item_result_type= INT_RESULT;
|
||||
break;
|
||||
|
|
@ -6622,7 +6622,7 @@ uint32 Item_type_holder::display_length(Item *item)
|
|||
case MYSQL_TYPE_SHORT:
|
||||
return 6;
|
||||
case MYSQL_TYPE_LONG:
|
||||
return 11;
|
||||
return MY_INT32_NUM_DECIMAL_DIGITS;
|
||||
case MYSQL_TYPE_FLOAT:
|
||||
return 25;
|
||||
case MYSQL_TYPE_DOUBLE:
|
||||
|
|
|
|||
|
|
@ -1591,11 +1591,14 @@ class Item_int :public Item_num
|
|||
{
|
||||
public:
|
||||
longlong value;
|
||||
Item_int(int32 i,uint length=11) :value((longlong) i)
|
||||
Item_int(int32 i,uint length= MY_INT32_NUM_DECIMAL_DIGITS)
|
||||
:value((longlong) i)
|
||||
{ max_length=length; fixed= 1; }
|
||||
Item_int(longlong i,uint length=21) :value(i)
|
||||
Item_int(longlong i,uint length= MY_INT64_NUM_DECIMAL_DIGITS)
|
||||
:value(i)
|
||||
{ max_length=length; fixed= 1; }
|
||||
Item_int(ulonglong i, uint length= 21) :value((longlong)i)
|
||||
Item_int(ulonglong i, uint length= MY_INT64_NUM_DECIMAL_DIGITS)
|
||||
:value((longlong)i)
|
||||
{ max_length=length; fixed= 1; unsigned_flag= 1; }
|
||||
Item_int(const char *str_arg,longlong i,uint length) :value(i)
|
||||
{ max_length=length; name=(char*) str_arg; fixed= 1; }
|
||||
|
|
|
|||
|
|
@ -430,7 +430,7 @@ Field *Item_func::tmp_table_field(TABLE *table)
|
|||
|
||||
switch (result_type()) {
|
||||
case INT_RESULT:
|
||||
if (max_length > 11)
|
||||
if (max_length > MY_INT32_NUM_DECIMAL_DIGITS)
|
||||
field= new Field_longlong(max_length, maybe_null, name, unsigned_flag);
|
||||
else
|
||||
field= new Field_long(max_length, maybe_null, name, unsigned_flag);
|
||||
|
|
@ -2333,7 +2333,8 @@ longlong Item_func_coercibility::val_int()
|
|||
|
||||
void Item_func_locate::fix_length_and_dec()
|
||||
{
|
||||
maybe_null=0; max_length=11;
|
||||
maybe_null= 0;
|
||||
max_length= MY_INT32_NUM_DECIMAL_DIGITS;
|
||||
agg_arg_charsets(cmp_collation, args, 2, MY_COLL_CMP_CONV, 1);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1080,7 +1080,8 @@ Item_in_subselect::single_value_transformer(JOIN *join,
|
|||
Item *having= item, *orig_item= item;
|
||||
select_lex->item_list.empty();
|
||||
select_lex->item_list.push_back(new Item_int("Not_used",
|
||||
(longlong) 1, 21));
|
||||
(longlong) 1,
|
||||
MY_INT64_NUM_DECIMAL_DIGITS));
|
||||
select_lex->ref_pointer_array[0]= select_lex->item_list.head();
|
||||
|
||||
item= func->create(expr, item);
|
||||
|
|
|
|||
|
|
@ -642,12 +642,13 @@ int Log_event::net_send(Protocol *protocol, const char* log_name, my_off_t pos)
|
|||
void Log_event::init_show_field_list(List<Item>* field_list)
|
||||
{
|
||||
field_list->push_back(new Item_empty_string("Log_name", 20));
|
||||
field_list->push_back(new Item_return_int("Pos", 11,
|
||||
field_list->push_back(new Item_return_int("Pos", MY_INT32_NUM_DECIMAL_DIGITS,
|
||||
MYSQL_TYPE_LONGLONG));
|
||||
field_list->push_back(new Item_empty_string("Event_type", 20));
|
||||
field_list->push_back(new Item_return_int("Server_id", 10,
|
||||
MYSQL_TYPE_LONG));
|
||||
field_list->push_back(new Item_return_int("End_log_pos", 11,
|
||||
field_list->push_back(new Item_return_int("End_log_pos",
|
||||
MY_INT32_NUM_DECIMAL_DIGITS,
|
||||
MYSQL_TYPE_LONGLONG));
|
||||
field_list->push_back(new Item_empty_string("Info", 20));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -490,7 +490,7 @@ sp_head::init(LEX *lex)
|
|||
{
|
||||
DBUG_ENTER("sp_head::init");
|
||||
|
||||
lex->spcont= m_pcont= new sp_pcontext(NULL);
|
||||
lex->spcont= m_pcont= new sp_pcontext();
|
||||
|
||||
/*
|
||||
Altough trg_table_fields list is used only in triggers we init for all
|
||||
|
|
|
|||
|
|
@ -107,8 +107,6 @@ public:
|
|||
/* Possible values of m_flags */
|
||||
enum {
|
||||
HAS_RETURN= 1, // For FUNCTIONs only: is set if has RETURN
|
||||
IN_SIMPLE_CASE= 2, // Is set if parsing a simple CASE
|
||||
IN_HANDLER= 4, // Is set if the parser is in a handler body
|
||||
MULTI_RESULTS= 8, // Is set if a procedure with SELECT(s)
|
||||
CONTAINS_DYNAMIC_SQL= 16, // Is set if a procedure with PREPARE/EXECUTE
|
||||
IS_INVOKED= 32, // Is set if this sp_head is being used
|
||||
|
|
|
|||
|
|
@ -25,6 +25,11 @@
|
|||
#include "sp_pcontext.h"
|
||||
#include "sp_head.h"
|
||||
|
||||
/* Initial size for the dynamic arrays in sp_pcontext */
|
||||
#define PCONTEXT_ARRAY_INIT_ALLOC 16
|
||||
/* Increment size for the dynamic arrays in sp_pcontext */
|
||||
#define PCONTEXT_ARRAY_INCREMENT_ALLOC 8
|
||||
|
||||
/*
|
||||
Sanity check for SQLSTATEs. Will not check if it's really an existing
|
||||
state (there are just too many), but will check length and bad characters.
|
||||
|
|
@ -49,29 +54,62 @@ sp_cond_check(LEX_STRING *sqlstate)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
sp_pcontext::sp_pcontext(sp_pcontext *prev)
|
||||
:Sql_alloc(), m_max_var_index(0), m_max_cursor_index(0), m_max_handler_index(0),
|
||||
m_context_handlers(0), m_parent(prev), m_pboundary(0)
|
||||
sp_pcontext::sp_pcontext()
|
||||
: Sql_alloc(),
|
||||
m_max_var_index(0), m_max_cursor_index(0), m_max_handler_index(0),
|
||||
m_context_handlers(0), m_parent(NULL), m_pboundary(0),
|
||||
m_label_scope(LABEL_DEFAULT_SCOPE)
|
||||
{
|
||||
VOID(my_init_dynamic_array(&m_vars, sizeof(sp_variable_t *), 16, 8));
|
||||
VOID(my_init_dynamic_array(&m_case_expr_id_lst, sizeof(int), 16, 8));
|
||||
VOID(my_init_dynamic_array(&m_conds, sizeof(sp_cond_type_t *), 16, 8));
|
||||
VOID(my_init_dynamic_array(&m_cursors, sizeof(LEX_STRING), 16, 8));
|
||||
VOID(my_init_dynamic_array(&m_handlers, sizeof(sp_cond_type_t *), 16, 8));
|
||||
VOID(my_init_dynamic_array(&m_vars, sizeof(sp_variable_t *),
|
||||
PCONTEXT_ARRAY_INIT_ALLOC,
|
||||
PCONTEXT_ARRAY_INCREMENT_ALLOC));
|
||||
VOID(my_init_dynamic_array(&m_case_expr_id_lst, sizeof(int),
|
||||
PCONTEXT_ARRAY_INIT_ALLOC,
|
||||
PCONTEXT_ARRAY_INCREMENT_ALLOC));
|
||||
VOID(my_init_dynamic_array(&m_conds, sizeof(sp_cond_type_t *),
|
||||
PCONTEXT_ARRAY_INIT_ALLOC,
|
||||
PCONTEXT_ARRAY_INCREMENT_ALLOC));
|
||||
VOID(my_init_dynamic_array(&m_cursors, sizeof(LEX_STRING),
|
||||
PCONTEXT_ARRAY_INIT_ALLOC,
|
||||
PCONTEXT_ARRAY_INCREMENT_ALLOC));
|
||||
VOID(my_init_dynamic_array(&m_handlers, sizeof(sp_cond_type_t *),
|
||||
PCONTEXT_ARRAY_INIT_ALLOC,
|
||||
PCONTEXT_ARRAY_INCREMENT_ALLOC));
|
||||
m_label.empty();
|
||||
m_children.empty();
|
||||
if (!prev)
|
||||
{
|
||||
|
||||
m_var_offset= m_cursor_offset= 0;
|
||||
m_num_case_exprs= 0;
|
||||
}
|
||||
else
|
||||
|
||||
sp_pcontext::sp_pcontext(sp_pcontext *prev, label_scope_type label_scope)
|
||||
: Sql_alloc(),
|
||||
m_max_var_index(0), m_max_cursor_index(0), m_max_handler_index(0),
|
||||
m_context_handlers(0), m_parent(prev), m_pboundary(0),
|
||||
m_label_scope(label_scope)
|
||||
{
|
||||
VOID(my_init_dynamic_array(&m_vars, sizeof(sp_variable_t *),
|
||||
PCONTEXT_ARRAY_INIT_ALLOC,
|
||||
PCONTEXT_ARRAY_INCREMENT_ALLOC));
|
||||
VOID(my_init_dynamic_array(&m_case_expr_id_lst, sizeof(int),
|
||||
PCONTEXT_ARRAY_INIT_ALLOC,
|
||||
PCONTEXT_ARRAY_INCREMENT_ALLOC));
|
||||
VOID(my_init_dynamic_array(&m_conds, sizeof(sp_cond_type_t *),
|
||||
PCONTEXT_ARRAY_INIT_ALLOC,
|
||||
PCONTEXT_ARRAY_INCREMENT_ALLOC));
|
||||
VOID(my_init_dynamic_array(&m_cursors, sizeof(LEX_STRING),
|
||||
PCONTEXT_ARRAY_INIT_ALLOC,
|
||||
PCONTEXT_ARRAY_INCREMENT_ALLOC));
|
||||
VOID(my_init_dynamic_array(&m_handlers, sizeof(sp_cond_type_t *),
|
||||
PCONTEXT_ARRAY_INIT_ALLOC,
|
||||
PCONTEXT_ARRAY_INCREMENT_ALLOC));
|
||||
m_label.empty();
|
||||
m_children.empty();
|
||||
|
||||
m_var_offset= prev->m_var_offset + prev->m_max_var_index;
|
||||
m_cursor_offset= prev->current_cursor_count();
|
||||
m_num_case_exprs= prev->get_num_case_exprs();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
sp_pcontext::destroy()
|
||||
|
|
@ -92,9 +130,9 @@ sp_pcontext::destroy()
|
|||
}
|
||||
|
||||
sp_pcontext *
|
||||
sp_pcontext::push_context()
|
||||
sp_pcontext::push_context(label_scope_type label_scope)
|
||||
{
|
||||
sp_pcontext *child= new sp_pcontext(this);
|
||||
sp_pcontext *child= new sp_pcontext(this, label_scope);
|
||||
|
||||
if (child)
|
||||
m_children.push_back(child);
|
||||
|
|
@ -257,7 +295,15 @@ sp_pcontext::find_label(char *name)
|
|||
if (my_strcasecmp(system_charset_info, name, lab->name) == 0)
|
||||
return lab;
|
||||
|
||||
if (m_parent)
|
||||
/*
|
||||
Note about exception handlers.
|
||||
See SQL:2003 SQL/PSM (ISO/IEC 9075-4:2003),
|
||||
section 13.1 <compound statement>,
|
||||
syntax rule 4.
|
||||
In short, a DECLARE HANDLER block can not refer
|
||||
to labels from the parent context, as they are out of scope.
|
||||
*/
|
||||
if (m_parent && (m_label_scope == LABEL_DEFAULT_SCOPE))
|
||||
return m_parent->find_label(name);
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -88,16 +88,33 @@ typedef struct sp_cond
|
|||
sp_cond_type_t *val;
|
||||
} sp_cond_t;
|
||||
|
||||
/**
|
||||
The scope of a label in Stored Procedures,
|
||||
for name resolution of labels in a parsing context.
|
||||
*/
|
||||
enum label_scope_type
|
||||
{
|
||||
/**
|
||||
The labels declared in a parent context are in scope.
|
||||
*/
|
||||
LABEL_DEFAULT_SCOPE,
|
||||
/**
|
||||
The labels declared in a parent context are not in scope.
|
||||
*/
|
||||
LABEL_HANDLER_SCOPE
|
||||
};
|
||||
|
||||
/*
|
||||
The parse-time context, used to keep track on declared variables/parameters,
|
||||
/**
|
||||
The parse-time context, used to keep track of declared variables/parameters,
|
||||
conditions, handlers, cursors and labels, during parsing.
|
||||
sp_contexts are organized as a tree, with one object for each begin-end
|
||||
block, plus a root-context for the parameters.
|
||||
block, one object for each exception handler,
|
||||
plus a root-context for the parameters.
|
||||
This is used during parsing for looking up defined names (e.g. declared
|
||||
variables and visible labels), for error checking, and to calculate offsets
|
||||
to be used at runtime. (During execution variable values, active handlers
|
||||
and cursors, etc, are referred to by an index in a stack.)
|
||||
Parsing contexts for exception handlers limit the visibility of labels.
|
||||
The pcontext tree is also kept during execution and is used for error
|
||||
checking (e.g. correct number of parameters), and in the future, used by
|
||||
the debugger.
|
||||
|
|
@ -105,21 +122,30 @@ typedef struct sp_cond
|
|||
|
||||
class sp_pcontext : public Sql_alloc
|
||||
{
|
||||
sp_pcontext(const sp_pcontext &); /* Prevent use of these */
|
||||
void operator=(sp_pcontext &);
|
||||
|
||||
public:
|
||||
|
||||
sp_pcontext(sp_pcontext *prev);
|
||||
/**
|
||||
Constructor.
|
||||
Builds a parsing context root node.
|
||||
*/
|
||||
sp_pcontext();
|
||||
|
||||
// Free memory
|
||||
void
|
||||
destroy();
|
||||
|
||||
/**
|
||||
Create and push a new context in the tree.
|
||||
@param label_scope label scope for the new parsing context
|
||||
@return the node created
|
||||
*/
|
||||
sp_pcontext *
|
||||
push_context();
|
||||
push_context(label_scope_type label_scope);
|
||||
|
||||
// Returns the previous context, not the one we pop
|
||||
/**
|
||||
Pop a node from the parsing context tree.
|
||||
@return the parent node
|
||||
*/
|
||||
sp_pcontext *
|
||||
pop_context();
|
||||
|
||||
|
|
@ -363,6 +389,13 @@ class sp_pcontext : public Sql_alloc
|
|||
|
||||
protected:
|
||||
|
||||
/**
|
||||
Constructor for a tree node.
|
||||
@param prev the parent parsing context
|
||||
@param label_scope label_scope for this parsing context
|
||||
*/
|
||||
sp_pcontext(sp_pcontext *prev, label_scope_type label_scope);
|
||||
|
||||
/*
|
||||
m_max_var_index -- number of variables (including all types of arguments)
|
||||
in this context including all children contexts.
|
||||
|
|
@ -416,6 +449,14 @@ private:
|
|||
|
||||
List<sp_pcontext> m_children; // Children contexts, used for destruction
|
||||
|
||||
/**
|
||||
Scope of labels for this parsing context.
|
||||
*/
|
||||
label_scope_type m_label_scope;
|
||||
|
||||
private:
|
||||
sp_pcontext(const sp_pcontext &); /* Prevent use of these */
|
||||
void operator=(sp_pcontext &);
|
||||
}; // class sp_pcontext : public Sql_alloc
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5486,7 +5486,8 @@ int setup_wild(THD *thd, TABLE_LIST *tables, List<Item> &fields,
|
|||
|
||||
Item_int do not need fix_fields() because it is basic constant.
|
||||
*/
|
||||
it.replace(new Item_int("Not_used", (longlong) 1, 21));
|
||||
it.replace(new Item_int("Not_used", (longlong) 1,
|
||||
MY_INT64_NUM_DECIMAL_DIGITS));
|
||||
}
|
||||
else if (insert_fields(thd, ((Item_field*) item)->context,
|
||||
((Item_field*) item)->db_name,
|
||||
|
|
|
|||
|
|
@ -424,7 +424,8 @@ bool mysqld_show_column_types(THD *thd)
|
|||
DBUG_ENTER("mysqld_show_column_types");
|
||||
|
||||
field_list.push_back(new Item_empty_string("Type",30));
|
||||
field_list.push_back(new Item_int("Size",(longlong) 1,21));
|
||||
field_list.push_back(new Item_int("Size",(longlong) 1,
|
||||
MY_INT64_NUM_DECIMAL_DIGITS));
|
||||
field_list.push_back(new Item_empty_string("Min_Value",20));
|
||||
field_list.push_back(new Item_empty_string("Max_Value",20));
|
||||
field_list.push_back(new Item_return_int("Prec", 4, MYSQL_TYPE_SHORT));
|
||||
|
|
@ -1620,7 +1621,7 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose)
|
|||
Protocol *protocol= thd->protocol;
|
||||
DBUG_ENTER("mysqld_list_processes");
|
||||
|
||||
field_list.push_back(new Item_int("Id",0,11));
|
||||
field_list.push_back(new Item_int("Id", 0, MY_INT32_NUM_DECIMAL_DIGITS));
|
||||
field_list.push_back(new Item_empty_string("User",16));
|
||||
field_list.push_back(new Item_empty_string("Host",LIST_PROCESS_HOST_LEN));
|
||||
field_list.push_back(field=new Item_empty_string("db",NAME_LEN));
|
||||
|
|
@ -5335,20 +5336,25 @@ ST_FIELD_INFO tables_fields_info[]=
|
|||
{"TABLE_NAME", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, "Name"},
|
||||
{"TABLE_TYPE", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, 0},
|
||||
{"ENGINE", NAME_LEN, MYSQL_TYPE_STRING, 0, 1, "Engine"},
|
||||
{"VERSION", 21 , MYSQL_TYPE_LONG, 0, 1, "Version"},
|
||||
{"VERSION", MY_INT64_NUM_DECIMAL_DIGITS , MYSQL_TYPE_LONG, 0, 1, "Version"},
|
||||
{"ROW_FORMAT", 10, MYSQL_TYPE_STRING, 0, 1, "Row_format"},
|
||||
{"TABLE_ROWS", 21 , MYSQL_TYPE_LONG, 0, 1, "Rows"},
|
||||
{"AVG_ROW_LENGTH", 21 , MYSQL_TYPE_LONG, 0, 1, "Avg_row_length"},
|
||||
{"DATA_LENGTH", 21 , MYSQL_TYPE_LONG, 0, 1, "Data_length"},
|
||||
{"MAX_DATA_LENGTH", 21 , MYSQL_TYPE_LONG, 0, 1, "Max_data_length"},
|
||||
{"INDEX_LENGTH", 21 , MYSQL_TYPE_LONG, 0, 1, "Index_length"},
|
||||
{"DATA_FREE", 21 , MYSQL_TYPE_LONG, 0, 1, "Data_free"},
|
||||
{"AUTO_INCREMENT", 21 , MYSQL_TYPE_LONG, 0, 1, "Auto_increment"},
|
||||
{"TABLE_ROWS", MY_INT64_NUM_DECIMAL_DIGITS , MYSQL_TYPE_LONG, 0, 1, "Rows"},
|
||||
{"AVG_ROW_LENGTH", MY_INT64_NUM_DECIMAL_DIGITS , MYSQL_TYPE_LONG, 0, 1,
|
||||
"Avg_row_length"},
|
||||
{"DATA_LENGTH", MY_INT64_NUM_DECIMAL_DIGITS , MYSQL_TYPE_LONG, 0, 1,
|
||||
"Data_length"},
|
||||
{"MAX_DATA_LENGTH", MY_INT64_NUM_DECIMAL_DIGITS , MYSQL_TYPE_LONG, 0, 1,
|
||||
"Max_data_length"},
|
||||
{"INDEX_LENGTH", MY_INT64_NUM_DECIMAL_DIGITS , MYSQL_TYPE_LONG, 0, 1,
|
||||
"Index_length"},
|
||||
{"DATA_FREE", MY_INT64_NUM_DECIMAL_DIGITS , MYSQL_TYPE_LONG, 0, 1, "Data_free"},
|
||||
{"AUTO_INCREMENT", MY_INT64_NUM_DECIMAL_DIGITS , MYSQL_TYPE_LONG, 0, 1,
|
||||
"Auto_increment"},
|
||||
{"CREATE_TIME", 0, MYSQL_TYPE_TIMESTAMP, 0, 1, "Create_time"},
|
||||
{"UPDATE_TIME", 0, MYSQL_TYPE_TIMESTAMP, 0, 1, "Update_time"},
|
||||
{"CHECK_TIME", 0, MYSQL_TYPE_TIMESTAMP, 0, 1, "Check_time"},
|
||||
{"TABLE_COLLATION", 64, MYSQL_TYPE_STRING, 0, 1, "Collation"},
|
||||
{"CHECKSUM", 21 , MYSQL_TYPE_LONG, 0, 1, "Checksum"},
|
||||
{"CHECKSUM", MY_INT64_NUM_DECIMAL_DIGITS , MYSQL_TYPE_LONG, 0, 1, "Checksum"},
|
||||
{"CREATE_OPTIONS", 255, MYSQL_TYPE_STRING, 0, 1, "Create_options"},
|
||||
{"TABLE_COMMENT", 80, MYSQL_TYPE_STRING, 0, 0, "Comment"},
|
||||
{0, 0, MYSQL_TYPE_STRING, 0, 0, 0}
|
||||
|
|
@ -5361,14 +5367,15 @@ ST_FIELD_INFO columns_fields_info[]=
|
|||
{"TABLE_SCHEMA", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, 0},
|
||||
{"TABLE_NAME", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, 0},
|
||||
{"COLUMN_NAME", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, "Field"},
|
||||
{"ORDINAL_POSITION", 21 , MYSQL_TYPE_LONG, 0, 0, 0},
|
||||
{"ORDINAL_POSITION", MY_INT64_NUM_DECIMAL_DIGITS , MYSQL_TYPE_LONG, 0, 0, 0},
|
||||
{"COLUMN_DEFAULT", MAX_FIELD_VARCHARLENGTH, MYSQL_TYPE_STRING, 0, 1, "Default"},
|
||||
{"IS_NULLABLE", 3, MYSQL_TYPE_STRING, 0, 0, "Null"},
|
||||
{"DATA_TYPE", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, 0},
|
||||
{"CHARACTER_MAXIMUM_LENGTH", 21 , MYSQL_TYPE_LONG, 0, 1, 0},
|
||||
{"CHARACTER_OCTET_LENGTH", 21 , MYSQL_TYPE_LONG, 0, 1, 0},
|
||||
{"NUMERIC_PRECISION", 21 , MYSQL_TYPE_LONG, 0, 1, 0},
|
||||
{"NUMERIC_SCALE", 21 , MYSQL_TYPE_LONG, 0, 1, 0},
|
||||
{"CHARACTER_MAXIMUM_LENGTH", MY_INT64_NUM_DECIMAL_DIGITS , MYSQL_TYPE_LONG, 0, 1,
|
||||
0},
|
||||
{"CHARACTER_OCTET_LENGTH", MY_INT64_NUM_DECIMAL_DIGITS , MYSQL_TYPE_LONG, 0, 1, 0},
|
||||
{"NUMERIC_PRECISION", MY_INT64_NUM_DECIMAL_DIGITS , MYSQL_TYPE_LONG, 0, 1, 0},
|
||||
{"NUMERIC_SCALE", MY_INT64_NUM_DECIMAL_DIGITS , MYSQL_TYPE_LONG, 0, 1, 0},
|
||||
{"CHARACTER_SET_NAME", 64, MYSQL_TYPE_STRING, 0, 1, 0},
|
||||
{"COLLATION_NAME", 64, MYSQL_TYPE_STRING, 0, 1, "Collation"},
|
||||
{"COLUMN_TYPE", 65535, MYSQL_TYPE_STRING, 0, 0, "Type"},
|
||||
|
|
@ -5394,7 +5401,7 @@ ST_FIELD_INFO collation_fields_info[]=
|
|||
{
|
||||
{"COLLATION_NAME", 64, MYSQL_TYPE_STRING, 0, 0, "Collation"},
|
||||
{"CHARACTER_SET_NAME", 64, MYSQL_TYPE_STRING, 0, 0, "Charset"},
|
||||
{"ID", 11, MYSQL_TYPE_LONG, 0, 0, "Id"},
|
||||
{"ID", MY_INT32_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Id"},
|
||||
{"IS_DEFAULT", 3, MYSQL_TYPE_STRING, 0, 0, "Default"},
|
||||
{"IS_COMPILED", 3, MYSQL_TYPE_STRING, 0, 0, "Compiled"},
|
||||
{"SORTLEN", 3 ,MYSQL_TYPE_LONG, 0, 0, "Sortlen"},
|
||||
|
|
@ -5485,7 +5492,7 @@ ST_FIELD_INFO stat_fields_info[]=
|
|||
{"SEQ_IN_INDEX", 2, MYSQL_TYPE_LONG, 0, 0, "Seq_in_index"},
|
||||
{"COLUMN_NAME", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, "Column_name"},
|
||||
{"COLLATION", 1, MYSQL_TYPE_STRING, 0, 1, "Collation"},
|
||||
{"CARDINALITY", 21, MYSQL_TYPE_LONG, 0, 1, "Cardinality"},
|
||||
{"CARDINALITY", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 1, "Cardinality"},
|
||||
{"SUB_PART", 3, MYSQL_TYPE_LONG, 0, 1, "Sub_part"},
|
||||
{"PACKED", 10, MYSQL_TYPE_STRING, 0, 1, "Packed"},
|
||||
{"NULLABLE", 3, MYSQL_TYPE_STRING, 0, 0, "Null"},
|
||||
|
|
|
|||
|
|
@ -6939,7 +6939,8 @@ bool mysql_checksum_table(THD *thd, TABLE_LIST *tables,
|
|||
|
||||
field_list.push_back(item = new Item_empty_string("Table", NAME_LEN*2));
|
||||
item->maybe_null= 1;
|
||||
field_list.push_back(item=new Item_int("Checksum",(longlong) 1,21));
|
||||
field_list.push_back(item= new Item_int("Checksum", (longlong) 1,
|
||||
MY_INT64_NUM_DECIMAL_DIGITS));
|
||||
item->maybe_null= 1;
|
||||
if (protocol->send_fields(&field_list,
|
||||
Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF))
|
||||
|
|
|
|||
|
|
@ -2404,6 +2404,9 @@ sp_decl:
|
|||
{
|
||||
LEX *lex= Lex;
|
||||
sp_head *sp= lex->sphead;
|
||||
|
||||
lex->spcont= lex->spcont->push_context(LABEL_HANDLER_SCOPE);
|
||||
|
||||
sp_pcontext *ctx= lex->spcont;
|
||||
sp_instr_hpush_jump *i=
|
||||
new sp_instr_hpush_jump(sp->instructions(), ctx, $2,
|
||||
|
|
@ -2411,7 +2414,6 @@ sp_decl:
|
|||
|
||||
sp->add_instr(i);
|
||||
sp->push_backpatch(i, ctx->push_label((char *)"", 0));
|
||||
sp->m_flags|= sp_head::IN_HANDLER;
|
||||
}
|
||||
sp_hcond_list sp_proc_stmt
|
||||
{
|
||||
|
|
@ -2435,10 +2437,12 @@ sp_decl:
|
|||
sp->push_backpatch(i, lex->spcont->last_label()); /* Block end */
|
||||
}
|
||||
lex->sphead->backpatch(hlab);
|
||||
sp->m_flags&= ~sp_head::IN_HANDLER;
|
||||
|
||||
lex->spcont= ctx->pop_context();
|
||||
|
||||
$$.vars= $$.conds= $$.curs= 0;
|
||||
$$.hndlrs= $6;
|
||||
ctx->add_handlers($6);
|
||||
lex->spcont->add_handlers($6);
|
||||
}
|
||||
| DECLARE_SYM ident CURSOR_SYM FOR_SYM sp_cursor_stmt
|
||||
{
|
||||
|
|
@ -2504,11 +2508,18 @@ sp_handler_type:
|
|||
;
|
||||
|
||||
sp_hcond_list:
|
||||
sp_hcond_element
|
||||
{ $$= 1; }
|
||||
| sp_hcond_list ',' sp_hcond_element
|
||||
{ $$+= 1; }
|
||||
;
|
||||
|
||||
sp_hcond_element:
|
||||
sp_hcond
|
||||
{
|
||||
LEX *lex= Lex;
|
||||
sp_head *sp= lex->sphead;
|
||||
sp_pcontext *ctx= lex->spcont;
|
||||
sp_pcontext *ctx= lex->spcont->parent_context();
|
||||
|
||||
if (ctx->find_handler($1))
|
||||
{
|
||||
|
|
@ -2522,28 +2533,6 @@ sp_hcond_list:
|
|||
|
||||
i->add_condition($1);
|
||||
ctx->push_handler($1);
|
||||
$$= 1;
|
||||
}
|
||||
}
|
||||
| sp_hcond_list ',' sp_hcond
|
||||
{
|
||||
LEX *lex= Lex;
|
||||
sp_head *sp= lex->sphead;
|
||||
sp_pcontext *ctx= lex->spcont;
|
||||
|
||||
if (ctx->find_handler($3))
|
||||
{
|
||||
my_message(ER_SP_DUP_HANDLER, ER(ER_SP_DUP_HANDLER), MYF(0));
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
else
|
||||
{
|
||||
sp_instr_hpush_jump *i=
|
||||
(sp_instr_hpush_jump *)sp->last_instruction();
|
||||
|
||||
i->add_condition($3);
|
||||
ctx->push_handler($3);
|
||||
$$= $1 + 1;
|
||||
}
|
||||
}
|
||||
;
|
||||
|
|
@ -3122,7 +3111,7 @@ sp_unlabeled_control:
|
|||
sp_label_t *lab= lex->spcont->last_label();
|
||||
|
||||
lab->type= SP_LAB_BEGIN;
|
||||
lex->spcont= lex->spcont->push_context();
|
||||
lex->spcont= lex->spcont->push_context(LABEL_DEFAULT_SCOPE);
|
||||
}
|
||||
sp_decls
|
||||
sp_proc_stmts
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue