summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/mysql.cc6
-rw-r--r--client/mysqlbinlog.cc35
-rw-r--r--extra/comp_err.c2
-rw-r--r--heap/hp_test2.c4
-rw-r--r--include/my_global.h10
-rw-r--r--isam/test2.c4
-rw-r--r--myisam/mi_test2.c4
-rw-r--r--mysql-test/r/distinct.result10
-rw-r--r--mysql-test/r/order_by.result14
-rw-r--r--mysql-test/r/rpl000009.result12
-rw-r--r--mysql-test/t/rpl000009.test18
-rw-r--r--mysys/default.c8
-rw-r--r--sql/des_key_file.cc8
-rw-r--r--sql/item_strfunc.cc34
-rw-r--r--sql/mysql_priv.h4
-rw-r--r--sql/sql_select.cc55
-rw-r--r--support-files/mysql.server.sh2
17 files changed, 134 insertions, 96 deletions
diff --git a/client/mysql.cc b/client/mysql.cc
index 639e5f450ad..2fa131b854a 100644
--- a/client/mysql.cc
+++ b/client/mysql.cc
@@ -40,7 +40,7 @@
#include <signal.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 */
#define MAX_COLUMN_LENGTH 1024
@@ -801,7 +801,9 @@ static int read_lines(bool execute_commands)
char *prompt= (char*) (glob_buffer.is_empty() ? construct_prompt() :
!in_string ? " -> " :
in_string == '\'' ?
- " '> " : " \"> ");
+ " '> " : (in_string == '`' ?
+ " `> " :
+ " \"> "));
if (opt_outfile && glob_buffer.is_empty())
fflush(OUTFILE);
diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc
index ac43130b8bc..6eab790857d 100644
--- a/client/mysqlbinlog.cc
+++ b/client/mysqlbinlog.cc
@@ -21,6 +21,7 @@
#include <assert.h>
#include "log_event.h"
#include "include/my_sys.h"
+#include "unistd.h"
#define BIN_LOG_HEADER_SIZE 4
#define PROBE_HEADER_LEN (EVENT_LEN_OFFSET+4)
@@ -81,9 +82,9 @@ class Load_log_processor
bname--;
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;
- 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))
{
die("Could not construct local filename %s%s",target_dir_name,bname);
@@ -96,6 +97,21 @@ class Load_log_processor
memcpy(ptr,bname,blen);
ptr+= blen;
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);
@@ -169,6 +185,8 @@ public:
}
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**)file_names.buffer + file_id;
Create_file_log_event *res= *ptr;
@@ -182,8 +200,12 @@ public:
}
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
--position). Assuming it's a big --position, we just do nothing and
@@ -191,11 +213,6 @@ public:
*/
fprintf(stderr,"Warning: ignoring Append_block as there is no \
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);
}
};
diff --git a/extra/comp_err.c b/extra/comp_err.c
index 8e9c6fc0f0e..bd7e6231908 100644
--- a/extra/comp_err.c
+++ b/extra/comp_err.c
@@ -109,7 +109,7 @@ int main(int argc,char *argv[])
if (to)
fclose(to);
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);
return(0);
diff --git a/heap/hp_test2.c b/heap/hp_test2.c
index e2570893519..36016797447 100644
--- a/heap/hp_test2.c
+++ b/heap/hp_test2.c
@@ -237,12 +237,12 @@ int main(int argc, char *argv[])
{
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);
goto err;
}
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
{
diff --git a/include/my_global.h b/include/my_global.h
index 9d08977a7cd..59e0c43f18d 100644
--- a/include/my_global.h
+++ b/include/my_global.h
@@ -1105,4 +1105,14 @@ typedef union {
#define statistic_add(V,C,L) (V)+=(C)
#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 */
diff --git a/isam/test2.c b/isam/test2.c
index c8f97ccdefa..5b09cc8b716 100644
--- a/isam/test2.c
+++ b/isam/test2.c
@@ -265,12 +265,12 @@ int main(int argc, char *argv[])
{
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);
goto err;
}
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
{
diff --git a/myisam/mi_test2.c b/myisam/mi_test2.c
index e3a2ecfbb1f..2a658ca2054 100644
--- a/myisam/mi_test2.c
+++ b/myisam/mi_test2.c
@@ -329,12 +329,12 @@ int main(int argc, char *argv[])
{
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);
goto err;
}
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
{
diff --git a/mysql-test/r/distinct.result b/mysql-test/r/distinct.result
index da0c6a5eb72..a0343f13394 100644
--- a/mysql-test/r/distinct.result
+++ b/mysql-test/r/distinct.result
@@ -173,9 +173,9 @@ INSERT INTO t2 values (1),(2),(3);
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;
table type possible_keys key key_len ref rows Extra
-t2 index a a 4 NULL 5 Using index; Using temporary
-t1 eq_ref PRIMARY PRIMARY 4 t2.a 1
-t3 index a a 5 NULL 5 Using where; Using index
+t3 index a a 5 NULL 6 Using index; Using temporary
+t2 index a a 4 NULL 5 Using index; Distinct
+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;
a
1
@@ -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
t3 index id id 8 NULL 1 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
-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
t1.id
from
diff --git a/mysql-test/r/order_by.result b/mysql-test/r/order_by.result
index 64fac8af872..58f4972d08f 100644
--- a/mysql-test/r/order_by.result
+++ b/mysql-test/r/order_by.result
@@ -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
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
-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;
table type possible_keys key key_len ref rows Extra
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
desc,b desc;
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;
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;
table type possible_keys key key_len ref rows Extra
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
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;
table type possible_keys key key_len ref rows Extra
-t1 index PRIMARY PRIMARY 4 NULL 6 Using index
-t3 eq_ref PRIMARY PRIMARY 2 t1.gid 1 Using where
+t3 ALL PRIMARY NULL NULL NULL 6 Using temporary; Using filesort
+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;
table type possible_keys key key_len ref rows Extra
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
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;
table type possible_keys key key_len ref rows Extra
-t1 index PRIMARY PRIMARY 4 NULL 6 Using index; Using temporary; Using filesort
-t3 eq_ref PRIMARY PRIMARY 2 t1.gid 1 Using where
+t3 ALL PRIMARY NULL NULL NULL 6 Using temporary; Using filesort
+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;
table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 6 Using temporary; Using filesort
diff --git a/mysql-test/r/rpl000009.result b/mysql-test/r/rpl000009.result
index 4a8057467f2..569dd301143 100644
--- a/mysql-test/r/rpl000009.result
+++ b/mysql-test/r/rpl000009.result
@@ -111,22 +111,10 @@ n s
2 two bar
3 three 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;
Table 't1' already exists
drop table bar.t1;
load table bar.t1 from master;
-start slave;
drop database bar;
drop database foo;
drop database foo;
diff --git a/mysql-test/t/rpl000009.test b/mysql-test/t/rpl000009.test
index 975cfbf9a65..e019e1fc3a7 100644
--- a/mysql-test/t/rpl000009.test
+++ b/mysql-test/t/rpl000009.test
@@ -110,13 +110,14 @@ select * from bar.t1;
# Check that LOAD DATA FROM MASTER reports the error if it can't drop a
# table to be overwritten.
-insert into bar.t1 values(10, 'should be there');
-flush tables;
-system chmod 500 var/slave-data/bar/;
---error 6
-load data from master; # should fail (errno 13)
-system chmod 700 var/slave-data/bar/;
-select * from bar.t1; # should contain the row (10, ...)
+# DISABLED FOR NOW AS chmod IS NOT PORTABLE ON NON-UNIX
+# insert into bar.t1 values(10, 'should be there');
+# flush tables;
+# system chmod 500 var/slave-data/bar/;
+# --error 6
+# load data from master; # should fail (errno 13)
+# 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
@@ -126,7 +127,8 @@ drop table bar.t1;
load table bar.t1 from master;
# as LOAD DATA FROM MASTER failed it did not restart slave threads
-start slave;
+# DISABLED FOR NOW
+# start slave;
# Now time for cleanup
connection master;
diff --git a/mysys/default.c b/mysys/default.c
index d938bc4435f..0318efeb448 100644
--- a/mysys/default.c
+++ b/mysys/default.c
@@ -387,6 +387,8 @@ static int search_default_file(DYNAMIC_ARRAY *args, MEM_ROOT *alloc,
*ptr++= '=';
for ( ; value != value_end; value++)
{
+ if (*value == '\"' || *value == '\'')
+ continue;
if (*value == '\\' && value != value_end-1)
{
switch(*++value) {
@@ -405,6 +407,12 @@ static int search_default_file(DYNAMIC_ARRAY *args, MEM_ROOT *alloc,
case 's':
*ptr++= ' '; /* space */
break;
+ case '\"':
+ *ptr++= '\"';
+ break;
+ case '\'':
+ *ptr++= '\'';
+ break;
case '\\':
*ptr++= '\\';
break;
diff --git a/sql/des_key_file.cc b/sql/des_key_file.cc
index 891cf18ee53..619691d183e 100644
--- a/sql/des_key_file.cc
+++ b/sql/des_key_file.cc
@@ -76,16 +76,16 @@ load_des_key_file(const char *file_name)
if (start != end)
{
- des_cblock ivec;
+ DES_cblock ivec;
bzero((char*) &ivec,sizeof(ivec));
// We make good 24-byte (168 bit) key from given plaintext key with MD5
EVP_BytesToKey(EVP_des_ede3_cbc(),EVP_md5(),NULL,
(uchar *) start, (int) (end-start),1,
(uchar *) &keyblock,
ivec);
- 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.key3,des_keyschedule[(int)offset].ks3);
+ 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.key3,&(des_keyschedule[(int)offset].ks3));
if (des_default_key == 15)
des_default_key= (uint) offset; // use first as def.
}
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index 8cc3d24f7d9..fe9c8b9e099 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -330,7 +330,7 @@ void Item_func_concat::fix_length_and_dec()
String *Item_func_des_encrypt::val_str(String *str)
{
#ifdef HAVE_OPENSSL
- des_cblock ivec;
+ DES_cblock ivec;
struct st_des_keyblock keyblock;
struct st_des_keyschedule keyschedule;
const char *append_str="********";
@@ -370,9 +370,9 @@ String *Item_func_des_encrypt::val_str(String *str)
EVP_BytesToKey(EVP_des_ede3_cbc(),EVP_md5(),NULL,
(uchar*) keystr->ptr(), (int) keystr->length(),
1, (uchar*) &keyblock,ivec);
- des_set_key_unchecked(&keyblock.key1,keyschedule.ks1);
- des_set_key_unchecked(&keyblock.key2,keyschedule.ks2);
- des_set_key_unchecked(&keyblock.key3,keyschedule.ks3);
+ DES_set_key_unchecked(&keyblock.key1,&keyschedule.ks1);
+ DES_set_key_unchecked(&keyblock.key2,&keyschedule.ks2);
+ DES_set_key_unchecked(&keyblock.key3,&keyschedule.ks3);
}
/*
@@ -393,12 +393,12 @@ String *Item_func_des_encrypt::val_str(String *str)
tmp_value[0]=(char) (128 | key_number);
// Real encryption
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),
res_length,
- keyschedule.ks1,
- keyschedule.ks2,
- keyschedule.ks3,
+ &keyschedule.ks1,
+ &keyschedule.ks2,
+ &keyschedule.ks3,
&ivec, TRUE);
return &tmp_value;
@@ -412,8 +412,8 @@ error:
String *Item_func_des_decrypt::val_str(String *str)
{
#ifdef HAVE_OPENSSL
- des_key_schedule ks1, ks2, ks3;
- des_cblock ivec;
+ DES_key_schedule ks1, ks2, ks3;
+ DES_cblock ivec;
struct st_des_keyblock keyblock;
struct st_des_keyschedule keyschedule;
String *res= args[0]->val_str(str);
@@ -447,20 +447,20 @@ String *Item_func_des_decrypt::val_str(String *str)
(uchar*) keystr->ptr(),(int) keystr->length(),
1,(uchar*) &keyblock,ivec);
// 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.key2,keyschedule.ks2);
- des_set_key_unchecked(&keyblock.key3,keyschedule.ks3);
+ DES_set_key_unchecked(&keyblock.key1,&keyschedule.ks1);
+ DES_set_key_unchecked(&keyblock.key2,&keyschedule.ks2);
+ DES_set_key_unchecked(&keyblock.key3,&keyschedule.ks3);
}
if (tmp_value.alloc(length-1))
goto error;
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()),
length-1,
- keyschedule.ks1,
- keyschedule.ks2,
- keyschedule.ks3,
+ &keyschedule.ks1,
+ &keyschedule.ks2,
+ &keyschedule.ks3,
&ivec, FALSE);
/* Restore old length of key */
if ((tail=(uint) (uchar) tmp_value[length-2]) > 8)
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index 22c92a5473b..8024c755a63 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -474,11 +474,11 @@ Field *find_field_in_table(THD *thd,TABLE *table,const char *name,uint length,
#include <openssl/des.h>
struct st_des_keyblock
{
- des_cblock key1, key2, key3;
+ DES_cblock key1, key2, key3;
};
struct st_des_keyschedule
{
- des_key_schedule ks1, ks2, ks3;
+ DES_key_schedule ks1, ks2, ks3;
};
extern char *des_key_file;
extern struct st_des_keyschedule des_keyschedule[10];
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index d537dccc5a6..53c41482a36 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -1898,7 +1898,7 @@ find_best(JOIN *join,table_map rest_tables,uint idx,double record_count,
best=best_time=records=DBL_MAX;
KEYUSE *best_key=0;
uint best_max_key_part=0;
- my_bool found_constrain= 0;
+ my_bool found_constraint= 0;
if (s->keyuse)
{ /* Use key if possible */
@@ -1979,7 +1979,7 @@ find_best(JOIN *join,table_map rest_tables,uint idx,double record_count,
}
else
{
- found_constrain= 1;
+ found_constraint= 1;
/*
Check if we found full key
*/
@@ -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->force_index && best_key))
{ // Check full join
+ ha_rows rnd_records= s->found_records;
/* 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
{
- /* 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
{
@@ -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) *
record_count /
(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
- rows in the scanned table and generated records as
- record_count*s->records/TIME_FOR_COMPARE. Taking into account
- cost of evaluating WHERE clause for s->found_records is not
- necessary because it costs much less than the cost mentioned
- above.
+ We estimate the cost of evaluating WHERE clause for found records
+ as record_count * rnd_records + TIME_FOR_COMPARE. This cost plus
+ tmp give us total cost of using TABLE SCAN
*/
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))
{
- /*
- 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()
will ensure that this will be used
diff --git a/support-files/mysql.server.sh b/support-files/mysql.server.sh
index 694e6fa8ebb..fe1f0de8477 100644
--- a/support-files/mysql.server.sh
+++ b/support-files/mysql.server.sh
@@ -178,7 +178,7 @@ case "$mode" in
# delete lock for RedHat / SuSE
if test -f /var/lock/subsys/mysql
then
- rm /var/lock/subsys/mysql
+ rm -f /var/lock/subsys/mysql
fi
else
echo "No mysqld pid file found. Looked for $pid_file."