summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <vva@eagle.mysql.r18.ru>2003-05-14 19:48:58 -0400
committerunknown <vva@eagle.mysql.r18.ru>2003-05-14 19:48:58 -0400
commit78c162ee227bab25025e471a53696acb8fcab49e (patch)
tree4bc3fb71d1ecbcda7ce9a954e021c47f126f3170 /sql
parentb9121cdea38b75aabc5a29a769ee409c962f42e0 (diff)
parentab7b332835e285bfbd3bc6637c8b388e29cae754 (diff)
downloadmariadb-git-78c162ee227bab25025e471a53696acb8fcab49e.tar.gz
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
Diffstat (limited to 'sql')
-rw-r--r--sql/sp.cc64
-rw-r--r--sql/sp.h6
-rw-r--r--sql/sp_head.cc20
-rw-r--r--sql/sp_head.h22
-rw-r--r--sql/sql_class.cc6
-rw-r--r--sql/sql_yacc.yy4
6 files changed, 106 insertions, 16 deletions
diff --git a/sql/sp.cc b/sql/sp.cc
index dff6b63a98c..b1b73f30811 100644
--- a/sql/sp.cc
+++ b/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);
}
diff --git a/sql/sp.h b/sql/sp.h
index 21fcb4c5360..3a021288907 100644
--- a/sql/sp.h
+++ b/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);
diff --git a/sql/sp_head.cc b/sql/sp_head.cc
index 473d27238eb..15a85173f8f 100644
--- a/sql/sp_head.cc
+++ b/sql/sp_head.cc
@@ -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);
}
diff --git a/sql/sp_head.h b/sql/sp_head.h
index b0685ba7ca3..d5bf7138785 100644
--- a/sql/sp_head.h
+++ b/sql/sp_head.h
@@ -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"
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index 5c7091529d8..c64bb7ff8fa 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -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);
}
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 512cce301db..742a834e447 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -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