mirror of
https://github.com/MariaDB/server.git
synced 2026-04-21 07:45:32 +02:00
Merge work.mysql.com:/home/bk/mysql into white.box:/home/tim/my/3
BitKeeper/etc/logging_ok: Logging to logging@openlogging.org accepted
This commit is contained in:
commit
a94cf89609
87 changed files with 2949 additions and 2599 deletions
|
|
@ -9,3 +9,4 @@ paul@teton.kitebird.com
|
|||
sasha@mysql.sashanet.com
|
||||
serg@serg.mysql.com
|
||||
tim@threads.polyesthetic.msg
|
||||
tim@white.box
|
||||
|
|
|
|||
2599
Docs/manual.texi
2599
Docs/manual.texi
File diff suppressed because it is too large
Load diff
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
/* By Jani Tolonen, 2001-04-20, MySQL Development Team */
|
||||
|
||||
#define CHECK_VERSION "1.01"
|
||||
#define CHECK_VERSION "1.02"
|
||||
|
||||
#include <global.h>
|
||||
#include <my_sys.h>
|
||||
|
|
@ -503,25 +503,24 @@ static int use_db(char *database)
|
|||
|
||||
static int handle_request_for_tables(char *tables, uint length)
|
||||
{
|
||||
char *query, *end, options[100];
|
||||
char *query, *end, options[100], message[100];
|
||||
const char *op = 0;
|
||||
|
||||
options[0] = 0;
|
||||
end = options;
|
||||
switch (what_to_do) {
|
||||
case DO_CHECK:
|
||||
op = "CHECK";
|
||||
end = options;
|
||||
if (opt_quick) end = strmov(end, "QUICK");
|
||||
if (opt_fast) end = strmov(end, "FAST");
|
||||
if (opt_medium_check) end = strmov(end, "MEDIUM"); /* Default */
|
||||
if (opt_extended) end = strmov(end, "EXTENDED");
|
||||
if (opt_check_only_changed) end = strmov(end, "CHANGED");
|
||||
if (opt_quick) end = strmov(end, " QUICK");
|
||||
if (opt_fast) end = strmov(end, " FAST");
|
||||
if (opt_medium_check) end = strmov(end, " MEDIUM"); /* Default */
|
||||
if (opt_extended) end = strmov(end, " EXTENDED");
|
||||
if (opt_check_only_changed) end = strmov(end, " CHANGED");
|
||||
break;
|
||||
case DO_REPAIR:
|
||||
op = "REPAIR";
|
||||
end = options;
|
||||
if (opt_quick) end = strmov(end, "QUICK");
|
||||
if (opt_extended) end = strmov(end, "EXTENDED");
|
||||
if (opt_quick) end = strmov(end, " QUICK");
|
||||
if (opt_extended) end = strmov(end, " EXTENDED");
|
||||
break;
|
||||
case DO_ANALYZE:
|
||||
op = "ANALYZE";
|
||||
|
|
@ -533,11 +532,11 @@ static int handle_request_for_tables(char *tables, uint length)
|
|||
|
||||
if (!(query =(char *) my_malloc((sizeof(char)*(length+110)), MYF(MY_WME))))
|
||||
return 1;
|
||||
sprintf(query, "%s TABLE %s %s", op, options, tables);
|
||||
sprintf(query, "%s TABLE %s %s", op, tables, options);
|
||||
if (mysql_query(sock, query))
|
||||
{
|
||||
sprintf(options, "when executing '%s TABLE'", op);
|
||||
DBerror(sock, options);
|
||||
sprintf(message, "when executing '%s TABLE ... %s", op, options);
|
||||
DBerror(sock, message);
|
||||
return 1;
|
||||
}
|
||||
print_result();
|
||||
|
|
@ -551,23 +550,34 @@ static void print_result()
|
|||
MYSQL_RES *res;
|
||||
MYSQL_ROW row;
|
||||
char prev[NAME_LEN*2+2];
|
||||
int i;
|
||||
uint i;
|
||||
my_bool found_error=0;
|
||||
|
||||
res = mysql_use_result(sock);
|
||||
prev[0] = '\0';
|
||||
for (i = 0; (row = mysql_fetch_row(res)); i++)
|
||||
{
|
||||
int changed = strcmp(prev, row[0]);
|
||||
int status = !strcmp(row[2], "status");
|
||||
if (opt_silent && status)
|
||||
continue;
|
||||
my_bool status = !strcmp(row[2], "status");
|
||||
|
||||
if (status)
|
||||
{
|
||||
if (found_error)
|
||||
{
|
||||
if (what_to_do != DO_REPAIR && opt_auto_repair &&
|
||||
(!opt_fast || strcmp(row[3],"OK")))
|
||||
insert_dynamic(&tables4repair, row[0]);
|
||||
}
|
||||
found_error=0;
|
||||
if (opt_silent)
|
||||
continue;
|
||||
}
|
||||
if (status && changed)
|
||||
printf("%-50s %s", row[0], row[3]);
|
||||
else if (!status && changed)
|
||||
{
|
||||
printf("%s\n%-9s: %s", row[0], row[2], row[3]);
|
||||
if (what_to_do != DO_REPAIR && opt_auto_repair)
|
||||
insert_dynamic(&tables4repair, row[0]);
|
||||
found_error=1;
|
||||
}
|
||||
else
|
||||
printf("%-9s: %s", row[2], row[3]);
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ dnl Process this file with autoconf to produce a configure script.
|
|||
AC_INIT(sql/mysqld.cc)
|
||||
AC_CANONICAL_SYSTEM
|
||||
# The Docs Makefile.am parses this line!
|
||||
AM_INIT_AUTOMAKE(mysql, 3.23.39a)
|
||||
AM_INIT_AUTOMAKE(mysql, 3.23.39)
|
||||
AM_CONFIG_HEADER(config.h)
|
||||
|
||||
PROTOCOL_VERSION=10
|
||||
|
|
|
|||
|
|
@ -208,4 +208,6 @@
|
|||
#define ER_LOCK_WAIT_TIMEOUT 1205
|
||||
#define ER_LOCK_TABLE_FULL 1206
|
||||
#define ER_READ_ONLY_TRANSACTION 1207
|
||||
#define ER_ERROR_MESSAGES 208
|
||||
#define ER_DROP_DB_WITH_READ_LOCK 1208
|
||||
#define ER_CREATE_DB_WITH_READ_LOCK 1209
|
||||
#define ER_ERROR_MESSAGES 210
|
||||
|
|
|
|||
|
|
@ -246,6 +246,12 @@ btr_pcur_restore_position(
|
|||
&& btr_pcur_is_on_user_rec(cursor, mtr)
|
||||
&& (0 == cmp_dtuple_rec(tuple, btr_pcur_get_rec(cursor)))) {
|
||||
|
||||
/* We have to store the NEW value for the modify clock, since
|
||||
the cursor can now be on a different page! */
|
||||
|
||||
cursor->modify_clock = buf_frame_get_modify_clock(
|
||||
buf_frame_align(
|
||||
btr_pcur_get_rec(cursor)));
|
||||
mem_heap_free(heap);
|
||||
|
||||
return(TRUE);
|
||||
|
|
|
|||
|
|
@ -241,6 +241,8 @@ buf_block_init(
|
|||
|
||||
block->modify_clock = ut_dulint_zero;
|
||||
|
||||
block->file_page_was_freed = FALSE;
|
||||
|
||||
rw_lock_create(&(block->lock));
|
||||
ut_ad(rw_lock_validate(&(block->lock)));
|
||||
|
||||
|
|
@ -542,6 +544,64 @@ buf_page_peek(
|
|||
return(FALSE);
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
Sets file_page_was_freed TRUE if the page is found in the buffer pool.
|
||||
This function should be called when we free a file page and want the
|
||||
debug version to check that it is not accessed any more unless
|
||||
reallocated. */
|
||||
|
||||
buf_block_t*
|
||||
buf_page_set_file_page_was_freed(
|
||||
/*=============================*/
|
||||
/* out: control block if found from page hash table,
|
||||
otherwise NULL */
|
||||
ulint space, /* in: space id */
|
||||
ulint offset) /* in: page number */
|
||||
{
|
||||
buf_block_t* block;
|
||||
|
||||
mutex_enter_fast(&(buf_pool->mutex));
|
||||
|
||||
block = buf_page_hash_get(space, offset);
|
||||
|
||||
if (block) {
|
||||
block->file_page_was_freed = TRUE;
|
||||
}
|
||||
|
||||
mutex_exit(&(buf_pool->mutex));
|
||||
|
||||
return(block);
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
Sets file_page_was_freed FALSE if the page is found in the buffer pool.
|
||||
This function should be called when we free a file page and want the
|
||||
debug version to check that it is not accessed any more unless
|
||||
reallocated. */
|
||||
|
||||
buf_block_t*
|
||||
buf_page_reset_file_page_was_freed(
|
||||
/*===============================*/
|
||||
/* out: control block if found from page hash table,
|
||||
otherwise NULL */
|
||||
ulint space, /* in: space id */
|
||||
ulint offset) /* in: page number */
|
||||
{
|
||||
buf_block_t* block;
|
||||
|
||||
mutex_enter_fast(&(buf_pool->mutex));
|
||||
|
||||
block = buf_page_hash_get(space, offset);
|
||||
|
||||
if (block) {
|
||||
block->file_page_was_freed = FALSE;
|
||||
}
|
||||
|
||||
mutex_exit(&(buf_pool->mutex));
|
||||
|
||||
return(block);
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
This is the general function used to get access to a database page. */
|
||||
|
||||
|
|
@ -646,6 +706,9 @@ loop:
|
|||
|
||||
block->accessed = TRUE;
|
||||
|
||||
#ifdef UNIV_DEBUG_FILE_ACCESSES
|
||||
ut_a(block->file_page_was_freed == FALSE);
|
||||
#endif
|
||||
mutex_exit(&(buf_pool->mutex));
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
|
|
@ -842,6 +905,9 @@ buf_page_optimistic_get_func(
|
|||
ut_ad(block->buf_fix_count > 0);
|
||||
ut_ad(block->state == BUF_BLOCK_FILE_PAGE);
|
||||
|
||||
#ifdef UNIV_DEBUG_FILE_ACCESSES
|
||||
ut_a(block->file_page_was_freed == FALSE);
|
||||
#endif
|
||||
if (!accessed) {
|
||||
/* In the case of a first access, try to apply linear
|
||||
read-ahead */
|
||||
|
|
@ -949,6 +1015,9 @@ buf_page_get_known_nowait(
|
|||
#endif
|
||||
ut_ad(block->buf_fix_count > 0);
|
||||
ut_ad(block->state == BUF_BLOCK_FILE_PAGE);
|
||||
#ifdef UNIV_DEBUG_FILE_ACCESSES
|
||||
ut_a(block->file_page_was_freed == FALSE);
|
||||
#endif
|
||||
|
||||
#ifdef UNIV_IBUF_DEBUG
|
||||
ut_a((mode == BUF_KEEP_OLD)
|
||||
|
|
@ -996,6 +1065,8 @@ buf_page_init(
|
|||
|
||||
block->n_hash_helps = 0;
|
||||
block->is_hashed = FALSE;
|
||||
|
||||
block->file_page_was_freed = FALSE;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
|
|
@ -1126,6 +1197,8 @@ buf_page_create(
|
|||
#ifdef UNIV_IBUF_DEBUG
|
||||
ut_a(ibuf_count_get(block->space, block->offset) == 0);
|
||||
#endif
|
||||
block->file_page_was_freed = FALSE;
|
||||
|
||||
/* Page can be found in buf_pool */
|
||||
mutex_exit(&(buf_pool->mutex));
|
||||
|
||||
|
|
|
|||
|
|
@ -182,8 +182,8 @@ buf_flush_write_complete(
|
|||
buf_pool->LRU_flush_ended++;
|
||||
}
|
||||
|
||||
/* printf("n pending flush %lu\n",
|
||||
buf_pool->n_flush[block->flush_type]); */
|
||||
/* printf("n pending flush %lu\n",
|
||||
buf_pool->n_flush[block->flush_type]); */
|
||||
|
||||
if ((buf_pool->n_flush[block->flush_type] == 0)
|
||||
&& (buf_pool->init_flush[block->flush_type] == FALSE)) {
|
||||
|
|
@ -421,6 +421,8 @@ buf_flush_try_neighbors(
|
|||
/* In simulated aio we wake up the i/o-handler threads now that
|
||||
we have posted a batch of writes: */
|
||||
|
||||
/* printf("Flush count %lu ; Waking i/o handlers\n", count); */
|
||||
|
||||
os_aio_simulated_wake_handler_threads();
|
||||
|
||||
return(count);
|
||||
|
|
|
|||
|
|
@ -260,9 +260,9 @@ loop:
|
|||
*/
|
||||
if (n_iterations > 30) {
|
||||
fprintf(stderr,
|
||||
"Innobase: Warning: difficult to find free blocks from\n"
|
||||
"Innobase: the buffer pool! Consider increasing the\n"
|
||||
"Innobase: buffer pool size.\n");
|
||||
"InnoDB: Warning: difficult to find free blocks from\n"
|
||||
"InnoDB: the buffer pool (%lu search iterations)! Consider\n"
|
||||
"InnoDB: increasing the buffer pool size.\n", n_iterations);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ Created 11/5/1995 Heikki Tuuri
|
|||
#include "log0recv.h"
|
||||
#include "trx0sys.h"
|
||||
#include "os0file.h"
|
||||
#include "srv0start.h"
|
||||
|
||||
/* The size in blocks of the area where the random read-ahead algorithm counts
|
||||
the accessed pages when deciding whether to read-ahead */
|
||||
|
|
@ -132,10 +133,16 @@ buf_read_ahead_random(
|
|||
ulint low, high;
|
||||
ulint i;
|
||||
|
||||
if (ibuf_bitmap_page(offset)) {
|
||||
if (srv_startup_is_before_trx_rollback_phase) {
|
||||
/* No read-ahead to avoid thread deadlocks */
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* If it is an ibuf bitmap page, we do no read-ahead, as
|
||||
that could break the ibuf page access order */
|
||||
if (ibuf_bitmap_page(offset) || trx_sys_hdr_page(space, offset)) {
|
||||
|
||||
/* If it is an ibuf bitmap page or trx sys hdr, we do
|
||||
no read-ahead, as that could break the ibuf page access
|
||||
order */
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
|
@ -301,9 +308,16 @@ buf_read_ahead_linear(
|
|||
ulint low, high;
|
||||
ulint i;
|
||||
|
||||
if (ibuf_bitmap_page(offset)) {
|
||||
/* If it is an ibuf bitmap page, we do no read-ahead, as
|
||||
that could break the ibuf page access order */
|
||||
if (srv_startup_is_before_trx_rollback_phase) {
|
||||
/* No read-ahead to avoid thread deadlocks */
|
||||
return(0);
|
||||
}
|
||||
|
||||
if (ibuf_bitmap_page(offset) || trx_sys_hdr_page(space, offset)) {
|
||||
|
||||
/* If it is an ibuf bitmap page or trx sys hdr, we do
|
||||
no read-ahead, as that could break the ibuf page access
|
||||
order */
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -313,6 +313,11 @@ dict_boot(void)
|
|||
|
||||
mtr_commit(&mtr);
|
||||
/*-------------------------*/
|
||||
|
||||
/* Initialize the insert buffer table and index for each tablespace */
|
||||
|
||||
ibuf_init_at_db_start();
|
||||
|
||||
/* Load definitions of other indexes on system tables */
|
||||
|
||||
dict_load_sys_table(dict_sys->sys_tables);
|
||||
|
|
@ -320,10 +325,6 @@ dict_boot(void)
|
|||
dict_load_sys_table(dict_sys->sys_indexes);
|
||||
dict_load_sys_table(dict_sys->sys_fields);
|
||||
|
||||
/* Initialize the insert buffer table and index for each tablespace */
|
||||
|
||||
ibuf_init_at_db_start();
|
||||
|
||||
mutex_exit(&(dict_sys->mutex));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -127,11 +127,9 @@ typedef byte fseg_inode_t;
|
|||
page number within space, FIL_NULL
|
||||
means that the slot is not in use */
|
||||
/*-------------------------------------*/
|
||||
#define FSEG_INODE_SIZE (16 + 3 * FLST_BASE_NODE_SIZE +\
|
||||
FSEG_FRAG_ARR_N_SLOTS * FSEG_FRAG_SLOT_SIZE)
|
||||
#define FSEG_INODE_SIZE (16 + 3 * FLST_BASE_NODE_SIZE + FSEG_FRAG_ARR_N_SLOTS * FSEG_FRAG_SLOT_SIZE)
|
||||
|
||||
#define FSP_SEG_INODES_PER_PAGE ((UNIV_PAGE_SIZE - FSEG_ARR_OFFSET - 10)\
|
||||
/ FSEG_INODE_SIZE)
|
||||
#define FSP_SEG_INODES_PER_PAGE ((UNIV_PAGE_SIZE - FSEG_ARR_OFFSET - 10) / FSEG_INODE_SIZE)
|
||||
/* Number of segment inodes which fit on a
|
||||
single page */
|
||||
|
||||
|
|
@ -198,8 +196,7 @@ the extent are free and which contain old tuple version to clean. */
|
|||
|
||||
/* File extent data structure size in bytes. The "+ 7 ) / 8" part in the
|
||||
definition rounds the number of bytes upward. */
|
||||
#define XDES_SIZE (XDES_BITMAP +\
|
||||
(FSP_EXTENT_SIZE * XDES_BITS_PER_PAGE + 7) / 8)
|
||||
#define XDES_SIZE (XDES_BITMAP + (FSP_EXTENT_SIZE * XDES_BITS_PER_PAGE + 7) / 8)
|
||||
|
||||
/* Offset of the descriptor array on a descriptor page */
|
||||
#define XDES_ARR_OFFSET (FSP_HEADER_OFFSET + FSP_HEADER_SIZE)
|
||||
|
|
@ -2539,6 +2536,10 @@ fseg_free_page(
|
|||
seg_inode = fseg_inode_get(seg_header, mtr);
|
||||
|
||||
fseg_free_page_low(seg_inode, space, page, mtr);
|
||||
|
||||
#ifdef UNIV_DEBUG_FILE_ACCESSES
|
||||
buf_page_set_file_page_was_freed(space, page);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
|
|
@ -2602,6 +2603,14 @@ fseg_free_extent(
|
|||
}
|
||||
|
||||
fsp_free_extent(space, page, mtr);
|
||||
|
||||
#ifdef UNIV_DEBUG_FILE_ACCESSES
|
||||
for (i = 0; i < FSP_EXTENT_SIZE; i++) {
|
||||
|
||||
buf_page_set_file_page_was_freed(space,
|
||||
first_page_in_extent + i);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
|
|
@ -2633,6 +2642,14 @@ fseg_free_step(
|
|||
MTR_MEMO_X_LOCK));
|
||||
mtr_x_lock(fil_space_get_latch(space), mtr);
|
||||
|
||||
descr = xdes_get_descriptor(space, buf_frame_get_page_no(header), mtr);
|
||||
|
||||
/* Check that the header resides on a page which has not been
|
||||
freed yet */
|
||||
|
||||
ut_a(descr);
|
||||
ut_a(xdes_get_bit(descr, XDES_FREE_BIT, buf_frame_get_page_no(header)
|
||||
% FSP_EXTENT_SIZE, mtr) == FALSE);
|
||||
inode = fseg_inode_get(header, mtr);
|
||||
|
||||
descr = fseg_get_first_extent(inode, mtr);
|
||||
|
|
@ -2647,7 +2664,6 @@ fseg_free_step(
|
|||
}
|
||||
|
||||
/* Free a frag page */
|
||||
|
||||
n = fseg_find_last_used_frag_page_slot(inode, mtr);
|
||||
|
||||
if (n == ULINT_UNDEFINED) {
|
||||
|
|
@ -2659,6 +2675,16 @@ fseg_free_step(
|
|||
|
||||
fseg_free_page_low(inode, space,
|
||||
fseg_get_nth_frag_page_no(inode, n, mtr), mtr);
|
||||
|
||||
n = fseg_find_last_used_frag_page_slot(inode, mtr);
|
||||
|
||||
if (n == ULINT_UNDEFINED) {
|
||||
/* Freeing completed: free the segment inode */
|
||||
fsp_free_seg_inode(space, inode, mtr);
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1382,6 +1382,9 @@ ibuf_remove_free_page(
|
|||
|
||||
fseg_free_page(header_page + IBUF_HEADER + IBUF_TREE_SEG_HEADER,
|
||||
space, page_no, &mtr);
|
||||
#ifdef UNIV_DEBUG_FILE_ACCESSES
|
||||
buf_page_reset_file_page_was_freed(space, page_no);
|
||||
#endif
|
||||
ibuf_enter();
|
||||
|
||||
mutex_enter(&ibuf_mutex);
|
||||
|
|
@ -1413,6 +1416,9 @@ ibuf_remove_free_page(
|
|||
|
||||
ibuf_bitmap_page_set_bits(bitmap_page, page_no, IBUF_BITMAP_IBUF,
|
||||
FALSE, &mtr);
|
||||
#ifdef UNIV_DEBUG_FILE_ACCESSES
|
||||
buf_page_set_file_page_was_freed(space, page_no);
|
||||
#endif
|
||||
mtr_commit(&mtr);
|
||||
|
||||
mutex_exit(&ibuf_mutex);
|
||||
|
|
@ -2431,6 +2437,8 @@ ibuf_merge_or_delete_for_page(
|
|||
|
||||
block = buf_block_align(page);
|
||||
rw_lock_x_lock_move_ownership(&(block->lock));
|
||||
|
||||
ut_a(fil_page_get_type(page) == FIL_PAGE_INDEX);
|
||||
}
|
||||
|
||||
n_inserts = 0;
|
||||
|
|
|
|||
|
|
@ -293,6 +293,32 @@ buf_page_peek_block(
|
|||
ulint space, /* in: space id */
|
||||
ulint offset);/* in: page number */
|
||||
/************************************************************************
|
||||
Sets file_page_was_freed TRUE if the page is found in the buffer pool.
|
||||
This function should be called when we free a file page and want the
|
||||
debug version to check that it is not accessed any more unless
|
||||
reallocated. */
|
||||
|
||||
buf_block_t*
|
||||
buf_page_set_file_page_was_freed(
|
||||
/*=============================*/
|
||||
/* out: control block if found from page hash table,
|
||||
otherwise NULL */
|
||||
ulint space, /* in: space id */
|
||||
ulint offset); /* in: page number */
|
||||
/************************************************************************
|
||||
Sets file_page_was_freed FALSE if the page is found in the buffer pool.
|
||||
This function should be called when we free a file page and want the
|
||||
debug version to check that it is not accessed any more unless
|
||||
reallocated. */
|
||||
|
||||
buf_block_t*
|
||||
buf_page_reset_file_page_was_freed(
|
||||
/*===============================*/
|
||||
/* out: control block if found from page hash table,
|
||||
otherwise NULL */
|
||||
ulint space, /* in: space id */
|
||||
ulint offset); /* in: page number */
|
||||
/************************************************************************
|
||||
Recommends a move of a block to the start of the LRU list if there is danger
|
||||
of dropping from the buffer pool. NOTE: does not reserve the buffer pool
|
||||
mutex. */
|
||||
|
|
@ -706,6 +732,9 @@ struct buf_block_struct{
|
|||
which bufferfixes the block acquires
|
||||
an s-latch here; so we can use the
|
||||
debug utilities in sync0rw */
|
||||
ibool file_page_was_freed;
|
||||
/* this is set to TRUE when fsp
|
||||
frees a page in buffer pool */
|
||||
};
|
||||
|
||||
/* The buffer pool structure. NOTE! The definition appears here only for
|
||||
|
|
|
|||
|
|
@ -28,4 +28,7 @@ int
|
|||
innobase_shutdown_for_mysql(void);
|
||||
/*=============================*/
|
||||
/* out: DB_SUCCESS or error code */
|
||||
|
||||
extern ibool srv_startup_is_before_trx_rollback_phase;
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ mutex_test_and_set(
|
|||
/* mutex_fence(); */
|
||||
|
||||
return(res);
|
||||
#elif defined(__GNUC__) && defined(UNIV_INTEL_X86)
|
||||
#elif defined(not_defined) && defined(__GNUC__) && defined(UNIV_INTEL_X86)
|
||||
ulint* lw;
|
||||
ulint res;
|
||||
|
||||
|
|
@ -134,7 +134,7 @@ mutex_reset_lock_word(
|
|||
__asm MOV EDX, 0
|
||||
__asm MOV ECX, lw
|
||||
__asm XCHG EDX, DWORD PTR [ECX]
|
||||
#elif defined(__GNUC__) && defined(UNIV_INTEL_X86)
|
||||
#elif defined(not_defined) && defined(__GNUC__) && defined(UNIV_INTEL_X86)
|
||||
ulint* lw;
|
||||
|
||||
lw = &(mutex->lock_word);
|
||||
|
|
|
|||
|
|
@ -9,6 +9,8 @@ Created 1/20/1994 Heikki Tuuri
|
|||
#ifndef univ_i
|
||||
#define univ_i
|
||||
|
||||
#undef UNIV_INTEL_X86
|
||||
|
||||
#if (defined(_WIN32) || defined(_WIN64)) && !defined(MYSQL_SERVER)
|
||||
#define __WIN__
|
||||
#include <windows.h>
|
||||
|
|
@ -72,6 +74,8 @@ subdirectory of 'mysql'. */
|
|||
|
||||
#define UNIV_SYNC_PERF_STAT
|
||||
#define UNIV_SEARCH_PERF_STAT
|
||||
|
||||
#define UNIV_DEBUG_FILE_ACCESSES
|
||||
*/
|
||||
#define UNIV_LIGHT_MEM_DEBUG
|
||||
|
||||
|
|
|
|||
|
|
@ -944,9 +944,9 @@ recv_read_in_area(
|
|||
}
|
||||
|
||||
buf_read_recv_pages(FALSE, space, page_nos, n);
|
||||
|
||||
/* printf("Recv pages at %lu n %lu\n", page_nos[0], n); */
|
||||
|
||||
/*
|
||||
printf("Recv pages at %lu n %lu\n", page_nos[0], n);
|
||||
*/
|
||||
return(n);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ Created 10/21/1995 Heikki Tuuri
|
|||
#include "ut0mem.h"
|
||||
#include "srv0srv.h"
|
||||
|
||||
#undef HAVE_FDATASYNC
|
||||
|
||||
#ifdef POSIX_ASYNC_IO
|
||||
/* We assume in this case that the OS has standard Posix aio (at least SunOS
|
||||
|
|
@ -562,6 +563,11 @@ os_file_flush(
|
|||
return(TRUE);
|
||||
}
|
||||
|
||||
fprintf(stderr,
|
||||
"InnoDB: Error: the OS said file flush did not succeed\n");
|
||||
|
||||
os_file_handle_error(file, NULL);
|
||||
|
||||
return(FALSE);
|
||||
#endif
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@ Created 9/17/2000 Heikki Tuuri
|
|||
#include "trx0roll.h"
|
||||
#include "trx0purge.h"
|
||||
#include "lock0lock.h"
|
||||
#include "rem0cmp.h"
|
||||
|
||||
/***********************************************************************
|
||||
Reads a MySQL format variable-length field (like VARCHAR) length and
|
||||
|
|
@ -823,7 +824,11 @@ row_create_table_for_mysql(
|
|||
} else {
|
||||
assert(err == DB_DUPLICATE_KEY);
|
||||
fprintf(stderr,
|
||||
"Innobase: error: table %s already exists in Innobase data dictionary\n",
|
||||
"InnoDB: Error: table %s already exists in InnoDB internal\n"
|
||||
"InnoDB: data dictionary. Have you deleted the .frm file\n"
|
||||
"InnoDB: and not used DROP TABLE? Have you used DROP DATABASE\n"
|
||||
"InnoDB: for InnoDB tables in MySQL version <= 3.23.39?\n"
|
||||
"InnoDB: See the Restrictions section of the InnoDB manual.\n",
|
||||
table->name);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -361,6 +361,7 @@ row_undo_mod_del_unmark_sec(
|
|||
btr_cur_t* btr_cur;
|
||||
ulint err;
|
||||
ibool found;
|
||||
char* err_buf;
|
||||
|
||||
UT_NOT_USED(node);
|
||||
|
||||
|
|
@ -369,13 +370,31 @@ row_undo_mod_del_unmark_sec(
|
|||
|
||||
found = row_search_index_entry(index, entry, BTR_MODIFY_LEAF, &pcur,
|
||||
&mtr);
|
||||
ut_a(found);
|
||||
if (!found) {
|
||||
err_buf = mem_alloc(1000);
|
||||
dtuple_sprintf(err_buf, 900, entry);
|
||||
|
||||
btr_cur = btr_pcur_get_btr_cur(&pcur);
|
||||
fprintf(stderr, "InnoDB: error in sec index entry del undo in\n"
|
||||
"InnoDB: index %s table %s\n", index->name,
|
||||
index->table->name);
|
||||
fprintf(stderr, "InnoDB: tuple %s\n", err_buf);
|
||||
|
||||
err = btr_cur_del_mark_set_sec_rec(BTR_NO_LOCKING_FLAG,
|
||||
rec_sprintf(err_buf, 900, btr_pcur_get_rec(&pcur));
|
||||
fprintf(stderr, "InnoDB: record %s\n", err_buf);
|
||||
|
||||
fprintf(stderr, "InnoDB: Make a detailed bug report and send it\n");
|
||||
fprintf(stderr, "InnoDB: to mysql@lists.mysql.com\n");
|
||||
|
||||
mem_free(err_buf);
|
||||
|
||||
} else {
|
||||
|
||||
btr_cur = btr_pcur_get_btr_cur(&pcur);
|
||||
|
||||
err = btr_cur_del_mark_set_sec_rec(BTR_NO_LOCKING_FLAG,
|
||||
btr_cur, FALSE, thr, &mtr);
|
||||
ut_ad(err == DB_SUCCESS);
|
||||
ut_ad(err == DB_SUCCESS);
|
||||
}
|
||||
|
||||
btr_pcur_close(&pcur);
|
||||
mtr_commit(&mtr);
|
||||
|
|
|
|||
|
|
@ -750,6 +750,7 @@ row_upd_sec_index_entry(
|
|||
btr_cur_t* btr_cur;
|
||||
mem_heap_t* heap;
|
||||
rec_t* rec;
|
||||
char* err_buf;
|
||||
ulint err = DB_SUCCESS;
|
||||
|
||||
index = node->index;
|
||||
|
|
@ -764,18 +765,37 @@ row_upd_sec_index_entry(
|
|||
|
||||
found = row_search_index_entry(index, entry, BTR_MODIFY_LEAF, &pcur,
|
||||
&mtr);
|
||||
ut_ad(found);
|
||||
|
||||
btr_cur = btr_pcur_get_btr_cur(&pcur);
|
||||
|
||||
rec = btr_cur_get_rec(btr_cur);
|
||||
|
||||
/* Delete mark the old index record; it can already be delete marked if
|
||||
we return after a lock wait in row_ins_index_entry below */
|
||||
if (!found) {
|
||||
|
||||
if (!rec_get_deleted_flag(rec)) {
|
||||
err_buf = mem_alloc(1000);
|
||||
dtuple_sprintf(err_buf, 900, entry);
|
||||
|
||||
fprintf(stderr, "InnoDB: error in sec index entry update in\n"
|
||||
"InnoDB: index %s table %s\n", index->name,
|
||||
index->table->name);
|
||||
fprintf(stderr, "InnoDB: tuple %s\n", err_buf);
|
||||
|
||||
rec_sprintf(err_buf, 900, rec);
|
||||
fprintf(stderr, "InnoDB: record %s\n", err_buf);
|
||||
|
||||
fprintf(stderr, "InnoDB: Make a detailed bug report and send it\n");
|
||||
fprintf(stderr, "InnoDB: to mysql@lists.mysql.com\n");
|
||||
|
||||
mem_free(err_buf);
|
||||
} else {
|
||||
|
||||
/* Delete mark the old index record; it can already be
|
||||
delete marked if we return after a lock wait in
|
||||
row_ins_index_entry below */
|
||||
|
||||
if (!rec_get_deleted_flag(rec)) {
|
||||
err = btr_cur_del_mark_set_sec_rec(0, btr_cur, TRUE, thr,
|
||||
&mtr);
|
||||
}
|
||||
}
|
||||
|
||||
btr_pcur_close(&pcur);
|
||||
|
|
|
|||
|
|
@ -56,6 +56,7 @@ Created 2/16/1996 Heikki Tuuri
|
|||
#include "srv0start.h"
|
||||
#include "que0que.h"
|
||||
|
||||
ibool srv_startup_is_before_trx_rollback_phase = FALSE;
|
||||
ibool srv_is_being_started = FALSE;
|
||||
ibool srv_was_started = FALSE;
|
||||
|
||||
|
|
@ -531,6 +532,7 @@ innobase_start_or_create_for_mysql(void)
|
|||
/* yydebug = TRUE; */
|
||||
|
||||
srv_is_being_started = TRUE;
|
||||
srv_startup_is_before_trx_rollback_phase = TRUE;
|
||||
|
||||
if (0 == ut_strcmp(srv_unix_file_flush_method_str, "fdatasync")) {
|
||||
srv_unix_file_flush_method = SRV_UNIX_FDATASYNC;
|
||||
|
|
@ -548,6 +550,9 @@ innobase_start_or_create_for_mysql(void)
|
|||
return(DB_ERROR);
|
||||
}
|
||||
|
||||
/*
|
||||
printf("srv_unix set to %lu\n", srv_unix_file_flush_method);
|
||||
*/
|
||||
os_aio_use_native_aio = srv_use_native_aio;
|
||||
|
||||
err = srv_boot();
|
||||
|
|
@ -728,6 +733,7 @@ innobase_start_or_create_for_mysql(void)
|
|||
|
||||
trx_sys_create();
|
||||
dict_create();
|
||||
srv_startup_is_before_trx_rollback_phase = FALSE;
|
||||
|
||||
} else if (srv_archive_recovery) {
|
||||
fprintf(stderr,
|
||||
|
|
@ -742,9 +748,15 @@ innobase_start_or_create_for_mysql(void)
|
|||
return(DB_ERROR);
|
||||
}
|
||||
|
||||
trx_sys_init_at_db_start();
|
||||
/* Since ibuf init is in dict_boot, and ibuf is needed
|
||||
in any disk i/o, first call dict_boot */
|
||||
|
||||
dict_boot();
|
||||
|
||||
trx_sys_init_at_db_start();
|
||||
|
||||
srv_startup_is_before_trx_rollback_phase = FALSE;
|
||||
|
||||
recv_recovery_from_archive_finish();
|
||||
} else {
|
||||
/* We always try to do a recovery, even if the database had
|
||||
|
|
@ -759,12 +771,15 @@ innobase_start_or_create_for_mysql(void)
|
|||
return(DB_ERROR);
|
||||
}
|
||||
|
||||
trx_sys_init_at_db_start();
|
||||
/* Since ibuf init is in dict_boot, and ibuf is needed
|
||||
in any disk i/o, first call dict_boot */
|
||||
dict_boot();
|
||||
trx_sys_init_at_db_start();
|
||||
|
||||
/* The following needs trx lists which are initialized in
|
||||
trx_sys_init_at_db_start */
|
||||
|
||||
|
||||
srv_startup_is_before_trx_rollback_phase = FALSE;
|
||||
recv_recovery_from_checkpoint_finish();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -166,6 +166,46 @@ struct sync_level_struct{
|
|||
ulint level; /* level of the latch in the latching order */
|
||||
};
|
||||
|
||||
|
||||
#if defined(__GNUC__) && defined(UNIV_INTEL_X86)
|
||||
|
||||
ulint
|
||||
sync_gnuc_intelx86_test_and_set(
|
||||
/* out: old value of the lock word */
|
||||
ulint* lw) /* in: pointer to the lock word */
|
||||
{
|
||||
ulint res;
|
||||
|
||||
/* In assembly we use the so-called AT & T syntax where
|
||||
the order of operands is inverted compared to the ordinary Intel
|
||||
syntax. The 'l' after the mnemonics denotes a 32-bit operation.
|
||||
The line after the code tells which values come out of the asm
|
||||
code, and the second line tells the input to the asm code. */
|
||||
|
||||
asm volatile("movl $1, %%eax; xchgl (%%ecx), %%eax" :
|
||||
"=eax" (res), "=m" (*lw) :
|
||||
"ecx" (lw));
|
||||
return(res);
|
||||
}
|
||||
|
||||
void
|
||||
sync_gnuc_intelx86_reset(
|
||||
ulint* lw) /* in: pointer to the lock word */
|
||||
{
|
||||
/* In assembly we use the so-called AT & T syntax where
|
||||
the order of operands is inverted compared to the ordinary Intel
|
||||
syntax. The 'l' after the mnemonics denotes a 32-bit operation. */
|
||||
|
||||
asm volatile("movl $0, %%eax; xchgl (%%ecx), %%eax" :
|
||||
"=m" (*lw) :
|
||||
"ecx" (lw) :
|
||||
"eax"); /* gcc does not seem to understand
|
||||
that our asm code resets eax: tell it
|
||||
explicitly that after the third ':' */
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/**********************************************************************
|
||||
Creates, or rather, initializes a mutex object in a specified memory
|
||||
location (which must be appropriately aligned). The mutex is initialized
|
||||
|
|
|
|||
|
|
@ -613,6 +613,10 @@ trx_undo_insert_header_reuse(
|
|||
/* Insert undo data is not needed after commit: we may free all
|
||||
the space on the page */
|
||||
|
||||
ut_a(mach_read_from_2(undo_page + TRX_UNDO_PAGE_HDR
|
||||
+ TRX_UNDO_PAGE_TYPE)
|
||||
== TRX_UNDO_INSERT);
|
||||
|
||||
mach_write_to_2(page_hdr + TRX_UNDO_PAGE_START, new_free);
|
||||
|
||||
mach_write_to_2(page_hdr + TRX_UNDO_PAGE_FREE, new_free);
|
||||
|
|
@ -800,7 +804,7 @@ trx_undo_free_page(
|
|||
ulint hist_size;
|
||||
|
||||
UT_NOT_USED(hdr_offset);
|
||||
ut_ad(hdr_page_no != page_no);
|
||||
ut_a(hdr_page_no != page_no);
|
||||
ut_ad(!mutex_own(&kernel_mutex));
|
||||
ut_ad(mutex_own(&(rseg->mutex)));
|
||||
|
||||
|
|
@ -1411,6 +1415,10 @@ trx_undo_reuse_cached(
|
|||
if (type == TRX_UNDO_INSERT) {
|
||||
offset = trx_undo_insert_header_reuse(undo_page, trx_id, mtr);
|
||||
} else {
|
||||
ut_a(mach_read_from_2(undo_page + TRX_UNDO_PAGE_HDR
|
||||
+ TRX_UNDO_PAGE_TYPE)
|
||||
== TRX_UNDO_UPDATE);
|
||||
|
||||
offset = trx_undo_header_create(undo_page, trx_id, mtr);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -201,7 +201,7 @@ static struct option long_options[] =
|
|||
|
||||
static void print_version(void)
|
||||
{
|
||||
printf("%s Ver 1.46 for %s at %s\n",my_progname,SYSTEM_TYPE,
|
||||
printf("%s Ver 1.47 for %s at %s\n",my_progname,SYSTEM_TYPE,
|
||||
MACHINE_TYPE);
|
||||
}
|
||||
|
||||
|
|
@ -234,7 +234,8 @@ static void usage(void)
|
|||
-F, --fast Check only tables that hasn't been closed properly\n\
|
||||
-C, --check-only-changed\n\
|
||||
Check only tables that has changed since last check\n\
|
||||
-f, --force Restart with -r if there are any errors in the table\n\
|
||||
-f, --force Restart with -r if there are any errors in the table.\n\
|
||||
States will be updated as with --update-state\n\
|
||||
-i, --information Print statistics information about table that is checked\n\
|
||||
-m, --medium-check Faster than extended-check, but only finds 99.99% of\n\
|
||||
all errors. Should be good enough for most cases\n\
|
||||
|
|
@ -359,7 +360,7 @@ static void get_options(register int *argc,register char ***argv)
|
|||
break;
|
||||
case 'f':
|
||||
check_param.tmpfile_createflag= O_RDWR | O_TRUNC;
|
||||
check_param.testflag|=T_FORCE_CREATE;
|
||||
check_param.testflag|= T_FORCE_CREATE | T_UPDATE_STATE;
|
||||
break;
|
||||
case 'F':
|
||||
check_param.testflag|=T_FAST;
|
||||
|
|
|
|||
|
|
@ -509,3 +509,5 @@ id id3
|
|||
1 1
|
||||
2 2
|
||||
100 2
|
||||
KINMU_DATE
|
||||
KINMU_DATE
|
||||
|
|
|
|||
|
|
@ -5,5 +5,11 @@
|
|||
+9999999999999999999 -9999999999999999999
|
||||
10000000000000000000 -10000000000000000000
|
||||
a
|
||||
18446744073709551614
|
||||
18446744073709551615
|
||||
a
|
||||
18446744073709551615
|
||||
a
|
||||
18446744073709551615
|
||||
a
|
||||
18446744073709551614
|
||||
|
|
|
|||
|
|
@ -7,3 +7,5 @@ isbn city libname a
|
|||
isbn city libname a
|
||||
007 Berkeley Berkeley Public1 2
|
||||
000 New York New York Public Libra 2
|
||||
f1 count(distinct t2.f2) count(distinct 1,NULL)
|
||||
1 0 0
|
||||
|
|
|
|||
|
|
@ -1,2 +1,11 @@
|
|||
n
|
||||
1
|
||||
n
|
||||
4
|
||||
Database
|
||||
foo
|
||||
mysql
|
||||
test
|
||||
Database
|
||||
mysql
|
||||
test
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
n
|
||||
3
|
||||
n
|
||||
23
|
||||
n
|
||||
345
|
||||
|
|
|
|||
|
|
@ -80,3 +80,13 @@ t1 CREATE TABLE `t1` (
|
|||
`test_set` set('val1','val2','val3') NOT NULL default '',
|
||||
`name` char(20) default 'O''Brien'
|
||||
) TYPE=MyISAM COMMENT='it''s a table'
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) NOT NULL default '0',
|
||||
UNIQUE KEY `aa` (`a`)
|
||||
) TYPE=MyISAM
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) NOT NULL default '0',
|
||||
PRIMARY KEY (`a`)
|
||||
) TYPE=MyISAM
|
||||
|
|
|
|||
|
|
@ -705,3 +705,13 @@ commit;
|
|||
select id,id3 from t1;
|
||||
UNLOCK TABLES;
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Test with empty tables (crashed with lock error)
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (SYAIN_NO char(5) NOT NULL default '', KINMU_DATE char(6) NOT NULL default '', PRIMARY KEY (SYAIN_NO,KINMU_DATE)) TYPE=BerkeleyDB;
|
||||
CREATE TABLE t2 ( SYAIN_NO char(5) NOT NULL default '',STR_DATE char(8) NOT NULL default '',PRIMARY KEY (SYAIN_NO,STR_DATE) ) TYPE=BerkeleyDB;
|
||||
select T1.KINMU_DATE from t1 T1 ,t2 T2 where T1.SYAIN_NO = '12345' and T1.KINMU_DATE = '200106' and T2.SYAIN_NO = T1.SYAIN_NO;
|
||||
select T1.KINMU_DATE from t1 T1 ,t2 T2 where T1.SYAIN_NO = '12345' and T1.KINMU_DATE = '200106' and T2.SYAIN_NO = T1.SYAIN_NO;
|
||||
DROP TABLE t1,t2;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,11 @@ select 9223372036854775807,-009223372036854775808;
|
|||
select +9999999999999999999,-9999999999999999999;
|
||||
|
||||
drop table if exists t1;
|
||||
create table t1 (a bigint unsigned);
|
||||
insert into t1 values (18446744073709551615), (0xFFFFFFFFFFFFFFFF);
|
||||
create table t1 (a bigint unsigned not null, primary key(a));
|
||||
insert into t1 values (18446744073709551615), (0xFFFFFFFFFFFFFFFE);
|
||||
select * from t1;
|
||||
select * from t1 where a=18446744073709551615;
|
||||
select * from t1 where a='18446744073709551615';
|
||||
delete from t1 where a=18446744073709551615;
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
|
|
|
|||
|
|
@ -32,3 +32,13 @@ insert into t1 values ('NYC Lib','New York');
|
|||
select t2.isbn,city,t1.libname,count(t1.libname) as a from t3 left join t1 on t3.libname=t1.libname left join t2 on t3.isbn=t2.isbn group by city,t1.libname;
|
||||
select t2.isbn,city,t1.libname,count(distinct t1.libname) as a from t3 left join t1 on t3.libname=t1.libname left join t2 on t3.isbn=t2.isbn group by city having count(distinct t1.libname) > 1;
|
||||
drop table t1, t2, t3;
|
||||
|
||||
#
|
||||
# Problem with LEFT JOIN
|
||||
#
|
||||
|
||||
create table t1 (f1 int);
|
||||
insert into t1 values (1);
|
||||
create table t2 (f1 int,f2 int);
|
||||
select t1.f1,count(distinct t2.f2),count(distinct 1,NULL) from t1 left join t2 on t1.f1=t2.f1 group by t1.f1;
|
||||
drop table t1,t2;
|
||||
|
|
|
|||
|
|
@ -10,3 +10,34 @@ insert into t1 values(2);
|
|||
create table t1(n int);
|
||||
drop table t1;
|
||||
select * from t1;
|
||||
|
||||
#now test for a bug in drop database - it is important that the name
|
||||
#of the table is the same as the name of the database - in the original
|
||||
#code this triggered a bug
|
||||
drop database if exists foo;
|
||||
create database foo;
|
||||
drop database if exists foo;
|
||||
create database foo;
|
||||
create table foo.foo (n int);
|
||||
insert into foo.foo values (4);
|
||||
select * from foo.foo;
|
||||
drop database if exists foo;
|
||||
create database foo;
|
||||
drop database foo;
|
||||
|
||||
# test drop/create database and FLUSH TABLES WITH READ LOCK
|
||||
drop database if exists foo;
|
||||
flush tables with read lock;
|
||||
--error 1209
|
||||
create database foo;
|
||||
unlock tables;
|
||||
create database foo;
|
||||
show databases;
|
||||
flush tables with read lock;
|
||||
--error 1208
|
||||
drop database foo;
|
||||
unlock tables;
|
||||
drop database foo;
|
||||
show databases;
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -33,6 +33,21 @@ unlock tables;
|
|||
connection con1;
|
||||
reap;
|
||||
|
||||
#test if drop database will wait until we release the global read lock
|
||||
connection con1;
|
||||
drop database if exists foo;
|
||||
create database foo;
|
||||
create table foo.t1(n int);
|
||||
insert into foo.t1 values (23);
|
||||
flush tables with read lock;
|
||||
connection con2;
|
||||
send drop database foo;
|
||||
connection con1;
|
||||
select * from foo.t1;
|
||||
unlock tables;
|
||||
connection con2;
|
||||
reap;
|
||||
|
||||
# test if dirty close releases global read lock
|
||||
connection con1;
|
||||
create table t1 (n int);
|
||||
|
|
|
|||
|
|
@ -65,3 +65,10 @@ create table t1 (
|
|||
) comment = 'it\'s a table' ;
|
||||
show create table t1 ;
|
||||
drop table t1;
|
||||
|
||||
create table t1 (a int not null, unique aa (a));
|
||||
show create table t1;
|
||||
drop table t1;
|
||||
create table t1 (a int not null, primary key (a));
|
||||
show create table t1;
|
||||
drop table t1;
|
||||
|
|
|
|||
|
|
@ -3,7 +3,8 @@
|
|||
# Numeric floating point.
|
||||
|
||||
SELECT 10,10.0,10.,.1e+2,100.0e-1;
|
||||
select 6e-05, -6e-05, --6e-05, -6e-05+1.000000;
|
||||
SELECT 6e-05, -6e-05, --6e-05, -6e-05+1.000000;
|
||||
SELECT 1e1,1.e1,1.0e1,1e+1,1.e+1,1.0e+1,1e-1,1.e-1,1.0e-1;
|
||||
|
||||
drop table if exists t1;
|
||||
create table t1 (f1 float(24),f2 float(52));
|
||||
|
|
|
|||
|
|
@ -11,24 +11,26 @@
|
|||
# Another time vacuum() filled our system disk with had 6G free
|
||||
# while vaccuming a table of 60 M.
|
||||
#
|
||||
# We have sent a mail about this to the PostgreSQL mailing list, so
|
||||
# the PostgreSQL developers should be aware of these problems and should
|
||||
# hopefully fix this soon.
|
||||
#
|
||||
# WARNING
|
||||
|
||||
# The test was run on a Intel Xeon 2x 550 Mzh machine with 1G memory,
|
||||
# 9G hard disk. The OS is Suse 7.1, with Linux 2.4.0 compiled with SMP
|
||||
# 9G hard disk. The OS is Suse 7.1, with Linux 2.4.2 compiled with SMP
|
||||
# support
|
||||
# Both the perl client and the database server is run
|
||||
# on the same machine. No other cpu intensive process was used during
|
||||
# the benchmark.
|
||||
#
|
||||
# During the test we run PostgreSQL with -o -F, not async mode (not ACID safe)
|
||||
# because when we started postmaster without -o -F, PostgreSQL log files
|
||||
# filled up a 9G disk until postmaster crashed.
|
||||
# We did however notice that with -o -F, PostgreSQL was a magnitude slower
|
||||
# than when not using -o -F.
|
||||
|
||||
# First, install postgresql-7.1.1.tar.gz
|
||||
#
|
||||
# First, install postgresql-7.1.2.tar.gz
|
||||
|
||||
# Adding the following lines to your ~/.bash_profile or
|
||||
# corresponding file. If you are using csh, use ´setenv´.
|
||||
#
|
||||
|
||||
export POSTGRES_INCLUDE=/usr/local/pg/include
|
||||
export POSTGRES_LIB=/usr/local/pg/lib
|
||||
|
|
@ -62,7 +64,7 @@ su - postgres
|
|||
exit
|
||||
|
||||
#
|
||||
# Second, install packages DBD-Pg-1.00.tar.gz and DBI-1.14.tar.gz,
|
||||
# Second, install packages DBD-Pg-1.00.tar.gz and DBI-1.18.tar.gz,
|
||||
# available from http://www.perl.com/CPAN/
|
||||
|
||||
export POSTGRES_LIB=/usr/local/pg/lib/
|
||||
|
|
@ -82,6 +84,7 @@ run-all-tests --comment="Intel Xeon, 2x550 Mhz, 512M, pg started with -o -F" --u
|
|||
|
||||
# When running with --fast we run the following vacuum commands on
|
||||
# the database between each major update of the tables:
|
||||
# vacuum anlyze table
|
||||
# vacuum table
|
||||
# or
|
||||
# vacuum analyze
|
||||
|
|
|
|||
|
|
@ -1,20 +0,0 @@
|
|||
Testing server 'MySQL 3.23.39' at 2001-06-05 19:26:17
|
||||
|
||||
ATIS table test
|
||||
|
||||
Creating tables
|
||||
Time for create_table (28): 0 wallclock secs ( 0.01 usr 0.00 sys + 0.00 cusr 0.00 csys = 0.01 CPU)
|
||||
|
||||
Inserting data
|
||||
Time to insert (9768): 3 wallclock secs ( 0.45 usr 0.44 sys + 0.00 cusr 0.00 csys = 0.89 CPU)
|
||||
|
||||
Retrieving data
|
||||
Time for select_simple_join (500): 3 wallclock secs ( 0.68 usr 0.19 sys + 0.00 cusr 0.00 csys = 0.87 CPU)
|
||||
Time for select_join (100): 3 wallclock secs ( 0.51 usr 0.20 sys + 0.00 cusr 0.00 csys = 0.71 CPU)
|
||||
Time for select_key_prefix_join (100): 13 wallclock secs ( 4.08 usr 2.01 sys + 0.00 cusr 0.00 csys = 6.09 CPU)
|
||||
Time for select_distinct (800): 15 wallclock secs ( 1.75 usr 0.69 sys + 0.00 cusr 0.00 csys = 2.44 CPU)
|
||||
Time for select_group (2600): 20 wallclock secs ( 1.57 usr 0.41 sys + 0.00 cusr 0.00 csys = 1.98 CPU)
|
||||
|
||||
Removing tables
|
||||
Time to drop_table (28): 0 wallclock secs ( 0.00 usr 0.00 sys + 0.00 cusr 0.00 csys = 0.00 CPU)
|
||||
Total time: 57 wallclock secs ( 9.06 usr 3.94 sys + 0.00 cusr 0.00 csys = 13.00 CPU)
|
||||
|
|
@ -1,101 +0,0 @@
|
|||
Benchmark DBD suite: 2.12
|
||||
Date of test: 2001-06-05 19:27:31
|
||||
Running tests on: Linux 2.4.0-64GB-SMP i686
|
||||
Arguments:
|
||||
Comments: Intel Xeon, 2x550 Mhz, 512M, key_buffer=16M
|
||||
Limits from: mysql,pg
|
||||
Server version: MySQL 3.23.39
|
||||
|
||||
ATIS: Total time: 57 wallclock secs ( 9.06 usr 3.94 sys + 0.00 cusr 0.00 csys = 13.00 CPU)
|
||||
alter-table: Total time: 271 wallclock secs ( 0.18 usr 0.02 sys + 0.00 cusr 0.00 csys = 0.20 CPU)
|
||||
big-tables: Total time: 33 wallclock secs ( 9.40 usr 7.64 sys + 0.00 cusr 0.00 csys = 17.04 CPU)
|
||||
connect: Total time: 86 wallclock secs (33.98 usr 18.10 sys + 0.00 cusr 0.00 csys = 52.08 CPU)
|
||||
create: Total time: 103 wallclock secs ( 7.83 usr 3.60 sys + 0.00 cusr 0.00 csys = 11.43 CPU)
|
||||
insert: Total time: 2736 wallclock secs (661.21 usr 182.47 sys + 0.00 cusr 0.00 csys = 843.68 CPU)
|
||||
select: Total time: 1949 wallclock secs (70.03 usr 16.42 sys + 0.00 cusr 0.00 csys = 86.45 CPU)
|
||||
wisconsin: Total time: 19 wallclock secs ( 3.92 usr 1.70 sys + 0.00 cusr 0.00 csys = 5.62 CPU)
|
||||
|
||||
All 8 test executed successfully
|
||||
|
||||
Totals per operation:
|
||||
Operation seconds usr sys cpu tests
|
||||
alter_table_add 261.00 0.13 0.02 0.15 992
|
||||
connect 16.00 6.84 2.50 9.34 10000
|
||||
connect+select_1_row 15.00 7.11 3.70 10.81 10000
|
||||
connect+select_simple 13.00 6.70 3.21 9.91 10000
|
||||
count 45.00 0.01 0.00 0.01 100
|
||||
count_distinct 60.00 0.42 0.08 0.50 1000
|
||||
count_distinct_2 63.00 0.18 0.03 0.21 1000
|
||||
count_distinct_big 165.00 7.78 3.16 10.94 120
|
||||
count_distinct_group 194.00 1.21 0.37 1.58 1000
|
||||
count_distinct_group_on_key 59.00 0.51 0.07 0.58 1000
|
||||
count_distinct_group_on_key_parts 194.00 1.12 0.46 1.58 1000
|
||||
count_distinct_key_prefix 51.00 0.45 0.08 0.53 1000
|
||||
count_group_on_key_parts 58.00 1.16 0.35 1.51 1000
|
||||
count_on_key 586.00 16.61 2.71 19.32 50100
|
||||
create+drop 33.00 2.94 0.82 3.76 10000
|
||||
create_MANY_tables 18.00 1.02 0.62 1.64 5000
|
||||
create_index 5.00 0.00 0.00 0.00 8
|
||||
create_key+drop 41.00 3.05 0.66 3.71 10000
|
||||
create_table 0.00 0.01 0.00 0.01 31
|
||||
delete_all 17.00 0.00 0.00 0.00 12
|
||||
delete_all_many_keys 75.00 0.03 0.00 0.03 1
|
||||
delete_big 1.00 0.00 0.00 0.00 1
|
||||
delete_big_many_keys 75.00 0.03 0.00 0.03 128
|
||||
delete_key 4.00 0.76 0.29 1.05 10000
|
||||
drop_index 5.00 0.00 0.00 0.00 8
|
||||
drop_table 0.00 0.00 0.00 0.00 28
|
||||
drop_table_when_MANY_tables 6.00 0.37 0.63 1.00 5000
|
||||
insert 144.00 24.06 14.28 38.34 350768
|
||||
insert_duplicates 31.00 5.06 3.72 8.78 100000
|
||||
insert_key 137.00 9.91 6.26 16.17 100000
|
||||
insert_many_fields 10.00 0.54 0.08 0.62 2000
|
||||
insert_select_1_key 7.00 0.00 0.00 0.00 1
|
||||
insert_select_2_keys 9.00 0.00 0.00 0.00 1
|
||||
min_max 30.00 0.04 0.01 0.05 60
|
||||
min_max_on_key 230.00 28.28 4.43 32.71 85000
|
||||
order_by_big 78.00 22.39 9.83 32.22 10
|
||||
order_by_big_key 33.00 23.35 10.15 33.50 10
|
||||
order_by_big_key2 32.00 22.53 9.81 32.34 10
|
||||
order_by_big_key_desc 36.00 23.47 10.27 33.74 10
|
||||
order_by_big_key_diff 74.00 22.66 9.76 32.42 10
|
||||
order_by_big_key_prefix 33.00 22.18 9.81 31.99 10
|
||||
order_by_key2_diff 9.00 1.30 0.85 2.15 500
|
||||
order_by_key_prefix 4.00 0.97 0.57 1.54 500
|
||||
order_by_range 8.00 1.26 0.49 1.75 500
|
||||
outer_join 110.00 0.00 0.00 0.00 10
|
||||
outer_join_found 107.00 0.00 0.00 0.00 10
|
||||
outer_join_not_found 59.00 0.00 0.00 0.00 500
|
||||
outer_join_on_key 60.00 0.00 0.00 0.00 10
|
||||
select_1_row 3.00 0.81 0.69 1.50 10000
|
||||
select_2_rows 3.00 0.67 0.63 1.30 10000
|
||||
select_big 63.00 32.72 16.55 49.27 10080
|
||||
select_column+column 4.00 0.52 0.46 0.98 10000
|
||||
select_diff_key 193.00 0.32 0.04 0.36 500
|
||||
select_distinct 15.00 1.75 0.69 2.44 800
|
||||
select_group 75.00 1.59 0.45 2.04 2711
|
||||
select_group_when_MANY_tables 5.00 0.43 0.87 1.30 5000
|
||||
select_join 3.00 0.51 0.20 0.71 100
|
||||
select_key 132.00 53.98 10.53 64.51 200000
|
||||
select_key2 139.00 78.61 11.08 89.69 200000
|
||||
select_key2_return_key 131.00 64.58 9.61 74.19 200000
|
||||
select_key2_return_prim 134.00 72.33 11.34 83.67 200000
|
||||
select_key_prefix 141.00 86.32 12.05 98.37 200000
|
||||
select_key_prefix_join 13.00 4.08 2.01 6.09 100
|
||||
select_key_return_key 125.00 59.92 12.00 71.92 200000
|
||||
select_many_fields 23.00 8.85 7.55 16.40 2000
|
||||
select_query_cache 120.00 3.67 0.53 4.20 10000
|
||||
select_query_cache2 120.00 3.80 0.57 4.37 10000
|
||||
select_range 201.00 9.05 3.95 13.00 410
|
||||
select_range_key2 21.00 7.15 1.40 8.55 25010
|
||||
select_range_prefix 22.00 6.55 1.40 7.95 25010
|
||||
select_simple 2.00 0.54 0.49 1.03 10000
|
||||
select_simple_join 3.00 0.68 0.19 0.87 500
|
||||
update_big 64.00 0.00 0.00 0.00 10
|
||||
update_of_key 25.00 2.62 1.44 4.06 50000
|
||||
update_of_key_big 35.00 0.05 0.04 0.09 501
|
||||
update_of_primary_key_many_keys 47.00 0.01 0.02 0.03 256
|
||||
update_with_key 119.00 18.44 12.64 31.08 300000
|
||||
update_with_key_prefix 36.00 6.23 3.85 10.08 100000
|
||||
wisc_benchmark 5.00 2.33 0.52 2.85 114
|
||||
TOTALS 5323.00 795.55 233.87 1029.42 2551551
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
Testing server 'MySQL 3.23.39' at 2001-06-05 13:47:22
|
||||
|
||||
Testing of ALTER TABLE
|
||||
Testing with 1000 columns and 1000 rows in 20 steps
|
||||
Insert data into the table
|
||||
Time for insert (1000) 0 wallclock secs ( 0.05 usr 0.00 sys + 0.00 cusr 0.00 csys = 0.05 CPU)
|
||||
|
||||
Time for alter_table_add (992): 261 wallclock secs ( 0.13 usr 0.02 sys + 0.00 cusr 0.00 csys = 0.15 CPU)
|
||||
|
||||
Time for create_index (8): 5 wallclock secs ( 0.00 usr 0.00 sys + 0.00 cusr 0.00 csys = 0.00 CPU)
|
||||
|
||||
Time for drop_index (8): 5 wallclock secs ( 0.00 usr 0.00 sys + 0.00 cusr 0.00 csys = 0.00 CPU)
|
||||
|
||||
Total time: 271 wallclock secs ( 0.18 usr 0.02 sys + 0.00 cusr 0.00 csys = 0.20 CPU)
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
Testing server 'MySQL 3.23.39' at 2001-06-05 13:51:53
|
||||
|
||||
Testing of some unusual tables
|
||||
All tests are done 1000 times with 1000 fields
|
||||
|
||||
Testing table with 1000 fields
|
||||
Testing select * from table with 1 record
|
||||
Time to select_many_fields(1000): 10 wallclock secs ( 4.43 usr 4.17 sys + 0.00 cusr 0.00 csys = 8.60 CPU)
|
||||
|
||||
Testing select all_fields from table with 1 record
|
||||
Time to select_many_fields(1000): 13 wallclock secs ( 4.42 usr 3.38 sys + 0.00 cusr 0.00 csys = 7.80 CPU)
|
||||
|
||||
Testing insert VALUES()
|
||||
Time to insert_many_fields(1000): 3 wallclock secs ( 0.46 usr 0.03 sys + 0.00 cusr 0.00 csys = 0.49 CPU)
|
||||
|
||||
Testing insert (all_fields) VALUES()
|
||||
Time to insert_many_fields(1000): 7 wallclock secs ( 0.08 usr 0.05 sys + 0.00 cusr 0.00 csys = 0.13 CPU)
|
||||
|
||||
Total time: 33 wallclock secs ( 9.40 usr 7.64 sys + 0.00 cusr 0.00 csys = 17.04 CPU)
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
Testing server 'MySQL 3.23.39' at 2001-06-05 13:52:26
|
||||
|
||||
Testing the speed of connecting to the server and sending of data
|
||||
All tests are done 10000 times
|
||||
|
||||
Testing connection/disconnect
|
||||
Time to connect (10000): 16 wallclock secs ( 6.84 usr 2.50 sys + 0.00 cusr 0.00 csys = 9.34 CPU)
|
||||
|
||||
Test connect/simple select/disconnect
|
||||
Time for connect+select_simple (10000): 13 wallclock secs ( 6.70 usr 3.21 sys + 0.00 cusr 0.00 csys = 9.91 CPU)
|
||||
|
||||
Test simple select
|
||||
Time for select_simple (10000): 2 wallclock secs ( 0.54 usr 0.49 sys + 0.00 cusr 0.00 csys = 1.03 CPU)
|
||||
|
||||
Testing connect/select 1 row from table/disconnect
|
||||
Time to connect+select_1_row (10000): 15 wallclock secs ( 7.11 usr 3.70 sys + 0.00 cusr 0.00 csys = 10.81 CPU)
|
||||
|
||||
Testing select 1 row from table
|
||||
Time to select_1_row (10000): 3 wallclock secs ( 0.81 usr 0.69 sys + 0.00 cusr 0.00 csys = 1.50 CPU)
|
||||
|
||||
Testing select 2 rows from table
|
||||
Time to select_2_rows (10000): 3 wallclock secs ( 0.67 usr 0.63 sys + 0.00 cusr 0.00 csys = 1.30 CPU)
|
||||
|
||||
Test select with aritmetic (+)
|
||||
Time for select_column+column (10000): 4 wallclock secs ( 0.52 usr 0.46 sys + 0.00 cusr 0.00 csys = 0.98 CPU)
|
||||
|
||||
Testing retrieval of big records (65000 bytes)
|
||||
Time to select_big (10000): 30 wallclock secs (10.79 usr 6.41 sys + 0.00 cusr 0.00 csys = 17.20 CPU)
|
||||
|
||||
Total time: 86 wallclock secs (33.98 usr 18.10 sys + 0.00 cusr 0.00 csys = 52.08 CPU)
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
Testing server 'MySQL 3.23.39' at 2001-06-05 13:53:52
|
||||
|
||||
Testing the speed of creating and droping tables
|
||||
Testing with 5000 tables and 10000 loop count
|
||||
|
||||
Testing create of tables
|
||||
Time for create_MANY_tables (5000): 18 wallclock secs ( 1.02 usr 0.62 sys + 0.00 cusr 0.00 csys = 1.64 CPU)
|
||||
|
||||
Accessing tables
|
||||
Time to select_group_when_MANY_tables (5000): 5 wallclock secs ( 0.43 usr 0.87 sys + 0.00 cusr 0.00 csys = 1.30 CPU)
|
||||
|
||||
Testing drop
|
||||
Time for drop_table_when_MANY_tables (5000): 6 wallclock secs ( 0.37 usr 0.63 sys + 0.00 cusr 0.00 csys = 1.00 CPU)
|
||||
|
||||
Testing create+drop
|
||||
Time for create+drop (10000): 33 wallclock secs ( 2.94 usr 0.82 sys + 0.00 cusr 0.00 csys = 3.76 CPU)
|
||||
Time for create_key+drop (10000): 41 wallclock secs ( 3.05 usr 0.66 sys + 0.00 cusr 0.00 csys = 3.71 CPU)
|
||||
Total time: 103 wallclock secs ( 7.83 usr 3.60 sys + 0.00 cusr 0.00 csys = 11.43 CPU)
|
||||
|
|
@ -1,85 +0,0 @@
|
|||
Testing server 'MySQL 3.23.39' at 2001-06-05 13:55:36
|
||||
|
||||
Testing the speed of inserting data into 1 table and do some selects on it.
|
||||
The tests are done with a table that has 100000 rows.
|
||||
|
||||
Generating random keys
|
||||
Creating tables
|
||||
Inserting 100000 rows in order
|
||||
Inserting 100000 rows in reverse order
|
||||
Inserting 100000 rows in random order
|
||||
Time for insert (300000): 123 wallclock secs (21.22 usr 12.32 sys + 0.00 cusr 0.00 csys = 33.54 CPU)
|
||||
|
||||
Testing insert of duplicates
|
||||
Time for insert_duplicates (100000): 31 wallclock secs ( 5.06 usr 3.72 sys + 0.00 cusr 0.00 csys = 8.78 CPU)
|
||||
|
||||
Retrieving data from the table
|
||||
Time for select_big (10:3000000): 32 wallclock secs (21.78 usr 10.07 sys + 0.00 cusr 0.00 csys = 31.85 CPU)
|
||||
Time for order_by_big_key (10:3000000): 33 wallclock secs (23.35 usr 10.15 sys + 0.00 cusr 0.00 csys = 33.50 CPU)
|
||||
Time for order_by_big_key_desc (10:3000000): 36 wallclock secs (23.47 usr 10.27 sys + 0.00 cusr 0.00 csys = 33.74 CPU)
|
||||
Time for order_by_big_key_prefix (10:3000000): 33 wallclock secs (22.18 usr 9.81 sys + 0.00 cusr 0.00 csys = 31.99 CPU)
|
||||
Time for order_by_big_key2 (10:3000000): 32 wallclock secs (22.53 usr 9.81 sys + 0.00 cusr 0.00 csys = 32.34 CPU)
|
||||
Time for order_by_big_key_diff (10:3000000): 74 wallclock secs (22.66 usr 9.76 sys + 0.00 cusr 0.00 csys = 32.42 CPU)
|
||||
Time for order_by_big (10:3000000): 78 wallclock secs (22.39 usr 9.83 sys + 0.00 cusr 0.00 csys = 32.22 CPU)
|
||||
Time for order_by_range (500:125750): 8 wallclock secs ( 1.26 usr 0.49 sys + 0.00 cusr 0.00 csys = 1.75 CPU)
|
||||
Time for order_by_key_prefix (500:125750): 4 wallclock secs ( 0.97 usr 0.57 sys + 0.00 cusr 0.00 csys = 1.54 CPU)
|
||||
Time for order_by_key2_diff (500:250500): 9 wallclock secs ( 1.30 usr 0.85 sys + 0.00 cusr 0.00 csys = 2.15 CPU)
|
||||
Time for select_diff_key (500:1000): 193 wallclock secs ( 0.32 usr 0.04 sys + 0.00 cusr 0.00 csys = 0.36 CPU)
|
||||
Time for select_range_prefix (5010:42084): 13 wallclock secs ( 2.55 usr 0.51 sys + 0.00 cusr 0.00 csys = 3.06 CPU)
|
||||
Time for select_range_key2 (5010:42084): 12 wallclock secs ( 2.81 usr 0.68 sys + 0.00 cusr 0.00 csys = 3.49 CPU)
|
||||
Time for select_key_prefix (200000): 141 wallclock secs (86.32 usr 12.05 sys + 0.00 cusr 0.00 csys = 98.37 CPU)
|
||||
Time for select_key (200000): 132 wallclock secs (53.98 usr 10.53 sys + 0.00 cusr 0.00 csys = 64.51 CPU)
|
||||
Time for select_key_return_key (200000): 125 wallclock secs (59.92 usr 12.00 sys + 0.00 cusr 0.00 csys = 71.92 CPU)
|
||||
Time for select_key2 (200000): 139 wallclock secs (78.61 usr 11.08 sys + 0.00 cusr 0.00 csys = 89.69 CPU)
|
||||
Time for select_key2_return_key (200000): 131 wallclock secs (64.58 usr 9.61 sys + 0.00 cusr 0.00 csys = 74.19 CPU)
|
||||
Time for select_key2_return_prim (200000): 134 wallclock secs (72.33 usr 11.34 sys + 0.00 cusr 0.00 csys = 83.67 CPU)
|
||||
|
||||
Test of compares with simple ranges
|
||||
Time for select_range_prefix (20000:43500): 9 wallclock secs ( 4.00 usr 0.89 sys + 0.00 cusr 0.00 csys = 4.89 CPU)
|
||||
Time for select_range_key2 (20000:43500): 9 wallclock secs ( 4.34 usr 0.72 sys + 0.00 cusr 0.00 csys = 5.06 CPU)
|
||||
Time for select_group (111): 55 wallclock secs ( 0.02 usr 0.04 sys + 0.00 cusr 0.00 csys = 0.06 CPU)
|
||||
Time for min_max_on_key (15000): 8 wallclock secs ( 5.12 usr 0.76 sys + 0.00 cusr 0.00 csys = 5.88 CPU)
|
||||
Time for min_max (60): 30 wallclock secs ( 0.04 usr 0.01 sys + 0.00 cusr 0.00 csys = 0.05 CPU)
|
||||
Time for count_on_key (100): 52 wallclock secs ( 0.03 usr 0.02 sys + 0.00 cusr 0.00 csys = 0.05 CPU)
|
||||
Time for count (100): 45 wallclock secs ( 0.01 usr 0.00 sys + 0.00 cusr 0.00 csys = 0.01 CPU)
|
||||
Time for count_distinct_big (20): 98 wallclock secs ( 0.01 usr 0.00 sys + 0.00 cusr 0.00 csys = 0.01 CPU)
|
||||
|
||||
Testing update of keys with functions
|
||||
Time for update_of_key (50000): 25 wallclock secs ( 2.62 usr 1.44 sys + 0.00 cusr 0.00 csys = 4.06 CPU)
|
||||
Time for update_of_key_big (501): 35 wallclock secs ( 0.05 usr 0.04 sys + 0.00 cusr 0.00 csys = 0.09 CPU)
|
||||
|
||||
Testing update with key
|
||||
Time for update_with_key (300000): 119 wallclock secs (18.44 usr 12.64 sys + 0.00 cusr 0.00 csys = 31.08 CPU)
|
||||
Time for update_with_key_prefix (100000): 36 wallclock secs ( 6.23 usr 3.85 sys + 0.00 cusr 0.00 csys = 10.08 CPU)
|
||||
|
||||
Testing update of all rows
|
||||
Time for update_big (10): 64 wallclock secs ( 0.00 usr 0.00 sys + 0.00 cusr 0.00 csys = 0.00 CPU)
|
||||
|
||||
Testing left outer join
|
||||
Time for outer_join_on_key (10:10): 60 wallclock secs ( 0.00 usr 0.00 sys + 0.00 cusr 0.00 csys = 0.00 CPU)
|
||||
Time for outer_join (10:10): 110 wallclock secs ( 0.00 usr 0.00 sys + 0.00 cusr 0.00 csys = 0.00 CPU)
|
||||
Time for outer_join_found (10:10): 107 wallclock secs ( 0.00 usr 0.00 sys + 0.00 cusr 0.00 csys = 0.00 CPU)
|
||||
Time for outer_join_not_found (500:10): 59 wallclock secs ( 0.00 usr 0.00 sys + 0.00 cusr 0.00 csys = 0.00 CPU)
|
||||
|
||||
Testing INSERT INTO ... SELECT
|
||||
Time for insert_select_1_key (1): 7 wallclock secs ( 0.00 usr 0.00 sys + 0.00 cusr 0.00 csys = 0.00 CPU)
|
||||
Time for insert_select_2_keys (1): 9 wallclock secs ( 0.00 usr 0.00 sys + 0.00 cusr 0.00 csys = 0.00 CPU)
|
||||
Time for drop table(2): 0 wallclock secs ( 0.00 usr 0.00 sys + 0.00 cusr 0.00 csys = 0.00 CPU)
|
||||
|
||||
Testing delete
|
||||
Time for delete_key (10000): 4 wallclock secs ( 0.76 usr 0.29 sys + 0.00 cusr 0.00 csys = 1.05 CPU)
|
||||
Time for delete_all (12): 17 wallclock secs ( 0.00 usr 0.00 sys + 0.00 cusr 0.00 csys = 0.00 CPU)
|
||||
|
||||
Insert into table with 16 keys and with a primary key with 16 parts
|
||||
Time for insert_key (100000): 137 wallclock secs ( 9.91 usr 6.26 sys + 0.00 cusr 0.00 csys = 16.17 CPU)
|
||||
|
||||
Testing update of keys
|
||||
Time for update_of_primary_key_many_keys (256): 47 wallclock secs ( 0.01 usr 0.02 sys + 0.00 cusr 0.00 csys = 0.03 CPU)
|
||||
|
||||
Deleting rows from the table
|
||||
Time for delete_big_many_keys (128): 75 wallclock secs ( 0.03 usr 0.00 sys + 0.00 cusr 0.00 csys = 0.03 CPU)
|
||||
|
||||
Deleting everything from table
|
||||
Time for delete_all_many_keys (1): 75 wallclock secs ( 0.03 usr 0.00 sys + 0.00 cusr 0.00 csys = 0.03 CPU)
|
||||
|
||||
Total time: 2736 wallclock secs (661.21 usr 182.47 sys + 0.00 cusr 0.00 csys = 843.68 CPU)
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
Testing server 'MySQL 3.23.39' at 2001-06-05 14:41:13
|
||||
|
||||
Testing the speed of selecting on keys that consist of many parts
|
||||
The test-table has 10000 rows and the test is done with 500 ranges.
|
||||
|
||||
Creating table
|
||||
Inserting 10000 rows
|
||||
Time to insert (10000): 5 wallclock secs ( 0.80 usr 0.34 sys + 0.00 cusr 0.00 csys = 1.14 CPU)
|
||||
|
||||
Test if the database has a query cache
|
||||
Time for select_query_cache (10000): 120 wallclock secs ( 3.67 usr 0.53 sys + 0.00 cusr 0.00 csys = 4.20 CPU)
|
||||
|
||||
Time for select_query_cache2 (10000): 120 wallclock secs ( 3.80 usr 0.57 sys + 0.00 cusr 0.00 csys = 4.37 CPU)
|
||||
|
||||
Testing big selects on the table
|
||||
Time for select_big (70:17207): 1 wallclock secs ( 0.15 usr 0.07 sys + 0.00 cusr 0.00 csys = 0.22 CPU)
|
||||
Time for select_range (410:1057904): 201 wallclock secs ( 9.05 usr 3.95 sys + 0.00 cusr 0.00 csys = 13.00 CPU)
|
||||
Time for min_max_on_key (70000): 222 wallclock secs (23.16 usr 3.67 sys + 0.00 cusr 0.00 csys = 26.83 CPU)
|
||||
Time for count_on_key (50000): 534 wallclock secs (16.58 usr 2.69 sys + 0.00 cusr 0.00 csys = 19.27 CPU)
|
||||
|
||||
Time for count_group_on_key_parts (1000:100000): 58 wallclock secs ( 1.16 usr 0.35 sys + 0.00 cusr 0.00 csys = 1.51 CPU)
|
||||
Testing count(distinct) on the table
|
||||
Time for count_distinct_key_prefix (1000:1000): 51 wallclock secs ( 0.45 usr 0.08 sys + 0.00 cusr 0.00 csys = 0.53 CPU)
|
||||
Time for count_distinct (1000:1000): 60 wallclock secs ( 0.42 usr 0.08 sys + 0.00 cusr 0.00 csys = 0.50 CPU)
|
||||
Time for count_distinct_2 (1000:1000): 63 wallclock secs ( 0.18 usr 0.03 sys + 0.00 cusr 0.00 csys = 0.21 CPU)
|
||||
Time for count_distinct_group_on_key (1000:6000): 59 wallclock secs ( 0.51 usr 0.07 sys + 0.00 cusr 0.00 csys = 0.58 CPU)
|
||||
Time for count_distinct_group_on_key_parts (1000:100000): 194 wallclock secs ( 1.12 usr 0.46 sys + 0.00 cusr 0.00 csys = 1.58 CPU)
|
||||
Time for count_distinct_group (1000:100000): 194 wallclock secs ( 1.21 usr 0.37 sys + 0.00 cusr 0.00 csys = 1.58 CPU)
|
||||
Time for count_distinct_big (100:1000000): 67 wallclock secs ( 7.77 usr 3.16 sys + 0.00 cusr 0.00 csys = 10.93 CPU)
|
||||
Total time: 1949 wallclock secs (70.03 usr 16.42 sys + 0.00 cusr 0.00 csys = 86.45 CPU)
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
Testing server 'MySQL 3.23.39' at 2001-06-05 15:13:43
|
||||
|
||||
Wisconsin benchmark test
|
||||
|
||||
Time for create_table (3): 0 wallclock secs ( 0.00 usr 0.00 sys + 0.00 cusr 0.00 csys = 0.00 CPU)
|
||||
|
||||
Inserting data
|
||||
Time to insert (31000): 13 wallclock secs ( 1.59 usr 1.18 sys + 0.00 cusr 0.00 csys = 2.77 CPU)
|
||||
Time to delete_big (1): 1 wallclock secs ( 0.00 usr 0.00 sys + 0.00 cusr 0.00 csys = 0.00 CPU)
|
||||
|
||||
Running actual benchmark
|
||||
Time for wisc_benchmark (114): 5 wallclock secs ( 2.33 usr 0.52 sys + 0.00 cusr 0.00 csys = 2.85 CPU)
|
||||
|
||||
Total time: 19 wallclock secs ( 3.92 usr 1.70 sys + 0.00 cusr 0.00 csys = 5.62 CPU)
|
||||
|
|
@ -458,7 +458,7 @@ sub gd {
|
|||
# set a color per server so in every result it has the same color ....
|
||||
foreach $key (@key_order) {
|
||||
if ($tot{$key}{'server'} =~ /mysql/i) {
|
||||
if ($key =~ /mysql_pgcc/i || $key =~ /mysql_odbc/i) {
|
||||
if ($key =~ /mysql_pgcc/i || $key =~ /mysql_odbc/i || $key =~ /mysql_fast/i) {
|
||||
$tot{$key}{'color'} = $lblue;
|
||||
} else {
|
||||
$tot{$key}{'color'} = $blue;
|
||||
|
|
|
|||
|
|
@ -1593,7 +1593,7 @@ double Field_longlong::val_real(void)
|
|||
else
|
||||
#endif
|
||||
longlongget(j,ptr);
|
||||
return unsigned_flag ? ulonglong2double(j) : (double) j;
|
||||
return unsigned_flag ? ulonglong2double((ulonglong) j) : (double) j;
|
||||
}
|
||||
|
||||
longlong Field_longlong::val_int(void)
|
||||
|
|
|
|||
|
|
@ -1523,6 +1523,10 @@ ha_innobase::update_row(
|
|||
|
||||
DBUG_ENTER("ha_innobase::update_row");
|
||||
|
||||
if (table->time_stamp) {
|
||||
update_timestamp(new_row + table->time_stamp - 1);
|
||||
}
|
||||
|
||||
if (last_query_id != user_thd->query_id) {
|
||||
prebuilt->sql_stat_start = TRUE;
|
||||
last_query_id = user_thd->query_id;
|
||||
|
|
|
|||
|
|
@ -809,8 +809,19 @@ bool Item_sum_count_distinct::setup(THD *thd)
|
|||
List<Item> list;
|
||||
/* Create a table with an unique key over all parameters */
|
||||
for (uint i=0; i < arg_count ; i++)
|
||||
if (list.push_back(args[i]))
|
||||
return 1;
|
||||
{
|
||||
Item *item=args[i];
|
||||
if (list.push_back(item))
|
||||
return 1; // End of memory
|
||||
if (item->const_item())
|
||||
{
|
||||
(void) item->val_int();
|
||||
if (item->null_value)
|
||||
always_null=1;
|
||||
}
|
||||
}
|
||||
if (always_null)
|
||||
return 0;
|
||||
count_field_types(tmp_table_param,list,0);
|
||||
if (table)
|
||||
{
|
||||
|
|
@ -827,15 +838,20 @@ bool Item_sum_count_distinct::setup(THD *thd)
|
|||
|
||||
void Item_sum_count_distinct::reset()
|
||||
{
|
||||
table->file->extra(HA_EXTRA_NO_CACHE);
|
||||
table->file->delete_all_rows();
|
||||
table->file->extra(HA_EXTRA_WRITE_CACHE);
|
||||
(void) add();
|
||||
if (table)
|
||||
{
|
||||
table->file->extra(HA_EXTRA_NO_CACHE);
|
||||
table->file->delete_all_rows();
|
||||
table->file->extra(HA_EXTRA_WRITE_CACHE);
|
||||
(void) add();
|
||||
}
|
||||
}
|
||||
|
||||
bool Item_sum_count_distinct::add()
|
||||
{
|
||||
int error;
|
||||
if (always_null)
|
||||
return 0;
|
||||
copy_fields(tmp_table_param);
|
||||
copy_funcs(tmp_table_param->funcs);
|
||||
|
||||
|
|
|
|||
|
|
@ -145,11 +145,12 @@ class Item_sum_count_distinct :public Item_sum_int
|
|||
table_map used_table_cache;
|
||||
bool fix_fields(THD *thd,TABLE_LIST *tables);
|
||||
TMP_TABLE_PARAM *tmp_table_param;
|
||||
bool always_null;
|
||||
|
||||
public:
|
||||
Item_sum_count_distinct(List<Item> &list)
|
||||
:Item_sum_int(list),table(0),used_table_cache(~(table_map) 0),
|
||||
tmp_table_param(0)
|
||||
tmp_table_param(0),always_null(0)
|
||||
{ quick_group=0; }
|
||||
~Item_sum_count_distinct();
|
||||
table_map used_tables() const { return used_table_cache; }
|
||||
|
|
|
|||
|
|
@ -652,12 +652,16 @@ bool MYSQL_LOG::write(Query_log_event* event_info)
|
|||
if (thd->last_insert_id_used)
|
||||
{
|
||||
Intvar_log_event e((uchar)LAST_INSERT_ID_EVENT, thd->last_insert_id);
|
||||
if(thd->server_id)
|
||||
e.server_id = thd->server_id;
|
||||
if (e.write(file))
|
||||
goto err;
|
||||
}
|
||||
if (thd->insert_id_used)
|
||||
{
|
||||
Intvar_log_event e((uchar)INSERT_ID_EVENT, thd->last_insert_id);
|
||||
if(thd->server_id)
|
||||
e.server_id = thd->server_id;
|
||||
if (e.write(file))
|
||||
goto err;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -533,7 +533,7 @@ extern ulong keybuff_size,sortbuff_size,max_item_sort_length,table_cache_size,
|
|||
binlog_cache_size, max_binlog_cache_size;
|
||||
extern ulong specialflag, current_pid;
|
||||
extern bool low_priority_updates, using_update_log;
|
||||
extern bool opt_sql_bin_update, opt_safe_show_db;
|
||||
extern bool opt_sql_bin_update, opt_safe_show_db, opt_warnings;
|
||||
extern char language[LIBLEN],reg_ext[FN_EXTLEN],blob_newline;
|
||||
extern const char **errmesg; /* Error messages */
|
||||
extern const char *default_tx_isolation_name;
|
||||
|
|
|
|||
|
|
@ -108,7 +108,7 @@ static void die(const char* fmt, ...)
|
|||
|
||||
static void print_version()
|
||||
{
|
||||
printf("%s Ver 1.3 for %s at %s\n",my_progname,SYSTEM_TYPE, MACHINE_TYPE);
|
||||
printf("%s Ver 1.4 for %s at %s\n",my_progname,SYSTEM_TYPE, MACHINE_TYPE);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -132,7 +132,7 @@ the mysql command line client\n\n");
|
|||
-s, --short-form Just show the queries, no extra info\n\
|
||||
-o, --offset=N Skip the first N entries\n\
|
||||
-h, --host=server Get the binlog from server\n\
|
||||
-P, --port=port Use port to connect to the remove server\n\
|
||||
-P, --port=port Use port to connect to the remote server\n\
|
||||
-u, --user=username Connect to the remove server as username\n\
|
||||
-p, --password=password Password to connect to remote server\n\
|
||||
-r, --result-file=file Direct output to a given file\n\
|
||||
|
|
|
|||
|
|
@ -210,7 +210,7 @@ static char mysql_home[FN_REFLEN],pidfile_name[FN_REFLEN];
|
|||
static pthread_t select_thread;
|
||||
static bool opt_log,opt_update_log,opt_bin_log,opt_slow_log,opt_noacl,
|
||||
opt_disable_networking=0, opt_bootstrap=0,opt_skip_show_db=0,
|
||||
opt_ansi_mode=0,opt_myisam_log=0,
|
||||
opt_ansi_mode=0,opt_myisam_log=0,
|
||||
opt_large_files=sizeof(my_off_t) > 4;
|
||||
bool opt_sql_bin_update = 0, opt_log_slave_updates = 0, opt_safe_show_db=0;
|
||||
FILE *bootstrap_file=0;
|
||||
|
|
@ -275,7 +275,7 @@ ulong max_tmp_tables,max_heap_table_size;
|
|||
ulong bytes_sent = 0L, bytes_received = 0L;
|
||||
|
||||
bool opt_endinfo,using_udf_functions,low_priority_updates, locked_in_memory;
|
||||
bool opt_using_transactions, using_update_log;
|
||||
bool opt_using_transactions, using_update_log, opt_warnings=0;
|
||||
bool volatile abort_loop,select_thread_in_use,grant_option;
|
||||
bool volatile ready_to_exit,shutdown_in_progress;
|
||||
ulong refresh_version=1L,flush_version=1L; /* Increments on each reload */
|
||||
|
|
@ -1190,7 +1190,7 @@ Some pointers may be invalid and cause the dump to abort...\n");
|
|||
fprintf(stderr, "\n
|
||||
Successfully dumped variables, if you ran with --log, take a look at the\n\
|
||||
details of what thread %ld did to cause the crash. In some cases of really\n\
|
||||
bad corruption, the above values may be invalid\n\n",
|
||||
bad corruption, the values shown above may be invalid\n\n",
|
||||
thd->thread_id);
|
||||
}
|
||||
fprintf(stderr, "\
|
||||
|
|
@ -2455,7 +2455,7 @@ enum options {
|
|||
OPT_INNODB_LOG_ARCH_DIR,
|
||||
OPT_INNODB_LOG_ARCHIVE,
|
||||
OPT_INNODB_FLUSH_LOG_AT_TRX_COMMIT,
|
||||
OPT_INNODB_UNIX_FILE_FLUSH_METHOD,
|
||||
OPT_INNODB_UNIX_FILE_FLUSH_METHOD,
|
||||
OPT_SAFE_SHOW_DB,
|
||||
OPT_GEMINI_SKIP, OPT_INNODB_SKIP,
|
||||
OPT_TEMP_POOL, OPT_TX_ISOLATION,
|
||||
|
|
@ -2516,7 +2516,7 @@ static struct option long_options[] = {
|
|||
OPT_INNODB_LOG_ARCHIVE},
|
||||
{"innodb_flush_log_at_trx_commit", optional_argument, 0,
|
||||
OPT_INNODB_FLUSH_LOG_AT_TRX_COMMIT},
|
||||
{"innodb_unix_file_flush_method", required_argument, 0,
|
||||
{"innodb_flush_method", required_argument, 0,
|
||||
OPT_INNODB_UNIX_FILE_FLUSH_METHOD},
|
||||
#endif
|
||||
{"help", no_argument, 0, '?'},
|
||||
|
|
@ -2603,6 +2603,7 @@ static struct option long_options[] = {
|
|||
#endif
|
||||
{"user", required_argument, 0, 'u'},
|
||||
{"version", no_argument, 0, 'V'},
|
||||
{"warnings", no_argument, 0, 'W'},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
|
|
@ -3010,6 +3011,8 @@ static void usage(void)
|
|||
Start without grant tables. This gives all users\n\
|
||||
FULL ACCESS to all tables!\n\
|
||||
--safe-mode Skip some optimize stages (for testing)\n\
|
||||
--safe-show-database Don't show databases for which the user has no\n\
|
||||
privileges\n\
|
||||
--skip-concurrent-insert\n\
|
||||
Don't use concurrent insert with MyISAM\n\
|
||||
--skip-delay-key-write\n\
|
||||
|
|
@ -3033,7 +3036,8 @@ static void usage(void)
|
|||
Default transaction isolation level\n\
|
||||
--temp-pool Use a pool of temporary files\n\
|
||||
-u, --user=user_name Run mysqld daemon as user\n\
|
||||
-V, --version output version information and exit");
|
||||
-V, --version output version information and exit\n\
|
||||
-W, --warnings Log some not critical warnings to the log file\n");
|
||||
#ifdef __WIN__
|
||||
puts("NT and Win32 specific options:\n\
|
||||
--console Don't remove the console window\n\
|
||||
|
|
@ -3073,7 +3077,7 @@ static void usage(void)
|
|||
puts("\
|
||||
--innodb_data_home_dir=dir The common part for Innodb table spaces\n\
|
||||
--innodb_data_file_path=dir Path to individual files and their sizes\n\
|
||||
--innodb_flush_method=# Which method to flush data\n\
|
||||
--innodb_flush_method=# With which method to flush data\n\
|
||||
--innodb_flush_log_at_trx_commit[=#]\n\
|
||||
Set to 0 if you don't want to flush logs\n\
|
||||
--innodb_log_arch_dir=dir Where full logs should be archived\n\
|
||||
|
|
@ -3167,7 +3171,7 @@ static void get_options(int argc,char **argv)
|
|||
int c,option_index=0;
|
||||
|
||||
myisam_delay_key_write=1; // Allow use of this
|
||||
while ((c=getopt_long(argc,argv,"ab:C:h:#::T::?l::L:O:P:sS::t:u:noVvI?",
|
||||
while ((c=getopt_long(argc,argv,"ab:C:h:#::T::?l::L:O:P:sS::t:u:noVvWI?",
|
||||
long_options, &option_index)) != EOF)
|
||||
{
|
||||
switch(c) {
|
||||
|
|
@ -3177,6 +3181,9 @@ static void get_options(int argc,char **argv)
|
|||
#endif
|
||||
opt_endinfo=1; /* unireg: memory allocation */
|
||||
break;
|
||||
case 'W':
|
||||
opt_warnings=1;
|
||||
break;
|
||||
case 'a':
|
||||
opt_ansi_mode=1;
|
||||
thd_startup_options|=OPTION_ANSI_MODE;
|
||||
|
|
|
|||
|
|
@ -218,3 +218,5 @@
|
|||
"Lock wait timeout exceeded",
|
||||
"The total number of locks exceeds the lock table size",
|
||||
"Update locks cannot be acquired during a READ UNCOMMITTED transaction",
|
||||
"DROP DATABASE not allowed while thread is holding global read lock",
|
||||
"CREATE DATABASE not allowed while thread is holding global read lock",
|
||||
|
|
|
|||
|
|
@ -212,3 +212,5 @@
|
|||
"Lock wait timeout exceeded",
|
||||
"The total number of locks exceeds the lock table size",
|
||||
"Update locks cannot be acquired during a READ UNCOMMITTED transaction",
|
||||
"DROP DATABASE not allowed while thread is holding global read lock",
|
||||
"CREATE DATABASE not allowed while thread is holding global read lock",
|
||||
|
|
|
|||
|
|
@ -209,3 +209,5 @@
|
|||
"Lock wait timeout exceeded",
|
||||
"The total number of locks exceeds the lock table size",
|
||||
"Update locks cannot be acquired during a READ UNCOMMITTED transaction",
|
||||
"DROP DATABASE not allowed while thread is holding global read lock",
|
||||
"CREATE DATABASE not allowed while thread is holding global read lock",
|
||||
|
|
|
|||
|
|
@ -209,3 +209,5 @@
|
|||
"Lock wait timeout exceeded",
|
||||
"The total number of locks exceeds the lock table size",
|
||||
"Update locks cannot be acquired during a READ UNCOMMITTED transaction",
|
||||
"DROP DATABASE not allowed while thread is holding global read lock",
|
||||
"CREATE DATABASE not allowed while thread is holding global read lock",
|
||||
|
|
|
|||
|
|
@ -213,3 +213,5 @@
|
|||
"Lock wait timeout exceeded",
|
||||
"The total number of locks exceeds the lock table size",
|
||||
"Update locks cannot be acquired during a READ UNCOMMITTED transaction",
|
||||
"DROP DATABASE not allowed while thread is holding global read lock",
|
||||
"CREATE DATABASE not allowed while thread is holding global read lock",
|
||||
|
|
|
|||
|
|
@ -209,3 +209,5 @@
|
|||
"Lock wait timeout exceeded",
|
||||
"The total number of locks exceeds the lock table size",
|
||||
"Update locks cannot be acquired during a READ UNCOMMITTED transaction",
|
||||
"DROP DATABASE not allowed while thread is holding global read lock",
|
||||
"CREATE DATABASE not allowed while thread is holding global read lock",
|
||||
|
|
|
|||
|
|
@ -212,3 +212,5 @@
|
|||
"Lock wait timeout exceeded",
|
||||
"The total number of locks exceeds the lock table size",
|
||||
"Update locks cannot be acquired during a READ UNCOMMITTED transaction",
|
||||
"DROP DATABASE not allowed while thread is holding global read lock",
|
||||
"CREATE DATABASE not allowed while thread is holding global read lock",
|
||||
|
|
|
|||
|
|
@ -209,3 +209,5 @@
|
|||
"Lock wait timeout exceeded",
|
||||
"The total number of locks exceeds the lock table size",
|
||||
"Update locks cannot be acquired during a READ UNCOMMITTED transaction",
|
||||
"DROP DATABASE not allowed while thread is holding global read lock",
|
||||
"CREATE DATABASE not allowed while thread is holding global read lock",
|
||||
|
|
|
|||
|
|
@ -211,3 +211,5 @@
|
|||
"Lock wait timeout exceeded",
|
||||
"The total number of locks exceeds the lock table size",
|
||||
"Update locks cannot be acquired during a READ UNCOMMITTED transaction",
|
||||
"DROP DATABASE not allowed while thread is holding global read lock",
|
||||
"CREATE DATABASE not allowed while thread is holding global read lock",
|
||||
|
|
|
|||
|
|
@ -199,13 +199,15 @@
|
|||
"La tabella '%-.64s' e` segnalata come corrotta e l'ultima ricostruzione (automatica?) e` fallita",
|
||||
"Attenzione: Alcune delle modifiche alle tabelle non transazionali non possono essere ripristinate (roll back impossibile)",
|
||||
"La transazione a comandi multipli (multi-statement) ha richiesto piu` di 'max_binlog_cache_size' bytes di disco: aumentare questa variabile di mysqld e riprovare',
|
||||
"This operation cannot be performed with a running slave, run SLAVE STOP first",
|
||||
"This operation requires a running slave, configure slave and do SLAVE START",
|
||||
"The server is not configured as slave, fix in config file or with CHANGE MASTER TO",
|
||||
"Could not initialize master info structure, check permisions on master.info",
|
||||
"Could not create slave thread, check system resources",
|
||||
"User %-.64s has already more than 'max_user_connections' active connections",
|
||||
"You may only use constant expressions with SET",
|
||||
"Lock wait timeout exceeded",
|
||||
"The total number of locks exceeds the lock table size",
|
||||
"Update locks cannot be acquired during a READ UNCOMMITTED transaction",
|
||||
"Questa operazione non puo' essere eseguita con un database 'slave' che gira, lanciare prima SLAVE STOP",
|
||||
"Questa operaione richiede un database 'slave', configurarlo ed eseguire SLAVE START",
|
||||
"Il server non e' configurato come 'slave', correggere il file di configurazione cambiando CHANGE MASTER TO",
|
||||
"Impossibile inizializzare la struttura 'master info', controllare i permessi sul file master.info",
|
||||
"Impossibile creare il thread 'slave', controllare le risorse di sistema",
|
||||
"L'utente %-.64s ha gia' piu' di 'max_user_connections' connessioni attive",
|
||||
"Si possono usare solo espressioni costanti con SET",
|
||||
"E' scaduto il timeout per l'attesa del lock",
|
||||
"Il numero totale di lock e' maggiore della grandezza della tabella di lock",
|
||||
"I lock di aggiornamento non possono essere acquisiti durante una transazione 'READ UNCOMMITTED'",
|
||||
"DROP DATABASE not allowed while thread is holding global read lock",
|
||||
"CREATE DATABASE not allowed while thread is holding global read lock",
|
||||
|
|
|
|||
|
|
@ -211,3 +211,5 @@
|
|||
"Lock wait timeout exceeded",
|
||||
"The total number of locks exceeds the lock table size",
|
||||
"Update locks cannot be acquired during a READ UNCOMMITTED transaction",
|
||||
"DROP DATABASE not allowed while thread is holding global read lock",
|
||||
"CREATE DATABASE not allowed while thread is holding global read lock",
|
||||
|
|
|
|||
|
|
@ -209,3 +209,5 @@
|
|||
"Lock wait timeout exceeded",
|
||||
"The total number of locks exceeds the lock table size",
|
||||
"Update locks cannot be acquired during a READ UNCOMMITTED transaction",
|
||||
"DROP DATABASE not allowed while thread is holding global read lock",
|
||||
"CREATE DATABASE not allowed while thread is holding global read lock",
|
||||
|
|
|
|||
|
|
@ -211,3 +211,5 @@
|
|||
"Lock wait timeout exceeded",
|
||||
"The total number of locks exceeds the lock table size",
|
||||
"Update locks cannot be acquired during a READ UNCOMMITTED transaction",
|
||||
"DROP DATABASE not allowed while thread is holding global read lock",
|
||||
"CREATE DATABASE not allowed while thread is holding global read lock",
|
||||
|
|
|
|||
|
|
@ -211,3 +211,5 @@
|
|||
"Lock wait timeout exceeded",
|
||||
"The total number of locks exceeds the lock table size",
|
||||
"Update locks cannot be acquired during a READ UNCOMMITTED transaction",
|
||||
"DROP DATABASE not allowed while thread is holding global read lock",
|
||||
"CREATE DATABASE not allowed while thread is holding global read lock",
|
||||
|
|
|
|||
|
|
@ -213,3 +213,5 @@
|
|||
"Lock wait timeout exceeded",
|
||||
"The total number of locks exceeds the lock table size",
|
||||
"Update locks cannot be acquired during a READ UNCOMMITTED transaction",
|
||||
"DROP DATABASE not allowed while thread is holding global read lock",
|
||||
"CREATE DATABASE not allowed while thread is holding global read lock",
|
||||
|
|
|
|||
|
|
@ -209,3 +209,5 @@
|
|||
"Lock wait timeout exceeded",
|
||||
"The total number of locks exceeds the lock table size",
|
||||
"Update locks cannot be acquired during a READ UNCOMMITTED transaction",
|
||||
"DROP DATABASE not allowed while thread is holding global read lock",
|
||||
"CREATE DATABASE not allowed while thread is holding global read lock",
|
||||
|
|
|
|||
|
|
@ -213,3 +213,5 @@
|
|||
"Lock wait timeout exceeded",
|
||||
"The total number of locks exceeds the lock table size",
|
||||
"Update locks cannot be acquired during a READ UNCOMMITTED transaction",
|
||||
"DROP DATABASE not allowed while thread is holding global read lock",
|
||||
"CREATE DATABASE not allowed while thread is holding global read lock",
|
||||
|
|
|
|||
|
|
@ -212,3 +212,5 @@
|
|||
"Lock wait timeout exceeded",
|
||||
"The total number of locks exceeds the lock table size",
|
||||
"Update locks cannot be acquired during a READ UNCOMMITTED transaction",
|
||||
"DROP DATABASE not allowed while thread is holding global read lock",
|
||||
"CREATE DATABASE not allowed while thread is holding global read lock",
|
||||
|
|
|
|||
|
|
@ -217,3 +217,5 @@
|
|||
"Lock wait timeout exceeded",
|
||||
"The total number of locks exceeds the lock table size",
|
||||
"Update locks cannot be acquired during a READ UNCOMMITTED transaction",
|
||||
"DROP DATABASE not allowed while thread is holding global read lock",
|
||||
"CREATE DATABASE not allowed while thread is holding global read lock",
|
||||
|
|
|
|||
|
|
@ -210,3 +210,5 @@
|
|||
"Lock wait timeout exceeded",
|
||||
"The total number of locks exceeds the lock table size",
|
||||
"Update locks cannot be acquired during a READ UNCOMMITTED transaction",
|
||||
"DROP DATABASE not allowed while thread is holding global read lock",
|
||||
"CREATE DATABASE not allowed while thread is holding global read lock",
|
||||
|
|
|
|||
|
|
@ -209,3 +209,5 @@
|
|||
"Lock wait timeout exceeded",
|
||||
"The total number of locks exceeds the lock table size",
|
||||
"Update locks cannot be acquired during a READ UNCOMMITTED transaction",
|
||||
"DROP DATABASE not allowed while thread is holding global read lock",
|
||||
"CREATE DATABASE not allowed while thread is holding global read lock",
|
||||
|
|
|
|||
|
|
@ -1367,7 +1367,7 @@ the slave thread with \"mysqladmin start-slave\". We stopped at log \
|
|||
{
|
||||
// show a little mercy, allow slave to read one more event
|
||||
// before cutting him off - otherwise he gets stuck
|
||||
// on Invar events, since they do not advance the offset
|
||||
// on Intvar events, since they do not advance the offset
|
||||
// immediately
|
||||
if (++stuck_count > 2)
|
||||
events_till_disconnect++;
|
||||
|
|
|
|||
|
|
@ -498,11 +498,12 @@ void close_temporary(TABLE *table,bool delete_table)
|
|||
void close_temporary_tables(THD *thd)
|
||||
{
|
||||
TABLE *table,*next;
|
||||
uint init_query_buf_size = 11, query_buf_size; // "drop table "
|
||||
char* query, *p;
|
||||
char *query, *end;
|
||||
const uint init_query_buf_size = 11; // "drop table "
|
||||
uint query_buf_size;
|
||||
bool found_user_tables = 0;
|
||||
|
||||
LINT_INIT(p);
|
||||
LINT_INIT(end);
|
||||
query_buf_size = init_query_buf_size;
|
||||
|
||||
for (table=thd->temporary_tables ; table ; table=table->next)
|
||||
|
|
@ -510,37 +511,37 @@ void close_temporary_tables(THD *thd)
|
|||
query_buf_size += table->key_length;
|
||||
}
|
||||
|
||||
if(query_buf_size == init_query_buf_size)
|
||||
if (query_buf_size == init_query_buf_size)
|
||||
return; // no tables to close
|
||||
|
||||
if((query = alloc_root(&thd->mem_root, query_buf_size)))
|
||||
{
|
||||
memcpy(query, "drop table ", init_query_buf_size);
|
||||
p = query + init_query_buf_size;
|
||||
}
|
||||
if ((query = alloc_root(&thd->mem_root, query_buf_size)))
|
||||
{
|
||||
memcpy(query, "drop table ", init_query_buf_size);
|
||||
end = query + init_query_buf_size;
|
||||
}
|
||||
|
||||
for (table=thd->temporary_tables ; table ; table=next)
|
||||
{
|
||||
if(query) // we might be out of memory, but this is not fatal
|
||||
if (query) // we might be out of memory, but this is not fatal
|
||||
{
|
||||
// skip temporary tables not created directly by the user
|
||||
if (table->table_name[0] != '#')
|
||||
{
|
||||
// skip temporary tables not created directly by the user
|
||||
if(table->table_name[0] != '#')
|
||||
{
|
||||
p = strxmov(p,table->table_cache_key,".",
|
||||
table->table_name,",", NullS);
|
||||
// here we assume table_cache_key always starts
|
||||
// with \0 terminated db name
|
||||
found_user_tables = 1;
|
||||
}
|
||||
end = strxmov(end,table->table_cache_key,".",
|
||||
table->table_name,",", NullS);
|
||||
// here we assume table_cache_key always starts
|
||||
// with \0 terminated db name
|
||||
found_user_tables = 1;
|
||||
}
|
||||
}
|
||||
next=table->next;
|
||||
close_temporary(table);
|
||||
}
|
||||
if (query && found_user_tables && mysql_bin_log.is_open())
|
||||
{
|
||||
uint save_query_len = thd->query_length;
|
||||
*--p = 0;
|
||||
thd->query_length = (uint)(p-query);
|
||||
*--end = 0; // Remove last ','
|
||||
thd->query_length = (uint)(end-query);
|
||||
Query_log_event qinfo(thd, query);
|
||||
mysql_bin_log.write(&qinfo);
|
||||
thd->query_length = save_query_len;
|
||||
|
|
|
|||
|
|
@ -38,6 +38,32 @@ void mysql_create_db(THD *thd, char *db, uint create_options)
|
|||
DBUG_ENTER("mysql_create_db");
|
||||
|
||||
VOID(pthread_mutex_lock(&LOCK_mysql_create_db));
|
||||
VOID(pthread_mutex_lock(&LOCK_open));
|
||||
|
||||
// do not create database if another thread is holding read lock
|
||||
if (global_read_lock)
|
||||
{
|
||||
if (thd->global_read_lock)
|
||||
{
|
||||
net_printf(&thd->net, ER_CREATE_DB_WITH_READ_LOCK);
|
||||
VOID(pthread_mutex_unlock(&LOCK_open));
|
||||
goto exit;
|
||||
}
|
||||
while (global_read_lock && ! thd->killed)
|
||||
{
|
||||
(void) pthread_cond_wait(&COND_refresh,&LOCK_open);
|
||||
}
|
||||
|
||||
if (thd->killed)
|
||||
{
|
||||
net_printf(&thd->net, ER_SERVER_SHUTDOWN);
|
||||
VOID(pthread_mutex_unlock(&LOCK_open));
|
||||
goto exit;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
VOID(pthread_mutex_unlock(&LOCK_open));
|
||||
|
||||
/* Check directory */
|
||||
(void)sprintf(path,"%s/%s", mysql_data_home, db);
|
||||
|
|
@ -105,6 +131,26 @@ void mysql_rm_db(THD *thd,char *db,bool if_exists)
|
|||
VOID(pthread_mutex_lock(&LOCK_mysql_create_db));
|
||||
VOID(pthread_mutex_lock(&LOCK_open));
|
||||
|
||||
// do not drop database if another thread is holding read lock
|
||||
if (global_read_lock)
|
||||
{
|
||||
if (thd->global_read_lock)
|
||||
{
|
||||
net_printf(&thd->net, ER_DROP_DB_WITH_READ_LOCK);
|
||||
goto exit;
|
||||
}
|
||||
while (global_read_lock && ! thd->killed)
|
||||
{
|
||||
(void) pthread_cond_wait(&COND_refresh,&LOCK_open);
|
||||
}
|
||||
|
||||
if (thd->killed)
|
||||
{
|
||||
net_printf(&thd->net, ER_SERVER_SHUTDOWN);
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
|
||||
(void) sprintf(path,"%s/%s",mysql_data_home,db);
|
||||
unpack_dirname(path,path); // Convert if not unix
|
||||
/* See if the directory exists */
|
||||
|
|
|
|||
|
|
@ -650,12 +650,9 @@ int yylex(void *arg)
|
|||
if (c == 'e' || c == 'E')
|
||||
{
|
||||
c = yyGet();
|
||||
if (c != '-' && c != '+' && !isdigit(c))
|
||||
{ // No exp sig found
|
||||
state= STATE_CHAR;
|
||||
break;
|
||||
}
|
||||
if (!isdigit(yyGet()))
|
||||
if (c == '-' || c == '+')
|
||||
c = yyGet(); // Skipp sign
|
||||
if (!isdigit(c))
|
||||
{ // No digit after sign
|
||||
state= STATE_CHAR;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -554,6 +554,7 @@ pthread_handler_decl(handle_one_connection,arg)
|
|||
free_root(&thd->mem_root,MYF(0));
|
||||
if (net->error && net->vio != 0)
|
||||
{
|
||||
if (!thd->killed && ! opt_warnings)
|
||||
sql_print_error(ER(ER_NEW_ABORTING_CONNECTION),
|
||||
thd->thread_id,(thd->db ? thd->db : "unconnected"),
|
||||
thd->user ? thd->user : "unauthenticated",
|
||||
|
|
|
|||
|
|
@ -400,7 +400,22 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
|
|||
goto err; /* purecov: inspected */
|
||||
}
|
||||
if (join.const_tables && !thd->locked_tables)
|
||||
{
|
||||
TABLE **table, **end;
|
||||
for (table=join.table, end=table + join.const_tables ;
|
||||
table != end;
|
||||
table++)
|
||||
{
|
||||
/* BDB tables require that we call index_end() before doing an unlock */
|
||||
if ((*table)->key_read)
|
||||
{
|
||||
(*table)->key_read=0;
|
||||
(*table)->file->extra(HA_EXTRA_NO_KEYREAD);
|
||||
}
|
||||
(*table)->file->index_end();
|
||||
}
|
||||
mysql_unlock_some_tables(thd, join.table,join.const_tables);
|
||||
}
|
||||
if (!conds && join.outer_join)
|
||||
{
|
||||
/* Handle the case where we have an OUTER JOIN without a WHERE */
|
||||
|
|
@ -2761,7 +2776,12 @@ return_zero_rows(select_result *result,TABLE_LIST *tables,List<Item> &fields,
|
|||
if (send_row)
|
||||
result->send_data(fields);
|
||||
if (tables) // Not from do_select()
|
||||
{
|
||||
/* Close open cursors */
|
||||
for (TABLE_LIST *table=tables; table ; table=table->next)
|
||||
table->table->file->index_end();
|
||||
result->send_eof(); // Should be safe
|
||||
}
|
||||
}
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -839,18 +839,22 @@ store_create_info(THD *thd, TABLE *table, String *packet)
|
|||
|
||||
for (uint i=0 ; i < table->keys ; i++,key_info++)
|
||||
{
|
||||
KEY_PART_INFO *key_part= key_info->key_part;
|
||||
bool found_primary=0;
|
||||
packet->append(",\n ", 4);
|
||||
|
||||
KEY_PART_INFO *key_part= key_info->key_part;
|
||||
if (i == primary_key)
|
||||
if (i == primary_key && !strcmp(key_info->name,"PRIMARY"))
|
||||
{
|
||||
found_primary=1;
|
||||
packet->append("PRIMARY ", 8);
|
||||
}
|
||||
else if (key_info->flags & HA_NOSAME)
|
||||
packet->append("UNIQUE ", 7);
|
||||
else if (key_info->flags & HA_FULLTEXT)
|
||||
packet->append("FULLTEXT ", 9);
|
||||
packet->append("KEY ", 4);
|
||||
|
||||
if (i != primary_key)
|
||||
if (!found_primary)
|
||||
append_identifier(thd,packet,key_info->name);
|
||||
|
||||
packet->append(" (", 2);
|
||||
|
|
|
|||
|
|
@ -455,8 +455,8 @@ str_to_TIME(const char *str, uint length, TIME *l_time,bool fuzzy_date)
|
|||
if ((date[i]=tmp_value))
|
||||
date_used=1; // Found something
|
||||
if (i == 2 && str != end && *str == 'T')
|
||||
str++; // ISO8601: CCYYMMDDThhmmss
|
||||
else
|
||||
str++; // ISO8601: CCYYMMDDThhmmss
|
||||
else if ( i != 5 ) // Skip inter-field delimiters
|
||||
{
|
||||
while (str != end && (ispunct(*str) || isspace(*str)))
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue