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);
|
||||
}
|
||||
|
||||
/*
|
||||
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
|
||||
@ -1346,34 +1375,51 @@ void show_diff(DYNAMIC_STRING* ds,
|
||||
{
|
||||
|
||||
DYNAMIC_STRING ds_tmp;
|
||||
int have_diff = 0;
|
||||
|
||||
if (init_dynamic_string(&ds_tmp, "", 256, 256))
|
||||
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();
|
||||
|
||||
/* First try with unified diff */
|
||||
if (run_tool("diff",
|
||||
&ds_tmp, /* Get output from diff in ds_tmp */
|
||||
"-u",
|
||||
filename1,
|
||||
filename2,
|
||||
"2>&1",
|
||||
NULL) > 1) /* Most "diff" tools return >1 if error */
|
||||
if (have_diff)
|
||||
{
|
||||
dynstr_set(&ds_tmp, "");
|
||||
|
||||
/* Fallback to context diff with "diff -c" */
|
||||
/* First try with unified diff */
|
||||
if (run_tool("diff",
|
||||
&ds_tmp, /* Get output from diff in ds_tmp */
|
||||
"-c",
|
||||
"-u",
|
||||
filename1,
|
||||
filename2,
|
||||
"2>&1",
|
||||
NULL) > 1) /* Most "diff" tools return >1 if error */
|
||||
{
|
||||
/*
|
||||
Fallback to dump both files to result file and inform
|
||||
about installing "diff"
|
||||
*/
|
||||
dynstr_set(&ds_tmp, "");
|
||||
|
||||
/* Fallback to context diff with "diff -c" */
|
||||
if (run_tool("diff",
|
||||
&ds_tmp, /* Get output from diff in ds_tmp */
|
||||
"-c",
|
||||
filename1,
|
||||
filename2,
|
||||
"2>&1",
|
||||
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
|
||||
about installing "diff"
|
||||
*/
|
||||
|
||||
dynstr_set(&ds_tmp, "");
|
||||
|
||||
dynstr_append(&ds_tmp,
|
||||
@ -1397,8 +1443,7 @@ void show_diff(DYNAMIC_STRING* ds,
|
||||
dynstr_append(&ds_tmp, " >>>\n");
|
||||
cat_file(&ds_tmp, filename2);
|
||||
dynstr_append(&ds_tmp, "<<<<\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ds)
|
||||
{
|
||||
|
@ -1,4 +1,16 @@
|
||||
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;
|
||||
insert into t1 values (1),(2),(3);
|
||||
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 # Xid # # COMMIT /* XID */
|
||||
DROP TABLE t1;
|
||||
flush status;
|
||||
show status like "binlog_cache_use";
|
||||
Variable_name Value
|
||||
Binlog_cache_use 13
|
||||
Binlog_cache_use 0
|
||||
show status like "binlog_cache_disk_use";
|
||||
Variable_name Value
|
||||
Binlog_cache_disk_use 0
|
||||
create table t1 (a int) engine=innodb;
|
||||
show status like "binlog_cache_use";
|
||||
Variable_name Value
|
||||
Binlog_cache_use 14
|
||||
Binlog_cache_use 1
|
||||
show status like "binlog_cache_disk_use";
|
||||
Variable_name Value
|
||||
Binlog_cache_disk_use 1
|
||||
@ -131,7 +132,7 @@ delete from t1;
|
||||
commit;
|
||||
show status like "binlog_cache_use";
|
||||
Variable_name Value
|
||||
Binlog_cache_use 15
|
||||
Binlog_cache_use 2
|
||||
show status like "binlog_cache_disk_use";
|
||||
Variable_name Value
|
||||
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
|
||||
# transactional table.
|
||||
#
|
||||
flush status;
|
||||
show status like "binlog_cache_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;
|
||||
--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
|
||||
# no records will match.
|
||||
|
@ -4815,7 +4815,7 @@ int ha_partition::info(uint flag)
|
||||
/*
|
||||
Calculates statistical variables
|
||||
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
|
||||
deletes
|
||||
We report sum
|
||||
@ -4854,13 +4854,13 @@ int ha_partition::info(uint flag)
|
||||
stats.check_time= file->stats.check_time;
|
||||
}
|
||||
} while (*(++file_array));
|
||||
if (stats.records < 2 &&
|
||||
if (stats.records && stats.records < 2 &&
|
||||
!(m_file[0]->ha_table_flags() & HA_STATS_RECORDS_IS_EXACT))
|
||||
stats.records= 2;
|
||||
if (stats.records > 0)
|
||||
stats.mean_rec_length= (ulong) (stats.data_file_length / stats.records);
|
||||
else
|
||||
stats.mean_rec_length= 1; //? What should we set here
|
||||
stats.mean_rec_length= 0;
|
||||
}
|
||||
if (flag & HA_STATUS_CONST)
|
||||
{
|
||||
|
@ -230,7 +230,7 @@ extern "C" sig_handler handle_segfault(int sig);
|
||||
#if defined(__linux__)
|
||||
#define ENABLE_TEMP_POOL 1
|
||||
#else
|
||||
#define ENABLE_TEMP_TOOL 0
|
||||
#define ENABLE_TEMP_POOL 0
|
||||
#endif
|
||||
|
||||
/* Constants */
|
||||
|
@ -1527,14 +1527,14 @@ bool sys_var_thd_ulong::update(THD *thd, set_var *var)
|
||||
ulonglong tmp= var->save_result.ulonglong_value;
|
||||
|
||||
/* 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);
|
||||
tmp= max_system_variables.*offset;
|
||||
}
|
||||
|
||||
if (option_limits)
|
||||
tmp= (ulong) fix_unsigned(thd, tmp, option_limits);
|
||||
tmp= fix_unsigned(thd, tmp, option_limits);
|
||||
#if SIZEOF_LONG < SIZEOF_LONG_LONG
|
||||
else if (tmp > ULONG_MAX)
|
||||
{
|
||||
@ -1543,6 +1543,7 @@ bool sys_var_thd_ulong::update(THD *thd, set_var *var)
|
||||
}
|
||||
#endif
|
||||
|
||||
DBUG_ASSERT(tmp <= ULONG_MAX);
|
||||
if (var->type == OPT_GLOBAL)
|
||||
global_system_variables.*offset= (ulong) tmp;
|
||||
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);
|
||||
bool include_endp= !test(flags & NEAR_MAX);
|
||||
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)
|
||||
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)
|
||||
{
|
||||
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;
|
||||
return NOT_A_PARTITION_ID;
|
||||
|
Loading…
x
Reference in New Issue
Block a user