mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 18:20:07 +01:00
Merge abelkin@bk-internal.mysql.com:/home/bk/mysql-4.1
into sanja.is.com.ua:/home/bell/mysql/bk/mysql-4.1
This commit is contained in:
commit
85f62aa67c
15 changed files with 196 additions and 11 deletions
|
@ -330,3 +330,12 @@ SELECT MIN(price) min, MAX(price) max, AVG(price) avg FROM (SELECT SUBSTRING( MA
|
||||||
min max avg
|
min max avg
|
||||||
10.00 10.00 10
|
10.00 10.00 10
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
create table t1 (a integer, b integer);
|
||||||
|
insert into t1 values (1,4), (2,2),(2,2), (4,1),(4,1),(4,1),(4,1);
|
||||||
|
select distinct sum(b) from t1 group by a;
|
||||||
|
sum(b)
|
||||||
|
4
|
||||||
|
select distinct sum(b) from (select a,b from t1) y group by a;
|
||||||
|
sum(b)
|
||||||
|
4
|
||||||
|
drop table t1;
|
||||||
|
|
|
@ -2160,3 +2160,51 @@ ERROR 42S22: Unknown column 'a2' in 'scalar IN/ALL/ANY subquery'
|
||||||
select * from t1 where a1 > any(select b1 from t2);
|
select * from t1 where a1 > any(select b1 from t2);
|
||||||
a1
|
a1
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
|
create table t1 (a integer, b integer);
|
||||||
|
select (select * from t1) = (select 1,2);
|
||||||
|
(select * from t1) = (select 1,2)
|
||||||
|
NULL
|
||||||
|
select (select 1,2) = (select * from t1);
|
||||||
|
(select 1,2) = (select * from t1)
|
||||||
|
NULL
|
||||||
|
select row(1,2) = ANY (select * from t1);
|
||||||
|
row(1,2) = ANY (select * from t1)
|
||||||
|
0
|
||||||
|
select row(1,2) != ALL (select * from t1);
|
||||||
|
row(1,2) != ALL (select * from t1)
|
||||||
|
1
|
||||||
|
drop table t1;
|
||||||
|
create table t1 (a integer, b integer);
|
||||||
|
select row(1,(2,2)) in (select * from t1 );
|
||||||
|
ERROR 21000: Operand should contain 2 column(s)
|
||||||
|
select row(1,(2,2)) = (select * from t1 );
|
||||||
|
ERROR 21000: Operand should contain 2 column(s)
|
||||||
|
select (select * from t1) = row(1,(2,2));
|
||||||
|
ERROR 21000: Operand should contain 1 column(s)
|
||||||
|
drop table t1;
|
||||||
|
create table t1 (a integer);
|
||||||
|
insert into t1 values (1);
|
||||||
|
select 1 = ALL (select 1 from t1 where 1 = xx ), 1 as xx ;
|
||||||
|
ERROR 42S22: Reference 'xx' not supported (forward reference in item list)
|
||||||
|
select 1 = ALL (select 1 from t1 where 1 = xx ), 1 as xx;
|
||||||
|
ERROR 42S22: Reference 'xx' not supported (forward reference in item list)
|
||||||
|
select 1 as xx, 1 = ALL ( select 1 from t1 where 1 = xx );
|
||||||
|
xx 1 = ALL ( select 1 from t1 where 1 = xx )
|
||||||
|
1 1
|
||||||
|
select 1 = ALL (select 1 from t1 where 1 = xx ), 1 as xx;
|
||||||
|
ERROR 42S22: Reference 'xx' not supported (forward reference in item list)
|
||||||
|
select 1 = ALL (select 1 from t1 where 1 = xx ), 1 as xx from DUAL;
|
||||||
|
ERROR 42S22: Reference 'xx' not supported (forward reference in item list)
|
||||||
|
drop table t1;
|
||||||
|
CREATE TABLE `t1` ( `a` char(3) NOT NULL default '', `b` char(3) NOT NULL default '', `c` char(3) NOT NULL default '', PRIMARY KEY (`a`,`b`,`c`)) ENGINE=InnoDB;
|
||||||
|
CREATE TABLE t2 LIKE t1;
|
||||||
|
INSERT INTO t1 VALUES (1,1,1);
|
||||||
|
INSERT INTO t2 VALUES (1,1,1);
|
||||||
|
PREPARE my_stmt FROM "SELECT t1.b, count(*) FROM t1 group by t1.b having
|
||||||
|
count(*) > ALL (SELECT COUNT(*) FROM t2 WHERE t2.a=1 GROUP By t2.b)";
|
||||||
|
EXECUTE my_stmt;
|
||||||
|
b count(*)
|
||||||
|
EXECUTE my_stmt;
|
||||||
|
b count(*)
|
||||||
|
deallocate prepare my_stmt;
|
||||||
|
drop table t1,t2;
|
||||||
|
|
|
@ -214,3 +214,13 @@ CREATE TABLE `t1` ( `itemid` int(11) NOT NULL default '0', `grpid` varchar(15) N
|
||||||
insert into t1 values (128, 'rozn', 2, now(), 10),(128, 'rozn', 1, now(), 10);
|
insert into t1 values (128, 'rozn', 2, now(), 10),(128, 'rozn', 1, now(), 10);
|
||||||
SELECT MIN(price) min, MAX(price) max, AVG(price) avg FROM (SELECT SUBSTRING( MAX(concat(date_,";",price)), 12) price FROM t1 WHERE itemid=128 AND grpid='rozn' GROUP BY itemid, grpid, vendor) lastprices;
|
SELECT MIN(price) min, MAX(price) max, AVG(price) avg FROM (SELECT SUBSTRING( MAX(concat(date_,";",price)), 12) price FROM t1 WHERE itemid=128 AND grpid='rozn' GROUP BY itemid, grpid, vendor) lastprices;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# DISTINCT over grouped select on subquery in the FROM clause
|
||||||
|
#
|
||||||
|
create table t1 (a integer, b integer);
|
||||||
|
insert into t1 values (1,4), (2,2),(2,2), (4,1),(4,1),(4,1),(4,1);
|
||||||
|
select distinct sum(b) from t1 group by a;
|
||||||
|
select distinct sum(b) from (select a,b from t1) y group by a;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
|
|
@ -1414,8 +1414,11 @@ SELECT f1 FROM t1
|
||||||
WHERE f1 <> ALL ( SELECT SUM(f1) AS sf1 FROM t2 HAVING sf1 > 10000);
|
WHERE f1 <> ALL ( SELECT SUM(f1) AS sf1 FROM t2 HAVING sf1 > 10000);
|
||||||
|
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
|
|
||||||
|
#
|
||||||
# Test for BUG#7885: Server crash when 'any' subselect compared to
|
# Test for BUG#7885: Server crash when 'any' subselect compared to
|
||||||
# non-existant field.
|
# non-existant field.
|
||||||
|
#
|
||||||
create table t1 (a1 int);
|
create table t1 (a1 int);
|
||||||
create table t2 (b1 int);
|
create table t2 (b1 int);
|
||||||
--error 1054
|
--error 1054
|
||||||
|
@ -1423,3 +1426,56 @@ select * from t1 where a2 > any(select b1 from t2);
|
||||||
select * from t1 where a1 > any(select b1 from t2);
|
select * from t1 where a1 > any(select b1 from t2);
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Comparison subquery with * and row
|
||||||
|
#
|
||||||
|
create table t1 (a integer, b integer);
|
||||||
|
select (select * from t1) = (select 1,2);
|
||||||
|
select (select 1,2) = (select * from t1);
|
||||||
|
# queries whih can be converted to IN
|
||||||
|
select row(1,2) = ANY (select * from t1);
|
||||||
|
select row(1,2) != ALL (select * from t1);
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Comparison subquery and row with nested rows
|
||||||
|
#
|
||||||
|
create table t1 (a integer, b integer);
|
||||||
|
-- error 1241
|
||||||
|
select row(1,(2,2)) in (select * from t1 );
|
||||||
|
-- error 1241
|
||||||
|
select row(1,(2,2)) = (select * from t1 );
|
||||||
|
-- error 1241
|
||||||
|
select (select * from t1) = row(1,(2,2));
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Forward reference detection
|
||||||
|
#
|
||||||
|
create table t1 (a integer);
|
||||||
|
insert into t1 values (1);
|
||||||
|
-- error 1247
|
||||||
|
select 1 = ALL (select 1 from t1 where 1 = xx ), 1 as xx ;
|
||||||
|
-- error 1247
|
||||||
|
select 1 = ALL (select 1 from t1 where 1 = xx ), 1 as xx;
|
||||||
|
select 1 as xx, 1 = ALL ( select 1 from t1 where 1 = xx );
|
||||||
|
-- error 1247
|
||||||
|
select 1 = ALL (select 1 from t1 where 1 = xx ), 1 as xx;
|
||||||
|
-- error 1247
|
||||||
|
select 1 = ALL (select 1 from t1 where 1 = xx ), 1 as xx from DUAL;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# cleaning up of results of subselects (BUG#8125)
|
||||||
|
#
|
||||||
|
CREATE TABLE `t1` ( `a` char(3) NOT NULL default '', `b` char(3) NOT NULL default '', `c` char(3) NOT NULL default '', PRIMARY KEY (`a`,`b`,`c`)) ENGINE=InnoDB;
|
||||||
|
CREATE TABLE t2 LIKE t1;
|
||||||
|
INSERT INTO t1 VALUES (1,1,1);
|
||||||
|
INSERT INTO t2 VALUES (1,1,1);
|
||||||
|
PREPARE my_stmt FROM "SELECT t1.b, count(*) FROM t1 group by t1.b having
|
||||||
|
count(*) > ALL (SELECT COUNT(*) FROM t2 WHERE t2.a=1 GROUP By t2.b)";
|
||||||
|
EXECUTE my_stmt;
|
||||||
|
EXECUTE my_stmt;
|
||||||
|
deallocate prepare my_stmt;
|
||||||
|
drop table t1,t2;
|
||||||
|
|
|
@ -1482,12 +1482,13 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
|
||||||
}
|
}
|
||||||
else if (refer != (Item **)not_found_item)
|
else if (refer != (Item **)not_found_item)
|
||||||
{
|
{
|
||||||
if (!(*refer)->fixed)
|
if (!last->ref_pointer_array[counter])
|
||||||
{
|
{
|
||||||
my_error(ER_ILLEGAL_REFERENCE, MYF(0), name,
|
my_error(ER_ILLEGAL_REFERENCE, MYF(0), name,
|
||||||
"forward reference in item list");
|
"forward reference in item list");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
DBUG_ASSERT((*refer)->fixed);
|
||||||
/*
|
/*
|
||||||
Here, a subset of actions performed by Item_ref::set_properties
|
Here, a subset of actions performed by Item_ref::set_properties
|
||||||
is not enough. So we pass ptr to NULL into Item_[direct]_ref
|
is not enough. So we pass ptr to NULL into Item_[direct]_ref
|
||||||
|
@ -2161,12 +2162,13 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference)
|
||||||
mark_as_dependent(thd, last, thd->lex->current_select, fld);
|
mark_as_dependent(thd, last, thd->lex->current_select, fld);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (!(*ref)->fixed)
|
if (!last->ref_pointer_array[counter])
|
||||||
{
|
{
|
||||||
my_error(ER_ILLEGAL_REFERENCE, MYF(0), name,
|
my_error(ER_ILLEGAL_REFERENCE, MYF(0), name,
|
||||||
"forward reference in item list");
|
"forward reference in item list");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
DBUG_ASSERT((*ref)->fixed);
|
||||||
mark_as_dependent(thd, last, thd->lex->current_select,
|
mark_as_dependent(thd, last, thd->lex->current_select,
|
||||||
this);
|
this);
|
||||||
if (place == IN_HAVING)
|
if (place == IN_HAVING)
|
||||||
|
|
|
@ -213,7 +213,7 @@ class Item_bool_rowready_func2 :public Item_bool_func2
|
||||||
public:
|
public:
|
||||||
Item_bool_rowready_func2(Item *a, Item *b) :Item_bool_func2(a, b)
|
Item_bool_rowready_func2(Item *a, Item *b) :Item_bool_func2(a, b)
|
||||||
{
|
{
|
||||||
allowed_arg_cols= a->cols();
|
allowed_arg_cols= 0; // Fetch this value from first argument
|
||||||
}
|
}
|
||||||
Item *neg_transformer(THD *thd);
|
Item *neg_transformer(THD *thd);
|
||||||
virtual Item *negated_item();
|
virtual Item *negated_item();
|
||||||
|
@ -390,7 +390,10 @@ class Item_func_interval :public Item_int_func
|
||||||
double *intervals;
|
double *intervals;
|
||||||
public:
|
public:
|
||||||
Item_func_interval(Item_row *a)
|
Item_func_interval(Item_row *a)
|
||||||
:Item_int_func(a),row(a),intervals(0) { allowed_arg_cols= a->cols(); }
|
:Item_int_func(a),row(a),intervals(0)
|
||||||
|
{
|
||||||
|
allowed_arg_cols= 0; // Fetch this value from first argument
|
||||||
|
}
|
||||||
longlong val_int();
|
longlong val_int();
|
||||||
void fix_length_and_dec();
|
void fix_length_and_dec();
|
||||||
const char *func_name() const { return "interval"; }
|
const char *func_name() const { return "interval"; }
|
||||||
|
@ -743,7 +746,7 @@ class Item_func_in :public Item_int_func
|
||||||
Item_func_in(List<Item> &list)
|
Item_func_in(List<Item> &list)
|
||||||
:Item_int_func(list), array(0), in_item(0), have_null(0)
|
:Item_int_func(list), array(0), in_item(0), have_null(0)
|
||||||
{
|
{
|
||||||
allowed_arg_cols= args[0]->cols();
|
allowed_arg_cols= 0; // Fetch this value from first argument
|
||||||
}
|
}
|
||||||
longlong val_int();
|
longlong val_int();
|
||||||
void fix_length_and_dec();
|
void fix_length_and_dec();
|
||||||
|
|
|
@ -303,10 +303,24 @@ Item_func::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
|
||||||
We can't yet set item to *arg as fix_fields may change *arg
|
We can't yet set item to *arg as fix_fields may change *arg
|
||||||
We shouldn't call fix_fields() twice, so check 'fixed' field first
|
We shouldn't call fix_fields() twice, so check 'fixed' field first
|
||||||
*/
|
*/
|
||||||
if ((!(*arg)->fixed && (*arg)->fix_fields(thd, tables, arg)) ||
|
if ((!(*arg)->fixed && (*arg)->fix_fields(thd, tables, arg)))
|
||||||
(*arg)->check_cols(allowed_arg_cols))
|
|
||||||
return 1; /* purecov: inspected */
|
return 1; /* purecov: inspected */
|
||||||
|
|
||||||
item= *arg;
|
item= *arg;
|
||||||
|
|
||||||
|
if (allowed_arg_cols)
|
||||||
|
{
|
||||||
|
if (item->check_cols(allowed_arg_cols))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* we have to fetch allowed_arg_cols from first argument */
|
||||||
|
DBUG_ASSERT(arg == args); // it is first argument
|
||||||
|
allowed_arg_cols= item->cols();
|
||||||
|
DBUG_ASSERT(allowed_arg_cols); // Can't be 0 any more
|
||||||
|
}
|
||||||
|
|
||||||
if (item->maybe_null)
|
if (item->maybe_null)
|
||||||
maybe_null=1;
|
maybe_null=1;
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,10 @@ class Item_func :public Item_result_field
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
Item **args, *tmp_arg[2];
|
Item **args, *tmp_arg[2];
|
||||||
|
/*
|
||||||
|
Allowed numbers of columns in result (usually 1, which means scalar value)
|
||||||
|
0 means get this number from first argument
|
||||||
|
*/
|
||||||
uint allowed_arg_cols;
|
uint allowed_arg_cols;
|
||||||
public:
|
public:
|
||||||
uint arg_count;
|
uint arg_count;
|
||||||
|
|
|
@ -995,6 +995,10 @@ Item_in_subselect::row_value_transformer(JOIN *join)
|
||||||
List_iterator_fast<Item> li(select_lex->item_list);
|
List_iterator_fast<Item> li(select_lex->item_list);
|
||||||
for (uint i= 0; i < n; i++)
|
for (uint i= 0; i < n; i++)
|
||||||
{
|
{
|
||||||
|
DBUG_ASSERT(left_expr->fixed && select_lex->ref_pointer_array[i]->fixed);
|
||||||
|
if (select_lex->ref_pointer_array[i]->
|
||||||
|
check_cols(left_expr->el(i)->cols()))
|
||||||
|
goto err;
|
||||||
Item *func= new Item_ref_null_helper(this,
|
Item *func= new Item_ref_null_helper(this,
|
||||||
select_lex->ref_pointer_array+i,
|
select_lex->ref_pointer_array+i,
|
||||||
(char *) "<no matter>",
|
(char *) "<no matter>",
|
||||||
|
@ -1123,6 +1127,7 @@ void subselect_single_select_engine::cleanup()
|
||||||
DBUG_ENTER("subselect_single_select_engine::cleanup");
|
DBUG_ENTER("subselect_single_select_engine::cleanup");
|
||||||
prepared= optimized= executed= 0;
|
prepared= optimized= executed= 0;
|
||||||
join= 0;
|
join= 0;
|
||||||
|
result->cleanup();
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1131,6 +1136,7 @@ void subselect_union_engine::cleanup()
|
||||||
{
|
{
|
||||||
DBUG_ENTER("subselect_union_engine::cleanup");
|
DBUG_ENTER("subselect_union_engine::cleanup");
|
||||||
unit->reinit_exec_mechanism();
|
unit->reinit_exec_mechanism();
|
||||||
|
result->cleanup();
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1138,6 +1144,10 @@ void subselect_union_engine::cleanup()
|
||||||
void subselect_uniquesubquery_engine::cleanup()
|
void subselect_uniquesubquery_engine::cleanup()
|
||||||
{
|
{
|
||||||
DBUG_ENTER("subselect_uniquesubquery_engine::cleanup");
|
DBUG_ENTER("subselect_uniquesubquery_engine::cleanup");
|
||||||
|
/*
|
||||||
|
subselect_uniquesubquery_engine have not 'result' assigbed, so we do not
|
||||||
|
cleanup() it
|
||||||
|
*/
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1421,13 +1431,15 @@ int subselect_indexsubquery_engine::exec()
|
||||||
|
|
||||||
uint subselect_single_select_engine::cols()
|
uint subselect_single_select_engine::cols()
|
||||||
{
|
{
|
||||||
return select_lex->item_list.elements;
|
DBUG_ASSERT(select_lex->join); // should be called after fix_fields()
|
||||||
|
return select_lex->join->fields_list.elements;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint subselect_union_engine::cols()
|
uint subselect_union_engine::cols()
|
||||||
{
|
{
|
||||||
return unit->first_select()->item_list.elements;
|
DBUG_ASSERT(unit->is_prepared()); // should be called after fix_fields()
|
||||||
|
return unit->types.elements;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2405,6 +2405,20 @@ int setup_fields(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables,
|
||||||
thd->allow_sum_func= allow_sum_func;
|
thd->allow_sum_func= allow_sum_func;
|
||||||
thd->where="field list";
|
thd->where="field list";
|
||||||
|
|
||||||
|
/*
|
||||||
|
To prevent fail on forward lookup we fill it with zerows,
|
||||||
|
then if we got pointer on zero after find_item_in_list we will know
|
||||||
|
that it is forward lookup.
|
||||||
|
|
||||||
|
There is other way to solve problem: fill array with pointers to list,
|
||||||
|
but it will be slower.
|
||||||
|
|
||||||
|
TODO: remove it when (if) we made one list for allfields and
|
||||||
|
ref_pointer_array
|
||||||
|
*/
|
||||||
|
if (ref_pointer_array)
|
||||||
|
bzero(ref_pointer_array, sizeof(Item *) * fields.elements);
|
||||||
|
|
||||||
Item **ref= ref_pointer_array;
|
Item **ref= ref_pointer_array;
|
||||||
while ((item= it++))
|
while ((item= it++))
|
||||||
{
|
{
|
||||||
|
|
|
@ -1240,6 +1240,14 @@ bool select_singlerow_subselect::send_data(List<Item> &items)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void select_max_min_finder_subselect::cleanup()
|
||||||
|
{
|
||||||
|
DBUG_ENTER("select_max_min_finder_subselect::cleanup");
|
||||||
|
cache= 0;
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool select_max_min_finder_subselect::send_data(List<Item> &items)
|
bool select_max_min_finder_subselect::send_data(List<Item> &items)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("select_max_min_finder_subselect::send_data");
|
DBUG_ENTER("select_max_min_finder_subselect::send_data");
|
||||||
|
|
|
@ -1381,6 +1381,7 @@ public:
|
||||||
select_max_min_finder_subselect(Item_subselect *item, bool mx)
|
select_max_min_finder_subselect(Item_subselect *item, bool mx)
|
||||||
:select_subselect(item), cache(0), fmax(mx)
|
:select_subselect(item), cache(0), fmax(mx)
|
||||||
{}
|
{}
|
||||||
|
void cleanup();
|
||||||
bool send_data(List<Item> &items);
|
bool send_data(List<Item> &items);
|
||||||
bool cmp_real();
|
bool cmp_real();
|
||||||
bool cmp_int();
|
bool cmp_int();
|
||||||
|
|
|
@ -164,7 +164,10 @@ void lex_start(THD *thd, uchar *buf,uint length)
|
||||||
|
|
||||||
void lex_end(LEX *lex)
|
void lex_end(LEX *lex)
|
||||||
{
|
{
|
||||||
lex->select_lex.expr_list.delete_elements(); // If error when parsing sql-varargs
|
for (SELECT_LEX *sl= lex->all_selects_list;
|
||||||
|
sl;
|
||||||
|
sl= sl->next_select_in_list())
|
||||||
|
sl->expr_list.delete_elements(); // If error when parsing sql-varargs
|
||||||
x_free(lex->yacc_yyss);
|
x_free(lex->yacc_yyss);
|
||||||
x_free(lex->yacc_yyvs);
|
x_free(lex->yacc_yyvs);
|
||||||
}
|
}
|
||||||
|
|
|
@ -371,6 +371,7 @@ public:
|
||||||
|
|
||||||
ulong init_prepare_fake_select_lex(THD *thd);
|
ulong init_prepare_fake_select_lex(THD *thd);
|
||||||
int change_result(select_subselect *result, select_subselect *old_result);
|
int change_result(select_subselect *result, select_subselect *old_result);
|
||||||
|
inline bool is_prepared() { return prepared; }
|
||||||
|
|
||||||
friend void lex_start(THD *thd, uchar *buf, uint length);
|
friend void lex_start(THD *thd, uchar *buf, uint length);
|
||||||
friend int subselect_union_engine::exec();
|
friend int subselect_union_engine::exec();
|
||||||
|
|
|
@ -1320,7 +1320,7 @@ JOIN::exec()
|
||||||
curr_join->select_distinct=0; /* Each row is unique */
|
curr_join->select_distinct=0; /* Each row is unique */
|
||||||
|
|
||||||
curr_join->join_free(0); /* Free quick selects */
|
curr_join->join_free(0); /* Free quick selects */
|
||||||
if (select_distinct && ! group_list)
|
if (curr_join->select_distinct && ! curr_join->group_list)
|
||||||
{
|
{
|
||||||
thd->proc_info="Removing duplicates";
|
thd->proc_info="Removing duplicates";
|
||||||
if (curr_join->tmp_having)
|
if (curr_join->tmp_having)
|
||||||
|
|
Loading…
Add table
Reference in a new issue