Don't do signal() on windows (Causes instability problems)

Safer, a bit faster filesort.
Code changes to avoid calls to current_thd() (faster code).
Removed all compiler warnings from readline.
This commit is contained in:
monty@hundin.mysql.fi 2001-10-17 19:39:39 +03:00
parent faa51dc285
commit 0bfec316ce
47 changed files with 353 additions and 325 deletions

View File

@ -180,7 +180,6 @@ gmon.out
heap/hp_test1 heap/hp_test1
heap/hp_test2 heap/hp_test2
include/my_config.h include/my_config.h
include/my_global.h
include/mysql_version.h include/mysql_version.h
include/widec.h include/widec.h
innobase/conftest.s1 innobase/conftest.s1

View File

@ -129,7 +129,7 @@ distribution for that version.
@end menu @end menu
@node Introduction, Installing, Top, (dir) @node Introduction, Installing, Top, Top
@chapter General Information About MySQL @chapter General Information About MySQL
@cindex overview @cindex overview
@ -47395,20 +47395,25 @@ features, so that others can follow our development.
Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}. Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}.
@cindex changes, version 4.0
@menu @menu
* News-4.0.1::
* News-4.0.0:: Changes in release 4.0.0 * News-4.0.0:: Changes in release 4.0.0
@end menu @end menu
@node News-4.0.1, News-4.0.0, News-4.0.x, News-4.0.x
@node News-4.0.0, , News-4.0.x, News-4.0.x @appendixsubsec Changes in release 4.0.1
@appendixsubsec Changes in release 4.0.0
@cindex changes, version 4.0
@itemize @bullet @itemize @bullet
@item @item
Added boolean fulltext search code. Added boolean fulltext search code. It should be considered early alpha.
It should be considered early alpha. @end itemize
@node News-4.0.0, , News-4.0.1, News-4.0.x
@appendixsubsec Changes in release 4.0.0
@itemize @bullet
@item @item
Added documentation for @code{libmysqld}, the embedded MySQL server Added documentation for @code{libmysqld}, the embedded MySQL server
library. Also added example programs (a @code{mysql} client and library. Also added example programs (a @code{mysql} client and
@ -47420,6 +47425,9 @@ Removed @code{my_thread_init()} and @code{my_thread_end()}
from mysql_com.h, and added @code{mysql_thread_init()} and from mysql_com.h, and added @code{mysql_thread_init()} and
@code{mysql_thread_end()} to mysql.h. @code{mysql_thread_end()} to mysql.h.
@item @item
Support for communication packets > 16M. In 4.0.1 we will extend MyISAM to
be able to handle these.
@item
Secure connections (with SSL). Secure connections (with SSL).
@item @item
Unsigned @code{BIGINT} constants now work. @code{MIN()} and @code{MAX()} Unsigned @code{BIGINT} constants now work. @code{MIN()} and @code{MAX()}
@ -47436,7 +47444,7 @@ the database, which fixes a problem with InnoDB tables.
@item @item
Added support for @code{UNION}. Added support for @code{UNION}.
@item @item
@code(DELETE) and @code(UPDATE) can now operate on multiple tables. @code{DELETE} can now operate on multiple tables.
@item @item
A new @code{HANDLER} interface to @code{MyISAM} tables. A new @code{HANDLER} interface to @code{MyISAM} tables.
@item @item

View File

@ -608,6 +608,7 @@ gptr alloc_root(MEM_ROOT *mem_root,unsigned int Size);
void free_root(MEM_ROOT *root, myf MyFLAGS); void free_root(MEM_ROOT *root, myf MyFLAGS);
void set_prealloc_root(MEM_ROOT *root, char *ptr); void set_prealloc_root(MEM_ROOT *root, char *ptr);
char *strdup_root(MEM_ROOT *root,const char *str); char *strdup_root(MEM_ROOT *root,const char *str);
char *strmake_root(MEM_ROOT *root,const char *str,uint len);
char *memdup_root(MEM_ROOT *root,const char *str,uint len); char *memdup_root(MEM_ROOT *root,const char *str,uint len);
void load_defaults(const char *conf_file, const char **groups, void load_defaults(const char *conf_file, const char **groups,
int *argc, char ***argv); int *argc, char ***argv);

View File

@ -1310,7 +1310,7 @@ mysql_init(MYSQL *mysql)
after we return if this is not the case. after we return if this is not the case.
*/ */
mysql->rpl_pivot = 1; mysql->rpl_pivot = 1;
#if defined(SIGPIPE) && defined(THREAD) #if defined(SIGPIPE) && defined(THREAD) && !defined(__WIN__)
if (!((mysql)->client_flag & CLIENT_IGNORE_SIGPIPE)) if (!((mysql)->client_flag & CLIENT_IGNORE_SIGPIPE))
(void) signal(SIGPIPE,pipe_sig_handler); (void) signal(SIGPIPE,pipe_sig_handler);
#endif #endif
@ -1351,7 +1351,7 @@ static void mysql_once_init()
mysql_unix_port = env; mysql_unix_port = env;
} }
mysql_debug(NullS); mysql_debug(NullS);
#if defined(SIGPIPE) && !defined(THREAD) #if defined(SIGPIPE) && !defined(THREAD) && !defined(__WIN__)
(void) signal(SIGPIPE,SIG_IGN); (void) signal(SIGPIPE,SIG_IGN);
#endif #endif
} }

View File

@ -195,10 +195,17 @@ void set_prealloc_root(MEM_ROOT *root, char *ptr)
char *strdup_root(MEM_ROOT *root,const char *str) char *strdup_root(MEM_ROOT *root,const char *str)
{ {
uint len= (uint) strlen(str)+1; return strmake_root(root, str, strlen(str));
}
char *strmake_root(MEM_ROOT *root,const char *str, uint len)
{
char *pos; char *pos;
if ((pos=alloc_root(root,len))) if ((pos=alloc_root(root,len+1)))
{
memcpy(pos,str,len); memcpy(pos,str,len);
pos[len]=0;
}
return pos; return pos;
} }

View File

