Commit 5f164e2f authored by monty@narttu.mysql.fi's avatar monty@narttu.mysql.fi

Merge bk-internal.mysql.com:/home/bk/mysql-4.0

into narttu.mysql.fi:/my/mysql-4.0
parents f05a1c83 ef8cd361
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
#include <signal.h> #include <signal.h>
#include <violite.h> #include <violite.h>
const char *VER= "12.21"; const char *VER= "12.22";
/* Don't try to make a nice table if the data is too big */ /* Don't try to make a nice table if the data is too big */
#define MAX_COLUMN_LENGTH 1024 #define MAX_COLUMN_LENGTH 1024
...@@ -801,7 +801,9 @@ static int read_lines(bool execute_commands) ...@@ -801,7 +801,9 @@ static int read_lines(bool execute_commands)
char *prompt= (char*) (glob_buffer.is_empty() ? construct_prompt() : char *prompt= (char*) (glob_buffer.is_empty() ? construct_prompt() :
!in_string ? " -> " : !in_string ? " -> " :
in_string == '\'' ? in_string == '\'' ?
" '> " : " \"> "); " '> " : (in_string == '`' ?
" `> " :
" \"> "));
if (opt_outfile && glob_buffer.is_empty()) if (opt_outfile && glob_buffer.is_empty())
fflush(OUTFILE); fflush(OUTFILE);
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <assert.h> #include <assert.h>
#include "log_event.h" #include "log_event.h"
#include "include/my_sys.h" #include "include/my_sys.h"
#include "unistd.h"
#define BIN_LOG_HEADER_SIZE 4 #define BIN_LOG_HEADER_SIZE 4
#define PROBE_HEADER_LEN (EVENT_LEN_OFFSET+4) #define PROBE_HEADER_LEN (EVENT_LEN_OFFSET+4)
...@@ -81,9 +82,9 @@ class Load_log_processor ...@@ -81,9 +82,9 @@ class Load_log_processor
bname--; bname--;
uint blen= ce->fname_len - (bname-ce->fname); uint blen= ce->fname_len - (bname-ce->fname);
uint full_len= target_dir_name_len + blen; uint full_len= target_dir_name_len + blen + 9 + 9 + 1;
char *tmp; char *tmp;
if (!(tmp= my_malloc(full_len + 9 + 1,MYF(MY_WME))) || if (!(tmp= my_malloc(full_len,MYF(MY_WME))) ||
set_dynamic(&file_names,(gptr)&ce,ce->file_id)) set_dynamic(&file_names,(gptr)&ce,ce->file_id))
{ {
die("Could not construct local filename %s%s",target_dir_name,bname); die("Could not construct local filename %s%s",target_dir_name,bname);
...@@ -96,6 +97,21 @@ class Load_log_processor ...@@ -96,6 +97,21 @@ class Load_log_processor
memcpy(ptr,bname,blen); memcpy(ptr,bname,blen);
ptr+= blen; ptr+= blen;
sprintf(ptr,"-%08x",ce->file_id); sprintf(ptr,"-%08x",ce->file_id);
ptr+= 9;
uint version= 0;
for (;;)
{
sprintf(ptr,"-%08x",version);
if (access(tmp,F_OK))
break;
version++;
if (version>UINT_MAX)
{
die("Could not construct local filename %s%s",target_dir_name,bname);
return 0;
}
}
ce->set_fname_outside_temp_buf(tmp,full_len); ce->set_fname_outside_temp_buf(tmp,full_len);
...@@ -169,6 +185,8 @@ public: ...@@ -169,6 +185,8 @@ public:
} }
Create_file_log_event *grab_event(uint file_id) Create_file_log_event *grab_event(uint file_id)
{ {
if (file_id >= file_names.elements)
return 0;
Create_file_log_event **ptr= Create_file_log_event **ptr=
(Create_file_log_event**)file_names.buffer + file_id; (Create_file_log_event**)file_names.buffer + file_id;
Create_file_log_event *res= *ptr; Create_file_log_event *res= *ptr;
...@@ -182,8 +200,12 @@ public: ...@@ -182,8 +200,12 @@ public:
} }
void process(Append_block_log_event *ae) void process(Append_block_log_event *ae)
{ {
if (ae->file_id >= file_names.elements) Create_file_log_event* ce= (ae->file_id < file_names.elements) ?
{ *((Create_file_log_event**)file_names.buffer + ae->file_id) : 0;
if (ce)
append_to_file(ce->fname,O_APPEND|O_BINARY|O_WRONLY,ae->block,ae->block_len);
else
/* /*
There is no Create_file event (a bad binlog or a big There is no Create_file event (a bad binlog or a big
--position). Assuming it's a big --position, we just do nothing and --position). Assuming it's a big --position, we just do nothing and
...@@ -191,11 +213,6 @@ public: ...@@ -191,11 +213,6 @@ public:
*/ */
fprintf(stderr,"Warning: ignoring Append_block as there is no \ fprintf(stderr,"Warning: ignoring Append_block as there is no \
Create_file event for file_id: %u\n",ae->file_id); Create_file event for file_id: %u\n",ae->file_id);
return;
}
Create_file_log_event* ce=
*((Create_file_log_event**)file_names.buffer + ae->file_id);
append_to_file(ce->fname,O_APPEND|O_BINARY|O_WRONLY,ae->block,ae->block_len);
} }
}; };
......
...@@ -109,7 +109,7 @@ int main(int argc,char *argv[]) ...@@ -109,7 +109,7 @@ int main(int argc,char *argv[])
if (to) if (to)
fclose(to); fclose(to);
if (error) if (error)
fprintf(stderr,"Can't uppdate messagefile %s, errno: %d\n",*argv,errno); fprintf(stderr,"Can't update messagefile %s, errno: %d\n",*argv,errno);
exit(error); exit(error);
return(0); return(0);
......
...@@ -237,12 +237,12 @@ int main(int argc, char *argv[]) ...@@ -237,12 +237,12 @@ int main(int argc, char *argv[])
{ {
if (my_errno != HA_ERR_FOUND_DUPP_KEY || key3[n3] == 0) if (my_errno != HA_ERR_FOUND_DUPP_KEY || key3[n3] == 0)
{ {
printf("error: %d; can't uppdate:\nFrom: \"%s\"\nTo: \"%s\"\n", printf("error: %d; can't update:\nFrom: \"%s\"\nTo: \"%s\"\n",
my_errno,record,record2); my_errno,record,record2);
goto err; goto err;
} }
if (verbose) if (verbose)
printf("Double key when tryed to uppdate:\nFrom: \"%s\"\nTo: \"%s\"\n",record,record2); printf("Double key when tried to update:\nFrom: \"%s\"\nTo: \"%s\"\n",record,record2);
} }
else else
{ {
......
...@@ -1105,4 +1105,14 @@ typedef union { ...@@ -1105,4 +1105,14 @@ typedef union {
#define statistic_add(V,C,L) (V)+=(C) #define statistic_add(V,C,L) (V)+=(C)
#endif #endif
#ifdef HAVE_OPENSSL
#include <openssl/opensslv.h>
#if OPENSSL_VERSION_NUMBER < 0x0090700f
#define DES_cblock des_cblock
#define DES_key_schedule des_key_schedule
#define DES_set_key_unchecked(k,ks) des_set_key_unchecked((k),*(ks))
#define DES_ede3_cbc_encrypt(i,o,l,k1,k2,k3,iv,e) des_ede3_cbc_encrypt((i),(o),(l),*(k1),*(k2),*(k3),(iv),(e))
#endif
#endif
#endif /* my_global_h */ #endif /* my_global_h */
...@@ -265,12 +265,12 @@ int main(int argc, char *argv[]) ...@@ -265,12 +265,12 @@ int main(int argc, char *argv[])
{ {
if (my_errno != HA_ERR_FOUND_DUPP_KEY || key3[n3] == 0) if (my_errno != HA_ERR_FOUND_DUPP_KEY || key3[n3] == 0)
{ {
printf("error: %d; can't uppdate:\nFrom: \"%s\"\nTo: \"%s\"\n", printf("error: %d; can't update:\nFrom: \"%s\"\nTo: \"%s\"\n",
my_errno,read_record,record2); my_errno,read_record,record2);
goto err; goto err;
} }
if (verbose) if (verbose)
printf("Double key when tryed to uppdate:\nFrom: \"%s\"\nTo: \"%s\"\n",record,record2); printf("Double key when tried to update:\nFrom: \"%s\"\nTo: \"%s\"\n",record,record2);
} }
else else
{ {
......
...@@ -329,12 +329,12 @@ int main(int argc, char *argv[]) ...@@ -329,12 +329,12 @@ int main(int argc, char *argv[])
{ {
if (my_errno != HA_ERR_FOUND_DUPP_KEY || key3[n3] == 0) if (my_errno != HA_ERR_FOUND_DUPP_KEY || key3[n3] == 0)
{ {
printf("error: %d; can't uppdate:\nFrom: \"%s\"\nTo: \"%s\"\n", printf("error: %d; can't update:\nFrom: \"%s\"\nTo: \"%s\"\n",
my_errno,read_record,record2); my_errno,read_record,record2);
goto err; goto err;
} }
if (verbose) if (verbose)
printf("Double key when tryed to uppdate:\nFrom: \"%s\"\nTo: \"%s\"\n",record,record2); printf("Double key when tried to update:\nFrom: \"%s\"\nTo: \"%s\"\n",record,record2);
} }
else else
{ {
......
...@@ -173,9 +173,9 @@ INSERT INTO t2 values (1),(2),(3); ...@@ -173,9 +173,9 @@ INSERT INTO t2 values (1),(2),(3);
INSERT INTO t3 VALUES (1,'1'),(2,'2'),(1,'1'),(2,'2'); INSERT INTO t3 VALUES (1,'1'),(2,'2'),(1,'1'),(2,'2');
explain SELECT distinct t3.a FROM t3,t2,t1 WHERE t3.a=t1.b AND t1.a=t2.a; explain SELECT distinct t3.a FROM t3,t2,t1 WHERE t3.a=t1.b AND t1.a=t2.a;
table type possible_keys key key_len ref rows Extra table type possible_keys key key_len ref rows Extra
t2 index a a 4 NULL 5 Using index; Using temporary t3 index a a 5 NULL 6 Using index; Using temporary
t1 eq_ref PRIMARY PRIMARY 4 t2.a 1 t2 index a a 4 NULL 5 Using index; Distinct
t3 index a a 5 NULL 5 Using where; Using index t1 eq_ref PRIMARY PRIMARY 4 t2.a 1 Using where; Distinct
SELECT distinct t3.a FROM t3,t2,t1 WHERE t3.a=t1.b AND t1.a=t2.a; SELECT distinct t3.a FROM t3,t2,t1 WHERE t3.a=t1.b AND t1.a=t2.a;
a a
1 1
...@@ -303,9 +303,9 @@ t1 index id id 4 NULL 2 Using index; Using temporary ...@@ -303,9 +303,9 @@ t1 index id id 4 NULL 2 Using index; Using temporary
t2 index id id 8 NULL 1 Using index; Distinct t2 index id id 8 NULL 1 Using index; Distinct
t3 index id id 8 NULL 1 Using index; Distinct t3 index id id 8 NULL 1 Using index; Distinct
j_lj_t2 index id id 4 NULL 2 Using where; Using index; Distinct j_lj_t2 index id id 4 NULL 2 Using where; Using index; Distinct
t2_lj index id id 8 NULL 1 Using where; Using index; Distinct t2_lj ref id id 4 j_lj_t2.id 1 Using where; Using index; Distinct
j_lj_t3 index id id 4 NULL 2 Using where; Using index; Distinct j_lj_t3 index id id 4 NULL 2 Using where; Using index; Distinct
t3_lj index id id 8 NULL 1 Using where; Using index; Distinct t3_lj ref id id 4 j_lj_t3.id 1 Using where; Using index; Distinct
SELECT DISTINCT SELECT DISTINCT
t1.id t1.id
from from
......
...@@ -307,17 +307,17 @@ table type possible_keys key key_len ref rows Extra ...@@ -307,17 +307,17 @@ table type possible_keys key key_len ref rows Extra
t1 range a a 9 NULL 8 Using where; Using index t1 range a a 9 NULL 8 Using where; Using index
explain select * from t1 where a = 2 and b >0 order by a desc,b desc; explain select * from t1 where a = 2 and b >0 order by a desc,b desc;
table type possible_keys key key_len ref rows Extra table type possible_keys key key_len ref rows Extra
t1 range a a 9 NULL 4 Using where; Using index t1 range a a 9 NULL 5 Using where; Using index
explain select * from t1 where a = 2 and b is null order by a desc,b desc; explain select * from t1 where a = 2 and b is null order by a desc,b desc;
table type possible_keys key key_len ref rows Extra table type possible_keys key key_len ref rows Extra
t1 ref a a 9 const,const 1 Using where; Using index; Using filesort t1 ref a a 9 const,const 1 Using where; Using index; Using filesort
explain select * from t1 where a = 2 and (b is null or b > 0) order by a explain select * from t1 where a = 2 and (b is null or b > 0) order by a
desc,b desc; desc,b desc;
table type possible_keys key key_len ref rows Extra table type possible_keys key key_len ref rows Extra
t1 range a a 9 NULL 5 Using where; Using index t1 range a a 9 NULL 6 Using where; Using index
explain select * from t1 where a = 2 and b > 0 order by a desc,b desc; explain select * from t1 where a = 2 and b > 0 order by a desc,b desc;
table type possible_keys key key_len ref rows Extra table type possible_keys key key_len ref rows Extra
t1 range a a 9 NULL 4 Using where; Using index t1 range a a 9 NULL 5 Using where; Using index
explain select * from t1 where a = 2 and b < 2 order by a desc,b desc; explain select * from t1 where a = 2 and b < 2 order by a desc,b desc;
table type possible_keys key key_len ref rows Extra table type possible_keys key key_len ref rows Extra
t1 range a a 9 NULL 2 Using where; Using index t1 range a a 9 NULL 2 Using where; Using index
...@@ -466,8 +466,8 @@ t2 eq_ref PRIMARY,uid PRIMARY 4 t1.gid 1 ...@@ -466,8 +466,8 @@ t2 eq_ref PRIMARY,uid PRIMARY 4 t1.gid 1
t3 eq_ref PRIMARY PRIMARY 2 t2.uid 1 Using where; Using index t3 eq_ref PRIMARY PRIMARY 2 t2.uid 1 Using where; Using index
EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.gid = t3.uid order by t1.gid,t3.skr; EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.gid = t3.uid order by t1.gid,t3.skr;
table type possible_keys key key_len ref rows Extra table type possible_keys key key_len ref rows Extra
t1 index PRIMARY PRIMARY 4 NULL 6 Using index t3 ALL PRIMARY NULL NULL NULL 6 Using temporary; Using filesort
t3 eq_ref PRIMARY PRIMARY 2 t1.gid 1 Using where t1 eq_ref PRIMARY PRIMARY 4 t3.uid 1 Using where; Using index
EXPLAIN SELECT t1.gid, t2.sid, t3.uid from t2, t1, t3 where t2.gid = t1.gid and t2.uid = t3.uid order by t3.uid, t1.gid; EXPLAIN SELECT t1.gid, t2.sid, t3.uid from t2, t1, t3 where t2.gid = t1.gid and t2.uid = t3.uid order by t3.uid, t1.gid;
table type possible_keys key key_len ref rows Extra table type possible_keys key key_len ref rows Extra
t1 index PRIMARY PRIMARY 4 NULL 6 Using index; Using temporary; Using filesort t1 index PRIMARY PRIMARY 4 NULL 6 Using index; Using temporary; Using filesort
...@@ -475,8 +475,8 @@ t2 eq_ref PRIMARY,uid PRIMARY 4 t1.gid 1 ...@@ -475,8 +475,8 @@ t2 eq_ref PRIMARY,uid PRIMARY 4 t1.gid 1
t3 eq_ref PRIMARY PRIMARY 2 t2.uid 1 Using where; Using index t3 eq_ref PRIMARY PRIMARY 2 t2.uid 1 Using where; Using index
EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.gid = t3.uid order by t3.skr,t1.gid; EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.gid = t3.uid order by t3.skr,t1.gid;
table type possible_keys key key_len ref rows Extra table type possible_keys key key_len ref rows Extra
t1 index PRIMARY PRIMARY 4 NULL 6 Using index; Using temporary; Using filesort t3 ALL PRIMARY NULL NULL NULL 6 Using temporary; Using filesort
t3 eq_ref PRIMARY PRIMARY 2 t1.gid 1 Using where t1 eq_ref PRIMARY PRIMARY 4 t3.uid 1 Using where; Using index
EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.skr = t3.uid order by t1.gid,t3.skr; EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.skr = t3.uid order by t1.gid,t3.skr;
table type possible_keys key key_len ref rows Extra table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 6 Using temporary; Using filesort t1 ALL NULL NULL NULL NULL 6 Using temporary; Using filesort
......
...@@ -111,22 +111,10 @@ n s ...@@ -111,22 +111,10 @@ n s
2 two bar 2 two bar
3 three bar 3 three bar
4 four bar 4 four bar
insert into bar.t1 values(10, 'should be there');
flush tables;
load data from master;
Error on delete of './bar/t1.MYI' (Errcode: 13)
select * from bar.t1;
n s
1 one bar
2 two bar
3 three bar
4 four bar
10 should be there
load table bar.t1 from master; load table bar.t1 from master;
Table 't1' already exists Table 't1' already exists
drop table bar.t1; drop table bar.t1;
load table bar.t1 from master; load table bar.t1 from master;
start slave;
drop database bar; drop database bar;
drop database foo; drop database foo;
drop database foo; drop database foo;
......
...@@ -110,13 +110,14 @@ select * from bar.t1; ...@@ -110,13 +110,14 @@ select * from bar.t1;
# Check that LOAD DATA FROM MASTER reports the error if it can't drop a # Check that LOAD DATA FROM MASTER reports the error if it can't drop a
# table to be overwritten. # table to be overwritten.
insert into bar.t1 values(10, 'should be there'); # DISABLED FOR NOW AS chmod IS NOT PORTABLE ON NON-UNIX
flush tables; # insert into bar.t1 values(10, 'should be there');
system chmod 500 var/slave-data/bar/; # flush tables;
--error 6 # system chmod 500 var/slave-data/bar/;
load data from master; # should fail (errno 13) # --error 6
system chmod 700 var/slave-data/bar/; # load data from master; # should fail (errno 13)
select * from bar.t1; # should contain the row (10, ...) # system chmod 700 var/slave-data/bar/;
# select * from bar.t1; # should contain the row (10, ...)
# Check that LOAD TABLE FROM MASTER fails if the table exists on slave # Check that LOAD TABLE FROM MASTER fails if the table exists on slave
...@@ -126,7 +127,8 @@ drop table bar.t1; ...@@ -126,7 +127,8 @@ drop table bar.t1;
load table bar.t1 from master; load table bar.t1 from master;
# as LOAD DATA FROM MASTER failed it did not restart slave threads # as LOAD DATA FROM MASTER failed it did not restart slave threads
start slave; # DISABLED FOR NOW
# start slave;
# Now time for cleanup # Now time for cleanup
connection master; connection master;
......
...@@ -387,6 +387,8 @@ static int search_default_file(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, ...@@ -387,6 +387,8 @@ static int search_default_file(DYNAMIC_ARRAY *args, MEM_ROOT *alloc,
*ptr++= '='; *ptr++= '=';
for ( ; value != value_end; value++) for ( ; value != value_end; value++)
{ {
if (*value == '\"' || *value == '\'')
continue;
if (*value == '\\' && value != value_end-1) if (*value == '\\' && value != value_end-1)
{ {
switch(*++value) { switch(*++value) {
...@@ -405,6 +407,12 @@ static int search_default_file(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, ...@@ -405,6 +407,12 @@ static int search_default_file(DYNAMIC_ARRAY *args, MEM_ROOT *alloc,
case 's': case 's':
*ptr++= ' '; /* space */ *ptr++= ' '; /* space */
break; break;
case '\"':
*ptr++= '\"';
break;
case '\'':
*ptr++= '\'';
break;
case '\\': case '\\':
*ptr++= '\\'; *ptr++= '\\';
break; break;
......
...@@ -76,16 +76,16 @@ load_des_key_file(const char *file_name) ...@@ -76,16 +76,16 @@ load_des_key_file(const char *file_name)
if (start != end) if (start != end)
{ {
des_cblock ivec; DES_cblock ivec;
bzero((char*) &ivec,sizeof(ivec)); bzero((char*) &ivec,sizeof(ivec));
// We make good 24-byte (168 bit) key from given plaintext key with MD5 // We make good 24-byte (168 bit) key from given plaintext key with MD5
EVP_BytesToKey(EVP_des_ede3_cbc(),EVP_md5(),NULL, EVP_BytesToKey(EVP_des_ede3_cbc(),EVP_md5(),NULL,
(uchar *) start, (int) (end-start),1, (uchar *) start, (int) (end-start),1,
(uchar *) &keyblock, (uchar *) &keyblock,
ivec); ivec);
des_set_key_unchecked(&keyblock.key1,des_keyschedule[(int)offset].ks1); DES_set_key_unchecked(&keyblock.key1,&(des_keyschedule[(int)offset].ks1));
des_set_key_unchecked(&keyblock.key2,des_keyschedule[(int)offset].ks2); DES_set_key_unchecked(&keyblock.key2,&(des_keyschedule[(int)offset].ks2));
des_set_key_unchecked(&keyblock.key3,des_keyschedule[(int)offset].ks3); DES_set_key_unchecked(&keyblock.key3,&(des_keyschedule[(int)offset].ks3));
if (des_default_key == 15) if (des_default_key == 15)
des_default_key= (uint) offset; // use first as def. des_default_key= (uint) offset; // use first as def.
} }
......
...@@ -330,7 +330,7 @@ void Item_func_concat::fix_length_and_dec() ...@@ -330,7 +330,7 @@ void Item_func_concat::fix_length_and_dec()
String *Item_func_des_encrypt::val_str(String *str) String *Item_func_des_encrypt::val_str(String *str)
{ {
#ifdef HAVE_OPENSSL #ifdef HAVE_OPENSSL
des_cblock ivec; DES_cblock ivec;
struct st_des_keyblock keyblock; struct st_des_keyblock keyblock;
struct st_des_keyschedule keyschedule; struct st_des_keyschedule keyschedule;
const char *append_str="********"; const char *append_str="********";
...@@ -370,9 +370,9 @@ String *Item_func_des_encrypt::val_str(String *str) ...@@ -370,9 +370,9 @@ String *Item_func_des_encrypt::val_str(String *str)
EVP_BytesToKey(EVP_des_ede3_cbc(),EVP_md5(),NULL, EVP_BytesToKey(EVP_des_ede3_cbc(),EVP_md5(),NULL,
(uchar*) keystr->ptr(), (int) keystr->length(), (uchar*) keystr->ptr(), (int) keystr->length(),
1, (uchar*) &keyblock,ivec); 1, (uchar*) &keyblock,ivec);
des_set_key_unchecked(&keyblock.key1,keyschedule.ks1); DES_set_key_unchecked(&keyblock.key1,&keyschedule.ks1);
des_set_key_unchecked(&keyblock.key2,keyschedule.ks2); DES_set_key_unchecked(&keyblock.key2,&keyschedule.ks2);
des_set_key_unchecked(&keyblock.key3,keyschedule.ks3); DES_set_key_unchecked(&keyblock.key3,&keyschedule.ks3);
} }
/* /*
...@@ -393,12 +393,12 @@ String *Item_func_des_encrypt::val_str(String *str) ...@@ -393,12 +393,12 @@ String *Item_func_des_encrypt::val_str(String *str)
tmp_value[0]=(char) (128 | key_number); tmp_value[0]=(char) (128 | key_number);
// Real encryption // Real encryption
bzero((char*) &ivec,sizeof(ivec)); bzero((char*) &ivec,sizeof(ivec));
des_ede3_cbc_encrypt((const uchar*) (res->ptr()), DES_ede3_cbc_encrypt((const uchar*) (res->ptr()),
(uchar*) (tmp_value.ptr()+1), (uchar*) (tmp_value.ptr()+1),
res_length, res_length,
keyschedule.ks1, &keyschedule.ks1,
keyschedule.ks2, &keyschedule.ks2,
keyschedule.ks3, &keyschedule.ks3,
&ivec, TRUE); &ivec, TRUE);
return &tmp_value; return &tmp_value;
...@@ -412,8 +412,8 @@ error: ...@@ -412,8 +412,8 @@ error:
String *Item_func_des_decrypt::val_str(String *str) String *Item_func_des_decrypt::val_str(String *str)
{ {
#ifdef HAVE_OPENSSL #ifdef HAVE_OPENSSL
des_key_schedule ks1, ks2, ks3; DES_key_schedule ks1, ks2, ks3;
des_cblock ivec; DES_cblock ivec;
struct st_des_keyblock keyblock; struct st_des_keyblock keyblock;
struct st_des_keyschedule keyschedule; struct st_des_keyschedule keyschedule;
String *res= args[0]->val_str(str); String *res= args[0]->val_str(str);
...@@ -447,20 +447,20 @@ String *Item_func_des_decrypt::val_str(String *str) ...@@ -447,20 +447,20 @@ String *Item_func_des_decrypt::val_str(String *str)
(uchar*) keystr->ptr(),(int) keystr->length(), (uchar*) keystr->ptr(),(int) keystr->length(),
1,(uchar*) &keyblock,ivec); 1,(uchar*) &keyblock,ivec);
// Here we set all 64-bit keys (56 effective) one by one // Here we set all 64-bit keys (56 effective) one by one
des_set_key_unchecked(&keyblock.key1,keyschedule.ks1); DES_set_key_unchecked(&keyblock.key1,&keyschedule.ks1);
des_set_key_unchecked(&keyblock.key2,keyschedule.ks2); DES_set_key_unchecked(&keyblock.key2,&keyschedule.ks2);
des_set_key_unchecked(&keyblock.key3,keyschedule.ks3); DES_set_key_unchecked(&keyblock.key3,&keyschedule.ks3);
} }
if (tmp_value.alloc(length-1)) if (tmp_value.alloc(length-1))
goto error; goto error;
bzero((char*) &ivec,sizeof(ivec)); bzero((char*) &ivec,sizeof(ivec));
des_ede3_cbc_encrypt((const uchar*) res->ptr()+1, DES_ede3_cbc_encrypt((const uchar*) res->ptr()+1,
(uchar*) (tmp_value.ptr()), (uchar*) (tmp_value.ptr()),
length-1, length-1,
keyschedule.ks1, &keyschedule.ks1,
keyschedule.ks2, &keyschedule.ks2,
keyschedule.ks3, &keyschedule.ks3,
&ivec, FALSE); &ivec, FALSE);
/* Restore old length of key */ /* Restore old length of key */
if ((tail=(uint) (uchar) tmp_value[length-2]) > 8) if ((tail=(uint) (uchar) tmp_value[length-2]) > 8)
......
...@@ -474,11 +474,11 @@ Field *find_field_in_table(THD *thd,TABLE *table,const char *name,uint length, ...@@ -474,11 +474,11 @@ Field *find_field_in_table(THD *thd,TABLE *table,const char *name,uint length,
#include <openssl/des.h> #include <openssl/des.h>
struct st_des_keyblock struct st_des_keyblock
{ {
des_cblock key1, key2, key3; DES_cblock key1, key2, key3;
}; };
struct st_des_keyschedule struct st_des_keyschedule
{ {
des_key_schedule ks1, ks2, ks3; DES_key_schedule ks1, ks2, ks3;
}; };
extern char *des_key_file; extern char *des_key_file;
extern struct st_des_keyschedule des_keyschedule[10]; extern struct st_des_keyschedule des_keyschedule[10];
......
...@@ -1898,7 +1898,7 @@ find_best(JOIN *join,table_map rest_tables,uint idx,double record_count, ...@@ -1898,7 +1898,7 @@ find_best(JOIN *join,table_map rest_tables,uint idx,double record_count,
best=best_time=records=DBL_MAX; best=best_time=records=DBL_MAX;
KEYUSE *best_key=0; KEYUSE *best_key=0;
uint best_max_key_part=0; uint best_max_key_part=0;
my_bool found_constrain= 0; my_bool found_constraint= 0;
if (s->keyuse) if (s->keyuse)
{ /* Use key if possible */ { /* Use key if possible */
...@@ -1979,7 +1979,7 @@ find_best(JOIN *join,table_map rest_tables,uint idx,double record_count, ...@@ -1979,7 +1979,7 @@ find_best(JOIN *join,table_map rest_tables,uint idx,double record_count,
} }
else else
{ {
found_constrain= 1; found_constraint= 1;
/* /*
Check if we found full key Check if we found full key
*/ */
...@@ -2133,12 +2133,28 @@ find_best(JOIN *join,table_map rest_tables,uint idx,double record_count, ...@@ -2133,12 +2133,28 @@ find_best(JOIN *join,table_map rest_tables,uint idx,double record_count,
s->table->used_keys && best_key) && s->table->used_keys && best_key) &&
!(s->table->force_index && best_key)) !(s->table->force_index && best_key))
{ // Check full join { // Check full join
ha_rows rnd_records= s->found_records;
/* Estimate cost of reading table. */ /* Estimate cost of reading table. */
tmp= (double) s->read_time; tmp= s->table->file->scan_time();
/*
If there is a restriction on the table, assume that 25% of the
rows can be skipped on next part.
This is to force tables that this table depends on before this
table
*/
if (found_constraint)
rnd_records-= rnd_records/4;
if (s->on_expr) // Can't use join cache if (s->on_expr) // Can't use join cache
{ {
/* We have to read the whole table for each record */ tmp= record_count *
tmp*= record_count; /* We have to read the whole table for each record */
(tmp +
/*
And we have to skip rows which does not satisfy join
condition for each record.
*/
(s->records - rnd_records)/(double) TIME_FOR_COMPARE);
} }
else else
{ {
...@@ -2146,30 +2162,25 @@ find_best(JOIN *join,table_map rest_tables,uint idx,double record_count, ...@@ -2146,30 +2162,25 @@ find_best(JOIN *join,table_map rest_tables,uint idx,double record_count,
tmp*= (1.0 + floor((double) cache_record_length(join,idx) * tmp*= (1.0 + floor((double) cache_record_length(join,idx) *
record_count / record_count /
(double) thd->variables.join_buff_size)); (double) thd->variables.join_buff_size));
/*
We don't make full cartesian product between rows in the scanned
table and existing records because we skip all rows from the
scanned table, which does not satisfy join condition when
we read the table (see flush_cached_records for details). Here we
take into account cost to read and skip these records.
*/
tmp+= (s->records - rnd_records)/(double) TIME_FOR_COMPARE;
} }
/* /*
We estimate the cost of making full cortesian product between We estimate the cost of evaluating WHERE clause for found records
rows in the scanned table and generated records as as record_count * rnd_records + TIME_FOR_COMPARE. This cost plus
record_count*s->records/TIME_FOR_COMPARE. Taking into account tmp give us total cost of using TABLE SCAN
cost of evaluating WHERE clause for s->found_records is not
necessary because it costs much less than the cost mentioned
above.
*/ */
if (best == DBL_MAX || if (best == DBL_MAX ||
(tmp + record_count/(double) TIME_FOR_COMPARE*s->records < (tmp + record_count/(double) TIME_FOR_COMPARE*rnd_records <
best + record_count/(double) TIME_FOR_COMPARE*records)) best + record_count/(double) TIME_FOR_COMPARE*records))
{ {
/*
If there is a restriction on the table, assume that 25% of the
rows can be skipped on next part.
This is to force tables that this table depends on before this
table
*/
ha_rows rnd_records= s->found_records;
if (found_constrain)
rnd_records-= rnd_records/4;
/* /*
If the table has a range (s->quick is set) make_join_select() If the table has a range (s->quick is set) make_join_select()
will ensure that this will be used will ensure that this will be used
......
...@@ -178,7 +178,7 @@ case "$mode" in ...@@ -178,7 +178,7 @@ case "$mode" in
# delete lock for RedHat / SuSE # delete lock for RedHat / SuSE
if test -f /var/lock/subsys/mysql if test -f /var/lock/subsys/mysql
then then
rm /var/lock/subsys/mysql rm -f /var/lock/subsys/mysql
fi fi
else else
echo "No mysqld pid file found. Looked for $pid_file." echo "No mysqld pid file found. Looked for $pid_file."
......
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