mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 04:53:01 +01:00
merge
BitKeeper/etc/logging_ok: auto-union ndb/include/mgmapi/mgmapi_config_parameters.h: Auto merged ndb/src/kernel/vm/Configuration.cpp: Auto merged ndb/src/mgmsrv/ConfigInfo.cpp: Auto merged ndb/src/ndbapi/NdbDictionaryImpl.cpp: Auto merged ndb/src/ndbapi/NdbScanOperation.cpp: Auto merged ndb/src/ndbapi/TransporterFacade.hpp: Auto merged
This commit is contained in:
commit
629768d576
174 changed files with 1788 additions and 697 deletions
|
@ -80,6 +80,7 @@ jcole@mugatu.jcole.us
|
|||
jcole@mugatu.spaceapes.com
|
||||
jcole@sarvik.tfr.cafe.ee
|
||||
jcole@tetra.spaceapes.com
|
||||
joerg@mysql.com
|
||||
joreland@mysql.com
|
||||
jorge@linux.jorge.mysql.com
|
||||
jplindst@t41.(none)
|
||||
|
|
|
@ -376,7 +376,7 @@ if ($opt_stage <= 5 && !$opt_no_test && !$opt_no_mysqltest)
|
|||
log_timestamp();
|
||||
system("mkdir $bench_tmpdir") if (! -d $bench_tmpdir);
|
||||
safe_cd("${test_dir}/mysql-test");
|
||||
check_system("./mysql-test-run $flags --warnings --tmpdir=$bench_tmpdir --master_port=$mysql_tcp_port --slave_port=$slave_port --ndbcluster_port=$ndbcluster_port --manager-port=$manager_port --no-manager --sleep=10", "tests were successful");
|
||||
check_system("./mysql-test-run $flags --tmpdir=$bench_tmpdir --master_port=$mysql_tcp_port --slave_port=$slave_port --ndbcluster_port=$ndbcluster_port --manager-port=$manager_port --no-manager --sleep=10", "tests were successful");
|
||||
}
|
||||
|
||||
#
|
||||
|
|
8
VC++Files/sql/message.mc
Normal file
8
VC++Files/sql/message.mc
Normal file
|
@ -0,0 +1,8 @@
|
|||
MessageId = 100
|
||||
Severity = Error
|
||||
Facility = Application
|
||||
SymbolicName = MSG_DEFAULT
|
||||
Language = English
|
||||
%1For more information, see Help and Support Center at http://www.mysql.com.
|
||||
|
||||
|
|
@ -920,6 +920,89 @@ SOURCE=.\log_event.cpp
|
|||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\message.mc
|
||||
|
||||
!IF "$(CFG)" == "mysqld - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "mysqld - Win32 Debug"
|
||||
|
||||
!ELSEIF "$(CFG)" == "mysqld - Win32 nt"
|
||||
|
||||
# Begin Custom Build - Compiling messages
|
||||
InputDir=.
|
||||
InputPath=.\message.mc
|
||||
InputName=message
|
||||
|
||||
BuildCmds= \
|
||||
mc.exe "$(InputDir)\$(InputName).mc"
|
||||
|
||||
"$(InputDir)\$(InputName).rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
||||
$(BuildCmds)
|
||||
|
||||
"$(InputDir)\$(InputName).h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
||||
$(BuildCmds)
|
||||
# End Custom Build
|
||||
|
||||
!ELSEIF "$(CFG)" == "mysqld - Win32 Max nt"
|
||||
# Begin Custom Build - Compiling messages
|
||||
InputDir=.
|
||||
InputPath=.\message.mc
|
||||
InputName=message
|
||||
|
||||
BuildCmds= \
|
||||
mc.exe "$(InputDir)\$(InputName).mc"
|
||||
|
||||
"$(InputDir)\$(InputName).rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
||||
$(BuildCmds)
|
||||
|
||||
"$(InputDir)\$(InputName).h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
||||
$(BuildCmds)
|
||||
# End Custom Build
|
||||
!ELSEIF "$(CFG)" == "mysqld - Win32 Max"
|
||||
|
||||
!ELSEIF "$(CFG)" == "mysqld - Win32 classic"
|
||||
|
||||
!ELSEIF "$(CFG)" == "mysqld - Win32 pro"
|
||||
|
||||
!ELSEIF "$(CFG)" == "mysqld - Win32 classic nt"
|
||||
# Begin Custom Build - Compiling messages
|
||||
InputDir=.
|
||||
InputPath=.\message.mc
|
||||
InputName=message
|
||||
|
||||
BuildCmds= \
|
||||
mc.exe "$(InputDir)\$(InputName).mc"
|
||||
|
||||
"$(InputDir)\$(InputName).rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
||||
$(BuildCmds)
|
||||
|
||||
"$(InputDir)\$(InputName).h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
||||
$(BuildCmds)
|
||||
# End Custom Build
|
||||
!ELSEIF "$(CFG)" == "mysqld - Win32 pro nt"
|
||||
# Begin Custom Build - Compiling messages
|
||||
InputDir=.
|
||||
InputPath=.\message.mc
|
||||
InputName=message
|
||||
|
||||
BuildCmds= \
|
||||
mc.exe "$(InputDir)\$(InputName).mc"
|
||||
|
||||
"$(InputDir)\$(InputName).rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
||||
$(BuildCmds)
|
||||
|
||||
"$(InputDir)\$(InputName).h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
||||
$(BuildCmds)
|
||||
# End Custom Build
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\message.rc
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\mf_iocache.cpp
|
||||
|
||||
!IF "$(CFG)" == "mysqld - Win32 Release"
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
#include <locale.h>
|
||||
#endif
|
||||
|
||||
const char *VER= "14.5";
|
||||
const char *VER= "14.6";
|
||||
|
||||
/* Don't try to make a nice table if the data is too big */
|
||||
#define MAX_COLUMN_LENGTH 1024
|
||||
|
@ -792,6 +792,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
|||
while (*argument) *argument++= 'x'; // Destroy argument
|
||||
if (*start)
|
||||
start[1]=0 ;
|
||||
tty_password= 0;
|
||||
}
|
||||
else
|
||||
tty_password= 1;
|
||||
|
@ -858,7 +859,7 @@ static int get_options(int argc, char **argv)
|
|||
opt_max_allowed_packet= *mysql_params->p_max_allowed_packet;
|
||||
opt_net_buffer_length= *mysql_params->p_net_buffer_length;
|
||||
|
||||
if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
|
||||
if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option, 0)))
|
||||
exit(ho_error);
|
||||
|
||||
*mysql_params->p_max_allowed_packet= opt_max_allowed_packet;
|
||||
|
@ -1669,15 +1670,15 @@ static int com_server_help(String *buffer __attribute__((unused)),
|
|||
if (num_fields == 2)
|
||||
{
|
||||
put_info("Many help items for your request exist", INFO_INFO);
|
||||
put_info("For more specific request please type 'help <item>' where item is one of next", INFO_INFO);
|
||||
put_info("To make a more specific request, please type 'help <item>',\nwhere item is one of next", INFO_INFO);
|
||||
num_name= 0;
|
||||
num_cat= 1;
|
||||
last_char= '_';
|
||||
}
|
||||
else if ((cur= mysql_fetch_row(result)))
|
||||
{
|
||||
tee_fprintf(PAGER, "You asked help about help category: \"%s\"\n", cur[0]);
|
||||
put_info("For a more information type 'help <item>' where item is one of the following", INFO_INFO);
|
||||
tee_fprintf(PAGER, "You asked for help about help category: \"%s\"\n", cur[0]);
|
||||
put_info("For more information, type 'help <item>', where item is one of the following", INFO_INFO);
|
||||
num_name= 1;
|
||||
num_cat= 2;
|
||||
print_help_item(&cur,1,2,&last_char);
|
||||
|
@ -1691,7 +1692,7 @@ static int com_server_help(String *buffer __attribute__((unused)),
|
|||
else
|
||||
{
|
||||
put_info("\nNothing found", INFO_INFO);
|
||||
put_info("Please try to run 'help contents' for list of all accessible topics\n", INFO_INFO);
|
||||
put_info("Please try to run 'help contents' for a list of all accessible topics\n", INFO_INFO);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1710,9 +1711,9 @@ com_help(String *buffer __attribute__((unused)),
|
|||
if (help_arg)
|
||||
return com_server_help(buffer,line,help_arg+1);
|
||||
|
||||
put_info("\nFor the complete MySQL Manual online visit:\n http://www.mysql.com/documentation\n", INFO_INFO);
|
||||
put_info("For info on technical support from MySQL developers visit:\n http://www.mysql.com/support\n", INFO_INFO);
|
||||
put_info("For info on MySQL books, utilities, consultants, etc. visit:\n http://www.mysql.com/portal\n", INFO_INFO);
|
||||
put_info("\nFor the complete MySQL Manual online, visit:\n http://www.mysql.com/documentation\n", INFO_INFO);
|
||||
put_info("For info on technical support from MySQL developers, visit:\n http://www.mysql.com/support\n", INFO_INFO);
|
||||
put_info("For info on MySQL books, utilities, consultants, etc., visit:\n http://www.mysql.com/portal\n", INFO_INFO);
|
||||
put_info("List of all MySQL commands:", INFO_INFO);
|
||||
if (!named_cmds)
|
||||
put_info("Note that all text commands must be first on line and end with ';'",INFO_INFO);
|
||||
|
|
|
@ -276,7 +276,7 @@ int main(int argc,char *argv[])
|
|||
mysql_init(&mysql);
|
||||
load_defaults("my",load_default_groups,&argc,&argv);
|
||||
save_argv = argv; /* Save for free_defaults */
|
||||
if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
|
||||
if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option, 0)))
|
||||
{
|
||||
free_defaults(save_argv);
|
||||
exit(ho_error);
|
||||
|
|
|
@ -666,7 +666,7 @@ static int parse_args(int *argc, char*** argv)
|
|||
|
||||
result_file = stdout;
|
||||
load_defaults("my",load_default_groups,argc,argv);
|
||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option)))
|
||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option, NULL)))
|
||||
exit(ho_error);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -295,7 +295,7 @@ static int get_options(int *argc, char ***argv)
|
|||
|
||||
load_defaults("my", load_default_groups, argc, argv);
|
||||
|
||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option)))
|
||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option, 0)))
|
||||
exit(ho_error);
|
||||
|
||||
if (!what_to_do)
|
||||
|
|
|
@ -604,7 +604,7 @@ static int get_options(int *argc, char ***argv)
|
|||
md_result_file= stdout;
|
||||
load_defaults("my",load_default_groups,argc,argv);
|
||||
|
||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option)))
|
||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option, 0)))
|
||||
exit(ho_error);
|
||||
|
||||
*mysql_params->p_max_allowed_packet= opt_max_allowed_packet;
|
||||
|
|
|
@ -228,7 +228,7 @@ static int get_options(int *argc, char ***argv)
|
|||
{
|
||||
int ho_error;
|
||||
|
||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option)))
|
||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option, 0)))
|
||||
exit(ho_error);
|
||||
|
||||
if (enclosed && opt_enclosed)
|
||||
|
|
|
@ -95,7 +95,7 @@ int parse_args(int argc, char** argv)
|
|||
{
|
||||
int ho_error;
|
||||
|
||||
if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
|
||||
if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option, NULL)))
|
||||
exit(ho_error);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -133,7 +133,7 @@ int parse_args(int argc, char **argv)
|
|||
load_defaults("my",load_default_groups,&argc,&argv);
|
||||
default_argv= argv;
|
||||
|
||||
if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
|
||||
if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option, NULL)))
|
||||
exit(ho_error);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -297,7 +297,7 @@ get_options(int *argc,char ***argv)
|
|||
{
|
||||
int ho_error;
|
||||
|
||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option)))
|
||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option, 0)))
|
||||
exit(ho_error);
|
||||
|
||||
if (tty_password)
|
||||
|
|
|
@ -2100,7 +2100,7 @@ int parse_args(int argc, char **argv)
|
|||
load_defaults("my",load_default_groups,&argc,&argv);
|
||||
default_argv= argv;
|
||||
|
||||
if ((handle_options(&argc, &argv, my_long_options, get_one_option)))
|
||||
if ((handle_options(&argc, &argv, my_long_options, get_one_option, 0)))
|
||||
exit(1);
|
||||
|
||||
if (argc > 1)
|
||||
|
|
|
@ -23,10 +23,10 @@ libedit_a_DEPENDENCIES = @LIBEDIT_LOBJECTS@
|
|||
pkginclude_HEADERS = readline/readline.h
|
||||
|
||||
noinst_HEADERS = chared.h el.h histedit.h key.h parse.h refresh.h sig.h \
|
||||
sys.h tokenizer.h config.h hist.h map.h prompt.h \
|
||||
search.h tty.h
|
||||
sys.h tokenizer.h config.h hist.h map.h prompt.h read.h \
|
||||
search.h tty.h libedit_term.h term.h
|
||||
|
||||
EXTRA_DIST = makelist.sh np/unvis.c np/strlcpy.c np/vis.c np/strlcat.c np/fgetln.c
|
||||
EXTRA_DIST = makelist.sh np/unvis.c np/strlcpy.c np/vis.c np/vis.h np/strlcat.c np/fgetln.c
|
||||
|
||||
CLEANFILES = makelist common.h emacs.h vi.h fcns.h help.h fcns.c help.c
|
||||
|
||||
|
|
|
@ -661,12 +661,6 @@ history_load(History *h, const char *fname)
|
|||
if ((fp = fopen(fname, "r")) == NULL)
|
||||
return (i);
|
||||
|
||||
if ((line = fgetln(fp, &sz)) == NULL)
|
||||
goto done;
|
||||
|
||||
if (strncmp(line, hist_cookie, sz) != 0)
|
||||
goto done;
|
||||
|
||||
ptr = h_malloc(max_size = 1024);
|
||||
if (ptr == NULL)
|
||||
goto done;
|
||||
|
@ -720,8 +714,6 @@ history_save(History *h, const char *fname)
|
|||
|
||||
if (fchmod(fileno(fp), S_IRUSR|S_IWUSR) == -1)
|
||||
goto done;
|
||||
if (fputs(hist_cookie, fp) == EOF)
|
||||
goto done;
|
||||
ptr = h_malloc(max_size = 1024);
|
||||
if (ptr == NULL)
|
||||
goto done;
|
||||
|
@ -740,7 +732,7 @@ history_save(History *h, const char *fname)
|
|||
ptr = nptr;
|
||||
}
|
||||
(void) strvis(ptr, ev.str, VIS_WHITE);
|
||||
(void) fprintf(fp, "%s\n", ptr);
|
||||
(void) fprintf(fp, "%s\n", ev.str);
|
||||
}
|
||||
oomem:
|
||||
h_free((ptr_t)ptr);
|
||||
|
|
|
@ -99,7 +99,7 @@ static int get_options(int *argc,char ***argv)
|
|||
{
|
||||
int ho_error;
|
||||
|
||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option)))
|
||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option, NULL)))
|
||||
exit(ho_error);
|
||||
|
||||
if (*argc < 1)
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
#include <my_global.h>
|
||||
#include <m_string.h>
|
||||
#include <my_sys.h>
|
||||
#include <my_getopt.h>
|
||||
#include <signal.h>
|
||||
#include <errno.h>
|
||||
|
@ -66,7 +67,7 @@ int main(int argc, char *argv[])
|
|||
|
||||
progname= argv[0];
|
||||
|
||||
if (handle_options(&argc, &argv, my_long_options, get_one_option))
|
||||
if (handle_options(&argc, &argv, my_long_options, get_one_option, NULL))
|
||||
exit(-1);
|
||||
if (!argv[0] || !argv[1] || (pid= atoi(argv[0])) <= 0 ||
|
||||
(t= atoi(argv[1])) <= 0)
|
||||
|
|
|
@ -157,7 +157,7 @@ static int get_options(int *argc,char ***argv)
|
|||
{
|
||||
int ho_error;
|
||||
|
||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option)))
|
||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option, NULL)))
|
||||
exit(ho_error);
|
||||
|
||||
if (!*argc && !print_all_codes)
|
||||
|
|
|
@ -121,7 +121,7 @@ static int parse_args(int argc, char **argv)
|
|||
{
|
||||
int ho_error;
|
||||
|
||||
if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
|
||||
if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option, NULL)))
|
||||
exit(ho_error);
|
||||
|
||||
/*
|
||||
|
|
|
@ -90,7 +90,7 @@ static int get_options(int *argc,char ***argv)
|
|||
{
|
||||
int ho_error;
|
||||
|
||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option)))
|
||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option, NULL)))
|
||||
exit(ho_error);
|
||||
|
||||
if (*argc == 0)
|
||||
|
|
|
@ -246,12 +246,12 @@ ulong hp_hashnr(register HP_KEYDEF *keydef, register const byte *key)
|
|||
if (seg->type == HA_KEYTYPE_TEXT)
|
||||
{
|
||||
CHARSET_INFO *cs= seg->charset;
|
||||
uint length= ((uchar*)key) - pos;
|
||||
uint char_length= length / cs->mbmaxlen;
|
||||
if (length > char_length)
|
||||
uint char_length= (uint) ((uchar*) key - pos);
|
||||
if (cs->mbmaxlen > 1)
|
||||
{
|
||||
char_length= my_charpos(cs, pos, pos + length, char_length);
|
||||
set_if_smaller(char_length, length);
|
||||
uint length= char_length;
|
||||
char_length= my_charpos(cs, pos, pos + length, length/cs->mbmaxlen);
|
||||
set_if_smaller(char_length, length); /* QQ: ok to remove? */
|
||||
}
|
||||
cs->coll->hash_sort(cs, pos, char_length, &nr, &nr2);
|
||||
}
|
||||
|
@ -289,11 +289,12 @@ ulong hp_rec_hashnr(register HP_KEYDEF *keydef, register const byte *rec)
|
|||
if (seg->type == HA_KEYTYPE_TEXT)
|
||||
{
|
||||
CHARSET_INFO *cs= seg->charset;
|
||||
uint char_length= seg->length / cs->mbmaxlen;
|
||||
if (seg->length > char_length)
|
||||
uint char_length= seg->length;
|
||||
if (cs->mbmaxlen > 1)
|
||||
{
|
||||
char_length= my_charpos(cs, pos, pos + seg->length, char_length);
|
||||
set_if_smaller(char_length, seg->length);
|
||||
char_length= my_charpos(cs, pos, pos + char_length,
|
||||
char_length / cs->mbmaxlen);
|
||||
set_if_smaller(char_length, seg->length); /* QQ: ok to remove? */
|
||||
}
|
||||
cs->coll->hash_sort(cs, pos, char_length, &nr, &nr2);
|
||||
}
|
||||
|
@ -417,17 +418,17 @@ int hp_rec_key_cmp(HP_KEYDEF *keydef, const byte *rec1, const byte *rec2)
|
|||
if (seg->type == HA_KEYTYPE_TEXT)
|
||||
{
|
||||
CHARSET_INFO *cs= seg->charset;
|
||||
uint char_length= seg->length / cs->mbmaxlen;
|
||||
uint char_length1;
|
||||
uint char_length2;
|
||||
uchar *pos1= (uchar*)rec1 + seg->start;
|
||||
uchar *pos2= (uchar*)rec2 + seg->start;
|
||||
if (seg->length > char_length)
|
||||
if (cs->mbmaxlen > 1)
|
||||
{
|
||||
uint char_length= seg->length / cs->mbmaxlen;
|
||||
char_length1= my_charpos(cs, pos1, pos1 + seg->length, char_length);
|
||||
set_if_smaller(char_length1, seg->length);
|
||||
set_if_smaller(char_length1, seg->length); /* QQ: ok to remove? */
|
||||
char_length2= my_charpos(cs, pos2, pos2 + seg->length, char_length);
|
||||
set_if_smaller(char_length2, seg->length);
|
||||
set_if_smaller(char_length2, seg->length); /* QQ: ok to remove? */
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -468,12 +469,12 @@ int hp_key_cmp(HP_KEYDEF *keydef, const byte *rec, const byte *key)
|
|||
if (seg->type == HA_KEYTYPE_TEXT)
|
||||
{
|
||||
CHARSET_INFO *cs= seg->charset;
|
||||
uint char_length= seg->length / cs->mbmaxlen;
|
||||
uint char_length_key;
|
||||
uint char_length_rec;
|
||||
uchar *pos= (uchar*) rec + seg->start;
|
||||
if (seg->length > char_length)
|
||||
if (cs->mbmaxlen > 1)
|
||||
{
|
||||
uint char_length= seg->length / cs->mbmaxlen;
|
||||
char_length_key= my_charpos(cs, key, key + seg->length, char_length);
|
||||
set_if_smaller(char_length_key, seg->length);
|
||||
char_length_rec= my_charpos(cs, pos, pos + seg->length, char_length);
|
||||
|
@ -509,21 +510,22 @@ void hp_make_key(HP_KEYDEF *keydef, byte *key, const byte *rec)
|
|||
for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++)
|
||||
{
|
||||
CHARSET_INFO *cs= seg->charset;
|
||||
uint char_length= (cs && cs->mbmaxlen > 1) ? seg->length / cs->mbmaxlen :
|
||||
seg->length;
|
||||
uint char_length= seg->length;
|
||||
uchar *pos= (uchar*) rec + seg->start;
|
||||
if (seg->null_bit)
|
||||
*key++= test(rec[seg->null_pos] & seg->null_bit);
|
||||
if (seg->length > char_length)
|
||||
if (cs->mbmaxlen > 1)
|
||||
{
|
||||
char_length= my_charpos(cs, pos, pos + seg->length, char_length);
|
||||
set_if_smaller(char_length, seg->length);
|
||||
char_length= my_charpos(cs, pos, pos + seg->length,
|
||||
char_length / cs->mbmaxlen);
|
||||
set_if_smaller(char_length, seg->length); /* QQ: ok to remove? */
|
||||
}
|
||||
memcpy(key,rec+seg->start,(size_t) char_length);
|
||||
key+= char_length;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
uint hp_rb_make_key(HP_KEYDEF *keydef, byte *key,
|
||||
const byte *rec, byte *recpos)
|
||||
{
|
||||
|
@ -575,13 +577,13 @@ uint hp_rb_make_key(HP_KEYDEF *keydef, byte *key,
|
|||
}
|
||||
continue;
|
||||
}
|
||||
char_length= seg->length / (seg->charset ? seg->charset->mbmaxlen : 1);
|
||||
if (seg->length > char_length)
|
||||
char_length= seg->length;
|
||||
if (seg->charset->mbmaxlen > 1)
|
||||
{
|
||||
char_length= my_charpos(seg->charset,
|
||||
rec + seg->start, rec + seg->start + seg->length,
|
||||
char_length);
|
||||
set_if_smaller(char_length, seg->length);
|
||||
rec + seg->start, rec + seg->start + char_length,
|
||||
char_length / seg->charset->mbmaxlen);
|
||||
set_if_smaller(char_length, seg->length); /* QQ: ok to remove? */
|
||||
if (char_length < seg->length)
|
||||
seg->charset->cset->fill(seg->charset, key + char_length,
|
||||
seg->length - char_length, ' ');
|
||||
|
@ -593,7 +595,9 @@ uint hp_rb_make_key(HP_KEYDEF *keydef, byte *key,
|
|||
return key - start_key;
|
||||
}
|
||||
|
||||
uint hp_rb_pack_key(HP_KEYDEF *keydef, uchar *key, const uchar *old, uint k_len)
|
||||
|
||||
uint hp_rb_pack_key(HP_KEYDEF *keydef, uchar *key, const uchar *old,
|
||||
uint k_len)
|
||||
{
|
||||
HA_KEYSEG *seg, *endseg;
|
||||
uchar *start_key= key;
|
||||
|
@ -623,11 +627,12 @@ uint hp_rb_pack_key(HP_KEYDEF *keydef, uchar *key, const uchar *old, uint k_len)
|
|||
}
|
||||
continue;
|
||||
}
|
||||
char_length= seg->length / (seg->charset ? seg->charset->mbmaxlen : 1);
|
||||
if (seg->length > char_length)
|
||||
char_length= seg->length;
|
||||
if (seg->charset->mbmaxlen > 1)
|
||||
{
|
||||
char_length= my_charpos(seg->charset, old, old+seg->length, char_length);
|
||||
set_if_smaller(char_length, seg->length);
|
||||
char_length= my_charpos(seg->charset, old, old+char_length,
|
||||
char_length / seg->charset->mbmaxlen);
|
||||
set_if_smaller(char_length, seg->length); /* QQ: ok to remove? */
|
||||
if (char_length < seg->length)
|
||||
seg->charset->cset->fill(seg->charset, key + char_length,
|
||||
seg->length - char_length, ' ');
|
||||
|
@ -639,12 +644,14 @@ uint hp_rb_pack_key(HP_KEYDEF *keydef, uchar *key, const uchar *old, uint k_len)
|
|||
return key - start_key;
|
||||
}
|
||||
|
||||
|
||||
uint hp_rb_key_length(HP_KEYDEF *keydef,
|
||||
const byte *key __attribute__((unused)))
|
||||
{
|
||||
return keydef->length;
|
||||
}
|
||||
|
||||
|
||||
uint hp_rb_null_key_length(HP_KEYDEF *keydef, const byte *key)
|
||||
{
|
||||
const byte *start_key= key;
|
||||
|
|
|
@ -238,6 +238,9 @@ longlong my_strtoll10(const char *nptr, char **endptr, int *error);
|
|||
#ifndef HAVE_STRTOULL
|
||||
#define HAVE_STRTOULL
|
||||
#endif
|
||||
#ifndef HAVE_STRTOLL
|
||||
#define HAVE_STRTOLL
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_LONG_LONG
|
||||
extern char *longlong2str(longlong val,char *dst,int radix);
|
||||
|
|
|
@ -14,6 +14,9 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
#ifndef _my_getopt_h
|
||||
#define _my_getopt_h
|
||||
|
||||
C_MODE_START
|
||||
|
||||
#define GET_NO_ARG 1
|
||||
|
@ -54,11 +57,12 @@ struct my_option
|
|||
extern char *disabled_my_option;
|
||||
extern my_bool my_getopt_print_errors;
|
||||
|
||||
typedef my_bool (* my_get_one_option) (int, const struct my_option *, char * );
|
||||
typedef void (* my_error_reporter) (enum loglevel level, const char *format, ... );
|
||||
|
||||
extern int handle_options (int *argc, char ***argv,
|
||||
const struct my_option *longopts,
|
||||
my_bool (*get_one_option)(int,
|
||||
const struct my_option *,
|
||||
char *));
|
||||
const struct my_option *longopts, my_get_one_option,
|
||||
my_error_reporter );
|
||||
extern void my_print_help(const struct my_option *options);
|
||||
extern void my_print_variables(const struct my_option *options);
|
||||
extern void my_getopt_register_get_addr(gptr* (*func_addr)(const char *, uint,
|
||||
|
@ -66,4 +70,8 @@ extern void my_getopt_register_get_addr(gptr* (*func_addr)(const char *, uint,
|
|||
|
||||
ulonglong getopt_ull_limit_value(ulonglong num, const struct my_option *optp);
|
||||
my_bool getopt_compare_strings(const char *s, const char *t, uint length);
|
||||
|
||||
C_MODE_END
|
||||
|
||||
#endif /* _my_getopt_h */
|
||||
|
||||
|
|
|
@ -244,6 +244,12 @@ typedef struct wild_file_pack /* Struct to hold info when selecting files */
|
|||
my_string *wild; /* Pointer to wildcards */
|
||||
} WF_PACK;
|
||||
|
||||
enum loglevel {
|
||||
ERROR_LEVEL,
|
||||
WARNING_LEVEL,
|
||||
INFORMATION_LEVEL
|
||||
};
|
||||
|
||||
enum cache_type
|
||||
{
|
||||
READ_CACHE,WRITE_CACHE,
|
||||
|
|
|
@ -99,7 +99,7 @@ typedef struct st_mysql_field {
|
|||
unsigned int flags; /* Div flags */
|
||||
unsigned int decimals; /* Number of decimals in field */
|
||||
unsigned int charsetnr; /* Character set */
|
||||
enum enum_field_types type; /* Type of field. Se mysql_com.h for types */
|
||||
enum enum_field_types type; /* Type of field. See mysql_com.h for types */
|
||||
} MYSQL_FIELD;
|
||||
|
||||
typedef char **MYSQL_ROW; /* return data as array of strings */
|
||||
|
@ -175,7 +175,7 @@ struct st_mysql_options {
|
|||
*/
|
||||
my_bool rpl_parse;
|
||||
/*
|
||||
If set, never read from a master,only from slave, when doing
|
||||
If set, never read from a master, only from slave, when doing
|
||||
a read that is replication-aware
|
||||
*/
|
||||
my_bool no_master_reads;
|
||||
|
@ -538,7 +538,7 @@ enum enum_mysql_stmt_state
|
|||
typedef struct st_mysql_bind
|
||||
{
|
||||
unsigned long *length; /* output length pointer */
|
||||
my_bool *is_null; /* Pointer to null indicators */
|
||||
my_bool *is_null; /* Pointer to null indicator */
|
||||
void *buffer; /* buffer to get/put data */
|
||||
enum enum_field_types buffer_type; /* buffer type */
|
||||
unsigned long buffer_length; /* buffer length, must be set for str/binary */
|
||||
|
@ -581,7 +581,7 @@ typedef struct st_mysql_stmt
|
|||
unsigned char **row);
|
||||
unsigned long stmt_id; /* Id for prepared statement */
|
||||
unsigned int last_errno; /* error code */
|
||||
unsigned int param_count; /* inpute parameters count */
|
||||
unsigned int param_count; /* input parameter count */
|
||||
unsigned int field_count; /* number of columns in result set */
|
||||
enum enum_mysql_stmt_state state; /* statement state */
|
||||
char last_error[MYSQL_ERRMSG_SIZE]; /* error message */
|
||||
|
|
|
@ -318,4 +318,5 @@
|
|||
#define ER_WARN_INVALID_TIMESTAMP 1299
|
||||
#define ER_INVALID_CHARACTER_STRING 1300
|
||||
#define ER_WARN_ALLOWED_PACKET_OVERFLOWED 1301
|
||||
#define ER_ERROR_MESSAGES 302
|
||||
#define ER_CONFLICTING_DECLARATIONS 1302
|
||||
#define ER_ERROR_MESSAGES 303
|
||||
|
|
|
@ -629,6 +629,8 @@ buf_read_ibuf_merge_pages(
|
|||
}
|
||||
}
|
||||
|
||||
os_aio_simulated_wake_handler_threads();
|
||||
|
||||
/* Flush pages from the end of the LRU list if necessary */
|
||||
buf_flush_free_margin();
|
||||
|
||||
|
|
|
@ -671,7 +671,7 @@ static void get_options(register int *argc, register char ***argv)
|
|||
if (isatty(fileno(stdout)))
|
||||
testflag|=T_WRITE_LOOP;
|
||||
|
||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option)))
|
||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option, NULL)))
|
||||
exit(ho_error);
|
||||
|
||||
if (*argc == 0)
|
||||
|
|
|
@ -337,7 +337,7 @@ static void get_options(int *argc, char ***argv)
|
|||
{
|
||||
int ho_error;
|
||||
|
||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option)))
|
||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option, NULL)))
|
||||
exit(ho_error);
|
||||
|
||||
my_progname= argv[0][0];
|
||||
|
|
|
@ -3339,6 +3339,7 @@ static void fetch_string_with_conversion(MYSQL_BIND *param, char *value,
|
|||
}
|
||||
case MYSQL_TYPE_DATE:
|
||||
case MYSQL_TYPE_DATETIME:
|
||||
case MYSQL_TYPE_TIMESTAMP:
|
||||
{
|
||||
MYSQL_TIME *tm= (MYSQL_TIME *)buffer;
|
||||
str_to_datetime(value, length, tm, 0, &err);
|
||||
|
@ -3393,7 +3394,7 @@ static void fetch_long_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field,
|
|||
longlong value)
|
||||
{
|
||||
char *buffer= (char *)param->buffer;
|
||||
uint field_is_unsigned= (field->flags & UNSIGNED_FLAG);
|
||||
uint field_is_unsigned= field->flags & UNSIGNED_FLAG;
|
||||
|
||||
switch (param->buffer_type) {
|
||||
case MYSQL_TYPE_NULL: /* do nothing */
|
||||
|
@ -3429,7 +3430,7 @@ static void fetch_long_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field,
|
|||
char buff[22]; /* Enough for longlong */
|
||||
char *end= longlong10_to_str(value, buff, field_is_unsigned ? 10: -10);
|
||||
/* Resort to string conversion which supports all typecodes */
|
||||
fetch_string_with_conversion(param, buff, end - buff);
|
||||
fetch_string_with_conversion(param, buff, (uint) (end - buff));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -3505,7 +3506,7 @@ static void fetch_float_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field,
|
|||
sprintf(buff, "%.*f", (int) field->decimals, value);
|
||||
end= strend(buff);
|
||||
}
|
||||
fetch_string_with_conversion(param, buff, end - buff);
|
||||
fetch_string_with_conversion(param, buff, (uint) (end - buff));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -3590,14 +3591,14 @@ static void fetch_result_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field,
|
|||
{
|
||||
ulong length;
|
||||
enum enum_field_types field_type= field->type;
|
||||
uint field_is_unsigned= field->flags & UNSIGNED_FLAG;
|
||||
|
||||
switch (field_type) {
|
||||
case MYSQL_TYPE_TINY:
|
||||
{
|
||||
char value= (char) **row;
|
||||
uint field_is_unsigned= (field->flags & UNSIGNED_FLAG);
|
||||
longlong data= (field_is_unsigned) ? (longlong) (unsigned char) value:
|
||||
(longlong) value;
|
||||
longlong data= field_is_unsigned ? (longlong) (unsigned char) value :
|
||||
(longlong) value;
|
||||
fetch_long_with_conversion(param, field, data);
|
||||
length= 1;
|
||||
break;
|
||||
|
@ -3606,19 +3607,18 @@ static void fetch_result_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field,
|
|||
case MYSQL_TYPE_YEAR:
|
||||
{
|
||||
short value= sint2korr(*row);
|
||||
uint field_is_unsigned= (field->flags & UNSIGNED_FLAG);
|
||||
longlong data= ((field_is_unsigned) ? (longlong) (unsigned short) value:
|
||||
(longlong) value);
|
||||
longlong data= field_is_unsigned ? (longlong) (unsigned short) value :
|
||||
(longlong) value;
|
||||
fetch_long_with_conversion(param, field, data);
|
||||
length= 2;
|
||||
break;
|
||||
}
|
||||
case MYSQL_TYPE_INT24: /* mediumint is sent as 4 bytes int */
|
||||
case MYSQL_TYPE_LONG:
|
||||
{
|
||||
long value= sint4korr(*row);
|
||||
uint field_is_unsigned= (field->flags & UNSIGNED_FLAG);
|
||||
longlong data= ((field_is_unsigned) ? (longlong) (unsigned long) value:
|
||||
(longlong) value);
|
||||
longlong data= field_is_unsigned ? (longlong) (unsigned long) value :
|
||||
(longlong) value;
|
||||
fetch_long_with_conversion(param, field, data);
|
||||
length= 4;
|
||||
break;
|
||||
|
|
125
libmysqld/libmysqld.rc
Executable file
125
libmysqld/libmysqld.rc
Executable file
|
@ -0,0 +1,125 @@
|
|||
//Microsoft Developer Studio generated resource script.
|
||||
//
|
||||
#include "resource.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include "afxres.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (U.S.) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"resource.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#include ""afxres.h""\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
#ifndef _MAC
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Version
|
||||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 4,0,20,0
|
||||
PRODUCTVERSION 4,0,20,0
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x9L
|
||||
#else
|
||||
FILEFLAGS 0x8L
|
||||
#endif
|
||||
FILEOS 0x40004L
|
||||
FILETYPE 0x2L
|
||||
FILESUBTYPE 0x0L
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904b0"
|
||||
BEGIN
|
||||
#ifdef _DEBUG
|
||||
VALUE "Comments", "Embedded Server\0"
|
||||
VALUE "CompanyName", "MySQL AB\0"
|
||||
VALUE "FileDescription", "Embedded Server\0"
|
||||
VALUE "FileVersion", "4.0.20\0"
|
||||
VALUE "InternalName", "Embedded Server\0"
|
||||
VALUE "LegalCopyright", "Copyright © 2004\0"
|
||||
VALUE "LegalTrademarks", "MySQL and MySQL AB\0"
|
||||
VALUE "OriginalFilename", "libmysqld.dll debug\0"
|
||||
VALUE "PrivateBuild", "libmysqld.dll debug \0"
|
||||
VALUE "ProductName", "libmysqld.dll debug\0"
|
||||
VALUE "ProductVersion", "4.0.20\0"
|
||||
VALUE "SpecialBuild", "\0"
|
||||
#else
|
||||
VALUE "Comments", "Embedded Server\0"
|
||||
VALUE "CompanyName", "MySQL AB\0"
|
||||
VALUE "FileDescription", "Embedded Server\0"
|
||||
VALUE "FileVersion", "4.0.20\0"
|
||||
VALUE "InternalName", "Embedded Server\0"
|
||||
VALUE "LegalCopyright", "Copyright © 2004\0"
|
||||
VALUE "LegalTrademarks", "MySQL and MySQL AB\0"
|
||||
VALUE "OriginalFilename", "libmysqld.dll release\0"
|
||||
VALUE "PrivateBuild", "libmysqld.dll release \0"
|
||||
VALUE "ProductName", "libmysqld.dll release\0"
|
||||
VALUE "ProductVersion", "4.0.20\0"
|
||||
VALUE "SpecialBuild", "\0"
|
||||
#endif
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x409, 1200
|
||||
END
|
||||
END
|
||||
|
||||
#endif // !_MAC
|
||||
|
||||
#endif // English (U.S.) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
15
libmysqld/resource.h
Executable file
15
libmysqld/resource.h
Executable file
|
@ -0,0 +1,15 @@
|
|||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Developer Studio generated include file.
|
||||
// Used by libmysqld.rc
|
||||
//
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 101
|
||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||
#define _APS_NEXT_CONTROL_VALUE 1000
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
#endif
|
|
@ -23,9 +23,9 @@
|
|||
#include <ieeefp.h>
|
||||
#endif
|
||||
|
||||
#define CHECK_KEYS
|
||||
#define CHECK_KEYS /* Enable safety checks */
|
||||
|
||||
#define FIX_LENGTH \
|
||||
#define FIX_LENGTH(cs, pos, length, char_length) \
|
||||
do { \
|
||||
if (length > char_length) \
|
||||
char_length= my_charpos(cs, pos, pos+length, char_length); \
|
||||
|
@ -48,7 +48,7 @@ uint _mi_make_key(register MI_INFO *info, uint keynr, uchar *key,
|
|||
my_bool is_ft= info->s->keyinfo[keynr].flag & HA_FULLTEXT;
|
||||
DBUG_ENTER("_mi_make_key");
|
||||
|
||||
if(info->s->keyinfo[keynr].flag & HA_SPATIAL)
|
||||
if (info->s->keyinfo[keynr].flag & HA_SPATIAL)
|
||||
{
|
||||
/*
|
||||
TODO: nulls processing
|
||||
|
@ -78,7 +78,8 @@ uint _mi_make_key(register MI_INFO *info, uint keynr, uchar *key,
|
|||
*key++=1; /* Not NULL */
|
||||
}
|
||||
|
||||
char_length= (!is_ft && cs && cs->mbmaxlen > 1) ? length/cs->mbmaxlen : length;
|
||||
char_length= ((!is_ft && cs && cs->mbmaxlen > 1) ? length/cs->mbmaxlen :
|
||||
length);
|
||||
|
||||
pos= (byte*) record+keyseg->start;
|
||||
if (keyseg->flag & HA_SPACE_PACK)
|
||||
|
@ -95,7 +96,7 @@ uint _mi_make_key(register MI_INFO *info, uint keynr, uchar *key,
|
|||
pos++;
|
||||
}
|
||||
length=(uint) (end-pos);
|
||||
FIX_LENGTH;
|
||||
FIX_LENGTH(cs, pos, length, char_length);
|
||||
store_key_length_inc(key,char_length);
|
||||
memcpy((byte*) key,(byte*) pos,(size_t) char_length);
|
||||
key+=char_length;
|
||||
|
@ -106,7 +107,7 @@ uint _mi_make_key(register MI_INFO *info, uint keynr, uchar *key,
|
|||
uint tmp_length=uint2korr(pos);
|
||||
pos+=2; /* Skip VARCHAR length */
|
||||
set_if_smaller(length,tmp_length);
|
||||
FIX_LENGTH;
|
||||
FIX_LENGTH(cs, pos, length, char_length);
|
||||
store_key_length_inc(key,char_length);
|
||||
memcpy((byte*) key,(byte*) pos,(size_t) char_length);
|
||||
key+= char_length;
|
||||
|
@ -117,7 +118,7 @@ uint _mi_make_key(register MI_INFO *info, uint keynr, uchar *key,
|
|||
uint tmp_length=_mi_calc_blob_length(keyseg->bit_start,pos);
|
||||
memcpy_fixed((byte*) &pos,pos+keyseg->bit_start,sizeof(char*));
|
||||
set_if_smaller(length,tmp_length);
|
||||
FIX_LENGTH;
|
||||
FIX_LENGTH(cs, pos, length, char_length);
|
||||
store_key_length_inc(key,char_length);
|
||||
memcpy((byte*) key,(byte*) pos,(size_t) char_length);
|
||||
key+= char_length;
|
||||
|
@ -157,7 +158,7 @@ uint _mi_make_key(register MI_INFO *info, uint keynr, uchar *key,
|
|||
}
|
||||
continue;
|
||||
}
|
||||
FIX_LENGTH;
|
||||
FIX_LENGTH(cs, pos, length, char_length);
|
||||
memcpy((byte*) key, pos, char_length);
|
||||
if (length > char_length)
|
||||
cs->cset->fill(cs, key+char_length, length-char_length, ' ');
|
||||
|
@ -237,7 +238,7 @@ uint _mi_pack_key(register MI_INFO *info, uint keynr, uchar *key, uchar *old,
|
|||
}
|
||||
k_length-=length;
|
||||
length=(uint) (end-pos);
|
||||
FIX_LENGTH;
|
||||
FIX_LENGTH(cs, pos, length, char_length);
|
||||
store_key_length_inc(key,char_length);
|
||||
memcpy((byte*) key,pos,(size_t) char_length);
|
||||
key+= char_length;
|
||||
|
@ -250,7 +251,7 @@ uint _mi_pack_key(register MI_INFO *info, uint keynr, uchar *key, uchar *old,
|
|||
k_length-= 2+length;
|
||||
pos+=2;
|
||||
set_if_smaller(length,tmp_length); /* Safety */
|
||||
FIX_LENGTH;
|
||||
FIX_LENGTH(cs, pos, length, char_length);
|
||||
store_key_length_inc(key,char_length);
|
||||
old+=2; /* Skip length */
|
||||
memcpy((byte*) key, pos,(size_t) char_length);
|
||||
|
@ -267,7 +268,7 @@ uint _mi_pack_key(register MI_INFO *info, uint keynr, uchar *key, uchar *old,
|
|||
}
|
||||
continue;
|
||||
}
|
||||
FIX_LENGTH;
|
||||
FIX_LENGTH(cs, pos, length, char_length);
|
||||
memcpy((byte*) key, pos, char_length);
|
||||
if (length > char_length)
|
||||
cs->cset->fill(cs,key+char_length, length-char_length, ' ');
|
||||
|
|
|
@ -644,7 +644,7 @@ static void get_options(int argc, char *argv[])
|
|||
{
|
||||
int ho_error;
|
||||
|
||||
if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
|
||||
if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option, NULL)))
|
||||
exit(ho_error);
|
||||
|
||||
return;
|
||||
|
|
|
@ -68,7 +68,7 @@ int main(int argc,char *argv[])
|
|||
struct { MI_INFO *info; } aio0, *aio=&aio0; /* for GWS_IN_USE */
|
||||
|
||||
MY_INIT(argv[0]);
|
||||
if ((error=handle_options(&argc, &argv, my_long_options, get_one_option)))
|
||||
if ((error=handle_options(&argc, &argv, my_long_options, get_one_option, 0)))
|
||||
exit(error);
|
||||
if (count || dump)
|
||||
verbose=0;
|
||||
|
|
|
@ -696,7 +696,7 @@ static void get_options(register int *argc,register char ***argv)
|
|||
if (isatty(fileno(stdout)))
|
||||
check_param.testflag|=T_WRITE_LOOP;
|
||||
|
||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option)))
|
||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option, NULL)))
|
||||
exit(ho_error);
|
||||
|
||||
/* If using repair, then update checksum if one uses --update-state */
|
||||
|
|
|
@ -350,7 +350,7 @@ static void get_options(int *argc,char ***argv)
|
|||
if (isatty(fileno(stdout)))
|
||||
write_loop=1;
|
||||
|
||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option)))
|
||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option, NULL)))
|
||||
exit(ho_error);
|
||||
|
||||
if (!*argc)
|
||||
|
|
|
@ -5,15 +5,16 @@ DataMemory= CHOOSE_DataMemory
|
|||
IndexMemory= CHOOSE_IndexMemory
|
||||
Diskless= CHOOSE_Diskless
|
||||
TimeBetweenWatchDogCheck= 30000
|
||||
FileSystemPath= CHOOSE_FILESYSTEM
|
||||
DataDir= CHOOSE_FILESYSTEM
|
||||
|
||||
[ndbd]
|
||||
HostName: CHOOSE_HOSTNAME_1
|
||||
HostName= CHOOSE_HOSTNAME_1
|
||||
|
||||
[ndbd]
|
||||
HostName: CHOOSE_HOSTNAME_2
|
||||
HostName= CHOOSE_HOSTNAME_2
|
||||
|
||||
[ndb_mgmd]
|
||||
DataDir= CHOOSE_FILESYSTEM
|
||||
PortNumber= CHOOSE_PORT_MGM
|
||||
|
||||
[mysqld]
|
||||
|
|
|
@ -193,8 +193,7 @@ stop_default_ndbcluster() {
|
|||
|
||||
exec_mgmtclient="$exec_mgmtclient --try-reconnect=1"
|
||||
|
||||
echo "all stop" | $exec_mgmtclient 2>&1 | cat > /dev/null
|
||||
echo "3 stop" | $exec_mgmtclient 2>&1 | cat > /dev/null
|
||||
echo "shutdown" | $exec_mgmtclient 2>&1 | cat > /dev/null
|
||||
|
||||
if [ -f "$fs_ndb/$pidfile" ] ; then
|
||||
kill -9 `cat "$fs_ndb/$pidfile"` 2> /dev/null
|
||||
|
|
|
@ -111,10 +111,10 @@ a b
|
|||
aaa bbb
|
||||
select charset(a), charset(b), charset(binary 'ccc') from t1 limit 1;
|
||||
charset(a) charset(b) charset(binary 'ccc')
|
||||
latin1 binary latin1
|
||||
latin1 binary binary
|
||||
select collation(a), collation(b), collation(binary 'ccc') from t1 limit 1;
|
||||
collation(a) collation(b) collation(binary 'ccc')
|
||||
latin1_bin binary latin1_bin
|
||||
latin1_bin binary binary
|
||||
drop table t1;
|
||||
create table t1( firstname char(20), lastname char(20));
|
||||
insert into t1 values ("john","doe"),("John","Doe");
|
||||
|
|
|
@ -40,6 +40,7 @@ show tables;
|
|||
Tables_in_test
|
||||
update mysql.user set password=old_password("gambling2") where user=_binary"test";
|
||||
flush privileges;
|
||||
set password="";
|
||||
set password='gambling3';
|
||||
ERROR HY000: Password hash should be a 41-digit hexadecimal number
|
||||
set password=old_password('gambling3');
|
||||
|
|
|
@ -1,19 +1,19 @@
|
|||
drop table if exists t1, t2;
|
||||
CREATE TABLE t1 ( a int );
|
||||
INSERT INTO t1 VALUES (1),(2),(1);
|
||||
CREATE TABLE t2 ( PRIMARY KEY (a) ) TYPE=INNODB SELECT a FROM t1;
|
||||
CREATE TABLE t2 ( PRIMARY KEY (a) ) ENGINE=INNODB SELECT a FROM t1;
|
||||
ERROR 23000: Duplicate entry '1' for key 1
|
||||
select * from t2;
|
||||
ERROR 42S02: Table 'test.t2' doesn't exist
|
||||
CREATE TEMPORARY TABLE t2 ( PRIMARY KEY (a) ) TYPE=INNODB SELECT a FROM t1;
|
||||
CREATE TEMPORARY TABLE t2 ( PRIMARY KEY (a) ) ENGINE=INNODB SELECT a FROM t1;
|
||||
ERROR 23000: Duplicate entry '1' for key 1
|
||||
select * from t2;
|
||||
ERROR 42S02: Table 'test.t2' doesn't exist
|
||||
CREATE TABLE t2 ( PRIMARY KEY (a) ) TYPE=MYISAM SELECT a FROM t1;
|
||||
CREATE TABLE t2 ( PRIMARY KEY (a) ) ENGINE=MYISAM SELECT a FROM t1;
|
||||
ERROR 23000: Duplicate entry '1' for key 1
|
||||
select * from t2;
|
||||
ERROR 42S02: Table 'test.t2' doesn't exist
|
||||
CREATE TEMPORARY TABLE t2 ( PRIMARY KEY (a) ) TYPE=MYISAM SELECT a FROM t1;
|
||||
CREATE TEMPORARY TABLE t2 ( PRIMARY KEY (a) ) ENGINE=MYISAM SELECT a FROM t1;
|
||||
ERROR 23000: Duplicate entry '1' for key 1
|
||||
select * from t2;
|
||||
ERROR 42S02: Table 'test.t2' doesn't exist
|
||||
|
|
|
@ -49,8 +49,8 @@ a b
|
|||
aaa bbb
|
||||
select charset(a), charset(b), charset(binary 'ccc') from t1 limit 1;
|
||||
charset(a) charset(b) charset(binary 'ccc')
|
||||
cp1251 binary cp1251
|
||||
cp1251 binary binary
|
||||
select collation(a), collation(b), collation(binary 'ccc') from t1 limit 1;
|
||||
collation(a) collation(b) collation(binary 'ccc')
|
||||
cp1251_bin binary cp1251_bin
|
||||
cp1251_bin binary binary
|
||||
drop table t1;
|
||||
|
|
|
@ -54,4 +54,12 @@ t1 CREATE TABLE `t1` (
|
|||
`a` char(10) collate latin1_german1_ci default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci
|
||||
DROP TABLE t1;
|
||||
create table t1 (a char) character set latin1 character set latin2;
|
||||
ERROR HY000: Conflicting declarations: 'CHARACTER SET latin1' and 'CHARACTER SET latin2'
|
||||
create table t1 (a char) character set latin1 collate latin2_bin;
|
||||
ERROR 42000: COLLATION 'latin2_bin' is not valid for CHARACTER SET 'latin1'
|
||||
create database d1 default character set latin1 character set latin2;
|
||||
ERROR HY000: Conflicting declarations: 'CHARACTER SET latin1' and 'CHARACTER SET latin2'
|
||||
create database d1 default character set latin1 collate latin2_bin;
|
||||
ERROR 42000: COLLATION 'latin2_bin' is not valid for CHARACTER SET 'latin1'
|
||||
DROP DATABASE mysqltest1;
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
drop table if exists t1;
|
||||
drop table if exists t2;
|
||||
drop table if exists t1,t2;
|
||||
set names utf8;
|
||||
select left(_utf8 0xD0B0D0B1D0B2,1);
|
||||
left(_utf8 0xD0B0D0B1D0B2,1)
|
||||
|
|
|
@ -19,7 +19,7 @@ select 'a a' > 'a', 'a \0' < 'a';
|
|||
1 1
|
||||
select binary 'a a' > 'a', binary 'a \0' > 'a', binary 'a\0' > 'a';
|
||||
binary 'a a' > 'a' binary 'a \0' > 'a' binary 'a\0' > 'a'
|
||||
1 0 0
|
||||
1 1 1
|
||||
create table t1 (text1 varchar(32) not NULL, KEY key1 (text1));
|
||||
insert into t1 values ('teststring'), ('nothing'), ('teststring\t');
|
||||
check table t1;
|
||||
|
@ -52,13 +52,13 @@ select * from t1 ignore key (key1) where text1='teststring' or text1 like 'tests
|
|||
text1
|
||||
teststring
|
||||
teststring
|
||||
select * from t1 where text1='teststring' or text1 like 'teststring_%';
|
||||
text1
|
||||
teststring
|
||||
teststring
|
||||
select * from t1 where text1='teststring' or text1 > 'teststring\t';
|
||||
text1
|
||||
teststring
|
||||
select concat('|', text1, '|') from t1 where text1='teststring' or text1 like 'teststring_%';
|
||||
concat('|', text1, '|')
|
||||
|teststring |
|
||||
|teststring|
|
||||
select concat('|', text1, '|') from t1 where text1='teststring' or text1 > 'teststring\t';
|
||||
concat('|', text1, '|')
|
||||
|teststring|
|
||||
select text1, length(text1) from t1 order by text1;
|
||||
text1 length(text1)
|
||||
nothing 7
|
||||
|
@ -77,7 +77,28 @@ concat('|', text1, '|')
|
|||
|teststring|
|
||||
|teststring |
|
||||
|teststring |
|
||||
select concat('|', text1, '|') from t1 where text1='teststring' or text1 > 'teststring\t';
|
||||
concat('|', text1, '|')
|
||||
|teststring|
|
||||
|teststring |
|
||||
select concat('|', text1, '|') from t1 where text1='teststring';
|
||||
concat('|', text1, '|')
|
||||
|teststring|
|
||||
select concat('|', text1, '|') from t1 where text1='teststring ';
|
||||
concat('|', text1, '|')
|
||||
|teststring |
|
||||
alter table t1 modify text1 text not null, pack_keys=1;
|
||||
select concat('|', text1, '|') from t1 where text1='teststring';
|
||||
concat('|', text1, '|')
|
||||
|teststring|
|
||||
|teststring |
|
||||
select concat('|', text1, '|') from t1 where text1='teststring ';
|
||||
concat('|', text1, '|')
|
||||
|teststring|
|
||||
|teststring |
|
||||
explain select concat('|', text1, '|') from t1 where text1='teststring ';
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 range key1 key1 22 NULL 2 Using where
|
||||
select * from t1 where text1 like 'teststring_%';
|
||||
text1
|
||||
teststring
|
||||
|
@ -87,10 +108,10 @@ text1
|
|||
teststring
|
||||
teststring
|
||||
teststring
|
||||
select * from t1 where text1='teststring' or text1 > 'teststring\t';
|
||||
text1
|
||||
teststring
|
||||
teststring
|
||||
select concat('|', text1, '|') from t1 where text1='teststring' or text1 > 'teststring\t';
|
||||
concat('|', text1, '|')
|
||||
|teststring|
|
||||
|teststring |
|
||||
select concat('|', text1, '|') from t1 order by text1;
|
||||
concat('|', text1, '|')
|
||||
|nothing|
|
||||
|
|
|
@ -43,7 +43,7 @@ explain extended select if(u=1,st,binary st) s from t1 where st like "%a%" order
|
|||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 7 Using where; Using filesort
|
||||
Warnings:
|
||||
Note 1003 select if((test.t1.u = 1),test.t1.st,(test.t1.st collate _latin1'BINARY')) AS `s` from test.t1 where (test.t1.st like _latin1'%a%') order by if((test.t1.u = 1),test.t1.st,(test.t1.st collate _latin1'BINARY'))
|
||||
Note 1003 select if((test.t1.u = 1),test.t1.st,cast(test.t1.st as char charset binary)) AS `s` from test.t1 where (test.t1.st like _latin1'%a%') order by if((test.t1.u = 1),test.t1.st,cast(test.t1.st as char charset binary))
|
||||
select nullif(u=0, 'test') from t1;
|
||||
nullif(u=0, 'test')
|
||||
NULL
|
||||
|
|
|
@ -638,7 +638,7 @@ explain extended select md5('hello'), sha('abc'), sha1('abc'), soundex(''), 'moo
|
|||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
Warnings:
|
||||
Note 1003 select md5(_latin1'hello') AS `md5('hello')`,sha(_latin1'abc') AS `sha('abc')`,sha(_latin1'abc') AS `sha1('abc')`,soundex(_latin1'') AS `soundex('')`,(soundex(_latin1'mood') = soundex(_latin1'mud')) AS `'mood' sounds like 'mud'`,aes_decrypt(aes_encrypt(_latin1'abc',_latin1'1'),_latin1'1') AS `aes_decrypt(aes_encrypt('abc','1'),'1')`,concat(_latin1'*',repeat(_latin1' ',5),_latin1'*') AS `concat('*',space(5),'*')`,reverse(_latin1'abc') AS `reverse('abc')`,rpad(_latin1'a',4,_latin1'1') AS `rpad('a',4,'1')`,lpad(_latin1'a',4,_latin1'1') AS `lpad('a',4,'1')`,concat_ws(_latin1',',_latin1'',NULL,_latin1'a') AS `concat_ws(',','',NULL,'a')`,make_set(255,_latin2'a',_latin2'b',_latin2'c') AS `make_set(255,_latin2'a',_latin2'b',_latin2'c')`,elt(2,1) AS `elt(2,1)`,locate(_latin1'a',_latin1'b',2) AS `locate("a","b",2)`,format(130,10) AS `format(130,10)`,char(0) AS `char(0)`,conv(130,16,10) AS `conv(130,16,10)`,hex(130) AS `hex(130)`,(_latin1'HE' collate _latin1'BINARY') AS `binary 'HE'`,export_set(255,_latin2'y',_latin2'n',_latin2' ') AS `export_set(255,_latin2'y',_latin2'n',_latin2' ')`,field((_latin1'b' collate _latin1'latin1_bin'),_latin1'A',_latin1'B') AS `FIELD('b' COLLATE latin1_bin,'A','B')`,find_in_set(_latin1'B',_latin1'a,b,c,d') AS `FIND_IN_SET(_latin1'B',_latin1'a,b,c,d')`,collation(conv(130,16,10)) AS `collation(conv(130,16,10))`,coercibility(conv(130,16,10)) AS `coercibility(conv(130,16,10))`,length(_latin1'\n \r\0\\_\\%\\') AS `length('\n\t\r\b\0\_\%\\')`,bit_length(_latin1'\n \r\0\\_\\%\\') AS `bit_length('\n\t\r\b\0\_\%\\')`,bit_length(_latin1'\n \r\0\\_\\%\\') AS `bit_length('\n\t\r\b\0\_\%\\')`,concat(_latin1'monty',_latin1' was here ',_latin1'again') AS `concat('monty',' was here ','again')`,length(_latin1'hello') AS `length('hello')`,char(ascii(_latin1'h')) AS `char(ascii('h'))`,ord(_latin1'h') AS `ord('h')`,quote((1 / 0)) AS `quote(1/0)`,crc32(_latin1'123') AS `crc32("123")`,replace(_latin1'aaaa',_latin1'a',_latin1'b') AS `replace('aaaa','a','b')`,insert(_latin1'txs',2,1,_latin1'hi') AS `insert('txs',2,1,'hi')`,left(_latin2'a',1) AS `left(_latin2'a',1)`,right(_latin2'a',1) AS `right(_latin2'a',1)`,lcase(_latin2'a') AS `lcase(_latin2'a')`,ucase(_latin2'a') AS `ucase(_latin2'a')`,substr(_latin1'abcdefg',3,2) AS `SUBSTR('abcdefg',3,2)`,substr_index(_latin1'1abcd;2abcd;3abcd;4abcd',_latin1';',2) AS `substring_index("1abcd;2abcd;3abcd;4abcd", ';', 2)`,trim(_latin2' a ') AS `trim(_latin2' a ')`,ltrim(_latin2' a ') AS `ltrim(_latin2' a ')`,rtrim(_latin2' a ') AS `rtrim(_latin2' a ')`,decode(encode(repeat(_latin1'a',100000))) AS `decode(encode(repeat("a",100000),"monty"),"monty")`
|
||||
Note 1003 select md5(_latin1'hello') AS `md5('hello')`,sha(_latin1'abc') AS `sha('abc')`,sha(_latin1'abc') AS `sha1('abc')`,soundex(_latin1'') AS `soundex('')`,(soundex(_latin1'mood') = soundex(_latin1'mud')) AS `'mood' sounds like 'mud'`,aes_decrypt(aes_encrypt(_latin1'abc',_latin1'1'),_latin1'1') AS `aes_decrypt(aes_encrypt('abc','1'),'1')`,concat(_latin1'*',repeat(_latin1' ',5),_latin1'*') AS `concat('*',space(5),'*')`,reverse(_latin1'abc') AS `reverse('abc')`,rpad(_latin1'a',4,_latin1'1') AS `rpad('a',4,'1')`,lpad(_latin1'a',4,_latin1'1') AS `lpad('a',4,'1')`,concat_ws(_latin1',',_latin1'',NULL,_latin1'a') AS `concat_ws(',','',NULL,'a')`,make_set(255,_latin2'a',_latin2'b',_latin2'c') AS `make_set(255,_latin2'a',_latin2'b',_latin2'c')`,elt(2,1) AS `elt(2,1)`,locate(_latin1'a',_latin1'b',2) AS `locate("a","b",2)`,format(130,10) AS `format(130,10)`,char(0) AS `char(0)`,conv(130,16,10) AS `conv(130,16,10)`,hex(130) AS `hex(130)`,cast(_latin1'HE' as char charset binary) AS `binary 'HE'`,export_set(255,_latin2'y',_latin2'n',_latin2' ') AS `export_set(255,_latin2'y',_latin2'n',_latin2' ')`,field((_latin1'b' collate _latin1'latin1_bin'),_latin1'A',_latin1'B') AS `FIELD('b' COLLATE latin1_bin,'A','B')`,find_in_set(_latin1'B',_latin1'a,b,c,d') AS `FIND_IN_SET(_latin1'B',_latin1'a,b,c,d')`,collation(conv(130,16,10)) AS `collation(conv(130,16,10))`,coercibility(conv(130,16,10)) AS `coercibility(conv(130,16,10))`,length(_latin1'\n \r\0\\_\\%\\') AS `length('\n\t\r\b\0\_\%\\')`,bit_length(_latin1'\n \r\0\\_\\%\\') AS `bit_length('\n\t\r\b\0\_\%\\')`,bit_length(_latin1'\n \r\0\\_\\%\\') AS `bit_length('\n\t\r\b\0\_\%\\')`,concat(_latin1'monty',_latin1' was here ',_latin1'again') AS `concat('monty',' was here ','again')`,length(_latin1'hello') AS `length('hello')`,char(ascii(_latin1'h')) AS `char(ascii('h'))`,ord(_latin1'h') AS `ord('h')`,quote((1 / 0)) AS `quote(1/0)`,crc32(_latin1'123') AS `crc32("123")`,replace(_latin1'aaaa',_latin1'a',_latin1'b') AS `replace('aaaa','a','b')`,insert(_latin1'txs',2,1,_latin1'hi') AS `insert('txs',2,1,'hi')`,left(_latin2'a',1) AS `left(_latin2'a',1)`,right(_latin2'a',1) AS `right(_latin2'a',1)`,lcase(_latin2'a') AS `lcase(_latin2'a')`,ucase(_latin2'a') AS `ucase(_latin2'a')`,substr(_latin1'abcdefg',3,2) AS `SUBSTR('abcdefg',3,2)`,substr_index(_latin1'1abcd;2abcd;3abcd;4abcd',_latin1';',2) AS `substring_index("1abcd;2abcd;3abcd;4abcd", ';', 2)`,trim(_latin2' a ') AS `trim(_latin2' a ')`,ltrim(_latin2' a ') AS `ltrim(_latin2' a ')`,rtrim(_latin2' a ') AS `rtrim(_latin2' a ')`,decode(encode(repeat(_latin1'a',100000))) AS `decode(encode(repeat("a",100000),"monty"),"monty")`
|
||||
SELECT lpad(12345, 5, "#");
|
||||
lpad(12345, 5, "#")
|
||||
12345
|
||||
|
|
|
@ -466,3 +466,22 @@ insert IGNORE into t1 values ('Garbage');
|
|||
ERROR HY000: Unknown error
|
||||
alter table t1 add spatial index(a);
|
||||
drop table t1;
|
||||
create table t1(a geometry not null, spatial index(a));
|
||||
insert into t1 values
|
||||
(GeomFromText('POINT(1 1)')), (GeomFromText('POINT(3 3)')),
|
||||
(GeomFromText('POINT(4 4)')), (GeomFromText('POINT(6 6)'));
|
||||
select AsText(a) from t1 where
|
||||
MBRContains(GeomFromText('Polygon((0 0, 0 2, 2 2, 2 0, 0 0))'), a)
|
||||
or
|
||||
MBRContains(GeomFromText('Polygon((2 2, 2 5, 5 5, 5 2, 2 2))'), a);
|
||||
AsText(a)
|
||||
POINT(1 1)
|
||||
POINT(3 3)
|
||||
POINT(4 4)
|
||||
select AsText(a) from t1 where
|
||||
MBRContains(GeomFromText('Polygon((0 0, 0 2, 2 2, 2 0, 0 0))'), a)
|
||||
and
|
||||
MBRContains(GeomFromText('Polygon((0 0, 0 7, 7 7, 7 0, 0 0))'), a);
|
||||
AsText(a)
|
||||
POINT(1 1)
|
||||
drop table t1;
|
||||
|
|
|
@ -127,3 +127,4 @@ having (a.description is not null) and (c=0);
|
|||
id description c
|
||||
1 test 0
|
||||
2 test2 0
|
||||
drop table t1,t2,t3;
|
||||
|
|
|
@ -58,3 +58,10 @@ ERROR 42000: Not unique table/alias: 'C'
|
|||
drop table t1, t2;
|
||||
show tables;
|
||||
Tables_in_test
|
||||
create table t1 (a int);
|
||||
select TEST.t1.* from TEST.t1;
|
||||
a
|
||||
alter table t1 rename to T1;
|
||||
select TEST.t1.* from TEST.t1;
|
||||
a
|
||||
drop table t1;
|
||||
|
|
|
@ -412,7 +412,6 @@ aaa.
|
|||
aaa .
|
||||
select concat(a,'.') from t1 where binary a='aaa';
|
||||
concat(a,'.')
|
||||
aaa .
|
||||
aaa.
|
||||
update t1 set a='bbb' where a='aaa';
|
||||
select concat(a,'.') from t1;
|
||||
|
|
|
@ -35,10 +35,10 @@ update t1 set name="Autodiscover" where id = 2;
|
|||
show status like 'handler_discover%';
|
||||
Variable_name Value
|
||||
Handler_discover 4
|
||||
select * from t1 order by name;
|
||||
select * from t1 order by id;
|
||||
id name
|
||||
2 Autodiscover
|
||||
1 Autodiscover
|
||||
2 Autodiscover
|
||||
3 Discover 3
|
||||
show status like 'handler_discover%';
|
||||
Variable_name Value
|
||||
|
|
|
@ -205,4 +205,10 @@ a b c
|
|||
select * from t1 where b<=5 and c=0 or b<=5 and c=2;
|
||||
a b c
|
||||
19 4 0
|
||||
select count(*) from t1 where b = 0;
|
||||
count(*)
|
||||
0
|
||||
select count(*) from t1 where b = 1;
|
||||
count(*)
|
||||
1
|
||||
drop table t1;
|
||||
|
|
|
@ -593,9 +593,12 @@ create table t1 (id integer primary key auto_increment, txt text, unique index t
|
|||
insert into t1 (txt) values ('Chevy'), ('Chevy '), (NULL);
|
||||
select * from t1 where txt='Chevy' or txt is NULL;
|
||||
id txt
|
||||
3 NULL
|
||||
1 Chevy
|
||||
2 Chevy
|
||||
3 NULL
|
||||
explain select * from t1 where txt='Chevy' or txt is NULL;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 range txt_index txt_index 23 NULL 2 Using where
|
||||
select * from t1 where txt='Chevy ';
|
||||
id txt
|
||||
1 Chevy
|
||||
|
@ -663,6 +666,21 @@ id txt
|
|||
1 Chevy
|
||||
2 Chevy
|
||||
4 Ford
|
||||
alter table t1 modify column txt blob;
|
||||
explain select * from t1 where txt='Chevy' or txt is NULL;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref_or_null txt_index txt_index 23 const 2 Using where
|
||||
select * from t1 where txt='Chevy' or txt is NULL;
|
||||
id txt
|
||||
1 Chevy
|
||||
3 NULL
|
||||
explain select * from t1 where txt='Chevy' or txt is NULL order by txt;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref_or_null txt_index txt_index 23 const 2 Using where; Using filesort
|
||||
select * from t1 where txt='Chevy' or txt is NULL order by txt;
|
||||
id txt
|
||||
3 NULL
|
||||
1 Chevy
|
||||
drop table t1;
|
||||
CREATE TABLE t1 ( i int(11) NOT NULL default '0', c text NOT NULL, PRIMARY KEY (i), KEY (c(1),c(1)));
|
||||
INSERT t1 VALUES (1,''),(2,''),(3,'asdfh'),(4,'');
|
||||
|
|
|
@ -272,7 +272,7 @@ auto bigint(17) unsigned NULL PRI 0 select,insert,update,references
|
|||
t1 bigint(1) NULL 0 select,insert,update,references
|
||||
t2 char(1) latin1_swedish_ci select,insert,update,references
|
||||
t3 longtext latin1_swedish_ci select,insert,update,references
|
||||
t4 longtext latin1_bin select,insert,update,references
|
||||
t4 longblob NULL select,insert,update,references
|
||||
select * from t2;
|
||||
auto t1 t2 t3 t4
|
||||
11 1 a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
|
||||
|
|
|
@ -365,3 +365,15 @@ select * from t1;
|
|||
t1 i
|
||||
2004-04-01 00:00:00 10
|
||||
drop table t1;
|
||||
create table t1 (ts timestamp(19));
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`ts` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
set TIMESTAMP=1000000000;
|
||||
insert into t1 values ();
|
||||
select * from t1;
|
||||
ts
|
||||
2001-09-09 04:46:40
|
||||
drop table t1;
|
||||
|
|
|
@ -48,6 +48,7 @@ flush privileges;
|
|||
#connect (con1,localhost,test,gambling2,"");
|
||||
#show tables;
|
||||
connect (con1,localhost,test,gambling2,mysql);
|
||||
set password="";
|
||||
--error 1105
|
||||
set password='gambling3';
|
||||
set password=old_password('gambling3');
|
||||
|
|
|
@ -12,18 +12,18 @@ drop table if exists t1, t2;
|
|||
CREATE TABLE t1 ( a int );
|
||||
INSERT INTO t1 VALUES (1),(2),(1);
|
||||
--error 1062;
|
||||
CREATE TABLE t2 ( PRIMARY KEY (a) ) TYPE=INNODB SELECT a FROM t1;
|
||||
CREATE TABLE t2 ( PRIMARY KEY (a) ) ENGINE=INNODB SELECT a FROM t1;
|
||||
--error 1146;
|
||||
select * from t2;
|
||||
--error 1062;
|
||||
CREATE TEMPORARY TABLE t2 ( PRIMARY KEY (a) ) TYPE=INNODB SELECT a FROM t1;
|
||||
CREATE TEMPORARY TABLE t2 ( PRIMARY KEY (a) ) ENGINE=INNODB SELECT a FROM t1;
|
||||
--error 1146;
|
||||
select * from t2;
|
||||
--error 1062;
|
||||
CREATE TABLE t2 ( PRIMARY KEY (a) ) TYPE=MYISAM SELECT a FROM t1;
|
||||
CREATE TABLE t2 ( PRIMARY KEY (a) ) ENGINE=MYISAM SELECT a FROM t1;
|
||||
--error 1146;
|
||||
select * from t2;
|
||||
--error 1062;
|
||||
CREATE TEMPORARY TABLE t2 ( PRIMARY KEY (a) ) TYPE=MYISAM SELECT a FROM t1;
|
||||
CREATE TEMPORARY TABLE t2 ( PRIMARY KEY (a) ) ENGINE=MYISAM SELECT a FROM t1;
|
||||
--error 1146;
|
||||
select * from t2;
|
||||
|
|
|
@ -71,6 +71,18 @@ SHOW CREATE TABLE t1;
|
|||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug#
|
||||
# CREATE TABLE and CREATE DATABASE didn't fail in some cases
|
||||
#
|
||||
--error 1302
|
||||
create table t1 (a char) character set latin1 character set latin2;
|
||||
--error 1253
|
||||
create table t1 (a char) character set latin1 collate latin2_bin;
|
||||
--error 1302
|
||||
create database d1 default character set latin1 character set latin2;
|
||||
--error 1253
|
||||
create database d1 default character set latin1 collate latin2_bin;
|
||||
|
||||
#
|
||||
#
|
||||
DROP DATABASE mysqltest1;
|
||||
|
|
|
@ -3,8 +3,7 @@
|
|||
#
|
||||
|
||||
--disable_warnings
|
||||
drop table if exists t1;
|
||||
drop table if exists t2;
|
||||
drop table if exists t1,t2;
|
||||
--enable_warnings
|
||||
set names utf8;
|
||||
|
||||
|
|
|
@ -31,19 +31,25 @@ explain select * from t1 order by text1;
|
|||
alter table t1 modify text1 char(32) binary not null;
|
||||
check table t1;
|
||||
select * from t1 ignore key (key1) where text1='teststring' or text1 like 'teststring_%';
|
||||
select * from t1 where text1='teststring' or text1 like 'teststring_%';
|
||||
select * from t1 where text1='teststring' or text1 > 'teststring\t';
|
||||
select concat('|', text1, '|') from t1 where text1='teststring' or text1 like 'teststring_%';
|
||||
select concat('|', text1, '|') from t1 where text1='teststring' or text1 > 'teststring\t';
|
||||
select text1, length(text1) from t1 order by text1;
|
||||
select text1, length(text1) from t1 order by binary text1;
|
||||
|
||||
alter table t1 modify text1 blob not null, drop key key1, add key key1 (text1(20));
|
||||
insert into t1 values ('teststring ');
|
||||
select concat('|', text1, '|') from t1 order by text1;
|
||||
select concat('|', text1, '|') from t1 where text1='teststring' or text1 > 'teststring\t';
|
||||
select concat('|', text1, '|') from t1 where text1='teststring';
|
||||
select concat('|', text1, '|') from t1 where text1='teststring ';
|
||||
|
||||
alter table t1 modify text1 text not null, pack_keys=1;
|
||||
select concat('|', text1, '|') from t1 where text1='teststring';
|
||||
select concat('|', text1, '|') from t1 where text1='teststring ';
|
||||
explain select concat('|', text1, '|') from t1 where text1='teststring ';
|
||||
select * from t1 where text1 like 'teststring_%';
|
||||
select * from t1 where text1='teststring' or text1 like 'teststring_%';
|
||||
select * from t1 where text1='teststring' or text1 > 'teststring\t';
|
||||
select concat('|', text1, '|') from t1 where text1='teststring' or text1 > 'teststring\t';
|
||||
select concat('|', text1, '|') from t1 order by text1;
|
||||
drop table t1;
|
||||
|
||||
|
|
|
@ -172,3 +172,21 @@ insert IGNORE into t1 values ('Garbage');
|
|||
alter table t1 add spatial index(a);
|
||||
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug #5219: problem with range optimizer
|
||||
#
|
||||
|
||||
create table t1(a geometry not null, spatial index(a));
|
||||
insert into t1 values
|
||||
(GeomFromText('POINT(1 1)')), (GeomFromText('POINT(3 3)')),
|
||||
(GeomFromText('POINT(4 4)')), (GeomFromText('POINT(6 6)'));
|
||||
select AsText(a) from t1 where
|
||||
MBRContains(GeomFromText('Polygon((0 0, 0 2, 2 2, 2 0, 0 0))'), a)
|
||||
or
|
||||
MBRContains(GeomFromText('Polygon((2 2, 2 5, 5 5, 5 2, 2 2))'), a);
|
||||
select AsText(a) from t1 where
|
||||
MBRContains(GeomFromText('Polygon((0 0, 0 2, 2 2, 2 0, 0 0))'), a)
|
||||
and
|
||||
MBRContains(GeomFromText('Polygon((0 0, 0 7, 7 7, 7 0, 0 0))'), a);
|
||||
drop table t1;
|
||||
|
|
|
@ -121,3 +121,4 @@ select
|
|||
from t1 a left join t3 b on a.id=b.order_id
|
||||
group by a.id, a.description
|
||||
having (a.description is not null) and (c=0);
|
||||
drop table t1,t2,t3;
|
||||
|
|
|
@ -54,3 +54,13 @@ select C.a, c.a from t1 c, t2 C;
|
|||
drop table t1, t2;
|
||||
|
||||
show tables;
|
||||
|
||||
#
|
||||
# Test all caps database name
|
||||
#
|
||||
create table t1 (a int);
|
||||
select TEST.t1.* from TEST.t1;
|
||||
alter table t1 rename to T1;
|
||||
select TEST.t1.* from TEST.t1;
|
||||
drop table t1;
|
||||
|
||||
|
|
|
@ -50,7 +50,7 @@ flush tables;
|
|||
system rm var/master-data/test/t1.frm ;
|
||||
update t1 set name="Autodiscover" where id = 2;
|
||||
show status like 'handler_discover%';
|
||||
select * from t1 order by name;
|
||||
select * from t1 order by id;
|
||||
show status like 'handler_discover%';
|
||||
|
||||
#
|
||||
|
|
|
@ -113,6 +113,9 @@ select * from t1 where b<=5 and c=0;
|
|||
select * from t1 where b=4 and c<=5 order by a;
|
||||
select * from t1 where b<=4 and c<=5 order by a;
|
||||
select * from t1 where b<=5 and c=0 or b<=5 and c=2;
|
||||
|
||||
select count(*) from t1 where b = 0;
|
||||
select count(*) from t1 where b = 1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
|
|
|
@ -340,6 +340,7 @@ drop table t1;
|
|||
create table t1 (id integer primary key auto_increment, txt text, unique index txt_index (txt (20)));
|
||||
insert into t1 (txt) values ('Chevy'), ('Chevy '), (NULL);
|
||||
select * from t1 where txt='Chevy' or txt is NULL;
|
||||
explain select * from t1 where txt='Chevy' or txt is NULL;
|
||||
select * from t1 where txt='Chevy ';
|
||||
select * from t1 where txt='Chevy ' or txt='Chevy';
|
||||
select * from t1 where txt='Chevy' or txt='Chevy ';
|
||||
|
@ -358,7 +359,13 @@ select * from t1 where txt < 'Chevy ' or txt is NULL;
|
|||
select * from t1 where txt <= 'Chevy';
|
||||
select * from t1 where txt > 'Chevy';
|
||||
select * from t1 where txt >= 'Chevy';
|
||||
alter table t1 modify column txt blob;
|
||||
explain select * from t1 where txt='Chevy' or txt is NULL;
|
||||
select * from t1 where txt='Chevy' or txt is NULL;
|
||||
explain select * from t1 where txt='Chevy' or txt is NULL order by txt;
|
||||
select * from t1 where txt='Chevy' or txt is NULL order by txt;
|
||||
drop table t1;
|
||||
|
||||
CREATE TABLE t1 ( i int(11) NOT NULL default '0', c text NOT NULL, PRIMARY KEY (i), KEY (c(1),c(1)));
|
||||
INSERT t1 VALUES (1,''),(2,''),(3,'asdfh'),(4,'');
|
||||
select max(i) from t1 where c = '';
|
||||
|
|
|
@ -234,3 +234,13 @@ alter table t1 add i int default 10;
|
|||
select * from t1;
|
||||
drop table t1;
|
||||
|
||||
|
||||
# Test for bug #4491, TIMESTAMP(19) should be possible to create and not
|
||||
# only read in 4.0
|
||||
#
|
||||
create table t1 (ts timestamp(19));
|
||||
show create table t1;
|
||||
set TIMESTAMP=1000000000;
|
||||
insert into t1 values ();
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
|
|
|
@ -17,9 +17,9 @@
|
|||
#include <my_global.h>
|
||||
#include <m_string.h>
|
||||
#include <stdlib.h>
|
||||
#include <my_getopt.h>
|
||||
#include <my_sys.h>
|
||||
#include <mysys_err.h>
|
||||
#include <my_getopt.h>
|
||||
|
||||
static int findopt(char *optpat, uint length,
|
||||
const struct my_option **opt_res,
|
||||
|
@ -56,6 +56,13 @@ char *disabled_my_option= (char*) "0";
|
|||
|
||||
my_bool my_getopt_print_errors= 1;
|
||||
|
||||
void default_reporter(enum loglevel level, const char *format, ...)
|
||||
{
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
vfprintf(stderr, format, args);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
/*
|
||||
function: handle_options
|
||||
|
@ -76,10 +83,8 @@ void my_getopt_register_get_addr(gptr* (*func_addr)(const char *, uint,
|
|||
}
|
||||
|
||||
int handle_options(int *argc, char ***argv,
|
||||
const struct my_option *longopts,
|
||||
my_bool (*get_one_option)(int,
|
||||
const struct my_option *,
|
||||
char *))
|
||||
const struct my_option *longopts, my_get_one_option get_one_option,
|
||||
my_error_reporter reporter)
|
||||
{
|
||||
uint opt_found, argvpos= 0, length, i;
|
||||
my_bool end_of_options= 0, must_be_var, set_maximum_value,
|
||||
|
@ -95,6 +100,8 @@ int handle_options(int *argc, char ***argv,
|
|||
(*argv)++; /* --- || ---- */
|
||||
init_variables(longopts);
|
||||
|
||||
if (! reporter) reporter = &default_reporter;
|
||||
|
||||
for (pos= *argv, pos_end=pos+ *argc; pos != pos_end ; pos++)
|
||||
{
|
||||
char *cur_arg= *pos;
|
||||
|
@ -118,8 +125,8 @@ int handle_options(int *argc, char ***argv,
|
|||
if (!*++pos)
|
||||
{
|
||||
if (my_getopt_print_errors)
|
||||
fprintf(stderr, "%s: Option '-O' requires an argument\n",
|
||||
my_progname);
|
||||
reporter(ERROR_LEVEL, "%s: Option '-O' requires an argument\n",
|
||||
my_progname);
|
||||
return EXIT_ARGUMENT_REQUIRED;
|
||||
}
|
||||
cur_arg= *pos;
|
||||
|
@ -135,9 +142,8 @@ int handle_options(int *argc, char ***argv,
|
|||
if (!*cur_arg)
|
||||
{
|
||||
if (my_getopt_print_errors)
|
||||
fprintf(stderr,
|
||||
"%s: Option '--set-variable' requires an argument\n",
|
||||
my_progname);
|
||||
reporter(ERROR_LEVEL, "%s: Option '--set-variable' requires an argument\n",
|
||||
my_progname);
|
||||
return EXIT_ARGUMENT_REQUIRED;
|
||||
}
|
||||
}
|
||||
|
@ -149,9 +155,8 @@ int handle_options(int *argc, char ***argv,
|
|||
if (!*++pos)
|
||||
{
|
||||
if (my_getopt_print_errors)
|
||||
fprintf(stderr,
|
||||
"%s: Option '--set-variable' requires an argument\n",
|
||||
my_progname);
|
||||
reporter(ERROR_LEVEL, "%s: Option '--set-variable' requires an argument\n",
|
||||
my_progname);
|
||||
return EXIT_ARGUMENT_REQUIRED;
|
||||
}
|
||||
cur_arg= *pos;
|
||||
|
@ -210,7 +215,7 @@ int handle_options(int *argc, char ***argv,
|
|||
if (opt_found > 1)
|
||||
{
|
||||
if (my_getopt_print_errors)
|
||||
fprintf(stderr,
|
||||
reporter(ERROR_LEVEL,
|
||||
"%s: ambiguous option '--%s-%s' (--%s-%s)\n",
|
||||
my_progname, special_opt_prefix[i], opt_str,
|
||||
special_opt_prefix[i], prev_found);
|
||||
|
@ -245,18 +250,16 @@ int handle_options(int *argc, char ***argv,
|
|||
if (must_be_var)
|
||||
{
|
||||
if (my_getopt_print_errors)
|
||||
fprintf(stderr,
|
||||
"%s: %s: unknown variable '%s'\n", my_progname,
|
||||
option_is_loose ? "WARNING" : "ERROR", opt_str);
|
||||
reporter(option_is_loose ? WARNING_LEVEL : ERROR_LEVEL,
|
||||
"%s: unknown variable '%s'\n", my_progname, cur_arg);
|
||||
if (!option_is_loose)
|
||||
return EXIT_UNKNOWN_VARIABLE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (my_getopt_print_errors)
|
||||
fprintf(stderr,
|
||||
"%s: %s: unknown option '--%s'\n", my_progname,
|
||||
option_is_loose ? "WARNING" : "ERROR", opt_str);
|
||||
reporter(option_is_loose ? WARNING_LEVEL : ERROR_LEVEL,
|
||||
"%s: unknown option '--%s'\n", my_progname, cur_arg);
|
||||
if (!option_is_loose)
|
||||
return EXIT_UNKNOWN_OPTION;
|
||||
}
|
||||
|
@ -272,14 +275,14 @@ int handle_options(int *argc, char ***argv,
|
|||
if (must_be_var)
|
||||
{
|
||||
if (my_getopt_print_errors)
|
||||
fprintf(stderr, "%s: variable prefix '%s' is not unique\n",
|
||||
reporter(ERROR_LEVEL, "%s: variable prefix '%s' is not unique\n",
|
||||
my_progname, opt_str);
|
||||
return EXIT_VAR_PREFIX_NOT_UNIQUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (my_getopt_print_errors)
|
||||
fprintf(stderr, "%s: ambiguous option '--%s' (%s, %s)\n",
|
||||
reporter(ERROR_LEVEL, "%s: ambiguous option '--%s' (%s, %s)\n",
|
||||
my_progname, opt_str, prev_found, optp->name);
|
||||
return EXIT_AMBIGUOUS_OPTION;
|
||||
}
|
||||
|
@ -300,7 +303,7 @@ int handle_options(int *argc, char ***argv,
|
|||
if (must_be_var && (optp->var_type & GET_TYPE_MASK) == GET_NO_ARG)
|
||||
{
|
||||
if (my_getopt_print_errors)
|
||||
fprintf(stderr, "%s: option '%s' cannot take an argument\n",
|
||||
reporter(ERROR_LEVEL, "%s: option '%s' cannot take an argument\n",
|
||||
my_progname, optp->name);
|
||||
return EXIT_NO_ARGUMENT_ALLOWED;
|
||||
}
|
||||
|
@ -312,7 +315,7 @@ int handle_options(int *argc, char ***argv,
|
|||
if (optend && (optp->var_type & GET_TYPE_MASK) != GET_BOOL)
|
||||
{
|
||||
if (my_getopt_print_errors)
|
||||
fprintf(stderr, "%s: option '--%s' cannot take an argument\n",
|
||||
reporter(ERROR_LEVEL, "%s: option '--%s' cannot take an argument\n",
|
||||
my_progname, optp->name);
|
||||
return EXIT_NO_ARGUMENT_ALLOWED;
|
||||
}
|
||||
|
@ -351,7 +354,7 @@ int handle_options(int *argc, char ***argv,
|
|||
if (!*++pos)
|
||||
{
|
||||
if (my_getopt_print_errors)
|
||||
fprintf(stderr, "%s: option '--%s' requires an argument\n",
|
||||
reporter(ERROR_LEVEL, "%s: option '--%s' requires an argument\n",
|
||||
my_progname, optp->name);
|
||||
return EXIT_ARGUMENT_REQUIRED;
|
||||
}
|
||||
|
@ -410,7 +413,7 @@ int handle_options(int *argc, char ***argv,
|
|||
if (!pos[1])
|
||||
{
|
||||
if (my_getopt_print_errors)
|
||||
fprintf(stderr,
|
||||
reporter(ERROR_LEVEL,
|
||||
"%s: option '-%c' requires an argument\n",
|
||||
my_progname, optp->id);
|
||||
return EXIT_ARGUMENT_REQUIRED;
|
||||
|
@ -423,7 +426,7 @@ int handle_options(int *argc, char ***argv,
|
|||
if ((error= setval(optp, optp->value, argument,
|
||||
set_maximum_value)))
|
||||
{
|
||||
fprintf(stderr,
|
||||
reporter(ERROR_LEVEL,
|
||||
"%s: Error while setting value '%s' to '%s'\n",
|
||||
my_progname, argument, optp->name);
|
||||
return error;
|
||||
|
@ -435,7 +438,7 @@ int handle_options(int *argc, char ***argv,
|
|||
if (!opt_found)
|
||||
{
|
||||
if (my_getopt_print_errors)
|
||||
fprintf(stderr,
|
||||
reporter(ERROR_LEVEL,
|
||||
"%s: unknown option '-%c'\n", my_progname, *optend);
|
||||
return EXIT_UNKNOWN_OPTION;
|
||||
}
|
||||
|
@ -445,7 +448,7 @@ int handle_options(int *argc, char ***argv,
|
|||
}
|
||||
if ((error= setval(optp, value, argument, set_maximum_value)))
|
||||
{
|
||||
fprintf(stderr,
|
||||
reporter(ERROR_LEVEL,
|
||||
"%s: Error while setting value '%s' to '%s'\n",
|
||||
my_progname, argument, optp->name);
|
||||
return error;
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#define CFG_NODE_BYTE_ORDER 4
|
||||
#define CFG_NODE_HOST 5
|
||||
#define CFG_NODE_SYSTEM 6
|
||||
#define CFG_NODE_DATADIR 7
|
||||
|
||||
/**
|
||||
* DB config parameters
|
||||
|
@ -89,6 +90,8 @@
|
|||
|
||||
#define CFG_DB_LONG_SIGNAL_BUFFER 157
|
||||
|
||||
#define CFG_DB_BACKUP_DATADIR 158
|
||||
|
||||
#define CFG_NODE_ARBIT_RANK 200
|
||||
#define CFG_NODE_ARBIT_DELAY 201
|
||||
|
||||
|
|
|
@ -78,6 +78,11 @@ public:
|
|||
* Get config from file
|
||||
*/
|
||||
struct ndb_mgm_configuration * getConfig(const char * file);
|
||||
|
||||
/**
|
||||
* Verify config
|
||||
*/
|
||||
bool verifyConfig(const struct ndb_mgm_configuration *, Uint32 nodeid);
|
||||
private:
|
||||
BaseString errorString;
|
||||
enum ErrorType {
|
||||
|
@ -97,11 +102,6 @@ private:
|
|||
Uint32 m_version;
|
||||
Uint32 m_node_type;
|
||||
NdbMgmHandle m_handle;
|
||||
|
||||
/**
|
||||
* Verify config
|
||||
*/
|
||||
bool verifyConfig(const struct ndb_mgm_configuration *);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
void NdbConfig_SetPath(const char *path);
|
||||
char* NdbConfig_NdbCfgName(int with_ndb_home);
|
||||
char* NdbConfig_ErrorFileName(int node_id);
|
||||
char* NdbConfig_ClusterLogFileName(int node_id);
|
||||
|
|
|
@ -93,6 +93,14 @@ extern int strcasecmp(const char *s1, const char *s2);
|
|||
extern int strncasecmp(const char *s1, const char *s2, size_t n);
|
||||
#endif
|
||||
|
||||
#ifdef SCO
|
||||
|
||||
#ifndef PATH_MAX
|
||||
#define PATH_MAX 1024
|
||||
#endif
|
||||
|
||||
#endif /* SCO */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -14,8 +14,8 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
#include <ndb_global.h>
|
||||
#include <FileLogHandler.hpp>
|
||||
|
||||
#include <File.hpp>
|
||||
|
||||
//
|
||||
|
@ -146,7 +146,7 @@ FileLogHandler::createNewFile()
|
|||
{
|
||||
bool rc = true;
|
||||
int fileNo = 1;
|
||||
char newName[MAXPATHLEN];
|
||||
char newName[PATH_MAX];
|
||||
|
||||
do
|
||||
{
|
||||
|
|
|
@ -154,7 +154,7 @@ ConfigRetriever::getConfig() {
|
|||
if(p == 0)
|
||||
return 0;
|
||||
|
||||
if(!verifyConfig(p)){
|
||||
if(!verifyConfig(p, _ownNodeId)){
|
||||
free(p);
|
||||
p= 0;
|
||||
}
|
||||
|
@ -239,7 +239,7 @@ ConfigRetriever::setConnectString(const char * connectString) {
|
|||
}
|
||||
|
||||
bool
|
||||
ConfigRetriever::verifyConfig(const struct ndb_mgm_configuration * conf){
|
||||
ConfigRetriever::verifyConfig(const struct ndb_mgm_configuration * conf, Uint32 nodeid){
|
||||
|
||||
char buf[255];
|
||||
ndb_mgm_configuration_iterator * it;
|
||||
|
@ -253,8 +253,8 @@ ConfigRetriever::verifyConfig(const struct ndb_mgm_configuration * conf){
|
|||
}
|
||||
NdbAutoPtr<ndb_mgm_configuration_iterator> ptr(it);
|
||||
|
||||
if(ndb_mgm_find(it, CFG_NODE_ID, _ownNodeId) != 0){
|
||||
snprintf(buf, 255, "Unable to find node with id: %d", _ownNodeId);
|
||||
if(ndb_mgm_find(it, CFG_NODE_ID, nodeid) != 0){
|
||||
snprintf(buf, 255, "Unable to find node with id: %d", nodeid);
|
||||
setError(CR_ERROR, buf);
|
||||
return false;
|
||||
}
|
||||
|
@ -266,6 +266,11 @@ ConfigRetriever::verifyConfig(const struct ndb_mgm_configuration * conf){
|
|||
return false;
|
||||
}
|
||||
|
||||
const char * datadir;
|
||||
if(!ndb_mgm_get_string_parameter(it, CFG_NODE_DATADIR, &datadir)){
|
||||
NdbConfig_SetPath(datadir);
|
||||
}
|
||||
|
||||
char localhost[MAXHOSTNAMELEN];
|
||||
if(NdbHost_GetHostName(localhost) != 0){
|
||||
snprintf(buf, 255, "Unable to get own hostname");
|
||||
|
@ -332,8 +337,8 @@ ConfigRetriever::verifyConfig(const struct ndb_mgm_configuration * conf){
|
|||
if(iter.get(CFG_CONNECTION_NODE_1, &nodeId1)) continue;
|
||||
if(iter.get(CFG_CONNECTION_NODE_2, &nodeId2)) continue;
|
||||
|
||||
if(nodeId1 != _ownNodeId && nodeId2 != _ownNodeId) continue;
|
||||
remoteNodeId = (_ownNodeId == nodeId1 ? nodeId2 : nodeId1);
|
||||
if(nodeId1 != nodeid && nodeId2 != nodeid) continue;
|
||||
remoteNodeId = (nodeid == nodeId1 ? nodeId2 : nodeId1);
|
||||
|
||||
const char * name;
|
||||
struct in_addr addr;
|
||||
|
@ -342,7 +347,7 @@ ConfigRetriever::verifyConfig(const struct ndb_mgm_configuration * conf){
|
|||
if(Ndb_getInAddr(&addr, name) != 0){
|
||||
tmp.assfmt("Unable to lookup/illegal hostname %s, "
|
||||
"connection from node %d to node %d",
|
||||
name, _ownNodeId, remoteNodeId);
|
||||
name, nodeid, remoteNodeId);
|
||||
setError(CR_ERROR, tmp.c_str());
|
||||
return false;
|
||||
}
|
||||
|
@ -352,7 +357,7 @@ ConfigRetriever::verifyConfig(const struct ndb_mgm_configuration * conf){
|
|||
if(Ndb_getInAddr(&addr, name) != 0){
|
||||
tmp.assfmt("Unable to lookup/illegal hostname %s, "
|
||||
"connection from node %d to node %d",
|
||||
name, _ownNodeId, remoteNodeId);
|
||||
name, nodeid, remoteNodeId);
|
||||
setError(CR_ERROR, tmp.c_str());
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -1,23 +1,13 @@
|
|||
MYSQLDATAdir = $(localstatedir)
|
||||
MYSQLSHAREdir = $(pkgdatadir)
|
||||
MYSQLBASEdir= $(prefix)
|
||||
|
||||
noinst_LTLIBRARIES = libmgmsrvcommon.la
|
||||
|
||||
libmgmsrvcommon_la_SOURCES = \
|
||||
LocalConfig.cpp \
|
||||
Config.cpp \
|
||||
ConfigInfo.cpp \
|
||||
ConfigRetriever.cpp \
|
||||
InitConfigFileParser.cpp \
|
||||
IPCConfig.cpp NdbConfig.c
|
||||
|
||||
INCLUDES_LOC = -I$(top_srcdir)/ndb/src/mgmapi
|
||||
INCLUDES_LOC = -I$(top_srcdir)/ndb/src/mgmapi -I$(top_srcdir)/ndb/src/mgmsrv
|
||||
|
||||
DEFS_LOC = -DDEFAULT_MYSQL_HOME="\"$(MYSQLBASEdir)\"" \
|
||||
-DDATADIR="\"$(MYSQLDATAdir)\"" \
|
||||
-DSHAREDIR="\"$(MYSQLSHAREdir)\"" \
|
||||
-DNDB_BASE_PORT="\"@ndb_port_base@\""
|
||||
DEFS_LOC = -DNDB_BASE_PORT="\"@ndb_port_base@\""
|
||||
|
||||
include $(top_srcdir)/ndb/config/common.mk.am
|
||||
include $(top_srcdir)/ndb/config/type_ndbapi.mk.am
|
||||
|
|
|
@ -19,6 +19,8 @@
|
|||
#include <NdbEnv.h>
|
||||
#include <NdbMem.h>
|
||||
|
||||
static char *datadir_path= 0;
|
||||
|
||||
static char*
|
||||
NdbConfig_AllocHomePath(int _len)
|
||||
{
|
||||
|
@ -27,19 +29,27 @@ NdbConfig_AllocHomePath(int _len)
|
|||
int path_len= 0;
|
||||
char *buf;
|
||||
|
||||
if (path == 0)
|
||||
path= datadir_path;
|
||||
|
||||
if (path)
|
||||
path_len= strlen(path);
|
||||
|
||||
len+= path_len;
|
||||
buf= NdbMem_Allocate(len);
|
||||
if (path_len > 0)
|
||||
snprintf(buf, len, "%s%c", path, DIR_SEPARATOR);
|
||||
snprintf(buf, len, "%s%s", path, DIR_SEPARATOR);
|
||||
else
|
||||
buf[0]= 0;
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
void
|
||||
NdbConfig_SetPath(const char* path){
|
||||
datadir_path= path;
|
||||
}
|
||||
|
||||
char*
|
||||
NdbConfig_NdbCfgName(int with_ndb_home){
|
||||
char *buf;
|
||||
|
|
|
@ -52,7 +52,10 @@ LDADD += \
|
|||
$(top_builddir)/ndb/src/common/mgmcommon/libmgmsrvcommon.la \
|
||||
$(top_builddir)/ndb/src/mgmapi/libmgmapi.la \
|
||||
$(top_builddir)/ndb/src/common/portlib/libportlib.la \
|
||||
$(top_builddir)/ndb/src/common/util/libgeneral.la
|
||||
$(top_builddir)/ndb/src/common/util/libgeneral.la \
|
||||
$(top_builddir)/dbug/libdbug.a \
|
||||
$(top_builddir)/mysys/libmysys.a \
|
||||
$(top_builddir)/strings/libmystrings.a
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
||||
|
|
|
@ -5,7 +5,7 @@ Next DBACC 3001
|
|||
Next DBTUP 4007
|
||||
Next DBLQH 5040
|
||||
Next DBDICT 6006
|
||||
Next DBDIH 7173
|
||||
Next DBDIH 7174
|
||||
Next DBTC 8035
|
||||
Next CMVMI 9000
|
||||
Next BACKUP 10022
|
||||
|
@ -387,6 +387,11 @@ Backup Stuff:
|
|||
|
||||
5028: Crash when receiving LQHKEYREQ (in non-master)
|
||||
|
||||
Failed Create Table:
|
||||
--------------------
|
||||
7173: Create table failed due to not sufficient number of fragment or
|
||||
replica records.
|
||||
|
||||
Drop Table/Index:
|
||||
-----------------
|
||||
4001: Crash on REL_TABMEMREQ in TUP
|
||||
|
|
|
@ -46,6 +46,7 @@
|
|||
|
||||
// Used here only to print event reports on stdout/console.
|
||||
EventLogger g_eventLogger;
|
||||
extern int simulate_error_during_shutdown;
|
||||
|
||||
Cmvmi::Cmvmi(const Configuration & conf) :
|
||||
SimulatedBlock(CMVMI, conf)
|
||||
|
@ -148,6 +149,16 @@ void Cmvmi::execNDB_TAMPER(Signal* signal)
|
|||
if(ERROR_INSERTED(9997)){
|
||||
ndbrequire(false);
|
||||
}
|
||||
|
||||
if(ERROR_INSERTED(9996)){
|
||||
simulate_error_during_shutdown= SIGSEGV;
|
||||
ndbrequire(false);
|
||||
}
|
||||
|
||||
if(ERROR_INSERTED(9995)){
|
||||
simulate_error_during_shutdown= SIGSEGV;
|
||||
kill(getpid(), SIGABRT);
|
||||
}
|
||||
}//execNDB_TAMPER()
|
||||
|
||||
void Cmvmi::execSET_LOGLEVELORD(Signal* signal)
|
||||
|
|
|
@ -6174,7 +6174,7 @@ void Dbdih::execCREATE_FRAGMENTATION_REQ(Signal * signal){
|
|||
break;
|
||||
case DictTabInfo::AllNodesLargeTable:
|
||||
jam();
|
||||
noOfFragments = csystemnodes;
|
||||
noOfFragments = 4 * csystemnodes;
|
||||
break;
|
||||
case DictTabInfo::SingleFragment:
|
||||
jam();
|
||||
|
@ -6425,6 +6425,10 @@ void Dbdih::execDIADDTABREQ(Signal* signal)
|
|||
tabPtr.p->totalfragments = noFragments;
|
||||
ndbrequire(noReplicas == cnoReplicas); // Only allowed
|
||||
|
||||
if (ERROR_INSERTED(7173)) {
|
||||
addtabrefuseLab(signal, connectPtr, ZREPLERROR1);
|
||||
return;
|
||||
}
|
||||
if ((noReplicas * noFragments) > cnoFreeReplicaRec) {
|
||||
jam();
|
||||
addtabrefuseLab(signal, connectPtr, ZREPLERROR1);
|
||||
|
@ -6736,13 +6740,15 @@ void Dbdih::tableDeleteLab(Signal* signal, FileRecordPtr filePtr)
|
|||
void Dbdih::releaseTable(TabRecordPtr tabPtr)
|
||||
{
|
||||
FragmentstorePtr fragPtr;
|
||||
for (Uint32 fragId = 0; fragId < tabPtr.p->totalfragments; fragId++) {
|
||||
jam();
|
||||
getFragstore(tabPtr.p, fragId, fragPtr);
|
||||
releaseReplicas(fragPtr.p->storedReplicas);
|
||||
releaseReplicas(fragPtr.p->oldStoredReplicas);
|
||||
}//for
|
||||
releaseFragments(tabPtr);
|
||||
if (tabPtr.p->noOfFragChunks > 0) {
|
||||
for (Uint32 fragId = 0; fragId < tabPtr.p->totalfragments; fragId++) {
|
||||
jam();
|
||||
getFragstore(tabPtr.p, fragId, fragPtr);
|
||||
releaseReplicas(fragPtr.p->storedReplicas);
|
||||
releaseReplicas(fragPtr.p->oldStoredReplicas);
|
||||
}//for
|
||||
releaseFragments(tabPtr);
|
||||
}
|
||||
if (tabPtr.p->tabFile[0] != RNIL) {
|
||||
jam();
|
||||
releaseFile(tabPtr.p->tabFile[0]);
|
||||
|
@ -6875,9 +6881,6 @@ Uint32 Dbdih::extractNodeInfo(const Fragmentstore * fragPtr, Uint32 nodes[])
|
|||
return nodeCount;
|
||||
}//Dbdih::extractNodeInfo()
|
||||
|
||||
#define NO_OF_FRAGS_PER_CHUNK 16
|
||||
#define LOG_NO_OF_FRAGS_PER_CHUNK 4
|
||||
|
||||
void
|
||||
Dbdih::getFragstore(TabRecord * tab, //In parameter
|
||||
Uint32 fragNo, //In parameter
|
||||
|
@ -11051,6 +11054,7 @@ void Dbdih::initRestorableGciFiles()
|
|||
|
||||
void Dbdih::initTable(TabRecordPtr tabPtr)
|
||||
{
|
||||
tabPtr.p->noOfFragChunks = 0;
|
||||
tabPtr.p->method = TabRecord::NOTDEFINED;
|
||||
tabPtr.p->tabStatus = TabRecord::TS_IDLE;
|
||||
tabPtr.p->noOfWords = 0;
|
||||
|
|
|
@ -287,6 +287,22 @@ Dbtux::execDROP_TAB_REQ(Signal* signal)
|
|||
const DropTabReq reqCopy = *(const DropTabReq*)signal->getDataPtr();
|
||||
const DropTabReq* const req = &reqCopy;
|
||||
IndexPtr indexPtr;
|
||||
|
||||
Uint32 tableId = req->tableId;
|
||||
Uint32 senderRef = req->senderRef;
|
||||
Uint32 senderData = req->senderData;
|
||||
if (tableId >= c_indexPool.getSize()) {
|
||||
jam();
|
||||
// reply to sender
|
||||
DropTabConf* const conf = (DropTabConf*)signal->getDataPtrSend();
|
||||
conf->senderRef = reference();
|
||||
conf->senderData = senderData;
|
||||
conf->tableId = tableId;
|
||||
sendSignal(senderRef, GSN_DROP_TAB_CONF,
|
||||
signal, DropTabConf::SignalLength, JBB);
|
||||
return;
|
||||
}
|
||||
|
||||
c_indexPool.getPtr(indexPtr, req->tableId);
|
||||
// drop works regardless of index state
|
||||
#ifdef VM_TRACE
|
||||
|
|
|
@ -108,8 +108,10 @@ AsyncFile::AsyncFile() :
|
|||
}
|
||||
|
||||
void
|
||||
AsyncFile::doStart(Uint32 nodeId, const char * filesystemPath) {
|
||||
theFileName.init(nodeId, filesystemPath);
|
||||
AsyncFile::doStart(Uint32 nodeId,
|
||||
const char * filesystemPath,
|
||||
const char * backup_path) {
|
||||
theFileName.init(nodeId, filesystemPath, backup_path);
|
||||
|
||||
// Stacksize for filesystem threads
|
||||
// An 8k stack should be enough
|
||||
|
|
|
@ -181,7 +181,7 @@ public:
|
|||
|
||||
void execute( Request* request );
|
||||
|
||||
void doStart(Uint32 nodeId, const char * fspath);
|
||||
void doStart(Uint32 nodeId, const char * fspath, const char * backup_path);
|
||||
// its a thread so its always running
|
||||
void run();
|
||||
|
||||
|
|
|
@ -46,43 +46,31 @@ Filename::Filename() :
|
|||
}
|
||||
|
||||
void
|
||||
Filename::init(Uint32 nodeid, const char * pFileSystemPath){
|
||||
Filename::init(Uint32 nodeid,
|
||||
const char * pFileSystemPath,
|
||||
const char * pBackupDirPath){
|
||||
DBUG_ENTER("Filename::init");
|
||||
|
||||
if (pFileSystemPath == NULL) {
|
||||
ERROR_SET(fatal, AFS_ERROR_NOPATH, ""," Filename::init()");
|
||||
return;
|
||||
}
|
||||
|
||||
strncpy(theBaseDirectory, pFileSystemPath, PATH_MAX);
|
||||
|
||||
// the environment variable is set,
|
||||
// check that it is pointing on a valid directory
|
||||
//
|
||||
char buf2[PATH_MAX]; memset(buf2, 0,sizeof(buf2));
|
||||
#ifdef NDB_WIN32
|
||||
char* szFilePart;
|
||||
if(!GetFullPathName(theBaseDirectory, sizeof(buf2), buf2, &szFilePart)
|
||||
|| (::GetFileAttributes(theBaseDirectory)&FILE_ATTRIBUTE_READONLY))
|
||||
#else
|
||||
if((::realpath(theBaseDirectory, buf2) == NULL)||
|
||||
(::access(theBaseDirectory, W_OK) != 0))
|
||||
#endif
|
||||
{
|
||||
ERROR_SET(fatal, AFS_ERROR_INVALIDPATH, pFileSystemPath, " Filename::init()");
|
||||
}
|
||||
strncpy(theBaseDirectory, buf2, sizeof(theBaseDirectory));
|
||||
// path seems ok, add delimiter if missing
|
||||
if (strcmp(&theBaseDirectory[strlen(theBaseDirectory) - 1],
|
||||
DIR_SEPARATOR) != 0)
|
||||
strcat(theBaseDirectory, DIR_SEPARATOR);
|
||||
|
||||
snprintf(buf2, sizeof(buf2), "ndb_%u_fs%s", nodeid, DIR_SEPARATOR);
|
||||
strcat(theBaseDirectory, buf2);
|
||||
snprintf(theFileSystemDirectory, sizeof(theFileSystemDirectory),
|
||||
"%sndb_%u_fs%s", pFileSystemPath, nodeid, DIR_SEPARATOR);
|
||||
strncpy(theBackupDirectory, pBackupDirPath, sizeof(theBackupDirectory));
|
||||
|
||||
DBUG_PRINT("info", ("theFileSystemDirectory=%s", theFileSystemDirectory));
|
||||
DBUG_PRINT("info", ("theBackupDirectory=%s", theBackupDirectory));
|
||||
|
||||
#ifdef NDB_WIN32
|
||||
CreateDirectory(theBaseDirectory, 0);
|
||||
CreateDirectory(theFileSystemDirectory, 0);
|
||||
#else
|
||||
mkdir(theBaseDirectory, S_IRUSR | S_IWUSR | S_IXUSR | S_IXGRP | S_IRGRP);
|
||||
mkdir(theFileSystemDirectory, S_IRUSR | S_IWUSR | S_IXUSR | S_IXGRP | S_IRGRP);
|
||||
#endif
|
||||
theBaseDirectory= 0;
|
||||
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
Filename::~Filename(){
|
||||
|
@ -94,10 +82,16 @@ Filename::set(BlockReference blockReference,
|
|||
{
|
||||
char buf[PATH_MAX];
|
||||
theLevelDepth = 0;
|
||||
strncpy(theName, theBaseDirectory, PATH_MAX);
|
||||
|
||||
|
||||
const Uint32 type = FsOpenReq::getSuffix(filenumber);
|
||||
const Uint32 version = FsOpenReq::getVersion(filenumber);
|
||||
|
||||
if (version == 2)
|
||||
theBaseDirectory= theBackupDirectory;
|
||||
else
|
||||
theBaseDirectory= theFileSystemDirectory;
|
||||
strncpy(theName, theBaseDirectory, PATH_MAX);
|
||||
|
||||
switch(version){
|
||||
case 1 :{
|
||||
const Uint32 diskNo = FsOpenReq::v1_getDisk(filenumber);
|
||||
|
|
|
@ -67,13 +67,16 @@ public:
|
|||
const char* directory(int level);
|
||||
int levels() const;
|
||||
const char* c_str() const;
|
||||
|
||||
void init(Uint32 nodeid, const char * fileSystemPath);
|
||||
|
||||
void init(Uint32 nodeid, const char * fileSystemPath,
|
||||
const char * backupDirPath);
|
||||
|
||||
private:
|
||||
int theLevelDepth;
|
||||
char theName[PATH_MAX];
|
||||
char theBaseDirectory[PATH_MAX];
|
||||
char theFileSystemDirectory[PATH_MAX];
|
||||
char theBackupDirectory[PATH_MAX];
|
||||
char *theBaseDirectory;
|
||||
char theDirectory[PATH_MAX];
|
||||
};
|
||||
|
||||
|
|
|
@ -58,6 +58,8 @@ Ndbfs::Ndbfs(const Configuration & conf) :
|
|||
m_maxOpenedFiles(0)
|
||||
{
|
||||
theFileSystemPath = conf.fileSystemPath();
|
||||
theBackupFilePath = conf.backupFilePath();
|
||||
|
||||
theRequestPool = new Pool<Request>;
|
||||
|
||||
const ndb_mgm_configuration_iterator * p = conf.getOwnConfigIterator();
|
||||
|
@ -559,7 +561,7 @@ Ndbfs::createAsyncFile(){
|
|||
}
|
||||
|
||||
AsyncFile* file = new AsyncFile;
|
||||
file->doStart(getOwnNodeId(), theFileSystemPath);
|
||||
file->doStart(getOwnNodeId(), theFileSystemPath, theBackupFilePath);
|
||||
|
||||
// Put the file in list of all files
|
||||
theFiles.push_back(file);
|
||||
|
|
|
@ -80,6 +80,7 @@ private:
|
|||
Vector<AsyncFile*> theIdleFiles; // List of idle AsyncFiles
|
||||
OpenFiles theOpenFiles; // List of open AsyncFiles
|
||||
const char * theFileSystemPath;
|
||||
const char * theBackupFilePath;
|
||||
|
||||
// Statistics variables
|
||||
Uint32 m_maxOpenedFiles;
|
||||
|
|
|
@ -22,6 +22,8 @@
|
|||
|
||||
extern const char programName[];
|
||||
|
||||
#define ERROR_SET_SIGNAL(messageCategory, messageID, problemData, objectRef) \
|
||||
ErrorReporter::handleError(messageCategory, messageID, problemData, objectRef, NST_ErrorHandlerSignal)
|
||||
#define ERROR_SET(messageCategory, messageID, problemData, objectRef) \
|
||||
ErrorReporter::handleError(messageCategory, messageID, problemData, objectRef)
|
||||
// Description:
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
#include <ndb_global.h>
|
||||
#include <my_pthread.h>
|
||||
|
||||
#include <ndb_version.h>
|
||||
#include "Configuration.hpp"
|
||||
|
@ -26,6 +27,7 @@
|
|||
#include <NdbOut.hpp>
|
||||
#include <NdbMain.h>
|
||||
#include <NdbDaemon.h>
|
||||
#include <NdbSleep.h>
|
||||
#include <NdbConfig.h>
|
||||
#include <WatchDog.hpp>
|
||||
|
||||
|
@ -39,6 +41,7 @@
|
|||
#endif
|
||||
|
||||
extern EventLogger g_eventLogger;
|
||||
extern NdbMutex * theShutdownMutex;
|
||||
|
||||
void catchsigs(bool ignore); // for process signal handling
|
||||
|
||||
|
@ -328,16 +331,24 @@ handler_shutdown(int signum){
|
|||
extern "C"
|
||||
void
|
||||
handler_error(int signum){
|
||||
// only let one thread run shutdown
|
||||
static long thread_id= 0;
|
||||
|
||||
if (thread_id != 0 && thread_id == my_thread_id())
|
||||
{
|
||||
// Shutdown thread received signal
|
||||
signal(signum, SIG_DFL);
|
||||
kill(getpid(), signum);
|
||||
while(true)
|
||||
NdbSleep_MilliSleep(10);
|
||||
}
|
||||
if(theShutdownMutex && NdbMutex_Trylock(theShutdownMutex) != 0)
|
||||
while(true)
|
||||
NdbSleep_MilliSleep(10);
|
||||
thread_id= my_thread_id();
|
||||
g_eventLogger.info("Received signal %d. Running error handler.", signum);
|
||||
// restart the system
|
||||
char errorData[40];
|
||||
snprintf(errorData, 40, "Signal %d received", signum);
|
||||
ERROR_SET(fatal, 0, errorData, __FILE__);
|
||||
ERROR_SET_SIGNAL(fatal, 0, errorData, __FILE__);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -14,6 +14,9 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
#include <ndb_global.h>
|
||||
#include <my_sys.h>
|
||||
|
||||
#include "Configuration.hpp"
|
||||
#include <ErrorHandlingMacros.hpp>
|
||||
#include "GlobalData.hpp"
|
||||
|
@ -56,6 +59,9 @@ Configuration::init(int argc, const char** argv){
|
|||
int _deamon = 0;
|
||||
int _help = 0;
|
||||
int _print_version = 0;
|
||||
#ifndef DBUG_OFF
|
||||
const char *debug_option= 0;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Arguments to NDB process
|
||||
|
@ -66,6 +72,10 @@ Configuration::init(int argc, const char** argv){
|
|||
{ "nostart", 'n', arg_flag, &_no_start,
|
||||
"Don't start ndbd immediately. Ndbd will await command from ndb_mgmd", "" },
|
||||
{ "daemon", 'd', arg_flag, &_deamon, "Start ndbd as daemon", "" },
|
||||
#ifndef DBUG_OFF
|
||||
{ "debug", 0, arg_string, &debug_option,
|
||||
"Specify debug options e.g. d:t:i:o,out.trace", "options" },
|
||||
#endif
|
||||
{ "initial", 'i', arg_flag, &_initial,
|
||||
"Perform initial start of ndbd, including cleaning the file system. Consult documentation before using this", "" },
|
||||
|
||||
|
@ -84,15 +94,17 @@ Configuration::init(int argc, const char** argv){
|
|||
return false;
|
||||
}
|
||||
|
||||
#if 0
|
||||
ndbout << "no_start=" <<_no_start<< endl;
|
||||
ndbout << "initial=" <<_initial<< endl;
|
||||
ndbout << "deamon=" <<_deamon<< endl;
|
||||
ndbout << "connect_str="<<_connect_str<<endl;
|
||||
arg_printusage(args, num_args, argv[0], desc);
|
||||
return false;
|
||||
#ifndef DBUG_OFF
|
||||
my_init();
|
||||
if (debug_option)
|
||||
DBUG_PUSH(debug_option);
|
||||
#endif
|
||||
|
||||
DBUG_PRINT("info", ("no_start=%d", _no_start));
|
||||
DBUG_PRINT("info", ("initial=%d", _initial));
|
||||
DBUG_PRINT("info", ("deamon=%d", _deamon));
|
||||
DBUG_PRINT("info", ("connect_str=%s", _connect_str));
|
||||
|
||||
ndbSetOwnVersion();
|
||||
|
||||
if (_print_version) {
|
||||
|
@ -132,6 +144,7 @@ Configuration::Configuration()
|
|||
_programName = 0;
|
||||
_connectString = 0;
|
||||
_fsPath = 0;
|
||||
_backupPath = 0;
|
||||
_initialStart = false;
|
||||
_daemonMode = false;
|
||||
m_config_retriever= 0;
|
||||
|
@ -144,6 +157,9 @@ Configuration::~Configuration(){
|
|||
if(_fsPath != NULL)
|
||||
free(_fsPath);
|
||||
|
||||
if(_backupPath != NULL)
|
||||
free(_backupPath);
|
||||
|
||||
if (m_config_retriever) {
|
||||
delete m_config_retriever;
|
||||
}
|
||||
|
@ -225,8 +241,48 @@ Configuration::fetch_configuration(){
|
|||
}
|
||||
}
|
||||
|
||||
static char * get_and_validate_path(ndb_mgm_configuration_iterator &iter,
|
||||
Uint32 param, const char *param_string)
|
||||
{
|
||||
const char* path = NULL;
|
||||
if(iter.get(param, &path)){
|
||||
ERROR_SET(fatal, ERR_INVALID_CONFIG, "Invalid configuration fetched missing ",
|
||||
param_string);
|
||||
}
|
||||
|
||||
if(path == 0 || strlen(path) == 0){
|
||||
ERROR_SET(fatal, ERR_INVALID_CONFIG,
|
||||
"Invalid configuration fetched. Configuration does not contain valid ",
|
||||
param_string);
|
||||
}
|
||||
|
||||
// check that it is pointing on a valid directory
|
||||
//
|
||||
char buf2[PATH_MAX];
|
||||
memset(buf2, 0,sizeof(buf2));
|
||||
#ifdef NDB_WIN32
|
||||
char* szFilePart;
|
||||
if(!GetFullPathName(path, sizeof(buf2), buf2, &szFilePart)
|
||||
|| (::GetFileAttributes(alloc_path)&FILE_ATTRIBUTE_READONLY))
|
||||
#else
|
||||
if((::realpath(path, buf2) == NULL)||
|
||||
(::access(buf2, W_OK) != 0))
|
||||
#endif
|
||||
{
|
||||
ERROR_SET(fatal, AFS_ERROR_INVALIDPATH, path, " Filename::init()");
|
||||
}
|
||||
|
||||
if (strcmp(&buf2[strlen(buf2) - 1], DIR_SEPARATOR))
|
||||
strcat(buf2, DIR_SEPARATOR);
|
||||
|
||||
return strdup(buf2);
|
||||
}
|
||||
|
||||
void
|
||||
Configuration::setupConfiguration(){
|
||||
|
||||
DBUG_ENTER("Configuration::setupConfiguration");
|
||||
|
||||
ndb_mgm_configuration * p = m_clusterConfig;
|
||||
|
||||
/**
|
||||
|
@ -272,29 +328,15 @@ Configuration::setupConfiguration(){
|
|||
}
|
||||
|
||||
/**
|
||||
* Get filesystem path
|
||||
* Get paths
|
||||
*/
|
||||
{
|
||||
const char* pFileSystemPath = NULL;
|
||||
if(iter.get(CFG_DB_FILESYSTEM_PATH, &pFileSystemPath)){
|
||||
ERROR_SET(fatal, ERR_INVALID_CONFIG, "Invalid configuration fetched",
|
||||
"FileSystemPath missing");
|
||||
}
|
||||
|
||||
if(pFileSystemPath == 0 || strlen(pFileSystemPath) == 0){
|
||||
ERROR_SET(fatal, ERR_INVALID_CONFIG, "Invalid configuration fetched",
|
||||
"Configuration does not contain valid filesystem path");
|
||||
}
|
||||
|
||||
if(pFileSystemPath[strlen(pFileSystemPath) - 1] == '/')
|
||||
_fsPath = strdup(pFileSystemPath);
|
||||
else {
|
||||
_fsPath = (char *)NdbMem_Allocate(strlen(pFileSystemPath) + 2);
|
||||
strcpy(_fsPath, pFileSystemPath);
|
||||
strcat(_fsPath, "/");
|
||||
}
|
||||
}
|
||||
|
||||
if (_fsPath)
|
||||
free(_fsPath);
|
||||
_fsPath= get_and_validate_path(iter, CFG_DB_FILESYSTEM_PATH, "FileSystemPath");
|
||||
if (_backupPath)
|
||||
free(_backupPath);
|
||||
_backupPath= get_and_validate_path(iter, CFG_DB_BACKUP_DATADIR, "BackupDataDir");
|
||||
|
||||
if(iter.get(CFG_DB_STOP_ON_ERROR_INSERT, &m_restartOnErrorInsert)){
|
||||
ERROR_SET(fatal, ERR_INVALID_CONFIG, "Invalid configuration fetched",
|
||||
"RestartOnErrorInsert missing");
|
||||
|
@ -315,6 +357,8 @@ Configuration::setupConfiguration(){
|
|||
(p, CFG_SECTION_NODE);
|
||||
|
||||
calcSizeAlt(cf);
|
||||
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -599,8 +643,12 @@ Configuration::calcSizeAlt(ConfigValues * ownConfig){
|
|||
cfg.put(CFG_DIH_CONNECT,
|
||||
noOfOperations + noOfTransactions + 46);
|
||||
|
||||
Uint32 noFragPerTable= ((noOfDBNodes + NO_OF_FRAGS_PER_CHUNK - 1) >>
|
||||
LOG_NO_OF_FRAGS_PER_CHUNK) <<
|
||||
LOG_NO_OF_FRAGS_PER_CHUNK;
|
||||
|
||||
cfg.put(CFG_DIH_FRAG_CONNECT,
|
||||
NO_OF_FRAG_PER_NODE * noOfMetaTables * noOfDBNodes);
|
||||
noFragPerTable * noOfMetaTables);
|
||||
|
||||
int temp;
|
||||
temp = noOfReplicas - 2;
|
||||
|
@ -611,7 +659,7 @@ Configuration::calcSizeAlt(ConfigValues * ownConfig){
|
|||
cfg.put(CFG_DIH_MORE_NODES,
|
||||
temp * NO_OF_FRAG_PER_NODE *
|
||||
noOfMetaTables * noOfDBNodes);
|
||||
|
||||
|
||||
cfg.put(CFG_DIH_REPLICAS,
|
||||
NO_OF_FRAG_PER_NODE * noOfMetaTables *
|
||||
noOfDBNodes * noOfReplicas);
|
||||
|
|
|
@ -53,6 +53,7 @@ public:
|
|||
// Cluster configuration
|
||||
const char * programName() const;
|
||||
const char * fileSystemPath() const;
|
||||
const char * backupFilePath() const;
|
||||
char * getConnectStringCopy() const;
|
||||
|
||||
/**
|
||||
|
@ -89,6 +90,7 @@ private:
|
|||
*/
|
||||
char * _programName;
|
||||
char * _fsPath;
|
||||
char * _backupPath;
|
||||
bool _initialStart;
|
||||
char * _connectString;
|
||||
bool _daemonMode;
|
||||
|
@ -108,6 +110,12 @@ Configuration::fileSystemPath() const {
|
|||
return _fsPath;
|
||||
}
|
||||
|
||||
inline
|
||||
const char *
|
||||
Configuration::backupFilePath() const {
|
||||
return _backupPath;
|
||||
}
|
||||
|
||||
inline
|
||||
bool
|
||||
Configuration::getInitialStart() const {
|
||||
|
|
|
@ -61,6 +61,7 @@ Uint32 theEmulatedJamBlockNumber = 0;
|
|||
|
||||
EmulatorData globalEmulatorData;
|
||||
NdbMutex * theShutdownMutex = 0;
|
||||
int simulate_error_during_shutdown= 0;
|
||||
|
||||
EmulatorData::EmulatorData(){
|
||||
theConfiguration = 0;
|
||||
|
@ -117,7 +118,8 @@ NdbShutdown(NdbShutdownType type,
|
|||
}
|
||||
}
|
||||
|
||||
if(NdbMutex_Trylock(theShutdownMutex) == 0){
|
||||
if((type == NST_ErrorHandlerSignal) || // Signal handler has already locked mutex
|
||||
(NdbMutex_Trylock(theShutdownMutex) == 0)){
|
||||
globalData.theRestartFlag = perform_stop;
|
||||
|
||||
bool restart = false;
|
||||
|
@ -145,6 +147,9 @@ NdbShutdown(NdbShutdownType type,
|
|||
case NST_ErrorHandler:
|
||||
ndbout << "Error handler " << shutting << " system" << endl;
|
||||
break;
|
||||
case NST_ErrorHandlerSignal:
|
||||
ndbout << "Error handler signal " << shutting << " system" << endl;
|
||||
break;
|
||||
case NST_Restart:
|
||||
ndbout << "Restarting system" << endl;
|
||||
break;
|
||||
|
@ -175,6 +180,12 @@ NdbShutdown(NdbShutdownType type,
|
|||
#endif
|
||||
}
|
||||
|
||||
if (simulate_error_during_shutdown) {
|
||||
kill(getpid(), simulate_error_during_shutdown);
|
||||
while(true)
|
||||
NdbSleep_MilliSleep(10);
|
||||
}
|
||||
|
||||
globalEmulatorData.theWatchDog->doStop();
|
||||
|
||||
#ifdef VM_TRACE
|
||||
|
|
|
@ -79,6 +79,7 @@ enum NdbShutdownType {
|
|||
NST_Normal,
|
||||
NST_Watchdog,
|
||||
NST_ErrorHandler,
|
||||
NST_ErrorHandlerSignal,
|
||||
NST_Restart,
|
||||
NST_ErrorInsert
|
||||
};
|
||||
|
|
|
@ -150,6 +150,13 @@
|
|||
#define NO_OF_FRAG_PER_NODE 1
|
||||
#define MAX_FRAG_PER_NODE 8
|
||||
|
||||
/**
|
||||
* DIH allocates fragments in chunk for fast find of fragment record.
|
||||
* These parameters define chunk size and log of chunk size.
|
||||
*/
|
||||
#define NO_OF_FRAGS_PER_CHUNK 4
|
||||
#define LOG_NO_OF_FRAGS_PER_CHUNK 2
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
// To avoid synching too big chunks at a time we synch after writing
|
||||
// a certain number of data/UNDO pages. (e.g. 2 MBytes).
|
||||
|
|
|
@ -47,10 +47,13 @@ static const char* helpText =
|
|||
"HELP DEBUG Help for debug compiled version\n"
|
||||
#endif
|
||||
"SHOW Print information about cluster\n"
|
||||
#if 0
|
||||
"SHOW CONFIG Print configuration\n"
|
||||
"SHOW PARAMETERS Print configuration parameters\n"
|
||||
#endif
|
||||
"START BACKUP Start backup\n"
|
||||
"ABORT BACKUP <backup id> Abort backup\n"
|
||||
"SHUTDOWN Shutdown all processed in cluster and quit\n"
|
||||
"CLUSTERLOG ON Enable Cluster logging\n"
|
||||
"CLUSTERLOG OFF Disable Cluster logging\n"
|
||||
"CLUSTERLOG FILTER <severity> Toggle severity filter on/off\n"
|
||||
|
@ -62,7 +65,9 @@ static const char* helpText =
|
|||
"EXIT SINGLE USER MODE Exit single user mode\n"
|
||||
"<id> STATUS Print status\n"
|
||||
"<id> CLUSTERLOG {<category>=<level>}+ Set log level for cluster log\n"
|
||||
#ifdef HAVE_GLOBAL_REPLICATION
|
||||
"REP CONNECT <host:port> Connect to REP server on host:port\n"
|
||||
#endif
|
||||
"QUIT Quit management client\n"
|
||||
;
|
||||
|
||||
|
@ -299,6 +304,10 @@ CommandInterpreter::readAndExecute(int _try_reconnect)
|
|||
executeShow(allAfterFirstToken);
|
||||
return true;
|
||||
}
|
||||
else if (strcmp(firstToken, "SHUTDOWN") == 0) {
|
||||
executeShutdown(allAfterFirstToken);
|
||||
return true;
|
||||
}
|
||||
else if (strcmp(firstToken, "CLUSTERLOG") == 0){
|
||||
executeClusterLog(allAfterFirstToken);
|
||||
return true;
|
||||
|
@ -628,6 +637,57 @@ CommandInterpreter::executeHelp(char* parameters)
|
|||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* SHUTDOWN
|
||||
*****************************************************************************/
|
||||
|
||||
void
|
||||
CommandInterpreter::executeShutdown(char* parameters)
|
||||
{
|
||||
connect();
|
||||
|
||||
ndb_mgm_cluster_state *state = ndb_mgm_get_status(m_mgmsrv);
|
||||
if(state == NULL) {
|
||||
ndbout_c("Could not get status");
|
||||
printError();
|
||||
return;
|
||||
}
|
||||
|
||||
int result = 0;
|
||||
result = ndb_mgm_stop(m_mgmsrv, 0, 0);
|
||||
if (result <= 0) {
|
||||
ndbout << "Shutdown failed." << endl;
|
||||
printError();
|
||||
return;
|
||||
}
|
||||
|
||||
ndbout << "NDB Cluster storage node(s) have shutdown." << endl;
|
||||
|
||||
int mgm_id= 0;
|
||||
for(int i=0; i < state->no_of_nodes; i++) {
|
||||
if(state->node_states[i].node_type == NDB_MGM_NODE_TYPE_MGM &&
|
||||
state->node_states[i].version != 0){
|
||||
if (mgm_id == 0)
|
||||
mgm_id= state->node_states[i].node_id;
|
||||
else {
|
||||
ndbout << "Unable to locate management server, shutdown manually with #STOP"
|
||||
<< endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
result = 0;
|
||||
result = ndb_mgm_stop(m_mgmsrv, 1, &mgm_id);
|
||||
if (result <= 0) {
|
||||
ndbout << "Shutdown failed." << endl;
|
||||
printError();
|
||||
return;
|
||||
}
|
||||
|
||||
ndbout << "NDB Cluster management server shutdown." << endl;
|
||||
exit(0);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* SHOW
|
||||
*****************************************************************************/
|
||||
|
|
|
@ -127,6 +127,7 @@ private:
|
|||
*/
|
||||
void executeHelp(char* parameters);
|
||||
void executeShow(char* parameters);
|
||||
void executeShutdown(char* parameters);
|
||||
void executeRun(char* parameters);
|
||||
void executeInfo(char* parameters);
|
||||
void executeClusterLog(char* parameters);
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
#include <string.h>
|
||||
#include "MgmtErrorReporter.hpp"
|
||||
#include <Properties.hpp>
|
||||
#include "ConfigInfo.hpp"
|
||||
|
||||
//*****************************************************************************
|
||||
// Ctor / Dtor
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue