mirror of
https://github.com/MariaDB/server.git
synced 2026-05-09 16:44:29 +02:00
Merge tsmith@bk-internal.mysql.com:/home/bk/mysql-5.0-maint
into ramayana.hindu.god:/home/tsmith/m/bk/maint/50 sql/mysqld.cc: Auto merged
This commit is contained in:
commit
ad8ca7b3b4
33 changed files with 453 additions and 63 deletions
|
|
@ -274,6 +274,7 @@ my_decimal *Item::val_decimal_from_date(my_decimal *decimal_value)
|
|||
if (get_date(<ime, TIME_FUZZY_DATE))
|
||||
{
|
||||
my_decimal_set_zero(decimal_value);
|
||||
null_value= 1; // set NULL, stop processing
|
||||
return 0;
|
||||
}
|
||||
return date2my_decimal(<ime, decimal_value);
|
||||
|
|
|
|||
|
|
@ -844,7 +844,9 @@ public:
|
|||
enum_field_types field_type() const { return MYSQL_TYPE_DATETIME; }
|
||||
void fix_length_and_dec()
|
||||
{
|
||||
Item_typecast_maybe_null::fix_length_and_dec();
|
||||
collation.set(&my_charset_bin);
|
||||
maybe_null= 1;
|
||||
max_length= MAX_DATETIME_FULL_WIDTH * MY_CHARSET_BIN_MB_MAXLEN;
|
||||
decimals= DATETIME_DEC;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -68,24 +68,43 @@ int decimal_operation_results(int result)
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
Converting decimal to string
|
||||
/**
|
||||
@brief Converting decimal to string
|
||||
|
||||
SYNOPSIS
|
||||
my_decimal2string()
|
||||
@details Convert given my_decimal to String; allocate buffer as needed.
|
||||
|
||||
return
|
||||
E_DEC_OK
|
||||
E_DEC_TRUNCATED
|
||||
E_DEC_OVERFLOW
|
||||
E_DEC_OOM
|
||||
@param[in] mask what problems to warn on (mask of E_DEC_* values)
|
||||
@param[in] d the decimal to print
|
||||
@param[in] fixed_prec overall number of digits if ZEROFILL, 0 otherwise
|
||||
@param[in] fixed_dec number of decimal places (if fixed_prec != 0)
|
||||
@param[in] filler what char to pad with (ZEROFILL et al.)
|
||||
@param[out] *str where to store the resulting string
|
||||
|
||||
@return error coce
|
||||
@retval E_DEC_OK
|
||||
@retval E_DEC_TRUNCATED
|
||||
@retval E_DEC_OVERFLOW
|
||||
@retval E_DEC_OOM
|
||||
*/
|
||||
|
||||
int my_decimal2string(uint mask, const my_decimal *d,
|
||||
uint fixed_prec, uint fixed_dec,
|
||||
char filler, String *str)
|
||||
{
|
||||
int length= (fixed_prec ? (fixed_prec + 1) : my_decimal_string_length(d));
|
||||
/*
|
||||
Calculate the size of the string: For DECIMAL(a,b), fixed_prec==a
|
||||
holds true iff the type is also ZEROFILL, which in turn implies
|
||||
UNSIGNED. Hence the buffer for a ZEROFILLed value is the length
|
||||
the user requested, plus one for a possible decimal point, plus
|
||||
one if the user only wanted decimal places, but we force a leading
|
||||
zero on them. Because the type is implicitly UNSIGNED, we do not
|
||||
need to reserve a character for the sign. For all other cases,
|
||||
fixed_prec will be 0, and my_decimal_string_length() will be called
|
||||
instead to calculate the required size of the buffer.
|
||||
*/
|
||||
int length= (fixed_prec
|
||||
? (fixed_prec + ((fixed_prec == fixed_dec) ? 1 : 0) + 1)
|
||||
: my_decimal_string_length(d));
|
||||
int result;
|
||||
if (str->alloc(length))
|
||||
return check_result(mask, E_DEC_OOM);
|
||||
|
|
|
|||
|
|
@ -2143,7 +2143,7 @@ bytes of memory\n", ((ulong) dflt_key_cache->key_cache_mem_size +
|
|||
You seem to be running 32-bit Linux and have %d concurrent connections.\n\
|
||||
If you have not changed STACK_SIZE in LinuxThreads and built the binary \n\
|
||||
yourself, LinuxThreads is quite likely to steal a part of the global heap for\n\
|
||||
the thread stack. Please read http://www.mysql.com/doc/en/Linux.html\n\n",
|
||||
the thread stack. Please read http://dev.mysql.com/doc/mysql/en/linux.html\n\n",
|
||||
thread_count);
|
||||
}
|
||||
#endif /* HAVE_LINUXTHREADS */
|
||||
|
|
@ -2163,7 +2163,7 @@ Some pointers may be invalid and cause the dump to abort...\n");
|
|||
fprintf(stderr, "thd->thread_id=%lu\n", (ulong) thd->thread_id);
|
||||
}
|
||||
fprintf(stderr, "\
|
||||
The manual page at http://www.mysql.com/doc/en/Crashing.html contains\n\
|
||||
The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains\n\
|
||||
information that should help you find out what is causing the crash.\n");
|
||||
fflush(stderr);
|
||||
#endif /* HAVE_STACKTRACE */
|
||||
|
|
|
|||
|
|
@ -1132,7 +1132,7 @@ static void acl_update_db(const char *user, const char *host, const char *db,
|
|||
{
|
||||
if (!acl_db->host.hostname && !host[0] ||
|
||||
acl_db->host.hostname &&
|
||||
!my_strcasecmp(system_charset_info, host, acl_db->host.hostname))
|
||||
!strcmp(host, acl_db->host.hostname))
|
||||
{
|
||||
if (!acl_db->db && !db[0] ||
|
||||
acl_db->db && !strcmp(db,acl_db->db))
|
||||
|
|
@ -4344,6 +4344,13 @@ bool mysql_show_grants(THD *thd,LEX_USER *lex_user)
|
|||
if (!(host=acl_db->host.hostname))
|
||||
host= "";
|
||||
|
||||
/*
|
||||
We do not make SHOW GRANTS case-sensitive here (like REVOKE),
|
||||
but make it case-insensitive because that's the way they are
|
||||
actually applied, and showing fewer privileges than are applied
|
||||
would be wrong from a security point of view.
|
||||
*/
|
||||
|
||||
if (!strcmp(lex_user->user.str,user) &&
|
||||
!my_strcasecmp(system_charset_info, lex_user->host.str, host))
|
||||
{
|
||||
|
|
@ -4379,8 +4386,8 @@ bool mysql_show_grants(THD *thd,LEX_USER *lex_user)
|
|||
db.append(lex_user->user.str, lex_user->user.length,
|
||||
system_charset_info);
|
||||
db.append (STRING_WITH_LEN("'@'"));
|
||||
db.append(lex_user->host.str, lex_user->host.length,
|
||||
system_charset_info);
|
||||
// host and lex_user->host are equal except for case
|
||||
db.append(host, strlen(host), system_charset_info);
|
||||
db.append ('\'');
|
||||
if (want_access & GRANT_ACL)
|
||||
db.append(STRING_WITH_LEN(" WITH GRANT OPTION"));
|
||||
|
|
@ -4407,6 +4414,13 @@ bool mysql_show_grants(THD *thd,LEX_USER *lex_user)
|
|||
if (!(host= grant_table->host.hostname))
|
||||
host= "";
|
||||
|
||||
/*
|
||||
We do not make SHOW GRANTS case-sensitive here (like REVOKE),
|
||||
but make it case-insensitive because that's the way they are
|
||||
actually applied, and showing fewer privileges than are applied
|
||||
would be wrong from a security point of view.
|
||||
*/
|
||||
|
||||
if (!strcmp(lex_user->user.str,user) &&
|
||||
!my_strcasecmp(system_charset_info, lex_user->host.str, host))
|
||||
{
|
||||
|
|
@ -4487,8 +4501,8 @@ bool mysql_show_grants(THD *thd,LEX_USER *lex_user)
|
|||
global.append(lex_user->user.str, lex_user->user.length,
|
||||
system_charset_info);
|
||||
global.append(STRING_WITH_LEN("'@'"));
|
||||
global.append(lex_user->host.str,lex_user->host.length,
|
||||
system_charset_info);
|
||||
// host and lex_user->host are equal except for case
|
||||
global.append(host, strlen(host), system_charset_info);
|
||||
global.append('\'');
|
||||
if (table_access & GRANT_ACL)
|
||||
global.append(STRING_WITH_LEN(" WITH GRANT OPTION"));
|
||||
|
|
@ -4543,6 +4557,13 @@ static int show_routine_grants(THD* thd, LEX_USER *lex_user, HASH *hash,
|
|||
if (!(host= grant_proc->host.hostname))
|
||||
host= "";
|
||||
|
||||
/*
|
||||
We do not make SHOW GRANTS case-sensitive here (like REVOKE),
|
||||
but make it case-insensitive because that's the way they are
|
||||
actually applied, and showing fewer privileges than are applied
|
||||
would be wrong from a security point of view.
|
||||
*/
|
||||
|
||||
if (!strcmp(lex_user->user.str,user) &&
|
||||
!my_strcasecmp(system_charset_info, lex_user->host.str, host))
|
||||
{
|
||||
|
|
@ -4586,8 +4607,8 @@ static int show_routine_grants(THD* thd, LEX_USER *lex_user, HASH *hash,
|
|||
global.append(lex_user->user.str, lex_user->user.length,
|
||||
system_charset_info);
|
||||
global.append(STRING_WITH_LEN("'@'"));
|
||||
global.append(lex_user->host.str,lex_user->host.length,
|
||||
system_charset_info);
|
||||
// host and lex_user->host are equal except for case
|
||||
global.append(host, strlen(host), system_charset_info);
|
||||
global.append('\'');
|
||||
if (proc_access & GRANT_ACL)
|
||||
global.append(STRING_WITH_LEN(" WITH GRANT OPTION"));
|
||||
|
|
@ -5541,7 +5562,7 @@ bool mysql_revoke_all(THD *thd, List <LEX_USER> &list)
|
|||
host= "";
|
||||
|
||||
if (!strcmp(lex_user->user.str,user) &&
|
||||
!my_strcasecmp(system_charset_info, lex_user->host.str, host))
|
||||
!strcmp(lex_user->host.str, host))
|
||||
{
|
||||
if (!replace_db_table(tables[1].table, acl_db->db, *lex_user, ~(ulong)0, 1))
|
||||
{
|
||||
|
|
@ -5572,7 +5593,7 @@ bool mysql_revoke_all(THD *thd, List <LEX_USER> &list)
|
|||
host= "";
|
||||
|
||||
if (!strcmp(lex_user->user.str,user) &&
|
||||
!my_strcasecmp(system_charset_info, lex_user->host.str, host))
|
||||
!strcmp(lex_user->host.str, host))
|
||||
{
|
||||
if (replace_table_table(thd,grant_table,tables[2].table,*lex_user,
|
||||
grant_table->db,
|
||||
|
|
@ -5618,7 +5639,7 @@ bool mysql_revoke_all(THD *thd, List <LEX_USER> &list)
|
|||
host= "";
|
||||
|
||||
if (!strcmp(lex_user->user.str,user) &&
|
||||
!my_strcasecmp(system_charset_info, lex_user->host.str, host))
|
||||
!strcmp(lex_user->host.str, host))
|
||||
{
|
||||
if (!replace_routine_table(thd,grant_proc,tables[4].table,*lex_user,
|
||||
grant_proc->db,
|
||||
|
|
|
|||
|
|
@ -13902,13 +13902,31 @@ calc_group_buffer(JOIN *join,ORDER *group)
|
|||
group_item->decimals);
|
||||
break;
|
||||
case STRING_RESULT:
|
||||
{
|
||||
enum enum_field_types type= group_item->field_type();
|
||||
/*
|
||||
Group strings are taken as varstrings and require an length field.
|
||||
A field is not yet created by create_tmp_field()
|
||||
and the sizes should match up.
|
||||
As items represented as DATE/TIME fields in the group buffer
|
||||
have STRING_RESULT result type, we increase the length
|
||||
by 8 as maximum pack length of such fields.
|
||||
*/
|
||||
key_length+= group_item->max_length + HA_KEY_BLOB_LENGTH;
|
||||
if (type == MYSQL_TYPE_TIME ||
|
||||
type == MYSQL_TYPE_DATE ||
|
||||
type == MYSQL_TYPE_DATETIME ||
|
||||
type == MYSQL_TYPE_TIMESTAMP)
|
||||
{
|
||||
key_length+= 8;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
Group strings are taken as varstrings and require an length field.
|
||||
A field is not yet created by create_tmp_field()
|
||||
and the sizes should match up.
|
||||
*/
|
||||
key_length+= group_item->max_length + HA_KEY_BLOB_LENGTH;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
/* This case should never be choosen */
|
||||
DBUG_ASSERT(0);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue