Commit 1c1f26d5 authored by monty@mishka.local's avatar monty@mishka.local

Fixes during review of new pushed code

Fixed new bug when running a SP without a default database
parent c726451a
......@@ -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;
......@@ -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;
......
......@@ -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;
......@@ -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;
......
......@@ -2176,9 +2176,6 @@ void Item_func_lpad::fix_length_and_dec()
{
ulonglong length= ((ulonglong) args[1]->val_int() *
collation.collation->mbmaxlen);
/*a comment before (merged) */
length= max((ulonglong)args[0]->max_length, length);
/*a comment after */
if (length >= MAX_BLOB_WIDTH)
{
length= MAX_BLOB_WIDTH;
......
......@@ -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)
......
......@@ -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)
{
if (wild_compare(share->table_name,wild,0))
if (wild && 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;
......@@ -3803,7 +3799,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);
......
......@@ -998,7 +998,7 @@ static long mysql_rm_arc_files(THD *thd, MY_DIR *dirp,
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 @@ bool mysql_change_db(THD *thd, const char *name, bool no_access_check)
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;
......
......@@ -239,6 +239,7 @@ static int get_or_create_user_conn(THD *thd, const char *user,
/*
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))
......
......@@ -620,7 +620,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);
......@@ -1908,7 +1908,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;
......@@ -2365,7 +2365,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)
......@@ -2382,16 +2388,15 @@ 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;
......@@ -2400,8 +2405,16 @@ static int get_schema_column_record(THD *thd, struct st_table_list *tables,
char tmp[MAX_FIELD_WIDTH];
char tmp1[MAX_FIELD_WIDTH];
String type(tmp,sizeof(tmp), system_charset_info);
char *end= tmp;
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
......@@ -2414,6 +2427,7 @@ static int get_schema_column_record(THD *thd, struct st_table_list *tables,
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)
......@@ -2429,11 +2443,9 @@ static int get_schema_column_record(THD *thd, struct st_table_list *tables,
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[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);
......@@ -2486,59 +2498,52 @@ static int get_schema_column_record(THD *thd, struct st_table_list *tables,
table->field[9]->set_notnull();
}
{
uint dec =field->decimals();
/*
Calculate field_length and decimals.
They are set to -1 if they should not be set (we should return NULL)
*/
decimals= 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();
field_length= ((Field_new_decimal*) field)->precision;
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();
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:
{
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();
field_length= field->max_length() - 1;
break;
}
case FIELD_TYPE_BIT:
{
table->field[10]->store((longlong) field->max_length());
table->field[10]->set_notnull();
field_length= field->max_length();
decimals= -1; // return NULL
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();
}
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;
......@@ -2555,17 +2560,16 @@ static int get_schema_column_record(THD *thd, struct st_table_list *tables,
(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);
end=tmp;
table->field[18]->store(field->comment.str, field->comment.length, cs);
if (schema_table_store_record(thd, table))
DBUG_RETURN(1);
}
}
DBUG_RETURN(0);
}
......@@ -2577,7 +2581,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) &&
......@@ -2585,12 +2590,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;
......@@ -2606,14 +2611,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) ||
......@@ -2646,14 +2651,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) ||
......@@ -3258,7 +3263,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,
......@@ -3299,7 +3304,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:
......@@ -3368,7 +3373,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)
{
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment