diff options
author | unknown <monty@mishka.local> | 2005-08-22 16:06:00 +0300 |
---|---|---|
committer | unknown <monty@mishka.local> | 2005-08-22 16:06:00 +0300 |
commit | eb9b3fdc3fd5095757c4d5101d7ca4a6b2f99712 (patch) | |
tree | 29fb5aee9e4a601d756720de950f79efd75701b1 | |
parent | 781540830b943d0be12c254b54975c59e626b4b2 (diff) | |
parent | 72340a481a4706674780b898b81a1850a6654d3d (diff) | |
download | mariadb-git-eb9b3fdc3fd5095757c4d5101d7ca4a6b2f99712.tar.gz |
Merge bk-internal.mysql.com:/home/bk/mysql-5.0
into mishka.local:/home/my/mysql-5.0
mysql-test/r/information_schema.result:
Auto merged
sql/mysqld.cc:
Auto merged
sql/sql_show.cc:
Auto merged
-rw-r--r-- | include/my_global.h | 14 | ||||
-rw-r--r-- | mysql-test/r/information_schema.result | 4 | ||||
-rw-r--r-- | mysql-test/r/sp-security.result | 2 | ||||
-rw-r--r-- | mysql-test/t/information_schema.test | 1 | ||||
-rw-r--r-- | mysql-test/t/sp-security.test | 6 | ||||
-rw-r--r-- | sql/item_cmpfunc.cc | 3 | ||||
-rw-r--r-- | sql/mysqld.cc | 3 | ||||
-rw-r--r-- | sql/sp_head.cc | 254 | ||||
-rw-r--r-- | sql/sql_base.cc | 15 | ||||
-rw-r--r-- | sql/sql_db.cc | 22 | ||||
-rw-r--r-- | sql/sql_lex.cc | 2 | ||||
-rw-r--r-- | sql/sql_parse.cc | 9 | ||||
-rw-r--r-- | sql/sql_show.cc | 371 | ||||
-rw-r--r-- | sql/sql_view.cc | 2 | ||||
-rw-r--r-- | sql/table.cc | 14 |
15 files changed, 377 insertions, 345 deletions
diff --git a/include/my_global.h b/include/my_global.h index 2546dde754d..95d0b983b72 100644 --- a/include/my_global.h +++ b/include/my_global.h @@ -933,10 +933,10 @@ typedef char bool; /* Ordinary boolean values 0 1 */ (ABSTIME).ts_nsec=0; \ } #define set_timespec_nsec(ABSTIME,NSEC) \ -{\ - ulonglong now= my_getsystime(); \ - (ABSTIME).ts_sec= (now / ULL(10000000)) + (NSEC / ULL(1000000000)); \ - (ABSTIME).ts_nsec= (now % ULL(10000000)) * 100 + (NSEC % ULL(1000000000)); \ +{ \ + ulonglong now= my_getsystime() + (NSEC/100); \ + (ABSTIME).ts_sec= (now / ULL(10000000)); \ + (ABSTIME).ts_nsec= (now % ULL(10000000) * 100 + ((NSEC) % 100)); \ } #else #define set_timespec(ABSTIME,SEC) \ @@ -948,9 +948,9 @@ typedef char bool; /* Ordinary boolean values 0 1 */ } #define set_timespec_nsec(ABSTIME,NSEC) \ {\ - ulonglong now= my_getsystime(); \ - (ABSTIME).tv_sec= (now / ULL(10000000)) + (NSEC / ULL(1000000000)); \ - (ABSTIME).tv_nsec= (now % ULL(10000000)) * 100 + (NSEC % ULL(1000000000)); \ + ulonglong now= my_getsystime() + (NSEC/100); \ + (ABSTIME).tv_sec= (now / ULL(10000000)); \ + (ABSTIME).tv_nsec= (now % ULL(10000000) * 100 + ((NSEC) % 100)); \ } #endif /* HAVE_TIMESPEC_TS_SEC */ #endif /* set_timespec */ diff --git a/mysql-test/r/information_schema.result b/mysql-test/r/information_schema.result index 3f1e94c9e5f..404a20d5e9e 100644 --- a/mysql-test/r/information_schema.result +++ b/mysql-test/r/information_schema.result @@ -966,4 +966,8 @@ column_name column_default a NULL b NULL use test; +show columns from t1; +Field Type Null Key Default Extra +a int(11) NO +b int(11) YES NULL drop table t1; diff --git a/mysql-test/r/sp-security.result b/mysql-test/r/sp-security.result index d78f5fc36ea..eb2e2ce334e 100644 --- a/mysql-test/r/sp-security.result +++ b/mysql-test/r/sp-security.result @@ -245,6 +245,8 @@ end// grant usage on *.* to mysqltest_1@localhost; call mysqltest_1.p1(); ERROR 42000: execute command denied to user 'mysqltest_1'@'localhost' for routine 'mysqltest_1.p1' +call mysqltest_1.p1(); +ERROR 42000: execute command denied to user 'mysqltest_1'@'localhost' for routine 'mysqltest_1.p1' drop procedure mysqltest_1.p1; drop database mysqltest_1; revoke usage on *.* from mysqltest_1@localhost; diff --git a/mysql-test/t/information_schema.test b/mysql-test/t/information_schema.test index 03810447299..04d53828035 100644 --- a/mysql-test/t/information_schema.test +++ b/mysql-test/t/information_schema.test @@ -649,4 +649,5 @@ use information_schema; select column_name, column_default from columns where table_schema='test' and table_name='t1'; use test; +show columns from t1; drop table t1; diff --git a/mysql-test/t/sp-security.test b/mysql-test/t/sp-security.test index c7c7ef20a5b..6f1332f80d5 100644 --- a/mysql-test/t/sp-security.test +++ b/mysql-test/t/sp-security.test @@ -397,6 +397,12 @@ connection n1; --error 1370 call mysqltest_1.p1(); disconnect n1; +# Test also without a current database +connect (n2,localhost,mysqltest_1,,*NO-ONE*,$MASTER_MYPORT,$MASTER_MYSOCK); +connection n2; +--error 1370 +call mysqltest_1.p1(); +disconnect n2; connection default; diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 1bae5f1c9af..9443a2949d8 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -630,7 +630,7 @@ int Arg_comparator::compare_row() owner->null_value= 0; res= 0; // continue comparison (maybe we will meet explicit difference) } - if (res) + else if (res) return res; } if (was_null) @@ -645,6 +645,7 @@ int Arg_comparator::compare_row() return 0; } + int Arg_comparator::compare_e_row() { (*a)->bring_value(); diff --git a/sql/mysqld.cc b/sql/mysqld.cc index e58fa669130..5288fc04294 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -730,7 +730,8 @@ static void close_connections(void) DBUG_PRINT("quit",("Informing thread %ld that it's time to die", tmp->thread_id)); /* We skip slave threads on this first loop through. */ - if (tmp->slave_thread) continue; + if (tmp->slave_thread) + continue; tmp->killed= THD::KILL_CONNECTION; if (tmp->mysys_var) diff --git a/sql/sp_head.cc b/sql/sp_head.cc index f119ef1ec22..ebcbfb67fc8 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -127,16 +127,17 @@ sp_prepare_func_item(THD* thd, Item **it_addr) /* Macro to switch arena in sp_eval_func_item */ -#define CREATE_ON_CALLERS_ARENA(new_command, condition, backup_arena) do\ - {\ - if (condition) \ - thd->set_n_backup_item_arena(thd->spcont->callers_arena,\ - backup_arena);\ - new_command;\ - if (condition)\ - thd->restore_backup_item_arena(thd->spcont->callers_arena,\ - &backup_current_arena);\ - } while(0) +#define CREATE_ON_CALLERS_ARENA(new_command, condition, backup_arena) \ + do \ + { \ + if (condition) \ + thd->set_n_backup_item_arena(thd->spcont->callers_arena, \ + backup_arena); \ + new_command; \ + if (condition) \ + thd->restore_backup_item_arena(thd->spcont->callers_arena, \ + &backup_current_arena); \ + } while(0) /* Evaluate an item and store it in the returned item @@ -174,88 +175,82 @@ sp_eval_func_item(THD *thd, Item **it_addr, enum enum_field_types type, DBUG_RETURN(NULL); } - /* QQ How do we do this? Is there some better way? */ - if (type == MYSQL_TYPE_NULL) - goto return_null_item; - switch (sp_map_result_type(type)) { case INT_RESULT: - { - longlong i= it->val_int(); + { + longlong i= it->val_int(); - if (it->null_value) - { - DBUG_PRINT("info", ("INT_RESULT: null")); - goto return_null_item; - } - else - { - DBUG_PRINT("info", ("INT_RESULT: %d", i)); - CREATE_ON_CALLERS_ARENA(it= new(reuse, &rsize) Item_int(i), - use_callers_arena, &backup_current_arena); - } - break; + if (it->null_value) + { + DBUG_PRINT("info", ("INT_RESULT: null")); + goto return_null_item; } + DBUG_PRINT("info", ("INT_RESULT: %d", i)); + CREATE_ON_CALLERS_ARENA(it= new(reuse, &rsize) Item_int(i), + use_callers_arena, &backup_current_arena); + break; + } case REAL_RESULT: - { - double d= it->val_real(); + { + double d= it->val_real(); + uint8 decimals; + uint32 max_length; - if (it->null_value) - { - DBUG_PRINT("info", ("REAL_RESULT: null")); - goto return_null_item; - } - else - { - /* There's some difference between Item::new_item() and the - * constructor; the former crashes, the latter works... weird. */ - uint8 decimals= it->decimals; - uint32 max_length= it->max_length; - DBUG_PRINT("info", ("REAL_RESULT: %g", d)); - CREATE_ON_CALLERS_ARENA(it= new(reuse, &rsize) Item_float(d), - use_callers_arena, &backup_current_arena); - it->decimals= decimals; - it->max_length= max_length; - } - break; + if (it->null_value) + { + DBUG_PRINT("info", ("REAL_RESULT: null")); + goto return_null_item; } + + /* + There's some difference between Item::new_item() and the + constructor; the former crashes, the latter works... weird. + */ + decimals= it->decimals; + max_length= it->max_length; + DBUG_PRINT("info", ("REAL_RESULT: %g", d)); + CREATE_ON_CALLERS_ARENA(it= new(reuse, &rsize) Item_float(d), + use_callers_arena, &backup_current_arena); + it->decimals= decimals; + it->max_length= max_length; + break; + } case DECIMAL_RESULT: - { - my_decimal value, *val= it->val_decimal(&value); - if (it->null_value) - goto return_null_item; - else - CREATE_ON_CALLERS_ARENA(it= new(reuse, &rsize) Item_decimal(val), - use_callers_arena, &backup_current_arena); + { + my_decimal value, *val= it->val_decimal(&value); + if (it->null_value) + goto return_null_item; + CREATE_ON_CALLERS_ARENA(it= new(reuse, &rsize) Item_decimal(val), + use_callers_arena, &backup_current_arena); #ifndef DBUG_OFF + { char dbug_buff[DECIMAL_MAX_STR_LENGTH+1]; - DBUG_PRINT("info", ("DECIMAL_RESULT: %s", dbug_decimal_as_string(dbug_buff, val))); + DBUG_PRINT("info", ("DECIMAL_RESULT: %s", + dbug_decimal_as_string(dbug_buff, val))); #endif - break; } + break; + } case STRING_RESULT: - { - char buffer[MAX_FIELD_WIDTH]; - String tmp(buffer, sizeof(buffer), it->collation.collation); - String *s= it->val_str(&tmp); + { + char buffer[MAX_FIELD_WIDTH]; + String tmp(buffer, sizeof(buffer), it->collation.collation); + String *s= it->val_str(&tmp); - if (it->null_value) - { - DBUG_PRINT("info", ("default result: null")); - goto return_null_item; - } - else - { - DBUG_PRINT("info",("default result: %*s", - s->length(), s->c_ptr_quick())); - CREATE_ON_CALLERS_ARENA(it= new(reuse, &rsize) - Item_string(thd->strmake(s->ptr(), - s->length()), s->length(), - it->collation.collation), - use_callers_arena, &backup_current_arena); - } - break; + if (type == MYSQL_TYPE_NULL || it->null_value) + { + DBUG_PRINT("info", ("STRING_RESULT: null")); + goto return_null_item; } + DBUG_PRINT("info",("STRING_RESULT: %*s", + s->length(), s->c_ptr_quick())); + CREATE_ON_CALLERS_ARENA(it= new(reuse, &rsize) + Item_string(thd->strmake(s->ptr(), + s->length()), s->length(), + it->collation.collation), + use_callers_arena, &backup_current_arena); + break; + } case ROW_RESULT: default: DBUG_ASSERT(0); @@ -574,13 +569,10 @@ sp_head::destroy() /* - * This is only used for result fields from functions (both during - * fix_length_and_dec() and evaluation). - * - * Since the current mem_root during a will be freed and the result - * field will be used by the caller, we have to put it in the caller's - * or main mem_root. - */ + This is only used for result fields from functions (both during + fix_length_and_dec() and evaluation). +*/ + Field * sp_head::make_field(uint max_length, const char *name, TABLE *dummy) { @@ -817,47 +809,49 @@ sp_head::execute_function(THD *thd, Item **argp, uint argcount, Item **resp) sp_rcontext *octx = thd->spcont; sp_rcontext *nctx = NULL; uint i; - int ret; + Item_null *nit; + int ret= -1; // Assume error if (argcount != params) { /* - Need to use my_printf_error here, or it will not terminate the + Need to use my_error here, or it will not terminate the invoking query properly. */ my_error(ER_SP_WRONG_NO_OF_ARGS, MYF(0), "FUNCTION", m_qname.str, params, argcount); - DBUG_RETURN(-1); + goto end; } // QQ Should have some error checking here? (types, etc...) - nctx= new sp_rcontext(csize, hmax, cmax); + if (!(nctx= new sp_rcontext(csize, hmax, cmax))) + goto end; for (i= 0 ; i < argcount ; i++) { sp_pvar_t *pvar = m_pcont->find_pvar(i); Item *it= sp_eval_func_item(thd, argp++, pvar->type, NULL, FALSE); - if (it) - nctx->push_item(it); - else - { - DBUG_RETURN(-1); - } + if (!it) + goto end; // EOM error + nctx->push_item(it); } + /* The rest of the frame are local variables which are all IN. Default all variables to null (those with default clauses will be set by an set instruction). */ + + nit= NULL; // Re-use this, and only create if needed + for (; i < csize ; i++) { - Item_null *nit= NULL; // Re-use this, and only create if needed - for (; i < csize ; i++) + if (! nit) { - if (! nit) - nit= new Item_null(); - nctx->push_item(nit); + if (!(nit= new Item_null())) + DBUG_RETURN(-1); } + nctx->push_item(nit); } thd->spcont= nctx; @@ -878,14 +872,15 @@ sp_head::execute_function(THD *thd, Item **argp, uint argcount, Item **resp) } nctx->pop_all_cursors(); // To avoid memory leaks after an error - delete nctx; + delete nctx; // Doesn't do anything thd->spcont= octx; +end: DBUG_RETURN(ret); } -static Item_func_get_user_var * -item_is_user_var(Item *it) + +static Item_func_get_user_var *item_is_user_var(Item *it) { if (it->type() == Item::FUNC_ITEM) { @@ -897,19 +892,18 @@ item_is_user_var(Item *it) return NULL; } -int -sp_head::execute_procedure(THD *thd, List<Item> *args) + +int sp_head::execute_procedure(THD *thd, List<Item> *args) { - DBUG_ENTER("sp_head::execute_procedure"); - DBUG_PRINT("info", ("procedure %s", m_name.str)); int ret= 0; uint csize = m_pcont->max_pvars(); uint params = m_pcont->current_pvars(); uint hmax = m_pcont->max_handlers(); uint cmax = m_pcont->max_cursors(); - sp_rcontext *octx = thd->spcont; + sp_rcontext *save_spcont, *octx; sp_rcontext *nctx = NULL; - my_bool is_tmp_octx = FALSE; // True if we have allocated a temporary octx + DBUG_ENTER("sp_head::execute_procedure"); + DBUG_PRINT("info", ("procedure %s", m_name.str)); if (args->elements != params) { @@ -918,17 +912,22 @@ sp_head::execute_procedure(THD *thd, List<Item> *args) DBUG_RETURN(-1); } + save_spcont= octx= thd->spcont; if (! octx) { // Create a temporary old context - octx= new sp_rcontext(csize, hmax, cmax); - is_tmp_octx= TRUE; + if (!(octx= new sp_rcontext(csize, hmax, cmax))) + DBUG_RETURN(-1); thd->spcont= octx; /* set callers_arena to thd, for upper-level function to work */ thd->spcont->callers_arena= thd; } - nctx= new sp_rcontext(csize, hmax, cmax); + if (!(nctx= new sp_rcontext(csize, hmax, cmax))) + { + thd->spcont= save_spcont; + DBUG_RETURN(-1); + } if (csize > 0 || hmax > 0 || cmax > 0) { @@ -937,7 +936,6 @@ sp_head::execute_procedure(THD *thd, List<Item> *args) List_iterator<Item> li(*args); Item *it; - /* Evaluate SP arguments (i.e. get the values passed as parameters) */ // QQ: Should do type checking? DBUG_PRINT("info",(" %.*s: eval args", m_name.length, m_name.str)); @@ -959,20 +957,25 @@ sp_head::execute_procedure(THD *thd, List<Item> *args) if (pvar->mode == sp_param_out) { if (! nit) - nit= new Item_null(); + { + if (!(nit= new Item_null())) + { + ret= -1; + break; + } + } nctx->push_item(nit); // OUT } else { Item *it2= sp_eval_func_item(thd, li.ref(), pvar->type, NULL, FALSE); - if (it2) - nctx->push_item(it2); // IN or INOUT - else + if (!it2) { ret= -1; // Eval failed break; } + nctx->push_item(it2); // IN or INOUT } } } @@ -994,7 +997,13 @@ sp_head::execute_procedure(THD *thd, List<Item> *args) for (; i < csize ; i++) { if (! nit) - nit= new Item_null(); + { + if (!(nit= new Item_null())) + { + ret= -1; + break; + } + } nctx->push_item(nit); } } @@ -1090,15 +1099,12 @@ sp_head::execute_procedure(THD *thd, List<Item> *args) } } - if (is_tmp_octx) - { - delete octx; /* call destructor */ - octx= NULL; - } + if (!save_spcont) + delete octx; // Does nothing nctx->pop_all_cursors(); // To avoid memory leaks after an error - delete nctx; - thd->spcont= octx; + delete nctx; // Does nothing + thd->spcont= save_spcont; DBUG_RETURN(ret); } diff --git a/sql/sql_base.cc b/sql/sql_base.cc index b8748b89fbd..186d5984dcd 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -150,14 +150,10 @@ OPEN_TABLE_LIST *list_open_tables(THD *thd, const char *db, const char *wild) DBUG_ASSERT(share->table_name != 0); if ((!share->table_name)) // To be removed continue; // Shouldn't happen - if (db && my_strcasecmp(system_charset_info, db, share->table_cache_key)) + if (db && my_strcasecmp(system_charset_info, db, share->db)) + continue; + if (wild && wild_compare(share->table_name,wild,0)) continue; - - if (wild) - { - if (wild_compare(share->table_name,wild,0)) - continue; - } /* Check if user has SELECT privilege for any column in the table */ table_list.db= (char*) share->db; @@ -3367,7 +3363,7 @@ static bool set_new_item_local_context(THD *thd, Item_ident *item, TABLE_LIST *table_ref) { Name_resolution_context *context; - if (!(context= new Name_resolution_context)) + if (!(context= new (thd->mem_root) Name_resolution_context)) return TRUE; context->init(); context->first_name_resolution_table= @@ -3801,7 +3797,6 @@ store_top_level_join_columns(THD *thd, TABLE_LIST *table_ref, if (cur_left_neighbor && cur_table_ref->outer_join & JOIN_TYPE_RIGHT) { - DBUG_ASSERT(cur_table_ref); /* This can happen only for JOIN ... ON. */ DBUG_ASSERT(table_ref->nested_join->join_list.elements == 2); swap_variables(TABLE_LIST*, cur_left_neighbor, cur_table_ref); @@ -3811,7 +3806,7 @@ store_top_level_join_columns(THD *thd, TABLE_LIST *table_ref, store_top_level_join_columns(thd, cur_table_ref, cur_left_neighbor, cur_right_neighbor)) DBUG_RETURN(TRUE); - cur_right_neighbor= cur_table_ref; + cur_right_neighbor= cur_table_ref; } } diff --git a/sql/sql_db.cc b/sql/sql_db.cc index 67fc1053774..874dfd5f975 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -998,7 +998,7 @@ err: mysql_change_db() thd Thread handler name Databasename - no_access_check True= don't do access check + no_access_check True don't do access check. In this case name may be "" DESCRIPTION Becasue the database name may have been given directly from the @@ -1025,14 +1025,22 @@ bool mysql_change_db(THD *thd, const char *name, bool no_access_check) char *dbname=my_strdup((char*) name,MYF(MY_WME)); char path[FN_REFLEN]; HA_CREATE_INFO create; - bool schema_db= 0; + bool system_db= 0; #ifndef NO_EMBEDDED_ACCESS_CHECKS ulong db_access; #endif DBUG_ENTER("mysql_change_db"); + DBUG_PRINT("enter",("name: '%s'",name)); + /* dbname can only be NULL if malloc failed */ if (!dbname || !(db_length= strlen(dbname))) { + if (no_access_check && dbname) + { + /* Called from SP when orignal database was not set */ + system_db= 1; + goto end; + } x_free(dbname); /* purecov: inspected */ my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0)); /* purecov: inspected */ @@ -1047,7 +1055,7 @@ bool mysql_change_db(THD *thd, const char *name, bool no_access_check) DBUG_PRINT("info",("Use database: %s", dbname)); if (!my_strcasecmp(system_charset_info, dbname, information_schema_name.str)) { - schema_db= 1; + system_db= 1; #ifndef NO_EMBEDDED_ACCESS_CHECKS db_access= SELECT_ACL; #endif @@ -1055,13 +1063,15 @@ bool mysql_change_db(THD *thd, const char *name, bool no_access_check) } #ifndef NO_EMBEDDED_ACCESS_CHECKS - if (!no_access_check) { + if (!no_access_check) + { if (test_all_bits(thd->master_access,DB_ACLS)) db_access=DB_ACLS; else db_access= (acl_get(thd->host,thd->ip, thd->priv_user,dbname,0) | thd->master_access); - if (!(db_access & DB_ACLS) && (!grant_option || check_grant_db(thd,dbname))) + if (!(db_access & DB_ACLS) && (!grant_option || + check_grant_db(thd,dbname))) { my_error(ER_DBACCESS_DENIED_ERROR, MYF(0), thd->priv_user, @@ -1094,7 +1104,7 @@ end: if (!no_access_check) thd->db_access=db_access; #endif - if (schema_db) + if (system_db) { thd->db_charset= system_charset_info; thd->variables.collation_database= system_charset_info; diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 6ede870a7fb..031d133a40c 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -1520,7 +1520,7 @@ void st_select_lex_unit::print(String *str) if (union_all) str->append("all ", 4); else if (union_distinct == sl) - union_all= true; + union_all= TRUE; } if (sl->braces) str->append('('); diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index f23963727ce..31d0f3eb675 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -238,7 +238,8 @@ end: /* - Check if user exist and password supplied is correct. + Check if user exist and password supplied is correct. + SYNOPSIS check_user() thd thread handle, thd->{host,user,ip} are used @@ -273,6 +274,10 @@ int check_user(THD *thd, enum enum_server_command command, /* Change database if necessary */ if (db && db[0]) { + /* + thd->db is saved in caller and needs to be freed by caller if this + function returns 0 + */ thd->db= 0; thd->db_length= 0; if (mysql_change_db(thd, db, FALSE)) @@ -6415,7 +6420,7 @@ Name_resolution_context * make_join_on_context(THD *thd, TABLE_LIST *left_op, TABLE_LIST *right_op) { Name_resolution_context *on_context; - if (!(on_context= new Name_resolution_context)) + if (!(on_context= new (thd->mem_root) Name_resolution_context)) return NULL; on_context->init(); on_context->first_name_resolution_table= diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 958971d65f1..d1a968d2376 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -626,7 +626,7 @@ static const char *require_quotes(const char *name, uint name_length) uint length; const char *end= name + name_length; - for ( ; name < end ; name++) + for (; name < end ; name++) { uchar chr= (uchar) *name; length= my_mbcharlen(system_charset_info, chr); @@ -1914,7 +1914,7 @@ int make_db_list(THD *thd, List<char> *files, int schema_tables_add(THD *thd, List<char> *files, const char *wild) { ST_SCHEMA_TABLE *tmp_schema_table= schema_tables; - for ( ; tmp_schema_table->table_name; tmp_schema_table++) + for (; tmp_schema_table->table_name; tmp_schema_table++) { if (tmp_schema_table->hidden) continue; @@ -2373,7 +2373,13 @@ static int get_schema_column_record(THD *thd, struct st_table_list *tables, LEX *lex= thd->lex; const char *wild= lex->wild ? lex->wild->ptr() : NullS; CHARSET_INFO *cs= system_charset_info; + TABLE *show_table; + handler *file; + Field **ptr,*field; + int count; + uint base_name_length, file_name_length; DBUG_ENTER("get_schema_column_record"); + if (res) { if (lex->orig_sql_command != SQLCOM_SHOW_FIELDS) @@ -2390,189 +2396,187 @@ static int get_schema_column_record(THD *thd, struct st_table_list *tables, DBUG_RETURN(res); } - TABLE *show_table= tables->table; - handler *file= show_table->file; + show_table= tables->table; + file= show_table->file; + count= 0; file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK); restore_record(show_table, s->default_values); - Field **ptr,*field; - int count= 0; + base_name_length= strlen(base_name); + file_name_length= strlen(file_name); + for (ptr=show_table->field; (field= *ptr) ; ptr++) { - if (!wild || !wild[0] || - !wild_case_compare(system_charset_info, field->field_name,wild)) - { - const char *tmp_buff; - byte *pos; - bool is_blob; - uint flags=field->flags; - char tmp[MAX_FIELD_WIDTH]; - char tmp1[MAX_FIELD_WIDTH]; - String type(tmp,sizeof(tmp), system_charset_info); - char *end= tmp; - count++; - restore_record(table, s->default_values); + const char *tmp_buff; + byte *pos; + bool is_blob; + uint flags=field->flags; + char tmp[MAX_FIELD_WIDTH]; + char tmp1[MAX_FIELD_WIDTH]; + String type(tmp,sizeof(tmp), system_charset_info); + char *end; + int decimals, field_length; + + if (wild && wild[0] && + wild_case_compare(system_charset_info, field->field_name,wild)) + continue; + + flags= field->flags; + count++; + /* Get default row, with all NULL fields set to NULL */ + restore_record(table, s->default_values); #ifndef NO_EMBEDDED_ACCESS_CHECKS - uint col_access; - check_access(thd,SELECT_ACL | EXTRA_ACL, base_name, - &tables->grant.privilege, 0, 0); - col_access= get_column_grant(thd, &tables->grant, - base_name, file_name, - field->field_name) & COL_ACLS; - if (lex->orig_sql_command != SQLCOM_SHOW_FIELDS && - !tables->schema_table && !col_access) - continue; - for (uint bitnr=0; col_access ; col_access>>=1,bitnr++) + uint col_access; + check_access(thd,SELECT_ACL | EXTRA_ACL, base_name, + &tables->grant.privilege, 0, 0); + col_access= get_column_grant(thd, &tables->grant, + base_name, file_name, + field->field_name) & COL_ACLS; + if (lex->orig_sql_command != SQLCOM_SHOW_FIELDS && + !tables->schema_table && !col_access) + continue; + end= tmp; + for (uint bitnr=0; col_access ; col_access>>=1,bitnr++) + { + if (col_access & 1) { - if (col_access & 1) - { - *end++=','; - end=strmov(end,grant_types.type_names[bitnr]); - } + *end++=','; + end=strmov(end,grant_types.type_names[bitnr]); } - if (tables->schema_table) // any user has 'select' privilege on all - // I_S table columns - table->field[17]->store(grant_types.type_names[0], - strlen(grant_types.type_names[0]), cs); - else - table->field[17]->store(tmp+1,end == tmp ? 0 : (uint) (end-tmp-1), cs); + } + if (tables->schema_table) // any user has 'select' privilege on all + // I_S table columns + table->field[17]->store(grant_types.type_names[0], + strlen(grant_types.type_names[0]), cs); + else + table->field[17]->store(tmp+1,end == tmp ? 0 : (uint) (end-tmp-1), cs); -#else - *end= 0; #endif - table->field[1]->store(base_name, strlen(base_name), cs); - table->field[2]->store(file_name, strlen(file_name), cs); - table->field[3]->store(field->field_name, strlen(field->field_name), - cs); - table->field[4]->store((longlong) count); - field->sql_type(type); - table->field[14]->store(type.ptr(), type.length(), cs); - tmp_buff= strchr(type.ptr(), '('); - table->field[7]->store(type.ptr(), - (tmp_buff ? tmp_buff - type.ptr() : - type.length()), cs); - if (show_table->timestamp_field == field && - field->unireg_check != Field::TIMESTAMP_UN_FIELD) - { - table->field[5]->store("CURRENT_TIMESTAMP", 17, cs); - table->field[5]->set_notnull(); - } - else if (field->unireg_check != Field::NEXT_NUMBER && - !field->is_null() && - !(field->flags & NO_DEFAULT_VALUE_FLAG)) - { - String def(tmp1,sizeof(tmp1), cs); - type.set(tmp, sizeof(tmp), field->charset()); - field->val_str(&type); - uint dummy_errors; - def.copy(type.ptr(), type.length(), type.charset(), cs, &dummy_errors); - table->field[5]->store(def.ptr(), def.length(), def.charset()); - table->field[5]->set_notnull(); - } - else if (field->unireg_check == Field::NEXT_NUMBER || - lex->orig_sql_command != SQLCOM_SHOW_FIELDS || - field->maybe_null()) - table->field[5]->set_null(); // Null as default - else - { - table->field[5]->store("",0, cs); - table->field[5]->set_notnull(); - } - pos=(byte*) ((flags & NOT_NULL_FLAG) && - field->type() != FIELD_TYPE_TIMESTAMP ? - "NO" : "YES"); - table->field[6]->store((const char*) pos, - strlen((const char*) pos), cs); - is_blob= (field->type() == FIELD_TYPE_BLOB); - if (field->has_charset() || is_blob) - { - longlong c_octet_len= is_blob ? (longlong) field->max_length() : - (longlong) field->max_length()/field->charset()->mbmaxlen; - table->field[8]->store(c_octet_len); - table->field[8]->set_notnull(); - table->field[9]->store((longlong) field->max_length()); - table->field[9]->set_notnull(); - } + table->field[1]->store(base_name, base_name_length, cs); + table->field[2]->store(file_name, file_name_length, cs); + table->field[3]->store(field->field_name, strlen(field->field_name), + cs); + table->field[4]->store((longlong) count); + field->sql_type(type); + table->field[14]->store(type.ptr(), type.length(), cs); + tmp_buff= strchr(type.ptr(), '('); + table->field[7]->store(type.ptr(), + (tmp_buff ? tmp_buff - type.ptr() : + type.length()), cs); + if (show_table->timestamp_field == field && + field->unireg_check != Field::TIMESTAMP_UN_FIELD) + { + table->field[5]->store("CURRENT_TIMESTAMP", 17, cs); + table->field[5]->set_notnull(); + } + else if (field->unireg_check != Field::NEXT_NUMBER && + !field->is_null() && + !(field->flags & NO_DEFAULT_VALUE_FLAG)) + { + String def(tmp1,sizeof(tmp1), cs); + type.set(tmp, sizeof(tmp), field->charset()); + field->val_str(&type); + uint dummy_errors; + def.copy(type.ptr(), type.length(), type.charset(), cs, &dummy_errors); + table->field[5]->store(def.ptr(), def.length(), def.charset()); + table->field[5]->set_notnull(); + } + else if (field->unireg_check == Field::NEXT_NUMBER || + lex->orig_sql_command != SQLCOM_SHOW_FIELDS || + field->maybe_null()) + table->field[5]->set_null(); // Null as default + else + { + table->field[5]->store("",0, cs); + table->field[5]->set_notnull(); + } + pos=(byte*) ((flags & NOT_NULL_FLAG) && + field->type() != FIELD_TYPE_TIMESTAMP ? + "NO" : "YES"); + table->field[6]->store((const char*) pos, + strlen((const char*) pos), cs); + is_blob= (field->type() == FIELD_TYPE_BLOB); + if (field->has_charset() || is_blob) + { + longlong c_octet_len= is_blob ? (longlong) field->max_length() : + (longlong) field->max_length()/field->charset()->mbmaxlen; + table->field[8]->store(c_octet_len); + table->field[8]->set_notnull(); + table->field[9]->store((longlong) field->max_length()); + table->field[9]->set_notnull(); + } - { - uint dec =field->decimals(); - switch (field->type()) { - case FIELD_TYPE_NEWDECIMAL: - table->field[10]->store((longlong) - ((Field_new_decimal*)field)->precision); - table->field[10]->set_notnull(); - table->field[11]->store((longlong) field->decimals()); - table->field[11]->set_notnull(); - break; - case FIELD_TYPE_DECIMAL: - { - uint int_part=field->field_length - (dec ? dec + 1 : 0); - table->field[10]->store((longlong) (int_part + dec - 1)); - table->field[10]->set_notnull(); - table->field[11]->store((longlong) field->decimals()); - table->field[11]->set_notnull(); - break; - } - case FIELD_TYPE_TINY: - case FIELD_TYPE_SHORT: - case FIELD_TYPE_LONG: - case FIELD_TYPE_LONGLONG: - case FIELD_TYPE_INT24: - { - table->field[10]->store((longlong) field->max_length() - 1); - table->field[10]->set_notnull(); - table->field[11]->store((longlong) 0); - table->field[11]->set_notnull(); - break; - } - case FIELD_TYPE_BIT: - { - table->field[10]->store((longlong) field->max_length()); - table->field[10]->set_notnull(); - break; - } - case FIELD_TYPE_FLOAT: - case FIELD_TYPE_DOUBLE: - { - table->field[10]->store((longlong) field->field_length); - table->field[10]->set_notnull(); - if (dec != NOT_FIXED_DEC) - { - table->field[11]->store((longlong) dec); - table->field[11]->set_notnull(); - } - break; - } - default: - break; - } - } - if (field->has_charset()) - { - pos=(byte*) field->charset()->csname; - table->field[12]->store((const char*) pos, - strlen((const char*) pos), cs); - table->field[12]->set_notnull(); - pos=(byte*) field->charset()->name; - table->field[13]->store((const char*) pos, - strlen((const char*) pos), cs); - table->field[13]->set_notnull(); - } - pos=(byte*) ((field->flags & PRI_KEY_FLAG) ? "PRI" : - (field->flags & UNIQUE_KEY_FLAG) ? "UNI" : - (field->flags & MULTIPLE_KEY_FLAG) ? "MUL":""); - table->field[15]->store((const char*) pos, - strlen((const char*) pos), cs); - end= tmp; - if (field->unireg_check == Field::NEXT_NUMBER) - end=strmov(tmp,"auto_increment"); - table->field[16]->store(tmp, (uint) (end-tmp), cs); + /* + Calculate field_length and decimals. + They are set to -1 if they should not be set (we should return NULL) + */ - end=tmp; - table->field[18]->store(field->comment.str, field->comment.length, cs); - if (schema_table_store_record(thd, table)) - DBUG_RETURN(1); + decimals= field->decimals(); + switch (field->type()) { + case FIELD_TYPE_NEWDECIMAL: + field_length= ((Field_new_decimal*) field)->precision; + break; + case FIELD_TYPE_DECIMAL: + field_length= field->field_length - (decimals ? 2 : 1); + break; + case FIELD_TYPE_TINY: + case FIELD_TYPE_SHORT: + case FIELD_TYPE_LONG: + case FIELD_TYPE_LONGLONG: + case FIELD_TYPE_INT24: + field_length= field->max_length() - 1; + break; + case FIELD_TYPE_BIT: + field_length= field->max_length(); + decimals= -1; // return NULL + break; + case FIELD_TYPE_FLOAT: + case FIELD_TYPE_DOUBLE: + field_length= field->field_length; + if (decimals == NOT_FIXED_DEC) + decimals= -1; // return NULL + break; + default: + field_length= decimals= -1; + break; + } + + if (field_length >= 0) + { + table->field[10]->store((longlong) field_length); + table->field[10]->set_notnull(); + } + if (decimals >= 0) + { + table->field[11]->store((longlong) decimals); + table->field[11]->set_notnull(); + } + + if (field->has_charset()) + { + pos=(byte*) field->charset()->csname; + table->field[12]->store((const char*) pos, + strlen((const char*) pos), cs); + table->field[12]->set_notnull(); + pos=(byte*) field->charset()->name; + table->field[13]->store((const char*) pos, + strlen((const char*) pos), cs); + table->field[13]->set_notnull(); } + pos=(byte*) ((field->flags & PRI_KEY_FLAG) ? "PRI" : + (field->flags & UNIQUE_KEY_FLAG) ? "UNI" : + (field->flags & MULTIPLE_KEY_FLAG) ? "MUL":""); + table->field[15]->store((const char*) pos, + strlen((const char*) pos), cs); + + end= tmp; + if (field->unireg_check == Field::NEXT_NUMBER) + end=strmov(tmp,"auto_increment"); + table->field[16]->store(tmp, (uint) (end-tmp), cs); + + table->field[18]->store(field->comment.str, field->comment.length, cs); + if (schema_table_store_record(thd, table)) + DBUG_RETURN(1); } DBUG_RETURN(0); } @@ -2585,7 +2589,8 @@ int fill_schema_charsets(THD *thd, TABLE_LIST *tables, COND *cond) const char *wild= thd->lex->wild ? thd->lex->wild->ptr() : NullS; TABLE *table= tables->table; CHARSET_INFO *scs= system_charset_info; - for ( cs= all_charsets ; cs < all_charsets+255 ; cs++ ) + + for (cs= all_charsets ; cs < all_charsets+255 ; cs++) { CHARSET_INFO *tmp_cs= cs[0]; if (tmp_cs && (tmp_cs->state & MY_CS_PRIMARY) && @@ -2593,12 +2598,12 @@ int fill_schema_charsets(THD *thd, TABLE_LIST *tables, COND *cond) !(wild && wild[0] && wild_case_compare(scs, tmp_cs->csname,wild))) { + const char *comment; restore_record(table, s->default_values); table->field[0]->store(tmp_cs->csname, strlen(tmp_cs->csname), scs); table->field[1]->store(tmp_cs->name, strlen(tmp_cs->name), scs); - table->field[2]->store(tmp_cs->comment ? tmp_cs->comment : "", - strlen(tmp_cs->comment ? tmp_cs->comment : ""), - scs); + comment= tmp_cs->comment ? tmp_cs->comment : ""; + table->field[2]->store(comment, strlen(comment), scs); table->field[3]->store((longlong) tmp_cs->mbmaxlen); if (schema_table_store_record(thd, table)) return 1; @@ -2614,14 +2619,14 @@ int fill_schema_collation(THD *thd, TABLE_LIST *tables, COND *cond) const char *wild= thd->lex->wild ? thd->lex->wild->ptr() : NullS; TABLE *table= tables->table; CHARSET_INFO *scs= system_charset_info; - for ( cs= all_charsets ; cs < all_charsets+255 ; cs++ ) + for (cs= all_charsets ; cs < all_charsets+255 ; cs++ ) { CHARSET_INFO **cl; CHARSET_INFO *tmp_cs= cs[0]; if (!tmp_cs || !(tmp_cs->state & MY_CS_AVAILABLE) || !(tmp_cs->state & MY_CS_PRIMARY)) continue; - for ( cl= all_charsets; cl < all_charsets+255 ;cl ++) + for (cl= all_charsets; cl < all_charsets+255 ;cl ++) { CHARSET_INFO *tmp_cl= cl[0]; if (!tmp_cl || !(tmp_cl->state & MY_CS_AVAILABLE) || @@ -2654,14 +2659,14 @@ int fill_schema_coll_charset_app(THD *thd, TABLE_LIST *tables, COND *cond) CHARSET_INFO **cs; TABLE *table= tables->table; CHARSET_INFO *scs= system_charset_info; - for ( cs= all_charsets ; cs < all_charsets+255 ; cs++ ) + for (cs= all_charsets ; cs < all_charsets+255 ; cs++ ) { CHARSET_INFO **cl; CHARSET_INFO *tmp_cs= cs[0]; if (!tmp_cs || !(tmp_cs->state & MY_CS_AVAILABLE) || !(tmp_cs->state & MY_CS_PRIMARY)) continue; - for ( cl= all_charsets; cl < all_charsets+255 ;cl ++) + for (cl= all_charsets; cl < all_charsets+255 ;cl ++) { CHARSET_INFO *tmp_cl= cl[0]; if (!tmp_cl || !(tmp_cl->state & MY_CS_AVAILABLE) || @@ -3266,7 +3271,7 @@ int fill_status(THD *thd, TABLE_LIST *tables, COND *cond) ST_SCHEMA_TABLE *find_schema_table(THD *thd, const char* table_name) { ST_SCHEMA_TABLE *schema_table= schema_tables; - for ( ; schema_table->table_name; schema_table++) + for (; schema_table->table_name; schema_table++) { if (!my_strcasecmp(system_charset_info, schema_table->table_name, @@ -3307,7 +3312,7 @@ TABLE *create_schema_table(THD *thd, TABLE_LIST *table_list) CHARSET_INFO *cs= system_charset_info; DBUG_ENTER("create_schema_table"); - for ( ; fields_info->field_name; fields_info++) + for (; fields_info->field_name; fields_info++) { switch (fields_info->field_type) { case MYSQL_TYPE_LONG: @@ -3376,7 +3381,7 @@ int make_old_format(THD *thd, ST_SCHEMA_TABLE *schema_table) { ST_FIELD_INFO *field_info= schema_table->fields_info; Name_resolution_context *context= &thd->lex->select_lex.context; - for ( ; field_info->field_name; field_info++) + for (; field_info->field_name; field_info++) { if (field_info->old_name) { diff --git a/sql/sql_view.cc b/sql/sql_view.cc index af21b43e5c9..dcada0c0780 100644 --- a/sql/sql_view.cc +++ b/sql/sql_view.cc @@ -310,7 +310,7 @@ bool mysql_create_view(THD *thd, open_and_lock_tables can change the value of tables, e.g. it may happen if before the function call tables was equal to 0. */ - for (tbl= tables= lex->query_tables; tbl; tbl= tbl->next_global) + for (tbl= lex->query_tables; tbl; tbl= tbl->next_global) { /* is this table temporary and is not view? */ if (tbl->table->s->tmp_table != NO_TMP_TABLE && !tbl->view && diff --git a/sql/table.cc b/sql/table.cc index beecd6442e8..e84f8adc32f 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -2518,12 +2518,9 @@ void Field_iterator_natural_join::set(TABLE_LIST *table_ref) void Field_iterator_natural_join::next() { cur_column_ref= (*column_ref_it)++; - DBUG_ASSERT(cur_column_ref ? - (cur_column_ref->table_field ? - cur_column_ref->table_ref->table == - cur_column_ref->table_field->table : - TRUE) : - TRUE); + DBUG_ASSERT(!cur_column_ref || ! cur_column_ref->table_field || + cur_column_ref->table_ref->table == + cur_column_ref->table_field->table); } @@ -2695,9 +2692,8 @@ Field_iterator_table_ref::get_or_create_column_ref(THD *thd, bool *is_created) nj_col= natural_join_it.column_ref(); DBUG_ASSERT(nj_col); } - DBUG_ASSERT(nj_col->table_field ? - nj_col->table_ref->table == nj_col->table_field->table : - TRUE); + DBUG_ASSERT(!nj_col->table_field || + nj_col->table_ref->table == nj_col->table_field->table); return nj_col; } |