Auto-merge from upstream 5.1-bugteam
This commit is contained in:
commit
1a6452a208
@ -1327,6 +1327,35 @@ static int run_tool(const char *tool_path, DYNAMIC_STRING *ds_res, ...)
|
|||||||
DBUG_RETURN(ret);
|
DBUG_RETURN(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Test if diff is present. This is needed on Windows systems
|
||||||
|
as the OS returns 1 whether diff is successful or if it is
|
||||||
|
not present.
|
||||||
|
|
||||||
|
We run diff -v and look for output in stdout.
|
||||||
|
We don't redirect stderr to stdout to make for a simplified check
|
||||||
|
Windows will output '"diff"' is not recognized... to stderr if it is
|
||||||
|
not present.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int diff_check()
|
||||||
|
{
|
||||||
|
char buf[512]= {0};
|
||||||
|
FILE *res_file;
|
||||||
|
char *cmd = "diff -v";
|
||||||
|
int have_diff = 0;
|
||||||
|
|
||||||
|
if (!(res_file= popen(cmd, "r")))
|
||||||
|
die("popen(\"%s\", \"r\") failed", cmd);
|
||||||
|
|
||||||
|
/* if diff is not present, nothing will be in stdout to increment have_diff */
|
||||||
|
if (fgets(buf, sizeof(buf), res_file))
|
||||||
|
{
|
||||||
|
have_diff += 1;
|
||||||
|
}
|
||||||
|
pclose(res_file);
|
||||||
|
return have_diff;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Show the diff of two files using the systems builtin diff
|
Show the diff of two files using the systems builtin diff
|
||||||
@ -1346,10 +1375,19 @@ void show_diff(DYNAMIC_STRING* ds,
|
|||||||
{
|
{
|
||||||
|
|
||||||
DYNAMIC_STRING ds_tmp;
|
DYNAMIC_STRING ds_tmp;
|
||||||
|
int have_diff = 0;
|
||||||
|
|
||||||
if (init_dynamic_string(&ds_tmp, "", 256, 256))
|
if (init_dynamic_string(&ds_tmp, "", 256, 256))
|
||||||
die("Out of memory");
|
die("Out of memory");
|
||||||
|
|
||||||
|
/* determine if we have diff on Windows
|
||||||
|
needs special processing due to return values
|
||||||
|
on that OS
|
||||||
|
*/
|
||||||
|
have_diff = diff_check();
|
||||||
|
|
||||||
|
if (have_diff)
|
||||||
|
{
|
||||||
/* First try with unified diff */
|
/* First try with unified diff */
|
||||||
if (run_tool("diff",
|
if (run_tool("diff",
|
||||||
&ds_tmp, /* Get output from diff in ds_tmp */
|
&ds_tmp, /* Get output from diff in ds_tmp */
|
||||||
@ -1369,11 +1407,19 @@ void show_diff(DYNAMIC_STRING* ds,
|
|||||||
filename2,
|
filename2,
|
||||||
"2>&1",
|
"2>&1",
|
||||||
NULL) > 1) /* Most "diff" tools return >1 if error */
|
NULL) > 1) /* Most "diff" tools return >1 if error */
|
||||||
|
{
|
||||||
|
have_diff= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(have_diff))
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
Fallback to dump both files to result file and inform
|
Fallback to dump both files to result file and inform
|
||||||
about installing "diff"
|
about installing "diff"
|
||||||
*/
|
*/
|
||||||
|
|
||||||
dynstr_set(&ds_tmp, "");
|
dynstr_set(&ds_tmp, "");
|
||||||
|
|
||||||
dynstr_append(&ds_tmp,
|
dynstr_append(&ds_tmp,
|
||||||
@ -1398,7 +1444,6 @@ void show_diff(DYNAMIC_STRING* ds,
|
|||||||
cat_file(&ds_tmp, filename2);
|
cat_file(&ds_tmp, filename2);
|
||||||
dynstr_append(&ds_tmp, "<<<<\n");
|
dynstr_append(&ds_tmp, "<<<<\n");
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (ds)
|
if (ds)
|
||||||
{
|
{
|
||||||
|
@ -1,4 +1,16 @@
|
|||||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
|
CREATE TABLE t1
|
||||||
|
(a INT NOT NULL AUTO_INCREMENT,
|
||||||
|
b DATETIME,
|
||||||
|
PRIMARY KEY (a,b),
|
||||||
|
KEY (b))
|
||||||
|
PARTITION BY RANGE (to_days(b))
|
||||||
|
(PARTITION p0 VALUES LESS THAN (733681) COMMENT = 'LESS THAN 2008-10-01',
|
||||||
|
PARTITION p1 VALUES LESS THAN (733712) COMMENT = 'LESS THAN 2008-11-01',
|
||||||
|
PARTITION pX VALUES LESS THAN MAXVALUE);
|
||||||
|
SELECT a,b FROM t1 WHERE b >= '2008-12-01' AND b < '2009-12-00';
|
||||||
|
a b
|
||||||
|
DROP TABLE t1;
|
||||||
create table t1 ( a int not null) partition by hash(a) partitions 2;
|
create table t1 ( a int not null) partition by hash(a) partitions 2;
|
||||||
insert into t1 values (1),(2),(3);
|
insert into t1 values (1),(2),(3);
|
||||||
explain select * from t1 where a=5 and a=6;
|
explain select * from t1 where a=5 and a=6;
|
||||||
|
@ -113,16 +113,17 @@ master-bin.000001 # Table_map # # table_id: # (test.t1)
|
|||||||
master-bin.000001 # Update_rows # # table_id: # flags: STMT_END_F
|
master-bin.000001 # Update_rows # # table_id: # flags: STMT_END_F
|
||||||
master-bin.000001 # Xid # # COMMIT /* XID */
|
master-bin.000001 # Xid # # COMMIT /* XID */
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
flush status;
|
||||||
show status like "binlog_cache_use";
|
show status like "binlog_cache_use";
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Binlog_cache_use 13
|
Binlog_cache_use 0
|
||||||
show status like "binlog_cache_disk_use";
|
show status like "binlog_cache_disk_use";
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Binlog_cache_disk_use 0
|
Binlog_cache_disk_use 0
|
||||||
create table t1 (a int) engine=innodb;
|
create table t1 (a int) engine=innodb;
|
||||||
show status like "binlog_cache_use";
|
show status like "binlog_cache_use";
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Binlog_cache_use 14
|
Binlog_cache_use 1
|
||||||
show status like "binlog_cache_disk_use";
|
show status like "binlog_cache_disk_use";
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Binlog_cache_disk_use 1
|
Binlog_cache_disk_use 1
|
||||||
@ -131,7 +132,7 @@ delete from t1;
|
|||||||
commit;
|
commit;
|
||||||
show status like "binlog_cache_use";
|
show status like "binlog_cache_use";
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Binlog_cache_use 15
|
Binlog_cache_use 2
|
||||||
show status like "binlog_cache_disk_use";
|
show status like "binlog_cache_disk_use";
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Binlog_cache_disk_use 1
|
Binlog_cache_disk_use 1
|
||||||
|
@ -101,6 +101,7 @@ DROP TABLE t1;
|
|||||||
# Actually this test has nothing to do with innodb per se, it just requires
|
# Actually this test has nothing to do with innodb per se, it just requires
|
||||||
# transactional table.
|
# transactional table.
|
||||||
#
|
#
|
||||||
|
flush status;
|
||||||
show status like "binlog_cache_use";
|
show status like "binlog_cache_use";
|
||||||
show status like "binlog_cache_disk_use";
|
show status like "binlog_cache_disk_use";
|
||||||
|
|
||||||
|
@ -8,6 +8,22 @@
|
|||||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
--enable_warnings
|
--enable_warnings
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#40972: some sql execution lead the whole database crashing
|
||||||
|
#
|
||||||
|
# Setup so the start is at partition pX and end is at p1
|
||||||
|
# Pruning does handle 'bad' dates differently.
|
||||||
|
CREATE TABLE t1
|
||||||
|
(a INT NOT NULL AUTO_INCREMENT,
|
||||||
|
b DATETIME,
|
||||||
|
PRIMARY KEY (a,b),
|
||||||
|
KEY (b))
|
||||||
|
PARTITION BY RANGE (to_days(b))
|
||||||
|
(PARTITION p0 VALUES LESS THAN (733681) COMMENT = 'LESS THAN 2008-10-01',
|
||||||
|
PARTITION p1 VALUES LESS THAN (733712) COMMENT = 'LESS THAN 2008-11-01',
|
||||||
|
PARTITION pX VALUES LESS THAN MAXVALUE);
|
||||||
|
SELECT a,b FROM t1 WHERE b >= '2008-12-01' AND b < '2009-12-00';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
# Check if we can infer from condition on partition fields that
|
# Check if we can infer from condition on partition fields that
|
||||||
# no records will match.
|
# no records will match.
|
||||||
|
@ -4815,7 +4815,7 @@ int ha_partition::info(uint flag)
|
|||||||
/*
|
/*
|
||||||
Calculates statistical variables
|
Calculates statistical variables
|
||||||
records: Estimate of number records in table
|
records: Estimate of number records in table
|
||||||
We report sum (always at least 2)
|
We report sum (always at least 2 if not empty)
|
||||||
deleted: Estimate of number holes in the table due to
|
deleted: Estimate of number holes in the table due to
|
||||||
deletes
|
deletes
|
||||||
We report sum
|
We report sum
|
||||||
@ -4854,13 +4854,13 @@ int ha_partition::info(uint flag)
|
|||||||
stats.check_time= file->stats.check_time;
|
stats.check_time= file->stats.check_time;
|
||||||
}
|
}
|
||||||
} while (*(++file_array));
|
} while (*(++file_array));
|
||||||
if (stats.records < 2 &&
|
if (stats.records && stats.records < 2 &&
|
||||||
!(m_file[0]->ha_table_flags() & HA_STATS_RECORDS_IS_EXACT))
|
!(m_file[0]->ha_table_flags() & HA_STATS_RECORDS_IS_EXACT))
|
||||||
stats.records= 2;
|
stats.records= 2;
|
||||||
if (stats.records > 0)
|
if (stats.records > 0)
|
||||||
stats.mean_rec_length= (ulong) (stats.data_file_length / stats.records);
|
stats.mean_rec_length= (ulong) (stats.data_file_length / stats.records);
|
||||||
else
|
else
|
||||||
stats.mean_rec_length= 1; //? What should we set here
|
stats.mean_rec_length= 0;
|
||||||
}
|
}
|
||||||
if (flag & HA_STATUS_CONST)
|
if (flag & HA_STATUS_CONST)
|
||||||
{
|
{
|
||||||
|
@ -230,7 +230,7 @@ extern "C" sig_handler handle_segfault(int sig);
|
|||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
#define ENABLE_TEMP_POOL 1
|
#define ENABLE_TEMP_POOL 1
|
||||||
#else
|
#else
|
||||||
#define ENABLE_TEMP_TOOL 0
|
#define ENABLE_TEMP_POOL 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Constants */
|
/* Constants */
|
||||||
|
@ -1527,14 +1527,14 @@ bool sys_var_thd_ulong::update(THD *thd, set_var *var)
|
|||||||
ulonglong tmp= var->save_result.ulonglong_value;
|
ulonglong tmp= var->save_result.ulonglong_value;
|
||||||
|
|
||||||
/* Don't use bigger value than given with --maximum-variable-name=.. */
|
/* Don't use bigger value than given with --maximum-variable-name=.. */
|
||||||
if ((ulong) tmp > max_system_variables.*offset)
|
if (tmp > max_system_variables.*offset)
|
||||||
{
|
{
|
||||||
throw_bounds_warning(thd, TRUE, TRUE, name, (longlong) tmp);
|
throw_bounds_warning(thd, TRUE, TRUE, name, (longlong) tmp);
|
||||||
tmp= max_system_variables.*offset;
|
tmp= max_system_variables.*offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (option_limits)
|
if (option_limits)
|
||||||
tmp= (ulong) fix_unsigned(thd, tmp, option_limits);
|
tmp= fix_unsigned(thd, tmp, option_limits);
|
||||||
#if SIZEOF_LONG < SIZEOF_LONG_LONG
|
#if SIZEOF_LONG < SIZEOF_LONG_LONG
|
||||||
else if (tmp > ULONG_MAX)
|
else if (tmp > ULONG_MAX)
|
||||||
{
|
{
|
||||||
@ -1543,6 +1543,7 @@ bool sys_var_thd_ulong::update(THD *thd, set_var *var)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
DBUG_ASSERT(tmp <= ULONG_MAX);
|
||||||
if (var->type == OPT_GLOBAL)
|
if (var->type == OPT_GLOBAL)
|
||||||
global_system_variables.*offset= (ulong) tmp;
|
global_system_variables.*offset= (ulong) tmp;
|
||||||
else
|
else
|
||||||
|
@ -6760,7 +6760,7 @@ int get_part_iter_for_interval_via_mapping(partition_info *part_info,
|
|||||||
store_key_image_to_rec(field, max_value, field_len);
|
store_key_image_to_rec(field, max_value, field_len);
|
||||||
bool include_endp= !test(flags & NEAR_MAX);
|
bool include_endp= !test(flags & NEAR_MAX);
|
||||||
part_iter->part_nums.end= get_endpoint(part_info, 0, include_endp);
|
part_iter->part_nums.end= get_endpoint(part_info, 0, include_endp);
|
||||||
if (part_iter->part_nums.start == part_iter->part_nums.end &&
|
if (part_iter->part_nums.start >= part_iter->part_nums.end &&
|
||||||
!part_iter->ret_null_part)
|
!part_iter->ret_null_part)
|
||||||
return 0; /* No partitions */
|
return 0; /* No partitions */
|
||||||
}
|
}
|
||||||
@ -6938,7 +6938,7 @@ int get_part_iter_for_interval_via_walking(partition_info *part_info,
|
|||||||
|
|
||||||
uint32 get_next_partition_id_range(PARTITION_ITERATOR* part_iter)
|
uint32 get_next_partition_id_range(PARTITION_ITERATOR* part_iter)
|
||||||
{
|
{
|
||||||
if (part_iter->part_nums.cur == part_iter->part_nums.end)
|
if (part_iter->part_nums.cur >= part_iter->part_nums.end)
|
||||||
{
|
{
|
||||||
part_iter->part_nums.cur= part_iter->part_nums.start;
|
part_iter->part_nums.cur= part_iter->part_nums.start;
|
||||||
return NOT_A_PARTITION_ID;
|
return NOT_A_PARTITION_ID;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user