summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <monty@narttu.mysql.fi>2003-05-06 01:38:38 +0300
committerunknown <monty@narttu.mysql.fi>2003-05-06 01:38:38 +0300
commitb96aaea7e15642a8f0d9a478e9daabe470cb966d (patch)
treee4e5fa90d35bf2fc106cf0b773a29900579c7daa
parent03c1ec3d685b60d04b0db274c5201149322ac667 (diff)
downloadmariadb-git-b96aaea7e15642a8f0d9a478e9daabe470cb966d.tar.gz
Removed compiler warnings
Fixed memory leak in new filesort code Optimzed sub selects to use keys with outer references. Increased max tables in join to 62 client/Makefile.am: Remve test programs myisam/mi_check.c: Remove compiler warnings myisam/mi_delete.c: Remove 'rnd' variable to make usage repeatable myisam/mi_open.c: Remove 'rnd' variable to make usage repeatable myisam/mi_write.c: Remove 'rnd' variable to make usage repeatable myisam/myisamdef.h: Remove 'rnd' variable to make usage repeatable myisam/myisamlog.c: Remove 'rnd' variable to make usage repeatable mysql-test/r/subselect.result: new test mysql-test/t/join.test: Updated test mysql-test/t/subselect.test: new test sql/filesort.cc: Added function to free buffers allocated by filesort sql/item.cc: Sub select optimization sql/item_cmpfunc.cc: Sub select optimization sql/item_subselect.cc: Sub select optimization sql/item_sum.cc: Removed compiler warnings sql/item_sum.h: Simple code cleanup sql/log.cc: Removed compiler warning sql/mysql_priv.h: Made table_map ulonglong to allow 62 tables in join sql/records.cc: Moved free of filesort buffers to own function sql/sql_select.cc: subselect optimization Call filesort_free_buffers() to free memory from filesort sql/unireg.h: Sub select optimization
-rw-r--r--client/Makefile.am1
-rw-r--r--myisam/mi_check.c12
-rw-r--r--myisam/mi_delete.c2
-rw-r--r--myisam/mi_open.c4
-rw-r--r--myisam/mi_write.c3
-rw-r--r--myisam/myisamdef.h1
-rw-r--r--myisam/myisamlog.c6
-rw-r--r--mysql-test/r/subselect.result11
-rw-r--r--mysql-test/t/join.test2
-rw-r--r--mysql-test/t/subselect.test9
-rw-r--r--sql/filesort.cc16
-rw-r--r--sql/item.cc2
-rw-r--r--sql/item_cmpfunc.cc4
-rw-r--r--sql/item_subselect.cc2
-rw-r--r--sql/item_sum.cc54
-rw-r--r--sql/item_sum.h31
-rw-r--r--sql/log.cc1
-rw-r--r--sql/mysql_priv.h3
-rw-r--r--sql/records.cc14
-rw-r--r--sql/sql_select.cc24
-rw-r--r--sql/unireg.h3
21 files changed, 113 insertions, 92 deletions
diff --git a/client/Makefile.am b/client/Makefile.am
index da401dd502e..2922b1fc6a2 100644
--- a/client/Makefile.am
+++ b/client/Makefile.am
@@ -22,7 +22,6 @@ LIBS = @CLIENT_LIBS@
LDADD = @CLIENT_EXTRA_LDFLAGS@ ../libmysql/libmysqlclient.la
bin_PROGRAMS = mysql mysqladmin mysqlcheck mysqlshow \
mysqldump mysqlimport mysqltest mysqlbinlog mysqlmanagerc mysqlmanager-pwgen
-noinst_PROGRAMS = insert_test select_test thread_test
noinst_HEADERS = sql_string.h completion_hash.h my_readline.h \
client_priv.h
mysql_SOURCES = mysql.cc readline.cc sql_string.cc completion_hash.cc
diff --git a/myisam/mi_check.c b/myisam/mi_check.c
index 73bdcea9cc3..75f2a6c83c4 100644
--- a/myisam/mi_check.c
+++ b/myisam/mi_check.c
@@ -3117,7 +3117,8 @@ int sort_ft_buf_flush(MI_SORT_PARAM *sort_param)
SORT_INFO *sort_info=sort_param->sort_info;
SORT_KEY_BLOCKS *key_block=sort_info->key_block;
MYISAM_SHARE *share=sort_info->info->s;
- uint val_off, val_len, error;
+ uint val_off, val_len;
+ int error;
SORT_FT_BUF *ft_buf=sort_info->ft_buf;
uchar *from, *to;
@@ -3126,14 +3127,17 @@ int sort_ft_buf_flush(MI_SORT_PARAM *sort_param)
to=ft_buf->lastkey+val_off;
if (ft_buf->buf)
- { /* flushing first-level tree */
- error=sort_insert_key(sort_param,key_block,ft_buf->lastkey,HA_OFFSET_ERROR);
+ {
+ /* flushing first-level tree */
+ error=sort_insert_key(sort_param,key_block,ft_buf->lastkey,
+ HA_OFFSET_ERROR);
for (from=to+val_len;
!error && from < ft_buf->buf;
from+= val_len)
{
memcpy(to, from, val_len);
- error=sort_insert_key(sort_param,key_block,ft_buf->lastkey,HA_OFFSET_ERROR);
+ error=sort_insert_key(sort_param,key_block,ft_buf->lastkey,
+ HA_OFFSET_ERROR);
}
return error;
}
diff --git a/myisam/mi_delete.c b/myisam/mi_delete.c
index 96c6400f078..36dd0d2d62c 100644
--- a/myisam/mi_delete.c
+++ b/myisam/mi_delete.c
@@ -491,7 +491,7 @@ static int underflow(register MI_INFO *info, register MI_KEYDEF *keyinfo,
if (info->s->keyinfo+info->lastinx == keyinfo)
info->page_changed=1;
- if ((keypos < anc_buff+anc_length && (share->rnd++ & 1)) ||
+ if ((keypos < anc_buff+anc_length && (info->state->records & 1)) ||
keypos == anc_buff+2+key_reflength)
{ /* Use page right of anc-page */
DBUG_PRINT("test",("use right page"));
diff --git a/myisam/mi_open.c b/myisam/mi_open.c
index a2602abea5d..a1ce135f02f 100644
--- a/myisam/mi_open.c
+++ b/myisam/mi_open.c
@@ -427,10 +427,6 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
share->kfile=kfile;
share->this_process=(ulong) getpid();
- share->rnd= (int) share->this_process; /* rnd-counter for splits */
-#ifndef DBUG_OFF
- share->rnd=0; /* To make things repeatable */
-#endif
share->last_process= share->state.process;
share->base.key_parts=key_parts;
share->base.all_key_parts=key_parts+unique_key_parts;
diff --git a/myisam/mi_write.c b/myisam/mi_write.c
index 59b4f0d29c3..6985dac7832 100644
--- a/myisam/mi_write.c
+++ b/myisam/mi_write.c
@@ -662,7 +662,8 @@ static int _mi_balance_page(register MI_INFO *info, MI_KEYDEF *keyinfo,
curr_keylength=k_length+nod_flag;
info->page_changed=1;
- if ((father_key_pos != father_buff+father_length && (info->s->rnd++ & 1)) ||
+ if ((father_key_pos != father_buff+father_length &&
+ (info->state->records & 1)) ||
father_key_pos == father_buff+2+info->s->base.key_reflength)
{
right=1;
diff --git a/myisam/myisamdef.h b/myisam/myisamdef.h
index 25f2969a973..50320f1ecbd 100644
--- a/myisam/myisamdef.h
+++ b/myisam/myisamdef.h
@@ -193,7 +193,6 @@ typedef struct st_mi_isam_share { /* Shared between opens */
uint w_locks,r_locks,tot_locks; /* Number of read/write locks */
uint blocksize; /* blocksize of keyfile */
myf write_flag;
- int rnd; /* rnd-counter */
enum data_file_type data_file_type;
my_bool changed, /* If changed since lock */
global_changed, /* If changed since open */
diff --git a/myisam/myisamlog.c b/myisam/myisamlog.c
index d7fb3f24b85..4bb7cc55d30 100644
--- a/myisam/myisamlog.c
+++ b/myisam/myisamlog.c
@@ -448,10 +448,6 @@ static int examine_log(my_string file_name, char **table_names)
goto end;
files_open++;
file_info.closed=0;
- if (opt_myisam_with_debug)
- file_info.isam->s->rnd= 0;
- else
- file_info.isam->s->rnd= isamlog_process;
}
VOID(tree_insert(&tree, (gptr) &file_info, 0, tree.custom_arg));
if (file_info.used)
@@ -806,7 +802,6 @@ static int close_some_file(TREE *tree)
(void*) &access_param,left_root_right));
if (!access_param.found)
return 1; /* No open file that is possibly to close */
- access_param.found->rnd=access_param.found->isam->s->rnd;
if (mi_close(access_param.found->isam))
return 1;
access_param.found->closed=1;
@@ -826,7 +821,6 @@ static int reopen_closed_file(TREE *tree, struct file_info *fileinfo)
if (!(fileinfo->isam= mi_open(name,O_RDWR,HA_OPEN_WAIT_IF_LOCKED)))
return 1;
fileinfo->closed=0;
- fileinfo->isam->s->rnd=fileinfo->rnd;
re_open_count++;
return 0;
}
diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result
index 564e102c874..b3ff4f94ced 100644
--- a/mysql-test/r/subselect.result
+++ b/mysql-test/r/subselect.result
@@ -294,6 +294,10 @@ patient_uq clinic_uq
1 1
1 2
2 2
+explain select * from t6 where exists (select * from t7 where uq = clinic_uq);
+id select_type table type possible_keys key key_len ref rows Extra
+1 PRIMARY t6 ALL NULL NULL NULL NULL 4 Using where
+2 DEPENDENT SUBQUERY t7 eq_ref PRIMARY PRIMARY 4 t6.clinic_uq 1
select * from t1 where a= (select a from t2,t4 where t2.b=t4.b);
Column: 'a' in field list is ambiguous
drop table if exists t1,t2,t3;
@@ -1113,3 +1117,10 @@ select -10 IN (select a from t1 FORCE INDEX (indexa));
-10 IN (select a from t1 FORCE INDEX (indexa))
NULL
drop table t1;
+create table t1 (id int not null auto_increment primary key, salary int, key(salary));
+insert into t1 (salary) values (100),(1000),(10000),(10),(500),(5000),(50000);
+explain SELECT id FROM t1 where salary = (SELECT MAX(salary) FROM t1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 PRIMARY t1 ref salary salary 5 const 1 Using where
+2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
+drop table t1;
diff --git a/mysql-test/t/join.test b/mysql-test/t/join.test
index 7840e128ac7..5fd96d6687c 100644
--- a/mysql-test/t/join.test
+++ b/mysql-test/t/join.test
@@ -115,7 +115,7 @@ drop table t1, t2;
create table t1 (a int primary key);
insert into t1 values(1),(2);
select t1.a from t1 as t1 left join t1 as t2 using (a) left join t1 as t3 using (a) left join t1 as t4 using (a) left join t1 as t5 using (a) left join t1 as t6 using (a) left join t1 as t7 using (a) left join t1 as t8 using (a) left join t1 as t9 using (a) left join t1 as t10 using (a) left join t1 as t11 using (a) left join t1 as t12 using (a) left join t1 as t13 using (a) left join t1 as t14 using (a) left join t1 as t15 using (a) left join t1 as t16 using (a) left join t1 as t17 using (a) left join t1 as t18 using (a) left join t1 as t19 using (a) left join t1 as t20 using (a) left join t1 as t21 using (a) left join t1 as t22 using (a) left join t1 as t23 using (a) left join t1 as t24 using (a) left join t1 as t25 using (a) left join t1 as t26 using (a) left join t1 as t27 using (a) left join t1 as t28 using (a) left join t1 as t29 using (a) left join t1 as t30 using (a) left join t1 as t31 using (a);
---replace_result "31 tables" "XX tables" "63 tables" "XX tables"
+--replace_result "31 tables" "XX tables" "62 tables" "XX tables"
--error 1116
select t1.a from t1 as t1 left join t1 as t2 using (a) left join t1 as t3 using (a) left join t1 as t4 using (a) left join t1 as t5 using (a) left join t1 as t6 using (a) left join t1 as t7 using (a) left join t1 as t8 using (a) left join t1 as t9 using (a) left join t1 as t10 using (a) left join t1 as t11 using (a) left join t1 as t12 using (a) left join t1 as t13 using (a) left join t1 as t14 using (a) left join t1 as t15 using (a) left join t1 as t16 using (a) left join t1 as t17 using (a) left join t1 as t18 using (a) left join t1 as t19 using (a) left join t1 as t20 using (a) left join t1 as t21 using (a) left join t1 as t22 using (a) left join t1 as t23 using (a) left join t1 as t24 using (a) left join t1 as t25 using (a) left join t1 as t26 using (a) left join t1 as t27 using (a) left join t1 as t28 using (a) left join t1 as t29 using (a) left join t1 as t30 using (a) left join t1 as t31 using (a) left join t1 as t32 using (a) left join t1 as t33 using (a) left join t1 as t34 using (a) left join t1 as t35 using (a) left join t1 as t36 using (a) left join t1 as t37 using (a) left join t1 as t38 using (a) left join t1 as t39 using (a) left join t1 as t40 using (a) left join t1 as t41 using (a) left join t1 as t42 using (a) left join t1 as t43 using (a) left join t1 as t44 using (a) left join t1 as t45 using (a) left join t1 as t46 using (a) left join t1 as t47 using (a) left join t1 as t48 using (a) left join t1 as t49 using (a) left join t1 as t50 using (a) left join t1 as t51 using (a) left join t1 as t52 using (a) left join t1 as t53 using (a) left join t1 as t54 using (a) left join t1 as t55 using (a) left join t1 as t56 using (a) left join t1 as t57 using (a) left join t1 as t58 using (a) left join t1 as t59 using (a) left join t1 as t60 using (a) left join t1 as t61 using (a) left join t1 as t62 using (a) left join t1 as t63 using (a) left join t1 as t64 using (a) left join t1 as t65 using (a);
drop table t1;
diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test
index dffe6ec79c2..30cb7b05d74 100644
--- a/mysql-test/t/subselect.test
+++ b/mysql-test/t/subselect.test
@@ -125,6 +125,7 @@ create table t7( uq int primary key, name char(25));
insert into t7 values(1,"Oblastnaia bolnitsa"),(2,"Bolnitsa Krasnogo Kresta");
insert into t6 values (1,1),(1,2),(2,2),(1,3);
select * from t6 where exists (select * from t7 where uq = clinic_uq);
+explain select * from t6 where exists (select * from t7 where uq = clinic_uq);
# not unique fields
-- error 1052
@@ -703,3 +704,11 @@ create table t1 (a int, unique index indexa (a));
insert into t1 values (-1), (-4), (-2), (NULL);
select -10 IN (select a from t1 FORCE INDEX (indexa));
drop table t1;
+
+#
+# Test optimization for sub selects
+#
+create table t1 (id int not null auto_increment primary key, salary int, key(salary));
+insert into t1 (salary) values (100),(1000),(10000),(10),(500),(5000),(50000);
+explain SELECT id FROM t1 where salary = (SELECT MAX(salary) FROM t1);
+drop table t1;
diff --git a/sql/filesort.cc b/sql/filesort.cc
index 928138b8d48..a3d24cd9242 100644
--- a/sql/filesort.cc
+++ b/sql/filesort.cc
@@ -262,6 +262,22 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length,
} /* filesort */
+void filesort_free_buffers(TABLE *table)
+{
+ if (table->sort.record_pointers)
+ {
+ my_free((gptr) table->sort.record_pointers,MYF(0));
+ table->sort.record_pointers=0;
+ }
+ if (table->sort.addon_buf)
+ {
+ my_free((char *) table->sort.addon_buf, MYF(0));
+ my_free((char *) table->sort.addon_field, MYF(MY_ALLOW_ZERO_PTR));
+ table->sort.addon_buf=0;
+ table->sort.addon_field=0;
+ }
+}
+
/* Make a array of string pointers */
static char **make_char_array(register uint fields, uint length, myf my_flag)
diff --git a/sql/item.cc b/sql/item.cc
index 7dd8392b695..c7df0e5f00b 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -349,7 +349,7 @@ table_map Item_field::used_tables() const
{
if (field->table->const_table)
return 0; // const item
- return (depended_from ? RAND_TABLE_BIT : field->table->map);
+ return (depended_from ? OUTER_REF_TABLE_BIT : field->table->map);
}
Item *Item_field::get_tmp_table_item(THD *thd)
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index 0f21cf5a774..7cc07690fcc 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -346,7 +346,7 @@ bool Item_in_optimizer::fix_fields(THD *thd, struct st_table_list *tables,
if (cache->cols() == 1)
{
if (args[0]->used_tables())
- cache->set_used_tables(RAND_TABLE_BIT);
+ cache->set_used_tables(OUTER_REF_TABLE_BIT);
else
cache->set_used_tables(0);
}
@@ -356,7 +356,7 @@ bool Item_in_optimizer::fix_fields(THD *thd, struct st_table_list *tables,
for (uint i= 0; i < n; i++)
{
if (args[0]->el(i)->used_tables())
- ((Item_cache *)cache->el(i))->set_used_tables(RAND_TABLE_BIT);
+ ((Item_cache *)cache->el(i))->set_used_tables(OUTER_REF_TABLE_BIT);
else
((Item_cache *)cache->el(i))->set_used_tables(0);
}
diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc
index 6c0b799b4de..c749fba616f 100644
--- a/sql/item_subselect.cc
+++ b/sql/item_subselect.cc
@@ -128,7 +128,7 @@ void Item_subselect::fix_length_and_dec()
inline table_map Item_subselect::used_tables() const
{
return (table_map) (engine->dependent() ? 1L :
- (engine->uncacheable() ? RAND_TABLE_BIT : 0L));
+ (engine->uncacheable() ? OUTER_REF_TABLE_BIT : 0L));
}
Item_singlerow_subselect::Item_singlerow_subselect(THD *thd,
diff --git a/sql/item_sum.cc b/sql/item_sum.cc
index 5a758edc6c3..6dbfc236158 100644
--- a/sql/item_sum.cc
+++ b/sql/item_sum.cc
@@ -1348,7 +1348,7 @@ static int group_concat_key_cmp_with_distinct(void* arg, byte* key1,
byte* key2)
{
Item_func_group_concat* item= (Item_func_group_concat*)arg;
- for (int i= 0; i<item->arg_count_field; i++)
+ for (uint i= 0; i < item->arg_count_field; i++)
{
Item *field_item= item->expr[i];
Field *field= field_item->tmp_table_field();
@@ -1377,7 +1377,7 @@ static int group_concat_key_cmp_with_distinct(void* arg, byte* key1,
static int group_concat_key_cmp_with_order(void* arg, byte* key1, byte* key2)
{
Item_func_group_concat* item= (Item_func_group_concat*)arg;
- for (int i=0; i<item->arg_count_order; i++)
+ for (uint i=0; i < item->arg_count_order; i++)
{
ORDER *order_item= item->order[i];
Item *item= *order_item->item;
@@ -1428,7 +1428,7 @@ static int dump_leaf_key(byte* key, uint32 count __attribute__((unused)),
tmp.length(0);
- for (int i= 0; i < group_concat_item->arg_show_fields; i++)
+ for (uint i= 0; i < group_concat_item->arg_show_fields; i++)
{
Item *show_item= group_concat_item->expr[i];
if (!show_item->const_item())
@@ -1482,13 +1482,13 @@ static int dump_leaf_key(byte* key, uint32 count __attribute__((unused)),
is_separator - string value of separator
*/
-Item_func_group_concat::Item_func_group_concat(int is_distinct,
+Item_func_group_concat::Item_func_group_concat(bool is_distinct,
List<Item> *is_select,
SQL_LIST *is_order,
String *is_separator)
:Item_sum(), tmp_table_param(0), warning_available(false),
- separator(is_separator), tree(&tree_base), table(0), distinct(is_distinct),
- tree_mode(0), count_cut_values(0)
+ separator(is_separator), tree(&tree_base), table(0),
+ count_cut_values(0), tree_mode(0), distinct(is_distinct)
{
original= 0;
quick_group= 0;
@@ -1507,39 +1507,31 @@ Item_func_group_concat::Item_func_group_concat(int is_distinct,
expr - arg_count_field
order - arg_count_order
*/
- args= (Item**)sql_alloc(sizeof(Item*)*(arg_count+arg_count_order+arg_count_field)+
- sizeof(ORDER*)*arg_count_order);
+ args= (Item**) sql_alloc(sizeof(Item*)*(arg_count+arg_count_order+
+ arg_count_field)+
+ sizeof(ORDER*)*arg_count_order);
if (!args)
- {
- my_error(ER_OUTOFMEMORY,MYF(0));
- }
+ return; // thd->fatal is set
expr= args;
expr+= arg_count+arg_count_order;
- if (arg_count_order)
- {
- order= (ORDER**)(expr + arg_count_field);
- }
- /*
- fill args items of show and sort
- */
+
+ /* fill args items of show and sort */
int i= 0;
List_iterator_fast<Item> li(*is_select);
Item *item_select;
- while ((item_select= li++))
- {
+ for ( ; (item_select= li++) ; i++)
args[i]= expr[i]= item_select;
- i++;
- }
-
- if (order)
+
+ if (arg_count_order)
{
- uint j= 0;
- for (ORDER *order_item= (ORDER*)is_order->first;
+ i= 0;
+ order= (ORDER**)(expr + arg_count_field);
+ for (ORDER *order_item= (ORDER*) is_order->first;
order_item != NULL;
order_item= order_item->next)
{
- order[j++]= order_item;
+ order[i++]= order_item;
}
}
}
@@ -1562,8 +1554,7 @@ Item_func_group_concat::~Item_func_group_concat()
}
if (table)
free_tmp_table(thd, table);
- if (tmp_table_param)
- delete tmp_table_param;
+ delete tmp_table_param;
if (tree_mode)
delete_tree(tree);
}
@@ -1594,14 +1585,17 @@ bool Item_func_group_concat::add()
copy_funcs(tmp_table_param->items_to_copy);
bool record_is_null= TRUE;
- for (int i= 0; i < arg_show_fields; i++)
+ for (uint i= 0; i < arg_show_fields; i++)
{
Item *show_item= expr[i];
if (!show_item->const_item())
{
Field *f= show_item->tmp_table_field();
if (!f->is_null())
+ {
record_is_null= FALSE;
+ break;
+ }
}
}
if (record_is_null)
diff --git a/sql/item_sum.h b/sql/item_sum.h
index 1b3e993fffc..37d7e7f79d0 100644
--- a/sql/item_sum.h
+++ b/sql/item_sum.h
@@ -643,21 +643,20 @@ class Item_func_group_concat : public Item_sum
public:
String result;
String *separator;
- uint show_elements;
TREE tree_base;
TREE *tree;
TABLE *table;
- int arg_count_order;
- int arg_count_field;
- int arg_show_fields;
- int distinct;
Item **expr;
ORDER **order;
- bool tree_mode;
- int count_cut_values;
+ TABLE_LIST *tables_list;
ulong group_concat_max_len;
+ uint show_elements;
+ uint arg_count_order;
+ uint arg_count_field;
+ uint arg_show_fields;
+ uint count_cut_values;
+ bool tree_mode, distinct;
bool warning_for_row;
- TABLE_LIST *tables_list;
bool always_null;
/*
Following is 0 normal object and pointer to original one for copy
@@ -665,7 +664,7 @@ class Item_func_group_concat : public Item_sum
*/
Item_func_group_concat *original;
- Item_func_group_concat(int is_distinct,List<Item> *is_select,
+ Item_func_group_concat(bool is_distinct,List<Item> *is_select,
SQL_LIST *is_order,String *is_separator);
Item_func_group_concat(THD *thd, Item_func_group_concat &item)
@@ -675,20 +674,20 @@ class Item_func_group_concat : public Item_sum
warning(item.warning),
warning_available(item.warning_available),
separator(item.separator),
- show_elements(item.show_elements),
tree(item.tree),
table(item.table),
+ expr(item.expr),
+ order(item.order),
+ tables_list(item.tables_list),
+ group_concat_max_len(item.group_concat_max_len),
+ show_elements(item.show_elements),
arg_count_order(item.arg_count_order),
arg_count_field(item.arg_count_field),
arg_show_fields(item.arg_show_fields),
- distinct(item.distinct),
- expr(item.expr),
- order(item.order),
- tree_mode(0),
count_cut_values(item.count_cut_values),
- group_concat_max_len(item.group_concat_max_len),
+ tree_mode(0),
+ distinct(item.distinct),
warning_for_row(item.warning_for_row),
- tables_list(item.tables_list),
original(&item)
{
quick_group = 0;
diff --git a/sql/log.cc b/sql/log.cc
index 50471041ee1..c9e20bc0cc9 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -767,6 +767,7 @@ int MYSQL_LOG::purge_logs(const char *to_log,
!log_in_use(log_info.log_file_name))
{
ulong tmp;
+ LINT_INIT(tmp);
if (decrease_log_space) //stat the file we want to delete
{
MY_STAT s;
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index d17faa3cea5..4ecccbf4511 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -30,7 +30,7 @@
#undef write /* remove pthread.h macro definition for EMX */
#endif
-typedef ulong table_map; /* Used for table bits in join */
+typedef ulonglong table_map; /* Used for table bits in join */
typedef ulong key_map; /* Used for finding keys */
typedef ulong key_part_map; /* Used for finding key parts */
@@ -846,6 +846,7 @@ void end_read_record(READ_RECORD *info);
ha_rows filesort(THD *thd, TABLE *form,struct st_sort_field *sortorder,
uint s_length, SQL_SELECT *select,
ha_rows max_rows, ha_rows *examined_rows);
+void filesort_free_buffers(TABLE *table);
void change_double_for_sort(double nr,byte *to);
int get_quick_record(SQL_SELECT *select);
int calc_weekday(long daynr,bool sunday_first_day_of_week);
diff --git a/sql/records.cc b/sql/records.cc
index e6c6e62a516..9d8627bc1fc 100644
--- a/sql/records.cc
+++ b/sql/records.cc
@@ -134,19 +134,7 @@ void end_read_record(READ_RECORD *info)
}
if (info->table)
{
- TABLE *table= info->table;
- if (table->sort.record_pointers)
- {
- my_free((gptr) table->sort.record_pointers,MYF(0));
- table->sort.record_pointers=0;
- }
- if (table->sort.addon_buf)
- {
- my_free((char *) table->sort.addon_buf, MYF(0));
- my_free((char *) table->sort.addon_field, MYF(MY_ALLOW_ZERO_PTR));
- table->sort.addon_buf=0;
- table->sort.addon_field=0;
- }
+ filesort_free_buffers(info->table);
(void) info->file->extra(HA_EXTRA_NO_CACHE);
(void) info->file->rnd_end();
info->table=0;
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 18768099f0f..176b619b0e1 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -868,12 +868,14 @@ JOIN::reinit()
exec_tmp_table1->file->extra(HA_EXTRA_RESET_STATE);
exec_tmp_table1->file->delete_all_rows();
free_io_cache(exec_tmp_table1);
+ filesort_free_buffers(exec_tmp_table1);
}
if (exec_tmp_table2)
{
exec_tmp_table2->file->extra(HA_EXTRA_RESET_STATE);
exec_tmp_table2->file->delete_all_rows();
free_io_cache(exec_tmp_table2);
+ filesort_free_buffers(exec_tmp_table2);
}
if (items0)
memcpy(ref_pointer_array, items0, ref_pointer_array_size);
@@ -2319,7 +2321,8 @@ find_best(JOIN *join,table_map rest_tables,uint idx,double record_count,
we don't make rec less than 100.
*/
if (keyuse->used_tables &
- (map=(keyuse->used_tables & ~join->const_table_map)))
+ (map=(keyuse->used_tables & ~join->const_table_map &
+ ~OUTER_REF_TABLE_BIT)))
{
uint tablenr;
for (tablenr=0 ; ! (map & 1) ; map>>=1, tablenr++) ;
@@ -2631,7 +2634,7 @@ static double
prev_record_reads(JOIN *join,table_map found_ref)
{
double found=1.0;
-
+ found_ref&= ~OUTER_REF_TABLE_BIT;
for (POSITION *pos=join->positions ; found_ref ; pos++)
{
if (pos->table->table->map & found_ref)
@@ -2665,7 +2668,7 @@ get_best_combination(JOIN *join)
join->full_join=0;
- used_tables=0;
+ used_tables= OUTER_REF_TABLE_BIT; // Outer row is already read
for (j=join_tab, tablenr=0 ; tablenr < table_count ; tablenr++,j++)
{
TABLE *form;
@@ -2936,7 +2939,8 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond)
DBUG_RETURN(1); // Impossible const condition
}
}
- used_tables=(select->const_tables=join->const_table_map) | RAND_TABLE_BIT;
+ used_tables=((select->const_tables=join->const_table_map) |
+ OUTER_REF_TABLE_BIT | RAND_TABLE_BIT);
for (uint i=join->const_tables ; i < join->tables ; i++)
{
JOIN_TAB *tab=join->join_tab+i;
@@ -2946,7 +2950,7 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond)
It solve problem with select like SELECT * FROM t1 WHERE rand() > 0.5
*/
if (i == join->tables-1)
- current_map|= RAND_TABLE_BIT;
+ current_map|= OUTER_REF_TABLE_BIT | RAND_TABLE_BIT;
bool use_quick_range=0;
used_tables|=current_map;
@@ -3265,7 +3269,10 @@ join_free(JOIN *join, bool full)
first non const table in join->table
*/
if (join->tables > join->const_tables) // Test for not-const tables
+ {
free_io_cache(join->table[join->const_tables]);
+ filesort_free_buffers(join->table[join->const_tables]);
+ }
if (join->select_lex->dependent && !full)
{
for (tab=join->join_tab,end=tab+join->tables ; tab != end ; tab++)
@@ -3450,7 +3457,8 @@ static void update_depend_map(JOIN *join, ORDER *order)
table_map depend_map;
order->item[0]->update_used_tables();
order->depend_map=depend_map=order->item[0]->used_tables();
- if (!(order->depend_map & RAND_TABLE_BIT)) // Not item_sum() or RAND()
+ // Not item_sum(), RAND() and no reference to table outside of sub select
+ if (!(order->depend_map & (OUTER_REF_TABLE_BIT | RAND_TABLE_BIT)))
{
for (JOIN_TAB **tab=join->map2table;
depend_map ;
@@ -3497,7 +3505,7 @@ remove_const(JOIN *join,ORDER *first_order, COND *cond, bool *simple_order)
}
else
{
- if (order_tables & RAND_TABLE_BIT)
+ if (order_tables & (RAND_TABLE_BIT | OUTER_REF_TABLE_BIT))
*simple_order=0;
else
{
@@ -7428,7 +7436,7 @@ get_sort_by_table(ORDER *a,ORDER *b,TABLE_LIST *tables)
DBUG_RETURN(0);
map|=a->item[0]->used_tables();
}
- if (!map || (map & RAND_TABLE_BIT))
+ if (!map || (map & (RAND_TABLE_BIT | OUTER_REF_TABLE_BIT)))
DBUG_RETURN(0);
for (; !(map & tables->table->map) ; tables=tables->next) ;
diff --git a/sql/unireg.h b/sql/unireg.h
index 9430329e67a..e647606875f 100644
--- a/sql/unireg.h
+++ b/sql/unireg.h
@@ -57,7 +57,8 @@
#endif
#define MAX_FIELD_WIDTH 256 /* Max column width +1 */
-#define MAX_TABLES (sizeof(table_map)*8-1) /* Max tables in join */
+#define MAX_TABLES (sizeof(table_map)*8-2) /* Max tables in join */
+#define OUTER_REF_TABLE_BIT (((table_map) 1) << (sizeof(table_map)*8-2))
#define RAND_TABLE_BIT (((table_map) 1) << (sizeof(table_map)*8-1))
#define MAX_FIELDS 4096 /* Limit in the .frm file */