@ -108,7 +108,7 @@ Keymap rl_binding_keymap;
/* Forward declarations */ /* Forward declarations */
void rl_set_keymap_from_edit_mode (); void rl_set_keymap_from_edit_mode ();
static int _rl_read_init_file (); static int _rl_read_init_file (const char *filename, int include_level);
static int glean_key_from_name (); static int glean_key_from_name ();
static int substring_member_of_array (); static int substring_member_of_array ();
@ -570,10 +570,7 @@ rl_named_function (string)
type of the object pointed to. One of ISFUNC (function), ISKMAP (keymap), type of the object pointed to. One of ISFUNC (function), ISKMAP (keymap),
or ISMACR (macro). */ or ISMACR (macro). */
Function * Function *
rl_function_of_keyseq (keyseq, map, type) rl_function_of_keyseq (const char *keyseq, Keymap map, int *type)
char *keyseq;
Keymap map;
int *type;
{ {
register int i; register int i;
@ -629,7 +626,7 @@ rl_function_of_keyseq (keyseq, map, type)
static char *last_readline_init_file = (char *)NULL; static char *last_readline_init_file = (char *)NULL;
/* The file we're currently reading key bindings from. */ /* The file we're currently reading key bindings from. */
static char *current_readline_init_file; static const char *current_readline_init_file;
static int current_readline_init_include_level; static int current_readline_init_include_level;
static int current_readline_init_lineno; static int current_readline_init_lineno;
@ -685,8 +682,8 @@ _rl_read_file (filename, sizep)
/* Re-read the current keybindings file. */ /* Re-read the current keybindings file. */
int int
rl_re_read_init_file (count, ignore) rl_re_read_init_file (int count __attribute__((unused)),
int count, ignore; int ignore __attribute__((unused)))
{ {
int r; int r;
r = rl_read_init_file ((char *)NULL); r = rl_read_init_file ((char *)NULL);
@ -702,8 +699,7 @@ rl_re_read_init_file (count, ignore)
If the file existed and could be opened and read, 0 is returned, If the file existed and could be opened and read, 0 is returned,
otherwise errno is returned. */ otherwise errno is returned. */
int int
rl_read_init_file (filename) rl_read_init_file (const char *filename)
char *filename;
{ {
/* Default the filename. */ /* Default the filename. */
if (filename == 0) if (filename == 0)
@ -722,9 +718,7 @@ rl_read_init_file (filename)
} }
static int static int
_rl_read_init_file (filename, include_level) _rl_read_init_file (const char *filename, int include_level)
char *filename;
int include_level;
{ {
register int i; register int i;
char *buffer, *openname, *line, *end; char *buffer, *openname, *line, *end;
@ -797,7 +791,7 @@ _rl_init_file_error (msg)
/* Conditionals. */ /* Conditionals. */
/* Calling programs set this to have their argv[0]. */ /* Calling programs set this to have their argv[0]. */
char *rl_readline_name = "other"; const char *rl_readline_name = "other";
/* Stack of previous values of parsing_conditionalized_out. */ /* Stack of previous values of parsing_conditionalized_out. */
static unsigned char *if_stack = (unsigned char *)NULL; static unsigned char *if_stack = (unsigned char *)NULL;
@ -881,7 +875,7 @@ parser_if (args)
/* Invert the current parser state if there is anything on the stack. */ /* Invert the current parser state if there is anything on the stack. */
static int static int
parser_else (args) parser_else (args)
char *args; char *args __attribute__((unused));
{ {
register int i; register int i;
@ -906,7 +900,7 @@ parser_else (args)
_rl_parsing_conditionalized_out from the stack. */ _rl_parsing_conditionalized_out from the stack. */
static int static int
parser_endif (args) parser_endif (args)
char *args; char *args __attribute__((unused));
{ {
if (if_stack_depth) if (if_stack_depth)
_rl_parsing_conditionalized_out = if_stack[--if_stack_depth]; _rl_parsing_conditionalized_out = if_stack[--if_stack_depth];
@ -919,7 +913,8 @@ static int
parser_include (args) parser_include (args)
char *args; char *args;
{ {
char *old_init_file, *e; const char *old_init_file;
char *e;
int old_line_number, old_include_level, r; int old_line_number, old_include_level, r;
if (_rl_parsing_conditionalized_out) if (_rl_parsing_conditionalized_out)
@ -943,7 +938,7 @@ parser_include (args)
/* Associate textual names with actual functions. */ /* Associate textual names with actual functions. */
static struct { static struct {
char *name; const char *name;
Function *function; Function *function;
} parser_directives [] = { } parser_directives [] = {
{ "if", parser_if }, { "if", parser_if },
@ -1233,7 +1228,7 @@ rl_parse_and_bind (string)
false. */ false. */
static struct { static struct {
char *name; const char *name;
int *value; int *value;
} boolean_varlist [] = { } boolean_varlist [] = {
#if defined (PAREN_MATCHING) #if defined (PAREN_MATCHING)
@ -1384,7 +1379,7 @@ rl_variable_bind (name, value)
For example, `Space' returns ' '. */ For example, `Space' returns ' '. */
typedef struct { typedef struct {
char *name; const char *name;
int value; int value;
} assoc_list; } assoc_list;
@ -1418,7 +1413,7 @@ glean_key_from_name (name)
/* Auxiliary functions to manage keymaps. */ /* Auxiliary functions to manage keymaps. */
static struct { static struct {
char *name; const char *name;
Keymap map; Keymap map;
} keymap_names[] = { } keymap_names[] = {
{ "emacs", emacs_standard_keymap }, { "emacs", emacs_standard_keymap },
@ -1446,7 +1441,7 @@ rl_get_keymap_by_name (name)
return ((Keymap) NULL); return ((Keymap) NULL);
} }
char * const char *
rl_get_keymap_name (map) rl_get_keymap_name (map)
Keymap map; Keymap map;
{ {
@ -1482,7 +1477,7 @@ rl_set_keymap_from_edit_mode ()
#endif /* VI_MODE */ #endif /* VI_MODE */
} }
char * const char *
rl_get_keymap_name_from_edit_mode () rl_get_keymap_name_from_edit_mode ()
{ {
if (rl_editing_mode == emacs_mode) if (rl_editing_mode == emacs_mode)
@ -1780,8 +1775,8 @@ rl_function_dumper (print_readably)
rl_outstream. If an explicit argument is given, then print rl_outstream. If an explicit argument is given, then print
the output in such a way that it can be read back in. */ the output in such a way that it can be read back in. */
int int
rl_dump_functions (count, key) rl_dump_functions (int count __attribute__((unused)),
int count, key; int key __attribute__((unused)))
{ {
if (rl_dispatching) if (rl_dispatching)
fprintf (rl_outstream, "\r\n"); fprintf (rl_outstream, "\r\n");
@ -1865,8 +1860,8 @@ rl_macro_dumper (print_readably)
} }
int int
rl_dump_macros (count, key) rl_dump_macros (int count __attribute__((unused)),
int count, key; int key __attribute__((unused)))
{ {
if (rl_dispatching) if (rl_dispatching)
fprintf (rl_outstream, "\r\n"); fprintf (rl_outstream, "\r\n");
@ -1880,7 +1875,7 @@ rl_variable_dumper (print_readably)
int print_readably; int print_readably;
{ {
int i; int i;
char *kname; const char *kname;
for (i = 0; boolean_varlist[i].name; i++) for (i = 0; boolean_varlist[i].name; i++)
{ {
@ -1955,8 +1950,8 @@ rl_variable_dumper (print_readably)
rl_outstream. If an explicit argument is given, then print rl_outstream. If an explicit argument is given, then print
the output in such a way that it can be read back in. */ the output in such a way that it can be read back in. */
int int
rl_dump_variables (count, key) rl_dump_variables (int count __attribute__((unused)),
int count, key; int key __attribute__((unused)))
{ {
if (rl_dispatching) if (rl_dispatching)
fprintf (rl_outstream, "\r\n"); fprintf (rl_outstream, "\r\n");

View File

@ -95,7 +95,7 @@ extern int rl_display_fixed;
VFunction *rl_completion_display_matches_hook = (VFunction *)NULL; VFunction *rl_completion_display_matches_hook = (VFunction *)NULL;
/* Forward declarations for functions defined and used in this file. */ /* Forward declarations for functions defined and used in this file. */
char *filename_completion_function (); char *filename_completion_function (const char *text, int state);
char **completion_matches (); char **completion_matches ();
#if defined (VISIBLE_STATS) #if defined (VISIBLE_STATS)
@ -186,15 +186,15 @@ int rl_completion_query_items = 100;
/* The basic list of characters that signal a break between words for the /* The basic list of characters that signal a break between words for the
completer routine. The contents of this variable is what breaks words completer routine. The contents of this variable is what breaks words
in the shell, i.e. " \t\n\"\\'`@$><=" */ in the shell, i.e. " \t\n\"\\'`@$><=" */
char *rl_basic_word_break_characters = " \t\n\"\\'`@$><=;|&{("; const char *rl_basic_word_break_characters = " \t\n\"\\'`@$><=;|&{(";
/* List of basic quoting characters. */ /* List of basic quoting characters. */
char *rl_basic_quote_characters = "\"'"; const char *rl_basic_quote_characters = "\"'";
/* The list of characters that signal a break between words for /* The list of characters that signal a break between words for
rl_complete_internal. The default list is the contents of rl_complete_internal. The default list is the contents of
rl_basic_word_break_characters. */ rl_basic_word_break_characters. */
char *rl_completer_word_break_characters = (char *)NULL; const char *rl_completer_word_break_characters = (char *)NULL;
/* List of characters which can be used to quote a substring of the line. /* List of characters which can be used to quote a substring of the line.
Completion occurs on the entire substring, and within the substring Completion occurs on the entire substring, and within the substring
@ -513,7 +513,7 @@ print_filename (to_print, full_pathname)
static char * static char *
rl_quote_filename (s, rtype, qcp) rl_quote_filename (s, rtype, qcp)
char *s; char *s;
int rtype; int rtype __attribute__((unused));
char *qcp; char *qcp;
{ {
char *r; char *r;
@ -1356,9 +1356,7 @@ rl_complete_internal (what_to_do)
when there are no more matches. when there are no more matches.
*/ */
char ** char **
completion_matches (text, entry_function) completion_matches (const char *text, CPFunction *entry_function)
char *text;
CPFunction *entry_function;
{ {
/* Number of slots in match_list. */ /* Number of slots in match_list. */
int match_list_size; int match_list_size;
@ -1403,9 +1401,7 @@ completion_matches (text, entry_function)
TEXT contains a partial username preceded by a random TEXT contains a partial username preceded by a random
character (usually `~'). */ character (usually `~'). */
char * char *
username_completion_function (text, state) username_completion_function (const char *text, int state)
char *text;
int state;
{ {
#if defined (__GO32__) || defined (__WIN__) || defined (__OPENNT) #if defined (__GO32__) || defined (__WIN__) || defined (__OPENNT)
return (char *)NULL; return (char *)NULL;
@ -1460,9 +1456,7 @@ username_completion_function (text, state)
because of all the pathnames that must be followed when looking up the because of all the pathnames that must be followed when looking up the
completion for a command. */ completion for a command. */
char * char *
filename_completion_function (text, state) filename_completion_function (const char *text, int state)
char *text;
int state;
{ {
static DIR *directory = (DIR *)NULL; static DIR *directory = (DIR *)NULL;
static char *filename = (char *)NULL; static char *filename = (char *)NULL;
@ -1639,8 +1633,7 @@ filename_completion_function (text, state)
hit the end of the match list, we restore the original unmatched text, hit the end of the match list, we restore the original unmatched text,
ring the bell, and reset the counter to zero. */ ring the bell, and reset the counter to zero. */
int int
rl_menu_complete (count, ignore) rl_menu_complete (int count, int ignore __attribute__((unused)))
int count, ignore;
{ {
Function *our_func; Function *our_func;
int matching_filenames, found_quote; int matching_filenames, found_quote;

View File

@ -79,9 +79,9 @@ extern int _rl_output_character_function ();
#endif #endif
extern int _rl_backspace (); extern int _rl_backspace ();
extern char *term_clreol, *term_clrpag; extern const char *term_clreol, *term_clrpag;
extern char *term_im, *term_ic, *term_ei, *term_DC; extern const char *term_im, *term_ic, *term_ei, *term_DC;
extern char *term_up, *term_dc, *term_cr, *term_IC; extern const char *term_up, *term_dc, *term_cr, *term_IC;
extern int screenheight, screenwidth, screenchars; extern int screenheight, screenwidth, screenchars;
extern int terminal_can_insert, _rl_term_autowrap; extern int terminal_can_insert, _rl_term_autowrap;
@ -141,7 +141,7 @@ int _rl_suppress_redisplay = 0;
/* The stuff that gets printed out before the actual text of the line. /* The stuff that gets printed out before the actual text of the line.
This is usually pointing to rl_prompt. */ This is usually pointing to rl_prompt. */
char *rl_display_prompt = (char *)NULL; const char *rl_display_prompt = (char *)NULL;
/* Pseudo-global variables declared here. */ /* Pseudo-global variables declared here. */
/* The visible cursor position. If you print some text, adjust this. */ /* The visible cursor position. If you print some text, adjust this. */
@ -315,7 +315,7 @@ rl_redisplay ()
register char *line; register char *line;
int c_pos, inv_botlin, lb_botlin, lb_linenum; int c_pos, inv_botlin, lb_botlin, lb_linenum;
int newlines, lpos, temp; int newlines, lpos, temp;
char *prompt_this_line; const char *prompt_this_line;
if (!readline_echoing_p) if (!readline_echoing_p)
return; return;
@ -1229,8 +1229,7 @@ rl_message (va_alist)
} }
#else /* !USE_VARARGS */ #else /* !USE_VARARGS */
int int
rl_message (format, arg1, arg2) rl_message (char *format, void *arg1, void *arg2)
char *format;
{ {
sprintf (msg_buf, format, arg1, arg2); sprintf (msg_buf, format, arg1, arg2);
rl_display_prompt = msg_buf; rl_display_prompt = msg_buf;
@ -1512,7 +1511,8 @@ cr ()
void void
_rl_redisplay_after_sigwinch () _rl_redisplay_after_sigwinch ()
{ {
char *t, *oldp, *oldl, *oldlprefix; char *t, *oldl, *oldlprefix;
const char *oldp;
/* Clear the current line and put the cursor at column 0. Make sure /* Clear the current line and put the cursor at column 0. Make sure
the right thing happens if we have wrapped to a new screen line. */ the right thing happens if we have wrapped to a new screen line. */

View File

@ -180,9 +180,7 @@ static FUNMAP default_funmap[] = {
}; };
int int
rl_add_funmap_entry (name, function) rl_add_funmap_entry (const char *name, Function *function)
char *name;
Function *function;
{ {
if (funmap_entry + 2 >= funmap_size) if (funmap_entry + 2 >= funmap_size)
{ {
@ -236,7 +234,7 @@ rl_funmap_names ()
result = (char **)xrealloc (result, result_size * sizeof (char *)); result = (char **)xrealloc (result, result_size * sizeof (char *));
} }
result[result_index] = funmap[result_index]->name; result[result_index] = (char*) funmap[result_index]->name;
result[result_index + 1] = (char *)NULL; result[result_index + 1] = (char *)NULL;
} }
@ -245,10 +243,10 @@ rl_funmap_names ()
} }
/* Things that mean `Control'. */ /* Things that mean `Control'. */
char *possible_control_prefixes[] = { const char *possible_control_prefixes[] = {
"Control-", "C-", "CTRL-", (char *)NULL "Control-", "C-", "CTRL-", (char *)NULL
}; };
char *possible_meta_prefixes[] = { const char *possible_meta_prefixes[] = {
"Meta", "M-", (char *)NULL "Meta", "M-", (char *)NULL
}; };

View File

@ -87,7 +87,7 @@ char history_comment_char = '\0';
/* The list of characters which inhibit the expansion of text if found /* The list of characters which inhibit the expansion of text if found
immediately following history_expansion_char. */ immediately following history_expansion_char. */
char *history_no_expand_chars = " \t\n\r="; const char *history_no_expand_chars = " \t\n\r=";
/* If set to a non-zero value, single quotes inhibit history expansion. /* If set to a non-zero value, single quotes inhibit history expansion.
The default is 0. */ The default is 0. */
@ -342,7 +342,8 @@ hist_error(s, start, current, errtype)
char *s; char *s;
int start, current, errtype; int start, current, errtype;
{ {
char *temp, *emsg; char *temp;
const char *emsg;
int ll, elen; int ll, elen;
ll = current - start; ll = current - start;

View File

@ -84,7 +84,8 @@ static char *
history_filename (filename) history_filename (filename)
char *filename; char *filename;
{ {
char *return_val, *home; char *return_val;
const char *home;
int home_len; int home_len;
return_val = filename ? savestring (filename) : (char *)NULL; return_val = filename ? savestring (filename) : (char *)NULL;
@ -130,11 +131,10 @@ read_history_range (filename, from, to)
char *filename; char *filename;
int from, to; int from, to;
{ {
register int line_start, line_end;
char *input, *buffer; char *input, *buffer;
int file, current_line; int file, current_line;
struct stat finfo; struct stat finfo;
size_t file_size; size_t line_start, line_end, file_size;
buffer = (char *)NULL; buffer = (char *)NULL;
input = history_filename (filename); input = history_filename (filename);

View File

@ -232,8 +232,8 @@ extern int max_input_history;
extern char history_expansion_char; extern char history_expansion_char;
extern char history_subst_char; extern char history_subst_char;
extern char history_comment_char; extern char history_comment_char;
extern char *history_no_expand_chars; extern const char *history_no_expand_chars;
extern char *history_search_delimiter_chars; extern const char *history_search_delimiter_chars;
extern int history_quotes_inhibit_expansion; extern int history_quotes_inhibit_expansion;
/* If set, this function is called to decide whether or not a particular /* If set, this function is called to decide whether or not a particular

View File

@ -52,7 +52,7 @@ extern int history_offset;
/* The list of alternate characters that can delimit a history search /* The list of alternate characters that can delimit a history search
string. */ string. */
char *history_search_delimiter_chars = (char *)NULL; const char *history_search_delimiter_chars = (char *)NULL;
/* Search the history for STRING, starting at history_offset. /* Search the history for STRING, starting at history_offset.
If DIRECTION < 0, then the search is through previous entries, else If DIRECTION < 0, then the search is through previous entries, else

View File

@ -97,7 +97,8 @@ rl_forward_search_history (sign, key)
static void static void
rl_display_search (search_string, reverse_p, where) rl_display_search (search_string, reverse_p, where)
char *search_string; char *search_string;
int reverse_p, where; int reverse_p;
int where __attribute__((unused));
{ {
char *message; char *message;
int msglen, searchlen; int msglen, searchlen;
@ -144,8 +145,7 @@ rl_display_search (search_string, reverse_p, where)
DIRECTION is which direction to search; >= 0 means forward, < 0 means DIRECTION is which direction to search; >= 0 means forward, < 0 means
backwards. */ backwards. */
static int static int
rl_search_history (direction, invoking_key) rl_search_history (int direction, int invoking_key __attribute__((unused)))
int direction, invoking_key;
{ {
/* The string that the user types in to search for. */ /* The string that the user types in to search for. */
char *search_string; char *search_string;

View File

@ -82,8 +82,7 @@ static int rl_kill_ring_length;
/* How to say that you only want to save a certain amount /* How to say that you only want to save a certain amount
of kill material. */ of kill material. */
int int
rl_set_retained_kills (num) rl_set_retained_kills (int num __attribute__((unused)))
int num;
{ {
return 0; return 0;
} }
@ -285,8 +284,8 @@ rl_backward_kill_line (direction, ignore)
/* Kill the whole line, no matter where point is. */ /* Kill the whole line, no matter where point is. */
int int
rl_kill_full_line (count, ignore) rl_kill_full_line (int count __attribute__((unused)),
int count, ignore; int ignore __attribute__((unused)))
{ {
rl_begin_undo_group (); rl_begin_undo_group ();
rl_point = 0; rl_point = 0;
@ -302,8 +301,7 @@ rl_kill_full_line (count, ignore)
/* This does what C-w does in Unix. We can't prevent people from /* This does what C-w does in Unix. We can't prevent people from
using behaviour that they expect. */ using behaviour that they expect. */
int int
rl_unix_word_rubout (count, key) rl_unix_word_rubout (int count, int key __attribute__((unused)))
int count, key;
{ {
int orig_point; int orig_point;
@ -336,8 +334,8 @@ rl_unix_word_rubout (count, key)
into the line at all, and if you aren't, then you know what you are into the line at all, and if you aren't, then you know what you are
doing. */ doing. */
int int
rl_unix_line_discard (count, key) rl_unix_line_discard (int count __attribute__((unused)),
int count, key; int key __attribute__((unused)))
{ {
if (rl_point == 0) if (rl_point == 0)
ding (); ding ();
@ -374,16 +372,16 @@ region_kill_internal (delete)
/* Copy the text in the region to the kill ring. */ /* Copy the text in the region to the kill ring. */
int int
rl_copy_region_to_kill (count, ignore) rl_copy_region_to_kill (int count __attribute__((unused)),
int count, ignore; int key __attribute__((unused)))
{ {
return (region_kill_internal (0)); return (region_kill_internal (0));
} }
/* Kill the text between the point and mark. */ /* Kill the text between the point and mark. */
int int
rl_kill_region (count, ignore) rl_kill_region (int count __attribute__((unused)),
int count, ignore; int key __attribute__((unused)))
{ {
int r; int r;
@ -445,8 +443,8 @@ rl_copy_backward_word (count, key)
/* Yank back the last killed text. This ignores arguments. */ /* Yank back the last killed text. This ignores arguments. */
int int
rl_yank (count, ignore) rl_yank (int count __attribute__((unused)),
int count, ignore; int key __attribute__((unused)))
{ {
if (rl_kill_ring == 0) if (rl_kill_ring == 0)
{ {
@ -464,8 +462,8 @@ rl_yank (count, ignore)
delete that text from the line, rotate the index down, and delete that text from the line, rotate the index down, and
yank back some other text. */ yank back some other text. */
int int
rl_yank_pop (count, key) rl_yank_pop (int count __attribute__((unused)),
int count, key; int key __attribute__((unused)))
{ {
int l, n; int l, n;

View File

@ -90,7 +90,7 @@ static int current_macro_index;
It is a linked list of string/index for each saved macro. */ It is a linked list of string/index for each saved macro. */
struct saved_macro { struct saved_macro {
struct saved_macro *next; struct saved_macro *next;
char *string; const char *string;
int sindex; int sindex;
}; };
@ -100,11 +100,10 @@ static struct saved_macro *macro_list = (struct saved_macro *)NULL;
/* Set up to read subsequent input from STRING. /* Set up to read subsequent input from STRING.
STRING is free ()'ed when we are done with it. */ STRING is free ()'ed when we are done with it. */
void void
_rl_with_macro_input (string) _rl_with_macro_input (const char *string)
char *string;
{ {
_rl_push_executing_macro (); _rl_push_executing_macro ();
_rl_executing_macro = string; _rl_executing_macro = (char*) string;
executing_macro_index = 0; executing_macro_index = 0;
} }
@ -155,7 +154,7 @@ _rl_pop_executing_macro ()
if (macro_list) if (macro_list)
{ {
macro = macro_list; macro = macro_list;
_rl_executing_macro = macro_list->string; _rl_executing_macro = (char*) macro_list->string;
executing_macro_index = macro_list->sindex; executing_macro_index = macro_list->sindex;
macro_list = macro_list->next; macro_list = macro_list->next;
free (macro); free (macro);
@ -206,8 +205,8 @@ _rl_kill_kbd_macro ()
definition to the end of the existing macro, and start by definition to the end of the existing macro, and start by
re-executing the existing macro. */ re-executing the existing macro. */
int int
rl_start_kbd_macro (ignore1, ignore2) rl_start_kbd_macro (int count __attribute__((unused)),
int ignore1, ignore2; int key __attribute__((unused)))
{ {
if (_rl_defining_kbd_macro) if (_rl_defining_kbd_macro)
{ {
@ -231,8 +230,7 @@ rl_start_kbd_macro (ignore1, ignore2)
A numeric argument says to execute the macro right now, A numeric argument says to execute the macro right now,
that many times, counting the definition as the first time. */ that many times, counting the definition as the first time. */
int int
rl_end_kbd_macro (count, ignore) rl_end_kbd_macro (int count, int ignore __attribute__((unused)))
int count, ignore;
{ {
if (_rl_defining_kbd_macro == 0) if (_rl_defining_kbd_macro == 0)
{ {
@ -251,8 +249,7 @@ rl_end_kbd_macro (count, ignore)
/* Execute the most recently defined keyboard macro. /* Execute the most recently defined keyboard macro.
COUNT says how many times to execute it. */ COUNT says how many times to execute it. */
int int
rl_call_last_kbd_macro (count, ignore) rl_call_last_kbd_macro (int count, int key __attribute__((unused)))
int count, ignore;
{ {
if (current_macro == 0) if (current_macro == 0)
_rl_abort_internal (); _rl_abort_internal ();

View File

@ -129,8 +129,8 @@ extern int _rl_suppress_redisplay;
extern char *rl_display_prompt; extern char *rl_display_prompt;
/* Variables imported from complete.c. */ /* Variables imported from complete.c. */
extern char *rl_completer_word_break_characters; extern const char *rl_completer_word_break_characters;
extern char *rl_basic_word_break_characters; extern const char *rl_basic_word_break_characters;
extern int rl_completion_query_items; extern int rl_completion_query_items;
extern int rl_complete_with_tilde_expansion; extern int rl_complete_with_tilde_expansion;
@ -181,7 +181,7 @@ extern char *xmalloc (), *xrealloc ();
/* */ /* */
/* **************************************************************** */ /* **************************************************************** */
char *rl_library_version = RL_LIBRARY_VERSION; const char *rl_library_version = RL_LIBRARY_VERSION;
/* A pointer to the keymap that is currently in use. /* A pointer to the keymap that is currently in use.
By default, it is the standard emacs keymap. */ By default, it is the standard emacs keymap. */
@ -960,8 +960,7 @@ rl_universal_argument (count, key)
way that you should do insertion. rl_insert () calls this way that you should do insertion. rl_insert () calls this
function. */ function. */
int int
rl_insert_text (string) rl_insert_text (const char *string)
char *string;
{ {
register int i, l = strlen (string); register int i, l = strlen (string);

View File

@ -60,7 +60,7 @@ extern UNDO_LIST *rl_undo_list;
/* The data structure for mapping textual names to code addresses. */ /* The data structure for mapping textual names to code addresses. */
typedef struct _funmap { typedef struct _funmap {
char *name; const char *name;
Function *function; Function *function;
} FUNMAP; } FUNMAP;
@ -286,7 +286,7 @@ extern int rl_translate_keyseq __P((char *, char *, int *));
extern char *rl_untranslate_keyseq __P((int)); extern char *rl_untranslate_keyseq __P((int));
extern Function *rl_named_function __P((char *)); extern Function *rl_named_function __P((char *));
extern Function *rl_function_of_keyseq __P((char *, Keymap, int *)); extern Function *rl_function_of_keyseq __P((const char *, Keymap, int *));
extern void rl_list_funmap_names __P((void)); extern void rl_list_funmap_names __P((void));
extern char **rl_invoking_keyseqs_in_map __P((Function *, Keymap)); extern char **rl_invoking_keyseqs_in_map __P((Function *, Keymap));
@ -296,7 +296,7 @@ extern void rl_function_dumper __P((int));
extern void rl_macro_dumper __P((int)); extern void rl_macro_dumper __P((int));
extern void rl_variable_dumper __P((int)); extern void rl_variable_dumper __P((int));
extern int rl_read_init_file __P((char *)); extern int rl_read_init_file __P((const char *));
extern int rl_parse_and_bind __P((char *)); extern int rl_parse_and_bind __P((char *));
/* Functions for manipulating keymaps. */ /* Functions for manipulating keymaps. */
@ -306,14 +306,14 @@ extern Keymap rl_make_keymap __P((void));
extern void rl_discard_keymap __P((Keymap)); extern void rl_discard_keymap __P((Keymap));
extern Keymap rl_get_keymap_by_name __P((char *)); extern Keymap rl_get_keymap_by_name __P((char *));
extern char *rl_get_keymap_name __P((Keymap)); extern const char *rl_get_keymap_name __P((Keymap));
extern void rl_set_keymap __P((Keymap)); extern void rl_set_keymap __P((Keymap));
extern Keymap rl_get_keymap __P((void)); extern Keymap rl_get_keymap __P((void));
extern void rl_set_keymap_from_edit_mode __P((void)); extern void rl_set_keymap_from_edit_mode __P((void));
extern char *rl_get_keymap_name_from_edit_mode __P((void)); extern const char *rl_get_keymap_name_from_edit_mode __P((void));
/* Functions for manipulating the funmap, which maps command names to functions. */ /* Functions for manipulating the funmap, which maps command names to functions. */
extern int rl_add_funmap_entry __P((char *, Function *)); extern int rl_add_funmap_entry __P((const char *, Function *));
extern void rl_initialize_funmap __P((void)); extern void rl_initialize_funmap __P((void));
extern char **rl_funmap_names __P((void)); extern char **rl_funmap_names __P((void));
@ -351,7 +351,7 @@ extern void rl_save_prompt __P((void));
extern void rl_restore_prompt __P((void)); extern void rl_restore_prompt __P((void));
/* Modifying text. */ /* Modifying text. */
extern int rl_insert_text __P((char *)); extern int rl_insert_text __P((const char *));
extern int rl_delete_text __P((int, int)); extern int rl_delete_text __P((int, int));
extern int rl_kill_text __P((int, int)); extern int rl_kill_text __P((int, int));
extern char *rl_copy_text __P((int, int)); extern char *rl_copy_text __P((int, int));
@ -392,9 +392,9 @@ extern int maybe_replace_line __P((void));
extern int rl_complete_internal __P((int)); extern int rl_complete_internal __P((int));
extern void rl_display_match_list __P((char **, int, int)); extern void rl_display_match_list __P((char **, int, int));
extern char **completion_matches __P((char *, CPFunction *)); extern char **completion_matches __P((const char *, CPFunction *));
extern char *username_completion_function __P((char *, int)); extern char *username_completion_function __P((const char *, int));
extern char *filename_completion_function __P((char *, int)); extern char *filename_completion_function __P((const char *, int));
/* **************************************************************** */ /* **************************************************************** */
/* */ /* */
@ -403,11 +403,11 @@ extern char *filename_completion_function __P((char *, int));
/* **************************************************************** */ /* **************************************************************** */
/* The version of this incarnation of the readline library. */ /* The version of this incarnation of the readline library. */
extern char *rl_library_version; extern const char *rl_library_version;
/* The name of the calling program. You should initialize this to /* The name of the calling program. You should initialize this to
whatever was in argv[0]. It is used when parsing conditionals. */ whatever was in argv[0]. It is used when parsing conditionals. */
extern char *rl_readline_name; extern const char *rl_readline_name;
/* The prompt readline uses. This is set from the argument to /* The prompt readline uses. This is set from the argument to
readline (), and should not be assigned to directly. */ readline (), and should not be assigned to directly. */
@ -506,12 +506,12 @@ extern CPPFunction *rl_attempted_completion_function;
/* The basic list of characters that signal a break between words for the /* The basic list of characters that signal a break between words for the
completer routine. The initial contents of this variable is what completer routine. The initial contents of this variable is what
breaks words in the shell, i.e. "n\"\\'`@$>". */ breaks words in the shell, i.e. "n\"\\'`@$>". */
extern char *rl_basic_word_break_characters; extern const char *rl_basic_word_break_characters;
/* The list of characters that signal a break between words for /* The list of characters that signal a break between words for
rl_complete_internal. The default list is the contents of rl_complete_internal. The default list is the contents of
rl_basic_word_break_characters. */ rl_basic_word_break_characters. */
extern char *rl_completer_word_break_characters; extern const char *rl_completer_word_break_characters;
/* List of characters which can be used to quote a substring of the line. /* List of characters which can be used to quote a substring of the line.
Completion occurs on the entire substring, and within the substring Completion occurs on the entire substring, and within the substring
@ -520,7 +520,7 @@ extern char *rl_completer_word_break_characters;
extern char *rl_completer_quote_characters; extern char *rl_completer_quote_characters;
/* List of quote characters which cause a word break. */ /* List of quote characters which cause a word break. */
extern char *rl_basic_quote_characters; extern const char *rl_basic_quote_characters;
/* List of characters that need to be quoted in filenames by the completer. */ /* List of characters that need to be quoted in filenames by the completer. */
extern char *rl_filename_quote_characters; extern char *rl_filename_quote_characters;

View File

@ -368,13 +368,6 @@ static TIOTYPE otio;
# define OUTPUT_BEING_FLUSHED(tp) 0 # define OUTPUT_BEING_FLUSHED(tp) 0
#endif #endif
static void
rltty_warning (msg)
char *msg;
{
fprintf (stderr, "readline: warning: %s\n", msg);
}
#if defined (_AIX) #if defined (_AIX)
void void
setopost(tp) setopost(tp)
@ -604,8 +597,8 @@ rl_deprep_terminal ()
/* **************************************************************** */ /* **************************************************************** */
int int
rl_restart_output (count, key) rl_restart_output (int count __attribute__((unused)),
int count, key; int key __attribute__((unused)))
{ {
int fildes = fileno (rl_outstream); int fildes = fileno (rl_outstream);
#if defined (TIOCSTART) #if defined (TIOCSTART)
@ -637,8 +630,8 @@ rl_restart_output (count, key)
} }
int int
rl_stop_output (count, key) rl_stop_output (int count __attribute__((unused)),
int count, key; int key __attribute__((unused)))
{ {
int fildes = fileno (rl_instream); int fildes = fileno (rl_instream);

View File

@ -247,8 +247,7 @@ noninc_search (dir, pchar)
/* Search forward through the history list for a string. If the vi-mode /* Search forward through the history list for a string. If the vi-mode
code calls this, KEY will be `?'. */ code calls this, KEY will be `?'. */
int int
rl_noninc_forward_search (count, key) rl_noninc_forward_search (int count __attribute__((unused)), int key)
int count, key;
{ {
noninc_search (1, (key == '?') ? '?' : 0); noninc_search (1, (key == '?') ? '?' : 0);
return 0; return 0;
@ -257,8 +256,7 @@ rl_noninc_forward_search (count, key)
/* Reverse search the history list for a string. If the vi-mode code /* Reverse search the history list for a string. If the vi-mode code
calls this, KEY will be `/'. */ calls this, KEY will be `/'. */
int int
rl_noninc_reverse_search (count, key) rl_noninc_reverse_search (int count __attribute__((unused)), int key)
int count, key;
{ {
noninc_search (-1, (key == '/') ? '/' : 0); noninc_search (-1, (key == '/') ? '/' : 0);
return 0; return 0;
@ -267,8 +265,8 @@ rl_noninc_reverse_search (count, key)
/* Search forward through the history list for the last string searched /* Search forward through the history list for the last string searched
for. If there is no saved search string, abort. */ for. If there is no saved search string, abort. */
int int
rl_noninc_forward_search_again (count, key) rl_noninc_forward_search_again (int count __attribute__((unused)),
int count, key; int key __attribute__((unused)))
{ {
if (!noninc_search_string) if (!noninc_search_string)
{ {
@ -282,8 +280,8 @@ rl_noninc_forward_search_again (count, key)
/* Reverse search in the history list for the last string searched /* Reverse search in the history list for the last string searched
for. If there is no saved search string, abort. */ for. If there is no saved search string, abort. */
int int
rl_noninc_reverse_search_again (count, key) rl_noninc_reverse_search_again (int count __attribute__((unused)),
int count, key; int key __attribute__((unused)))
{ {
if (!noninc_search_string) if (!noninc_search_string)
{ {
@ -352,8 +350,7 @@ rl_history_search_internal (count, direction)
from the start of the line to rl_point. This is a non-incremental from the start of the line to rl_point. This is a non-incremental
search. */ search. */
int int
rl_history_search_forward (count, ignore) rl_history_search_forward (int count, int ignore __attribute__((unused)))
int count, ignore;
{ {
if (count == 0) if (count == 0)
return (0); return (0);
@ -366,8 +363,7 @@ rl_history_search_forward (count, ignore)
from the start of the line to rl_point. This is a non-incremental from the start of the line to rl_point. This is a non-incremental
search. */ search. */
int int
rl_history_search_backward (count, ignore) rl_history_search_backward (int count, int ignore __attribute__((unused)))
int count, ignore;
{ {
if (count == 0) if (count == 0)
return (0); return (0);

View File

@ -26,6 +26,7 @@
# include <config.h> # include <config.h>
#endif #endif
#include <stdio.h>
#include <sys/types.h> #include <sys/types.h>
#if defined (HAVE_UNISTD_H) #if defined (HAVE_UNISTD_H)

View File

@ -99,8 +99,8 @@ char PC, *BC, *UP;
#endif /* __linux__ */ #endif /* __linux__ */
/* Some strings to control terminal actions. These are output by tputs (). */ /* Some strings to control terminal actions. These are output by tputs (). */
char *term_goto, *term_clreol, *term_cr, *term_clrpag, *term_backspace; char *term_goto, *term_clreol, *term_clrpag, *term_backspace;
char *term_pc; char *term_cr, *term_pc;
/* Non-zero if we determine that the terminal can do character insertion. */ /* Non-zero if we determine that the terminal can do character insertion. */
int terminal_can_insert = 0; int terminal_can_insert = 0;
@ -245,8 +245,8 @@ rl_resize_terminal ()
} }
struct _tc_string { struct _tc_string {
char *tc_var; const char *tc_var;
char **tc_value; char **tc_value;
}; };
/* This should be kept sorted, just in case we decide to change the /* This should be kept sorted, just in case we decide to change the
@ -291,7 +291,7 @@ get_term_capabilities (bp)
{ {
register int i; register int i;
for (i = 0; i < NUM_TC_STRINGS; i++) for (i = 0; i < (int) NUM_TC_STRINGS; i++)
*(tc_strings[i].tc_value) = tgetstr (tc_strings[i].tc_var, bp); *(tc_strings[i].tc_value) = tgetstr (tc_strings[i].tc_var, bp);
tcap_initialized = 1; tcap_initialized = 1;
} }
@ -304,7 +304,7 @@ _rl_init_terminal_io (terminal_name)
screenwidth = ScreenCols (); screenwidth = ScreenCols ();
screenheight = ScreenRows (); screenheight = ScreenRows ();
screenchars = screenwidth * screenheight; screenchars = screenwidth * screenheight;
term_cr = "\r"; term_cr = (char*) "\r";
term_im = term_ei = term_ic = term_IC = (char *)NULL; term_im = term_ei = term_ic = term_IC = (char *)NULL;
term_up = term_dc = term_DC = visible_bell = (char *)NULL; term_up = term_dc = term_DC = visible_bell = (char *)NULL;
@ -322,7 +322,8 @@ _rl_init_terminal_io (terminal_name)
return; return;
#else /* !__GO32__ */ #else /* !__GO32__ */
char *term, *buffer; const char *term;
char *buffer;
int tty; int tty;
Keymap xkeymap; Keymap xkeymap;
@ -347,7 +348,7 @@ _rl_init_terminal_io (terminal_name)
screenwidth = 79; screenwidth = 79;
screenheight = 24; screenheight = 24;
screenchars = 79 * 24; screenchars = 79 * 24;
term_cr = "\r"; term_cr = (char*) "\r";
term_im = term_ei = term_ic = term_IC = (char *)NULL; term_im = term_ei = term_ic = term_IC = (char *)NULL;
term_up = term_dc = term_DC = visible_bell = (char *)NULL; term_up = term_dc = term_DC = visible_bell = (char *)NULL;
term_ku = term_kd = term_kl = term_kr = (char *)NULL; term_ku = term_kd = term_kl = term_kr = (char *)NULL;
@ -367,7 +368,7 @@ _rl_init_terminal_io (terminal_name)
UP = term_up; UP = term_up;
if (!term_cr) if (!term_cr)
term_cr = "\r"; term_cr = (char*) "\r";
tty = rl_instream ? fileno (rl_instream) : 0; tty = rl_instream ? fileno (rl_instream) : 0;
@ -427,7 +428,7 @@ rl_get_termcap (cap)
if (tcap_initialized == 0) if (tcap_initialized == 0)
return ((char *)NULL); return ((char *)NULL);
for (i = 0; i < NUM_TC_STRINGS; i++) for (i = 0; i < (int) NUM_TC_STRINGS; i++)
{ {
if (tc_strings[i].tc_var[0] == cap[0] && strcmp (tc_strings[i].tc_var, cap) == 0) if (tc_strings[i].tc_var[0] == cap[0] && strcmp (tc_strings[i].tc_var, cap) == 0)
return *(tc_strings[i].tc_value); return *(tc_strings[i].tc_value);

View File

@ -82,13 +82,13 @@ extern char *get_env_value ();
/* The default value of tilde_additional_prefixes. This is set to /* The default value of tilde_additional_prefixes. This is set to
whitespace preceding a tilde so that simple programs which do not whitespace preceding a tilde so that simple programs which do not
perform any word separation get desired behaviour. */ perform any word separation get desired behaviour. */
static char *default_prefixes[] = static const char *default_prefixes[] =
{ " ~", "\t~", (char *)NULL }; { " ~", "\t~", (char *)NULL };
/* The default value of tilde_additional_suffixes. This is set to /* The default value of tilde_additional_suffixes. This is set to
whitespace or newline so that simple programs which do not whitespace or newline so that simple programs which do not
perform any word separation get desired behaviour. */ perform any word separation get desired behaviour. */
static char *default_suffixes[] = static const char *default_suffixes[] =
{ " ", "\n", (char *)NULL }; { " ", "\n", (char *)NULL };
/* If non-null, this contains the address of a function that the application /* If non-null, this contains the address of a function that the application
@ -106,12 +106,12 @@ CPFunction *tilde_expansion_failure_hook = (CPFunction *)NULL;
/* When non-null, this is a NULL terminated array of strings which /* When non-null, this is a NULL terminated array of strings which
are duplicates for a tilde prefix. Bash uses this to expand are duplicates for a tilde prefix. Bash uses this to expand
`=~' and `:~'. */ `=~' and `:~'. */
char **tilde_additional_prefixes = default_prefixes; const char ** tilde_additional_prefixes = default_prefixes;
/* When non-null, this is a NULL terminated array of strings which match /* When non-null, this is a NULL terminated array of strings which match
the end of a username, instead of just "/". Bash sets this to the end of a username, instead of just "/". Bash sets this to
`:' and `=~'. */ `:' and `=~'. */
char **tilde_additional_suffixes = default_suffixes; const char **tilde_additional_suffixes = default_suffixes;
/* Find the start of a tilde expansion in STRING, and return the index of /* Find the start of a tilde expansion in STRING, and return the index of
the tilde which starts the expansion. Place the length of the text the tilde which starts the expansion. Place the length of the text
@ -122,7 +122,7 @@ tilde_find_prefix (string, len)
int *len; int *len;
{ {
register int i, j, string_len; register int i, j, string_len;
register char **prefixes = tilde_additional_prefixes; register const char **prefixes = tilde_additional_prefixes;
string_len = strlen (string); string_len = strlen (string);
*len = 0; *len = 0;
@ -154,7 +154,7 @@ tilde_find_suffix (string)
char *string; char *string;
{ {
register int i, j, string_len; register int i, j, string_len;
register char **suffixes; register const char **suffixes;
suffixes = tilde_additional_suffixes; suffixes = tilde_additional_suffixes;
string_len = strlen (string); string_len = strlen (string);

View File

@ -48,12 +48,12 @@ extern CPFunction *tilde_expansion_failure_hook;
/* When non-null, this is a NULL terminated array of strings which /* When non-null, this is a NULL terminated array of strings which
are duplicates for a tilde prefix. Bash uses this to expand are duplicates for a tilde prefix. Bash uses this to expand
`=~' and `:~'. */ `=~' and `:~'. */
extern char **tilde_additional_prefixes; extern const char **tilde_additional_prefixes;
/* When non-null, this is a NULL terminated array of strings which match /* When non-null, this is a NULL terminated array of strings which match
the end of a username, instead of just "/". Bash sets this to the end of a username, instead of just "/". Bash sets this to
`:' and `=~'. */ `:' and `=~'. */
extern char **tilde_additional_suffixes; extern const char **tilde_additional_suffixes;
/* Return a new string which is the result of tilde expanding STRING. */ /* Return a new string which is the result of tilde expanding STRING. */
extern char *tilde_expand (); extern char *tilde_expand ();

View File

@ -174,7 +174,7 @@ _rl_fix_last_undo_of_type (type, start, end)
for (rl = rl_undo_list; rl; rl = rl->next) for (rl = rl_undo_list; rl; rl = rl->next)
{ {
if (rl->what == type) if ((int) rl->what == type)
{ {
rl->start = start; rl->start = start;
rl->end = end; rl->end = end;
@ -225,8 +225,8 @@ rl_modifying (start, end)
/* Revert the current line to its previous state. */ /* Revert the current line to its previous state. */
int int
rl_revert_line (count, key) rl_revert_line (int count __attribute__((unused)),
int count, key; int key __attribute__((unused)))
{ {
if (!rl_undo_list) if (!rl_undo_list)
ding (); ding ();
@ -240,8 +240,7 @@ rl_revert_line (count, key)
/* Do some undoing of things that were done. */ /* Do some undoing of things that were done. */
int int
rl_undo_command (count, key) rl_undo_command (int count, int key __attribute__((unused)))
int count, key;
{ {
if (count < 0) if (count < 0)
return 0; /* Nothing to do. */ return 0; /* Nothing to do. */

View File

@ -81,7 +81,7 @@ extern char *xmalloc (), *xrealloc ();
in words, or 1 if it is. */ in words, or 1 if it is. */
int _rl_allow_pathname_alphabetic_chars = 0; int _rl_allow_pathname_alphabetic_chars = 0;
static char *pathname_alphabetic_chars = "/-_=~.#$"; static const char *pathname_alphabetic_chars = "/-_=~.#$";
int int
alphabetic (c) alphabetic (c)
@ -113,15 +113,15 @@ _rl_abort_internal ()
} }
int int
rl_abort (count, key) rl_abort (int count __attribute__((unused)),
int count, key; int key __attribute__((unused)))
{ {
return (_rl_abort_internal ()); return (_rl_abort_internal ());
} }
int int
rl_tty_status (count, key) rl_tty_status (int count __attribute__((unused)),
int count, key; int key __attribute__((unused)))
{ {
#if defined (TIOCSTAT) #if defined (TIOCSTAT)
ioctl (1, TIOCSTAT, (char *)0); ioctl (1, TIOCSTAT, (char *)0);
@ -170,8 +170,8 @@ rl_extend_line_buffer (len)
/* A function for simple tilde expansion. */ /* A function for simple tilde expansion. */
int int
rl_tilde_expand (ignore, key) rl_tilde_expand (int ignore __attribute__((unused)),
int ignore, key; int key __attribute__((unused)))
{ {
register int start, end; register int start, end;
char *homedir, *temp; char *homedir, *temp;

View File

@ -98,7 +98,7 @@ extern int rl_vi_check ();
static int _rl_vi_doing_insert; static int _rl_vi_doing_insert;
/* Command keys which do movement for xxx_to commands. */ /* Command keys which do movement for xxx_to commands. */
static char *vi_motion = " hl^$0ftFt;,%wbeWBE|"; static const char *vi_motion = " hl^$0ftFt;,%wbeWBE|";
/* Keymap used for vi replace characters. Created dynamically since /* Keymap used for vi replace characters. Created dynamically since
rarely used. */ rarely used. */
@ -126,7 +126,7 @@ static int _rl_vi_last_key_before_insert;
static int vi_redoing; static int vi_redoing;
/* Text modification commands. These are the `redoable' commands. */ /* Text modification commands. These are the `redoable' commands. */
static char *vi_textmod = "_*\\AaIiCcDdPpYyRrSsXx~"; static const char *vi_textmod = "_*\\AaIiCcDdPpYyRrSsXx~";
/* Arrays for the saved marks. */ /* Arrays for the saved marks. */
static int vi_mark_chars[27]; static int vi_mark_chars[27];

View File

@ -145,7 +145,8 @@ sub new
$limits{'join_optimizer'} = 1; # Can optimize FROM tables $limits{'join_optimizer'} = 1; # Can optimize FROM tables
$limits{'left_outer_join'} = 1; # Supports left outer joins $limits{'left_outer_join'} = 1; # Supports left outer joins
$limits{'like_with_column'} = 1; # Can use column1 LIKE column2 $limits{'like_with_column'} = 1; # Can use column1 LIKE column2
$limits{'limit'} = 1; # supports the limit attribute $limits{'limit'} = 1; # supports the limit attribute
$limits{'truncate_table'} = 1;
$limits{'load_data_infile'} = 1; # Has load data infile $limits{'load_data_infile'} = 1; # Has load data infile
$limits{'lock_tables'} = 1; # Has lock tables $limits{'lock_tables'} = 1; # Has lock tables
$limits{'max_column_name'} = 64; # max table and column name $limits{'max_column_name'} = 64; # max table and column name
@ -604,6 +605,7 @@ sub new
$limits{'select_without_from'}= 1; $limits{'select_without_from'}= 1;
$limits{'subqueries'} = 1; $limits{'subqueries'} = 1;
$limits{'table_wildcard'} = 1; $limits{'table_wildcard'} = 1;
$limits{'truncate_table'} = 1;
$limits{'unique_index'} = 1; # Unique index works or not $limits{'unique_index'} = 1; # Unique index works or not
$limits{'working_all_fields'} = 1; $limits{'working_all_fields'} = 1;
$limits{'working_blobs'} = 1; # If big varchar/blobs works $limits{'working_blobs'} = 1; # If big varchar/blobs works
@ -1386,6 +1388,7 @@ sub new
$limits{'max_index_parts'} = 16; # Max segments/key $limits{'max_index_parts'} = 16; # Max segments/key
$limits{'max_column_name'} = 32; # max table and column name $limits{'max_column_name'} = 32; # max table and column name
$limits{'truncate_table'} = 1;
$limits{'join_optimizer'} = 1; # Can optimize FROM tables $limits{'join_optimizer'} = 1; # Can optimize FROM tables
$limits{'load_data_infile'} = 0; # Has load data infile $limits{'load_data_infile'} = 0; # Has load data infile
$limits{'lock_tables'} = 0; # Has lock tables $limits{'lock_tables'} = 0; # Has lock tables

View File

@ -1173,7 +1173,7 @@ if (!$opt_skip_delete)
} }
$end_time=new Benchmark; $end_time=new Benchmark;
print "Time for delete_all ($count): " . print "Time for delete_range ($count): " .
timestr(timediff($end_time, $loop_time),"all") . "\n\n"; timestr(timediff($end_time, $loop_time),"all") . "\n\n";
if ($opt_lock_tables) if ($opt_lock_tables)
@ -1209,6 +1209,7 @@ print "Insert into table with $keys keys and with a primary key with $seg parts\
# Make keys on the most important types # Make keys on the most important types
@types=(0,0,0,1,0,0,0,1,1,1,1,1,1,1,1,1,1); # A 1 for each char field @types=(0,0,0,1,0,0,0,1,1,1,1,1,1,1,1,1,1); # A 1 for each char field
push(@fields,"field1 tinyint not null"); push(@fields,"field1 tinyint not null");
push(@fields,"field_search tinyint not null");
push(@fields,"field2 mediumint not null"); push(@fields,"field2 mediumint not null");
push(@fields,"field3 smallint not null"); push(@fields,"field3 smallint not null");
push(@fields,"field4 char(16) not null"); push(@fields,"field4 char(16) not null");
@ -1228,9 +1229,10 @@ for ($i= 1 ; $i <= $seg ; $i++)
} }
substr($query,-1)=")"; substr($query,-1)=")";
push (@keys,$query); push (@keys,$query);
push (@keys,"index index2 (field_search)");
#Create other keys #Create other keys
for ($i=2 ; $i <= $keys ; $i++) for ($i=3 ; $i <= $keys ; $i++)
{ {
push(@keys,"index index$i (field$i)"); push(@keys,"index index$i (field$i)");
} }
@ -1256,11 +1258,11 @@ if (($opt_fast || $opt_fast_insert) && $server->{'limits'}->{'insert_multi_value
$res=$query; $res=$query;
for ($i=0; $i < $many_keys_loop_count; $i++) for ($i=0; $i < $many_keys_loop_count; $i++)
{ {
$id= $i & 127;
$rand=$random[$i]; $rand=$random[$i];
$tmp="(" . ($i & 127) . ",$rand," . ($i & 32766) . $tmp="($id,$id,$rand," . ($i & 32766) . ",'ABCDEF$rand',0,";
",'ABCDEF$rand',0,";
for ($j=5; $j <= $fields ; $j++) for ($j=6; $j <= $fields ; $j++)
{ {
$tmp.= ($types[$j] == 0) ? "$rand," : "'$rand',"; $tmp.= ($types[$j] == 0) ? "$rand," : "'$rand',";
} }
@ -1281,11 +1283,12 @@ else
{ {
for ($i=0; $i < $many_keys_loop_count; $i++) for ($i=0; $i < $many_keys_loop_count; $i++)
{ {
$id= $i & 127;
$rand=$random[$i]; $rand=$random[$i];
$query="insert into bench1 values (" . ($i & 127) . ",$rand," . ($i & 32767) . $query="insert into bench1 values ($id,$id,$rand," . ($i & 32767) .
",'ABCDEF$rand',0,"; ",'ABCDEF$rand',0,";
for ($j=5; $j <= $fields ; $j++) for ($j=6; $j <= $fields ; $j++)
{ {
$query.= ($types[$j] == 0) ? "$rand," : "'$rand',"; $query.= ($types[$j] == 0) ? "$rand," : "'$rand',";
} }
@ -1324,8 +1327,8 @@ print "Testing update of keys\n";
$loop_time=new Benchmark; $loop_time=new Benchmark;
for ($i=0 ; $i< 256; $i++) for ($i=0 ; $i< 256; $i++)
{ {
$dbh->do("update bench1 set field5=1 where field1=$i") $dbh->do("update bench1 set field5=1 where field_search=$i")
or die "Got error $DBI::errstr with query: update bench1 set field5=1 where field1=$i\n"; or die "Got error $DBI::errstr with query: update bench1 set field5=1 where field_search=$i\n";
} }
$end_time=new Benchmark; $end_time=new Benchmark;
print "Time for update_of_primary_key_many_keys (256): " . print "Time for update_of_primary_key_many_keys (256): " .
@ -1366,29 +1369,31 @@ $count=0;
for ($i=0 ; $i < 128 ; $i++) for ($i=0 ; $i < 128 ; $i++)
{ {
$count++; $count++;
$dbh->do("delete from bench1 where field1 = $i") or die $DBI::errstr; $dbh->do("delete from bench1 where field_search = $i") or die $DBI::errstr;
} }
$end_time=new Benchmark; $end_time=new Benchmark;
print "Time for delete_big_many_keys ($count): " . print "Time for delete_big_many_keys ($count): " .
timestr(timediff($end_time, $loop_time),"all") . "\n\n"; timestr(timediff($end_time, $loop_time),"all") . "\n\n";
if ($opt_lock_tables)
{
$sth = $dbh->do("UNLOCK TABLES") || die $DBI::errstr;
}
print "Deleting everything from table\n"; print "Deleting everything from table\n";
$count=1; $count=1;
if ($opt_fast) if ($opt_fast)
{ {
$dbh->do("delete from bench1") or die $DBI::errstr; $query= ($limits->{'truncate_table'} ? "truncate table bench1" :
"delete from bench1");
$dbh->do($query) or die $DBI::errstr;
} }
else else
{ {
$dbh->do("delete from bench1 where field1 > 0") or die $DBI::errstr; $dbh->do("delete from bench1 where field1 > 0") or die $DBI::errstr;
} }
if ($opt_lock_tables)
{
$sth = $dbh->do("UNLOCK TABLES") || die $DBI::errstr;
}
$end_time=new Benchmark; $end_time=new Benchmark;
print "Time for delete_all_many_keys ($count): " . print "Time for delete_all_many_keys ($count): " .
timestr(timediff($end_time, $loop_time),"all") . "\n\n"; timestr(timediff($end_time, $loop_time),"all") . "\n\n";

View File

@ -48,27 +48,36 @@ init_query();
print "Wisconsin benchmark test\n\n"; print "Wisconsin benchmark test\n\n";
if (!$opt_skip_create) if ($opt_skip_create)
{ {
$loop_time= new Benchmark; if ($opt_lock_tables)
for($ti = 0; $ti <= $#table_names; $ti++)
{ {
my $table_name = $table_names[$ti]; @tmp=@table_names; push(@tmp,@extra_names);
my $array_ref = $tables[$ti]; $sth = $dbh->do("LOCK TABLES " . join(" WRITE,", @tmp) . " WRITE") ||
die $DBI::errstr;
# This may fail if we have no table so do not check answer
$sth = $dbh->do("drop table $table_name" . $server->{'drop_attr'});
print "Creating table $table_name\n" if ($opt_verbose);
do_many($dbh,@$array_ref);
} }
$end_time=new Benchmark; goto start_benchmark;
print "Time for create_table ($#tables): " . }
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
if ($opt_fast && defined($server->{vacuum})) $loop_time= new Benchmark;
{ for($ti = 0; $ti <= $#table_names; $ti++)
$server->vacuum(1,\$dbh); {
} my $table_name = $table_names[$ti];
my $array_ref = $tables[$ti];
# This may fail if we have no table so do not check answer
$sth = $dbh->do("drop table $table_name" . $server->{'drop_attr'});
print "Creating table $table_name\n" if ($opt_verbose);
do_many($dbh,@$array_ref);
}
$end_time=new Benchmark;
print "Time for create_table ($#tables): " .
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
if ($opt_fast && defined($server->{vacuum}))
{
$server->vacuum(1,\$dbh);
}
#### ####
@ -159,13 +168,6 @@ $sth = $dbh->do("delete from Bprime where Bprime.unique2 >= 1000") or
$end_time=new Benchmark; $end_time=new Benchmark;
print "Time to delete_big (1): " . print "Time to delete_big (1): " .
timestr(timediff($end_time, $loop_time),"all") . "\n\n"; timestr(timediff($end_time, $loop_time),"all") . "\n\n";
}
elsif ($opt_lock_tables)
{
@tmp=@table_names; push(@tmp,@extra_names);
$sth = $dbh->do("LOCK TABLES " . join(" WRITE,", @tmp) . " WRITE") ||
die $DBI::errstr;
}
if ($opt_fast && defined($server->{vacuum})) if ($opt_fast && defined($server->{vacuum}))
{ {
@ -176,7 +178,9 @@ if ($opt_fast && defined($server->{vacuum}))
#### Running the benchmark #### Running the benchmark
#### ####
print "Running actual benchmark\n"; start_benchmark:
print "Running the actual benchmark\n";
$loop_time= new Benchmark; $loop_time= new Benchmark;
$count=0; $count=0;

View File

@ -248,7 +248,7 @@ void Field::copy_from_tmp(int row_offset)
} }
bool Field::send(String *packet) bool Field::send(THD *thd, String *packet)
{ {
if (is_null()) if (is_null())
return net_store_null(packet); return net_store_null(packet);
@ -256,7 +256,7 @@ bool Field::send(String *packet)
String tmp(buff,sizeof(buff)); String tmp(buff,sizeof(buff));
val_str(&tmp,&tmp); val_str(&tmp,&tmp);
CONVERT *convert; CONVERT *convert;
if ((convert=current_thd->convert_set)) if ((convert=thd->convert_set))
return convert->store(packet,tmp.ptr(),tmp.length()); return convert->store(packet,tmp.ptr(),tmp.length());
return net_store_data(packet,tmp.ptr(),tmp.length()); return net_store_data(packet,tmp.ptr(),tmp.length());
} }

View File

@ -154,7 +154,7 @@ public:
ptr-=row_offset; ptr-=row_offset;
return tmp; return tmp;
} }
bool send(String *packet); bool send(THD *thd, String *packet);
virtual char *pack(char* to, const char *from, uint max_length=~(uint) 0) virtual char *pack(char* to, const char *from, uint max_length=~(uint) 0)
{ {
uint length=pack_length(); uint length=pack_length();

View File

@ -37,15 +37,13 @@ if (my_b_write((file),(byte*) (from),param->ref_length)) \
/* functions defined in this file */ /* functions defined in this file */
static char **make_char_array(register uint fields, uint length, myf my_flag); static char **make_char_array(register uint fields, uint length, myf my_flag);
static BUFFPEK *read_buffpek_from_file(IO_CACHE *buffer_file, uint count);
static ha_rows find_all_keys(SORTPARAM *param,SQL_SELECT *select, static ha_rows find_all_keys(SORTPARAM *param,SQL_SELECT *select,
uchar * *sort_keys, uchar * *sort_keys, IO_CACHE *buffer_file,
BUFFPEK *buffpek,uint *maxbuffer,
IO_CACHE *tempfile,IO_CACHE *indexfile); IO_CACHE *tempfile,IO_CACHE *indexfile);
static int write_keys(SORTPARAM *param,uchar * *sort_keys, static int write_keys(SORTPARAM *param,uchar * *sort_keys,
uint count,BUFFPEK *buffpek, uint count, IO_CACHE *buffer_file, IO_CACHE *tempfile);
IO_CACHE *tempfile); static void make_sortkey(SORTPARAM *param,uchar *to, byte *ref_pos);
static void make_sortkey(SORTPARAM *param,uchar *to,
byte *ref_pos);
static int merge_index(SORTPARAM *param,uchar *sort_buffer, static int merge_index(SORTPARAM *param,uchar *sort_buffer,
BUFFPEK *buffpek, BUFFPEK *buffpek,
uint maxbuffer,IO_CACHE *tempfile, uint maxbuffer,IO_CACHE *tempfile,
@ -70,11 +68,12 @@ ha_rows filesort(TABLE *table, SORT_FIELD *sortorder, uint s_length,
ha_rows *examined_rows) ha_rows *examined_rows)
{ {
int error; int error;
uint memavl,old_memavl,maxbuffer,skr; ulong memavl;
uint maxbuffer,skr;
BUFFPEK *buffpek; BUFFPEK *buffpek;
ha_rows records; ha_rows records;
uchar **sort_keys; uchar **sort_keys;
IO_CACHE tempfile,*selected_records_file,*outfile; IO_CACHE tempfile, buffpek_pointers, *selected_records_file, *outfile;
SORTPARAM param; SORTPARAM param;
DBUG_ENTER("filesort"); DBUG_ENTER("filesort");
DBUG_EXECUTE("info",TEST_filesort(sortorder,s_length,special);); DBUG_EXECUTE("info",TEST_filesort(sortorder,s_length,special););
@ -84,8 +83,10 @@ ha_rows filesort(TABLE *table, SORT_FIELD *sortorder, uint s_length,
outfile= table->io_cache; outfile= table->io_cache;
my_b_clear(&tempfile); my_b_clear(&tempfile);
buffpek= (BUFFPEK *) NULL; sort_keys= (uchar **) NULL; error= 1; my_b_clear(&buffpek_pointers);
maxbuffer=1; buffpek=0;
sort_keys= (uchar **) NULL;
error= 1;
bzero((char*) &param,sizeof(param)); bzero((char*) &param,sizeof(param));
param.ref_length= table->file->ref_length; param.ref_length= table->file->ref_length;
param.sort_length=sortlength(sortorder,s_length)+ param.ref_length; param.sort_length=sortlength(sortorder,s_length)+ param.ref_length;
@ -136,51 +137,34 @@ ha_rows filesort(TABLE *table, SORT_FIELD *sortorder, uint s_length,
memavl=sortbuff_size; memavl=sortbuff_size;
while (memavl >= MIN_SORT_MEMORY) while (memavl >= MIN_SORT_MEMORY)
{ {
if ((ulonglong) (records+1)*(param.sort_length+sizeof(char*))+sizeof(BUFFPEK)*10 < ulong old_memavl;
(ulonglong) memavl) ulong keys= memavl/(param.sort_length+sizeof(char*));
param.keys=(uint) records+1; param.keys=(uint) min(records+1, keys);
else if ((sort_keys= (uchar **) make_char_array(param.keys, param.sort_length,
{
maxbuffer=1;
do
{
skr=maxbuffer;
if (memavl < sizeof(BUFFPEK)*maxbuffer)
{
my_error(ER_OUT_OF_SORTMEMORY,MYF(ME_ERROR+ME_WAITTANG));
goto err;
}
param.keys=(memavl-sizeof(BUFFPEK)*maxbuffer)/
(param.sort_length+sizeof(char*));
}
while ((maxbuffer= (uint) (records/param.keys+1)) != skr);
}
if ((sort_keys= (uchar **) make_char_array(param.keys,param.sort_length,
MYF(0)))) MYF(0))))
if ((buffpek = (BUFFPEK*) my_malloc((uint) sizeof(BUFFPEK)* break;
(maxbuffer+10),
MYF(0))))
break;
else
my_free((gptr) sort_keys,MYF(0));
old_memavl=memavl; old_memavl=memavl;
if ((memavl=memavl/4*3) < MIN_SORT_MEMORY && old_memavl > MIN_SORT_MEMORY) if ((memavl=memavl/4*3) < MIN_SORT_MEMORY && old_memavl > MIN_SORT_MEMORY)
memavl=MIN_SORT_MEMORY; memavl=MIN_SORT_MEMORY;
} }
param.keys--;
maxbuffer+=10; /* Some extra range */
if (memavl < MIN_SORT_MEMORY) if (memavl < MIN_SORT_MEMORY)
{ {
my_error(ER_OUTOFMEMORY,MYF(ME_ERROR+ME_WAITTANG),sortbuff_size); my_error(ER_OUTOFMEMORY,MYF(ME_ERROR+ME_WAITTANG),sortbuff_size);
goto err; goto err;
} }
if (open_cached_file(&buffpek_pointers,mysql_tmpdir,TEMP_PREFIX,
DISK_BUFFER_SIZE, MYF(MY_WME)))
goto err;
param.keys--;
param.sort_form= table; param.sort_form= table;
param.end=(param.local_sortorder=sortorder)+s_length; param.end=(param.local_sortorder=sortorder)+s_length;
if ((records=find_all_keys(&param,select,sort_keys,buffpek,&maxbuffer, if ((records=find_all_keys(&param,select,sort_keys, &buffpek_pointers,
&tempfile, selected_records_file)) == &tempfile, selected_records_file)) ==
HA_POS_ERROR) HA_POS_ERROR)
goto err; goto err;
maxbuffer= my_b_tell(&buffpek_pointers)/sizeof(*buffpek);
if (maxbuffer == 0) // The whole set is in memory if (maxbuffer == 0) // The whole set is in memory
{ {
if (save_index(&param,sort_keys,(uint) records)) if (save_index(&param,sort_keys,(uint) records))
@ -188,6 +172,9 @@ ha_rows filesort(TABLE *table, SORT_FIELD *sortorder, uint s_length,
} }
else else
{ {
if (!(buffpek=read_buffpek_from_file(&buffpek_pointers, maxbuffer)))
goto err;
close_cached_file(&buffpek_pointers);
/* Open cached file if it isn't open */ /* Open cached file if it isn't open */
if (! my_b_inited(outfile) && if (! my_b_inited(outfile) &&
open_cached_file(outfile,mysql_tmpdir,TEMP_PREFIX,READ_RECORD_BUFFER, open_cached_file(outfile,mysql_tmpdir,TEMP_PREFIX,READ_RECORD_BUFFER,
@ -195,8 +182,13 @@ ha_rows filesort(TABLE *table, SORT_FIELD *sortorder, uint s_length,
goto err; goto err;
reinit_io_cache(outfile,WRITE_CACHE,0L,0,0); reinit_io_cache(outfile,WRITE_CACHE,0L,0,0);
/*
Use also the space previously used by string pointers in sort_buffer
for temporary key storage.
*/
param.keys=((param.keys*(param.sort_length+sizeof(char*))) / param.keys=((param.keys*(param.sort_length+sizeof(char*))) /
param.sort_length-1); param.sort_length-1);
maxbuffer--; // Offset from 0
if (merge_many_buff(&param,(uchar*) sort_keys,buffpek,&maxbuffer, if (merge_many_buff(&param,(uchar*) sort_keys,buffpek,&maxbuffer,
&tempfile)) &tempfile))
goto err; goto err;
@ -219,6 +211,7 @@ ha_rows filesort(TABLE *table, SORT_FIELD *sortorder, uint s_length,
x_free((gptr) sort_keys); x_free((gptr) sort_keys);
x_free((gptr) buffpek); x_free((gptr) buffpek);
close_cached_file(&tempfile); close_cached_file(&tempfile);
close_cached_file(&buffpek_pointers);
if (my_b_inited(outfile)) if (my_b_inited(outfile))
{ {
if (flush_io_cache(outfile)) if (flush_io_cache(outfile))
@ -263,11 +256,33 @@ static char **make_char_array(register uint fields, uint length, myf my_flag)
} /* make_char_array */ } /* make_char_array */
/* Read all buffer pointers into memory */
static BUFFPEK *read_buffpek_from_file(IO_CACHE *buffpek_pointers, uint count)
{
ulong length;
BUFFPEK *tmp;
DBUG_ENTER("read_buffpek_from_file");
tmp=(BUFFPEK*) my_malloc(length=sizeof(BUFFPEK)*count, MYF(MY_WME));
if (tmp)
{
if (reinit_io_cache(buffpek_pointers,READ_CACHE,0L,0,0) ||
my_b_read(buffpek_pointers, (char*) tmp, length))
{
my_free((char*) tmp, MYF(0));
tmp=0;
}
}
DBUG_RETURN(tmp);
}
/* Search after sort_keys and place them in a temp. file */ /* Search after sort_keys and place them in a temp. file */
static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select, static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select,
uchar **sort_keys, uchar **sort_keys,
BUFFPEK *buffpek, uint *maxbuffer, IO_CACHE *buffpek_pointers,
IO_CACHE *tempfile, IO_CACHE *indexfile) IO_CACHE *tempfile, IO_CACHE *indexfile)
{ {
int error,flag,quick_select; int error,flag,quick_select;
@ -349,9 +364,8 @@ static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select,
{ {
if (idx == param->keys) if (idx == param->keys)
{ {
if (indexpos >= *maxbuffer || if (write_keys(param,sort_keys,idx,buffpek_pointers,tempfile))
write_keys(param,sort_keys,idx,buffpek+indexpos,tempfile)) DBUG_RETURN(HA_POS_ERROR);
DBUG_RETURN(HA_POS_ERROR);
idx=0; indexpos++; idx=0; indexpos++;
if (param->ref_length == param->sort_length && if (param->ref_length == param->sort_length &&
my_b_tell(tempfile)/param->sort_length >= param->max_rows) my_b_tell(tempfile)/param->sort_length >= param->max_rows)
@ -373,11 +387,9 @@ static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select,
file->print_error(error,MYF(ME_ERROR | ME_WAITTANG)); /* purecov: inspected */ file->print_error(error,MYF(ME_ERROR | ME_WAITTANG)); /* purecov: inspected */
DBUG_RETURN(HA_POS_ERROR); /* purecov: inspected */ DBUG_RETURN(HA_POS_ERROR); /* purecov: inspected */
} }
if (indexpos) if (indexpos &&
if (indexpos >= *maxbuffer || write_keys(param,sort_keys,idx,buffpek_pointers,tempfile))
write_keys(param,sort_keys,idx,buffpek+indexpos,tempfile)) DBUG_RETURN(HA_POS_ERROR); /* purecov: inspected */
DBUG_RETURN(HA_POS_ERROR); /* purecov: inspected */
*maxbuffer=indexpos;
DBUG_RETURN(my_b_inited(tempfile) ? DBUG_RETURN(my_b_inited(tempfile) ?
(ha_rows) (my_b_tell(tempfile)/param->sort_length) : (ha_rows) (my_b_tell(tempfile)/param->sort_length) :
idx); idx);
@ -387,9 +399,10 @@ static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select,
/* Skriver en buffert med nycklar till filen */ /* Skriver en buffert med nycklar till filen */
static int write_keys(SORTPARAM *param, register uchar **sort_keys, uint count, static int write_keys(SORTPARAM *param, register uchar **sort_keys, uint count,
BUFFPEK *buffpek, IO_CACHE *tempfile) IO_CACHE *buffpek_pointers, IO_CACHE *tempfile)
{ {
uint sort_length; uint sort_length;
BUFFPEK buffpek;
DBUG_ENTER("write_keys"); DBUG_ENTER("write_keys");
sort_length=param->sort_length; sort_length=param->sort_length;
@ -401,15 +414,20 @@ static int write_keys(SORTPARAM *param, register uchar **sort_keys, uint count,
if (!my_b_inited(tempfile) && if (!my_b_inited(tempfile) &&
open_cached_file(tempfile,mysql_tmpdir,TEMP_PREFIX,DISK_BUFFER_SIZE, open_cached_file(tempfile,mysql_tmpdir,TEMP_PREFIX,DISK_BUFFER_SIZE,
MYF(MY_WME))) MYF(MY_WME)))
DBUG_RETURN(1); /* purecov: inspected */ goto err; /* purecov: inspected */
buffpek->file_pos=my_b_tell(tempfile); buffpek.file_pos=my_b_tell(tempfile);
if ((ha_rows) count > param->max_rows) if ((ha_rows) count > param->max_rows)
count=(uint) param->max_rows; /* purecov: inspected */ count=(uint) param->max_rows; /* purecov: inspected */
buffpek->count=(ha_rows) count; buffpek.count=(ha_rows) count;
for (uchar **end=sort_keys+count ; sort_keys != end ; sort_keys++) for (uchar **end=sort_keys+count ; sort_keys != end ; sort_keys++)
if (my_b_write(tempfile,(byte*) *sort_keys,(uint) sort_length)) if (my_b_write(tempfile,(byte*) *sort_keys,(uint) sort_length))
DBUG_RETURN(1); goto err;
if (my_b_write(buffpek_pointers, (char*) &buffpek, sizeof(buffpek)))
goto err;
DBUG_RETURN(0); DBUG_RETURN(0);
err:
DBUG_RETURN(1);
} /* write_keys */ } /* write_keys */

View File

@ -569,19 +569,19 @@ void Item_varbinary::make_field(Send_field *tmp_field)
** pack data in buffer for sending ** pack data in buffer for sending
*/ */
bool Item::send(String *packet) bool Item::send(THD *thd, String *packet)
{ {
char buff[MAX_FIELD_WIDTH]; char buff[MAX_FIELD_WIDTH];
CONVERT *convert;
String s(buff,sizeof(buff)),*res; String s(buff,sizeof(buff)),*res;
if (!(res=val_str(&s))) if (!(res=val_str(&s)))
return net_store_null(packet); return net_store_null(packet);
CONVERT *convert; if ((convert=thd->convert_set))
if ((convert=current_thd->convert_set))
return convert->store(packet,res->ptr(),res->length()); return convert->store(packet,res->ptr(),res->length());
return net_store_data(packet,res->ptr(),res->length()); return net_store_data(packet,res->ptr(),res->length());
} }
bool Item_null::send(String *packet) bool Item_null::send(THD *thd, String *packet)
{ {
return net_store_null(packet); return net_store_null(packet);
} }

View File

@ -56,7 +56,7 @@ public:
virtual bool save_in_field(Field *field); virtual bool save_in_field(Field *field);
virtual void save_org_in_field(Field *field) virtual void save_org_in_field(Field *field)
{ (void) save_in_field(field); } { (void) save_in_field(field); }
virtual bool send(String *str); virtual bool send(THD *thd, String *str);
virtual bool eq(const Item *) const; virtual bool eq(const Item *) const;
virtual Item_result result_type () const { return REAL_RESULT; } virtual Item_result result_type () const { return REAL_RESULT; }
virtual enum Type type() const =0; virtual enum Type type() const =0;
@ -118,7 +118,7 @@ public:
double val_result(); double val_result();
longlong val_int_result(); longlong val_int_result();
String *str_result(String* tmp); String *str_result(String* tmp);
bool send(String *str_arg) { return result_field->send(str_arg); } bool send(THD *thd, String *str_arg) { return result_field->send(thd,str_arg); }
void make_field(Send_field *field); void make_field(Send_field *field);
bool fix_fields(THD *,struct st_table_list *); bool fix_fields(THD *,struct st_table_list *);
bool save_in_field(Field *field); bool save_in_field(Field *field);
@ -149,7 +149,7 @@ public:
bool save_in_field(Field *field); bool save_in_field(Field *field);
enum Item_result result_type () const enum Item_result result_type () const
{ return STRING_RESULT; } { return STRING_RESULT; }
bool send(String *str); bool send(THD *thd, String *str);
bool basic_const_item() const { return 1; } bool basic_const_item() const { return 1; }
Item *new_item() { return new Item_null(name); } Item *new_item() { return new Item_null(name); }
bool is_null() { return 1; } bool is_null() { return 1; }
@ -346,7 +346,7 @@ public:
{ {
return (null_value=(*ref)->get_date(ltime,fuzzydate)); return (null_value=(*ref)->get_date(ltime,fuzzydate));
} }
bool send(String *tmp) { return (*ref)->send(tmp); } bool send(THD *thd, String *tmp) { return (*ref)->send(thd, tmp); }
void make_field(Send_field *field) { (*ref)->make_field(field); } void make_field(Send_field *field) { (*ref)->make_field(field); }
bool fix_fields(THD *,struct st_table_list *); bool fix_fields(THD *,struct st_table_list *);
bool save_in_field(Field *field) { return (*ref)->save_in_field(field); } bool save_in_field(Field *field) { return (*ref)->save_in_field(field); }

View File

@ -898,7 +898,10 @@ public:
const char *func_name() const { return "match_nl"; } const char *func_name() const { return "match_nl"; }
double val(); double val();
int ft_handler_init(const byte *query, uint querylen, bool presort) int ft_handler_init(const byte *query, uint querylen, bool presort)
{ ft_handler=table->file->ft_init_ext(FT_NL,key, query, querylen, presort); } {
ft_handler=table->file->ft_init_ext(FT_NL,key, query, querylen, presort);
return 0;
}
}; };
class Item_func_match_bool :public Item_func_match class Item_func_match_bool :public Item_func_match
@ -908,6 +911,9 @@ public:
const char *func_name() const { return "match_bool"; } const char *func_name() const { return "match_bool"; }
double val(); double val();
int ft_handler_init(const byte *query, uint querylen, bool presort) int ft_handler_init(const byte *query, uint querylen, bool presort)
{ ft_handler=table->file->ft_init_ext(FT_BOOL,key, query, querylen, presort); } {
ft_handler=table->file->ft_init_ext(FT_BOOL,key, query, querylen, presort);
return 0;
}
}; };

View File

@ -280,20 +280,21 @@ public:
typedef struct st_qsel_param { typedef struct st_qsel_param {
uint baseflag,keys,max_key_part;
table_map prev_tables,read_tables,current_table;
TABLE *table; TABLE *table;
bool quick; // Don't calulate possible keys
KEY_PART *key_parts,*key_parts_end,*key[MAX_KEY]; KEY_PART *key_parts,*key_parts_end,*key[MAX_KEY];
MEM_ROOT *mem_root;
table_map prev_tables,read_tables,current_table;
uint baseflag,keys,max_key_part;
uint real_keynr[MAX_KEY]; uint real_keynr[MAX_KEY];
char min_key[MAX_KEY_LENGTH+MAX_FIELD_WIDTH], char min_key[MAX_KEY_LENGTH+MAX_FIELD_WIDTH],
max_key[MAX_KEY_LENGTH+MAX_FIELD_WIDTH]; max_key[MAX_KEY_LENGTH+MAX_FIELD_WIDTH];
bool quick; // Don't calulate possible keys
} PARAM; } PARAM;
static SEL_TREE * get_mm_parts(PARAM *param,Field *field, static SEL_TREE * get_mm_parts(PARAM *param,Field *field,
Item_func::Functype type,Item *value, Item_func::Functype type,Item *value,
Item_result cmp_type); Item_result cmp_type);
static SEL_ARG *get_mm_leaf(Field *field,KEY_PART *key_part, static SEL_ARG *get_mm_leaf(PARAM *param,Field *field,KEY_PART *key_part,
Item_func::Functype type,Item *value); Item_func::Functype type,Item *value);
static bool like_range(const char *ptr,uint length,char wild_prefix, static bool like_range(const char *ptr,uint length,char wild_prefix,
uint field_length, char *min_str,char *max_str, uint field_length, char *min_str,char *max_str,
@ -626,6 +627,7 @@ int SQL_SELECT::test_quick_select(key_map keys_to_use, table_map prev_tables,
param.current_table= head->map; param.current_table= head->map;
param.table=head; param.table=head;
param.keys=0; param.keys=0;
param.mem_root= &alloc;
current_thd->no_errors=1; // Don't warn about NULL current_thd->no_errors=1; // Don't warn about NULL
init_sql_alloc(&alloc,2048,0); init_sql_alloc(&alloc,2048,0);
@ -894,7 +896,7 @@ get_mm_parts(PARAM *param,Field *field, Item_func::Functype type,Item *value,
tree=new SEL_TREE(); tree=new SEL_TREE();
if (!value || !(value->used_tables() & ~param->read_tables)) if (!value || !(value->used_tables() & ~param->read_tables))
{ {
sel_arg=get_mm_leaf(key_part->field,key_part,type,value); sel_arg=get_mm_leaf(param,key_part->field,key_part,type,value);
if (!sel_arg) if (!sel_arg)
continue; continue;
if (sel_arg->type == SEL_ARG::IMPOSSIBLE) if (sel_arg->type == SEL_ARG::IMPOSSIBLE)
@ -914,7 +916,7 @@ get_mm_parts(PARAM *param,Field *field, Item_func::Functype type,Item *value,
static SEL_ARG * static SEL_ARG *
get_mm_leaf(Field *field,KEY_PART *key_part, get_mm_leaf(PARAM *param, Field *field, KEY_PART *key_part,
Item_func::Functype type,Item *value) Item_func::Functype type,Item *value)
{ {
uint maybe_null=(uint) field->real_maybe_null(); uint maybe_null=(uint) field->real_maybe_null();
@ -959,7 +961,7 @@ get_mm_leaf(Field *field,KEY_PART *key_part,
field_length=length; field_length=length;
} }
length+=offset; length+=offset;
if (!(min_str= (char*) sql_alloc(length*2))) if (!(min_str= (char*) alloc_root(param->mem_root, length*2)))
DBUG_RETURN(0); DBUG_RETURN(0);
max_str=min_str+length; max_str=min_str+length;
if (maybe_null) if (maybe_null)
@ -1026,7 +1028,8 @@ get_mm_leaf(Field *field,KEY_PART *key_part,
if (type == Item_func::EQUAL_FUNC) if (type == Item_func::EQUAL_FUNC)
{ {
/* convert column_name <=> NULL -> column_name IS NULL */ /* convert column_name <=> NULL -> column_name IS NULL */
char *str= (char*) sql_alloc(1); // Get local copy of key // Get local copy of key
char *str= (char*) alloc_root(param->mem_root,1);
if (!*str) if (!*str)
DBUG_RETURN(0); DBUG_RETURN(0);
*str = 1; *str = 1;
@ -1035,7 +1038,8 @@ get_mm_leaf(Field *field,KEY_PART *key_part,
DBUG_RETURN(&null_element); // NULL is never true DBUG_RETURN(&null_element); // NULL is never true
} }
// Get local copy of key // Get local copy of key
char *str= (char*) sql_alloc(key_part->part_length+maybe_null); char *str= (char*) alloc_root(param->mem_root,
key_part->part_length+maybe_null);
if (!str) if (!str)
DBUG_RETURN(0); DBUG_RETURN(0);
if (maybe_null) if (maybe_null)
@ -2235,7 +2239,7 @@ get_quick_select(PARAM *param,uint idx,SEL_ARG *key_tree)
else else
{ {
quick->key_parts=(KEY_PART*) quick->key_parts=(KEY_PART*)
sql_memdup(param->key[idx], memdup_root(&quick->alloc,(char*) param->key[idx],
sizeof(KEY_PART)* sizeof(KEY_PART)*
param->table->key_info[param->real_keynr[idx]].key_parts); param->table->key_info[param->real_keynr[idx]].key_parts);
} }
@ -2406,7 +2410,7 @@ QUICK_SELECT *get_quick_select_for_ref(TABLE *table, TABLE_REF *ref)
(key_info->flags & HA_NOSAME)) ? EQ_RANGE : 0); (key_info->flags & HA_NOSAME)) ? EQ_RANGE : 0);
if (!(quick->key_parts=key_part=(KEY_PART *) if (!(quick->key_parts=key_part=(KEY_PART *)
sql_alloc(sizeof(KEY_PART)*ref->key_parts))) alloc_root(&quick->alloc,sizeof(KEY_PART)*ref->key_parts)))
goto err; goto err;
for (part=0 ; part < ref->key_parts ;part++,key_part++) for (part=0 ; part < ref->key_parts ;part++,key_part++)

View File

@ -292,7 +292,7 @@ bool select_send::send_data(List<Item> &items)
Item *item; Item *item;
while ((item=li++)) while ((item=li++))
{ {
if (item->send(packet)) if (item->send(thd, packet))
{ {
packet->free(); // Free used packet->free(); // Free used
my_error(ER_OUT_OF_RESOURCES,MYF(0)); my_error(ER_OUT_OF_RESOURCES,MYF(0));

View File

@ -385,7 +385,9 @@ public:
} }
inline char *strdup(const char *str) inline char *strdup(const char *str)
{ return strdup_root(&mem_root,str); } { return strdup_root(&mem_root,str); }
inline char *memdup(const char *str, unsigned int size) inline char *strmake(const char *str, uint size)
{ return strmake_root(&mem_root,str,size); }
inline char *memdup(const char *str, uint size)
{ return memdup_root(&mem_root,str,size); } { return memdup_root(&mem_root,str,size); }
}; };

View File

@ -202,7 +202,7 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
it.rewind(); it.rewind();
while ((item=it++)) while ((item=it++))
{ {
if (item->send(packet)) if (item->send(thd,packet))
{ {
packet->free(); // Free used packet->free(); // Free used
my_error(ER_OUT_OF_RESOURCES,MYF(0)); my_error(ER_OUT_OF_RESOURCES,MYF(0));

View File

@ -201,7 +201,7 @@ LEX_STRING get_token(LEX *lex,uint length)
LEX_STRING tmp; LEX_STRING tmp;
yyUnget(); // ptr points now after last token char yyUnget(); // ptr points now after last token char
tmp.length=lex->yytoklen=length; tmp.length=lex->yytoklen=length;
tmp.str=(char*) sql_strmake((char*) lex->tok_start,tmp.length); tmp.str=(char*) lex->thd->strmake((char*) lex->tok_start,tmp.length);
return tmp; return tmp;
} }
@ -250,7 +250,7 @@ static char *get_text(LEX *lex)
str=lex->tok_start+1; str=lex->tok_start+1;
end=lex->ptr-1; end=lex->ptr-1;
if (!(start=(uchar*) sql_alloc((uint) (end-str)+1))) if (!(start=(uchar*) lex->thd->alloc((uint) (end-str)+1)))
return (char*) ""; // Sql_alloc has set error flag return (char*) ""; // Sql_alloc has set error flag
if (!found_escape) if (!found_escape)
{ {

View File

@ -2049,10 +2049,11 @@ get_best_combination(JOIN *join)
KEYUSE *keyuse; KEYUSE *keyuse;
KEY *keyinfo; KEY *keyinfo;
uint table_count; uint table_count;
THD *thd=join->thd;
table_count=join->tables; table_count=join->tables;
if (!(join->join_tab=join_tab= if (!(join->join_tab=join_tab=
(JOIN_TAB*) join->thd->alloc(sizeof(JOIN_TAB)*table_count))) (JOIN_TAB*) thd->alloc(sizeof(JOIN_TAB)*table_count)))
return TRUE; return TRUE;
join->const_tables=0; /* for checking */ join->const_tables=0; /* for checking */
@ -2130,10 +2131,10 @@ get_best_combination(JOIN *join)
j->ref.key_parts=keyparts; j->ref.key_parts=keyparts;
j->ref.key_length=length; j->ref.key_length=length;
j->ref.key=(int) key; j->ref.key=(int) key;
if (!(j->ref.key_buff= (byte*) sql_calloc(ALIGN_SIZE(length)*2)) || if (!(j->ref.key_buff= (byte*) thd->calloc(ALIGN_SIZE(length)*2)) ||
!(j->ref.key_copy= (store_key**) sql_alloc((sizeof(store_key*) * !(j->ref.key_copy= (store_key**) thd->alloc((sizeof(store_key*) *
(keyparts+1)))) || (keyparts+1)))) ||
!(j->ref.items= (Item**) sql_alloc(sizeof(Item*)*keyparts))) !(j->ref.items= (Item**) thd->alloc(sizeof(Item*)*keyparts)))
{ {
return TRUE; return TRUE;
} }
@ -2153,7 +2154,6 @@ get_best_combination(JOIN *join)
} }
else else
{ {
THD *thd=join->thd;
for (i=0 ; i < keyparts ; keyuse++,i++) for (i=0 ; i < keyparts ; keyuse++,i++)
{ {
while (keyuse->keypart != i || while (keyuse->keypart != i ||
@ -2358,7 +2358,7 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond)
{ {
DBUG_EXECUTE("where",print_where(tmp,tab->table->table_name);); DBUG_EXECUTE("where",print_where(tmp,tab->table->table_name););
SQL_SELECT *sel=tab->select=(SQL_SELECT*) SQL_SELECT *sel=tab->select=(SQL_SELECT*)
sql_memdup((gptr) select, sizeof(SQL_SELECT)); join->thd->memdup((gptr) select, sizeof(SQL_SELECT));
if (!sel) if (!sel)
DBUG_RETURN(1); // End of memory DBUG_RETURN(1); // End of memory
tab->select_cond=sel->cond=tmp; tab->select_cond=sel->cond=tmp;
@ -2439,8 +2439,8 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond)
current_map))) current_map)))
{ {
DBUG_EXECUTE("where",print_where(tmp,"cache");); DBUG_EXECUTE("where",print_where(tmp,"cache"););
tab->cache.select=(SQL_SELECT*) sql_memdup((gptr) sel, tab->cache.select=(SQL_SELECT*)
sizeof(SQL_SELECT)); join->thd->memdup((gptr) sel, sizeof(SQL_SELECT));
tab->cache.select->cond=tmp; tab->cache.select->cond=tmp;
tab->cache.select->read_tables=join->const_table_map; tab->cache.select->read_tables=join->const_table_map;
} }

View File

@ -92,7 +92,7 @@ $errors=0;
while (($pid=wait()) != -1) while (($pid=wait()) != -1)
{ {
$ret=$?/256; $ret=$?/256;
print "thread '" . $work{$pid} . "' finnished with exit code $ret\n"; print "thread '" . $work{$pid} . "' finished with exit code $ret\n";
$errors++ if ($ret != 0); $errors++ if ($ret != 0);
} }

View File

@ -106,7 +106,7 @@ $running_insert_threads=$opt_threads+$numtables;
while (($pid=wait()) != -1) while (($pid=wait()) != -1)
{ {
$ret=$?/256; $ret=$?/256;
print "thread '" . $work{$pid} . "' finnished with exit code $ret\n"; print "thread '" . $work{$pid} . "' finished with exit code $ret\n";
if ($work{$pid} =~ /^insert/) if ($work{$pid} =~ /^insert/)
{ {
if (!--$running_insert_threads) if (!--$running_insert_threads)

View File

@ -56,7 +56,7 @@ $errors=0;
while (($pid=wait()) != -1) while (($pid=wait()) != -1)
{ {
$ret=$?/256; $ret=$?/256;
print "thread '" . $work{$pid} . "' finnished with exit code $ret\n"; print "thread '" . $work{$pid} . "' finished with exit code $ret\n";
$errors++ if ($ret != 0); $errors++ if ($ret != 0);
} }

View File

@ -79,7 +79,7 @@ print "Total time: " .
exit(0); exit(0);
# #
# Insert records in the table. Delete table when test is finnished # Insert records in the table. Delete table when test is finished
# #
sub test_insert sub test_insert

View File

@ -65,7 +65,7 @@ $errors=0;
while (($pid=wait()) != -1) while (($pid=wait()) != -1)
{ {
$ret=$?/256; $ret=$?/256;
print "thread '" . $work{$pid} . "' finnished with exit code $ret\n"; print "thread '" . $work{$pid} . "' finished with exit code $ret\n";
$errors++ if ($ret != 0); $errors++ if ($ret != 0);
} }