diff options
author | unknown <gluh@gluh.mysql.r18.ru> | 2003-05-06 21:09:20 +0500 |
---|---|---|
committer | unknown <gluh@gluh.mysql.r18.ru> | 2003-05-06 21:09:20 +0500 |
commit | fb5df27adf58998f5e2a4a66d1634003cd106af2 (patch) | |
tree | fb4c2640f7b2c3d485d1e63a93e7afeb4dfb397f | |
parent | 0e891786615356dbc9bca3c5132e259e92b89ad9 (diff) | |
download | mariadb-git-fb5df27adf58998f5e2a4a66d1634003cd106af2.tar.gz |
Expand the mysql.proc table
-rw-r--r-- | mysql-test/install_test_db.sh | 5 | ||||
-rw-r--r-- | scripts/mysql_install_db.sh | 5 | ||||
-rw-r--r-- | sql/sp.cc | 64 | ||||
-rw-r--r-- | sql/sp.h | 6 | ||||
-rw-r--r-- | sql/sp_head.cc | 20 | ||||
-rw-r--r-- | sql/sp_head.h | 22 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 4 |
7 files changed, 113 insertions, 13 deletions
diff --git a/mysql-test/install_test_db.sh b/mysql-test/install_test_db.sh index ed3b0fd683e..8477a0cd66d 100644 --- a/mysql-test/install_test_db.sh +++ b/mysql-test/install_test_db.sh @@ -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';" diff --git a/scripts/mysql_install_db.sh b/scripts/mysql_install_db.sh index 0ce45c8d114..9e7032244cc 100644 --- a/scripts/mysql_install_db.sh +++ b/scripts/mysql_install_db.sh @@ -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';" 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); } @@ -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 |