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:
commit
284cb0e560
@ -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:
|
||||||
|
@ -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.",
|
||||||
|
@ -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>
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
@ -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 */
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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.
|
||||||
|
@ -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;
|
||||||
|
@ -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 (), (), ();
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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');
|
||||||
|
@ -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
|
||||||
|
@ -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))
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
#
|
#
|
||||||
|
@ -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
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -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
|
||||||
|
@ -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.
|
||||||
|
|
||||||
|
@ -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.
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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 ################################
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -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);
|
||||||
/*
|
/*
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
|
@ -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];
|
||||||
|
78
sql/field.cc
78
sql/field.cc
@ -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.
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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",
|
||||||
|
@ -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);
|
||||||
|
@ -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++)
|
||||||
|
@ -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));
|
||||||
|
@ -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:
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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++)
|
||||||
{
|
{
|
||||||
|
@ -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)) ||
|
||||||
|
@ -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
|
||||||
|
@ -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 */
|
||||||
|
@ -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 */
|
||||||
|
@ -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 ;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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.
|
||||||
|
@ -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++))
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user