Commit 78c162ee authored by unknown's avatar unknown

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


sql/sp.cc:
  Auto merged
sql/sp_head.cc:
  Auto merged
sql/sql_class.cc:
  Auto merged
sql/sql_yacc.yy:
  Auto merged
parents b9121cde ab7b3328
...@@ -253,6 +253,11 @@ then ...@@ -253,6 +253,11 @@ then
c_p="$c_p name char(64) binary DEFAULT '' NOT NULL," 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 type enum('function','procedure') NOT NULL,"
c_p="$c_p body blob DEFAULT '' 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 PRIMARY KEY (name,type)"
c_p="$c_p )" c_p="$c_p )"
c_p="$c_p comment='Stored Procedures';" c_p="$c_p comment='Stored Procedures';"
......
drop table if exists t1,t2; drop table if exists t1,t2;
set @`test`=1,@TEST=3,@select=2,@t5=1.23456; set @`test`=1;
select @test,@`select`,@TEST,@not_used; select @test, @`test`, @TEST, @`TEST`, @"teSt";
@test @`select` @TEST @not_used @test @`test` @TEST @`TEST` @"teSt"
1 2 3 NULL 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; 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; select @test_int,@test_double,@test_string,@test_string2,@select;
@test_int @test_double @test_string @test_string2 @select @test_int @test_double @test_string @test_string2 @select
......
...@@ -5,8 +5,20 @@ ...@@ -5,8 +5,20 @@
drop table if exists t1,t2; drop table if exists t1,t2;
--enable_warnings --enable_warnings
set @`test`=1,@TEST=3,@select=2,@t5=1.23456; # case insensitivity tests (new in 5.0)
select @test,@`select`,@TEST,@not_used; 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; 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; select @test_int,@test_double,@test_string,@test_string2,@select;
set @test_int="hello",@test_double="hello",@test_string="hello",@test_string2="hello"; set @test_int="hello",@test_double="hello",@test_string="hello",@test_string2="hello";
......
...@@ -361,6 +361,11 @@ then ...@@ -361,6 +361,11 @@ then
c_p="$c_p name char(64) binary DEFAULT '' NOT NULL," 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 type enum('function','procedure') NOT NULL,"
c_p="$c_p body blob DEFAULT '' 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 PRIMARY KEY (name,type)"
c_p="$c_p )" c_p="$c_p )"
c_p="$c_p comment='Stored Procedures';" c_p="$c_p comment='Stored Procedures';"
......
...@@ -93,6 +93,14 @@ db_find_routine(THD *thd, int type, char *name, uint namelen, sp_head **sphp) ...@@ -93,6 +93,14 @@ db_find_routine(THD *thd, int type, char *name, uint namelen, sp_head **sphp)
const char *defstr; const char *defstr;
int ret; int ret;
bool opened; 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??? // QQ Set up our own mem_root here???
ret= db_find_routine_aux(thd, type, name, namelen, TL_READ, &table, &opened); 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) ...@@ -103,6 +111,35 @@ db_find_routine(THD *thd, int type, char *name, uint namelen, sp_head **sphp)
ret= SP_GET_FIELD_FAILED; ret= SP_GET_FIELD_FAILED;
goto done; 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) if (opened)
{ {
close_thread_tables(thd, 0, 1); close_thread_tables(thd, 0, 1);
...@@ -113,7 +150,12 @@ db_find_routine(THD *thd, int type, char *name, uint namelen, sp_head **sphp) ...@@ -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) if (yyparse(thd) || thd->is_fatal_error || tmplex->sphead == NULL)
ret= SP_PARSE_ERROR; ret= SP_PARSE_ERROR;
else else
{
*sphp= tmplex->sphead; *sphp= tmplex->sphead;
(*sphp)->sp_set_info((char *) creator, (uint) strlen(creator),
created, modified, suid,
ptr, length);
}
done: done:
if (table && opened) if (table && opened)
...@@ -123,13 +165,15 @@ db_find_routine(THD *thd, int type, char *name, uint namelen, sp_head **sphp) ...@@ -123,13 +165,15 @@ db_find_routine(THD *thd, int type, char *name, uint namelen, sp_head **sphp)
static int static int
db_create_routine(THD *thd, int type, 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_ENTER("db_create_routine");
DBUG_PRINT("enter", ("type: %d name: %*s def: %*s", type, namelen, name, deflen, def)); DBUG_PRINT("enter", ("type: %d name: %*s def: %*s", type, namelen, name, deflen, def));
int ret; int ret;
TABLE *table; TABLE *table;
TABLE_LIST tables; TABLE_LIST tables;
char creator[HOSTNAME_LENGTH+USERNAME_LENGTH+2];
memset(&tables, 0, sizeof(tables)); memset(&tables, 0, sizeof(tables));
tables.db= (char*)"mysql"; tables.db= (char*)"mysql";
...@@ -140,10 +184,16 @@ db_create_routine(THD *thd, int type, ...@@ -140,10 +184,16 @@ db_create_routine(THD *thd, int type,
else else
{ {
restore_record(table, 2); // Get default values for fields 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[0]->store(name, namelen, system_charset_info);
table->field[1]->store((longlong)type); table->field[1]->store((longlong)type);
table->field[2]->store(def, deflen, system_charset_info); 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])) if (table->file->write_row(table->record[0]))
ret= SP_WRITE_ROW_FAILED; ret= SP_WRITE_ROW_FAILED;
...@@ -199,13 +249,15 @@ sp_find_procedure(THD *thd, LEX_STRING *name) ...@@ -199,13 +249,15 @@ sp_find_procedure(THD *thd, LEX_STRING *name)
} }
int 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_ENTER("sp_create_procedure");
DBUG_PRINT("enter", ("name: %*s def: %*s", namelen, name, deflen, def)); DBUG_PRINT("enter", ("name: %*s def: %*s", namelen, name, deflen, def));
int ret; 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); DBUG_RETURN(ret);
} }
...@@ -248,13 +300,15 @@ sp_find_function(THD *thd, LEX_STRING *name) ...@@ -248,13 +300,15 @@ sp_find_function(THD *thd, LEX_STRING *name)
} }
int 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_ENTER("sp_create_function");
DBUG_PRINT("enter", ("name: %*s def: %*s", namelen, name, deflen, def)); DBUG_PRINT("enter", ("name: %*s def: %*s", namelen, name, deflen, def));
int ret; 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); DBUG_RETURN(ret);
} }
......
...@@ -31,7 +31,8 @@ sp_head * ...@@ -31,7 +31,8 @@ sp_head *
sp_find_procedure(THD *thd, LEX_STRING *name); sp_find_procedure(THD *thd, LEX_STRING *name);
int 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 int
sp_drop_procedure(THD *thd, char *name, uint namelen); sp_drop_procedure(THD *thd, char *name, uint namelen);
...@@ -41,7 +42,8 @@ sp_head * ...@@ -41,7 +42,8 @@ sp_head *
sp_find_function(THD *thd, LEX_STRING *name); sp_find_function(THD *thd, LEX_STRING *name);
int 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 int
sp_drop_function(THD *thd, char *name, uint namelen); 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) ...@@ -91,7 +91,7 @@ eval_func_item(THD *thd, Item *it, enum enum_field_types type)
DBUG_RETURN(it); 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) : Sql_alloc(), m_simple_case(FALSE), m_multi_query(FALSE)
{ {
DBUG_ENTER("sp_head::sp_head"); DBUG_ENTER("sp_head::sp_head");
...@@ -102,6 +102,16 @@ sp_head::sp_head(LEX_STRING *name, LEX *lex) ...@@ -102,6 +102,16 @@ sp_head::sp_head(LEX_STRING *name, LEX *lex)
m_name.str= name->str; m_name.str= name->str;
m_defstr.length= lex->end_of_query - lex->buf; m_defstr.length= lex->end_of_query - lex->buf;
m_defstr.str= sql_strmake(dstr, m_defstr.length); 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; m_pcont= lex->spcont;
my_init_dynamic_array(&m_instr, sizeof(sp_instr *), 16, 8); my_init_dynamic_array(&m_instr, sizeof(sp_instr *), 16, 8);
m_backpatch.empty(); m_backpatch.empty();
...@@ -119,11 +129,15 @@ sp_head::create(THD *thd) ...@@ -119,11 +129,15 @@ sp_head::create(THD *thd)
if (m_type == TYPE_ENUM_FUNCTION) if (m_type == TYPE_ENUM_FUNCTION)
ret= sp_create_function(thd, ret= sp_create_function(thd,
m_name.str, m_name.length, 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 else
ret= sp_create_procedure(thd, ret= sp_create_procedure(thd,
m_name.str, m_name.length, 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); DBUG_RETURN(ret);
} }
......
...@@ -54,7 +54,7 @@ class sp_head : public Sql_alloc ...@@ -54,7 +54,7 @@ class sp_head : public Sql_alloc
List<char *> m_tables; // Used tables. List<char *> m_tables; // Used tables.
#endif #endif
sp_head(LEX_STRING *name, LEX *lex); sp_head(LEX_STRING *name, LEX *lex, LEX_STRING *comment, char suid);
int int
create(THD *thd); create(THD *thd);
...@@ -111,10 +111,30 @@ class sp_head : public Sql_alloc ...@@ -111,10 +111,30 @@ class sp_head : public Sql_alloc
return sp_map_result_type(m_returns); 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: private:
LEX_STRING m_name; LEX_STRING m_name;
LEX_STRING m_defstr; 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 sp_pcontext *m_pcont; // Parse context
LEX m_lex; // Temp. store for the other lex LEX m_lex; // Temp. store for the other lex
DYNAMIC_ARRAY m_instr; // The "instructions" DYNAMIC_ARRAY m_instr; // The "instructions"
......
...@@ -152,9 +152,9 @@ THD::THD():user_time(0), is_fatal_error(0), ...@@ -152,9 +152,9 @@ THD::THD():user_time(0), is_fatal_error(0),
bzero((char*) &warn_root,sizeof(warn_root)); bzero((char*) &warn_root,sizeof(warn_root));
init_alloc_root(&warn_root, 1024, 0); init_alloc_root(&warn_root, 1024, 0);
user_connect=(USER_CONN *)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_get_key) get_var_key,
(hash_free_key) free_user_var,0); (hash_free_key) free_user_var, 0);
/* For user vars replication*/ /* For user vars replication*/
if (opt_bin_log) if (opt_bin_log)
...@@ -258,7 +258,7 @@ void THD::change_user(void) ...@@ -258,7 +258,7 @@ void THD::change_user(void)
cleanup(); cleanup();
cleanup_done= 0; cleanup_done= 0;
init(); 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_get_key) get_var_key,
(hash_free_key) free_user_var, 0); (hash_free_key) free_user_var, 0);
} }
......
...@@ -938,7 +938,7 @@ create: ...@@ -938,7 +938,7 @@ create:
YYABORT; YYABORT;
} }
lex->spcont= new sp_pcontext(); 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; lex->sphead->m_type= TYPE_ENUM_PROCEDURE;
/* /*
* We have to turn of CLIENT_MULTI_QUERIES while parsing a * We have to turn of CLIENT_MULTI_QUERIES while parsing a
...@@ -987,7 +987,7 @@ create_function_tail: ...@@ -987,7 +987,7 @@ create_function_tail:
YYABORT; YYABORT;
} }
lex->spcont= new sp_pcontext(); 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; lex->sphead->m_type= TYPE_ENUM_FUNCTION;
/* /*
* We have to turn of CLIENT_MULTI_QUERIES while parsing a * We have to turn of CLIENT_MULTI_QUERIES while parsing a
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment