Merge tsmith@bk-internal.mysql.com:/home/bk/mysql-5.1

into  ramayana.hindu.god:/home/tsmith/m/bk/maint/51


sql/sql_acl.cc:
  Auto merged
sql/sql_parse.cc:
  Auto merged
sql/sql_table.cc:
  Auto merged
mysql-test/r/grant.result:
  Manual merge
mysql-test/t/grant.test:
  Manual merge
This commit is contained in:
unknown 2007-12-07 03:56:03 -07:00
commit 284cb0e560
73 changed files with 1221 additions and 258 deletions

View File

@ -206,6 +206,7 @@ static void dbDisconnect(char *host);
static void DBerror(MYSQL *mysql, const char *when); static void DBerror(MYSQL *mysql, const char *when);
static void safe_exit(int error); static void safe_exit(int error);
static void print_result(); static void print_result();
static uint fixed_name_length(const char *name);
static char *fix_table_name(char *dest, char *src); static char *fix_table_name(char *dest, char *src);
int what_to_do = 0; int what_to_do = 0;
@ -438,14 +439,14 @@ static int process_selected_tables(char *db, char **table_names, int tables)
{ {
/* /*
We need table list in form `a`, `b`, `c` We need table list in form `a`, `b`, `c`
that's why we need 4 more chars added to to each table name that's why we need 2 more chars added to to each table name
space is for more readable output in logs and in case of error space is for more readable output in logs and in case of error
*/ */
char *table_names_comma_sep, *end; char *table_names_comma_sep, *end;
int i, tot_length = 0; int i, tot_length = 0;
for (i = 0; i < tables; i++) for (i = 0; i < tables; i++)
tot_length += strlen(*(table_names + i)) + 4; tot_length+= fixed_name_length(*(table_names + i)) + 2;
if (!(table_names_comma_sep = (char *) if (!(table_names_comma_sep = (char *)
my_malloc((sizeof(char) * tot_length) + 4, MYF(MY_WME)))) my_malloc((sizeof(char) * tot_length) + 4, MYF(MY_WME))))
@ -463,23 +464,46 @@ static int process_selected_tables(char *db, char **table_names, int tables)
} }
else else
for (; tables > 0; tables--, table_names++) for (; tables > 0; tables--, table_names++)
handle_request_for_tables(*table_names, strlen(*table_names)); handle_request_for_tables(*table_names, fixed_name_length(*table_names));
return 0; return 0;
} /* process_selected_tables */ } /* process_selected_tables */
static uint fixed_name_length(const char *name)
{
const char *p;
uint extra_length= 2; /* count the first/last backticks */
for (p= name; *p; p++)
{
if (*p == '`')
extra_length++;
else if (*p == '.')
extra_length+= 2;
}
return (p - name) + extra_length;
}
static char *fix_table_name(char *dest, char *src) static char *fix_table_name(char *dest, char *src)
{ {
char *db_sep;
*dest++= '`'; *dest++= '`';
if ((db_sep= strchr(src, '.'))) for (; *src; src++)
{ {
dest= strmake(dest, src, (uint) (db_sep - src)); switch (*src) {
dest= strmov(dest, "`.`"); case '.': /* add backticks around '.' */
src= db_sep + 1; *dest++= '`';
*dest++= '.';
*dest++= '`';
break;
case '`': /* escape backtick character */
*dest++= '`';
/* fall through */
default:
*dest++= *src;
}
} }
dest= strxmov(dest, src, "`", NullS); *dest++= '`';
return dest; return dest;
} }
@ -500,7 +524,7 @@ static int process_all_tables_in_db(char *database)
{ {
/* /*
We need table list in form `a`, `b`, `c` We need table list in form `a`, `b`, `c`
that's why we need 4 more chars added to to each table name that's why we need 2 more chars added to to each table name
space is for more readable output in logs and in case of error space is for more readable output in logs and in case of error
*/ */
@ -508,7 +532,7 @@ static int process_all_tables_in_db(char *database)
uint tot_length = 0; uint tot_length = 0;
while ((row = mysql_fetch_row(res))) while ((row = mysql_fetch_row(res)))
tot_length += strlen(row[0]) + 4; tot_length+= fixed_name_length(row[0]) + 2;
mysql_data_seek(res, 0); mysql_data_seek(res, 0);
if (!(tables=(char *) my_malloc(sizeof(char)*tot_length+4, MYF(MY_WME)))) if (!(tables=(char *) my_malloc(sizeof(char)*tot_length+4, MYF(MY_WME))))
@ -533,10 +557,13 @@ static int process_all_tables_in_db(char *database)
else else
{ {
while ((row = mysql_fetch_row(res))) while ((row = mysql_fetch_row(res)))
/* Skip tables with an engine of NULL (probably a view). */ /*
if (row[1]) Skip tables with an engine of NULL (probably a view)
if we don't perform renaming.
*/
if (row[1] || what_to_do == DO_UPGRADE)
{ {
handle_request_for_tables(row[0], strlen(row[0])); handle_request_for_tables(row[0], fixed_name_length(row[0]));
} }
} }
mysql_free_result(res); mysql_free_result(res);
@ -826,7 +853,7 @@ int main(int argc, char **argv)
for (i = 0; i < tables4repair.elements ; i++) for (i = 0; i < tables4repair.elements ; i++)
{ {
char *name= (char*) dynamic_array_ptr(&tables4repair, i); char *name= (char*) dynamic_array_ptr(&tables4repair, i);
handle_request_for_tables(name, strlen(name)); handle_request_for_tables(name, fixed_name_length(name));
} }
} }
end: end:

View File

@ -420,8 +420,12 @@ static struct my_option my_long_options[] =
"Creates a consistent snapshot by dumping all tables in a single " "Creates a consistent snapshot by dumping all tables in a single "
"transaction. Works ONLY for tables stored in storage engines which " "transaction. Works ONLY for tables stored in storage engines which "
"support multiversioning (currently only InnoDB does); the dump is NOT " "support multiversioning (currently only InnoDB does); the dump is NOT "
"guaranteed to be consistent for other storage engines. Option " "guaranteed to be consistent for other storage engines. "
"automatically turns off --lock-tables.", "While a --single-transaction dump is in process, to ensure a valid "
"dump file (correct table contents and binary log position), no other "
"connection should use the following statements: ALTER TABLE, DROP "
"TABLE, RENAME TABLE, TRUNCATE TABLE, as consistent snapshot is not "
"isolated from them. Option automatically turns off --lock-tables.",
(uchar**) &opt_single_transaction, (uchar**) &opt_single_transaction, 0, (uchar**) &opt_single_transaction, (uchar**) &opt_single_transaction, 0,
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
{"dump-date", OPT_DUMP_DATE, "Put a dump date to the end of the output.", {"dump-date", OPT_DUMP_DATE, "Put a dump date to the end of the output.",

View File

@ -2670,7 +2670,7 @@ void do_copy_file(struct st_command *command)
command command handle command command handle
DESCRIPTION DESCRIPTION
chmod_file <octal> <file_name> chmod <octal> <file_name>
Change file permission of <file_name> Change file permission of <file_name>
*/ */

View File

@ -250,6 +250,8 @@ enum ha_base_keytype {
HA_BINARY_PACK_KEY | HA_FULLTEXT | HA_UNIQUE_CHECK | \ HA_BINARY_PACK_KEY | HA_FULLTEXT | HA_UNIQUE_CHECK | \
HA_SPATIAL | HA_NULL_ARE_EQUAL | HA_GENERATED_KEY) HA_SPATIAL | HA_NULL_ARE_EQUAL | HA_GENERATED_KEY)
#define HA_KEY_HAS_PART_KEY_SEG 65536 /* Key contains partial segments */
/* Automatic bits in key-flag */ /* Automatic bits in key-flag */
#define HA_SPACE_PACK_USED 4 /* Test for if SPACE_PACK used */ #define HA_SPACE_PACK_USED 4 /* Test for if SPACE_PACK used */

View File

@ -712,8 +712,10 @@ extern sig_handler my_set_alarm_variable(int signo);
extern void my_string_ptr_sort(uchar *base, uint items, size_t size); extern void my_string_ptr_sort(uchar *base, uint items, size_t size);
extern void radixsort_for_str_ptr(uchar* base[], uint number_of_elements, extern void radixsort_for_str_ptr(uchar* base[], uint number_of_elements,
size_t size_of_element,uchar *buffer[]); size_t size_of_element,uchar *buffer[]);
extern qsort_t qsort2(void *base_ptr, size_t total_elems, size_t size, extern qsort_t my_qsort(void *base_ptr, size_t total_elems, size_t size,
qsort2_cmp cmp, void *cmp_argument); qsort_cmp cmp);
extern qsort_t my_qsort2(void *base_ptr, size_t total_elems, size_t size,
qsort2_cmp cmp, void *cmp_argument);
extern qsort2_cmp get_ptr_compare(size_t); extern qsort2_cmp get_ptr_compare(size_t);
void my_store_ptr(uchar *buff, size_t pack_length, my_off_t pos); void my_store_ptr(uchar *buff, size_t pack_length, my_off_t pos);
my_off_t my_get_ptr(uchar *ptr, size_t pack_length); my_off_t my_get_ptr(uchar *ptr, size_t pack_length);
@ -784,7 +786,7 @@ extern int get_index_dynamic(DYNAMIC_ARRAY *array, uchar * element);
#define dynamic_element(array,array_index,type) ((type)((array)->buffer) +(array_index)) #define dynamic_element(array,array_index,type) ((type)((array)->buffer) +(array_index))
#define push_dynamic(A,B) insert_dynamic((A),(B)) #define push_dynamic(A,B) insert_dynamic((A),(B))
#define reset_dynamic(array) ((array)->elements= 0) #define reset_dynamic(array) ((array)->elements= 0)
#define sort_dynamic(A,cmp) qsort((A)->buffer, (A)->elements, (A)->size_of_element, (cmp)) #define sort_dynamic(A,cmp) my_qsort((A)->buffer, (A)->elements, (A)->size_of_element, (cmp))
extern my_bool init_dynamic_string(DYNAMIC_STRING *str, const char *init_str, extern my_bool init_dynamic_string(DYNAMIC_STRING *str, const char *init_str,
size_t init_alloc,size_t alloc_increment); size_t init_alloc,size_t alloc_increment);

View File

@ -97,7 +97,7 @@ SET(CLIENT_SOURCES ../mysys/array.c ../strings/bchange.c ../strings/bmove.c
../strings/strmov.c ../strings/strnlen.c ../strings/strnmov.c ../strings/strtod.c ../strings/strmov.c ../strings/strnlen.c ../strings/strnmov.c ../strings/strtod.c
../strings/strtoll.c ../strings/strtoull.c ../strings/strxmov.c ../strings/strxnmov.c ../strings/strtoll.c ../strings/strtoull.c ../strings/strxmov.c ../strings/strxnmov.c
../mysys/thr_mutex.c ../mysys/typelib.c ../vio/vio.c ../vio/viosocket.c ../mysys/thr_mutex.c ../mysys/typelib.c ../vio/vio.c ../vio/viosocket.c
../vio/viossl.c ../vio/viosslfactories.c ../strings/xml.c ../vio/viossl.c ../vio/viosslfactories.c ../strings/xml.c ../mysys/mf_qsort.c
../mysys/my_getsystime.c ${LIB_SOURCES}) ../mysys/my_getsystime.c ${LIB_SOURCES})
# Need to set USE_TLS for building the DLL, since __declspec(thread) # Need to set USE_TLS for building the DLL, since __declspec(thread)

View File

@ -73,7 +73,7 @@ sqlobjects = net.lo
sql_cmn_objects = pack.lo client.lo my_time.lo sql_cmn_objects = pack.lo client.lo my_time.lo
# Not needed in the minimum library # Not needed in the minimum library
mysysobjects2 = my_lib.lo mysysobjects2 = my_lib.lo mf_qsort.lo
mysysobjects = $(mysysobjects1) $(mysysobjects2) mysysobjects = $(mysysobjects1) $(mysysobjects2)
target_libadd = $(mysysobjects) $(mystringsobjects) $(dbugobjects) \ target_libadd = $(mysysobjects) $(mystringsobjects) $(dbugobjects) \
$(sql_cmn_objects) $(vio_objects) $(sqlobjects) $(sql_cmn_objects) $(vio_objects) $(sqlobjects)

View File

@ -1069,6 +1069,15 @@ DROP TABLE t1;
########################################################################### ###########################################################################
#
# Bug #31137: Assertion failed: primary_key_no == -1 || primary_key_no == 0
#
create table t1(a char(10) not null, unique key aa(a(1)),
b char(4) not null, unique key bb(b(4))) engine=innodb;
desc t1;
show create table t1;
drop table t1;
--echo End of 5.0 tests --echo End of 5.0 tests
# Fix for BUG#19243 "wrong LAST_INSERT_ID() after ON DUPLICATE KEY # Fix for BUG#19243 "wrong LAST_INSERT_ID() after ON DUPLICATE KEY
@ -1353,4 +1362,12 @@ if ($test_foreign_keys)
DROP TABLE t1; DROP TABLE t1;
} }
#
# Bug #26447: "ALTER TABLE .. ORDER" does not work with InnoDB and
# auto_increment keys
#
create table t1 (a int auto_increment primary key) engine=innodb;
alter table t1 order by a;
drop table t1;
--echo End of 5.1 tests --echo End of 5.1 tests

View File

@ -33,16 +33,14 @@ my $skip_test;
sub init_pattern { sub init_pattern {
my ($from, $what)= @_; my ($from, $what)= @_;
if ( $from =~ /[a-z0-9]/ ) { if ( $from =~ /^[a-z0-9]$/ ) {
# Does not contain any regex, make the pattern match # Does not contain any regex, make the pattern match
# beginning of string # beginning of string
$from= "^$from"; $from= "^$from";
} }
else { # Check that pattern is a valid regex
# Check that pattern is a valid regex eval { "" =~/$from/; 1 } or
eval { "" =~/$from/; 1 } or mtr_error("Invalid regex '$from' passed to $what\nPerl says: $@");
mtr_error("Invalid regex '$from' passed to $what\nPerl says: $@");
}
return $from; return $from;
} }

View File

@ -257,13 +257,13 @@ our $opt_timer= 1;
our $opt_user; our $opt_user;
our $opt_valgrind= 0; my $opt_valgrind= 0;
our $opt_valgrind_mysqld= 0; my $opt_valgrind_mysqld= 0;
our $opt_valgrind_mysqltest= 0; my $opt_valgrind_mysqltest= 0;
our $default_valgrind_options= "--show-reachable=yes"; my @default_valgrind_args= ("--show-reachable=yes");
our $opt_valgrind_options; my @valgrind_args;
our $opt_valgrind_path; my $opt_valgrind_path;
our $opt_callgrind; my $opt_callgrind;
our $opt_stress= ""; our $opt_stress= "";
our $opt_stress_suite= "main"; our $opt_stress_suite= "main";
@ -577,7 +577,18 @@ sub command_line_setup () {
'valgrind|valgrind-all' => \$opt_valgrind, 'valgrind|valgrind-all' => \$opt_valgrind,
'valgrind-mysqltest' => \$opt_valgrind_mysqltest, 'valgrind-mysqltest' => \$opt_valgrind_mysqltest,
'valgrind-mysqld' => \$opt_valgrind_mysqld, 'valgrind-mysqld' => \$opt_valgrind_mysqld,
'valgrind-options=s' => \$opt_valgrind_options, 'valgrind-options=s' => sub {
my ($opt, $value)= @_;
# Deprecated option unless it's what we know pushbuild uses
if ($value eq "--gen-suppressions=all --show-reachable=yes") {
push(@valgrind_args, $_) for (split(' ', $value));
return;
}
die("--valgrind-options=s is deprecated. Use ",
"--valgrind-option=s, to be specified several",
" times if necessary");
},
'valgrind-option=s' => \@valgrind_args,
'valgrind-path=s' => \$opt_valgrind_path, 'valgrind-path=s' => \$opt_valgrind_path,
'callgrind' => \$opt_callgrind, 'callgrind' => \$opt_callgrind,
@ -980,7 +991,7 @@ sub command_line_setup () {
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
# Check valgrind arguments # Check valgrind arguments
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
if ( $opt_valgrind or $opt_valgrind_path or defined $opt_valgrind_options) if ( $opt_valgrind or $opt_valgrind_path or @valgrind_args)
{ {
mtr_report("Turning on valgrind for all executables"); mtr_report("Turning on valgrind for all executables");
$opt_valgrind= 1; $opt_valgrind= 1;
@ -1005,17 +1016,18 @@ sub command_line_setup () {
$opt_valgrind_mysqld= 1; $opt_valgrind_mysqld= 1;
# Set special valgrind options unless options passed on command line # Set special valgrind options unless options passed on command line
$opt_valgrind_options="--trace-children=yes" push(@valgrind_args, "--trace-children=yes")
unless defined $opt_valgrind_options; unless @valgrind_args;
} }
if ( $opt_valgrind ) if ( $opt_valgrind )
{ {
# Set valgrind_options to default unless already defined # Set valgrind_options to default unless already defined
$opt_valgrind_options=$default_valgrind_options push(@valgrind_args, @default_valgrind_args)
unless defined $opt_valgrind_options; unless @valgrind_args;
mtr_report("Running valgrind with options \"$opt_valgrind_options\""); mtr_report("Running valgrind with options \"",
join(" ", @valgrind_args), "\"");
} }
if ( ! $opt_testcase_timeout ) if ( ! $opt_testcase_timeout )
@ -3770,6 +3782,7 @@ sub mysqld_arguments ($$$$) {
# see BUG#28359 # see BUG#28359
mtr_add_arg($args, "%s--connect-timeout=60", $prefix); mtr_add_arg($args, "%s--connect-timeout=60", $prefix);
# When mysqld is run by a root user(euid is 0), it will fail # When mysqld is run by a root user(euid is 0), it will fail
# to start unless we specify what user to run as. If not running # to start unless we specify what user to run as. If not running
# as root it will be ignored, see BUG#30630 # as root it will be ignored, see BUG#30630
@ -5075,7 +5088,7 @@ sub valgrind_arguments {
} }
# Add valgrind options, can be overriden by user # Add valgrind options, can be overriden by user
mtr_add_arg($args, '%s', $opt_valgrind_options); mtr_add_arg($args, '%s', $_) for (@valgrind_args);
mtr_add_arg($args, $$exe); mtr_add_arg($args, $$exe);
@ -5219,12 +5232,14 @@ Options for coverage, profiling etc
gcov FIXME gcov FIXME
gprof FIXME gprof FIXME
valgrind Run the "mysqltest" and "mysqld" executables using valgrind Run the "mysqltest" and "mysqld" executables using
valgrind with options($default_valgrind_options) valgrind with default options
valgrind-all Synonym for --valgrind valgrind-all Synonym for --valgrind
valgrind-mysqltest Run the "mysqltest" and "mysql_client_test" executable valgrind-mysqltest Run the "mysqltest" and "mysql_client_test" executable
with valgrind with valgrind
valgrind-mysqld Run the "mysqld" executable with valgrind valgrind-mysqld Run the "mysqld" executable with valgrind
valgrind-options=ARGS Options to give valgrind, replaces default options valgrind-options=ARGS Deprecated, use --valgrind-option
valgrind-option=ARGS Option to give valgrind, replaces default option(s),
can be specified more then once
valgrind-path=[EXE] Path to the valgrind executable valgrind-path=[EXE] Path to the valgrind executable
callgrind Instruct valgrind to use callgrind callgrind Instruct valgrind to use callgrind

View File

@ -1,4 +1,4 @@
drop table if exists t1,t2; drop table if exists t1, t2;
select CASE "b" when "a" then 1 when "b" then 2 END; select CASE "b" when "a" then 1 when "b" then 2 END;
CASE "b" when "a" then 1 when "b" then 2 END CASE "b" when "a" then 1 when "b" then 2 END
2 2
@ -200,3 +200,21 @@ CEMPNUM EMPMUM1 EMPNUM2
0.00 0 0.00 0.00 0 0.00
2.00 2 NULL 2.00 2 NULL
DROP TABLE t1,t2; DROP TABLE t1,t2;
End of 4.1 tests
create table t1 (a int, b bigint unsigned);
create table t2 (c int);
insert into t1 (a, b) values (1,4572794622775114594), (2,18196094287899841997),
(3,11120436154190595086);
insert into t2 (c) values (1), (2), (3);
select t1.a, (case t1.a when 0 then 0 else t1.b end) d from t1
join t2 on t1.a=t2.c order by d;
a d
1 4572794622775114594
3 11120436154190595086
2 18196094287899841997
select t1.a, (case t1.a when 0 then 0 else t1.b end) d from t1
join t2 on t1.a=t2.c where b=11120436154190595086 order by d;
a d
3 11120436154190595086
drop table t1, t2;
End of 5.0 tests

View File

@ -811,6 +811,14 @@ quote(name)
???????? ????????
???????????????? ????????????????
drop table bug20536; drop table bug20536;
set names ucs2;
ERROR 42000: Variable 'character_set_client' can't be set to the value of 'ucs2'
set names ucs2 collate ucs2_bin;
ERROR 42000: Variable 'character_set_client' can't be set to the value of 'ucs2'
set character_set_client= ucs2;
ERROR 42000: Variable 'character_set_client' can't be set to the value of 'ucs2'
set character_set_client= concat('ucs', substr('2', 1));
ERROR 42000: Variable 'character_set_client' can't be set to the value of 'ucs2'
CREATE TABLE t1(a TEXT CHARSET ucs2 COLLATE ucs2_unicode_ci); CREATE TABLE t1(a TEXT CHARSET ucs2 COLLATE ucs2_unicode_ci);
INSERT INTO t1 VALUES('abcd'); INSERT INTO t1 VALUES('abcd');
SELECT * FROM t1 WHERE MATCH(a) AGAINST ('+abcd' IN BOOLEAN MODE); SELECT * FROM t1 WHERE MATCH(a) AGAINST ('+abcd' IN BOOLEAN MODE);

View File

@ -212,6 +212,12 @@ test
SELECT NAME_CONST('test', 'test'); SELECT NAME_CONST('test', 'test');
test test
test test
create table t1 (a int not null);
insert into t1 values (-1), (-2);
select min(a) from t1 group by inet_ntoa(a);
min(a)
-2
drop table t1;
End of 5.0 tests End of 5.0 tests
select connection_id() > 0; select connection_id() > 0;
connection_id() > 0 connection_id() > 0

View File

@ -1194,6 +1194,7 @@ ERROR 42000: SELECT command denied to user 'mysqltest_2'@'localhost' for table '
DROP DATABASE mysqltest1; DROP DATABASE mysqltest1;
DROP DATABASE mysqltest2; DROP DATABASE mysqltest2;
DROP USER mysqltest_1@localhost; DROP USER mysqltest_1@localhost;
DROP USER mysqltest_2@localhost;
use test; use test;
CREATE TABLE t1 (f1 int, f2 int); CREATE TABLE t1 (f1 int, f2 int);
INSERT INTO t1 VALUES(1,1), (2,2); INSERT INTO t1 VALUES(1,1), (2,2);
@ -1213,6 +1214,7 @@ f1 f2
REVOKE UPDATE (f1) ON `test`.`t1` FROM 'mysqltest_1'@'localhost'; REVOKE UPDATE (f1) ON `test`.`t1` FROM 'mysqltest_1'@'localhost';
REVOKE SELECT ON `test`.* FROM 'mysqltest_1'@'localhost'; REVOKE SELECT ON `test`.* FROM 'mysqltest_1'@'localhost';
REVOKE ALL ON db27878.* FROM 'mysqltest_1'@'localhost'; REVOKE ALL ON db27878.* FROM 'mysqltest_1'@'localhost';
DROP USER mysqltest_1@localhost;
DROP DATABASE db27878; DROP DATABASE db27878;
use test; use test;
DROP TABLE t1; DROP TABLE t1;
@ -1226,6 +1228,44 @@ drop user юзер_юзер@localhost;
grant select on test.* to очень_длинный_юзер@localhost; grant select on test.* to очень_длинный_юзер@localhost;
ERROR HY000: String 'очень_длинный_юзер' is too long for user name (should be no longer than 16) ERROR HY000: String 'очень_длинный_юзер' is too long for user name (should be no longer than 16)
set names default; set names default;
create database mysqltest;
use mysqltest;
grant create on mysqltest.* to mysqltest@localhost;
create table t1 (i INT);
insert into t1 values (1);
ERROR 42000: INSERT command denied to user 'mysqltest'@'localhost' for table 't1'
create table t2 (i INT);
create table t4 (i INT);
grant select, insert on mysqltest.t2 to mysqltest@localhost;
grant insert on mysqltest.t4 to mysqltest@localhost;
grant create, insert on mysqltest.t5 to mysqltest@localhost;
grant create, insert on mysqltest.t6 to mysqltest@localhost;
flush privileges;
insert into t2 values (1);
create table if not exists t1 select * from t2;
ERROR 42000: INSERT command denied to user 'mysqltest'@'localhost' for table 't1'
create table if not exists t3 select * from t2;
ERROR 42000: INSERT command denied to user 'mysqltest'@'localhost' for table 't3'
create table if not exists t4 select * from t2;
Warnings:
Note 1050 Table 't4' already exists
create table if not exists t5 select * from t2;
create table t6 select * from t2;
create table t7 select * from t2;
ERROR 42000: INSERT command denied to user 'mysqltest'@'localhost' for table 't7'
create table t4 select * from t2;
ERROR 42S01: Table 't4' already exists
create table t1 select * from t2;
ERROR 42000: INSERT command denied to user 'mysqltest'@'localhost' for table 't1'
drop table t1,t2,t4,t5,t6;
revoke create on mysqltest.* from mysqltest@localhost;
revoke select, insert on mysqltest.t2 from mysqltest@localhost;
revoke insert on mysqltest.t4 from mysqltest@localhost;
revoke create, insert on mysqltest.t5 from mysqltest@localhost;
revoke create, insert on mysqltest.t6 from mysqltest@localhost;
drop user mysqltest@localhost;
drop database mysqltest;
use test;
FLUSH PRIVILEGES without procs_priv table. FLUSH PRIVILEGES without procs_priv table.
RENAME TABLE mysql.procs_priv TO mysql.procs_gone; RENAME TABLE mysql.procs_priv TO mysql.procs_gone;
FLUSH PRIVILEGES; FLUSH PRIVILEGES;
@ -1245,3 +1285,4 @@ CALL mysqltest1.test();
DROP DATABASE mysqltest1; DROP DATABASE mysqltest1;
RENAME TABLE mysql.procs_gone TO mysql.procs_priv; RENAME TABLE mysql.procs_gone TO mysql.procs_priv;
FLUSH PRIVILEGES; FLUSH PRIVILEGES;
End of 5.1 tests

View File

@ -925,7 +925,7 @@ id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index NULL b 4 NULL # Using index 1 SIMPLE t1 index NULL b 4 NULL # Using index
explain select a,b from t1; explain select a,b from t1;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index NULL b 4 NULL # Using index 1 SIMPLE t1 index NULL PRIMARY 4 NULL #
explain select a,b,c from t1; explain select a,b,c from t1;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL # 1 SIMPLE t1 ALL NULL NULL NULL NULL #
@ -1153,14 +1153,14 @@ UPDATE t1 set a=a+100 where b between 2 and 3 and a < 1000;
SELECT * from t1; SELECT * from t1;
a b a b
1 1 1 1
102 2
103 3
4 4 4 4
5 5 5 5
6 6 6 6
7 7 7 7
8 8 8 8
9 9 9 9
102 2
103 3
drop table t1; drop table t1;
CREATE TABLE t1 (a int not null primary key, b int not null, key (b)) engine=innodb; CREATE TABLE t1 (a int not null primary key, b int not null, key (b)) engine=innodb;
CREATE TABLE t2 (a int not null primary key, b int not null, key (b)) engine=innodb; CREATE TABLE t2 (a int not null primary key, b int not null, key (b)) engine=innodb;
@ -1184,7 +1184,6 @@ a b
update t1,t2 set t1.a=t1.a+100 where t1.a=101; update t1,t2 set t1.a=t1.a+100 where t1.a=101;
select * from t1; select * from t1;
a b a b
201 1
102 2 102 2
103 3 103 3
104 4 104 4
@ -1196,10 +1195,11 @@ a b
110 10 110 10
111 11 111 11
112 12 112 12
201 1
update t1,t2 set t1.b=t1.b+10 where t1.b=2; update t1,t2 set t1.b=t1.b+10 where t1.b=2;
select * from t1; select * from t1;
a b a b
201 1 102 12
103 3 103 3
104 4 104 4
105 5 105 5
@ -1209,34 +1209,34 @@ a b
109 9 109 9
110 10 110 10
111 11 111 11
102 12
112 12 112 12
201 1
update t1,t2 set t1.b=t1.b+2,t2.b=t1.b+10 where t1.b between 3 and 5 and t1.a=t2.a+100; update t1,t2 set t1.b=t1.b+2,t2.b=t1.b+10 where t1.b between 3 and 5 and t1.a=t2.a+100;
select * from t1; select * from t1;
a b a b
201 1 102 12
103 5 103 5
104 6 104 6
106 6
105 7 105 7
106 6
107 7 107 7
108 8 108 8
109 9 109 9
110 10 110 10
111 11 111 11
102 12
112 12 112 12
201 1
select * from t2; select * from t2;
a b a b
1 1 1 1
2 2 2 2
3 13
4 14
5 15
6 6 6 6
7 7 7 7
8 8 8 8
9 9 9 9
3 13
4 14
5 15
drop table t1,t2; drop table t1,t2;
CREATE TABLE t2 ( NEXT_T BIGINT NOT NULL PRIMARY KEY) ENGINE=MyISAM; CREATE TABLE t2 ( NEXT_T BIGINT NOT NULL PRIMARY KEY) ENGINE=MyISAM;
CREATE TABLE t1 ( B_ID INTEGER NOT NULL PRIMARY KEY) ENGINE=InnoDB; CREATE TABLE t1 ( B_ID INTEGER NOT NULL PRIMARY KEY) ENGINE=InnoDB;
@ -1287,11 +1287,11 @@ insert into t1 (id) values (null),(null),(null),(null),(null);
update t1 set fk=69 where fk is null order by id limit 1; update t1 set fk=69 where fk is null order by id limit 1;
SELECT * from t1; SELECT * from t1;
id fk id fk
1 69
2 NULL 2 NULL
3 NULL 3 NULL
4 NULL 4 NULL
5 NULL 5 NULL
1 69
drop table t1; drop table t1;
create table t1 (a int not null, b int not null, key (a)); create table t1 (a int not null, b int not null, key (a));
insert into t1 values (1,1),(1,2),(1,3),(3,1),(3,2),(3,3),(3,1),(3,2),(3,3),(2,1),(2,2),(2,3); insert into t1 values (1,1),(1,2),(1,3),(3,1),(3,2),(3,3),(3,1),(3,2),(3,3),(2,1),(2,2),(2,3);
@ -2420,8 +2420,8 @@ insert into t1 (b) values (1);
replace into t1 (b) values (2), (1), (3); replace into t1 (b) values (2), (1), (3);
select * from t1; select * from t1;
a b a b
3 1
2 2 2 2
3 1
4 3 4 3
truncate table t1; truncate table t1;
insert into t1 (b) values (1); insert into t1 (b) values (1);
@ -2430,8 +2430,8 @@ replace into t1 (b) values (1);
replace into t1 (b) values (3); replace into t1 (b) values (3);
select * from t1; select * from t1;
a b a b
3 1
2 2 2 2
3 1
4 3 4 3
drop table t1; drop table t1;
create table t1 (rowid int not null auto_increment, val int not null,primary create table t1 (rowid int not null auto_increment, val int not null,primary

View File

@ -353,13 +353,13 @@ EXPLAIN
SELECT COUNT(*) FROM t2 LEFT JOIN t1 ON t2.fkey = t1.id SELECT COUNT(*) FROM t2 LEFT JOIN t1 ON t2.fkey = t1.id
WHERE t1.name LIKE 'A%'; WHERE t1.name LIKE 'A%';
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index PRIMARY,name name 23 NULL 3 Using where; Using index 1 SIMPLE t1 index PRIMARY,name PRIMARY 4 NULL 3 Using where
1 SIMPLE t2 ref fkey fkey 5 test.t1.id 1 Using where; Using index 1 SIMPLE t2 ref fkey fkey 5 test.t1.id 1 Using where; Using index
EXPLAIN EXPLAIN
SELECT COUNT(*) FROM t2 LEFT JOIN t1 ON t2.fkey = t1.id SELECT COUNT(*) FROM t2 LEFT JOIN t1 ON t2.fkey = t1.id
WHERE t1.name LIKE 'A%' OR FALSE; WHERE t1.name LIKE 'A%' OR FALSE;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t2 index NULL fkey 5 NULL 5 Using index 1 SIMPLE t2 index NULL PRIMARY 4 NULL 5
1 SIMPLE t1 eq_ref PRIMARY PRIMARY 4 test.t2.fkey 1 Using where 1 SIMPLE t1 eq_ref PRIMARY PRIMARY 4 test.t2.fkey 1 Using where
DROP TABLE t1,t2; DROP TABLE t1,t2;
CREATE TABLE t1 ( CREATE TABLE t1 (
@ -1264,11 +1264,11 @@ select_type SIMPLE
table t1 table t1
type index type index
possible_keys NULL possible_keys NULL
key b key PRIMARY
key_len 5 key_len 4
ref NULL ref NULL
rows 3 rows 3
Extra Using index; Using filesort Extra Using filesort
SELECT * FROM t1 ORDER BY b ASC, a DESC; SELECT * FROM t1 ORDER BY b ASC, a DESC;
a b a b
1 1 1 1
@ -1280,11 +1280,11 @@ select_type SIMPLE
table t1 table t1
type index type index
possible_keys NULL possible_keys NULL
key b key PRIMARY
key_len 5 key_len 4
ref NULL ref NULL
rows 3 rows 3
Extra Using index; Using filesort Extra Using filesort
SELECT * FROM t1 ORDER BY b DESC, a ASC; SELECT * FROM t1 ORDER BY b DESC, a ASC;
a b a b
2 2 2 2
@ -1325,6 +1325,21 @@ test t1 Redundant
# - that's it, cleanup. # - that's it, cleanup.
DROP TABLE t1; DROP TABLE t1;
create table t1(a char(10) not null, unique key aa(a(1)),
b char(4) not null, unique key bb(b(4))) engine=innodb;
desc t1;
Field Type Null Key Default Extra
a char(10) NO UNI NULL
b char(4) NO PRI NULL
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` char(10) NOT NULL,
`b` char(4) NOT NULL,
UNIQUE KEY `bb` (`b`),
UNIQUE KEY `aa` (`a`(1))
) ENGINE=InnoDB DEFAULT CHARSET=latin1
drop table t1;
End of 5.0 tests End of 5.0 tests
CREATE TABLE `t2` ( CREATE TABLE `t2` (
`k` int(11) NOT NULL auto_increment, `k` int(11) NOT NULL auto_increment,
@ -1573,4 +1588,9 @@ t2 CREATE TABLE `t2` (
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ) ENGINE=InnoDB DEFAULT CHARSET=latin1
DROP TABLE t2; DROP TABLE t2;
DROP TABLE t1; DROP TABLE t1;
create table t1 (a int auto_increment primary key) engine=innodb;
alter table t1 order by a;
Warnings:
Warning 1105 ORDER BY ignored as there is a user-defined clustered index in the table 't1'
drop table t1;
End of 5.1 tests End of 5.1 tests

View File

@ -499,4 +499,138 @@ i
2 2
2 2
DROP TABLE t1, t2; DROP TABLE t1, t2;
CREATE TABLE t1 (
a char(20) NOT NULL,
b char(7) DEFAULT NULL,
c char(4) DEFAULT NULL
);
INSERT INTO t1(a,b,c) VALUES (9.999999e+0, 9.999999e+0, 9.999e+0);
INSERT INTO t1(a,b,c) VALUES (1.225e-05, 1.225e-05, 1.225e-05);
Warnings:
Warning 1265 Data truncated for column 'c' at row 1
INSERT INTO t1(a,b) VALUES (1.225e-04, 1.225e-04);
INSERT INTO t1(a,b) VALUES (1.225e-01, 1.225e-01);
INSERT INTO t1(a,b) VALUES (1.225877e-01, 1.225877e-01);
INSERT INTO t1(a,b) VALUES (1.225e+01, 1.225e+01);
INSERT INTO t1(a,b,c) VALUES (1.225e+01, 1.225e+01, 1.225e+01);
INSERT INTO t1(a,b) VALUES (1.225e+05, 1.225e+05);
INSERT INTO t1(a,b) VALUES (1.225e+10, 1.225e+10);
INSERT INTO t1(a,b) VALUES (1.225e+15, 1.225e+15);
INSERT INTO t1(a,b) VALUES (5000000e+0, 5000000e+0);
INSERT INTO t1(a,b) VALUES (1.25e+78, 1.25e+78);
INSERT INTO t1(a,b) VALUES (1.25e-94, 1.25e-94);
INSERT INTO t1(a,b) VALUES (1.25e+203, 1.25e+203);
INSERT INTO t1(a,b) VALUES (1.25e-175, 1.25e-175);
INSERT INTO t1(a,c) VALUES (1.225e+0, 1.225e+0);
INSERT INTO t1(a,c) VALUES (1.37e+0, 1.37e+0);
INSERT INTO t1(a,c) VALUES (-1.37e+0, -1.37e+0);
Warnings:
Warning 1265 Data truncated for column 'c' at row 1
INSERT INTO t1(a,c) VALUES (1.87e-3, 1.87e-3);
Warnings:
Warning 1265 Data truncated for column 'c' at row 1
INSERT INTO t1(a,c) VALUES (-1.87e-2, -1.87e-2);
Warnings:
Warning 1265 Data truncated for column 'c' at row 1
INSERT INTO t1(a,c) VALUES (5000e+0, 5000e+0);
INSERT INTO t1(a,c) VALUES (-5000e+0, -5000e+0);
Warnings:
Warning 1265 Data truncated for column 'c' at row 1
SELECT * FROM t1;
a b c
9.999999 10 10
1.225e-05 1.2e-05 1e-0
0.0001225 0.00012 NULL
0.1225 0.1225 NULL
0.1225877 0.12259 NULL
12.25 12.25 NULL
12.25 12.25 12.2
122500 122500 NULL
12250000000 1.2e+10 NULL
1.225e+15 1.2e+15 NULL
5000000 5000000 NULL
1.25e+78 1.2e+78 NULL
1.25e-94 1.2e-94 NULL
1.25e+203 1e+203 NULL
1.25e-175 1e-175 NULL
1.225 NULL 1.23
1.37 NULL 1.37
-1.37 NULL -1.3
0.00187 NULL 0.00
-0.0187 NULL -0.0
5000 NULL 5000
-5000 NULL -500
DROP TABLE t1;
CREATE TABLE t1 (
a char(20) NOT NULL,
b char(7) DEFAULT NULL,
c char(5)
);
INSERT INTO t1(a,b,c) VALUES (9.999999e+0, 9.999999e+0, 9.999e+0);
INSERT INTO t1(a,b,c) VALUES (1.225e-05, 1.225e-05, 1.225e-05);
INSERT INTO t1(a,b) VALUES (1.225e-04, 1.225e-04);
INSERT INTO t1(a,b) VALUES (1.225e-01, 1.225e-01);
INSERT INTO t1(a,b) VALUES (1.225877e-01, 1.225877e-01);
INSERT INTO t1(a,b) VALUES (1.225e+01, 1.225e+01);
INSERT INTO t1(a,b,c) VALUES (1.225e+01, 1.225e+01, 1.225e+01);
INSERT INTO t1(a,b) VALUES (1.225e+05, 1.225e+05);
INSERT INTO t1(a,b) VALUES (1.225e+10, 1.225e+10);
INSERT INTO t1(a,b) VALUES (1.225e+15, 1.225e+15);
INSERT INTO t1(a,b) VALUES (5000000e+0, 5000000e+0);
INSERT INTO t1(a,b) VALUES (1.25e+78, 1.25e+78);
INSERT INTO t1(a,b) VALUES (1.25e-94, 1.25e-94);
INSERT INTO t1(a,b) VALUES (1.25e+203, 1.25e+203);
INSERT INTO t1(a,b) VALUES (1.25e-175, 1.25e-175);
INSERT INTO t1(a,c) VALUES (1.225e+0, 1.225e+0);
INSERT INTO t1(a,c) VALUES (1.37e+0, 1.37e+0);
INSERT INTO t1(a,c) VALUES (-1.37e+0, -1.37e+0);
INSERT INTO t1(a,c) VALUES (1.87e-3, 1.87e-3);
INSERT INTO t1(a,c) VALUES (-1.87e-2, -1.87e-2);
Warnings:
Warning 1265 Data truncated for column 'c' at row 1
INSERT INTO t1(a,c) VALUES (5000e+0, 5000e+0);
INSERT INTO t1(a,c) VALUES (-5000e+0, -5000e+0);
SELECT * FROM t1;
a b c
9.999999 10 9.999
1.225e-05 1.2e-05 1e-05
0.0001225 0.00012 NULL
0.1225 0.1225 NULL
0.1225877 0.12259 NULL
12.25 12.25 NULL
12.25 12.25 12.25
122500 122500 NULL
12250000000 1.2e+10 NULL
1.225e+15 1.2e+15 NULL
5000000 5000000 NULL
1.25e+78 1.2e+78 NULL
1.25e-94 1.2e-94 NULL
1.25e+203 1e+203 NULL
1.25e-175 1e-175 NULL
1.225 NULL 1.225
1.37 NULL 1.37
-1.37 NULL -1.37
0.00187 NULL 0.002
-0.0187 NULL -0.01
5000 NULL 5000
-5000 NULL -5000
DROP TABLE t1;
CREATE TABLE t (a CHAR(10),b INT);
INSERT INTO t VALUES (),(),();
INSERT INTO t(a) SELECT rand() FROM t;
DROP TABLE t;
CREATE TABLE t1 (c1 INT NOT NULL);
INSERT INTO t1 VALUES(4188.32999999999992724042385816574096679687500),
('4188.32999999999992724042385816574096679687500'), (4188);
SELECT * FROM t1;
c1
4188
4188
4188
CREATE TABLE t2 (c1 BIGINT);
INSERT INTO t2 VALUES('15449237462.0000000000');
SELECT * FROM t2;
c1
15449237462
DROP TABLE t1, t2;
End of 5.0 tests. End of 5.0 tests.

View File

@ -8,12 +8,12 @@ EXPLAIN
SELECT COUNT(*) FROM t2 LEFT JOIN t1 ON t2.fkey = t1.id SELECT COUNT(*) FROM t2 LEFT JOIN t1 ON t2.fkey = t1.id
WHERE t1.name LIKE 'A%'; WHERE t1.name LIKE 'A%';
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index PRIMARY,name name 23 NULL 3 Using where; Using index 1 SIMPLE t1 index PRIMARY,name PRIMARY 4 NULL 3 Using where
1 SIMPLE t2 ref fkey fkey 5 test.t1.id 1 Using where; Using index 1 SIMPLE t2 ref fkey fkey 5 test.t1.id 1 Using where; Using index
EXPLAIN EXPLAIN
SELECT COUNT(*) FROM t2 LEFT JOIN t1 ON t2.fkey = t1.id SELECT COUNT(*) FROM t2 LEFT JOIN t1 ON t2.fkey = t1.id
WHERE t1.name LIKE 'A%' OR FALSE; WHERE t1.name LIKE 'A%' OR FALSE;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t2 index NULL fkey 5 NULL 5 Using index 1 SIMPLE t2 index NULL PRIMARY 4 NULL 5
1 SIMPLE t1 eq_ref PRIMARY PRIMARY 4 test.t2.fkey 1 Using where 1 SIMPLE t1 eq_ref PRIMARY PRIMARY 4 test.t2.fkey 1 Using where
DROP TABLE t1,t2; DROP TABLE t1,t2;

View File

@ -530,6 +530,51 @@ ORDER BY c.b, c.d
a b c d e f g h i j a b c d a b c d e f g h i j a b c d
2 2 1 2004-11-30 12:00:00 1 0 0 0 0 0 2 3388000 -553000 NULL 2 2 1 2004-11-30 12:00:00 1 0 0 0 0 0 2 3388000 -553000 NULL
DROP TABLE t1, t2; DROP TABLE t1, t2;
create table t1(a int not null, key aa(a),
b char(10) not null, unique key bb(b(1)),
c char(4) not null, unique key cc(c));
desc t1;
Field Type Null Key Default Extra
a int(11) NO MUL NULL
b char(10) NO UNI NULL
c char(4) NO PRI NULL
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL,
`b` char(10) NOT NULL,
`c` char(4) NOT NULL,
UNIQUE KEY `cc` (`c`),
UNIQUE KEY `bb` (`b`(1)),
KEY `aa` (`a`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
create table t1(a int not null, key aa(a),
b char(10) not null, unique key bb(b(1)),
c char(4) not null);
desc t1;
Field Type Null Key Default Extra
a int(11) NO MUL NULL
b char(10) NO UNI NULL
c char(4) NO NULL
alter table t1 add unique key cc(c);
desc t1;
Field Type Null Key Default Extra
a int(11) NO MUL NULL
b char(10) NO UNI NULL
c char(4) NO PRI NULL
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL,
`b` char(10) NOT NULL,
`c` char(4) NOT NULL,
UNIQUE KEY `cc` (`c`),
UNIQUE KEY `bb` (`b`(1)),
KEY `aa` (`a`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
End of 5.0 tests
DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (a INT PRIMARY KEY AUTO_INCREMENT); CREATE TABLE t1 (a INT PRIMARY KEY AUTO_INCREMENT);
INSERT INTO t1 VALUES (), (), (); INSERT INTO t1 VALUES (), (), ();

View File

@ -237,4 +237,16 @@ SELECT @@slow_query_log, @@log_slow_queries;
1 1 1 1
SET GLOBAL general_log = @old_general_log_state; SET GLOBAL general_log = @old_general_log_state;
SET GLOBAL slow_query_log = @old_slow_log_state; SET GLOBAL slow_query_log = @old_slow_log_state;
set @old_general_log_file= @@global.general_log_file;
set @old_slow_query_log_file= @@global.slow_query_log_file;
set global general_log_file= concat('/not exiting path/log.maste', 'r');
ERROR 42000: Variable 'general_log_file' can't be set to the value of '/not exiting path/log.master'
set global general_log_file= NULL;
ERROR 42000: Variable 'general_log_file' can't be set to the value of 'NULL'
set global slow_query_log_file= concat('/not exiting path/log.maste', 'r');
ERROR 42000: Variable 'slow_query_log_file' can't be set to the value of '/not exiting path/log.master'
set global slow_query_log_file= NULL;
ERROR 42000: Variable 'slow_query_log_file' can't be set to the value of 'NULL'
set global general_log_file= @old_general_log_file;
set global slow_query_log_file= @old_slow_query_log_file;
End of 5.1 tests End of 5.1 tests

View File

@ -1,4 +1,4 @@
DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t1, `t``1`, `t 1`;
drop view if exists v1; drop view if exists v1;
drop database if exists client_test_db; drop database if exists client_test_db;
mysql.columns_priv OK mysql.columns_priv OK
@ -57,4 +57,27 @@ test.t1 OK
test.t1 OK test.t1 OK
drop view v1; drop view v1;
drop table t1; drop table t1;
create table `t``1`(a int);
create table `t 1`(a int);
test.t 1 OK
test.t`1 OK
drop table `t``1`, `t 1`;
End of 5.0 tests End of 5.0 tests
create table t1(a int);
create view v1 as select * from t1;
show tables;
Tables_in_test
t1
v1
show tables;
Tables_in_test
t1
#mysql50#v-1
v1
show tables;
Tables_in_test
t1
v1
v-1
drop view v1, `v-1`;
drop table t1;

View File

@ -1143,6 +1143,11 @@ a
13 13
DEALLOCATE PREPARE st1; DEALLOCATE PREPARE st1;
DROP TABLE t1; DROP TABLE t1;
create table t1 (a int, b tinyint);
prepare st1 from 'update t1 set b= (str_to_date(a, a))';
execute st1;
deallocate prepare st1;
drop table t1;
End of 4.1 tests. End of 4.1 tests.
create table t1 (a varchar(20)); create table t1 (a varchar(20));
insert into t1 values ('foo'); insert into t1 values ('foo');

View File

@ -8,6 +8,8 @@ VARIABLE_NAME VARIABLE_VALUE
TABLE_LOCKS_IMMEDIATE 2 TABLE_LOCKS_IMMEDIATE 2
TABLE_LOCKS_WAITED 0 TABLE_LOCKS_WAITED 0
SET SQL_LOG_BIN=0; SET SQL_LOG_BIN=0;
set @old_general_log = @@global.general_log;
set global general_log = 'OFF';
drop table if exists t1; drop table if exists t1;
create table t1(n int) engine=myisam; create table t1(n int) engine=myisam;
insert into t1 values(1); insert into t1 values(1);
@ -20,6 +22,7 @@ show status like 'Table_locks_waited';
Variable_name Value Variable_name Value
Table_locks_waited 1 Table_locks_waited 1
drop table t1; drop table t1;
set global general_log = @old_general_log;
select 1; select 1;
1 1
1 1

View File

@ -1509,6 +1509,26 @@ SELECT 1 FROM t1 GROUP BY @b := @a, @b;
1 1
1 1
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 SELECT 0.123456789012345678901234567890123456 AS f1;
Warnings:
Note 1265 Data truncated for column 'f1' at row 1
DESC t1;
Field Type Null Key Default Extra
f1 decimal(31,30) NO 0.000000000000000000000000000000
SELECT f1 FROM t1;
f1
0.123456789012345678901234567890
DROP TABLE t1;
CREATE TABLE t1 SELECT 123451234512345123451234512345123451234512345.678906789067890678906789067890678906789067890 AS f1;
Warnings:
Warning 1264 Out of range value for column 'f1' at row 1
DESC t1;
Field Type Null Key Default Extra
f1 decimal(59,30) NO 0.000000000000000000000000000000
SELECT f1 FROM t1;
f1
99999999999999999999999999999.999999999999999999999999999999
DROP TABLE t1;
End of 5.0 tests End of 5.0 tests
select cast(143.481 as decimal(4,1)); select cast(143.481 as decimal(4,1));
cast(143.481 as decimal(4,1)) cast(143.481 as decimal(4,1))

View File

@ -81,6 +81,16 @@ if (`select $slave_count != $master_count`)
echo master and slave differed in number of rows; echo master and slave differed in number of rows;
echo master: $master_count; echo master: $master_count;
echo slave: $slave_count; echo slave: $slave_count;
connection master;
echo === master ===;
select count(*) t1;
select * from t1;
connection slave;
echo === slave ===;
select count(*) t1;
select * from t1;
query_vertical show slave status;
} }
connection master; connection master;

View File

@ -1,9 +1,9 @@
#
# Testing of CASE # Testing of CASE
# #
--disable_warnings --disable_warnings
drop table if exists t1,t2; drop table if exists t1, t2;
--enable_warnings --enable_warnings
select CASE "b" when "a" then 1 when "b" then 2 END; select CASE "b" when "a" then 1 when "b" then 2 END;
@ -152,4 +152,21 @@ SELECT IFNULL(t2.EMPNUM,t1.EMPNUM) AS CEMPNUM,
FROM t1 LEFT JOIN t2 ON t1.EMPNUM=t2.EMPNUM; FROM t1 LEFT JOIN t2 ON t1.EMPNUM=t2.EMPNUM;
DROP TABLE t1,t2; DROP TABLE t1,t2;
# End of 4.1 tests
--echo End of 4.1 tests
#
# #30782: Truncated UNSIGNED BIGINT columns
#
create table t1 (a int, b bigint unsigned);
create table t2 (c int);
insert into t1 (a, b) values (1,4572794622775114594), (2,18196094287899841997),
(3,11120436154190595086);
insert into t2 (c) values (1), (2), (3);
select t1.a, (case t1.a when 0 then 0 else t1.b end) d from t1
join t2 on t1.a=t2.c order by d;
select t1.a, (case t1.a when 0 then 0 else t1.b end) d from t1
join t2 on t1.a=t2.c where b=11120436154190595086 order by d;
drop table t1, t2;
--echo End of 5.0 tests

View File

@ -547,6 +547,18 @@ select quote(name) from bug20536;
drop table bug20536; drop table bug20536;
#
# Bug #31615: crash after set names ucs2 collate xxx
#
--error 1231
set names ucs2;
--error 1231
set names ucs2 collate ucs2_bin;
--error 1231
set character_set_client= ucs2;
--error 1231
set character_set_client= concat('ucs', substr('2', 1));
# #
# BUG#31159 - fulltext search on ucs2 column crashes server # BUG#31159 - fulltext search on ucs2 column crashes server
# #

View File

@ -213,6 +213,14 @@ SELECT NAME_CONST('test', 1.0);
SELECT NAME_CONST('test', -1.0); SELECT NAME_CONST('test', -1.0);
SELECT NAME_CONST('test', 'test'); SELECT NAME_CONST('test', 'test');
#
# Bug #31349: ERROR 1062 (23000): Duplicate entry '' for key 'group_key'
#
create table t1 (a int not null);
insert into t1 values (-1), (-2);
select min(a) from t1 group by inet_ntoa(a);
drop table t1;
--echo End of 5.0 tests --echo End of 5.0 tests
# #

View File

@ -1235,6 +1235,7 @@ DROP DATABASE mysqltest1;
DROP DATABASE mysqltest2; DROP DATABASE mysqltest2;
DROP USER mysqltest_1@localhost; DROP USER mysqltest_1@localhost;
DROP USER mysqltest_2@localhost;
# #
# Bug#27878: Unchecked privileges on a view referring to a table from another # Bug#27878: Unchecked privileges on a view referring to a table from another
@ -1260,6 +1261,7 @@ connection default;
REVOKE UPDATE (f1) ON `test`.`t1` FROM 'mysqltest_1'@'localhost'; REVOKE UPDATE (f1) ON `test`.`t1` FROM 'mysqltest_1'@'localhost';
REVOKE SELECT ON `test`.* FROM 'mysqltest_1'@'localhost'; REVOKE SELECT ON `test`.* FROM 'mysqltest_1'@'localhost';
REVOKE ALL ON db27878.* FROM 'mysqltest_1'@'localhost'; REVOKE ALL ON db27878.* FROM 'mysqltest_1'@'localhost';
DROP USER mysqltest_1@localhost;
DROP DATABASE db27878; DROP DATABASE db27878;
use test; use test;
DROP TABLE t1; DROP TABLE t1;
@ -1278,6 +1280,82 @@ drop user юзер_юзер@localhost;
grant select on test.* to очень_длинный_юзер@localhost; grant select on test.* to очень_длинный_юзер@localhost;
set names default; set names default;
#
# Bug #20901 - CREATE privilege is enough to insert into a table
#
create database mysqltest;
use mysqltest;
grant create on mysqltest.* to mysqltest@localhost;
create table t1 (i INT);
connect (user1,localhost,mysqltest,,mysqltest);
connection user1;
# show we don't have INSERT
--error 1142
insert into t1 values (1);
# show we have CREATE
create table t2 (i INT);
create table t4 (i INT);
connection default;
grant select, insert on mysqltest.t2 to mysqltest@localhost;
grant insert on mysqltest.t4 to mysqltest@localhost;
# to specify ACLs for non-existent objects, must explictly |CREATE
grant create, insert on mysqltest.t5 to mysqltest@localhost;
grant create, insert on mysqltest.t6 to mysqltest@localhost;
flush privileges;
connection user1;
insert into t2 values (1);
# CREATE IF NOT EXISTS...SELECT, t1 exists, no INSERT, must fail
--error 1142
create table if not exists t1 select * from t2;
# CREATE IF NOT EXISTS...SELECT, no t3 yet, no INSERT, must fail
--error 1142
create table if not exists t3 select * from t2;
# CREATE IF NOT EXISTS...SELECT, t4 exists, have INSERT, must succeed
create table if not exists t4 select * from t2;
# CREATE IF NOT EXISTS...SELECT, no t5 yet, have INSERT, must succeed
create table if not exists t5 select * from t2;
# CREATE...SELECT, no t6 yet, have INSERT, must succeed
create table t6 select * from t2;
# CREATE...SELECT, no t7 yet, no INSERT, must fail
--error 1142
create table t7 select * from t2;
# CREATE...SELECT, t4 exists, have INSERT, must still fail (exists)
--error 1050
create table t4 select * from t2;
# CREATE...SELECT, t1 exists, no INSERT, must fail
--error 1142
create table t1 select * from t2;
connection default;
drop table t1,t2,t4,t5,t6;
revoke create on mysqltest.* from mysqltest@localhost;
revoke select, insert on mysqltest.t2 from mysqltest@localhost;
revoke insert on mysqltest.t4 from mysqltest@localhost;
revoke create, insert on mysqltest.t5 from mysqltest@localhost;
revoke create, insert on mysqltest.t6 from mysqltest@localhost;
drop user mysqltest@localhost;
disconnect user1;
drop database mysqltest;
use test;
# #
# Bug #16470 crash on grant if old grant tables # Bug #16470 crash on grant if old grant tables
@ -1297,3 +1375,5 @@ DROP DATABASE mysqltest1;
RENAME TABLE mysql.procs_gone TO mysql.procs_priv; RENAME TABLE mysql.procs_gone TO mysql.procs_priv;
FLUSH PRIVILEGES; FLUSH PRIVILEGES;
--echo End of 5.1 tests

View File

@ -387,5 +387,106 @@ SELECT * FROM t2;
DROP TABLE t1, t2; DROP TABLE t1, t2;
#
# Bug #26788: mysqld (debug) aborts when inserting specific numbers into char
# fields
#
CREATE TABLE t1 (
a char(20) NOT NULL,
b char(7) DEFAULT NULL,
c char(4) DEFAULT NULL
);
INSERT INTO t1(a,b,c) VALUES (9.999999e+0, 9.999999e+0, 9.999e+0);
INSERT INTO t1(a,b,c) VALUES (1.225e-05, 1.225e-05, 1.225e-05);
INSERT INTO t1(a,b) VALUES (1.225e-04, 1.225e-04);
INSERT INTO t1(a,b) VALUES (1.225e-01, 1.225e-01);
INSERT INTO t1(a,b) VALUES (1.225877e-01, 1.225877e-01);
INSERT INTO t1(a,b) VALUES (1.225e+01, 1.225e+01);
INSERT INTO t1(a,b,c) VALUES (1.225e+01, 1.225e+01, 1.225e+01);
INSERT INTO t1(a,b) VALUES (1.225e+05, 1.225e+05);
INSERT INTO t1(a,b) VALUES (1.225e+10, 1.225e+10);
INSERT INTO t1(a,b) VALUES (1.225e+15, 1.225e+15);
INSERT INTO t1(a,b) VALUES (5000000e+0, 5000000e+0);
INSERT INTO t1(a,b) VALUES (1.25e+78, 1.25e+78);
INSERT INTO t1(a,b) VALUES (1.25e-94, 1.25e-94);
INSERT INTO t1(a,b) VALUES (1.25e+203, 1.25e+203);
INSERT INTO t1(a,b) VALUES (1.25e-175, 1.25e-175);
INSERT INTO t1(a,c) VALUES (1.225e+0, 1.225e+0);
INSERT INTO t1(a,c) VALUES (1.37e+0, 1.37e+0);
INSERT INTO t1(a,c) VALUES (-1.37e+0, -1.37e+0);
INSERT INTO t1(a,c) VALUES (1.87e-3, 1.87e-3);
INSERT INTO t1(a,c) VALUES (-1.87e-2, -1.87e-2);
INSERT INTO t1(a,c) VALUES (5000e+0, 5000e+0);
INSERT INTO t1(a,c) VALUES (-5000e+0, -5000e+0);
# Expected results are "12.2" and "1.2e+78", but Windows returns "12.3" and
# "1.3e+78" due to different rounding rules
--replace_result 12.3 12.2 1.3e+78 1.2e+78
SELECT * FROM t1;
DROP TABLE t1;
CREATE TABLE t1 (
a char(20) NOT NULL,
b char(7) DEFAULT NULL,
c char(5)
);
INSERT INTO t1(a,b,c) VALUES (9.999999e+0, 9.999999e+0, 9.999e+0);
INSERT INTO t1(a,b,c) VALUES (1.225e-05, 1.225e-05, 1.225e-05);
INSERT INTO t1(a,b) VALUES (1.225e-04, 1.225e-04);
INSERT INTO t1(a,b) VALUES (1.225e-01, 1.225e-01);
INSERT INTO t1(a,b) VALUES (1.225877e-01, 1.225877e-01);
INSERT INTO t1(a,b) VALUES (1.225e+01, 1.225e+01);
INSERT INTO t1(a,b,c) VALUES (1.225e+01, 1.225e+01, 1.225e+01);
INSERT INTO t1(a,b) VALUES (1.225e+05, 1.225e+05);
INSERT INTO t1(a,b) VALUES (1.225e+10, 1.225e+10);
INSERT INTO t1(a,b) VALUES (1.225e+15, 1.225e+15);
INSERT INTO t1(a,b) VALUES (5000000e+0, 5000000e+0);
INSERT INTO t1(a,b) VALUES (1.25e+78, 1.25e+78);
INSERT INTO t1(a,b) VALUES (1.25e-94, 1.25e-94);
INSERT INTO t1(a,b) VALUES (1.25e+203, 1.25e+203);
INSERT INTO t1(a,b) VALUES (1.25e-175, 1.25e-175);
INSERT INTO t1(a,c) VALUES (1.225e+0, 1.225e+0);
INSERT INTO t1(a,c) VALUES (1.37e+0, 1.37e+0);
INSERT INTO t1(a,c) VALUES (-1.37e+0, -1.37e+0);
INSERT INTO t1(a,c) VALUES (1.87e-3, 1.87e-3);
INSERT INTO t1(a,c) VALUES (-1.87e-2, -1.87e-2);
INSERT INTO t1(a,c) VALUES (5000e+0, 5000e+0);
INSERT INTO t1(a,c) VALUES (-5000e+0, -5000e+0);
# Expected results are "12.2" and "1.2e+78", but Windows returns "12.3" and
# "1.3e+78" due to different rounding rules
--replace_result 12.3 12.2 1.3e+78 1.2e+78
SELECT * FROM t1;
DROP TABLE t1;
#
# Bug #31152: assertion in Field_str::store(double)
#
CREATE TABLE t (a CHAR(10),b INT);
INSERT INTO t VALUES (),(),();
INSERT INTO t(a) SELECT rand() FROM t;
DROP TABLE t;
#
# Bug #30453: String not cast to int correctly
#
CREATE TABLE t1 (c1 INT NOT NULL);
INSERT INTO t1 VALUES(4188.32999999999992724042385816574096679687500),
('4188.32999999999992724042385816574096679687500'), (4188);
SELECT * FROM t1;
CREATE TABLE t2 (c1 BIGINT);
INSERT INTO t2 VALUES('15449237462.0000000000');
SELECT * FROM t2;
DROP TABLE t1, t2;
--echo End of 5.0 tests. --echo End of 5.0 tests.

View File

@ -502,6 +502,26 @@ ORDER BY c.b, c.d
DROP TABLE t1, t2; DROP TABLE t1, t2;
#
# Bug #31137: Assertion failed: primary_key_no == -1 || primary_key_no == 0
#
create table t1(a int not null, key aa(a),
b char(10) not null, unique key bb(b(1)),
c char(4) not null, unique key cc(c));
desc t1;
show create table t1;
drop table t1;
create table t1(a int not null, key aa(a),
b char(10) not null, unique key bb(b(1)),
c char(4) not null);
desc t1;
alter table t1 add unique key cc(c);
desc t1;
show create table t1;
drop table t1;
--echo End of 5.0 tests
# #
# Bug #31148: bool close_thread_table(THD*, TABLE**): Assertion # Bug #31148: bool close_thread_table(THD*, TABLE**): Assertion
# `table->key_read == 0' failed. # `table->key_read == 0' failed.

View File

@ -213,6 +213,24 @@ SELECT @@slow_query_log, @@log_slow_queries;
SET GLOBAL general_log = @old_general_log_state; SET GLOBAL general_log = @old_general_log_state;
SET GLOBAL slow_query_log = @old_slow_log_state; SET GLOBAL slow_query_log = @old_slow_log_state;
#
# Bug #31604: server crash when setting slow_query_log_file/general_log_file
#
set @old_general_log_file= @@global.general_log_file;
set @old_slow_query_log_file= @@global.slow_query_log_file;
--error 1231
set global general_log_file= concat('/not exiting path/log.maste', 'r');
--error 1231
set global general_log_file= NULL;
--error 1231
set global slow_query_log_file= concat('/not exiting path/log.maste', 'r');
--error 1231
set global slow_query_log_file= NULL;
set global general_log_file= @old_general_log_file;
set global slow_query_log_file= @old_slow_query_log_file;
--echo End of 5.1 tests --echo End of 5.1 tests
--enable_ps_protocol --enable_ps_protocol

View File

@ -11,7 +11,7 @@
# #
--disable_warnings --disable_warnings
DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t1, `t``1`, `t 1`;
drop view if exists v1; drop view if exists v1;
drop database if exists client_test_db; drop database if exists client_test_db;
--enable_warnings --enable_warnings
@ -37,4 +37,26 @@ create view v1 as select * from t1;
drop view v1; drop view v1;
drop table t1; drop table t1;
#
# Bug #30654: mysqlcheck fails during upgrade of tables whose names include backticks
#
create table `t``1`(a int);
create table `t 1`(a int);
--replace_result 'Table is already up to date' OK
--exec $MYSQL_CHECK --databases test
drop table `t``1`, `t 1`;
--echo End of 5.0 tests --echo End of 5.0 tests
#
# Bug #30679: 5.1 name encoding not performed for views during upgrade
#
create table t1(a int);
create view v1 as select * from t1;
show tables;
--copy_file $MYSQLTEST_VARDIR/master-data/test/v1.frm $MYSQLTEST_VARDIR/master-data/test/v-1.frm
show tables;
--exec $MYSQL_CHECK --check-upgrade --fix-table-names --databases test
show tables;
drop view v1, `v-1`;
drop table t1;

View File

@ -1223,6 +1223,16 @@ EXECUTE st1;
DEALLOCATE PREPARE st1; DEALLOCATE PREPARE st1;
DROP TABLE t1; DROP TABLE t1;
#
# Bug #32137: prepared statement crash with str_to_date in update clause
#
create table t1 (a int, b tinyint);
prepare st1 from 'update t1 set b= (str_to_date(a, a))';
execute st1;
deallocate prepare st1;
drop table t1;
--echo End of 4.1 tests. --echo End of 4.1 tests.
############################# 5.0 tests start ################################ ############################# 5.0 tests start ################################

View File

@ -21,6 +21,8 @@ select * from information_schema.session_status where variable_name like 'Table_
connection con1; connection con1;
# ++Immediate = 3 # ++Immediate = 3
SET SQL_LOG_BIN=0; SET SQL_LOG_BIN=0;
set @old_general_log = @@global.general_log;
set global general_log = 'OFF';
--disable_warnings --disable_warnings
# ++Immediate = 4 # ++Immediate = 4
drop table if exists t1; drop table if exists t1;
@ -60,6 +62,7 @@ reap;
# ++Immediate = 16 + $wait_condition_reps # ++Immediate = 16 + $wait_condition_reps
show status like 'Table_locks_waited'; show status like 'Table_locks_waited';
drop table t1; drop table t1;
set global general_log = @old_general_log;
disconnect con2; disconnect con2;
disconnect con1; disconnect con1;

View File

@ -116,15 +116,10 @@ drop table if exists t1;
# Check conversion of floats to character field (Bug #7774) # Check conversion of floats to character field (Bug #7774)
create table t1 (c char(20)); create table t1 (c char(20));
insert into t1 values (5e-28); insert into t1 values (5e-28);
# Expected result is "5e-28", but windows returns "5e-028"
--replace_result 5e-028 5e-28
select * from t1; select * from t1;
drop table t1; drop table t1;
create table t1 (c char(6)); create table t1 (c char(6));
insert into t1 values (2e5),(2e6),(2e-4),(2e-5); insert into t1 values (2e5),(2e6),(2e-4),(2e-5);
# Expected result is "2e+06", but windows returns "2e+006"
# Expected result is "2e-05", but windows returns "2e-005"
--replace_result 2e+006 2e+06 2e-005 2e-05
select * from t1; select * from t1;
drop table t1; drop table t1;

View File

@ -1205,6 +1205,27 @@ SELECT 1 FROM t1 GROUP BY @b := @a, @b;
DROP TABLE t1; DROP TABLE t1;
#
# Bug #24907: unpredictable (display) precission, if input precission
# increases
#
# As per 10.1.1. Overview of Numeric Types, type (new) DECIMAL has a
# maxmimum precision of 30 places after the decimal point. Show that
# temp field creation beyond that works and throws a truncation warning.
# DECIMAL(37,36) should be adjusted to DECIMAL(31,30).
CREATE TABLE t1 SELECT 0.123456789012345678901234567890123456 AS f1;
DESC t1;
SELECT f1 FROM t1;
DROP TABLE t1;
# too many decimal places, AND too many digits altogether (90 = 45+45).
# should preserve integers (65 = 45+20)
CREATE TABLE t1 SELECT 123451234512345123451234512345123451234512345.678906789067890678906789067890678906789067890 AS f1;
DESC t1;
SELECT f1 FROM t1;
DROP TABLE t1;
--echo End of 5.0 tests --echo End of 5.0 tests
# #

View File

@ -3429,7 +3429,7 @@ static int flush_cached_blocks(KEY_CACHE *keycache,
As all blocks referred in 'cache' are marked by BLOCK_IN_FLUSH As all blocks referred in 'cache' are marked by BLOCK_IN_FLUSH
we are guarunteed no thread will change them we are guarunteed no thread will change them
*/ */
qsort((uchar*) cache, count, sizeof(*cache), (qsort_cmp) cmp_sec_link); my_qsort((uchar*) cache, count, sizeof(*cache), (qsort_cmp) cmp_sec_link);
keycache_pthread_mutex_lock(&keycache->cache_lock); keycache_pthread_mutex_lock(&keycache->cache_lock);
/* /*

View File

@ -91,10 +91,10 @@ typedef struct st_stack
*****************************************************************************/ *****************************************************************************/
#ifdef QSORT_EXTRA_CMP_ARGUMENT #ifdef QSORT_EXTRA_CMP_ARGUMENT
qsort_t qsort2(void *base_ptr, size_t count, size_t size, qsort2_cmp cmp, qsort_t my_qsort2(void *base_ptr, size_t count, size_t size, qsort2_cmp cmp,
void *cmp_argument) void *cmp_argument)
#else #else
qsort_t qsort(void *base_ptr, size_t count, size_t size, qsort_cmp cmp) qsort_t my_qsort(void *base_ptr, size_t count, size_t size, qsort_cmp cmp)
#endif #endif
{ {
char *low, *high, *pivot; char *low, *high, *pivot;

View File

@ -34,8 +34,8 @@ void my_string_ptr_sort(uchar *base, uint items, size_t size)
{ {
if (size && items) if (size && items)
{ {
qsort2(base,items, sizeof(uchar*), get_ptr_compare(size), my_qsort2(base,items, sizeof(uchar*), get_ptr_compare(size),
(void*) &size); (void*) &size);
} }
} }
} }

View File

@ -180,7 +180,7 @@ MY_DIR *my_dir(const char *path, myf MyFlags)
result->number_off_files= dir_entries_storage->elements; result->number_off_files= dir_entries_storage->elements;
if (!(MyFlags & MY_DONT_SORT)) if (!(MyFlags & MY_DONT_SORT))
qsort((void *) result->dir_entry, result->number_off_files, my_qsort((void *) result->dir_entry, result->number_off_files,
sizeof(FILEINFO), (qsort_cmp) comp_names); sizeof(FILEINFO), (qsort_cmp) comp_names);
DBUG_RETURN(result); DBUG_RETURN(result);
@ -491,7 +491,7 @@ MY_DIR *my_dir(const char *path, myf MyFlags)
result->number_off_files= dir_entries_storage->elements; result->number_off_files= dir_entries_storage->elements;
if (!(MyFlags & MY_DONT_SORT)) if (!(MyFlags & MY_DONT_SORT))
qsort((void *) result->dir_entry, result->number_off_files, my_qsort((void *) result->dir_entry, result->number_off_files,
sizeof(FILEINFO), (qsort_cmp) comp_names); sizeof(FILEINFO), (qsort_cmp) comp_names);
DBUG_PRINT("exit", ("found %d files", result->number_off_files)); DBUG_PRINT("exit", ("found %d files", result->number_off_files));
DBUG_RETURN(result); DBUG_RETURN(result);

View File

@ -29,6 +29,10 @@ size_t my_write(int Filedes, const uchar *Buffer, size_t Count, myf MyFlags)
Filedes, (long) Buffer, (ulong) Count, MyFlags)); Filedes, (long) Buffer, (ulong) Count, MyFlags));
errors=0; written=0; errors=0; written=0;
/* The behavior of write(fd, buf, 0) is not portable */
if (unlikely(!Count))
DBUG_RETURN(0);
for (;;) for (;;)
{ {
if ((writenbytes= write(Filedes, Buffer, Count)) == Count) if ((writenbytes= write(Filedes, Buffer, Count)) == Count)

View File

@ -382,7 +382,7 @@ void queue_fix(QUEUE *queue)
make test_priority_queue make test_priority_queue
./test_priority_queue ./test_priority_queue
Written by Mikael Ronström, 2005 Written by Mikael Ronström, 2005
*/ */
static uint num_array[1025]; static uint num_array[1025];

View File

@ -6401,24 +6401,74 @@ int Field_str::store(double nr)
ASSERT_COLUMN_MARKED_FOR_WRITE; ASSERT_COLUMN_MARKED_FOR_WRITE;
char buff[DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE]; char buff[DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE];
uint length; uint length;
bool use_scientific_notation= TRUE;
uint local_char_length= field_length / charset()->mbmaxlen; uint local_char_length= field_length / charset()->mbmaxlen;
/*
Check fabs(nr) against longest value that can be stored in field,
which depends on whether the value is < 1 or not, and negative or not
*/
double anr= fabs(nr); double anr= fabs(nr);
bool fractional= (anr != floor(anr));
int neg= (nr < 0.0) ? 1 : 0; int neg= (nr < 0.0) ? 1 : 0;
if (local_char_length > 4 && local_char_length < 32 && uint max_length;
(anr < 1.0 ? anr > 1/(log_10[max(0,(int) local_char_length-neg-2)]) /* -2 for "0." */ int exp;
: anr < log_10[local_char_length-neg]-1)) uint digits;
use_scientific_notation= FALSE; uint i;
/* Calculate the exponent from the 'e'-format conversion */
if (anr < 1.0 && anr > 0)
{
for (exp= 0; anr < 1e-100; exp-= 100, anr*= 1e100);
for (; anr < 1e-10; exp-= 10, anr*= 1e10);
for (i= 1; anr < 1 / log_10[i]; exp--, i++);
exp--;
}
else
{
for (exp= 0; anr > 1e100; exp+= 100, anr/= 1e100);
for (; anr > 1e10; exp+= 10, anr/= 1e10);
for (i= 1; anr > log_10[i]; exp++, i++);
}
max_length= local_char_length - neg;
/*
Since in sprintf("%g") precision means the number of significant digits,
calculate the maximum number of significant digits if the 'f'-format
would be used (+1 for decimal point if the number has a fractional part).
*/
digits= max(0, (int) max_length - fractional);
/*
If the exponent is negative, decrease digits by the number of leading zeros
after the decimal point that do not count as significant digits.
*/
if (exp < 0)
digits= max(0, (int) digits + exp);
/*
'e'-format is used only if the exponent is less than -4 or greater than or
equal to the precision. In this case we need to adjust the number of
significant digits to take "e+NN" + decimal point into account (hence -5).
We also have to reserve one additional character if abs(exp) >= 100.
*/
if (exp >= (int) digits || exp < -4)
digits= max(0, (int) (max_length - 5 - (exp >= 100 || exp <= -100)));
/* Limit precision to DBL_DIG to avoid garbage past significant digits */
set_if_smaller(digits, DBL_DIG);
length= (uint) my_sprintf(buff, (buff, "%-.*g", digits, nr));
#ifdef __WIN__
/*
Windows always zero-pads the exponent to 3 digits, we want to remove the
leading 0 to match the sprintf() output on other platforms.
*/
if ((exp >= (int) digits || exp < -4) && exp > -100 && exp < 100)
{
DBUG_ASSERT(length >= 6); /* 1e+NNN */
uint tmp= length - 3;
buff[tmp]= buff[tmp + 1];
tmp++;
buff[tmp]= buff[tmp + 1];
length--;
}
#endif
length= (uint) my_sprintf(buff, (buff, "%-.*g",
(use_scientific_notation ?
max(0, (int)local_char_length-neg-5) :
local_char_length),
nr));
/* /*
+1 below is because "precision" in %g above means the +1 below is because "precision" in %g above means the
max. number of significant digits, not the output width. max. number of significant digits, not the output width.

View File

@ -2626,6 +2626,23 @@ bool Item_func_case::fix_fields(THD *thd, Item **ref)
} }
void Item_func_case::agg_str_lengths(Item* arg)
{
set_if_bigger(max_length, arg->max_length);
set_if_bigger(decimals, arg->decimals);
unsigned_flag= unsigned_flag && arg->unsigned_flag;
}
void Item_func_case::agg_num_lengths(Item *arg)
{
uint len= my_decimal_length_to_precision(arg->max_length, arg->decimals,
arg->unsigned_flag) - arg->decimals;
set_if_bigger(max_length, len);
set_if_bigger(decimals, arg->decimals);
unsigned_flag= unsigned_flag && arg->unsigned_flag;
}
void Item_func_case::fix_length_and_dec() void Item_func_case::fix_length_and_dec()
{ {
@ -2689,15 +2706,22 @@ void Item_func_case::fix_length_and_dec()
max_length=0; max_length=0;
decimals=0; decimals=0;
for (uint i=0 ; i < ncases ; i+=2) unsigned_flag= TRUE;
if (cached_result_type == STRING_RESULT)
{ {
set_if_bigger(max_length,args[i+1]->max_length); for (uint i= 0; i < ncases; i+= 2)
set_if_bigger(decimals,args[i+1]->decimals); agg_str_lengths(args[i + 1]);
if (else_expr_num != -1)
agg_str_lengths(args[else_expr_num]);
} }
if (else_expr_num != -1) else
{ {
set_if_bigger(max_length,args[else_expr_num]->max_length); for (uint i= 0; i < ncases; i+= 2)
set_if_bigger(decimals,args[else_expr_num]->decimals); agg_num_lengths(args[i + 1]);
if (else_expr_num != -1)
agg_num_lengths(args[else_expr_num]);
max_length= my_decimal_precision_to_length(max_length + decimals, decimals,
unsigned_flag);
} }
} }
@ -2901,7 +2925,7 @@ static inline int cmp_ulongs (ulonglong a_val, ulonglong b_val)
SYNOPSIS SYNOPSIS
cmp_longlong() cmp_longlong()
cmp_arg an argument passed to the calling function (qsort2) cmp_arg an argument passed to the calling function (my_qsort2)
a left argument a left argument
b right argument b right argument

View File

@ -742,7 +742,7 @@ public:
virtual uchar *get_value(Item *item)=0; virtual uchar *get_value(Item *item)=0;
void sort() void sort()
{ {
qsort2(base,used_count,size,compare,collation); my_qsort2(base,used_count,size,compare,collation);
} }
int find(Item *item); int find(Item *item);
@ -1145,6 +1145,8 @@ public:
Item *find_item(String *str); Item *find_item(String *str);
CHARSET_INFO *compare_collation() { return cmp_collation.collation; } CHARSET_INFO *compare_collation() { return cmp_collation.collation; }
void cleanup(); void cleanup();
void agg_str_lengths(Item *arg);
void agg_num_lengths(Item *arg);
}; };
/* /*

View File

@ -657,7 +657,12 @@ public:
} }
String* val_str(String* str); String* val_str(String* str);
const char *func_name() const { return "inet_ntoa"; } const char *func_name() const { return "inet_ntoa"; }
void fix_length_and_dec() { decimals = 0; max_length=3*8+7; maybe_null=1;} void fix_length_and_dec()
{
decimals= 0;
max_length= 3 * 8 + 7;
maybe_null= 1;
}
}; };
class Item_func_quote :public Item_str_func class Item_func_quote :public Item_str_func

View File

@ -3241,38 +3241,42 @@ get_date_time_result_type(const char *format, uint length)
void Item_func_str_to_date::fix_length_and_dec() void Item_func_str_to_date::fix_length_and_dec()
{ {
char format_buff[64];
String format_str(format_buff, sizeof(format_buff), &my_charset_bin), *format;
maybe_null= 1; maybe_null= 1;
decimals=0; decimals=0;
cached_field_type= MYSQL_TYPE_DATETIME; cached_field_type= MYSQL_TYPE_DATETIME;
max_length= MAX_DATETIME_FULL_WIDTH*MY_CHARSET_BIN_MB_MAXLEN; max_length= MAX_DATETIME_FULL_WIDTH*MY_CHARSET_BIN_MB_MAXLEN;
cached_timestamp_type= MYSQL_TIMESTAMP_NONE; cached_timestamp_type= MYSQL_TIMESTAMP_NONE;
format= args[1]->val_str(&format_str); if ((const_item= args[1]->const_item()))
if (!args[1]->null_value && (const_item= args[1]->const_item()))
{ {
cached_format_type= get_date_time_result_type(format->ptr(), char format_buff[64];
format->length()); String format_str(format_buff, sizeof(format_buff), &my_charset_bin);
switch (cached_format_type) { String *format= args[1]->val_str(&format_str);
case DATE_ONLY: if (!args[1]->null_value)
cached_timestamp_type= MYSQL_TIMESTAMP_DATE; {
cached_field_type= MYSQL_TYPE_DATE; cached_format_type= get_date_time_result_type(format->ptr(),
max_length= MAX_DATE_WIDTH*MY_CHARSET_BIN_MB_MAXLEN; format->length());
break; switch (cached_format_type) {
case TIME_ONLY: case DATE_ONLY:
case TIME_MICROSECOND: cached_timestamp_type= MYSQL_TIMESTAMP_DATE;
cached_timestamp_type= MYSQL_TIMESTAMP_TIME; cached_field_type= MYSQL_TYPE_DATE;
cached_field_type= MYSQL_TYPE_TIME; max_length= MAX_DATE_WIDTH * MY_CHARSET_BIN_MB_MAXLEN;
max_length= MAX_TIME_WIDTH*MY_CHARSET_BIN_MB_MAXLEN; break;
break; case TIME_ONLY:
default: case TIME_MICROSECOND:
cached_timestamp_type= MYSQL_TIMESTAMP_DATETIME; cached_timestamp_type= MYSQL_TIMESTAMP_TIME;
cached_field_type= MYSQL_TYPE_DATETIME; cached_field_type= MYSQL_TYPE_TIME;
break; max_length= MAX_TIME_WIDTH * MY_CHARSET_BIN_MB_MAXLEN;
break;
default:
cached_timestamp_type= MYSQL_TIMESTAMP_DATETIME;
cached_field_type= MYSQL_TYPE_DATETIME;
break;
}
} }
} }
} }
bool Item_func_str_to_date::get_date(MYSQL_TIME *ltime, uint fuzzy_date) bool Item_func_str_to_date::get_date(MYSQL_TIME *ltime, uint fuzzy_date)
{ {
DATE_TIME_FORMAT date_time_format; DATE_TIME_FORMAT date_time_format;

View File

@ -4463,8 +4463,8 @@ TRP_ROR_INTERSECT *get_best_ror_intersect(const PARAM *param, SEL_TREE *tree,
ROR_SCAN_INFO's. ROR_SCAN_INFO's.
Step 2: Get best ROR-intersection using an approximate algorithm. Step 2: Get best ROR-intersection using an approximate algorithm.
*/ */
qsort(tree->ror_scans, tree->n_ror_scans, sizeof(ROR_SCAN_INFO*), my_qsort(tree->ror_scans, tree->n_ror_scans, sizeof(ROR_SCAN_INFO*),
(qsort_cmp)cmp_ror_scan_info); (qsort_cmp)cmp_ror_scan_info);
DBUG_EXECUTE("info",print_ror_scans_arr(param->table, "ordered", DBUG_EXECUTE("info",print_ror_scans_arr(param->table, "ordered",
tree->ror_scans, tree->ror_scans,
tree->ror_scans_end);); tree->ror_scans_end););
@ -4656,8 +4656,8 @@ TRP_ROR_INTERSECT *get_best_covering_ror_intersect(PARAM *param,
bitmap_get_first(&(*scan)->covered_fields); bitmap_get_first(&(*scan)->covered_fields);
} }
qsort(ror_scan_mark, ror_scans_end-ror_scan_mark, sizeof(ROR_SCAN_INFO*), my_qsort(ror_scan_mark, ror_scans_end-ror_scan_mark, sizeof(ROR_SCAN_INFO*),
(qsort_cmp)cmp_ror_scan_info_covering); (qsort_cmp)cmp_ror_scan_info_covering);
DBUG_EXECUTE("info", print_ror_scans_arr(param->table, DBUG_EXECUTE("info", print_ror_scans_arr(param->table,
"remaining scans", "remaining scans",

View File

@ -666,8 +666,8 @@ bool partition_info::check_list_constants()
if (fixed && no_list_values) if (fixed && no_list_values)
{ {
bool first= TRUE; bool first= TRUE;
qsort((void*)list_array, no_list_values, sizeof(LIST_PART_ENTRY), my_qsort((void*)list_array, no_list_values, sizeof(LIST_PART_ENTRY),
&list_part_cmp); &list_part_cmp);
i= 0; i= 0;
LINT_INIT(prev_value); LINT_INIT(prev_value);

View File

@ -567,7 +567,8 @@ static int rr_from_cache(READ_RECORD *info)
int3store(ref_position,(long) i); int3store(ref_position,(long) i);
ref_position+=3; ref_position+=3;
} }
qsort(info->read_positions,length,info->struct_length,(qsort_cmp) rr_cmp); my_qsort(info->read_positions, length, info->struct_length,
(qsort_cmp) rr_cmp);
position=info->read_positions; position=info->read_positions;
for (i=0 ; i < length ; i++) for (i=0 ; i < length ; i++)

View File

@ -164,7 +164,8 @@ static sys_var_character_set_sv sys_character_set_server(&vars, "character_set_s
sys_var_const_str sys_charset_system(&vars, "character_set_system", sys_var_const_str sys_charset_system(&vars, "character_set_system",
(char *)my_charset_utf8_general_ci.name); (char *)my_charset_utf8_general_ci.name);
static sys_var_character_set_database sys_character_set_database(&vars, "character_set_database"); static sys_var_character_set_database sys_character_set_database(&vars, "character_set_database");
static sys_var_character_set_sv sys_character_set_client(&vars, "character_set_client", static sys_var_character_set_client sys_character_set_client(&vars,
"character_set_client",
&SV::character_set_client, &SV::character_set_client,
&default_charset_info); &default_charset_info);
static sys_var_character_set_sv sys_character_set_connection(&vars, "character_set_connection", static sys_var_character_set_sv sys_character_set_connection(&vars, "character_set_connection",
@ -1865,6 +1866,21 @@ CHARSET_INFO **sys_var_character_set_sv::ci_ptr(THD *thd, enum_var_type type)
} }
bool sys_var_character_set_client::check(THD *thd, set_var *var)
{
if (sys_var_character_set_sv::check(thd, var))
return 1;
/* Currently, UCS-2 cannot be used as a client character set */
if (var->save_result.charset->mbminlen > 1)
{
my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), name,
var->save_result.charset->csname);
return 1;
}
return 0;
}
CHARSET_INFO ** sys_var_character_set_database::ci_ptr(THD *thd, CHARSET_INFO ** sys_var_character_set_database::ci_ptr(THD *thd,
enum_var_type type) enum_var_type type)
{ {
@ -2106,18 +2122,24 @@ void sys_var_log_state::set_default(THD *thd, enum_var_type type)
static int sys_check_log_path(THD *thd, set_var *var) static int sys_check_log_path(THD *thd, set_var *var)
{ {
char path[FN_REFLEN]; char path[FN_REFLEN], buff[FN_REFLEN];
MY_STAT f_stat; MY_STAT f_stat;
const char *var_path= var->value->str_value.ptr(); String str(buff, sizeof(buff), system_charset_info), *res;
const char *log_file_str;
if (!(res= var->value->val_str(&str)))
goto err;
log_file_str= res->c_ptr();
bzero(&f_stat, sizeof(MY_STAT)); bzero(&f_stat, sizeof(MY_STAT));
(void) unpack_filename(path, var_path); (void) unpack_filename(path, log_file_str);
if (my_stat(path, &f_stat, MYF(0))) if (my_stat(path, &f_stat, MYF(0)))
{ {
/* Check if argument is a file and we have 'write' permission */ /* Check if argument is a file and we have 'write' permission */
if (!MY_S_ISREG(f_stat.st_mode) || if (!MY_S_ISREG(f_stat.st_mode) ||
!(f_stat.st_mode & MY_S_IWRITE)) !(f_stat.st_mode & MY_S_IWRITE))
return -1; goto err;
} }
else else
{ {
@ -2126,11 +2148,16 @@ static int sys_check_log_path(THD *thd, set_var *var)
Check if directory exists and Check if directory exists and
we have permission to create file & write to file we have permission to create file & write to file
*/ */
(void) dirname_part(path, var_path, &path_length); (void) dirname_part(path, log_file_str, &path_length);
if (my_access(path, (F_OK|W_OK))) if (my_access(path, (F_OK|W_OK)))
return -1; goto err;
} }
return 0; return 0;
err:
my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), var->var->name,
res ? log_file_str : "NULL");
return 1;
} }
@ -2283,6 +2310,13 @@ uchar *sys_var_log_output::value_ptr(THD *thd, enum_var_type type,
int set_var_collation_client::check(THD *thd) int set_var_collation_client::check(THD *thd)
{ {
/* Currently, UCS-2 cannot be used as a client character set */
if (character_set_client->mbminlen > 1)
{
my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), "character_set_client",
character_set_client->csname);
return 1;
}
return 0; return 0;
} }
@ -2904,7 +2938,8 @@ SHOW_VAR* enumerate_sys_vars(THD *thd, bool sorted)
/* sort into order */ /* sort into order */
if (sorted) if (sorted)
qsort(result, count + fixed_count, sizeof(SHOW_VAR), (qsort_cmp)show_cmp); my_qsort(result, count + fixed_count, sizeof(SHOW_VAR),
(qsort_cmp) show_cmp);
/* make last element empty */ /* make last element empty */
bzero(show, sizeof(SHOW_VAR)); bzero(show, sizeof(SHOW_VAR));

View File

@ -667,6 +667,20 @@ public:
}; };
class sys_var_character_set_client: public sys_var_character_set_sv
{
public:
sys_var_character_set_client(sys_var_chain *chain, const char *name_arg,
CHARSET_INFO *SV::*offset_arg,
CHARSET_INFO **global_default_arg,
bool is_nullable= 0)
: sys_var_character_set_sv(chain, name_arg, offset_arg, global_default_arg,
is_nullable)
{ }
bool check(THD *thd, set_var *var);
};
class sys_var_character_set_database :public sys_var_character_set class sys_var_character_set_database :public sys_var_character_set
{ {
public: public:

View File

@ -365,8 +365,8 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables)
#endif #endif
VOID(push_dynamic(&acl_hosts,(uchar*) &host)); VOID(push_dynamic(&acl_hosts,(uchar*) &host));
} }
qsort((uchar*) dynamic_element(&acl_hosts,0,ACL_HOST*),acl_hosts.elements, my_qsort((uchar*) dynamic_element(&acl_hosts,0,ACL_HOST*),acl_hosts.elements,
sizeof(ACL_HOST),(qsort_cmp) acl_compare); sizeof(ACL_HOST),(qsort_cmp) acl_compare);
end_read_record(&read_record_info); end_read_record(&read_record_info);
freeze_size(&acl_hosts); freeze_size(&acl_hosts);
@ -553,8 +553,8 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables)
allow_all_hosts=1; // Anyone can connect allow_all_hosts=1; // Anyone can connect
} }
} }
qsort((uchar*) dynamic_element(&acl_users,0,ACL_USER*),acl_users.elements, my_qsort((uchar*) dynamic_element(&acl_users,0,ACL_USER*),acl_users.elements,
sizeof(ACL_USER),(qsort_cmp) acl_compare); sizeof(ACL_USER),(qsort_cmp) acl_compare);
end_read_record(&read_record_info); end_read_record(&read_record_info);
freeze_size(&acl_users); freeze_size(&acl_users);
@ -612,8 +612,8 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables)
#endif #endif
VOID(push_dynamic(&acl_dbs,(uchar*) &db)); VOID(push_dynamic(&acl_dbs,(uchar*) &db));
} }
qsort((uchar*) dynamic_element(&acl_dbs,0,ACL_DB*),acl_dbs.elements, my_qsort((uchar*) dynamic_element(&acl_dbs,0,ACL_DB*),acl_dbs.elements,
sizeof(ACL_DB),(qsort_cmp) acl_compare); sizeof(ACL_DB),(qsort_cmp) acl_compare);
end_read_record(&read_record_info); end_read_record(&read_record_info);
freeze_size(&acl_dbs); freeze_size(&acl_dbs);
init_check_host(); init_check_host();
@ -1243,8 +1243,8 @@ static void acl_insert_user(const char *user, const char *host,
if (!acl_user.host.hostname || if (!acl_user.host.hostname ||
(acl_user.host.hostname[0] == wild_many && !acl_user.host.hostname[1])) (acl_user.host.hostname[0] == wild_many && !acl_user.host.hostname[1]))
allow_all_hosts=1; // Anyone can connect /* purecov: tested */ allow_all_hosts=1; // Anyone can connect /* purecov: tested */
qsort((uchar*) dynamic_element(&acl_users,0,ACL_USER*),acl_users.elements, my_qsort((uchar*) dynamic_element(&acl_users,0,ACL_USER*),acl_users.elements,
sizeof(ACL_USER),(qsort_cmp) acl_compare); sizeof(ACL_USER),(qsort_cmp) acl_compare);
/* Rebuild 'acl_check_hosts' since 'acl_users' has been modified */ /* Rebuild 'acl_check_hosts' since 'acl_users' has been modified */
rebuild_check_host(); rebuild_check_host();
@ -1306,8 +1306,8 @@ static void acl_insert_db(const char *user, const char *host, const char *db,
acl_db.access=privileges; acl_db.access=privileges;
acl_db.sort=get_sort(3,acl_db.host.hostname,acl_db.db,acl_db.user); acl_db.sort=get_sort(3,acl_db.host.hostname,acl_db.db,acl_db.user);
VOID(push_dynamic(&acl_dbs,(uchar*) &acl_db)); VOID(push_dynamic(&acl_dbs,(uchar*) &acl_db));
qsort((uchar*) dynamic_element(&acl_dbs,0,ACL_DB*),acl_dbs.elements, my_qsort((uchar*) dynamic_element(&acl_dbs,0,ACL_DB*),acl_dbs.elements,
sizeof(ACL_DB),(qsort_cmp) acl_compare); sizeof(ACL_DB),(qsort_cmp) acl_compare);
} }

