Merge mysql.com:/home/mydev/mysql-4.1

into mysql.com:/home/mydev/mysql-4.1-4100
This commit is contained in:
ingo@mysql.com 2005-01-24 10:47:52 +01:00
commit 47c4009149
19 changed files with 226 additions and 92 deletions

View file

@ -88,12 +88,13 @@ typedef struct st_key_cache
ulong param_division_limit; /* min. percentage of warm blocks */ ulong param_division_limit; /* min. percentage of warm blocks */
ulong param_age_threshold; /* determines when hot block is downgraded */ ulong param_age_threshold; /* determines when hot block is downgraded */
/* Statistics variables */ /* Statistics variables. These are reset in reset_key_cache_counters(). */
ulong global_blocks_changed; /* number of currently dirty blocks */ ulong global_blocks_changed; /* number of currently dirty blocks */
ulong global_cache_w_requests;/* number of write requests (write hits) */ ulong global_cache_w_requests;/* number of write requests (write hits) */
ulong global_cache_write; /* number of writes from the cache to files */ ulong global_cache_write; /* number of writes from the cache to files */
ulong global_cache_r_requests;/* number of read requests (read hits) */ ulong global_cache_r_requests;/* number of read requests (read hits) */
ulong global_cache_read; /* number of reads from files to the cache */ ulong global_cache_read; /* number of reads from files to the cache */
int blocks; /* max number of blocks in the cache */ int blocks; /* max number of blocks in the cache */
my_bool in_init; /* Set to 1 in MySQL during init/resize */ my_bool in_init; /* Set to 1 in MySQL during init/resize */
} KEY_CACHE; } KEY_CACHE;
@ -132,5 +133,7 @@ extern my_bool multi_key_cache_set(const byte *key, uint length,
KEY_CACHE *key_cache); KEY_CACHE *key_cache);
extern void multi_key_cache_change(KEY_CACHE *old_data, extern void multi_key_cache_change(KEY_CACHE *old_data,
KEY_CACHE *new_data); KEY_CACHE *new_data);
extern int reset_key_cache_counters(const char *name,
KEY_CACHE *key_cache);
C_MODE_END C_MODE_END
#endif /* _keycache_h */ #endif /* _keycache_h */

View file

