summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoringo@mysql.com <>2005-01-24 10:48:52 +0100
committeringo@mysql.com <>2005-01-24 10:48:52 +0100
commitc4a0eb142b36ccb492309c7ee2ebb143a1571f7f (patch)
tree4a89fa584fd149ed4a310e3398a8cea3f47258db
parent12879fc30d4d3e9fd664c832ee618a2a15b58c9b (diff)
parent0a59f6aad012a1fd95fca7f7bc007ce0e1a83b62 (diff)
downloadmariadb-git-c4a0eb142b36ccb492309c7ee2ebb143a1571f7f.tar.gz
Merge mysql.com:/home/mydev/mysql-5.0
into mysql.com:/home/mydev/mysql-5.0-5000
-rw-r--r--include/keycache.h5
-rw-r--r--innobase/dict/dict0crea.c11
-rw-r--r--innobase/dict/dict0dict.c8
-rw-r--r--innobase/dict/dict0load.c17
-rw-r--r--innobase/fil/fil0fil.c79
-rw-r--r--innobase/log/log0recv.c8
-rw-r--r--innobase/os/os0thread.c2
-rw-r--r--mysql-test/mysql-test-run.sh5
-rw-r--r--mysql-test/ndb/ndbcluster.sh10
-rw-r--r--mysql-test/r/select_found.result8
-rw-r--r--mysql-test/t/select_found.test9
-rw-r--r--mysys/mf_keycache.c35
-rw-r--r--ndb/include/ndbapi/NdbRecAttr.hpp28
-rw-r--r--ndb/src/ndbapi/NdbRecAttr.cpp32
-rw-r--r--ndb/test/ndbapi/flexAsynch.cpp1
-rw-r--r--ndb/test/ndbapi/flexBench.cpp1
-rw-r--r--ndb/test/ndbapi/flexHammer.cpp1
-rw-r--r--ndb/test/ndbapi/slow_select.cpp1
-rw-r--r--ndb/test/src/HugoCalculator.cpp1
-rw-r--r--sql/mysql_priv.h1
-rw-r--r--sql/mysqld.cc13
-rw-r--r--sql/set_var.cc4
-rw-r--r--sql/sql_parse.cc14
-rw-r--r--sql/sql_select.cc13
-rw-r--r--sql/sql_show.cc2
25 files changed, 217 insertions, 92 deletions
diff --git a/include/keycache.h b/include/keycache.h
index 26ee0ccadb1..a292a69b0a3 100644
--- a/include/keycache.h
+++ b/include/keycache.h
@@ -88,12 +88,13 @@ typedef struct st_key_cache
ulong param_division_limit; /* min. percentage of warm blocks */
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_cache_w_requests;/* number of write requests (write hits) */
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_read; /* number of reads from files to the cache */
+
int blocks; /* max number of blocks in the cache */
my_bool in_init; /* Set to 1 in MySQL during init/resize */
} KEY_CACHE;
@@ -132,5 +133,7 @@ extern my_bool multi_key_cache_set(const byte *key, uint length,
KEY_CACHE *key_cache);
extern void multi_key_cache_change(KEY_CACHE *old_data,
KEY_CACHE *new_data);
+extern int reset_key_cache_counters(const char *name,
+ KEY_CACHE *key_cache);
C_MODE_END
#endif /* _keycache_h */
diff --git a/innobase/dict/dict0crea.c b/innobase/dict/dict0crea.c
index 3c496bae5b4..b6f79ad10b4 100644
--- a/innobase/dict/dict0crea.c
+++ b/innobase/dict/dict0crea.c
@@ -81,6 +81,17 @@ dict_create_sys_tables_tuple(
dfield_set_data(dfield, ptr, 8);
/* 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);
ptr = mem_heap_alloc(heap, 4);
diff --git a/innobase/dict/dict0dict.c b/innobase/dict/dict0dict.c
index 12749f7704f..800d7dcd9e9 100644
--- a/innobase/dict/dict0dict.c
+++ b/innobase/dict/dict0dict.c
@@ -2920,9 +2920,9 @@ loop:
constraint_name = NULL;
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
- the id of the constraint to system tables. */
+ of the constraint to system tables. */
ptr = ptr1;
ptr = dict_accept(ptr, "CONSTRAINT", &success);
@@ -2959,6 +2959,10 @@ loop:
ptr = dict_accept(ptr, "FOREIGN", &success);
+ if (!success) {
+ goto loop;
+ }
+
if (!isspace(*ptr)) {
goto loop;
}
diff --git a/innobase/dict/dict0load.c b/innobase/dict/dict0load.c
index 18910acb01d..17b53a7a140 100644
--- a/innobase/dict/dict0load.c
+++ b/innobase/dict/dict0load.c
@@ -728,6 +728,7 @@ dict_load_table(
ulint space;
ulint n_cols;
ulint err;
+ ulint mix_len;
mtr_t mtr;
#ifdef UNIV_SYNC_DEBUG
@@ -775,6 +776,22 @@ dict_load_table(
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_old(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 < 50003
/* Starting from MySQL 5.0.3, the high-order bit of MIX_LEN is the
"compact format" flag. */
diff --git a/innobase/fil/fil0fil.c b/innobase/fil/fil0fil.c
index f2d0790892e..9b2f7ffe575 100644
--- a/innobase/fil/fil0fil.c
+++ b/innobase/fil/fil0fil.c
@@ -480,28 +480,33 @@ fil_node_open_file(
ut_a(node->n_pending == 0);
ut_a(node->open == FALSE);
- /* printf("Opening file %s\n", node->name); */
+ 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);
- 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;
+ ut_print_timestamp(stderr);
- system->n_open++;
+ 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);
+ }
- if (node->size == 0) {
ut_a(space->purpose != FIL_LOG);
+ ut_a(space->id != 0);
os_file_get_size(node->handle, &size_low, &size_high);
@@ -511,15 +516,10 @@ fil_node_open_file(
node->size = (ulint) (size_bytes / UNIV_PAGE_SIZE);
#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) {
fprintf(stderr,
"InnoDB: Error: the size of single-table tablespace file %s\n"
-"InnoDB: is only %lu %lu, should be at least %lu!", node->name,
+"InnoDB: is only %lu %lu, should be at least %lu!\n", node->name,
(ulong) size_high,
(ulong) size_low, (ulong) (4 * UNIV_PAGE_SIZE));
@@ -539,6 +539,10 @@ fil_node_open_file(
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) {
fprintf(stderr,
"InnoDB: Error: tablespace id %lu in file %s is not sensible\n",
@@ -566,6 +570,30 @@ fil_node_open_file(
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) {
/* Put the node to the LRU list */
UT_LIST_ADD_FIRST(LRU, system->LRU, node);
@@ -4129,7 +4157,8 @@ fil_flush_file_spaces(
space = UT_LIST_GET_FIRST(system->space_list);
while (space) {
- if (space->purpose == purpose) {
+ if (space->purpose == purpose && !space->is_being_deleted) {
+
space->n_pending_flushes++; /* prevent dropping of the
space while we are
flushing */
diff --git a/innobase/log/log0recv.c b/innobase/log/log0recv.c
index 35dc9a06020..40a7deee604 100644
--- a/innobase/log/log0recv.c
+++ b/innobase/log/log0recv.c
@@ -2897,11 +2897,6 @@ recv_recovery_from_checkpoint_finish(void)
int i;
os_thread_id_t recovery_thread_id;
- /* Rollback the uncommitted transactions which have no user session */
-
- fprintf(stderr,
- "InnoDB: Starting to apply log records to the database...\n");
-
/* Apply the hashed log records to the respective file pages */
if (srv_force_recovery < SRV_FORCE_NO_LOG_REDO) {
@@ -2938,6 +2933,9 @@ recv_recovery_from_checkpoint_finish(void)
recv_sys_free();
#endif
if (srv_force_recovery < SRV_FORCE_NO_TRX_UNDO) {
+ /* Rollback the uncommitted transactions which have no user
+ session */
+
os_thread_create(trx_rollback_or_clean_all_without_sess,
(void *)&i, &recovery_thread_id);
}
diff --git a/innobase/os/os0thread.c b/innobase/os/os0thread.c
index 12a8abf3069..91061bc8459 100644
--- a/innobase/os/os0thread.c
+++ b/innobase/os/os0thread.c
@@ -88,7 +88,7 @@ os_thread_create(
/*=============*/
/* out: handle to the thread */
#ifndef __WIN__
- os_posix_f_t start_f,
+ os_posix_f_t start_f,
#else
ulint (*start_f)(void*), /* in: pointer to function
from which to start */
diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh
index 037fdb28199..953b560fe09 100644
--- a/mysql-test/mysql-test-run.sh
+++ b/mysql-test/mysql-test-run.sh
@@ -241,6 +241,7 @@ USE_EMBEDDED_SERVER=""
RESULT_EXT=""
TEST_MODE="default"
+NDB_MGM_EXTRA_OPTS=
NDB_MGMD_EXTRA_OPTS=
NDBD_EXTRA_OPTS=
@@ -264,6 +265,8 @@ while test $# -gt 0; do
--ndb-connectstring=*)
USE_NDBCLUSTER="--ndbcluster" ;
USE_RUNNING_NDBCLUSTER=`$ECHO "$1" | $SED -e "s;--ndb-connectstring=;;"` ;;
+ --ndb_mgm-extra-opts=*)
+ NDB_MGM_EXTRA_OPTS=`$ECHO "$1" | $SED -e "s;--ndb_mgm-extra-opts=;;"` ;;
--ndb_mgmd-extra-opts=*)
NDB_MGMD_EXTRA_OPTS=`$ECHO "$1" | $SED -e "s;--ndb_mgmd-extra-opts=;;"` ;;
--ndbd-extra-opts=*)
@@ -470,7 +473,7 @@ SMALL_SERVER="--key_buffer_size=1M --sort_buffer=256K --max_heap_table_size=1M"
export MASTER_MYPORT MASTER_MYPORT1 SLAVE_MYPORT MYSQL_TCP_PORT MASTER_MYSOCK MASTER_MYSOCK1
NDBCLUSTER_BASE_PORT=`expr $NDBCLUSTER_PORT + 2`
-NDBCLUSTER_OPTS="--port=$NDBCLUSTER_PORT --port-base=$NDBCLUSTER_BASE_PORT --data-dir=$MYSQL_TEST_DIR/var --ndb_mgmd-extra-opts=\"$NDB_MGMD_EXTRA_OPTS\" --ndbd-extra-opts=\"$NDBD_EXTRA_OPTS\""
+NDBCLUSTER_OPTS="--port=$NDBCLUSTER_PORT --port-base=$NDBCLUSTER_BASE_PORT --data-dir=$MYSQL_TEST_DIR/var --ndb_mgm-extra-opts=$NDB_MGM_EXTRA_OPTS --ndb_mgmd-extra-opts=$NDB_MGMD_EXTRA_OPTS --ndbd-extra-opts=$NDBD_EXTRA_OPTS"
if [ x$SOURCE_DIST = x1 ] ; then
MY_BASEDIR=$MYSQL_TEST_DIR
diff --git a/mysql-test/ndb/ndbcluster.sh b/mysql-test/ndb/ndbcluster.sh
index a86e482b2ab..16bb3a9b122 100644
--- a/mysql-test/ndb/ndbcluster.sh
+++ b/mysql-test/ndb/ndbcluster.sh
@@ -58,6 +58,7 @@ ndb_con_op=105000
ndb_dmem=80M
ndb_imem=24M
+NDB_MGM_EXTRA_OPTS=
NDB_MGMD_EXTRA_OPTS=
NDBD_EXTRA_OPTS=
@@ -97,6 +98,9 @@ while test $# -gt 0; do
--port-base=*)
port_base=`echo "$1" | sed -e "s;--port-base=;;"`
;;
+ --ndb_mgm-extra-opts=*)
+ NDB_MGM_EXTRA_OPTS=`echo "$1" | sed -e "s;--ndb_mgm-extra-opts=;;"`
+ ;;
--ndb_mgmd-extra-opts=*)
NDB_MGMD_EXTRA_OPTS=`echo "$1" | sed -e "s;--ndb_mgmd-extra-opts=;;"`
;;
@@ -130,7 +134,7 @@ if [ ! -x "$exec_waiter" ]; then
exit 1
fi
-exec_mgmtclient="$exec_mgmtclient --no-defaults"
+exec_mgmtclient="$exec_mgmtclient --no-defaults $NDB_MGM_EXTRA_OPTS"
exec_mgmtsrvr="$exec_mgmtsrvr --no-defaults $NDB_MGMD_EXTRA_OPTS"
exec_ndb="$exec_ndb --no-defaults $NDBD_EXTRA_OPTS"
exec_waiter="$exec_waiter --no-defaults"
@@ -178,8 +182,8 @@ fi
# Edit file system path and ports in config file
if [ $initial_ndb ] ; then
- rm -f $fs_ndb/ndb_*
-sed \
+ rm -f $fs_ndb/ndb_* 2>&1 | cat > /dev/null
+ sed \
-e s,"CHOOSE_MaxNoOfOrderedIndexes","$ndb_no_ord",g \
-e s,"CHOOSE_MaxNoOfConcurrentOperations","$ndb_con_op",g \
-e s,"CHOOSE_DataMemory","$ndb_dmem",g \
diff --git a/mysql-test/r/select_found.result b/mysql-test/r/select_found.result
index 5a2f26a7105..2520beb1d77 100644
--- a/mysql-test/r/select_found.result
+++ b/mysql-test/r/select_found.result
@@ -246,3 +246,11 @@ SELECT FOUND_ROWS();
FOUND_ROWS()
0
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
diff --git a/mysql-test/t/select_found.test b/mysql-test/t/select_found.test
index 943174462e3..d31d7d0b02e 100644
--- a/mysql-test/t/select_found.test
+++ b/mysql-test/t/select_found.test
@@ -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 FOUND_ROWS();
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();
diff --git a/mysys/mf_keycache.c b/mysys/mf_keycache.c
index bf7ed7ab6b6..5c9d1434b0c 100644
--- a/mysys/mf_keycache.c
+++ b/mysys/mf_keycache.c
@@ -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
/*
Test if disk-cache is ok
diff --git a/ndb/include/ndbapi/NdbRecAttr.hpp b/ndb/include/ndbapi/NdbRecAttr.hpp
index 43883cc91f2..d1c29adef4f 100644
--- a/ndb/include/ndbapi/NdbRecAttr.hpp
+++ b/ndb/include/ndbapi/NdbRecAttr.hpp
@@ -309,13 +309,6 @@ NdbRecAttr::arraySize() const
}
inline
-Int64
-NdbRecAttr::int64_value() const
-{
- return *(Int64*)theRef;
-}
-
-inline
Int32
NdbRecAttr::int32_value() const
{
@@ -337,13 +330,6 @@ NdbRecAttr::char_value() const
}
inline
-Uint64
-NdbRecAttr::u_64_value() const
-{
- return *(Uint64*)theRef;
-}
-
-inline
Uint32
NdbRecAttr::u_32_value() const
{
@@ -365,20 +351,6 @@ NdbRecAttr::u_char_value() const
}
inline
-float
-NdbRecAttr::float_value() const
-{
- return *(float*)theRef;
-}
-
-inline
-double
-NdbRecAttr::double_value() const
-{
- return *(double*)theRef;
-}
-
-inline
void
NdbRecAttr::release()
{
diff --git a/ndb/src/ndbapi/NdbRecAttr.cpp b/ndb/src/ndbapi/NdbRecAttr.cpp
index 57f896e7e42..30ba5c112fa 100644
--- a/ndb/src/ndbapi/NdbRecAttr.cpp
+++ b/ndb/src/ndbapi/NdbRecAttr.cpp
@@ -281,3 +281,35 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r)
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;
+}
diff --git a/ndb/test/ndbapi/flexAsynch.cpp b/ndb/test/ndbapi/flexAsynch.cpp
index fc50cc99acf..d840993470c 100644
--- a/ndb/test/ndbapi/flexAsynch.cpp
+++ b/ndb/test/ndbapi/flexAsynch.cpp
@@ -16,6 +16,7 @@
+#include <ndb_global.h>
#include "NdbApi.hpp"
#include <NdbSchemaCon.hpp>
#include <NdbMain.h>
diff --git a/ndb/test/ndbapi/flexBench.cpp b/ndb/test/ndbapi/flexBench.cpp
index 71ceb468a63..728188ab28d 100644
--- a/ndb/test/ndbapi/flexBench.cpp
+++ b/ndb/test/ndbapi/flexBench.cpp
@@ -49,6 +49,7 @@ Arguments:
* *************************************************** */
+#include <ndb_global.h>
#include "NdbApi.hpp"
#include <NdbMain.h>
diff --git a/ndb/test/ndbapi/flexHammer.cpp b/ndb/test/ndbapi/flexHammer.cpp
index aa783d00d20..49629dac875 100644
--- a/ndb/test/ndbapi/flexHammer.cpp
+++ b/ndb/test/ndbapi/flexHammer.cpp
@@ -47,6 +47,7 @@ Revision history:
* *************************************************** */
+#include <ndb_global.h>
#include <NdbApi.hpp>
#include <NdbMain.h>
diff --git a/ndb/test/ndbapi/slow_select.cpp b/ndb/test/ndbapi/slow_select.cpp
index 3febae2c8eb..8d615fa5771 100644
--- a/ndb/test/ndbapi/slow_select.cpp
+++ b/ndb/test/ndbapi/slow_select.cpp
@@ -1,4 +1,5 @@
+#include <ndb_global.h>
#include <NdbApi.hpp>
#include <NdbOut.hpp>
#include <NdbTick.h>
diff --git a/ndb/test/src/HugoCalculator.cpp b/ndb/test/src/HugoCalculator.cpp
index 2fee787bbed..44edb34295a 100644
--- a/ndb/test/src/HugoCalculator.cpp
+++ b/ndb/test/src/HugoCalculator.cpp
@@ -14,6 +14,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+#include <ndb_global.h>
#include "HugoCalculator.hpp"
#include <NDBT.hpp>
#include <Base64.hpp>
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index 322b38abe13..5a222a1ce10 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -1064,7 +1064,6 @@ extern struct system_variables global_system_variables;
extern struct system_variables max_system_variables;
extern struct system_status_var global_status_var;
extern struct rand_struct sql_rand;
-extern KEY_CACHE *sql_key_cache;
extern const char *opt_date_time_formats[];
extern KNOWN_DATE_TIME_FORMAT known_date_time_formats[];
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 7a95981e1dc..0126a69b099 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -395,7 +395,6 @@ struct system_status_var global_status_var;
MY_TMPDIR mysql_tmpdir_list;
MY_BITMAP temp_pool;
-KEY_CACHE *sql_key_cache;
CHARSET_INFO *system_charset_info, *files_charset_info ;
CHARSET_INFO *national_charset_info, *table_alias_charset;
@@ -1867,14 +1866,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\
and this may fail.\n\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, "max_used_connections=%ld\n", max_used_connections);
fprintf(stderr, "max_connections=%ld\n", max_connections);
fprintf(stderr, "threads_connected=%d\n", thread_count);
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\
-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.sortbuff_size) *
max_connections)/ 1024);
@@ -2141,12 +2140,12 @@ extern "C" void *signal_hand(void *arg __attribute__((unused)))
case SIGHUP:
if (!abort_loop)
{
+ mysql_print_status((THD*) 0); // Print some debug info
reload_acl_and_cache((THD*) 0,
(REFRESH_LOG | REFRESH_TABLES | REFRESH_FAST |
REFRESH_GRANT |
REFRESH_THREADS | REFRESH_HOSTS),
(TABLE_LIST*) 0, NULL); // Flush logs
- mysql_print_status((THD*) 0); // Send debug some info
}
break;
#ifdef USE_ONE_SIGNAL_HAND
@@ -2820,8 +2819,6 @@ server.");
/* call ha_init_key_cache() on all key caches to init them */
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 (locked_in_memory && !getuid())
@@ -5875,10 +5872,10 @@ static void mysql_init_variables(void)
threads.empty();
thread_cache.empty();
key_caches.empty();
- multi_keycache_init();
- if (!(sql_key_cache= get_or_create_key_cache(default_key_cache_base.str,
+ if (!(dflt_key_cache= get_or_create_key_cache(default_key_cache_base.str,
default_key_cache_base.length)))
exit(1);
+ multi_keycache_init(); /* set key_cache_hash.default_value = dflt_key_cache */
/* Initialize structures that is used when processing options */
replicate_rewrite_db.empty();
diff --git a/sql/set_var.cc b/sql/set_var.cc
index bd4e496e082..6077d148ab3 100644
--- a/sql/set_var.cc
+++ b/sql/set_var.cc
@@ -2234,7 +2234,7 @@ bool sys_var_key_buffer_size::update(THD *thd, set_var *var)
if (!tmp) // Zero size means delete
{
- if (key_cache == sql_key_cache)
+ if (key_cache == dflt_key_cache)
goto end; // Ignore default key cache
if (key_cache->key_cache_inited) // If initied
@@ -2248,7 +2248,7 @@ bool sys_var_key_buffer_size::update(THD *thd, set_var *var)
base_name->length, &list);
key_cache->in_init= 1;
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);
key_cache->in_init= 0;
}
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index b7a75a0bdd6..9f912ff37c5 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -5867,6 +5867,7 @@ void kill_one_thread(THD *thd, ulong id, bool only_kill_query)
my_error(error, MYF(0), id);
}
+
/* Clear most status variables */
static void refresh_status(void)
@@ -5876,17 +5877,6 @@ static void refresh_status(void)
{
if (ptr->type == SHOW_LONG)
*(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;
- }
else if (ptr->type == SHOW_LONG_STATUS)
{
THD *thd= current_thd;
@@ -5895,6 +5885,8 @@ static void refresh_status(void)
bzero((char*) &thd->status_var, sizeof(thd->status_var));
}
}
+ /* Reset the counters of all key caches (default and named). */
+ process_key_caches(reset_key_cache_counters);
pthread_mutex_unlock(&LOCK_status);
}
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 0fc4616749c..801b9d5d021 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -4474,9 +4474,15 @@ find_best(JOIN *join,table_map rest_tables,uint idx,double record_count,
x = used key parts (1 <= x <= c)
*/
double rec_per_key;
+#if 0
if (!(rec_per_key=(double)
keyinfo->rec_per_key[keyinfo->key_parts-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)
tmp=0;
@@ -10766,13 +10772,14 @@ remove_duplicates(JOIN *join, TABLE *entry,List<Item> &fields, Item *having)
field_count++;
}
- if (!field_count)
- { // only const items
+ if (!field_count && !(join->select_options & OPTION_FOUND_ROWS))
+ { // only const items with no OPTION_FOUND_ROWS
join->unit->select_limit_cnt= 1; // Only send first row
DBUG_RETURN(0);
}
Field **first_field=entry->field+entry->s->fields - field_count;
- offset=entry->field[entry->s->fields - field_count]->offset();
+ offset= field_count ?
+ entry->field[entry->s->fields - field_count]->offset() : 0;
reclength=entry->s->reclength-offset;
free_io_cache(entry); // Safety
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index f3a9f92274d..b909e9cec1b 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -1512,7 +1512,7 @@ static bool show_status_array(THD *thd, const char *wild,
#endif /* HAVE_OPENSSL */
case SHOW_KEY_CACHE_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);
break;
case SHOW_UNDEF: // Show never happen