View File

@ -62,7 +62,7 @@ public:
void sort(CMP_FUNC cmp_func) void sort(CMP_FUNC cmp_func)
{ {
qsort(array.buffer, array.elements, sizeof(Elem), (qsort_cmp)cmp_func); my_qsort(array.buffer, array.elements, sizeof(Elem), (qsort_cmp)cmp_func);
} }
}; };

View File

@ -528,7 +528,7 @@ int send_variant_2_list(MEM_ROOT *mem_root, Protocol *protocol,
List_iterator<String> it(*names); List_iterator<String> it(*names);
for (pos= pointers; pos!=end; (*pos++= it++)); for (pos= pointers; pos!=end; (*pos++= it++));
qsort(pointers,names->elements,sizeof(String*),string_ptr_cmp); my_qsort(pointers,names->elements,sizeof(String*),string_ptr_cmp);
for (pos= pointers; pos!=end; pos++) for (pos= pointers; pos!=end; pos++)
{ {

View File

@ -7025,8 +7025,15 @@ bool create_table_precheck(THD *thd, TABLE_LIST *tables,
bool error= TRUE; // Error message is given bool error= TRUE; // Error message is given
DBUG_ENTER("create_table_precheck"); DBUG_ENTER("create_table_precheck");
/*
Require CREATE [TEMPORARY] privilege on new table; for
CREATE TABLE ... SELECT, also require INSERT.
*/
want_priv= ((lex->create_info.options & HA_LEX_CREATE_TMP_TABLE) ? want_priv= ((lex->create_info.options & HA_LEX_CREATE_TMP_TABLE) ?
CREATE_TMP_ACL : CREATE_ACL); CREATE_TMP_ACL : CREATE_ACL) |
(select_lex->item_list.elements ? INSERT_ACL : 0);
if (check_access(thd, want_priv, create_table->db, if (check_access(thd, want_priv, create_table->db,
&create_table->grant.privilege, 0, 0, &create_table->grant.privilege, 0, 0,
test(create_table->schema_table)) || test(create_table->schema_table)) ||

View File

@ -3723,7 +3723,7 @@ update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse,JOIN_TAB *join_tab,
{ {
KEYUSE key_end,*prev,*save_pos,*use; KEYUSE key_end,*prev,*save_pos,*use;
qsort(keyuse->buffer,keyuse->elements,sizeof(KEYUSE), my_qsort(keyuse->buffer,keyuse->elements,sizeof(KEYUSE),
(qsort_cmp) sort_keyuse); (qsort_cmp) sort_keyuse);
bzero((char*) &key_end,sizeof(key_end)); /* Add for easy testing */ bzero((char*) &key_end,sizeof(key_end)); /* Add for easy testing */
@ -4492,8 +4492,9 @@ choose_plan(JOIN *join, table_map join_tables)
Apply heuristic: pre-sort all access plans with respect to the number of Apply heuristic: pre-sort all access plans with respect to the number of
records accessed. records accessed.
*/ */
qsort(join->best_ref + join->const_tables, join->tables - join->const_tables, my_qsort(join->best_ref + join->const_tables,
sizeof(JOIN_TAB*), straight_join?join_tab_cmp_straight:join_tab_cmp); join->tables - join->const_tables, sizeof(JOIN_TAB*),
straight_join ? join_tab_cmp_straight : join_tab_cmp);
if (straight_join) if (straight_join)
{ {
@ -4540,6 +4541,17 @@ choose_plan(JOIN *join, table_map join_tables)
ptr1 pointer to first JOIN_TAB object ptr1 pointer to first JOIN_TAB object
ptr2 pointer to second JOIN_TAB object ptr2 pointer to second JOIN_TAB object
NOTES
The order relation implemented by join_tab_cmp() is not transitive,
i.e. it is possible to choose such a, b and c that (a < b) && (b < c)
but (c < a). This implies that result of a sort using the relation
implemented by join_tab_cmp() depends on the order in which
elements are compared, i.e. the result is implementation-specific.
Example:
a: dependent = 0x0 table->map = 0x1 found_records = 3 ptr = 0x907e6b0
b: dependent = 0x0 table->map = 0x2 found_records = 3 ptr = 0x907e838
c: dependent = 0x6 table->map = 0x10 found_records = 2 ptr = 0x907ecd0
RETURN RETURN
1 if first is bigger 1 if first is bigger
-1 if second is bigger -1 if second is bigger
@ -6440,7 +6452,15 @@ make_join_readinfo(JOIN *join, ulonglong options)
else if (!table->covering_keys.is_clear_all() && else if (!table->covering_keys.is_clear_all() &&
!(tab->select && tab->select->quick)) !(tab->select && tab->select->quick))
{ // Only read index tree { // Only read index tree
tab->index=find_shortest_key(table, & table->covering_keys); /*
See bug #26447: "Using the clustered index for a table scan
is always faster than using a secondary index".
*/
if (table->s->primary_key != MAX_KEY &&
table->file->primary_key_is_clustered())
tab->index= table->s->primary_key;
else
tab->index=find_shortest_key(table, & table->covering_keys);
tab->read_first_record= join_read_first; tab->read_first_record= join_read_first;
tab->type=JT_NEXT; // Read with index_first / index_next tab->type=JT_NEXT; // Read with index_first / index_next
} }
@ -9201,9 +9221,43 @@ static Field *create_tmp_field_from_item(THD *thd, Item *item, TABLE *table,
new_field->set_derivation(item->collation.derivation); new_field->set_derivation(item->collation.derivation);
break; break;
case DECIMAL_RESULT: case DECIMAL_RESULT:
new_field= new Field_new_decimal(item->max_length, maybe_null, item->name, {
item->decimals, item->unsigned_flag); uint8 dec= item->decimals;
uint8 intg= ((Item_decimal *) item)->decimal_precision() - dec;
uint32 len= item->max_length;
/*
Trying to put too many digits overall in a DECIMAL(prec,dec)
will always throw a warning. We must limit dec to
DECIMAL_MAX_SCALE however to prevent an assert() later.
*/
if (dec > 0)
{
signed int overflow;
dec= min(dec, DECIMAL_MAX_SCALE);
/*
If the value still overflows the field with the corrected dec,
we'll throw out decimals rather than integers. This is still
bad and of course throws a truncation warning.
+1: for decimal point
*/
overflow= my_decimal_precision_to_length(intg + dec, dec,
item->unsigned_flag) - len;
if (overflow > 0)
dec= max(0, dec - overflow); // too long, discard fract
else
len -= item->decimals - dec; // corrected value fits
}
new_field= new Field_new_decimal(len, maybe_null, item->name,
dec, item->unsigned_flag);
break; break;
}
case ROW_RESULT: case ROW_RESULT:
default: default:
// This case should never be choosen // This case should never be choosen

View File

@ -1798,7 +1798,8 @@ bool quick_rm_table(handlerton *base,const char *db,
/* /*
Sort keys in the following order: Sort keys in the following order:
- PRIMARY KEY - PRIMARY KEY
- UNIQUE keyws where all column are NOT NULL - UNIQUE keys where all column are NOT NULL
- UNIQUE keys that don't contain partial segments
- Other UNIQUE keys - Other UNIQUE keys
- Normal keys - Normal keys
- Fulltext keys - Fulltext keys
@ -1809,26 +1810,31 @@ bool quick_rm_table(handlerton *base,const char *db,
static int sort_keys(KEY *a, KEY *b) static int sort_keys(KEY *a, KEY *b)
{ {
if (a->flags & HA_NOSAME) ulong a_flags= a->flags, b_flags= b->flags;
if (a_flags & HA_NOSAME)
{ {
if (!(b->flags & HA_NOSAME)) if (!(b_flags & HA_NOSAME))
return -1; return -1;
if ((a->flags ^ b->flags) & (HA_NULL_PART_KEY | HA_END_SPACE_KEY)) if ((a_flags ^ b_flags) & (HA_NULL_PART_KEY | HA_END_SPACE_KEY))
{ {
/* Sort NOT NULL keys before other keys */ /* Sort NOT NULL keys before other keys */
return (a->flags & (HA_NULL_PART_KEY | HA_END_SPACE_KEY)) ? 1 : -1; return (a_flags & (HA_NULL_PART_KEY | HA_END_SPACE_KEY)) ? 1 : -1;
} }
if (a->name == primary_key_name) if (a->name == primary_key_name)
return -1; return -1;
if (b->name == primary_key_name) if (b->name == primary_key_name)
return 1; return 1;
/* Sort keys don't containing partial segments before others */
if ((a_flags ^ b_flags) & HA_KEY_HAS_PART_KEY_SEG)
return (a_flags & HA_KEY_HAS_PART_KEY_SEG) ? 1 : -1;
} }
else if (b->flags & HA_NOSAME) else if (b_flags & HA_NOSAME)
return 1; // Prefer b return 1; // Prefer b
if ((a->flags ^ b->flags) & HA_FULLTEXT) if ((a_flags ^ b_flags) & HA_FULLTEXT)
{ {
return (a->flags & HA_FULLTEXT) ? 1 : -1; return (a_flags & HA_FULLTEXT) ? 1 : -1;
} }
/* /*
Prefer original key order. usable_key_parts contains here Prefer original key order. usable_key_parts contains here
@ -2892,6 +2898,10 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
else else
key_info->flags|= HA_PACK_KEY; key_info->flags|= HA_PACK_KEY;
} }
/* Check if the key segment is partial, set the key flag accordingly */
if (length != sql_field->key_length)
key_info->flags|= HA_KEY_HAS_PART_KEY_SEG;
key_length+=length; key_length+=length;
key_part_info++; key_part_info++;
@ -2947,8 +2957,8 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
/* Sort keys in optimized order */ /* Sort keys in optimized order */
qsort((uchar*) *key_info_buffer, *key_count, sizeof(KEY), my_qsort((uchar*) *key_info_buffer, *key_count, sizeof(KEY),
(qsort_cmp) sort_keys); (qsort_cmp) sort_keys);
create_info->null_bits= null_fields; create_info->null_bits= null_fields;
DBUG_RETURN(FALSE); DBUG_RETURN(FALSE);
@ -6879,23 +6889,35 @@ copy_data_between_tables(TABLE *from,TABLE *to,
if (order) if (order)
{ {
from->sort.io_cache=(IO_CACHE*) my_malloc(sizeof(IO_CACHE), if (to->s->primary_key != MAX_KEY && to->file->primary_key_is_clustered())
MYF(MY_FAE | MY_ZEROFILL)); {
bzero((char*) &tables,sizeof(tables)); char warn_buff[MYSQL_ERRMSG_SIZE];
tables.table= from; my_snprintf(warn_buff, sizeof(warn_buff),
tables.alias= tables.table_name= from->s->table_name.str; "ORDER BY ignored as there is a user-defined clustered index"
tables.db= from->s->db.str; " in the table '%-.192s'", from->s->table_name.str);
error=1; push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR,
warn_buff);
}
else
{
from->sort.io_cache=(IO_CACHE*) my_malloc(sizeof(IO_CACHE),
MYF(MY_FAE | MY_ZEROFILL));
bzero((char *) &tables, sizeof(tables));
tables.table= from;
tables.alias= tables.table_name= from->s->table_name.str;
tables.db= from->s->db.str;
error= 1;
if (thd->lex->select_lex.setup_ref_array(thd, order_num) || if (thd->lex->select_lex.setup_ref_array(thd, order_num) ||
setup_order(thd, thd->lex->select_lex.ref_pointer_array, setup_order(thd, thd->lex->select_lex.ref_pointer_array,
&tables, fields, all_fields, order) || &tables, fields, all_fields, order) ||
!(sortorder=make_unireg_sortorder(order, &length, NULL)) || !(sortorder= make_unireg_sortorder(order, &length, NULL)) ||
(from->sort.found_records = filesort(thd, from, sortorder, length, (from->sort.found_records= filesort(thd, from, sortorder, length,
(SQL_SELECT *) 0, HA_POS_ERROR, 1, (SQL_SELECT *) 0, HA_POS_ERROR,
&examined_rows)) == 1, &examined_rows)) ==
HA_POS_ERROR) HA_POS_ERROR)
goto err; goto err;
}
}; };
/* Tell handler that we have values for all columns in the to table */ /* Tell handler that we have values for all columns in the to table */

View File

@ -71,7 +71,7 @@ typedef struct st_key_part_info { /* Info about a key part */
typedef struct st_key { typedef struct st_key {
uint key_length; /* Tot length of key */ uint key_length; /* Tot length of key */
uint flags; /* dupp key and pack flags */ ulong flags; /* dupp key and pack flags */
uint key_parts; /* How many key_parts */ uint key_parts; /* How many key_parts */
uint extra_length; uint extra_length;
uint usable_key_parts; /* Should normally be = key_parts */ uint usable_key_parts; /* Should normally be = key_parts */

View File

@ -505,7 +505,7 @@ static uint pack_keys(uchar *keybuff, uint key_count, KEY *keyinfo,
int2store(pos+6, key->block_size); int2store(pos+6, key->block_size);
pos+=8; pos+=8;
key_parts+=key->key_parts; key_parts+=key->key_parts;
DBUG_PRINT("loop", ("flags: %d key_parts: %d at 0x%lx", DBUG_PRINT("loop", ("flags: %lu key_parts: %d at 0x%lx",
key->flags, key->key_parts, key->flags, key->key_parts,
(long) key->key_part)); (long) key->key_part));
for (key_part=key->key_part,key_part_end=key_part+key->key_parts ; for (key_part=key->key_part,key_part_end=key_part+key->key_parts ;

View File

@ -1203,8 +1203,8 @@ int ha_tina::rnd_end()
The sort is needed when there were updates/deletes with random orders. The sort is needed when there were updates/deletes with random orders.
It sorts so that we move the firts blocks to the beginning. It sorts so that we move the firts blocks to the beginning.
*/ */
qsort(chain, (size_t)(chain_ptr - chain), sizeof(tina_set), my_qsort(chain, (size_t)(chain_ptr - chain), sizeof(tina_set),
(qsort_cmp)sort_set); (qsort_cmp)sort_set);
off_t write_begin= 0, write_end; off_t write_begin= 0, write_end;

View File

@ -576,8 +576,8 @@ FT_INFO * ft_init_boolean_search(MI_INFO *info, uint keynr, uchar *query,
ftb->list=(FTB_WORD **)alloc_root(&ftb->mem_root, ftb->list=(FTB_WORD **)alloc_root(&ftb->mem_root,
sizeof(FTB_WORD *)*ftb->queue.elements); sizeof(FTB_WORD *)*ftb->queue.elements);
memcpy(ftb->list, ftb->queue.root+1, sizeof(FTB_WORD *)*ftb->queue.elements); memcpy(ftb->list, ftb->queue.root+1, sizeof(FTB_WORD *)*ftb->queue.elements);
qsort2(ftb->list, ftb->queue.elements, sizeof(FTB_WORD *), my_qsort2(ftb->list, ftb->queue.elements, sizeof(FTB_WORD *),
(qsort2_cmp)FTB_WORD_cmp_list, ftb->charset); (qsort2_cmp)FTB_WORD_cmp_list, ftb->charset);
if (ftb->queue.elements<2) ftb->with_scan &= ~FTB_FLAG_TRUNC; if (ftb->queue.elements<2) ftb->with_scan &= ~FTB_FLAG_TRUNC;
ftb->state=READY; ftb->state=READY;
return ftb; return ftb;

View File

@ -294,7 +294,8 @@ FT_INFO *ft_init_nlq_search(MI_INFO *info, uint keynr, uchar *query,
&dptr, left_root_right); &dptr, left_root_right);
if (flags & FT_SORTED) if (flags & FT_SORTED)
qsort2(dlist->doc, dlist->ndocs, sizeof(FT_DOC), (qsort2_cmp)&FT_DOC_cmp, 0); my_qsort2(dlist->doc, dlist->ndocs, sizeof(FT_DOC), (qsort2_cmp)&FT_DOC_cmp,
0);
err: err:
delete_tree(&aio.dtree); delete_tree(&aio.dtree);

View File

@ -153,7 +153,7 @@ int table2myisam(TABLE *table_arg, MI_KEYDEF **keydef_out,
pos= table_arg->key_info; pos= table_arg->key_info;
for (i= 0; i < share->keys; i++, pos++) for (i= 0; i < share->keys; i++, pos++)
{ {
keydef[i].flag= (pos->flags & (HA_NOSAME | HA_FULLTEXT | HA_SPATIAL)); keydef[i].flag= ((uint16) pos->flags & (HA_NOSAME | HA_FULLTEXT | HA_SPATIAL));
keydef[i].key_alg= pos->algorithm == HA_KEY_ALG_UNDEF ? keydef[i].key_alg= pos->algorithm == HA_KEY_ALG_UNDEF ?
(pos->flags & HA_SPATIAL ? HA_KEY_ALG_RTREE : HA_KEY_ALG_BTREE) : (pos->flags & HA_SPATIAL ? HA_KEY_ALG_RTREE : HA_KEY_ALG_BTREE) :
pos->algorithm; pos->algorithm;

View File

@ -3148,7 +3148,7 @@ static void fakebigcodes(HUFF_COUNTS *huff_counts, HUFF_COUNTS *end_count)
cur_sort_p= sort_counts; cur_sort_p= sort_counts;
while (cur_count_p < end_count_p) while (cur_count_p < end_count_p)
*(cur_sort_p++)= cur_count_p++; *(cur_sort_p++)= cur_count_p++;
(void) qsort(sort_counts, 256, sizeof(my_off_t*), (qsort_cmp) fakecmp); (void) my_qsort(sort_counts, 256, sizeof(my_off_t*), (qsort_cmp) fakecmp);
/* /*
Assign faked counts. Assign faked counts.

View File

@ -650,8 +650,8 @@ static int NEAR_F write_keys(MI_SORT_PARAM *info, register uchar **sort_keys,
uint sort_length=info->key_length; uint sort_length=info->key_length;
DBUG_ENTER("write_keys"); DBUG_ENTER("write_keys");
qsort2((uchar*) sort_keys,count,sizeof(uchar*),(qsort2_cmp) info->key_cmp, my_qsort2((uchar*) sort_keys,count,sizeof(uchar*),(qsort2_cmp) info->key_cmp,
info); info);
if (!my_b_inited(tempfile) && if (!my_b_inited(tempfile) &&
open_cached_file(tempfile, my_tmpdir(info->tmpdir), "ST", open_cached_file(tempfile, my_tmpdir(info->tmpdir), "ST",
DISK_BUFFER_SIZE, info->sort_info->param->myf_rw)) DISK_BUFFER_SIZE, info->sort_info->param->myf_rw))
@ -693,8 +693,8 @@ static int NEAR_F write_keys_varlen(MI_SORT_PARAM *info,
int err; int err;
DBUG_ENTER("write_keys_varlen"); DBUG_ENTER("write_keys_varlen");
qsort2((uchar*) sort_keys,count,sizeof(uchar*),(qsort2_cmp) info->key_cmp, my_qsort2((uchar*) sort_keys,count,sizeof(uchar*),(qsort2_cmp) info->key_cmp,
info); info);
if (!my_b_inited(tempfile) && if (!my_b_inited(tempfile) &&
open_cached_file(tempfile, my_tmpdir(info->tmpdir), "ST", open_cached_file(tempfile, my_tmpdir(info->tmpdir), "ST",
DISK_BUFFER_SIZE, info->sort_info->param->myf_rw)) DISK_BUFFER_SIZE, info->sort_info->param->myf_rw))
@ -736,8 +736,8 @@ static int NEAR_F write_index(MI_SORT_PARAM *info, register uchar **sort_keys,
{ {
DBUG_ENTER("write_index"); DBUG_ENTER("write_index");
qsort2((uchar*) sort_keys,(size_t) count,sizeof(uchar*), my_qsort2((uchar*) sort_keys,(size_t) count,sizeof(uchar*),
(qsort2_cmp) info->key_cmp,info); (qsort2_cmp) info->key_cmp,info);
while (count--) while (count--)
{ {
if ((*info->key_write)(info,*sort_keys++)) if ((*info->key_write)(info,*sort_keys++))

View File

@ -968,7 +968,6 @@ printNodeStatus(OutputStream *output,
MgmtSrvr &mgmsrv, MgmtSrvr &mgmsrv,
enum ndb_mgm_node_type type) { enum ndb_mgm_node_type type) {
NodeId nodeId = 0; NodeId nodeId = 0;
mgmsrv.updateStatus();
while(mgmsrv.getNextNodeId(&nodeId, type)) { while(mgmsrv.getNextNodeId(&nodeId, type)) {
enum ndb_mgm_node_status status; enum ndb_mgm_node_status status;
Uint32 startPhase = 0, Uint32 startPhase = 0,
@ -1018,6 +1017,7 @@ MgmApiSession::getStatus(Parser<MgmApiSession>::Context &,
m_output->println("node status"); m_output->println("node status");
SLEEP_ERROR_INSERTED(6); SLEEP_ERROR_INSERTED(6);
m_output->println("nodes: %d", noOfNodes); m_output->println("nodes: %d", noOfNodes);
m_mgmsrv.updateStatus();
SLEEP_ERROR_INSERTED(7); SLEEP_ERROR_INSERTED(7);
printNodeStatus(m_output, m_mgmsrv, NDB_MGM_NODE_TYPE_NDB); printNodeStatus(m_output, m_mgmsrv, NDB_MGM_NODE_TYPE_NDB);
printNodeStatus(m_output, m_mgmsrv, NDB_MGM_NODE_TYPE_MGM); printNodeStatus(m_output, m_mgmsrv, NDB_MGM_NODE_TYPE_MGM);

View File

@ -204,7 +204,10 @@ ClusterMgr::forceHB()
theFacade.sendSignalUnCond(&signal, nodeId); theFacade.sendSignalUnCond(&signal, nodeId);
} }
NdbCondition_WaitTimeout(waitForHBCond, theFacade.theMutexPtr, 1000); /* Wait for nodes to reply - if any heartbeats was sent */
if (!waitForHBFromNodes.isclear())
NdbCondition_WaitTimeout(waitForHBCond, theFacade.theMutexPtr, 1000);
waitingForHB= false; waitingForHB= false;
#ifdef DEBUG_REG #ifdef DEBUG_REG
ndbout << "Still waiting for HB from " << waitForHBFromNodes.getText(buf) << endl; ndbout << "Still waiting for HB from " << waitForHBFromNodes.getText(buf) << endl;

View File

@ -845,6 +845,7 @@ size_t my_long10_to_str_8bit(CHARSET_INFO *cs __attribute__((unused)),
register char *p, *e; register char *p, *e;
long int new_val; long int new_val;
uint sign=0; uint sign=0;
unsigned long int uval = (unsigned long int) val;
e = p = &buffer[sizeof(buffer)-1]; e = p = &buffer[sizeof(buffer)-1];
*p= 0; *p= 0;
@ -853,15 +854,16 @@ size_t my_long10_to_str_8bit(CHARSET_INFO *cs __attribute__((unused)),
{ {
if (val < 0) if (val < 0)
{ {
val= -(unsigned long int)val; /* Avoid integer overflow in (-val) for LONGLONG_MIN (BUG#31799). */
uval= (unsigned long int)0 - uval;
*dst++= '-'; *dst++= '-';
len--; len--;
sign= 1; sign= 1;
} }
} }
new_val = (long) ((unsigned long int) val / 10); new_val = (long) (uval / 10);
*--p = '0'+ (char) ((unsigned long int) val - (unsigned long) new_val * 10); *--p = '0'+ (char) (uval - (unsigned long) new_val * 10);
val = new_val; val = new_val;
while (val != 0) while (val != 0)
@ -885,12 +887,14 @@ size_t my_longlong10_to_str_8bit(CHARSET_INFO *cs __attribute__((unused)),
register char *p, *e; register char *p, *e;
long long_val; long long_val;
uint sign= 0; uint sign= 0;
ulonglong uval = (ulonglong)val;
if (radix < 0) if (radix < 0)
{ {
if (val < 0) if (val < 0)
{ {
val = -(ulonglong)val; /* Avoid integer overflow in (-val) for LONGLONG_MIN (BUG#31799). */
uval = (ulonglong)0 - uval;
*dst++= '-'; *dst++= '-';
len--; len--;
sign= 1; sign= 1;
@ -900,22 +904,22 @@ size_t my_longlong10_to_str_8bit(CHARSET_INFO *cs __attribute__((unused)),
e = p = &buffer[sizeof(buffer)-1]; e = p = &buffer[sizeof(buffer)-1];
*p= 0; *p= 0;
if (val == 0) if (uval == 0)
{ {
*--p= '0'; *--p= '0';
len= 1; len= 1;
goto cnv; goto cnv;
} }
while ((ulonglong) val > (ulonglong) LONG_MAX) while (uval > (ulonglong) LONG_MAX)
{ {
ulonglong quo=(ulonglong) val/(uint) 10; ulonglong quo= uval/(uint) 10;
uint rem= (uint) (val- quo* (uint) 10); uint rem= (uint) (uval- quo* (uint) 10);
*--p = '0' + rem; *--p = '0' + rem;
val= quo; uval= quo;
} }
long_val= (long) val; long_val= (long) uval;
while (long_val != 0) while (long_val != 0)
{ {
long quo= long_val/10; long quo= long_val/10;
@ -1561,14 +1565,18 @@ my_strntoull10rnd_8bit(CHARSET_INFO *cs __attribute__((unused)),
} }
else else
addon= (*str >= '5'); addon= (*str >= '5');
for ( ; str < end && (ch= (uchar) (*str - '0')) < 10; str++) if (!dot)
{ {
if (!dot) for ( ; str < end && (ch= (uchar) (*str - '0')) < 10; shift++, str++);
shift++; if (str < end && *str == '.')
{
str++;
for ( ; str < end && (ch= (uchar) (*str - '0')) < 10; str++);
}
} }
if (str < end && *str == '.' && !dot) else
{ {
str++; shift= dot - str;
for ( ; str < end && (ch= (uchar) (*str - '0')) < 10; str++); for ( ; str < end && (ch= (uchar) (*str - '0')) < 10; str++);
} }
goto exp; goto exp;

View File

@ -1019,6 +1019,7 @@ size_t my_l10tostr_ucs2(CHARSET_INFO *cs,
register char *p, *db, *de; register char *p, *db, *de;
long int new_val; long int new_val;
int sl=0; int sl=0;
unsigned long int uval = (unsigned long int) val;
p = &buffer[sizeof(buffer)-1]; p = &buffer[sizeof(buffer)-1];
*p='\0'; *p='\0';
@ -1028,12 +1029,13 @@ size_t my_l10tostr_ucs2(CHARSET_INFO *cs,
if (val < 0) if (val < 0)
{ {
sl = 1; sl = 1;
val = -val; /* Avoid integer overflow in (-val) for LONGLONG_MIN (BUG#31799). */
uval = (unsigned long int)0 - uval;
} }
} }
new_val = (long) ((unsigned long int) val / 10); new_val = (long) (uval / 10);
*--p = '0'+ (char) ((unsigned long int) val - (unsigned long) new_val * 10); *--p = '0'+ (char) (uval - (unsigned long) new_val * 10);
val = new_val; val = new_val;
while (val != 0) while (val != 0)
@ -1067,34 +1069,36 @@ size_t my_ll10tostr_ucs2(CHARSET_INFO *cs __attribute__((unused)),
register char *p, *db, *de; register char *p, *db, *de;
long long_val; long long_val;
int sl=0; int sl=0;
ulonglong uval= (ulonglong) val;
if (radix < 0) if (radix < 0)
{ {
if (val < 0) if (val < 0)
{ {
sl=1; sl=1;
val = -val; /* Avoid integer overflow in (-val) for LONGLONG_MIN (BUG#31799). */
uval = (ulonglong)0 - uval;
} }
} }
p = &buffer[sizeof(buffer)-1]; p = &buffer[sizeof(buffer)-1];
*p='\0'; *p='\0';
if (val == 0) if (uval == 0)
{ {
*--p='0'; *--p='0';
goto cnv; goto cnv;
} }
while ((ulonglong) val > (ulonglong) LONG_MAX) while (uval > (ulonglong) LONG_MAX)
{ {
ulonglong quo=(ulonglong) val/(size_t) 10; ulonglong quo= uval/(uint) 10;
uint rem= (uint) (val- quo* (uint) 10); uint rem= (uint) (uval- quo* (uint) 10);
*--p = '0' + rem; *--p = '0' + rem;
val= quo; uval= quo;
} }
long_val= (long) val; long_val= (long) uval;
while (long_val != 0) while (long_val != 0)
{ {
long quo= long_val/10; long quo= long_val/10;

View File

@ -57,6 +57,7 @@ int2str(register long int val, register char *dst, register int radix,
register char *p; register char *p;
long int new_val; long int new_val;
char *dig_vec= upcase ? _dig_vec_upper : _dig_vec_lower; char *dig_vec= upcase ? _dig_vec_upper : _dig_vec_lower;
ulong uval= (ulong) val;
if (radix < 0) if (radix < 0)
{ {
@ -65,7 +66,8 @@ int2str(register long int val, register char *dst, register int radix,
if (val < 0) if (val < 0)
{ {
*dst++ = '-'; *dst++ = '-';
val = -val; /* Avoid integer overflow in (-val) for LONGLONG_MIN (BUG#31799). */
uval = (ulong)0 - uval;
} }
radix = -radix; radix = -radix;
} }
@ -86,8 +88,8 @@ int2str(register long int val, register char *dst, register int radix,
*/ */
p = &buffer[sizeof(buffer)-1]; p = &buffer[sizeof(buffer)-1];
*p = '\0'; *p = '\0';
new_val=(ulong) val / (ulong) radix; new_val= uval / (ulong) radix;
*--p = dig_vec[(uchar) ((ulong) val- (ulong) new_val*(ulong) radix)]; *--p = dig_vec[(uchar) (uval- (ulong) new_val*(ulong) radix)];
val = new_val; val = new_val;
#ifdef HAVE_LDIV #ifdef HAVE_LDIV
while (val != 0) while (val != 0)
@ -133,20 +135,22 @@ char *int10_to_str(long int val,char *dst,int radix)
char buffer[65]; char buffer[65];
register char *p; register char *p;
long int new_val; long int new_val;
unsigned long int uval = (unsigned long int) val;
if (radix < 0) /* -10 */ if (radix < 0) /* -10 */
{ {
if (val < 0) if (val < 0)
{ {
*dst++ = '-'; *dst++ = '-';
val = -val; /* Avoid integer overflow in (-val) for LONGLONG_MIN (BUG#31799). */
uval = (unsigned long int)0 - uval;
} }
} }
p = &buffer[sizeof(buffer)-1]; p = &buffer[sizeof(buffer)-1];
*p = '\0'; *p = '\0';
new_val= (long) ((unsigned long int) val / 10); new_val= (long) (uval / 10);
*--p = '0'+ (char) ((unsigned long int) val - (unsigned long) new_val * 10); *--p = '0'+ (char) (uval - (unsigned long) new_val * 10);
val = new_val; val = new_val;
while (val != 0) while (val != 0)

View File

@ -51,13 +51,15 @@ char *longlong2str(longlong val,char *dst,int radix)
char buffer[65]; char buffer[65];
register char *p; register char *p;
long long_val; long long_val;
ulonglong uval= (ulonglong) val;
if (radix < 0) if (radix < 0)
{ {
if (radix < -36 || radix > -2) return (char*) 0; if (radix < -36 || radix > -2) return (char*) 0;
if (val < 0) { if (val < 0) {
*dst++ = '-'; *dst++ = '-';
val = -val; /* Avoid integer overflow in (-val) for LONGLONG_MIN (BUG#31799). */
uval = (ulonglong)0 - uval;
} }
radix = -radix; radix = -radix;
} }
@ -65,7 +67,7 @@ char *longlong2str(longlong val,char *dst,int radix)
{ {
if (radix > 36 || radix < 2) return (char*) 0; if (radix > 36 || radix < 2) return (char*) 0;
} }
if (val == 0) if (uval == 0)
{ {
*dst++='0'; *dst++='0';
*dst='\0'; *dst='\0';
@ -74,14 +76,14 @@ char *longlong2str(longlong val,char *dst,int radix)
p = &buffer[sizeof(buffer)-1]; p = &buffer[sizeof(buffer)-1];
*p = '\0'; *p = '\0';
while ((ulonglong) val > (ulonglong) LONG_MAX) while (uval > (ulonglong) LONG_MAX)
{ {
ulonglong quo=(ulonglong) val/(uint) radix; ulonglong quo= uval/(uint) radix;
uint rem= (uint) (val- quo* (uint) radix); uint rem= (uint) (uval- quo* (uint) radix);
*--p = _dig_vec_upper[rem]; *--p = _dig_vec_upper[rem];
val= quo; uval= quo;
} }
long_val= (long) val; long_val= (long) uval;
while (long_val != 0) while (long_val != 0)
{ {
long quo= long_val/radix; long quo= long_val/radix;
@ -100,17 +102,19 @@ char *longlong10_to_str(longlong val,char *dst,int radix)
char buffer[65]; char buffer[65];
register char *p; register char *p;
long long_val; long long_val;
ulonglong uval= (ulonglong) val;
if (radix < 0) if (radix < 0)
{ {
if (val < 0) if (val < 0)
{ {
*dst++ = '-'; *dst++ = '-';
val = -val; /* Avoid integer overflow in (-val) for LONGLONG_MIN (BUG#31799). */
uval = (ulonglong)0 - uval;
} }
} }
if (val == 0) if (uval == 0)
{ {
*dst++='0'; *dst++='0';
*dst='\0'; *dst='\0';
@ -119,14 +123,14 @@ char *longlong10_to_str(longlong val,char *dst,int radix)
p = &buffer[sizeof(buffer)-1]; p = &buffer[sizeof(buffer)-1];
*p = '\0'; *p = '\0';
while ((ulonglong) val > (ulonglong) LONG_MAX) while (uval > (ulonglong) LONG_MAX)
{ {
ulonglong quo=(ulonglong) val/(uint) 10; ulonglong quo= uval/(uint) 10;
uint rem= (uint) (val- quo* (uint) 10); uint rem= (uint) (uval- quo* (uint) 10);
*--p = _dig_vec_upper[rem]; *--p = _dig_vec_upper[rem];
val= quo; uval= quo;
} }
long_val= (long) val; long_val= (long) uval;
while (long_val != 0) while (long_val != 0)
{ {
long quo= long_val/10; long quo= long_val/10;