Commit 1e76b778 authored by paul@kite-hub.kitebird.com's avatar paul@kite-hub.kitebird.com

Merge paul@bk-internal.mysql.com:/home/bk/mysql-5.0

into kite-hub.kitebird.com:/src/extern/MySQL/bk/mysql-5.0
parents dc5c99e2 28ee79a7
...@@ -73,7 +73,7 @@ LINK32=xilink6.exe ...@@ -73,7 +73,7 @@ LINK32=xilink6.exe
# PROP Ignore_Export_Lib 0 # PROP Ignore_Export_Lib 0
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBMYSQLD_EXPORTS" /YX /FD /GZ /c # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBMYSQLD_EXPORTS" /YX /FD /GZ /c
# ADD CPP /nologo /MT /W3 /Z7 /Od /I "../include" /I "../libmysqld" /I "../sql" /I "../regex" /I "../bdb/build_win32" /I "../zlib" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "HAVE_BERKELEY_DB" /D "USE_SYMDIR" /D "SIGNAL_WITH_VIO_CLOSE" /D "HAVE_DLOPEN" /D "EMBEDDED_LIBRARY" /D "HAVE_INNOBASE_DB" /D "USE_TLS" /D "__WIN__" /FD /GZ /c # ADD CPP /nologo /MT /W3 /Z7 /Od /I "../include" /I "../libmysqld" /I "../sql" /I "../regex" /I "../bdb/build_win32" /I "../zlib" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "SAFEMALLOC" /D "HAVE_BERKELEY_DB" /D "USE_SYMDIR" /D "SIGNAL_WITH_VIO_CLOSE" /D "HAVE_DLOPEN" /D "EMBEDDED_LIBRARY" /D "HAVE_INNOBASE_DB" /D "USE_TLS" /D "__WIN__" /FD /GZ /c
# SUBTRACT CPP /X /Fr # SUBTRACT CPP /X /Fr
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
......
...@@ -330,6 +330,16 @@ static sig_handler mysql_end(int sig); ...@@ -330,6 +330,16 @@ static sig_handler mysql_end(int sig);
int main(int argc,char *argv[]) int main(int argc,char *argv[])
{ {
char buff[80]; char buff[80];
char *defaults, *extra_defaults;
char *emb_argv[3];
int emb_argc= 1;
emb_argv[0]= argv[0];
get_defaults_files(argc, argv, &defaults, &extra_defaults);
if (defaults)
emb_argv[emb_argc++]= defaults;
if (extra_defaults)
emb_argv[emb_argc++]= extra_defaults;
MY_INIT(argv[0]); MY_INIT(argv[0]);
DBUG_ENTER("main"); DBUG_ENTER("main");
...@@ -375,7 +385,7 @@ int main(int argc,char *argv[]) ...@@ -375,7 +385,7 @@ int main(int argc,char *argv[])
my_end(0); my_end(0);
exit(1); exit(1);
} }
if (mysql_server_init(0, NULL, (char**) server_default_groups)) if (mysql_server_init(emb_argc, emb_argv, (char**) server_default_groups))
{ {
free_defaults(defaults_argv); free_defaults(defaults_argv);
my_end(0); my_end(0);
......
...@@ -769,6 +769,8 @@ extern void reset_root_defaults(MEM_ROOT *mem_root, uint block_size, ...@@ -769,6 +769,8 @@ extern void reset_root_defaults(MEM_ROOT *mem_root, uint block_size,
extern char *strdup_root(MEM_ROOT *root,const char *str); extern char *strdup_root(MEM_ROOT *root,const char *str);
extern char *strmake_root(MEM_ROOT *root,const char *str,uint len); extern char *strmake_root(MEM_ROOT *root,const char *str,uint len);
extern char *memdup_root(MEM_ROOT *root,const char *str,uint len); extern char *memdup_root(MEM_ROOT *root,const char *str,uint len);
extern void get_defaults_files(int argc, char **argv,
char **defaults, char **extra_defaults);
extern int load_defaults(const char *conf_file, const char **groups, extern int load_defaults(const char *conf_file, const char **groups,
int *argc, char ***argv); int *argc, char ***argv);
extern int process_default_option_files(const char *conf_file, extern int process_default_option_files(const char *conf_file,
......
...@@ -219,12 +219,13 @@ static my_bool emb_mysql_read_query_result(MYSQL *mysql) ...@@ -219,12 +219,13 @@ static my_bool emb_mysql_read_query_result(MYSQL *mysql)
static int emb_stmt_execute(MYSQL_STMT *stmt) static int emb_stmt_execute(MYSQL_STMT *stmt)
{ {
DBUG_ENTER("emb_stmt_execute"); DBUG_ENTER("emb_stmt_execute");
char header[4];
int4store(header, stmt->stmt_id);
THD *thd= (THD*)stmt->mysql->thd; THD *thd= (THD*)stmt->mysql->thd;
thd->client_param_count= stmt->param_count; thd->client_param_count= stmt->param_count;
thd->client_params= stmt->params; thd->client_params= stmt->params;
if (emb_advanced_command(stmt->mysql, COM_EXECUTE,0,0, if (emb_advanced_command(stmt->mysql, COM_EXECUTE,0,0,
(const char*)&stmt->stmt_id,sizeof(stmt->stmt_id), header, sizeof(header), 1) ||
1) ||
emb_mysql_read_query_result(stmt->mysql)) emb_mysql_read_query_result(stmt->mysql))
{ {
NET *net= &stmt->mysql->net; NET *net= &stmt->mysql->net;
......
...@@ -143,6 +143,9 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user, ...@@ -143,6 +143,9 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
db ? db : "(Null)", db ? db : "(Null)",
user ? user : "(Null)")); user ? user : "(Null)"));
if (!host || !host[0])
host= mysql->options.host;
if (mysql->options.methods_to_use == MYSQL_OPT_USE_REMOTE_CONNECTION || if (mysql->options.methods_to_use == MYSQL_OPT_USE_REMOTE_CONNECTION ||
(mysql->options.methods_to_use == MYSQL_OPT_GUESS_CONNECTION && (mysql->options.methods_to_use == MYSQL_OPT_GUESS_CONNECTION &&
host && *host && strcmp(host,LOCAL_HOST))) host && *host && strcmp(host,LOCAL_HOST)))
......
...@@ -9,13 +9,13 @@ DataDir= CHOOSE_FILESYSTEM ...@@ -9,13 +9,13 @@ DataDir= CHOOSE_FILESYSTEM
MaxNoOfOrderedIndexes= CHOOSE_MaxNoOfOrderedIndexes MaxNoOfOrderedIndexes= CHOOSE_MaxNoOfOrderedIndexes
[ndbd] [ndbd]
HostName= CHOOSE_HOSTNAME_1 HostName= CHOOSE_HOSTNAME_1 # hostname is a valid network adress
[ndbd] [ndbd]
HostName= CHOOSE_HOSTNAME_2 HostName= CHOOSE_HOSTNAME_2 # hostname is a valid network adress
[ndb_mgmd] [ndb_mgmd]
DataDir= CHOOSE_FILESYSTEM DataDir= CHOOSE_FILESYSTEM #
PortNumber= CHOOSE_PORT_MGM PortNumber= CHOOSE_PORT_MGM
[mysqld] [mysqld]
......
...@@ -817,3 +817,15 @@ drop table t1; ...@@ -817,3 +817,15 @@ drop table t1;
select 'c' like '\_' as want0; select 'c' like '\_' as want0;
want0 want0
0 0
create table t1 (id integer, a varchar(100) character set utf8 collate utf8_unicode_ci);
insert into t1 values (1, 'Test');
select * from t1 where soundex(a) = soundex('Test');
id a
1 Test
select * from t1 where soundex(a) = soundex('TEST');
id a
1 Test
select * from t1 where soundex(a) = soundex('test');
id a
1 Test
drop table t1;
...@@ -70,7 +70,7 @@ def test t9 t9 c18 c18 1 4 1 Y 32768 0 63 ...@@ -70,7 +70,7 @@ def test t9 t9 c18 c18 1 4 1 Y 32768 0 63
def test t9 t9 c19 c19 1 1 1 Y 32768 0 63 def test t9 t9 c19 c19 1 1 1 Y 32768 0 63
def test t9 t9 c20 c20 254 1 1 Y 0 0 8 def test t9 t9 c20 c20 254 1 1 Y 0 0 8
def test t9 t9 c21 c21 254 10 10 Y 0 0 8 def test t9 t9 c21 c21 254 10 10 Y 0 0 8
def test t9 t9 c22 c22 254 30 30 Y 0 0 8 def test t9 t9 c22 c22 253 30 30 Y 0 0 8
def test t9 t9 c23 c23 252 255 8 Y 144 0 63 def test t9 t9 c23 c23 252 255 8 Y 144 0 63
def test t9 t9 c24 c24 252 255 8 Y 16 0 8 def test t9 t9 c24 c24 252 255 8 Y 16 0 8
def test t9 t9 c25 c25 252 65535 4 Y 144 0 63 def test t9 t9 c25 c25 252 65535 4 Y 144 0 63
...@@ -1926,7 +1926,7 @@ def @arg28 253 8192 10 Y 0 31 8 ...@@ -1926,7 +1926,7 @@ def @arg28 253 8192 10 Y 0 31 8
def @arg29 253 8192 8 Y 128 31 63 def @arg29 253 8192 8 Y 128 31 63
def @arg30 253 8192 8 Y 0 31 8 def @arg30 253 8192 8 Y 0 31 8
def @arg31 253 8192 3 Y 0 31 8 def @arg31 253 8192 3 Y 0 31 8
def @arg32 253 8192 6 Y 128 31 63 def @arg32 253 8192 6 Y 0 31 8
@arg01 @arg02 @arg03 @arg04 @arg05 @arg06 @arg07 @arg08 @arg09 @arg10 @arg11 @arg12 @arg13 @arg14 @arg15 @arg16 @arg17 @arg18 @arg19 @arg20 @arg21 @arg22 @arg23 @arg24 @arg25 @arg26 @arg27 @arg28 @arg29 @arg30 @arg31 @arg32 @arg01 @arg02 @arg03 @arg04 @arg05 @arg06 @arg07 @arg08 @arg09 @arg10 @arg11 @arg12 @arg13 @arg14 @arg15 @arg16 @arg17 @arg18 @arg19 @arg20 @arg21 @arg22 @arg23 @arg24 @arg25 @arg26 @arg27 @arg28 @arg29 @arg30 @arg31 @arg32
1 1 1 1 1 1 1 1 1 1 1 1 2004-02-29 2004-02-29 11:11:11 2004-02-29 11:11:11 11:11:11 2004 1 1 a 123456789a 123456789a123456789b123456789c tinyblob tinytext blob text mediumblob mediumtext longblob longtext one monday 1 1 1 1 1 1 1 1 1 1 1 1 2004-02-29 2004-02-29 11:11:11 2004-02-29 11:11:11 11:11:11 2004 1 1 a 123456789a 123456789a123456789b123456789c tinyblob tinytext blob text mediumblob mediumtext longblob longtext one monday
select @arg01:= c1, @arg02:= c2, @arg03:= c3, @arg04:= c4, select @arg01:= c1, @arg02:= c2, @arg03:= c3, @arg04:= c4,
...@@ -2023,7 +2023,7 @@ def @arg28 253 8192 10 Y 0 31 8 ...@@ -2023,7 +2023,7 @@ def @arg28 253 8192 10 Y 0 31 8
def @arg29 253 8192 8 Y 128 31 63 def @arg29 253 8192 8 Y 128 31 63
def @arg30 253 8192 8 Y 0 31 8 def @arg30 253 8192 8 Y 0 31 8
def @arg31 253 8192 3 Y 0 31 8 def @arg31 253 8192 3 Y 0 31 8
def @arg32 253 8192 6 Y 128 31 63 def @arg32 253 8192 6 Y 0 31 8
@arg01 @arg02 @arg03 @arg04 @arg05 @arg06 @arg07 @arg08 @arg09 @arg10 @arg11 @arg12 @arg13 @arg14 @arg15 @arg16 @arg17 @arg18 @arg19 @arg20 @arg21 @arg22 @arg23 @arg24 @arg25 @arg26 @arg27 @arg28 @arg29 @arg30 @arg31 @arg32 @arg01 @arg02 @arg03 @arg04 @arg05 @arg06 @arg07 @arg08 @arg09 @arg10 @arg11 @arg12 @arg13 @arg14 @arg15 @arg16 @arg17 @arg18 @arg19 @arg20 @arg21 @arg22 @arg23 @arg24 @arg25 @arg26 @arg27 @arg28 @arg29 @arg30 @arg31 @arg32
1 1 1 1 1 1 1 1 1 1 1 1 2004-02-29 2004-02-29 11:11:11 2004-02-29 11:11:11 11:11:11 2004 1 1 a 123456789a 123456789a123456789b123456789c tinyblob tinytext blob text mediumblob mediumtext longblob longtext one monday 1 1 1 1 1 1 1 1 1 1 1 1 2004-02-29 2004-02-29 11:11:11 2004-02-29 11:11:11 11:11:11 2004 1 1 a 123456789a 123456789a123456789b123456789c tinyblob tinytext blob text mediumblob mediumtext longblob longtext one monday
set @my_key= 0 ; set @my_key= 0 ;
...@@ -2111,7 +2111,7 @@ def @arg28 253 8192 10 Y 0 31 8 ...@@ -2111,7 +2111,7 @@ def @arg28 253 8192 10 Y 0 31 8
def @arg29 253 8192 8 Y 128 31 63 def @arg29 253 8192 8 Y 128 31 63
def @arg30 253 8192 8 Y 0 31 8 def @arg30 253 8192 8 Y 0 31 8
def @arg31 253 8192 3 Y 0 31 8 def @arg31 253 8192 3 Y 0 31 8
def @arg32 253 8192 6 Y 128 31 63 def @arg32 253 8192 6 Y 0 31 8
@arg01 @arg02 @arg03 @arg04 @arg05 @arg06 @arg07 @arg08 @arg09 @arg10 @arg11 @arg12 @arg13 @arg14 @arg15 @arg16 @arg17 @arg18 @arg19 @arg20 @arg21 @arg22 @arg23 @arg24 @arg25 @arg26 @arg27 @arg28 @arg29 @arg30 @arg31 @arg32 @arg01 @arg02 @arg03 @arg04 @arg05 @arg06 @arg07 @arg08 @arg09 @arg10 @arg11 @arg12 @arg13 @arg14 @arg15 @arg16 @arg17 @arg18 @arg19 @arg20 @arg21 @arg22 @arg23 @arg24 @arg25 @arg26 @arg27 @arg28 @arg29 @arg30 @arg31 @arg32
1 1 1 1 1 1 1 1 1 1 1 1 2004-02-29 2004-02-29 11:11:11 2004-02-29 11:11:11 11:11:11 2004 1 1 a 123456789a 123456789a123456789b123456789c tinyblob tinytext blob text mediumblob mediumtext longblob longtext one monday 1 1 1 1 1 1 1 1 1 1 1 1 2004-02-29 2004-02-29 11:11:11 2004-02-29 11:11:11 11:11:11 2004 1 1 a 123456789a 123456789a123456789b123456789c tinyblob tinytext blob text mediumblob mediumtext longblob longtext one monday
select c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, select c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12,
...@@ -2201,7 +2201,7 @@ def @arg28 253 8192 10 Y 0 31 8 ...@@ -2201,7 +2201,7 @@ def @arg28 253 8192 10 Y 0 31 8
def @arg29 253 8192 8 Y 128 31 63 def @arg29 253 8192 8 Y 128 31 63
def @arg30 253 8192 8 Y 0 31 8 def @arg30 253 8192 8 Y 0 31 8
def @arg31 253 8192 3 Y 0 31 8 def @arg31 253 8192 3 Y 0 31 8
def @arg32 253 8192 6 Y 128 31 63 def @arg32 253 8192 6 Y 0 31 8
@arg01 @arg02 @arg03 @arg04 @arg05 @arg06 @arg07 @arg08 @arg09 @arg10 @arg11 @arg12 @arg13 @arg14 @arg15 @arg16 @arg17 @arg18 @arg19 @arg20 @arg21 @arg22 @arg23 @arg24 @arg25 @arg26 @arg27 @arg28 @arg29 @arg30 @arg31 @arg32 @arg01 @arg02 @arg03 @arg04 @arg05 @arg06 @arg07 @arg08 @arg09 @arg10 @arg11 @arg12 @arg13 @arg14 @arg15 @arg16 @arg17 @arg18 @arg19 @arg20 @arg21 @arg22 @arg23 @arg24 @arg25 @arg26 @arg27 @arg28 @arg29 @arg30 @arg31 @arg32
1 1 1 1 1 1 1 1 1 1 1 1 2004-02-29 2004-02-29 11:11:11 2004-02-29 11:11:11 11:11:11 2004 1 1 a 123456789a 123456789a123456789b123456789c tinyblob tinytext blob text mediumblob mediumtext longblob longtext one monday 1 1 1 1 1 1 1 1 1 1 1 1 2004-02-29 2004-02-29 11:11:11 2004-02-29 11:11:11 11:11:11 2004 1 1 a 123456789a 123456789a123456789b123456789c tinyblob tinytext blob text mediumblob mediumtext longblob longtext one monday
set @my_key= 0 ; set @my_key= 0 ;
......
...@@ -818,6 +818,8 @@ ERROR 01000: Data truncated for column 'col1' at row 1 ...@@ -818,6 +818,8 @@ ERROR 01000: Data truncated for column 'col1' at row 1
INSERT INTO t1 (col2) VALUES ('hellobob'); INSERT INTO t1 (col2) VALUES ('hellobob');
ERROR 01000: Data truncated for column 'col2' at row 1 ERROR 01000: Data truncated for column 'col2' at row 1
INSERT INTO t1 (col2) VALUES ('hello '); INSERT INTO t1 (col2) VALUES ('hello ');
Warnings:
Note 1265 Data truncated for column 'col2' at row 1
UPDATE t1 SET col1 ='hellobob' WHERE col1 ='he'; UPDATE t1 SET col1 ='hellobob' WHERE col1 ='he';
ERROR 01000: Data truncated for column 'col1' at row 2 ERROR 01000: Data truncated for column 'col1' at row 2
UPDATE t1 SET col2 ='hellobob' WHERE col2 ='he'; UPDATE t1 SET col2 ='hellobob' WHERE col2 ='he';
......
...@@ -666,3 +666,12 @@ drop table t1; ...@@ -666,3 +666,12 @@ drop table t1;
# #
select 'c' like '\_' as want0; select 'c' like '\_' as want0;
#
# Bug #7730 Server crash using soundex on an utf8 table
#
create table t1 (id integer, a varchar(100) character set utf8 collate utf8_unicode_ci);
insert into t1 values (1, 'Test');
select * from t1 where soundex(a) = soundex('Test');
select * from t1 where soundex(a) = soundex('TEST');
select * from t1 where soundex(a) = soundex('test');
drop table t1;
...@@ -569,7 +569,6 @@ INSERT INTO t1 VALUES ('hello', 'hello'),('he', 'he'),('hello ', 'hello '); ...@@ -569,7 +569,6 @@ INSERT INTO t1 VALUES ('hello', 'hello'),('he', 'he'),('hello ', 'hello ');
INSERT INTO t1 (col1) VALUES ('hellobob'); INSERT INTO t1 (col1) VALUES ('hellobob');
--error 1265 --error 1265
INSERT INTO t1 (col2) VALUES ('hellobob'); INSERT INTO t1 (col2) VALUES ('hellobob');
--error 1265
INSERT INTO t1 (col2) VALUES ('hello '); INSERT INTO t1 (col2) VALUES ('hello ');
--error 1265 --error 1265
UPDATE t1 SET col1 ='hellobob' WHERE col1 ='he'; UPDATE t1 SET col1 ='hellobob' WHERE col1 ='he';
......
...@@ -112,20 +112,14 @@ static int search_files(const char *conf_file, int *argc, char ***argv, ...@@ -112,20 +112,14 @@ static int search_files(const char *conf_file, int *argc, char ***argv,
DBUG_ENTER("search_files"); DBUG_ENTER("search_files");
/* Check if we want to force the use a specific default file */ /* Check if we want to force the use a specific default file */
forced_default_file= 0; get_defaults_files(*argc, *argv,
if (*argc >= 2) (char **)&forced_default_file, &defaults_extra_file);
{ if (forced_default_file)
if (is_prefix(argv[0][1],"--defaults-file=")) forced_default_file= strchr(forced_default_file,'=')+1;
{ if (defaults_extra_file)
forced_default_file= strchr(argv[0][1],'=') + 1; defaults_extra_file= strchr(defaults_extra_file,'=')+1;
(*args_used)++;
} args_used+= (forced_default_file ? 1 : 0) + (defaults_extra_file ? 1 : 0);
else if (is_prefix(argv[0][1],"--defaults-extra-file="))
{
defaults_extra_file= strchr(argv[0][1],'=') + 1;
(*args_used)++;
}
}
if (forced_default_file) if (forced_default_file)
{ {
...@@ -261,6 +255,36 @@ static int handle_default_option(void *in_ctx, const char *group_name, ...@@ -261,6 +255,36 @@ static int handle_default_option(void *in_ctx, const char *group_name,
} }
/*
Gets --defaults-file and --defaults-extra-file options from command line.
SYNOPSIS
get_defaults_files()
argc Pointer to argc of original program
argv Pointer to argv of original program
defaults --defaults-file option
extra_defaults --defaults-extra-file option
RETURN
defaults and extra_defaults will be set to appropriate items
of argv array, or to NULL if there are no such options
*/
void get_defaults_files(int argc, char **argv,
char **defaults, char **extra_defaults)
{
*defaults=0;
*extra_defaults=0;
if (argc >= 2)
{
if (is_prefix(argv[1],"--defaults-file="))
*defaults= argv[1];
else if (is_prefix(argv[1],"--defaults-extra-file="))
*extra_defaults= argv[1];
}
}
/* /*
Read options from configurations files Read options from configurations files
......
...@@ -992,7 +992,11 @@ Backup::execUTIL_SEQUENCE_CONF(Signal* signal) ...@@ -992,7 +992,11 @@ Backup::execUTIL_SEQUENCE_CONF(Signal* signal)
}//if }//if
ndbrequire(ptr.p->masterData.state.getState() == DEFINING); ndbrequire(ptr.p->masterData.state.getState() == DEFINING);
ptr.p->backupId = conf->sequenceValue[0]; {
Uint64 backupId;
memcpy(&backupId,conf->sequenceValue,8);
ptr.p->backupId= (Uint32)backupId;
}
ptr.p->backupKey[0] = (getOwnNodeId() << 16) | (ptr.p->backupId & 0xFFFF); ptr.p->backupKey[0] = (getOwnNodeId() << 16) | (ptr.p->backupId & 0xFFFF);
ptr.p->backupKey[1] = NdbTick_CurrentMillisecond(); ptr.p->backupKey[1] = NdbTick_CurrentMillisecond();
......
...@@ -27,6 +27,14 @@ ...@@ -27,6 +27,14 @@
#include <NdbThread.h> #include <NdbThread.h>
#include <signaldata/FsOpenReq.hpp> #include <signaldata/FsOpenReq.hpp>
// use this to test broken pread code
//#define HAVE_BROKEN_PREAD
#ifdef HAVE_BROKEN_PREAD
#undef HAVE_PWRITE
#undef HAVE_PREAD
#endif
#if defined NDB_WIN32 || defined NDB_OSE || defined NDB_SOFTOSE #if defined NDB_WIN32 || defined NDB_OSE || defined NDB_SOFTOSE
#else #else
// For readv and writev // For readv and writev
...@@ -379,9 +387,12 @@ AsyncFile::readBuffer(char * buf, size_t size, off_t offset){ ...@@ -379,9 +387,12 @@ AsyncFile::readBuffer(char * buf, size_t size, off_t offset){
if(dwSFP != offset) { if(dwSFP != offset) {
return GetLastError(); return GetLastError();
} }
#elif defined NDB_OSE || defined NDB_SOFTOSE #elif ! defined(HAVE_PREAD)
return_value = lseek(theFd, offset, SEEK_SET); off_t seek_val;
if (return_value != offset) { while((seek_val= lseek(theFd, offset, SEEK_SET)) == (off_t)-1
&& errno == EINTR);
if(seek_val == (off_t)-1)
{
return errno; return errno;
} }
#endif #endif
...@@ -400,10 +411,10 @@ AsyncFile::readBuffer(char * buf, size_t size, off_t offset){ ...@@ -400,10 +411,10 @@ AsyncFile::readBuffer(char * buf, size_t size, off_t offset){
return GetLastError(); return GetLastError();
} }
bytes_read = dwBytesRead; bytes_read = dwBytesRead;
#elif defined NDB_OSE || defined NDB_SOFTOSE #elif ! defined(HAVE_PREAD)
return_value = ::read(theFd, buf, size); return_value = ::read(theFd, buf, size);
#else // UNIX #else // UNIX
return_value = my_pread(theFd, buf, size, offset,0); return_value = ::pread(theFd, buf, size, offset);
#endif #endif
#ifndef NDB_WIN32 #ifndef NDB_WIN32
if (return_value == -1 && errno == EINTR) { if (return_value == -1 && errno == EINTR) {
...@@ -453,7 +464,7 @@ AsyncFile::readReq( Request * request) ...@@ -453,7 +464,7 @@ AsyncFile::readReq( Request * request)
void void
AsyncFile::readvReq( Request * request) AsyncFile::readvReq( Request * request)
{ {
#if defined NDB_OSE || defined NDB_SOFTOSE #if ! defined(HAVE_PREAD)
readReq(request); readReq(request);
return; return;
#elif defined NDB_WIN32 #elif defined NDB_WIN32
...@@ -483,7 +494,7 @@ AsyncFile::readvReq( Request * request) ...@@ -483,7 +494,7 @@ AsyncFile::readvReq( Request * request)
int int
AsyncFile::extendfile(Request* request) { AsyncFile::extendfile(Request* request) {
#if defined NDB_OSE || defined NDB_SOFTOSE #if ! defined(HAVE_PWRITE)
// Find max size of this file in this request // Find max size of this file in this request
int maxOffset = 0; int maxOffset = 0;
int maxSize = 0; int maxSize = 0;
...@@ -592,28 +603,14 @@ AsyncFile::writeBuffer(const char * buf, size_t size, off_t offset, ...@@ -592,28 +603,14 @@ AsyncFile::writeBuffer(const char * buf, size_t size, off_t offset,
if(dwSFP != offset) { if(dwSFP != offset) {
return GetLastError(); return GetLastError();
} }
#elif defined NDB_OSE || defined NDB_SOFTOSE #elif ! defined(HAVE_PWRITE)
return_value = lseek(theFd, offset, SEEK_SET); off_t seek_val;
if (return_value != offset) { while((seek_val= lseek(theFd, offset, SEEK_SET)) == (off_t)-1
DEBUG(ndbout_c("AsyncFile::writeReq, err1: return_value=%d, offset=%d\n", && errno == EINTR);
return_value, chunk_offset)); if(seek_val == (off_t)-1)
PRINT_ERRORANDFLAGS(0); {
if (errno == 78) {
// Could not write beyond end of file, try to extend file
DEBUG(ndbout_c("AsyncFile::writeReq, Extend. file! filename=\"%s\" \n",
theFileName.c_str()));
return_value = extendfile(request);
if (return_value == -1) {
return errno;
}
return_value = lseek(theFd, offset, SEEK_SET);
if (return_value != offset) {
return errno; return errno;
} }
} else {
return errno;
}
}
#endif #endif
while (size > 0) { while (size > 0) {
...@@ -634,10 +631,10 @@ AsyncFile::writeBuffer(const char * buf, size_t size, off_t offset, ...@@ -634,10 +631,10 @@ AsyncFile::writeBuffer(const char * buf, size_t size, off_t offset,
DEBUG(ndbout_c("Warning partial write %d != %d", bytes_written, bytes_to_write)); DEBUG(ndbout_c("Warning partial write %d != %d", bytes_written, bytes_to_write));
} }
#elif defined NDB_OSE || defined NDB_SOFTOSE #elif ! defined(HAVE_PWRITE)
return_value = ::write(theFd, buf, bytes_to_write); return_value = ::write(theFd, buf, bytes_to_write);
#else // UNIX #else // UNIX
return_value = my_pwrite(theFd, buf, bytes_to_write, offset, 0); return_value = ::pwrite(theFd, buf, bytes_to_write, offset);
#endif #endif
#ifndef NDB_WIN32 #ifndef NDB_WIN32
if (return_value == -1 && errno == EINTR) { if (return_value == -1 && errno == EINTR) {
......
...@@ -824,7 +824,8 @@ Suma::execUTIL_SEQUENCE_CONF(Signal* signal) ...@@ -824,7 +824,8 @@ Suma::execUTIL_SEQUENCE_CONF(Signal* signal)
return; return;
} }
Uint32 subId = conf->sequenceValue[0]; Uint64 subId;
memcpy(&subId,conf->sequenceValue,8);
Uint32 subData = conf->senderData; Uint32 subData = conf->senderData;
SubscriberPtr subbPtr; SubscriberPtr subbPtr;
...@@ -832,8 +833,8 @@ Suma::execUTIL_SEQUENCE_CONF(Signal* signal) ...@@ -832,8 +833,8 @@ Suma::execUTIL_SEQUENCE_CONF(Signal* signal)
CreateSubscriptionIdConf * subconf = (CreateSubscriptionIdConf*)conf; CreateSubscriptionIdConf * subconf = (CreateSubscriptionIdConf*)conf;
subconf->subscriptionId = subId; subconf->subscriptionId = (Uint32)subId;
subconf->subscriptionKey =(getOwnNodeId() << 16) | (subId & 0xFFFF); subconf->subscriptionKey =(getOwnNodeId() << 16) | (Uint32)(subId & 0xFFFF);
subconf->subscriberData = subbPtr.p->m_senderData; subconf->subscriberData = subbPtr.p->m_senderData;
sendSignal(subbPtr.p->m_subscriberRef, GSN_CREATE_SUBID_CONF, signal, sendSignal(subbPtr.p->m_subscriberRef, GSN_CREATE_SUBID_CONF, signal,
......
...@@ -228,13 +228,21 @@ bool InitConfigFileParser::parseNameValuePair(Context& ctx, const char* line) ...@@ -228,13 +228,21 @@ bool InitConfigFileParser::parseNameValuePair(Context& ctx, const char* line)
Vector<BaseString> tmp_string_split; Vector<BaseString> tmp_string_split;
if (BaseString(line).split(tmp_string_split, if (BaseString(line).split(tmp_string_split,
BaseString("=:"), "=:", 2) != 2)
2) != 2)
{ {
ctx.reportError("Parse error"); ctx.reportError("Parse error");
return false; return false;
} }
// *************************************
// Remove all after #
// *************************************
Vector<BaseString> tmp_string_split2;
tmp_string_split[1].split(tmp_string_split2,
"#", 2);
tmp_string_split[1]=tmp_string_split2[0];
// ************************************* // *************************************
// Remove leading and trailing chars // Remove leading and trailing chars
// ************************************* // *************************************
......
...@@ -156,8 +156,8 @@ static int ndb_to_mysql_error(const NdbError *err) ...@@ -156,8 +156,8 @@ static int ndb_to_mysql_error(const NdbError *err)
inline inline
int execute_no_commit(ha_ndbcluster *h, NdbTransaction *trans) int execute_no_commit(ha_ndbcluster *h, NdbTransaction *trans)
{ {
int m_batch_execute= 0;
#ifdef NOT_USED #ifdef NOT_USED
int m_batch_execute= 0;
if (m_batch_execute) if (m_batch_execute)
return 0; return 0;
#endif #endif
...@@ -169,8 +169,8 @@ int execute_no_commit(ha_ndbcluster *h, NdbTransaction *trans) ...@@ -169,8 +169,8 @@ int execute_no_commit(ha_ndbcluster *h, NdbTransaction *trans)
inline inline
int execute_commit(ha_ndbcluster *h, NdbTransaction *trans) int execute_commit(ha_ndbcluster *h, NdbTransaction *trans)
{ {
int m_batch_execute= 0;
#ifdef NOT_USED #ifdef NOT_USED
int m_batch_execute= 0;
if (m_batch_execute) if (m_batch_execute)
return 0; return 0;
#endif #endif
...@@ -182,8 +182,8 @@ int execute_commit(ha_ndbcluster *h, NdbTransaction *trans) ...@@ -182,8 +182,8 @@ int execute_commit(ha_ndbcluster *h, NdbTransaction *trans)
inline inline
int execute_commit(THD *thd, NdbTransaction *trans) int execute_commit(THD *thd, NdbTransaction *trans)
{ {
int m_batch_execute= 0;
#ifdef NOT_USED #ifdef NOT_USED
int m_batch_execute= 0;
if (m_batch_execute) if (m_batch_execute)
return 0; return 0;
#endif #endif
...@@ -195,8 +195,8 @@ int execute_commit(THD *thd, NdbTransaction *trans) ...@@ -195,8 +195,8 @@ int execute_commit(THD *thd, NdbTransaction *trans)
inline inline
int execute_no_commit_ie(ha_ndbcluster *h, NdbTransaction *trans) int execute_no_commit_ie(ha_ndbcluster *h, NdbTransaction *trans)
{ {
int m_batch_execute= 0;
#ifdef NOT_USED #ifdef NOT_USED
int m_batch_execute= 0;
if (m_batch_execute) if (m_batch_execute)
return 0; return 0;
#endif #endif
...@@ -810,7 +810,7 @@ int ha_ndbcluster::build_index_list(TABLE *tab, enum ILBP phase) ...@@ -810,7 +810,7 @@ int ha_ndbcluster::build_index_list(TABLE *tab, enum ILBP phase)
{ {
uint i; uint i;
int error= 0; int error= 0;
const char *name, *index_name; const char *index_name;
char unique_index_name[FN_LEN]; char unique_index_name[FN_LEN];
static const char* unique_suffix= "$unique"; static const char* unique_suffix= "$unique";
KEY* key_info= tab->key_info; KEY* key_info= tab->key_info;
...@@ -1118,10 +1118,10 @@ ha_ndbcluster::set_index_key(NdbOperation *op, ...@@ -1118,10 +1118,10 @@ ha_ndbcluster::set_index_key(NdbOperation *op,
int ha_ndbcluster::pk_read(const byte *key, uint key_len, byte *buf) int ha_ndbcluster::pk_read(const byte *key, uint key_len, byte *buf)
{ {
uint no_fields= table->s->fields, i; uint no_fields= table->s->fields;
NdbConnection *trans= m_active_trans; NdbConnection *trans= m_active_trans;
NdbOperation *op; NdbOperation *op;
THD *thd= current_thd;
int res; int res;
DBUG_ENTER("pk_read"); DBUG_ENTER("pk_read");
DBUG_PRINT("enter", ("key_len: %u", key_len)); DBUG_PRINT("enter", ("key_len: %u", key_len));
...@@ -1238,7 +1238,6 @@ int ha_ndbcluster::peek_row() ...@@ -1238,7 +1238,6 @@ int ha_ndbcluster::peek_row()
{ {
NdbTransaction *trans= m_active_trans; NdbTransaction *trans= m_active_trans;
NdbOperation *op; NdbOperation *op;
THD *thd= current_thd;
DBUG_ENTER("peek_row"); DBUG_ENTER("peek_row");
NdbOperation::LockMode lm= NdbOperation::LockMode lm=
...@@ -1345,8 +1344,11 @@ inline int ha_ndbcluster::fetch_next(NdbScanOperation* cursor) ...@@ -1345,8 +1344,11 @@ inline int ha_ndbcluster::fetch_next(NdbScanOperation* cursor)
{ {
if (execute_commit(this,trans) != 0) if (execute_commit(this,trans) != 0)
DBUG_RETURN(-1); DBUG_RETURN(-1);
int res= trans->restart(); if(trans->restart() != 0)
DBUG_ASSERT(res == 0); {
DBUG_ASSERT(0);
DBUG_RETURN(-1);
}
} }
m_ops_pending= 0; m_ops_pending= 0;
} }
...@@ -1441,7 +1443,9 @@ int ha_ndbcluster::set_bounds(NdbIndexScanOperation *op, ...@@ -1441,7 +1443,9 @@ int ha_ndbcluster::set_bounds(NdbIndexScanOperation *op,
{ {
KEY_PART_INFO *key_part= &key_info->key_part[i]; KEY_PART_INFO *key_part= &key_info->key_part[i];
Field *field= key_part->field; Field *field= key_part->field;
#ifndef DBUG_OFF
uint part_len= key_part->length; uint part_len= key_part->length;
#endif
uint part_store_len= key_part->store_length; uint part_store_len= key_part->store_length;
// Info about each key part // Info about each key part
struct part_st { struct part_st {
...@@ -1586,7 +1590,6 @@ int ha_ndbcluster::define_read_attrs(byte* buf, NdbOperation* op) ...@@ -1586,7 +1590,6 @@ int ha_ndbcluster::define_read_attrs(byte* buf, NdbOperation* op)
{ {
uint i; uint i;
THD *thd= current_thd; THD *thd= current_thd;
NdbTransaction *trans= m_active_trans;
DBUG_ENTER("define_read_attrs"); DBUG_ENTER("define_read_attrs");
...@@ -1780,7 +1783,6 @@ int ha_ndbcluster::filtered_scan(const byte *key, uint key_len, ...@@ -1780,7 +1783,6 @@ int ha_ndbcluster::filtered_scan(const byte *key, uint key_len,
int ha_ndbcluster::full_table_scan(byte *buf) int ha_ndbcluster::full_table_scan(byte *buf)
{ {
uint i;
int res; int res;
NdbScanOperation *op; NdbScanOperation *op;
NdbTransaction *trans= m_active_trans; NdbTransaction *trans= m_active_trans;
...@@ -1893,14 +1895,12 @@ int ha_ndbcluster::write_row(byte *record) ...@@ -1893,14 +1895,12 @@ int ha_ndbcluster::write_row(byte *record)
((m_rows_inserted % m_bulk_insert_rows) == 0) || ((m_rows_inserted % m_bulk_insert_rows) == 0) ||
set_blob_value) set_blob_value)
{ {
THD *thd= current_thd;
// Send rows to NDB // Send rows to NDB
DBUG_PRINT("info", ("Sending inserts to NDB, "\ DBUG_PRINT("info", ("Sending inserts to NDB, "\
"rows_inserted:%d, bulk_insert_rows: %d", "rows_inserted:%d, bulk_insert_rows: %d",
(int)m_rows_inserted, (int)m_bulk_insert_rows)); (int)m_rows_inserted, (int)m_bulk_insert_rows));
m_bulk_insert_not_flushed= FALSE; m_bulk_insert_not_flushed= FALSE;
// if (thd->transaction.on)
if (m_transaction_on) if (m_transaction_on)
{ {
if (execute_no_commit(this,trans) != 0) if (execute_no_commit(this,trans) != 0)
...@@ -1918,8 +1918,11 @@ int ha_ndbcluster::write_row(byte *record) ...@@ -1918,8 +1918,11 @@ int ha_ndbcluster::write_row(byte *record)
no_uncommitted_rows_execute_failure(); no_uncommitted_rows_execute_failure();
DBUG_RETURN(ndb_err(trans)); DBUG_RETURN(ndb_err(trans));
} }
int res= trans->restart(); if(trans->restart() != 0)
DBUG_ASSERT(res == 0); {
DBUG_ASSERT(0);
DBUG_RETURN(-1);
}
} }
} }
if ((has_auto_increment) && (m_skip_auto_increment)) if ((has_auto_increment) && (m_skip_auto_increment))
...@@ -2220,7 +2223,10 @@ void ha_ndbcluster::unpack_record(byte* buf) ...@@ -2220,7 +2223,10 @@ void ha_ndbcluster::unpack_record(byte* buf)
{ {
NdbBlob* ndb_blob= (*value).blob; NdbBlob* ndb_blob= (*value).blob;
bool isNull= TRUE; bool isNull= TRUE;
int ret= ndb_blob->getNull(isNull); #ifndef DBUG_OFF
int ret=
#endif
ndb_blob->getNull(isNull);
DBUG_ASSERT(ret == 0); DBUG_ASSERT(ret == 0);
if (isNull) if (isNull)
(*field)->set_null(row_offset); (*field)->set_null(row_offset);
...@@ -2252,32 +2258,35 @@ void ha_ndbcluster::unpack_record(byte* buf) ...@@ -2252,32 +2258,35 @@ void ha_ndbcluster::unpack_record(byte* buf)
void ha_ndbcluster::print_results() void ha_ndbcluster::print_results()
{ {
const NDBTAB *tab= (const NDBTAB*) m_table;
DBUG_ENTER("print_results"); DBUG_ENTER("print_results");
#ifndef DBUG_OFF #ifndef DBUG_OFF
const NDBTAB *tab= (const NDBTAB*) m_table;
if (!_db_on_) if (!_db_on_)
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
char buf_type[MAX_FIELD_WIDTH], buf_val[MAX_FIELD_WIDTH];
String type(buf_type, sizeof(buf_type), &my_charset_bin);
String val(buf_val, sizeof(buf_val), &my_charset_bin);
for (uint f=0; f<table->s->fields;f++) for (uint f=0; f<table->s->fields;f++)
{ {
// Use DBUG_PRINT since DBUG_FILE cannot be filtered out // Use DBUG_PRINT since DBUG_FILE cannot be filtered out
char buf[2000]; char buf[2000];
Field *field; Field *field;
void* ptr; void* ptr;
const NDBCOL *col; const NDBCOL *col= NULL;
NdbValue value; NdbValue value;
NdbBlob *ndb_blob; NdbBlob *ndb_blob;
buf[0] = 0; buf[0]= 0;
field= table->field[f];
if (!(value= m_value[f]).ptr) if (!(value= m_value[f]).ptr)
{ {
my_snprintf(buf, sizeof(buf), "not read"); my_snprintf(buf, sizeof(buf), "not read");
goto print_value; goto print_value;
} }
field= table->field[f];
ptr= field->ptr; ptr= field->ptr;
DBUG_DUMP("field->ptr", (char*)ptr, field->pack_length()); DBUG_DUMP("field->ptr", (char*)ptr, field->pack_length());
col= tab->getColumn(f); col= tab->getColumn(f);
...@@ -2290,6 +2299,11 @@ void ha_ndbcluster::print_results() ...@@ -2290,6 +2299,11 @@ void ha_ndbcluster::print_results()
my_snprintf(buf, sizeof(buf), "NULL"); my_snprintf(buf, sizeof(buf), "NULL");
goto print_value; goto print_value;
} }
type.length(0);
val.length(0);
field->sql_type(type);
field->val_str(&val);
my_snprintf(buf, sizeof(buf), "%s %s", type.c_ptr(), val.c_ptr());
} }
else else
{ {
...@@ -2302,142 +2316,6 @@ void ha_ndbcluster::print_results() ...@@ -2302,142 +2316,6 @@ void ha_ndbcluster::print_results()
} }
} }
switch (col->getType()) {
case NdbDictionary::Column::Tinyint: {
Int8 value= *(Int8*)ptr;
my_snprintf(buf, sizeof(buf), "Tinyint %d", value);
break;
}
case NdbDictionary::Column::Tinyunsigned: {
Uint8 value= *(Uint8*)ptr;
my_snprintf(buf, sizeof(buf), "Tinyunsigned %u", value);
break;
}
case NdbDictionary::Column::Smallint: {
Int16 value= *(Int16*)ptr;
my_snprintf(buf, sizeof(buf), "Smallint %d", value);
break;
}
case NdbDictionary::Column::Smallunsigned: {
Uint16 value= *(Uint16*)ptr;
my_snprintf(buf, sizeof(buf), "Smallunsigned %u", value);
break;
}
case NdbDictionary::Column::Mediumint: {
byte value[3];
memcpy(value, ptr, 3);
my_snprintf(buf, sizeof(buf), "Mediumint %d,%d,%d", value[0], value[1], value[2]);
break;
}
case NdbDictionary::Column::Mediumunsigned: {
byte value[3];
memcpy(value, ptr, 3);
my_snprintf(buf, sizeof(buf), "Mediumunsigned %u,%u,%u", value[0], value[1], value[2]);
break;
}
case NdbDictionary::Column::Int: {
Int32 value= *(Int32*)ptr;
my_snprintf(buf, sizeof(buf), "Int %d", value);
break;
}
case NdbDictionary::Column::Unsigned: {
Uint32 value= *(Uint32*)ptr;
my_snprintf(buf, sizeof(buf), "Unsigned %u", value);
break;
}
case NdbDictionary::Column::Bigint: {
Int64 value= *(Int64*)ptr;
my_snprintf(buf, sizeof(buf), "Bigint %d", (int)value);
break;
}
case NdbDictionary::Column::Bigunsigned: {
Uint64 value= *(Uint64*)ptr;
my_snprintf(buf, sizeof(buf), "Bigunsigned %u", (unsigned)value);
break;
}
case NdbDictionary::Column::Float: {
float value= *(float*)ptr;
my_snprintf(buf, sizeof(buf), "Float %f", (double)value);
break;
}
case NdbDictionary::Column::Double: {
double value= *(double*)ptr;
my_snprintf(buf, sizeof(buf), "Double %f", value);
break;
}
case NdbDictionary::Column::Decimal: {
const char *value= (char*)ptr;
my_snprintf(buf, sizeof(buf), "Decimal '%-*s'", field->pack_length(), value);
break;
}
case NdbDictionary::Column::Char: {
const char *value= (char*)ptr;
my_snprintf(buf, sizeof(buf), "Char '%.*s'", field->pack_length(), value);
break;
}
case NdbDictionary::Column::Varchar: {
uint len= *(uchar*)ptr;
const char *value= (char*)ptr + 1;
my_snprintf(buf, sizeof(buf), "Varchar (%u)'%.*s'", len, len, value);
break;
}
case NdbDictionary::Column::Binary: {
const char *value= (char*)ptr;
my_snprintf(buf, sizeof(buf), "Binary '%.*s'", field->pack_length(), value);
break;
}
case NdbDictionary::Column::Varbinary: {
uint len= *(uchar*)ptr;
const char *value= (char*)ptr + 1;
my_snprintf(buf, sizeof(buf), "Varbinary (%u)'%.*s'", len, len, value);
break;
}
case NdbDictionary::Column::Datetime: {
my_snprintf(buf, sizeof(buf), "Datetime ?"); // fix-me
break;
}
case NdbDictionary::Column::Date: {
my_snprintf(buf, sizeof(buf), "Date ?"); // fix-me
break;
}
case NdbDictionary::Column::Time: {
my_snprintf(buf, sizeof(buf), "Time ?"); // fix-me
break;
}
case NdbDictionary::Column::Blob: {
Uint64 len= 0;
ndb_blob->getLength(len);
my_snprintf(buf, sizeof(buf), "Blob [len=%u]", (unsigned)len);
break;
}
case NdbDictionary::Column::Text: {
Uint64 len= 0;
ndb_blob->getLength(len);
my_snprintf(buf, sizeof(buf), "Text [len=%u]", (unsigned)len);
break;
}
case NdbDictionary::Column::Bit: {
const char *value= (char*)ptr;
my_snprintf(buf, sizeof(buf), "Bit '%.*s'", field->pack_length(), value);
break;
}
case NdbDictionary::Column::Longvarchar: {
uint len= uint2korr(ptr);
const char *value= (char*)ptr + 2;
my_snprintf(buf, sizeof(buf), "Longvarchar (%u)'%.*s'", len, len, value);
break;
}
case NdbDictionary::Column::Longvarbinary: {
uint len= uint2korr(ptr);
const char *value= (char*)ptr + 2;
my_snprintf(buf, sizeof(buf), "Longvarbinary (%u)'%.*s'", len, len, value);
break;
}
case NdbDictionary::Column::Undefined:
my_snprintf(buf, sizeof(buf), "Unknown type: %d", col->getType());
break;
}
print_value: print_value:
DBUG_PRINT("value", ("%u,%s: %s", f, col->getName(), buf)); DBUG_PRINT("value", ("%u,%s: %s", f, col->getName(), buf));
} }
...@@ -2685,8 +2563,11 @@ int ha_ndbcluster::rnd_init(bool scan) ...@@ -2685,8 +2563,11 @@ int ha_ndbcluster::rnd_init(bool scan)
{ {
if (!scan) if (!scan)
DBUG_RETURN(1); DBUG_RETURN(1);
int res= cursor->restart(m_force_send); if(cursor->restart(m_force_send) != 0)
DBUG_ASSERT(res == 0); {
DBUG_ASSERT(0);
DBUG_RETURN(-1);
}
} }
index_init(table->s->primary_key); index_init(table->s->primary_key);
DBUG_RETURN(0); DBUG_RETURN(0);
...@@ -2801,13 +2682,15 @@ void ha_ndbcluster::position(const byte *record) ...@@ -2801,13 +2682,15 @@ void ha_ndbcluster::position(const byte *record)
DBUG_PRINT("info", ("Getting hidden key")); DBUG_PRINT("info", ("Getting hidden key"));
int hidden_no= table->s->fields; int hidden_no= table->s->fields;
const NdbRecAttr* rec= m_value[hidden_no].rec; const NdbRecAttr* rec= m_value[hidden_no].rec;
memcpy(ref, (const void*)rec->aRef(), ref_length);
#ifndef DBUG_OFF
const NDBTAB *tab= (const NDBTAB *) m_table; const NDBTAB *tab= (const NDBTAB *) m_table;
const NDBCOL *hidden_col= tab->getColumn(hidden_no); const NDBCOL *hidden_col= tab->getColumn(hidden_no);
DBUG_ASSERT(hidden_col->getPrimaryKey() && DBUG_ASSERT(hidden_col->getPrimaryKey() &&
hidden_col->getAutoIncrement() && hidden_col->getAutoIncrement() &&
rec != NULL && rec != NULL &&
ref_length == NDB_HIDDEN_PRIMARY_KEY_LENGTH); ref_length == NDB_HIDDEN_PRIMARY_KEY_LENGTH);
memcpy(ref, (const void*)rec->aRef(), ref_length); #endif
} }
DBUG_DUMP("ref", (char*)ref, ref_length); DBUG_DUMP("ref", (char*)ref, ref_length);
...@@ -3336,11 +3219,13 @@ int ha_ndbcluster::start_stmt(THD *thd) ...@@ -3336,11 +3219,13 @@ int ha_ndbcluster::start_stmt(THD *thd)
Ndb *ndb= ((Thd_ndb*)thd->transaction.thd_ndb)->ndb; Ndb *ndb= ((Thd_ndb*)thd->transaction.thd_ndb)->ndb;
DBUG_PRINT("trans",("Starting transaction stmt")); DBUG_PRINT("trans",("Starting transaction stmt"));
#if 0
NdbTransaction *tablock_trans= NdbTransaction *tablock_trans=
(NdbTransaction*)thd->transaction.all.ndb_tid; (NdbTransaction*)thd->transaction.all.ndb_tid;
DBUG_PRINT("info", ("tablock_trans: %x", (uint)tablock_trans)); DBUG_PRINT("info", ("tablock_trans: %x", (uint)tablock_trans));
DBUG_ASSERT(tablock_trans); DBUG_ASSERT(tablock_trans);
// trans= ndb->hupp(tablock_trans); // trans= ndb->hupp(tablock_trans);
#endif
trans= ndb->startTransaction(); trans= ndb->startTransaction();
if (trans == NULL) if (trans == NULL)
ERR_RETURN(ndb->getNdbError()); ERR_RETURN(ndb->getNdbError());
...@@ -3675,7 +3560,6 @@ int ha_ndbcluster::create(const char *name, ...@@ -3675,7 +3560,6 @@ int ha_ndbcluster::create(const char *name,
NDBCOL col; NDBCOL col;
uint pack_length, length, i, pk_length= 0; uint pack_length, length, i, pk_length= 0;
const void *data, *pack_data; const void *data, *pack_data;
const char **key_names= form->s->keynames.type_names;
char name2[FN_HEADLEN]; char name2[FN_HEADLEN];
bool create_from_engine= (info->table_options & HA_CREATE_FROM_ENGINE); bool create_from_engine= (info->table_options & HA_CREATE_FROM_ENGINE);
...@@ -3908,7 +3792,6 @@ int ha_ndbcluster::alter_table_name(const char *to) ...@@ -3908,7 +3792,6 @@ int ha_ndbcluster::alter_table_name(const char *to)
Ndb *ndb= get_ndb(); Ndb *ndb= get_ndb();
NDBDICT *dict= ndb->getDictionary(); NDBDICT *dict= ndb->getDictionary();
const NDBTAB *orig_tab= (const NDBTAB *) m_table; const NDBTAB *orig_tab= (const NDBTAB *) m_table;
int ret;
DBUG_ENTER("alter_table_name_table"); DBUG_ENTER("alter_table_name_table");
NdbDictionary::Table new_tab= *orig_tab; NdbDictionary::Table new_tab= *orig_tab;
...@@ -4008,7 +3891,6 @@ ha_ndbcluster::ha_ndbcluster(TABLE *table_arg): ...@@ -4008,7 +3891,6 @@ ha_ndbcluster::ha_ndbcluster(TABLE *table_arg):
handler(table_arg), handler(table_arg),
m_active_trans(NULL), m_active_trans(NULL),
m_active_cursor(NULL), m_active_cursor(NULL),
m_multi_cursor(NULL),
m_table(NULL), m_table(NULL),
m_table_info(NULL), m_table_info(NULL),
m_table_flags(HA_REC_NOT_IN_SEQ | m_table_flags(HA_REC_NOT_IN_SEQ |
...@@ -4037,7 +3919,8 @@ ha_ndbcluster::ha_ndbcluster(TABLE *table_arg): ...@@ -4037,7 +3919,8 @@ ha_ndbcluster::ha_ndbcluster(TABLE *table_arg):
m_force_send(TRUE), m_force_send(TRUE),
m_autoincrement_prefetch(32), m_autoincrement_prefetch(32),
m_transaction_on(TRUE), m_transaction_on(TRUE),
m_use_local_query_cache(FALSE) m_use_local_query_cache(FALSE),
m_multi_cursor(NULL)
{ {
int i; int i;
...@@ -4512,15 +4395,21 @@ bool ndbcluster_init() ...@@ -4512,15 +4395,21 @@ bool ndbcluster_init()
} }
else if(res == 1) else if(res == 1)
{ {
if (g_ndb_cluster_connection->start_connect_thread()) { if (g_ndb_cluster_connection->start_connect_thread())
{
DBUG_PRINT("error", ("g_ndb_cluster_connection->start_connect_thread()")); DBUG_PRINT("error", ("g_ndb_cluster_connection->start_connect_thread()"));
goto ndbcluster_init_error; goto ndbcluster_init_error;
} }
#ifndef DBUG_OFF
{ {
char buf[1024]; char buf[1024];
DBUG_PRINT("info",("NDBCLUSTER storage engine not started, will connect using %s", DBUG_PRINT("info",
g_ndb_cluster_connection->get_connectstring(buf,sizeof(buf)))); ("NDBCLUSTER storage engine not started, "
"will connect using %s",
g_ndb_cluster_connection->
get_connectstring(buf,sizeof(buf))));
} }
#endif
} }
else else
{ {
...@@ -5059,6 +4948,7 @@ ha_ndbcluster::read_multi_range_first(KEY_MULTI_RANGE **found_range_p, ...@@ -5059,6 +4948,7 @@ ha_ndbcluster::read_multi_range_first(KEY_MULTI_RANGE **found_range_p,
* pk-op 4 pk-op 4 * pk-op 4 pk-op 4
* range 5 * range 5
* pk-op 6 pk-ok 6 * pk-op 6 pk-ok 6
*/
/** /**
* Variables for loop * Variables for loop
...@@ -5117,7 +5007,7 @@ ha_ndbcluster::read_multi_range_first(KEY_MULTI_RANGE **found_range_p, ...@@ -5117,7 +5007,7 @@ ha_ndbcluster::read_multi_range_first(KEY_MULTI_RANGE **found_range_p,
multi_range_curr->start_key.length)) multi_range_curr->start_key.length))
goto sk; goto sk;
goto range; goto range;
case ORDERED_INDEX: case ORDERED_INDEX: {
range: range:
multi_range_curr->range_flag &= ~(uint)UNIQUE_RANGE; multi_range_curr->range_flag &= ~(uint)UNIQUE_RANGE;
if (scanOp == 0) if (scanOp == 0)
...@@ -5152,6 +5042,11 @@ ha_ndbcluster::read_multi_range_first(KEY_MULTI_RANGE **found_range_p, ...@@ -5152,6 +5042,11 @@ ha_ndbcluster::read_multi_range_first(KEY_MULTI_RANGE **found_range_p,
DBUG_RETURN(res); DBUG_RETURN(res);
break; break;
} }
case(UNDEFINED_INDEX):
DBUG_ASSERT(FALSE);
DBUG_RETURN(1);
break;
}
} }
if (multi_range_curr != multi_range_end) if (multi_range_curr != multi_range_end)
...@@ -5238,7 +5133,7 @@ ha_ndbcluster::read_multi_range_next(KEY_MULTI_RANGE ** multi_range_found_p) ...@@ -5238,7 +5133,7 @@ ha_ndbcluster::read_multi_range_next(KEY_MULTI_RANGE ** multi_range_found_p)
range_no= m_multi_cursor->get_range_no(); range_no= m_multi_cursor->get_range_no();
uint current_range_no= multi_range_curr - m_multi_ranges; uint current_range_no= multi_range_curr - m_multi_ranges;
if (range_no == current_range_no) if ((uint) range_no == current_range_no)
{ {
DBUG_MULTI_RANGE(4); DBUG_MULTI_RANGE(4);
// return current row // return current row
......
...@@ -1578,9 +1578,14 @@ void Item_func_soundex::fix_length_and_dec() ...@@ -1578,9 +1578,14 @@ void Item_func_soundex::fix_length_and_dec()
else return 0 else return 0
*/ */
static char get_scode(CHARSET_INFO *cs,char *ptr) static char soundex_toupper(char ch)
{ {
uchar ch=my_toupper(cs,*ptr); return (ch >= 'a' && ch <= 'z') ? ch - 'a' + 'A' : ch;
}
static char get_scode(char *ptr)
{
uchar ch= soundex_toupper(*ptr);
if (ch < 'A' || ch > 'Z') if (ch < 'A' || ch > 'Z')
{ {
// Thread extended alfa (country spec) // Thread extended alfa (country spec)
...@@ -1610,8 +1615,8 @@ String *Item_func_soundex::val_str(String *str) ...@@ -1610,8 +1615,8 @@ String *Item_func_soundex::val_str(String *str)
from++; /* purecov: inspected */ from++; /* purecov: inspected */
if (from == end) if (from == end)
return &my_empty_string; // No alpha characters. return &my_empty_string; // No alpha characters.
*to++ = my_toupper(cs,*from); // Copy first letter *to++ = soundex_toupper(*from); // Copy first letter
last_ch = get_scode(cs,from); // code of the first letter last_ch = get_scode(from); // code of the first letter
// for the first 'double-letter check. // for the first 'double-letter check.
// Loop on input letters until // Loop on input letters until
// end of input (null) or output // end of input (null) or output
...@@ -1620,7 +1625,7 @@ String *Item_func_soundex::val_str(String *str) ...@@ -1620,7 +1625,7 @@ String *Item_func_soundex::val_str(String *str)
{ {
if (!my_isalpha(cs,*from)) if (!my_isalpha(cs,*from))
continue; continue;
ch=get_scode(cs,from); ch=get_scode(from);
if ((ch != '0') && (ch != last_ch)) // if not skipped or double if ((ch != '0') && (ch != last_ch)) // if not skipped or double
{ {
*to++ = ch; // letter, copy to output *to++ = ch; // letter, copy to output
......
...@@ -292,7 +292,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list, ...@@ -292,7 +292,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
error=0; error=0;
id=0; id=0;
thd->proc_info="update"; thd->proc_info="update";
if (duplic != DUP_ERROR) if (duplic != DUP_ERROR || ignore)
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY); table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
/* /*
let's *try* to start bulk inserts. It won't necessary let's *try* to start bulk inserts. It won't necessary
...@@ -471,7 +471,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list, ...@@ -471,7 +471,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
table->next_number_field=0; table->next_number_field=0;
thd->count_cuted_fields= CHECK_FIELD_IGNORE; thd->count_cuted_fields= CHECK_FIELD_IGNORE;
thd->next_insert_id=0; // Reset this if wrongly used thd->next_insert_id=0; // Reset this if wrongly used
if (duplic != DUP_ERROR) if (duplic != DUP_ERROR || ignore)
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY); table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
/* Reset value of LAST_INSERT_ID if no rows where inserted */ /* Reset value of LAST_INSERT_ID if no rows where inserted */
...@@ -1606,7 +1606,7 @@ bool delayed_insert::handle_inserts(void) ...@@ -1606,7 +1606,7 @@ bool delayed_insert::handle_inserts(void)
info.ignore= row->ignore; info.ignore= row->ignore;
info.handle_duplicates= row->dup; info.handle_duplicates= row->dup;
if (info.ignore || if (info.ignore ||
info.handle_duplicates == DUP_REPLACE) info.handle_duplicates != DUP_ERROR)
{ {
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY); table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
using_ignore=1; using_ignore=1;
...@@ -1806,7 +1806,7 @@ select_insert::prepare(List<Item> &values, SELECT_LEX_UNIT *u) ...@@ -1806,7 +1806,7 @@ select_insert::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
restore_record(table,s->default_values); // Get empty record restore_record(table,s->default_values); // Get empty record
table->next_number_field=table->found_next_number_field; table->next_number_field=table->found_next_number_field;
thd->cuted_fields=0; thd->cuted_fields=0;
if (info.ignore || info.handle_duplicates == DUP_REPLACE) if (info.ignore || info.handle_duplicates != DUP_ERROR)
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY); table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
table->file->start_bulk_insert((ha_rows) 0); table->file->start_bulk_insert((ha_rows) 0);
thd->no_trans_update= 0; thd->no_trans_update= 0;
...@@ -2008,7 +2008,7 @@ select_create::prepare(List<Item> &values, SELECT_LEX_UNIT *u) ...@@ -2008,7 +2008,7 @@ select_create::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
restore_record(table,s->default_values); // Get empty record restore_record(table,s->default_values); // Get empty record
thd->cuted_fields=0; thd->cuted_fields=0;
if (info.ignore || info.handle_duplicates == DUP_REPLACE) if (info.ignore || info.handle_duplicates != DUP_ERROR)
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY); table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
table->file->start_bulk_insert((ha_rows) 0); table->file->start_bulk_insert((ha_rows) 0);
thd->no_trans_update= 0; thd->no_trans_update= 0;
......
...@@ -147,7 +147,7 @@ uint find_type(TYPELIB *lib, const char *find, uint length, bool part_match) ...@@ -147,7 +147,7 @@ uint find_type(TYPELIB *lib, const char *find, uint length, bool part_match)
uint find_type2(TYPELIB *typelib, const char *x, uint length, CHARSET_INFO *cs) uint find_type2(TYPELIB *typelib, const char *x, uint length, CHARSET_INFO *cs)
{ {
int find,pos,findpos; int find,pos;
const char *j; const char *j;
DBUG_ENTER("find_type2"); DBUG_ENTER("find_type2");
DBUG_PRINT("enter",("x: '%.*s' lib: 0x%lx", length, x, typelib)); DBUG_PRINT("enter",("x: '%.*s' lib: 0x%lx", length, x, typelib));
...@@ -157,7 +157,7 @@ uint find_type2(TYPELIB *typelib, const char *x, uint length, CHARSET_INFO *cs) ...@@ -157,7 +157,7 @@ uint find_type2(TYPELIB *typelib, const char *x, uint length, CHARSET_INFO *cs)
DBUG_PRINT("exit",("no count")); DBUG_PRINT("exit",("no count"));
DBUG_RETURN(0); DBUG_RETURN(0);
} }
LINT_INIT(findpos);
for (find=0, pos=0 ; (j=typelib->type_names[pos]) ; pos++) for (find=0, pos=0 ; (j=typelib->type_names[pos]) ; pos++)
{ {
if (!my_strnncoll(cs, (const uchar*) x, length, if (!my_strnncoll(cs, (const uchar*) x, length,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment