mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 10:14:19 +01:00
Merge eagle.mysql.r18.ru:/home/vva/work/mysql.orig/clear/mysql-5.0
into eagle.mysql.r18.ru:/home/vva/work/LEX_PTR/mysql-5.0
This commit is contained in:
commit
384b10e2af
10 changed files with 156 additions and 22 deletions
|
@ -253,6 +253,11 @@ then
|
|||
c_p="$c_p name char(64) binary DEFAULT '' NOT NULL,"
|
||||
c_p="$c_p type enum('function','procedure') NOT NULL,"
|
||||
c_p="$c_p body blob DEFAULT '' NOT NULL,"
|
||||
c_p="$c_p creator char(77) binary DEFAULT '' NOT NULL,"
|
||||
c_p="$c_p created timestamp,"
|
||||
c_p="$c_p modified timestamp,"
|
||||
c_p="$c_p suid enum ('N', 'Y') DEFAULT 'Y' NOT NULL,"
|
||||
c_p="$c_p comment char(64) binary DEFAULT '' NOT NULL,"
|
||||
c_p="$c_p PRIMARY KEY (name,type)"
|
||||
c_p="$c_p )"
|
||||
c_p="$c_p comment='Stored Procedures';"
|
||||
|
|
|
@ -1,8 +1,30 @@
|
|||
drop table if exists t1,t2;
|
||||
set @`test`=1,@TEST=3,@select=2,@t5=1.23456;
|
||||
select @test,@`select`,@TEST,@not_used;
|
||||
@test @`select` @TEST @not_used
|
||||
1 2 3 NULL
|
||||
set @`test`=1;
|
||||
select @test, @`test`, @TEST, @`TEST`, @"teSt";
|
||||
@test @`test` @TEST @`TEST` @"teSt"
|
||||
1 1 1 1 1
|
||||
set @TEST=2;
|
||||
select @test, @`test`, @TEST, @`TEST`, @"teSt";
|
||||
@test @`test` @TEST @`TEST` @"teSt"
|
||||
2 2 2 2 2
|
||||
set @"tEST"=3;
|
||||
select @test, @`test`, @TEST, @`TEST`, @"teSt";
|
||||
@test @`test` @TEST @`TEST` @"teSt"
|
||||
3 3 3 3 3
|
||||
set @`TeST`=4;
|
||||
select @test, @`test`, @TEST, @`TEST`, @"teSt";
|
||||
@test @`test` @TEST @`TEST` @"teSt"
|
||||
4 4 4 4 4
|
||||
select @`teST`:=5;
|
||||
@`teST`:=5
|
||||
5
|
||||
select @test, @`test`, @TEST, @`TEST`, @"teSt";
|
||||
@test @`test` @TEST @`TEST` @"teSt"
|
||||
5 5 5 5 5
|
||||
set @select=2,@t5=1.23456;
|
||||
select @`select`,@not_used;
|
||||
@`select` @not_used
|
||||
2 NULL
|
||||
set @test_int=10,@test_double=1e-10,@test_string="abcdeghi",@test_string2="abcdefghij",@select=NULL;
|
||||
select @test_int,@test_double,@test_string,@test_string2,@select;
|
||||
@test_int @test_double @test_string @test_string2 @select
|
||||
|
|
|
@ -5,8 +5,20 @@
|
|||
drop table if exists t1,t2;
|
||||
--enable_warnings
|
||||
|
||||
set @`test`=1,@TEST=3,@select=2,@t5=1.23456;
|
||||
select @test,@`select`,@TEST,@not_used;
|
||||
# case insensitivity tests (new in 5.0)
|
||||
set @`test`=1;
|
||||
select @test, @`test`, @TEST, @`TEST`, @"teSt";
|
||||
set @TEST=2;
|
||||
select @test, @`test`, @TEST, @`TEST`, @"teSt";
|
||||
set @"tEST"=3;
|
||||
select @test, @`test`, @TEST, @`TEST`, @"teSt";
|
||||
set @`TeST`=4;
|
||||
select @test, @`test`, @TEST, @`TEST`, @"teSt";
|
||||
select @`teST`:=5;
|
||||
select @test, @`test`, @TEST, @`TEST`, @"teSt";
|
||||
|
||||
set @select=2,@t5=1.23456;
|
||||
select @`select`,@not_used;
|
||||
set @test_int=10,@test_double=1e-10,@test_string="abcdeghi",@test_string2="abcdefghij",@select=NULL;
|
||||
select @test_int,@test_double,@test_string,@test_string2,@select;
|
||||
set @test_int="hello",@test_double="hello",@test_string="hello",@test_string2="hello";
|
||||
|
|
|
@ -361,6 +361,11 @@ then
|
|||
c_p="$c_p name char(64) binary DEFAULT '' NOT NULL,"
|
||||
c_p="$c_p type enum('function','procedure') NOT NULL,"
|
||||
c_p="$c_p body blob DEFAULT '' NOT NULL,"
|
||||
c_p="$c_p creator char(77) binary DEFAULT '' NOT NULL,"
|
||||
c_p="$c_p created timestamp,"
|
||||
c_p="$c_p modified timestamp,"
|
||||
c_p="$c_p suid enum ('N', 'Y') DEFAULT 'Y' NOT NULL,"
|
||||
c_p="$c_p comment char(64) binary DEFAULT '' NOT NULL,"
|
||||
c_p="$c_p PRIMARY KEY (name,type)"
|
||||
c_p="$c_p )"
|
||||
c_p="$c_p comment='Stored Procedures';"
|
||||
|
|
64
sql/sp.cc
64
sql/sp.cc
|
@ -93,6 +93,14 @@ db_find_routine(THD *thd, int type, char *name, uint namelen, sp_head **sphp)
|
|||
const char *defstr;
|
||||
int ret;
|
||||
bool opened;
|
||||
const char *creator;
|
||||
longlong created;
|
||||
longlong modified;
|
||||
bool suid= 1;
|
||||
char *ptr;
|
||||
uint length;
|
||||
char buff[65];
|
||||
String str(buff,sizeof(buff),&my_charset_bin);
|
||||
|
||||
// QQ Set up our own mem_root here???
|
||||
ret= db_find_routine_aux(thd, type, name, namelen, TL_READ, &table, &opened);
|
||||
|
@ -103,6 +111,35 @@ db_find_routine(THD *thd, int type, char *name, uint namelen, sp_head **sphp)
|
|||
ret= SP_GET_FIELD_FAILED;
|
||||
goto done;
|
||||
}
|
||||
|
||||
//Get additional information
|
||||
if ((creator= get_field(&thd->mem_root, table->field[3])) == NULL)
|
||||
{
|
||||
ret= SP_GET_FIELD_FAILED;
|
||||
goto done;
|
||||
}
|
||||
|
||||
created= table->field[4]->val_int();
|
||||
modified= table->field[5]->val_int();
|
||||
|
||||
if ((ptr= get_field(&thd->mem_root, table->field[6])) == NULL)
|
||||
{
|
||||
ret= SP_GET_FIELD_FAILED;
|
||||
goto done;
|
||||
}
|
||||
if (ptr[0] == 'N')
|
||||
suid= 0;
|
||||
|
||||
table->field[7]->val_str(&str,&str);
|
||||
length=str.length();
|
||||
ptr= 0;
|
||||
if (length)
|
||||
{
|
||||
ptr= (char*) alloc_root(&thd->mem_root,length+1);
|
||||
memcpy(ptr,str.ptr(),(uint) length);
|
||||
ptr[length]=0;
|
||||
}
|
||||
|
||||
if (opened)
|
||||
{
|
||||
close_thread_tables(thd, 0, 1);
|
||||
|
@ -113,7 +150,12 @@ db_find_routine(THD *thd, int type, char *name, uint namelen, sp_head **sphp)
|
|||
if (yyparse(thd) || thd->is_fatal_error || tmplex->sphead == NULL)
|
||||
ret= SP_PARSE_ERROR;
|
||||
else
|
||||
{
|
||||
*sphp= tmplex->sphead;
|
||||
(*sphp)->sp_set_info((char *) creator, (uint) strlen(creator),
|
||||
created, modified, suid,
|
||||
ptr, length);
|
||||
}
|
||||
|
||||
done:
|
||||
if (table && opened)
|
||||
|
@ -123,13 +165,15 @@ db_find_routine(THD *thd, int type, char *name, uint namelen, sp_head **sphp)
|
|||
|
||||
static int
|
||||
db_create_routine(THD *thd, int type,
|
||||
char *name, uint namelen, char *def, uint deflen)
|
||||
char *name, uint namelen, char *def, uint deflen,
|
||||
char *comment, uint commentlen, bool suid)
|
||||
{
|
||||
DBUG_ENTER("db_create_routine");
|
||||
DBUG_PRINT("enter", ("type: %d name: %*s def: %*s", type, namelen, name, deflen, def));
|
||||
int ret;
|
||||
TABLE *table;
|
||||
TABLE_LIST tables;
|
||||
char creator[HOSTNAME_LENGTH+USERNAME_LENGTH+2];
|
||||
|
||||
memset(&tables, 0, sizeof(tables));
|
||||
tables.db= (char*)"mysql";
|
||||
|
@ -140,10 +184,16 @@ db_create_routine(THD *thd, int type,
|
|||
else
|
||||
{
|
||||
restore_record(table, 2); // Get default values for fields
|
||||
strxmov(creator, thd->user, "@", thd->host_or_ip, NullS);
|
||||
|
||||
table->field[0]->store(name, namelen, system_charset_info);
|
||||
table->field[1]->store((longlong)type);
|
||||
table->field[2]->store(def, deflen, system_charset_info);
|
||||
table->field[3]->store(creator, (uint) strlen(creator), system_charset_info);
|
||||
if (suid)
|
||||
table->field[6]->store((longlong) suid);
|
||||
if (comment)
|
||||
table->field[7]->store(comment, commentlen, system_charset_info);
|
||||
|
||||
if (table->file->write_row(table->record[0]))
|
||||
ret= SP_WRITE_ROW_FAILED;
|
||||
|
@ -199,13 +249,15 @@ sp_find_procedure(THD *thd, LEX_STRING *name)
|
|||
}
|
||||
|
||||
int
|
||||
sp_create_procedure(THD *thd, char *name, uint namelen, char *def, uint deflen)
|
||||
sp_create_procedure(THD *thd, char *name, uint namelen, char *def, uint deflen,
|
||||
char *comment, uint commentlen, bool suid)
|
||||
{
|
||||
DBUG_ENTER("sp_create_procedure");
|
||||
DBUG_PRINT("enter", ("name: %*s def: %*s", namelen, name, deflen, def));
|
||||
int ret;
|
||||
|
||||
ret= db_create_routine(thd, TYPE_ENUM_PROCEDURE, name, namelen, def, deflen);
|
||||
ret= db_create_routine(thd, TYPE_ENUM_PROCEDURE, name, namelen, def, deflen,
|
||||
comment, commentlen, suid);
|
||||
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
|
@ -248,13 +300,15 @@ sp_find_function(THD *thd, LEX_STRING *name)
|
|||
}
|
||||
|
||||
int
|
||||
sp_create_function(THD *thd, char *name, uint namelen, char *def, uint deflen)
|
||||
sp_create_function(THD *thd, char *name, uint namelen, char *def, uint deflen,
|
||||
char *comment, uint commentlen, bool suid)
|
||||
{
|
||||
DBUG_ENTER("sp_create_function");
|
||||
DBUG_PRINT("enter", ("name: %*s def: %*s", namelen, name, deflen, def));
|
||||
int ret;
|
||||
|
||||
ret= db_create_routine(thd, TYPE_ENUM_FUNCTION, name, namelen, def, deflen);
|
||||
ret= db_create_routine(thd, TYPE_ENUM_FUNCTION, name, namelen, def, deflen,
|
||||
comment, commentlen, suid);
|
||||
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
|
|
6
sql/sp.h
6
sql/sp.h
|
@ -31,7 +31,8 @@ sp_head *
|
|||
sp_find_procedure(THD *thd, LEX_STRING *name);
|
||||
|
||||
int
|
||||
sp_create_procedure(THD *thd, char *name, uint namelen, char *def, uint deflen);
|
||||
sp_create_procedure(THD *thd, char *name, uint namelen, char *def, uint deflen,
|
||||
char *comment, uint commentlen, bool suid);
|
||||
|
||||
int
|
||||
sp_drop_procedure(THD *thd, char *name, uint namelen);
|
||||
|
@ -41,7 +42,8 @@ sp_head *
|
|||
sp_find_function(THD *thd, LEX_STRING *name);
|
||||
|
||||
int
|
||||
sp_create_function(THD *thd, char *name, uint namelen, char *def, uint deflen);
|
||||
sp_create_function(THD *thd, char *name, uint namelen, char *def, uint deflen,
|
||||
char *comment, uint commentlen, bool suid);
|
||||
|
||||
int
|
||||
sp_drop_function(THD *thd, char *name, uint namelen);
|
||||
|
|
|
@ -91,7 +91,7 @@ eval_func_item(THD *thd, Item *it, enum enum_field_types type)
|
|||
DBUG_RETURN(it);
|
||||
}
|
||||
|
||||
sp_head::sp_head(LEX_STRING *name, LEX *lex)
|
||||
sp_head::sp_head(LEX_STRING *name, LEX *lex, LEX_STRING *comment, char suid)
|
||||
: Sql_alloc(), m_simple_case(FALSE), m_multi_query(FALSE)
|
||||
{
|
||||
DBUG_ENTER("sp_head::sp_head");
|
||||
|
@ -102,6 +102,16 @@ sp_head::sp_head(LEX_STRING *name, LEX *lex)
|
|||
m_name.str= name->str;
|
||||
m_defstr.length= lex->end_of_query - lex->buf;
|
||||
m_defstr.str= sql_strmake(dstr, m_defstr.length);
|
||||
|
||||
m_comment.length= 0;
|
||||
m_comment.str= 0;
|
||||
if (comment)
|
||||
{
|
||||
m_comment.length= comment->length;
|
||||
m_comment.str= comment->str;
|
||||
}
|
||||
|
||||
m_suid= suid;
|
||||
m_pcont= lex->spcont;
|
||||
my_init_dynamic_array(&m_instr, sizeof(sp_instr *), 16, 8);
|
||||
m_backpatch.empty();
|
||||
|
@ -119,11 +129,15 @@ sp_head::create(THD *thd)
|
|||
if (m_type == TYPE_ENUM_FUNCTION)
|
||||
ret= sp_create_function(thd,
|
||||
m_name.str, m_name.length,
|
||||
m_defstr.str, m_defstr.length);
|
||||
m_defstr.str, m_defstr.length,
|
||||
m_comment.str, m_comment.length,
|
||||
m_suid);
|
||||
else
|
||||
ret= sp_create_procedure(thd,
|
||||
m_name.str, m_name.length,
|
||||
m_defstr.str, m_defstr.length);
|
||||
m_defstr.str, m_defstr.length,
|
||||
m_comment.str, m_comment.length,
|
||||
m_suid);
|
||||
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
|
|
|
@ -54,7 +54,7 @@ public:
|
|||
List<char *> m_tables; // Used tables.
|
||||
#endif
|
||||
|
||||
sp_head(LEX_STRING *name, LEX *lex);
|
||||
sp_head(LEX_STRING *name, LEX *lex, LEX_STRING *comment, char suid);
|
||||
|
||||
int
|
||||
create(THD *thd);
|
||||
|
@ -111,10 +111,30 @@ public:
|
|||
return sp_map_result_type(m_returns);
|
||||
}
|
||||
|
||||
void sp_set_info(char *creator, uint creatorlen,
|
||||
longlong created, longlong modified,
|
||||
bool suid, char *comment, uint commentlen)
|
||||
{
|
||||
m_creator= creator;
|
||||
m_creatorlen= creatorlen;
|
||||
m_created= created;
|
||||
m_modified= modified;
|
||||
m_comment.length= commentlen;
|
||||
m_comment.str= comment;
|
||||
m_suid= suid;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
LEX_STRING m_name;
|
||||
LEX_STRING m_defstr;
|
||||
LEX_STRING m_comment;
|
||||
char *m_creator;
|
||||
uint m_creatorlen;
|
||||
longlong m_created;
|
||||
longlong m_modified;
|
||||
bool m_suid;
|
||||
|
||||
sp_pcontext *m_pcont; // Parse context
|
||||
LEX m_lex; // Temp. store for the other lex
|
||||
DYNAMIC_ARRAY m_instr; // The "instructions"
|
||||
|
|
|
@ -152,9 +152,9 @@ THD::THD():user_time(0), is_fatal_error(0),
|
|||
bzero((char*) &warn_root,sizeof(warn_root));
|
||||
init_alloc_root(&warn_root, 1024, 0);
|
||||
user_connect=(USER_CONN *)0;
|
||||
hash_init(&user_vars, &my_charset_bin, USER_VARS_HASH_SIZE, 0, 0,
|
||||
hash_init(&user_vars, system_charset_info, USER_VARS_HASH_SIZE, 0, 0,
|
||||
(hash_get_key) get_var_key,
|
||||
(hash_free_key) free_user_var,0);
|
||||
(hash_free_key) free_user_var, 0);
|
||||
|
||||
/* For user vars replication*/
|
||||
if (opt_bin_log)
|
||||
|
@ -258,7 +258,7 @@ void THD::change_user(void)
|
|||
cleanup();
|
||||
cleanup_done= 0;
|
||||
init();
|
||||
hash_init(&user_vars, &my_charset_bin, USER_VARS_HASH_SIZE, 0, 0,
|
||||
hash_init(&user_vars, system_charset_info, USER_VARS_HASH_SIZE, 0, 0,
|
||||
(hash_get_key) get_var_key,
|
||||
(hash_free_key) free_user_var, 0);
|
||||
}
|
||||
|
|
|
@ -938,7 +938,7 @@ create:
|
|||
YYABORT;
|
||||
}
|
||||
lex->spcont= new sp_pcontext();
|
||||
lex->sphead= new sp_head(&$3, lex);
|
||||
lex->sphead= new sp_head(&$3, lex, 0, 0);
|
||||
lex->sphead->m_type= TYPE_ENUM_PROCEDURE;
|
||||
/*
|
||||
* We have to turn of CLIENT_MULTI_QUERIES while parsing a
|
||||
|
@ -987,7 +987,7 @@ create_function_tail:
|
|||
YYABORT;
|
||||
}
|
||||
lex->spcont= new sp_pcontext();
|
||||
lex->sphead= new sp_head(&lex->udf.name, lex);
|
||||
lex->sphead= new sp_head(&lex->udf.name, lex, 0, 0);
|
||||
lex->sphead->m_type= TYPE_ENUM_FUNCTION;
|
||||
/*
|
||||
* We have to turn of CLIENT_MULTI_QUERIES while parsing a
|
||||
|
|
Loading…
Add table
Reference in a new issue