diff options
author | unknown <vva@eagle.mysql.r18.ru> | 2003-05-14 19:48:58 -0400 |
---|---|---|
committer | unknown <vva@eagle.mysql.r18.ru> | 2003-05-14 19:48:58 -0400 |
commit | 78c162ee227bab25025e471a53696acb8fcab49e (patch) | |
tree | 4bc3fb71d1ecbcda7ce9a954e021c47f126f3170 /sql | |
parent | b9121cdea38b75aabc5a29a769ee409c962f42e0 (diff) | |
parent | ab7b332835e285bfbd3bc6637c8b388e29cae754 (diff) | |
download | mariadb-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.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_class.cc | 6 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 4 |
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); } @@ -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 |