summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Widenius <monty@askmonty.org>2012-08-13 23:45:16 +0300
committerMichael Widenius <monty@askmonty.org>2012-08-13 23:45:16 +0300
commitc0f04fa31cd46c2507b2152eeeeb4950e0d5edc9 (patch)
treeb0696b0df90fdc17d6801d14229c74167f00647d
parentc9b95de246ccaad22abf90996f295b05fe85f53d (diff)
parentcee888acb36141136cdb121a7bb7d53200b14cb6 (diff)
downloadmariadb-git-c0f04fa31cd46c2507b2152eeeeb4950e0d5edc9.tar.gz
Automatic merge
-rw-r--r--client/mysqldump.c2
-rw-r--r--dbug/dbug.c3
-rw-r--r--mysql-test/suite/heap/heap.result52
-rw-r--r--mysql-test/suite/heap/heap.test44
-rw-r--r--plugin/semisync/semisync_master.cc3
-rw-r--r--sql/opt_range.cc3
-rw-r--r--sql/sql_table.cc9
-rw-r--r--storage/heap/hp_block.c23
-rw-r--r--storage/heap/hp_create.c23
-rw-r--r--storage/innobase/handler/ha_innodb.cc2
-rw-r--r--storage/maria/ma_delete.c2
-rw-r--r--storage/maria/ma_write.c2
12 files changed, 139 insertions, 29 deletions
diff --git a/client/mysqldump.c b/client/mysqldump.c
index 739cc345ec2..c20d4947185 100644
--- a/client/mysqldump.c
+++ b/client/mysqldump.c
@@ -4805,7 +4805,7 @@ static int add_slave_statements(void)
static int do_show_slave_status(MYSQL *mysql_con)
{
- MYSQL_RES *slave;
+ MYSQL_RES *slave= 0;
const char *comment_prefix=
(opt_slave_data == MYSQL_OPT_SLAVE_DATA_COMMENTED_SQL) ? "-- " : "";
if (mysql_query_with_error_report(mysql_con, &slave, "SHOW SLAVE STATUS"))
diff --git a/dbug/dbug.c b/dbug/dbug.c
index af0a937ff07..b285b32fa17 100644
--- a/dbug/dbug.c
+++ b/dbug/dbug.c
@@ -284,9 +284,6 @@ static int DoTrace(CODE_STATE *cs);
/* Test to see if file is writable */
#if defined(HAVE_ACCESS)
static BOOLEAN Writable(const char *pathname);
- /* Change file owner and group */
-static void ChangeOwner(CODE_STATE *cs, char *pathname);
- /* Allocate memory for runtime support */
#endif
static void DoPrefix(CODE_STATE *cs, uint line);
diff --git a/mysql-test/suite/heap/heap.result b/mysql-test/suite/heap/heap.result
index f058c9f9c72..ae562a0dda1 100644
--- a/mysql-test/suite/heap/heap.result
+++ b/mysql-test/suite/heap/heap.result
@@ -738,3 +738,55 @@ SELECT c2 FROM t1;
c2
0
DROP TABLE t1;
+CREATE TABLE t1 (a int, index(a)) engine=heap min_rows=10 max_rows=100;
+insert into t1 values(1);
+select data_length,index_length from information_schema.tables where table_schema="test" and table_name="t1";
+data_length index_length
+1600 2400
+drop table t1;
+CREATE TABLE t1 (a int, index(a)) engine=heap min_rows=10 max_rows=10000;
+insert into t1 values(1);
+select data_length,index_length from information_schema.tables where table_schema="test" and table_name="t1";
+data_length index_length
+16000 24000
+drop table t1;
+CREATE TABLE t1 (a int, index(a)) engine=heap min_rows=3000 max_rows=3000;
+insert into t1 values(1);
+select data_length,index_length from information_schema.tables where table_schema="test" and table_name="t1";
+data_length index_length
+48000 72000
+drop table t1;
+CREATE TABLE t1 (a int, index(a)) engine=heap max_rows=15000;
+insert into t1 values(1);
+select data_length,index_length from information_schema.tables where table_schema="test" and table_name="t1";
+data_length index_length
+24000 36000
+drop table t1;
+create table t1 (c1 int, index(c1)) engine=heap max_rows=10000;
+insert into t1 select rand(100000000);
+insert into t1 select rand(100000000) from t1;
+insert into t1 select rand(100000000) from t1;
+insert into t1 select rand(100000000) from t1;
+insert into t1 select rand(100000000) from t1;
+insert into t1 select rand(100000000) from t1;
+insert into t1 select rand(100000000) from t1;
+insert into t1 select rand(100000000) from t1;
+insert into t1 select rand(100000000) from t1;
+insert into t1 select rand(100000000) from t1;
+insert into t1 select rand(100000000) from t1 limit 488;
+select data_length,index_length from information_schema.tables where table_schema="test" and table_name="t1";
+data_length index_length
+16000 24000
+insert into t1 select rand(100000000) from t1 limit 1;
+select data_length,index_length from information_schema.tables where table_schema="test" and table_name="t1";
+data_length index_length
+33024 49024
+insert into t1 select rand(100000000) from t1 limit 1000;
+select data_length,index_length from information_schema.tables where table_schema="test" and table_name="t1";
+data_length index_length
+49024 73024
+insert into t1 select rand(100000000) from t1;
+select data_length,index_length from information_schema.tables where table_schema="test" and table_name="t1";
+data_length index_length
+81024 121024
+drop table t1;
diff --git a/mysql-test/suite/heap/heap.test b/mysql-test/suite/heap/heap.test
index 7d56425799a..681d3b422e7 100644
--- a/mysql-test/suite/heap/heap.test
+++ b/mysql-test/suite/heap/heap.test
@@ -485,3 +485,47 @@ INSERT INTO t1 VALUES('', 0);
ALTER TABLE t1 MODIFY c1 VARCHAR(101);
SELECT c2 FROM t1;
DROP TABLE t1;
+
+#
+# Show that MIN_ROWS and MAX_ROWS have an effect on how data_length
+# and index_length are allocated.
+# Result is different for 32 / 64 bit machines as pointer lengths are different
+#
+
+CREATE TABLE t1 (a int, index(a)) engine=heap min_rows=10 max_rows=100;
+insert into t1 values(1);
+select data_length,index_length from information_schema.tables where table_schema="test" and table_name="t1";
+drop table t1;
+CREATE TABLE t1 (a int, index(a)) engine=heap min_rows=10 max_rows=10000;
+insert into t1 values(1);
+select data_length,index_length from information_schema.tables where table_schema="test" and table_name="t1";
+drop table t1;
+CREATE TABLE t1 (a int, index(a)) engine=heap min_rows=3000 max_rows=3000;
+insert into t1 values(1);
+select data_length,index_length from information_schema.tables where table_schema="test" and table_name="t1";
+drop table t1;
+CREATE TABLE t1 (a int, index(a)) engine=heap max_rows=15000;
+insert into t1 values(1);
+select data_length,index_length from information_schema.tables where table_schema="test" and table_name="t1";
+drop table t1;
+
+create table t1 (c1 int, index(c1)) engine=heap max_rows=10000;
+insert into t1 select rand(100000000);
+insert into t1 select rand(100000000) from t1;
+insert into t1 select rand(100000000) from t1;
+insert into t1 select rand(100000000) from t1;
+insert into t1 select rand(100000000) from t1;
+insert into t1 select rand(100000000) from t1;
+insert into t1 select rand(100000000) from t1;
+insert into t1 select rand(100000000) from t1;
+insert into t1 select rand(100000000) from t1;
+insert into t1 select rand(100000000) from t1;
+insert into t1 select rand(100000000) from t1 limit 488;
+select data_length,index_length from information_schema.tables where table_schema="test" and table_name="t1";
+insert into t1 select rand(100000000) from t1 limit 1;
+select data_length,index_length from information_schema.tables where table_schema="test" and table_name="t1";
+insert into t1 select rand(100000000) from t1 limit 1000;
+select data_length,index_length from information_schema.tables where table_schema="test" and table_name="t1";
+insert into t1 select rand(100000000) from t1;
+select data_length,index_length from information_schema.tables where table_schema="test" and table_name="t1";
+drop table t1;
diff --git a/plugin/semisync/semisync_master.cc b/plugin/semisync/semisync_master.cc
index 8573c4dcbde..d1b982468d2 100644
--- a/plugin/semisync/semisync_master.cc
+++ b/plugin/semisync/semisync_master.cc
@@ -1049,10 +1049,11 @@ int ReplSemiSyncMaster::readSlaveReply(NET *net, uint32 server_id,
ulong log_file_len = 0;
ulong packet_len;
int result = -1;
-
struct timespec start_ts;
ulong trc_level = trace_level_;
+ LINT_INIT_STRUCT(start_ts);
+
function_enter(kWho);
assert((unsigned char)event_buf[1] == kPacketMagicNum);
diff --git a/sql/opt_range.cc b/sql/opt_range.cc
index 910bbf2d975..dba72d76bb4 100644
--- a/sql/opt_range.cc
+++ b/sql/opt_range.cc
@@ -2001,7 +2001,7 @@ int QUICK_RANGE_SELECT::init_ror_merged_scan(bool reuse_handler)
{
handler *save_file= file, *org_file;
my_bool org_key_read;
- THD *thd;
+ THD *thd= head->in_use;
DBUG_ENTER("QUICK_RANGE_SELECT::init_ror_merged_scan");
in_ror_merged_scan= 1;
@@ -2023,7 +2023,6 @@ int QUICK_RANGE_SELECT::init_ror_merged_scan(bool reuse_handler)
DBUG_RETURN(0);
}
- thd= head->in_use;
if (!(file= head->file->clone(head->s->normalized_path.str, thd->mem_root)))
{
/*
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 7bc0e348626..45de3506ec7 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -1960,8 +1960,9 @@ bool mysql_rm_table(THD *thd,TABLE_LIST *tables, my_bool if_exists,
static uint32 comment_length(THD *thd, uint32 comment_pos,
const char **comment_start)
{
- const char *query= thd->query();
- const char *query_end= query + thd->query_length();
+ /* We use uchar * here to make array indexing portable */
+ const uchar *query= (uchar*) thd->query();
+ const uchar *query_end= (uchar*) query + thd->query_length();
const uchar *const state_map= thd->charset()->state_map;
for (; query < query_end; query++)
@@ -1975,12 +1976,12 @@ static uint32 comment_length(THD *thd, uint32 comment_pos,
state_map[static_cast<uchar>(*query)] != MY_LEX_LONG_COMMENT || query[1] != '*')
return 0;
- *comment_start= query;
+ *comment_start= (char*) query;
for (query+= 3; query < query_end; query++)
{
if (query[-1] == '*' && query[0] == '/')
- return query - *comment_start + 1;
+ return (char*) query - *comment_start + 1;
}
return 0;
}
diff --git a/storage/heap/hp_block.c b/storage/heap/hp_block.c
index 90efeeb7924..01978e2b4e8 100644
--- a/storage/heap/hp_block.c
+++ b/storage/heap/hp_block.c
@@ -64,18 +64,19 @@ int hp_get_new_block(HP_BLOCK *block, size_t *alloc_length)
break;
/*
- Allocate space for leaf block plus space for upper level blocks up to
- first level that has a free slot to put the pointer.
- In some cases we actually allocate more then we need:
- Consider e.g. a situation where we have one level 1 block and one level 0
- block, the level 0 block is full and this function is called. We only
- need a leaf block in this case. Nevertheless, we will get here with i=1
- and will also allocate sizeof(HP_PTRS) for non-leaf block and will never
- use this space.
- This doesn't add much overhead - with current values of sizeof(HP_PTRS)
- and my_default_record_cache_size we get about 1/128 unused memory.
+ Allocate space for leaf block (data) plus space for upper level blocks
+ up to first level that has a free slot to put the pointer.
+ If this is a new level, we have to allocate pointers to all future
+ lower levels.
+
+ For example, for level 0, we allocate data for X rows.
+ When level 0 is full, we allocate data for HPTRS_IN_NODE + X rows.
+ Next time we allocate data for X rows.
+ When level 1 is full, we allocate data for HPTRS_IN_NODE at level 2 and 1
+ + X rows at level 0.
*/
- *alloc_length=sizeof(HP_PTRS)*i+block->records_in_block* block->recbuffer;
+ *alloc_length= (sizeof(HP_PTRS)* ((i == block->levels) ? i : i - 1) +
+ block->records_in_block* block->recbuffer);
if (!(root=(HP_PTRS*) my_malloc(*alloc_length,MYF(MY_WME))))
return 1;
diff --git a/storage/heap/hp_create.c b/storage/heap/hp_create.c
index 22ab9b54a85..d170d1abc65 100644
--- a/storage/heap/hp_create.c
+++ b/storage/heap/hp_create.c
@@ -245,21 +245,32 @@ static void init_block(HP_BLOCK *block, uint reclength, ulong min_records,
{
uint i,recbuffer,records_in_block;
- max_records= max(min_records,max_records);
+ /*
+ If not min_records and max_records are given, optimize for 1000 rows
+ */
+ if (!min_records)
+ min_records= min(1000, max_records);
if (!max_records)
- max_records= 1000; /* As good as quess as anything */
- recbuffer= (uint) (reclength + sizeof(uchar**) - 1) & ~(sizeof(uchar**) - 1);
- records_in_block= max_records / 10;
+ max_records= max(min_records, 1000);
/*
We don't want too few records_in_block as otherwise the overhead of
of the HP_PTRS block will be too notable
*/
- records_in_block= min(1000, max_records);
+ records_in_block= max(1000, min_records);
+ records_in_block= min(records_in_block, max_records);
+ /* If big max_records is given, allocate bigger blocks */
+ records_in_block= max(records_in_block, max_records / 10);
+ /* We don't want too few blocks per row either */
if (records_in_block < 10)
records_in_block= 10;
- /* The + 1 is there to ensure that we get at least 1 row per level */
+ recbuffer= (uint) (reclength + sizeof(uchar**) - 1) & ~(sizeof(uchar**) - 1);
+ /*
+ Don't allocate more than my_default_record_cache_size per level.
+ The + 1 is there to ensure that we get at least 1 row per level (for
+ the exceptional case of very long rows)
+ */
if (records_in_block*recbuffer >
(my_default_record_cache_size-sizeof(HP_PTRS)*HP_MAX_LEVELS))
records_in_block= (my_default_record_cache_size - sizeof(HP_PTRS) *
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
index 5300f3f8966..a39aef0794a 100644
--- a/storage/innobase/handler/ha_innodb.cc
+++ b/storage/innobase/handler/ha_innodb.cc
@@ -11712,7 +11712,7 @@ static MYSQL_SYSVAR_ULONG(read_ahead_threshold, srv_read_ahead_threshold,
"trigger a readahead.",
NULL, NULL, 56, 0, 64, 0);
-#ifdef UNIV_DEBUG
+#ifdef UNIV_DEBUG_never
static MYSQL_SYSVAR_UINT(trx_rseg_n_slots_debug, trx_rseg_n_slots_debug,
PLUGIN_VAR_RQCMDARG,
"Debug flags for InnoDB to limit TRX_RSEG_N_SLOTS for trx_rsegf_undo_find_free()",
diff --git a/storage/maria/ma_delete.c b/storage/maria/ma_delete.c
index 069d73b553c..5b8d0e01677 100644
--- a/storage/maria/ma_delete.c
+++ b/storage/maria/ma_delete.c
@@ -163,6 +163,8 @@ my_bool _ma_ck_delete(MARIA_HA *info, MARIA_KEY *key)
MARIA_KEY org_key;
DBUG_ENTER("_ma_ck_delete");
+ LINT_INIT_STRUCT(org_key);
+
save_key_data= key->data;
if (share->now_transactional)
{
diff --git a/storage/maria/ma_write.c b/storage/maria/ma_write.c
index 74c1a106df2..f1649083105 100644
--- a/storage/maria/ma_write.c
+++ b/storage/maria/ma_write.c
@@ -478,6 +478,8 @@ static my_bool _ma_ck_write_btree_with_log(MARIA_HA *info, MARIA_KEY *key,
my_bool transactional= share->now_transactional;
DBUG_ENTER("_ma_ck_write_btree_with_log");
+ LINT_INIT_STRUCT(org_key);
+
if (transactional)
{
/* Save original value as the key may change */