@ -81,6 +81,17 @@ dict_create_sys_tables_tuple(
dfield_set_data(dfield, ptr, 8); dfield_set_data(dfield, ptr, 8);
/* 7: MIX_LEN --------------------------*/ /* 7: MIX_LEN --------------------------*/
/* Track corruption reported on mailing list Jan 14, 2005 */
if (table->mix_len != 0 && table->mix_len != 0x80000000) {
fprintf(stderr,
"InnoDB: Error: mix_len is %lu in table %s\n", (ulong)table->mix_len,
table->name);
mem_analyze_corruption((byte*)&(table->mix_len));
ut_error;
}
dfield = dtuple_get_nth_field(entry, 5); dfield = dtuple_get_nth_field(entry, 5);
ptr = mem_heap_alloc(heap, 4); ptr = mem_heap_alloc(heap, 4);

View file

@ -2895,9 +2895,9 @@ loop:
constraint_name = NULL; constraint_name = NULL;
if (ptr1 < ptr2) { if (ptr1 < ptr2) {
/* The user has specified a constraint name. Pick it so /* The user may have specified a constraint name. Pick it so
that we can store 'databasename/constraintname' as the id of that we can store 'databasename/constraintname' as the id of
the id of the constraint to system tables. */ of the constraint to system tables. */
ptr = ptr1; ptr = ptr1;
ptr = dict_accept(ptr, "CONSTRAINT", &success); ptr = dict_accept(ptr, "CONSTRAINT", &success);
@ -2934,6 +2934,10 @@ loop:
ptr = dict_accept(ptr, "FOREIGN", &success); ptr = dict_accept(ptr, "FOREIGN", &success);
if (!success) {
goto loop;
}
if (!isspace(*ptr)) { if (!isspace(*ptr)) {
goto loop; goto loop;
} }

View file

@ -729,6 +729,7 @@ dict_load_table(
ulint space; ulint space;
ulint n_cols; ulint n_cols;
ulint err; ulint err;
ulint mix_len;
mtr_t mtr; mtr_t mtr;
#ifdef UNIV_SYNC_DEBUG #ifdef UNIV_SYNC_DEBUG
@ -775,6 +776,22 @@ dict_load_table(
return(NULL); return(NULL);
} }
/* Track a corruption bug reported on the MySQL mailing list Jan 14,
2005: mix_len had a value different from 0 */
field = rec_get_nth_field(rec, 7, &len);
ut_a(len == 4);
mix_len = mach_read_from_4(field);
if (mix_len != 0 && mix_len != 0x80000000) {
ut_print_timestamp(stderr);
fprintf(stderr,
" InnoDB: table %s has a nonsensical mix len %lu\n",
name, (ulong)mix_len);
}
#if MYSQL_VERSION_ID < 50300 #if MYSQL_VERSION_ID < 50300
/* Starting from MySQL 5.0.3, the high-order bit of MIX_LEN is the /* Starting from MySQL 5.0.3, the high-order bit of MIX_LEN is the
"compact format" flag. */ "compact format" flag. */

View file

@ -477,28 +477,33 @@ fil_node_open_file(
ut_a(node->n_pending == 0); ut_a(node->n_pending == 0);
ut_a(node->open == FALSE); ut_a(node->open == FALSE);
/* printf("Opening file %s\n", node->name); */
if (space->purpose == FIL_LOG) {
node->handle = os_file_create(node->name, OS_FILE_OPEN,
OS_FILE_AIO, OS_LOG_FILE, &ret);
} else if (node->is_raw_disk) {
node->handle = os_file_create(node->name,
OS_FILE_OPEN_RAW,
OS_FILE_AIO, OS_DATA_FILE, &ret);
} else {
node->handle = os_file_create(node->name, OS_FILE_OPEN,
OS_FILE_AIO, OS_DATA_FILE, &ret);
}
ut_a(ret);
node->open = TRUE;
system->n_open++;
if (node->size == 0) { if (node->size == 0) {
/* It must be a single-table tablespace and we do not know the
size of the file yet. First we open the file in the normal
mode, no async I/O here, for simplicity. Then do some checks,
and close the file again.
NOTE that we could not use the simple file read function
os_file_read() in Windows to read from a file opened for
async I/O! */
node->handle = os_file_create_simple_no_error_handling(
node->name, OS_FILE_OPEN,
OS_FILE_READ_ONLY, &success);
if (!success) {
/* The following call prints an error message */
os_file_get_last_error(TRUE);
ut_print_timestamp(stderr);
fprintf(stderr,
" InnoDB: Fatal error: cannot open %s\n."
"InnoDB: Have you deleted .ibd files under a running mysqld server?\n",
node->name);
ut_a(0);
}
ut_a(space->purpose != FIL_LOG); ut_a(space->purpose != FIL_LOG);
ut_a(space->id != 0);
os_file_get_size(node->handle, &size_low, &size_high); os_file_get_size(node->handle, &size_low, &size_high);
@ -508,11 +513,6 @@ fil_node_open_file(
node->size = (ulint) (size_bytes / UNIV_PAGE_SIZE); node->size = (ulint) (size_bytes / UNIV_PAGE_SIZE);
#else #else
/* It must be a single-table tablespace and we do not know the
size of the file yet */
ut_a(space->id != 0);
if (size_bytes < FIL_IBD_FILE_INITIAL_SIZE * UNIV_PAGE_SIZE) { if (size_bytes < FIL_IBD_FILE_INITIAL_SIZE * UNIV_PAGE_SIZE) {
fprintf(stderr, fprintf(stderr,
"InnoDB: Error: the size of single-table tablespace file %s\n" "InnoDB: Error: the size of single-table tablespace file %s\n"
@ -536,6 +536,10 @@ fil_node_open_file(
ut_free(buf2); ut_free(buf2);
/* Close the file now that we have read the space id from it */
os_file_close(node->handle);
if (space_id == ULINT_UNDEFINED || space_id == 0) { if (space_id == ULINT_UNDEFINED || space_id == 0) {
fprintf(stderr, fprintf(stderr,
"InnoDB: Error: tablespace id %lu in file %s is not sensible\n", "InnoDB: Error: tablespace id %lu in file %s is not sensible\n",
@ -563,6 +567,30 @@ fil_node_open_file(
space->size += node->size; space->size += node->size;
} }
/* printf("Opening file %s\n", node->name); */
/* Open the file for reading and writing, in Windows normally in the
unbuffered async I/O mode, though global variables may make
os_file_create() to fall back to the normal file I/O mode. */
if (space->purpose == FIL_LOG) {
node->handle = os_file_create(node->name, OS_FILE_OPEN,
OS_FILE_AIO, OS_LOG_FILE, &ret);
} else if (node->is_raw_disk) {
node->handle = os_file_create(node->name,
OS_FILE_OPEN_RAW,
OS_FILE_AIO, OS_DATA_FILE, &ret);
} else {
node->handle = os_file_create(node->name, OS_FILE_OPEN,
OS_FILE_AIO, OS_DATA_FILE, &ret);
}
ut_a(ret);
node->open = TRUE;
system->n_open++;
if (space->purpose == FIL_TABLESPACE && space->id != 0) { if (space->purpose == FIL_TABLESPACE && space->id != 0) {
/* Put the node to the LRU list */ /* Put the node to the LRU list */
UT_LIST_ADD_FIRST(LRU, system->LRU, node); UT_LIST_ADD_FIRST(LRU, system->LRU, node);
@ -4111,7 +4139,8 @@ fil_flush_file_spaces(
space = UT_LIST_GET_FIRST(system->space_list); space = UT_LIST_GET_FIRST(system->space_list);
while (space) { while (space) {
if (space->purpose == purpose) { if (space->purpose == purpose && !space->is_being_deleted) {
space->n_pending_flushes++; /* prevent dropping of the space->n_pending_flushes++; /* prevent dropping of the
space while we are space while we are
flushing */ flushing */

View file

@ -537,6 +537,7 @@ if [ x$SOURCE_DIST = x1 ] ; then
INSTALL_DB="./install_test_db" INSTALL_DB="./install_test_db"
MYSQL_FIX_SYSTEM_TABLES="$BASEDIR/scripts/mysql_fix_privilege_tables" MYSQL_FIX_SYSTEM_TABLES="$BASEDIR/scripts/mysql_fix_privilege_tables"
NDB_TOOLS_DIR="$BASEDIR/ndb/tools" NDB_TOOLS_DIR="$BASEDIR/ndb/tools"
NDB_MGM="$BASEDIR/ndb/src/mgmclient/ndb_mgm"
else else
if test -x "$BASEDIR/libexec/mysqld" if test -x "$BASEDIR/libexec/mysqld"
then then
@ -558,6 +559,7 @@ else
INSTALL_DB="./install_test_db --bin" INSTALL_DB="./install_test_db --bin"
MYSQL_FIX_SYSTEM_TABLES="$CLIENT_BINDIR/mysql_fix_privilege_tables" MYSQL_FIX_SYSTEM_TABLES="$CLIENT_BINDIR/mysql_fix_privilege_tables"
NDB_TOOLS_DIR="$CLIENT_BINDIR" NDB_TOOLS_DIR="$CLIENT_BINDIR"
NDB_MGM="$CLIENT_BINDIR/ndb_mgm"
if test -d "$BASEDIR/share/mysql/english" if test -d "$BASEDIR/share/mysql/english"
then then
LANGUAGE="$BASEDIR/share/mysql/english/" LANGUAGE="$BASEDIR/share/mysql/english/"
@ -607,6 +609,7 @@ MYSQL="$MYSQL --host=localhost --port=$MASTER_MYPORT --socket=$MASTER_MYSOCK --u
export MYSQL MYSQL_DUMP MYSQL_BINLOG MYSQL_FIX_SYSTEM_TABLES export MYSQL MYSQL_DUMP MYSQL_BINLOG MYSQL_FIX_SYSTEM_TABLES
export CLIENT_BINDIR TESTS_BINDIR CHARSETSDIR export CLIENT_BINDIR TESTS_BINDIR CHARSETSDIR
export NDB_TOOLS_DIR export NDB_TOOLS_DIR
export NDB_MGM
MYSQL_TEST_ARGS="--no-defaults --socket=$MASTER_MYSOCK --database=$DB \ MYSQL_TEST_ARGS="--no-defaults --socket=$MASTER_MYSOCK --database=$DB \
--user=$DBUSER --password=$DBPASSWD --silent -v --skip-safemalloc \ --user=$DBUSER --password=$DBPASSWD --silent -v --skip-safemalloc \

View file

@ -33,7 +33,7 @@ t1 CREATE TABLE `t1` (
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
SHOW KEYS FROM t1; SHOW KEYS FROM t1;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
t1 1 key_a 1 a A NULL 9 NULL YES BTREE t1 1 key_a 1 a A NULL 3 NULL YES BTREE
ALTER TABLE t1 CHANGE a a CHAR(4); ALTER TABLE t1 CHANGE a a CHAR(4);
SHOW CREATE TABLE t1; SHOW CREATE TABLE t1;
Table Create Table Table Create Table
@ -53,5 +53,5 @@ t1 CREATE TABLE `t1` (
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
SHOW KEYS FROM t1; SHOW KEYS FROM t1;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
t1 1 key_a 1 a A NULL 9 NULL YES BTREE t1 1 key_a 1 a A NULL 3 NULL YES BTREE
DROP TABLE t1; DROP TABLE t1;

View file

@ -246,3 +246,11 @@ SELECT FOUND_ROWS();
FOUND_ROWS() FOUND_ROWS()
0 0
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 (a int, b int);
INSERT INTO t1 VALUES (1,2), (1,3), (1,4), (1,5);
SELECT SQL_CALC_FOUND_ROWS DISTINCT 'a' FROM t1 GROUP BY b LIMIT 2;
a
a
SELECT FOUND_ROWS();
FOUND_ROWS()
1

View file

@ -166,3 +166,12 @@ INSERT INTO t1 VALUES (0), (0), (1), (2);
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a = 0 GROUP BY a HAVING a > 10; SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a = 0 GROUP BY a HAVING a > 10;
SELECT FOUND_ROWS(); SELECT FOUND_ROWS();
DROP TABLE t1; DROP TABLE t1;
#
# Bug #7945: group by + distinct with constant expression + limit
#
CREATE TABLE t1 (a int, b int);
INSERT INTO t1 VALUES (1,2), (1,3), (1,4), (1,5);
SELECT SQL_CALC_FOUND_ROWS DISTINCT 'a' FROM t1 GROUP BY b LIMIT 2;
SELECT FOUND_ROWS();

View file

@ -2444,6 +2444,41 @@ static int flush_all_key_blocks(KEY_CACHE *keycache)
} }
/*
Reset the counters of a key cache.
SYNOPSIS
reset_key_cache_counters()
name the name of a key cache
key_cache pointer to the key kache to be reset
DESCRIPTION
This procedure is used by process_key_caches() to reset the counters of all
currently used key caches, both the default one and the named ones.
RETURN
0 on success (always because it can't fail)
*/
int reset_key_cache_counters(const char *name, KEY_CACHE *key_cache)
{
DBUG_ENTER("reset_key_cache_counters");
if (!key_cache->key_cache_inited)
{
DBUG_PRINT("info", ("Key cache %s not initialized.", name));
DBUG_RETURN(0);
}
DBUG_PRINT("info", ("Resetting counters for key cache %s.", name));
key_cache->global_blocks_changed= 0; /* Key_blocks_not_flushed */
key_cache->global_cache_r_requests= 0; /* Key_read_requests */
key_cache->global_cache_read= 0; /* Key_reads */
key_cache->global_cache_w_requests= 0; /* Key_write_requests */
key_cache->global_cache_write= 0; /* Key_writes */
DBUG_RETURN(0);
}
#ifndef DBUG_OFF #ifndef DBUG_OFF
/* /*
Test if disk-cache is ok Test if disk-cache is ok

View file

@ -300,13 +300,6 @@ NdbRecAttr::arraySize() const
return theArraySize; return theArraySize;
} }
inline
Int64
NdbRecAttr::int64_value() const
{
return *(Int64*)theRef;
}
inline inline
Int32 Int32
NdbRecAttr::int32_value() const NdbRecAttr::int32_value() const
@ -328,13 +321,6 @@ NdbRecAttr::char_value() const
return *(char*)theRef; return *(char*)theRef;
} }
inline
Uint64
NdbRecAttr::u_64_value() const
{
return *(Uint64*)theRef;
}
inline inline
Uint32 Uint32
NdbRecAttr::u_32_value() const NdbRecAttr::u_32_value() const
@ -356,20 +342,6 @@ NdbRecAttr::u_char_value() const
return *(Uint8*)theRef; return *(Uint8*)theRef;
} }
inline
float
NdbRecAttr::float_value() const
{
return *(float*)theRef;
}
inline
double
NdbRecAttr::double_value() const
{
return *(double*)theRef;
}
inline inline
void void
NdbRecAttr::release() NdbRecAttr::release()

View file

@ -245,3 +245,35 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r)
return out; return out;
} }
Int64
NdbRecAttr::int64_value() const
{
Int64 val;
memcpy(&val,theRef,8);
return val;
}
Uint64
NdbRecAttr::u_64_value() const
{
Uint64 val;
memcpy(&val,theRef,8);
return val;
}
float
NdbRecAttr::float_value() const
{
float val;
memcpy(&val,theRef,sizeof(val));
return val;
}
double
NdbRecAttr::double_value() const
{
double val;
memcpy(&val,theRef,sizeof(val));
return val;
}

View file

@ -31,11 +31,13 @@ waitClusterStatus(const char* _addr, ndb_mgm_node_status _status,
unsigned int _timeout); unsigned int _timeout);
enum ndb_waiter_options { enum ndb_waiter_options {
NDB_STD_OPTS_OPTIONS NDB_STD_OPTS_OPTIONS,
OPT_WAIT_STATUS_NOT_STARTED
}; };
NDB_STD_OPTS_VARS; NDB_STD_OPTS_VARS;
static int _no_contact = 0; static int _no_contact = 0;
static int _not_started = 0;
static int _timeout = 120; static int _timeout = 120;
static struct my_option my_long_options[] = static struct my_option my_long_options[] =
{ {
@ -43,6 +45,9 @@ static struct my_option my_long_options[] =
{ "no-contact", 'n', "Wait for cluster no contact", { "no-contact", 'n', "Wait for cluster no contact",
(gptr*) &_no_contact, (gptr*) &_no_contact, 0, (gptr*) &_no_contact, (gptr*) &_no_contact, 0,
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 }, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 },
{ "not-started", OPT_WAIT_STATUS_NOT_STARTED, "Wait for cluster not started",
(gptr*) &_not_started, (gptr*) &_not_started, 0,
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 },
{ "timeout", 't', "Timeout to wait", { "timeout", 't', "Timeout to wait",
(gptr*) &_timeout, (gptr*) &_timeout, 0, (gptr*) &_timeout, (gptr*) &_timeout, 0,
GET_INT, REQUIRED_ARG, 120, 0, 0, 0, 0, 0 }, GET_INT, REQUIRED_ARG, 120, 0, 0, 0, 0, 0 },
@ -91,12 +96,22 @@ int main(int argc, char** argv){
if (_hostName == 0) if (_hostName == 0)
_hostName= opt_connect_str; _hostName= opt_connect_str;
if (_no_contact) { enum ndb_mgm_node_status wait_status;
if (waitClusterStatus(_hostName, NDB_MGM_NODE_STATUS_NO_CONTACT, _timeout) != 0) if (_no_contact)
return NDBT_ProgramExit(NDBT_FAILED); {
} else if (waitClusterStatus(_hostName, NDB_MGM_NODE_STATUS_STARTED, _timeout) != 0) wait_status= NDB_MGM_NODE_STATUS_NO_CONTACT;
return NDBT_ProgramExit(NDBT_FAILED); }
else if (_not_started)
{
wait_status= NDB_MGM_NODE_STATUS_NOT_STARTED;
}
else
{
wait_status= NDB_MGM_NODE_STATUS_STARTED;
}
if (waitClusterStatus(_hostName, wait_status, _timeout) != 0)
return NDBT_ProgramExit(NDBT_FAILED);
return NDBT_ProgramExit(NDBT_OK); return NDBT_ProgramExit(NDBT_OK);
} }

View file

@ -938,7 +938,6 @@ extern SHOW_COMP_OPTION have_ndbcluster;
extern struct system_variables global_system_variables; extern struct system_variables global_system_variables;
extern struct system_variables max_system_variables; extern struct system_variables max_system_variables;
extern struct rand_struct sql_rand; extern struct rand_struct sql_rand;
extern KEY_CACHE *sql_key_cache;
extern const char *opt_date_time_formats[]; extern const char *opt_date_time_formats[];
extern KNOWN_DATE_TIME_FORMAT known_date_time_formats[]; extern KNOWN_DATE_TIME_FORMAT known_date_time_formats[];

View file

@ -383,7 +383,6 @@ struct system_variables max_system_variables;
MY_TMPDIR mysql_tmpdir_list; MY_TMPDIR mysql_tmpdir_list;
MY_BITMAP temp_pool; MY_BITMAP temp_pool;
KEY_CACHE *sql_key_cache;
CHARSET_INFO *system_charset_info, *files_charset_info ; CHARSET_INFO *system_charset_info, *files_charset_info ;
CHARSET_INFO *national_charset_info, *table_alias_charset; CHARSET_INFO *national_charset_info, *table_alias_charset;
@ -1846,14 +1845,14 @@ We will try our best to scrape up some info that will hopefully help diagnose\n\
the problem, but since we have already crashed, something is definitely wrong\n\ the problem, but since we have already crashed, something is definitely wrong\n\
and this may fail.\n\n"); and this may fail.\n\n");
fprintf(stderr, "key_buffer_size=%lu\n", fprintf(stderr, "key_buffer_size=%lu\n",
(ulong) sql_key_cache->key_cache_mem_size); (ulong) dflt_key_cache->key_cache_mem_size);
fprintf(stderr, "read_buffer_size=%ld\n", global_system_variables.read_buff_size); fprintf(stderr, "read_buffer_size=%ld\n", global_system_variables.read_buff_size);
fprintf(stderr, "max_used_connections=%ld\n", max_used_connections); fprintf(stderr, "max_used_connections=%ld\n", max_used_connections);
fprintf(stderr, "max_connections=%ld\n", max_connections); fprintf(stderr, "max_connections=%ld\n", max_connections);
fprintf(stderr, "threads_connected=%d\n", thread_count); fprintf(stderr, "threads_connected=%d\n", thread_count);
fprintf(stderr, "It is possible that mysqld could use up to \n\ fprintf(stderr, "It is possible that mysqld could use up to \n\
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_connections = %ld K\n\ key_buffer_size + (read_buffer_size + sort_buffer_size)*max_connections = %ld K\n\
bytes of memory\n", ((ulong) sql_key_cache->key_cache_mem_size + bytes of memory\n", ((ulong) dflt_key_cache->key_cache_mem_size +
(global_system_variables.read_buff_size + (global_system_variables.read_buff_size +
global_system_variables.sortbuff_size) * global_system_variables.sortbuff_size) *
max_connections)/ 1024); max_connections)/ 1024);
@ -2120,12 +2119,12 @@ extern "C" void *signal_hand(void *arg __attribute__((unused)))
case SIGHUP: case SIGHUP:
if (!abort_loop) if (!abort_loop)
{ {
mysql_print_status((THD*) 0); // Print some debug info
reload_acl_and_cache((THD*) 0, reload_acl_and_cache((THD*) 0,
(REFRESH_LOG | REFRESH_TABLES | REFRESH_FAST | (REFRESH_LOG | REFRESH_TABLES | REFRESH_FAST |
REFRESH_STATUS | REFRESH_GRANT | REFRESH_STATUS | REFRESH_GRANT |
REFRESH_THREADS | REFRESH_HOSTS), REFRESH_THREADS | REFRESH_HOSTS),
(TABLE_LIST*) 0, NULL); // Flush logs (TABLE_LIST*) 0, NULL); // Flush logs
mysql_print_status((THD*) 0); // Send debug some info
} }
break; break;
#ifdef USE_ONE_SIGNAL_HAND #ifdef USE_ONE_SIGNAL_HAND
@ -2699,8 +2698,6 @@ server.");
/* call ha_init_key_cache() on all key caches to init them */ /* call ha_init_key_cache() on all key caches to init them */
process_key_caches(&ha_init_key_cache); process_key_caches(&ha_init_key_cache);
/* We must set dflt_key_cache in case we are using ISAM tables */
dflt_key_cache= sql_key_cache;
#if defined(HAVE_MLOCKALL) && defined(MCL_CURRENT) && !defined(EMBEDDED_LIBRARY) #if defined(HAVE_MLOCKALL) && defined(MCL_CURRENT) && !defined(EMBEDDED_LIBRARY)
if (locked_in_memory && !getuid()) if (locked_in_memory && !getuid())
@ -5598,10 +5595,10 @@ static void mysql_init_variables(void)
threads.empty(); threads.empty();
thread_cache.empty(); thread_cache.empty();
key_caches.empty(); key_caches.empty();
multi_keycache_init(); if (!(dflt_key_cache= get_or_create_key_cache(default_key_cache_base.str,
if (!(sql_key_cache= get_or_create_key_cache(default_key_cache_base.str,
default_key_cache_base.length))) default_key_cache_base.length)))
exit(1); exit(1);
multi_keycache_init(); /* set key_cache_hash.default_value = dflt_key_cache */
/* Initialize structures that is used when processing options */ /* Initialize structures that is used when processing options */
replicate_rewrite_db.empty(); replicate_rewrite_db.empty();

View file

@ -2174,7 +2174,7 @@ bool sys_var_key_buffer_size::update(THD *thd, set_var *var)
if (!tmp) // Zero size means delete if (!tmp) // Zero size means delete
{ {
if (key_cache == sql_key_cache) if (key_cache == dflt_key_cache)
goto end; // Ignore default key cache goto end; // Ignore default key cache
if (key_cache->key_cache_inited) // If initied if (key_cache->key_cache_inited) // If initied
@ -2188,7 +2188,7 @@ bool sys_var_key_buffer_size::update(THD *thd, set_var *var)
base_name->length, &list); base_name->length, &list);
key_cache->in_init= 1; key_cache->in_init= 1;
pthread_mutex_unlock(&LOCK_global_system_variables); pthread_mutex_unlock(&LOCK_global_system_variables);
error= reassign_keycache_tables(thd, key_cache, sql_key_cache); error= reassign_keycache_tables(thd, key_cache, dflt_key_cache);
pthread_mutex_lock(&LOCK_global_system_variables); pthread_mutex_lock(&LOCK_global_system_variables);
key_cache->in_init= 0; key_cache->in_init= 0;
} }

View file

@ -4946,6 +4946,7 @@ void kill_one_thread(THD *thd, ulong id)
net_printf(thd,error,id); net_printf(thd,error,id);
} }
/* Clear most status variables */ /* Clear most status variables */
static void refresh_status(void) static void refresh_status(void)
@ -4955,18 +4956,9 @@ static void refresh_status(void)
{ {
if (ptr->type == SHOW_LONG) if (ptr->type == SHOW_LONG)
*(ulong*) ptr->value= 0; *(ulong*) ptr->value= 0;
else if (ptr->type == SHOW_KEY_CACHE_LONG)
{
/*
Reset value in 'default' key cache.
This needs to be recoded when we have thread specific key values
*/
char *value= (((char*) sql_key_cache) +
(uint) ((char*) (ptr->value) -
(char*) &dflt_key_cache_var));
*(ulong*) value= 0;
}
} }
/* Reset the counters of all key caches (default and named). */
process_key_caches(reset_key_cache_counters);
pthread_mutex_unlock(&LOCK_status); pthread_mutex_unlock(&LOCK_status);
} }

View file

@ -2844,9 +2844,15 @@ find_best(JOIN *join,table_map rest_tables,uint idx,double record_count,
x = used key parts (1 <= x <= c) x = used key parts (1 <= x <= c)
*/ */
double rec_per_key; double rec_per_key;
#if 0
if (!(rec_per_key=(double) if (!(rec_per_key=(double)
keyinfo->rec_per_key[keyinfo->key_parts-1])) keyinfo->rec_per_key[keyinfo->key_parts-1]))
rec_per_key=(double) s->records/rec+1; rec_per_key=(double) s->records/rec+1;
#else
rec_per_key= keyinfo->rec_per_key[keyinfo->key_parts-1] ?
(double) keyinfo->rec_per_key[keyinfo->key_parts-1] :
(double) s->records/rec+1;
#endif
if (!s->records) if (!s->records)
tmp=0; tmp=0;
@ -7496,13 +7502,14 @@ remove_duplicates(JOIN *join, TABLE *entry,List<Item> &fields, Item *having)
field_count++; field_count++;
} }
if (!field_count) if (!field_count && !(join->select_options & OPTION_FOUND_ROWS))
{ // only const items { // only const items with no OPTION_FOUND_ROWS
join->unit->select_limit_cnt= 1; // Only send first row join->unit->select_limit_cnt= 1; // Only send first row
DBUG_RETURN(0); DBUG_RETURN(0);
} }
Field **first_field=entry->field+entry->fields - field_count; Field **first_field=entry->field+entry->fields - field_count;
offset=entry->field[entry->fields - field_count]->offset(); offset= field_count ?
entry->field[entry->fields - field_count]->offset() : 0;
reclength=entry->reclength-offset; reclength=entry->reclength-offset;
free_io_cache(entry); // Safety free_io_cache(entry); // Safety

View file

@ -1025,7 +1025,8 @@ mysqld_show_keys(THD *thd, TABLE_LIST *table_list)
/* Check if we have a key part that only uses part of the field */ /* Check if we have a key part that only uses part of the field */
if (!(key_info->flags & HA_FULLTEXT) && (!key_part->field || if (!(key_info->flags & HA_FULLTEXT) && (!key_part->field ||
key_part->length != table->field[key_part->fieldnr-1]->key_length())) key_part->length != table->field[key_part->fieldnr-1]->key_length()))
protocol->store_tiny((longlong) key_part->length); protocol->store_tiny((longlong) key_part->length /
key_part->field->charset()->mbmaxlen);
else else
protocol->store_null(); protocol->store_null();
protocol->store_null(); // No pack_information yet protocol->store_null(); // No pack_information yet
@ -2066,7 +2067,7 @@ int mysqld_show(THD *thd, const char *wild, show_var_st *variables,
#endif /* HAVE_OPENSSL */ #endif /* HAVE_OPENSSL */
case SHOW_KEY_CACHE_LONG: case SHOW_KEY_CACHE_LONG:
case SHOW_KEY_CACHE_CONST_LONG: case SHOW_KEY_CACHE_CONST_LONG:
value= (value-(char*) &dflt_key_cache_var)+ (char*) sql_key_cache; value= (value-(char*) &dflt_key_cache_var)+ (char*) dflt_key_cache;
end= int10_to_str(*(long*) value, buff, 10); end= int10_to_str(*(long*) value, buff, 10);
break; break;
case SHOW_UNDEF: // Show never happen case SHOW_UNDEF: // Show never happen