summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <gluh@gluh.mysql.r18.ru>2003-05-06 21:09:20 +0500
committerunknown <gluh@gluh.mysql.r18.ru>2003-05-06 21:09:20 +0500
commitfb5df27adf58998f5e2a4a66d1634003cd106af2 (patch)
treefb4c2640f7b2c3d485d1e63a93e7afeb4dfb397f /sql
parent0e891786615356dbc9bca3c5132e259e92b89ad9 (diff)
downloadmariadb-git-fb5df27adf58998f5e2a4a66d1634003cd106af2.tar.gz
Expand the mysql.proc table
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_yacc.yy4
5 files changed, 103 insertions, 13 deletions
diff --git a/sql/sp.cc b/sql/sp.cc
index 0d6a7b99e32..7bca9977f0c 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 3bd958cfba9..11fedb1a294 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_yacc.yy b/sql/sql_yacc.yy
index d1ed240e317..6c3557145be 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