Commit 90fbd8b2 authored by Sergey Petrunya's avatar Sergey Petrunya

Merge 5.2->5.3

parents db6dbadb 64aa1fcb
...@@ -8356,8 +8356,12 @@ int main(int argc, char **argv) ...@@ -8356,8 +8356,12 @@ int main(int argc, char **argv)
command->abort_on_error= (command->expected_errors.count == 0 && command->abort_on_error= (command->expected_errors.count == 0 &&
abort_on_error); abort_on_error);
/* delimiter needs to be executed so we can continue to parse */ /*
ok_to_do= cur_block->ok || command->type == Q_DELIMITER; some commmands need to be executed or at least parsed unconditionally,
because they change the grammar.
*/
ok_to_do= cur_block->ok || command->type == Q_DELIMITER
|| command->type == Q_PERL;
/* /*
Some commands need to be "done" the first time if they may get Some commands need to be "done" the first time if they may get
re-iterated over in a true context. This can only happen if there's re-iterated over in a true context. This can only happen if there's
...@@ -8368,8 +8372,7 @@ int main(int argc, char **argv) ...@@ -8368,8 +8372,7 @@ int main(int argc, char **argv)
if (command->type == Q_SOURCE || if (command->type == Q_SOURCE ||
command->type == Q_ERROR || command->type == Q_ERROR ||
command->type == Q_WRITE_FILE || command->type == Q_WRITE_FILE ||
command->type == Q_APPEND_FILE || command->type == Q_APPEND_FILE)
command->type == Q_PERL)
{ {
for (struct st_block *stb= cur_block-1; stb >= block_stack; stb--) for (struct st_block *stb= cur_block-1; stb >= block_stack; stb--)
{ {
......
...@@ -150,9 +150,10 @@ typedef struct st_key_cache ...@@ -150,9 +150,10 @@ typedef struct st_key_cache
ulong param_partitions; /* number of the key cache partitions */ ulong param_partitions; /* number of the key cache partitions */
my_bool key_cache_inited; /* <=> key cache has been created */ my_bool key_cache_inited; /* <=> key cache has been created */
my_bool can_be_used; /* usage of cache for read/write is allowed */ my_bool can_be_used; /* usage of cache for read/write is allowed */
my_bool in_init; /* Set to 1 in MySQL during init/resize */ my_bool in_init; /* set to 1 in MySQL during init/resize */
uint partitions; /* actual number of partitions */ uint partitions; /* actual number of partitions */
size_t key_cache_mem_size; /* specified size of the cache memory */ size_t key_cache_mem_size; /* specified size of the cache memory */
pthread_mutex_t op_lock; /* to serialize operations like 'resize' */
} KEY_CACHE; } KEY_CACHE;
......
...@@ -150,8 +150,8 @@ Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` A ...@@ -150,8 +150,8 @@ Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` A
drop table t1; drop table t1;
set names utf8; set names utf8;
create table t1 (a char(10) character set utf8 not null); create table t1 (a char(10) character set utf8 not null);
insert into t1 values ('bbbb'),(_koi8r'ÃÃÃÃ'),(_latin1'ÄÄÄÄ'); insert into t1 values ('bbbb'),(_koi8r'ÃÃÃÃ'),(_latin1'ÄÄÄÄ');
select a from t1 where a in ('bbbb',_koi8r'ÃÃÃÃ',_latin1'ÄÄÄÄ') order by a; select a from t1 where a in ('bbbb',_koi8r'ÃÃÃÃ',_latin1'ÄÄÄÄ') order by a;
a a
ÄÄÄÄ ÄÄÄÄ
bbbb bbbb
...@@ -787,6 +787,15 @@ DROP TABLE t1; ...@@ -787,6 +787,15 @@ DROP TABLE t1;
# End of test BUG#13012483 # End of test BUG#13012483
# #
End of 5.1 tests End of 5.1 tests
#
# LP bug#992380 Crash when creating PS for a query with
# subquery in WHERE (see also mysql bug#13012483)
#
CREATE TABLE t1 (a INT);
PREPARE s FROM "SELECT 1 FROM t1 WHERE 1 < ALL (SELECT @:= (1 IN (SELECT 1 FROM t1)) FROM t1)";
EXECUTE s;
1
DROP TABLE t1;
create table t1 (a bigint, b int); create table t1 (a bigint, b int);
insert t1 values (1,1),(2,2),(3,3); insert t1 values (1,1),(2,2),(3,3);
select * from t1 where a in ('2.1'); select * from t1 where a in ('2.1');
......
...@@ -279,3 +279,44 @@ NULL ...@@ -279,3 +279,44 @@ NULL
SELECT GREATEST(1.5E+2,1.3E+2,NULL) FROM DUAL; SELECT GREATEST(1.5E+2,1.3E+2,NULL) FROM DUAL;
GREATEST(1.5E+2,1.3E+2,NULL) GREATEST(1.5E+2,1.3E+2,NULL)
NULL NULL
create table t1 (a int);
insert into t1 values (1), (100), (0), (NULL);
select not a from t1;
not a
0
0
1
NULL
explain extended select not a from t1;
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 4 100.00
Warnings:
Note 1003 select (`test`.`t1`.`a` = 0) AS `not a` from `test`.`t1`
select * from t1 where not a;
a
0
explain extended select * from t1 where not a;
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 4 100.00 Using where
Warnings:
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where (`test`.`t1`.`a` = 0)
select not (a+0) from t1;
not (a+0)
0
0
1
NULL
explain extended select not (a+0) from t1;
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 4 100.00
Warnings:
Note 1003 select (not((`test`.`t1`.`a` + 0))) AS `not (a+0)` from `test`.`t1`
select * from t1 where not (a+0);
a
0
explain extended select * from t1 where not (a+0);
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 4 100.00 Using where
Warnings:
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where (not((`test`.`t1`.`a` + 0)))
drop table t1;
...@@ -321,7 +321,7 @@ select * from t1 where not(NULL or a); ...@@ -321,7 +321,7 @@ select * from t1 where not(NULL or a);
a a
explain select * from t1 where not(NULL and a); explain select * from t1 where not(NULL and a);
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index NULL a 5 NULL 21 Using where; Using index 1 SIMPLE t1 ref a a 5 const 1 Using where; Using index
select * from t1 where not(NULL and a); select * from t1 where not(NULL and a);
a a
0 0
...@@ -502,5 +502,5 @@ explain extended select a, not(not(a)), not(a <= 2 and not(a)), not(a not like " ...@@ -502,5 +502,5 @@ explain extended select a, not(not(a)), not(a <= 2 and not(a)), not(a not like "
id select_type table type possible_keys key key_len ref rows filtered Extra id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t1 range a a 5 NULL 4 100.00 Using where; Using index 1 SIMPLE t1 range a a 5 NULL 4 100.00 Using where; Using index
Warnings: Warnings:
Note 1003 select `test`.`t1`.`a` AS `a`,(`test`.`t1`.`a` <> 0) AS `not(not(a))`,((`test`.`t1`.`a` > 2) or `test`.`t1`.`a`) AS `not(a <= 2 and not(a))`,(`test`.`t1`.`a` like '1') AS `not(a not like "1")`,(`test`.`t1`.`a` in (1,2)) AS `not (a not in (1,2))`,(`test`.`t1`.`a` = 2) AS `not(a != 2)` from `test`.`t1` where (`test`.`t1`.`a` <> 0) having (`test`.`t1`.`a` <> 0) Note 1003 select `test`.`t1`.`a` AS `a`,(`test`.`t1`.`a` <> 0) AS `not(not(a))`,((`test`.`t1`.`a` > 2) or (`test`.`t1`.`a` <> 0)) AS `not(a <= 2 and not(a))`,(`test`.`t1`.`a` like '1') AS `not(a not like "1")`,(`test`.`t1`.`a` in (1,2)) AS `not (a not in (1,2))`,(`test`.`t1`.`a` = 2) AS `not(a != 2)` from `test`.`t1` where (`test`.`t1`.`a` <> 0) having (`test`.`t1`.`a` <> 0)
drop table t1; drop table t1;
...@@ -254,15 +254,15 @@ deallocate prepare StMt1; ...@@ -254,15 +254,15 @@ deallocate prepare StMt1;
deallocate prepare Stmt1; deallocate prepare Stmt1;
ERROR HY000: Unknown prepared statement handler (Stmt1) given to DEALLOCATE PREPARE ERROR HY000: Unknown prepared statement handler (Stmt1) given to DEALLOCATE PREPARE
set names utf8; set names utf8;
prepare `ü` from 'select 1234'; prepare `ü` from 'select 1234';
execute `ü` ; execute `ü` ;
1234 1234
1234 1234
set names latin1; set names latin1;
execute ``; execute `ü`;
1234 1234
1234 1234
deallocate prepare ``; deallocate prepare `ü`;
set names default; set names default;
create table t1 (a varchar(10)) charset=utf8; create table t1 (a varchar(10)) charset=utf8;
insert into t1 (a) values ('yahoo'); insert into t1 (a) values ('yahoo');
...@@ -3049,6 +3049,62 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -3049,6 +3049,62 @@ id select_type table type possible_keys key key_len ref rows Extra
DEALLOCATE PREPARE stmt; DEALLOCATE PREPARE stmt;
DROP TABLE t1; DROP TABLE t1;
End of 5.1 tests. End of 5.1 tests.
#
# LP bug#1001500 Crash on the second execution of the PS for
# a query with degenerated conjunctive condition
# (see also mysql bug#12582849)
#
CREATE TABLE t1 (
pk INTEGER AUTO_INCREMENT,
col_int_nokey INTEGER,
col_int_key INTEGER,
col_varchar_key VARCHAR(1),
col_varchar_nokey VARCHAR(1),
PRIMARY KEY (pk),
KEY (col_int_key),
KEY (col_varchar_key, col_int_key)
);
INSERT INTO t1 (
col_int_key, col_int_nokey,
col_varchar_key, col_varchar_nokey
) VALUES
(4, 2, 'v', 'v'),
(62, 150, 'v', 'v');
CREATE TABLE t2 (
pk INTEGER AUTO_INCREMENT,
col_int_nokey INTEGER,
col_int_key INTEGER,
col_varchar_key VARCHAR(1),
col_varchar_nokey VARCHAR(1),
PRIMARY KEY (pk),
KEY (col_int_key),
KEY (col_varchar_key, col_int_key)
);
INSERT INTO t2 (
col_int_key, col_int_nokey,
col_varchar_key, col_varchar_nokey
) VALUES
(8, NULL, 'x', 'x'),
(7, 8, 'd', 'd');
PREPARE stmt FROM '
SELECT
( SELECT MAX( SQ1_alias2 .col_int_nokey ) AS SQ1_field1
FROM ( t2 AS SQ1_alias1 RIGHT JOIN t1 AS SQ1_alias2
ON ( SQ1_alias2.col_varchar_key = SQ1_alias1.col_varchar_nokey )
)
WHERE SQ1_alias2.pk < alias1.col_int_nokey OR alias1.pk
) AS field1
FROM ( t1 AS alias1 JOIN t2 AS alias2 ON alias2.pk )
GROUP BY field1
';
EXECUTE stmt;
field1
150
EXECUTE stmt;
field1
150
DEALLOCATE PREPARE stmt;
DROP TABLE t1, t2;
prepare stmt from "select date('2010-10-10') between '2010-09-09' and ?"; prepare stmt from "select date('2010-10-10') between '2010-09-09' and ?";
set @a='2010-11-11'; set @a='2010-11-11';
execute stmt using @a; execute stmt using @a;
...@@ -3229,3 +3285,4 @@ c1 c2 count(c3) ...@@ -3229,3 +3285,4 @@ c1 c2 count(c3)
2012-03-01 01:00:00 3 1 2012-03-01 01:00:00 3 1
2012-03-01 02:00:00 3 1 2012-03-01 02:00:00 3 1
DEALLOCATE PREPARE s1; DEALLOCATE PREPARE s1;
# End of 5.3 tests
...@@ -456,4 +456,11 @@ SELECT (@v:=a) <> (@v:=1) FROM t1; ...@@ -456,4 +456,11 @@ SELECT (@v:=a) <> (@v:=1) FROM t1;
(@v:=a) <> (@v:=1) (@v:=a) <> (@v:=1)
1 1
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1(a int);
INSERT INTO t1 VALUES (1), (2);
SELECT DISTINCT @a:=MIN(t1.a) FROM t1, t1 AS t2
GROUP BY @b:=(SELECT COUNT(*) > t2.a);
@a:=MIN(t1.a)
1
DROP TABLE t1;
End of 5.1 tests End of 5.1 tests
...@@ -321,7 +321,7 @@ select * from t1 where not(NULL or a); ...@@ -321,7 +321,7 @@ select * from t1 where not(NULL or a);
a a
explain select * from t1 where not(NULL and a); explain select * from t1 where not(NULL and a);
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index NULL a 5 NULL 21 Using where; Using index 1 SIMPLE t1 ref a a 5 const 1 Using where; Using index
select * from t1 where not(NULL and a); select * from t1 where not(NULL and a);
a a
0 0
...@@ -390,5 +390,5 @@ explain extended select a, not(not(a)), not(a <= 2 and not(a)), not(a not like " ...@@ -390,5 +390,5 @@ explain extended select a, not(not(a)), not(a <= 2 and not(a)), not(a not like "
id select_type table type possible_keys key key_len ref rows filtered Extra id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t1 index a a 5 NULL 5 40.00 Using where; Using index 1 SIMPLE t1 index a a 5 NULL 5 40.00 Using where; Using index
Warnings: Warnings:
Note 1003 select `test`.`t1`.`a` AS `a`,(`test`.`t1`.`a` <> 0) AS `not(not(a))`,((`test`.`t1`.`a` > 2) or `test`.`t1`.`a`) AS `not(a <= 2 and not(a))`,(`test`.`t1`.`a` like '1') AS `not(a not like "1")`,(`test`.`t1`.`a` in (1,2)) AS `not (a not in (1,2))`,(`test`.`t1`.`a` = 2) AS `not(a != 2)` from `test`.`t1` where (`test`.`t1`.`a` <> 0) having (`test`.`t1`.`a` <> 0) Note 1003 select `test`.`t1`.`a` AS `a`,(`test`.`t1`.`a` <> 0) AS `not(not(a))`,((`test`.`t1`.`a` > 2) or (`test`.`t1`.`a` <> 0)) AS `not(a <= 2 and not(a))`,(`test`.`t1`.`a` like '1') AS `not(a not like "1")`,(`test`.`t1`.`a` in (1,2)) AS `not (a not in (1,2))`,(`test`.`t1`.`a` = 2) AS `not(a != 2)` from `test`.`t1` where (`test`.`t1`.`a` <> 0) having (`test`.`t1`.`a` <> 0)
drop table t1; drop table t1;
...@@ -577,6 +577,16 @@ DROP TABLE t1; ...@@ -577,6 +577,16 @@ DROP TABLE t1;
--echo # --echo #
--echo End of 5.1 tests --echo End of 5.1 tests
--echo #
--echo # LP bug#992380 Crash when creating PS for a query with
--echo # subquery in WHERE (see also mysql bug#13012483)
--echo #
CREATE TABLE t1 (a INT);
PREPARE s FROM "SELECT 1 FROM t1 WHERE 1 < ALL (SELECT @:= (1 IN (SELECT 1 FROM t1)) FROM t1)";
EXECUTE s;
DROP TABLE t1;
# #
# lp:817966 int_column IN (string_constant) # lp:817966 int_column IN (string_constant)
# #
...@@ -595,4 +605,4 @@ select * from t1 where a='2.1'; ...@@ -595,4 +605,4 @@ select * from t1 where a='2.1';
select * from t1 where b='2.1'; select * from t1 where b='2.1';
select * from t1 where IF(1,a,a)='2.1'; select * from t1 where IF(1,a,a)='2.1';
drop table t1; drop table t1;
--echo # End of 5.3 tests
...@@ -160,3 +160,23 @@ SELECT LEAST(1.1,1.2,NULL,1.0) FROM DUAL; ...@@ -160,3 +160,23 @@ SELECT LEAST(1.1,1.2,NULL,1.0) FROM DUAL;
SELECT GREATEST(1.5E+2,1.3E+2,NULL) FROM DUAL; SELECT GREATEST(1.5E+2,1.3E+2,NULL) FROM DUAL;
# End of 4.1 tests # End of 4.1 tests
#
# test of replacing NOT <field>
#
create table t1 (a int);
insert into t1 values (1), (100), (0), (NULL);
select not a from t1;
explain extended select not a from t1;
select * from t1 where not a;
explain extended select * from t1 where not a;
select not (a+0) from t1;
explain extended select not (a+0) from t1;
select * from t1 where not (a+0);
explain extended select * from t1 where not (a+0);
drop table t1;
#
# MDEV-256 lp:995501 - mysqltest attempts to parse Perl code inside a block
# with false condition, gets confused and throws wrong errors
#
let $run = 0;
if ($run)
{
--perl
foreach (1)
{
print "In perl\n";
}
EOF
SELECT 1;
}
--echo # Done
...@@ -276,11 +276,11 @@ deallocate prepare Stmt1; ...@@ -276,11 +276,11 @@ deallocate prepare Stmt1;
# also check that statement names are in right charset. # also check that statement names are in right charset.
set names utf8; set names utf8;
prepare `ü` from 'select 1234'; prepare `ü` from 'select 1234';
execute `ü` ; execute `ü` ;
set names latin1; set names latin1;
execute ``; execute `ü`;
deallocate prepare ``; deallocate prepare `ü`;
set names default; set names default;
...@@ -3117,6 +3117,71 @@ DROP TABLE t1; ...@@ -3117,6 +3117,71 @@ DROP TABLE t1;
--echo End of 5.1 tests. --echo End of 5.1 tests.
--echo #
--echo # LP bug#1001500 Crash on the second execution of the PS for
--echo # a query with degenerated conjunctive condition
--echo # (see also mysql bug#12582849)
--echo #
CREATE TABLE t1 (
pk INTEGER AUTO_INCREMENT,
col_int_nokey INTEGER,
col_int_key INTEGER,
col_varchar_key VARCHAR(1),
col_varchar_nokey VARCHAR(1),
PRIMARY KEY (pk),
KEY (col_int_key),
KEY (col_varchar_key, col_int_key)
);
INSERT INTO t1 (
col_int_key, col_int_nokey,
col_varchar_key, col_varchar_nokey
) VALUES
(4, 2, 'v', 'v'),
(62, 150, 'v', 'v');
CREATE TABLE t2 (
pk INTEGER AUTO_INCREMENT,
col_int_nokey INTEGER,
col_int_key INTEGER,
col_varchar_key VARCHAR(1),
col_varchar_nokey VARCHAR(1),
PRIMARY KEY (pk),
KEY (col_int_key),
KEY (col_varchar_key, col_int_key)
);
INSERT INTO t2 (
col_int_key, col_int_nokey,
col_varchar_key, col_varchar_nokey
) VALUES
(8, NULL, 'x', 'x'),
(7, 8, 'd', 'd');
PREPARE stmt FROM '
SELECT
( SELECT MAX( SQ1_alias2 .col_int_nokey ) AS SQ1_field1
FROM ( t2 AS SQ1_alias1 RIGHT JOIN t1 AS SQ1_alias2
ON ( SQ1_alias2.col_varchar_key = SQ1_alias1.col_varchar_nokey )
)
WHERE SQ1_alias2.pk < alias1.col_int_nokey OR alias1.pk
) AS field1
FROM ( t1 AS alias1 JOIN t2 AS alias2 ON alias2.pk )
GROUP BY field1
';
EXECUTE stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
DROP TABLE t1, t2;
# #
# restoring of the Item tree in BETWEEN with dates # restoring of the Item tree in BETWEEN with dates
# #
...@@ -3243,3 +3308,5 @@ GROUP BY c1, c2; ...@@ -3243,3 +3308,5 @@ GROUP BY c1, c2;
EXECUTE s1; EXECUTE s1;
DEALLOCATE PREPARE s1; DEALLOCATE PREPARE s1;
--echo # End of 5.3 tests
...@@ -365,4 +365,15 @@ SELECT (@v:=a) <> (@v:=1) FROM t1; ...@@ -365,4 +365,15 @@ SELECT (@v:=a) <> (@v:=1) FROM t1;
DROP TABLE t1; DROP TABLE t1;
#
# LP BUG#1001506 Crash on a query with GROUP BY and user variables
# MySQL Bug #11764372 57197: EVEN MORE USER VARIABLE CRASHING FUN
#
CREATE TABLE t1(a int);
INSERT INTO t1 VALUES (1), (2);
SELECT DISTINCT @a:=MIN(t1.a) FROM t1, t1 AS t2
GROUP BY @b:=(SELECT COUNT(*) > t2.a);
DROP TABLE t1;
--echo End of 5.1 tests --echo End of 5.1 tests
This diff is collapsed.
...@@ -1497,6 +1497,7 @@ bool Item_in_optimizer::fix_fields(THD *thd, Item **ref) ...@@ -1497,6 +1497,7 @@ bool Item_in_optimizer::fix_fields(THD *thd, Item **ref)
} }
if (args[1]->maybe_null) if (args[1]->maybe_null)
maybe_null=1; maybe_null=1;
with_subselect= 1;
with_sum_func= with_sum_func || args[1]->with_sum_func; with_sum_func= with_sum_func || args[1]->with_sum_func;
with_field= with_field || args[1]->with_field; with_field= with_field || args[1]->with_field;
used_tables_cache|= args[1]->used_tables(); used_tables_cache|= args[1]->used_tables();
...@@ -4175,6 +4176,22 @@ Item_cond::fix_fields(THD *thd, Item **ref) ...@@ -4175,6 +4176,22 @@ Item_cond::fix_fields(THD *thd, Item **ref)
if (abort_on_null) if (abort_on_null)
item->top_level_item(); item->top_level_item();
/*
replace degraded condition:
was: <field>
become: <field> = 1
*/
if (item->type() == FIELD_ITEM)
{
Query_arena backup, *arena;
Item *new_item;
arena= thd->activate_stmt_arena_if_needed(&backup);
if ((new_item= new Item_func_ne(item, new Item_int(0, 1))))
li.replace(item= new_item);
if (arena)
thd->restore_active_arena(arena, &backup);
}
// item can be substituted in fix_fields // item can be substituted in fix_fields
if ((!item->fixed && if ((!item->fixed &&
item->fix_fields(thd, li.ref())) || item->fix_fields(thd, li.ref())) ||
...@@ -4861,6 +4878,7 @@ Item_func_regex::fix_fields(THD *thd, Item **ref) ...@@ -4861,6 +4878,7 @@ Item_func_regex::fix_fields(THD *thd, Item **ref)
return TRUE; /* purecov: inspected */ return TRUE; /* purecov: inspected */
with_sum_func=args[0]->with_sum_func || args[1]->with_sum_func; with_sum_func=args[0]->with_sum_func || args[1]->with_sum_func;
with_field= args[0]->with_field || args[1]->with_field; with_field= args[0]->with_field || args[1]->with_field;
with_subselect|= args[0]->with_subselect | args[1]->with_subselect;
max_length= 1; max_length= 1;
decimals= 0; decimals= 0;
...@@ -5233,6 +5251,28 @@ Item *Item_func_not::neg_transformer(THD *thd) /* NOT(x) -> x */ ...@@ -5233,6 +5251,28 @@ Item *Item_func_not::neg_transformer(THD *thd) /* NOT(x) -> x */
} }
bool Item_func_not::fix_fields(THD *thd, Item **ref)
{
if (args[0]->type() == FIELD_ITEM)
{
/* replace "NOT <field>" with "<filed> == 0" */
Query_arena backup, *arena;
Item *new_item;
bool rc= TRUE;
arena= thd->activate_stmt_arena_if_needed(&backup);
if ((new_item= new Item_func_eq(args[0], new Item_int(0, 1))))
{
new_item->name= name;
rc= (*ref= new_item)->fix_fields(thd, ref);
}
if (arena)
thd->restore_active_arena(arena, &backup);
return rc;
}
return Item_func::fix_fields(thd, ref);
}
Item *Item_bool_rowready_func2::neg_transformer(THD *thd) Item *Item_bool_rowready_func2::neg_transformer(THD *thd)
{ {
Item *item= negated_item(); Item *item= negated_item();
...@@ -5641,6 +5681,7 @@ bool Item_equal::fix_fields(THD *thd, Item **ref) ...@@ -5641,6 +5681,7 @@ bool Item_equal::fix_fields(THD *thd, Item **ref)
used_tables_cache|= item->used_tables(); used_tables_cache|= item->used_tables();
tmp_table_map= item->not_null_tables(); tmp_table_map= item->not_null_tables();
not_null_tables_cache|= tmp_table_map; not_null_tables_cache|= tmp_table_map;
DBUG_ASSERT(!item->with_sum_func && !item->with_subselect);
if (item->maybe_null) if (item->maybe_null)
maybe_null= 1; maybe_null= 1;
if (!item->get_item_equal()) if (!item->get_item_equal())
......
...@@ -437,6 +437,7 @@ public: ...@@ -437,6 +437,7 @@ public:
enum Functype functype() const { return NOT_FUNC; } enum Functype functype() const { return NOT_FUNC; }
const char *func_name() const { return "not"; } const char *func_name() const { return "not"; }
Item *neg_transformer(THD *thd); Item *neg_transformer(THD *thd);
bool fix_fields(THD *, Item **);
virtual void print(String *str, enum_query_type query_type); virtual void print(String *str, enum_query_type query_type);
}; };
...@@ -503,6 +504,8 @@ public: ...@@ -503,6 +504,8 @@ public:
longlong val_int(); longlong val_int();
enum Functype functype() const { return NOT_ALL_FUNC; } enum Functype functype() const { return NOT_ALL_FUNC; }
const char *func_name() const { return "<not>"; } const char *func_name() const { return "<not>"; }
bool fix_fields(THD *thd, Item **ref)
{return Item_func::fix_fields(thd, ref);}
virtual void print(String *str, enum_query_type query_type); virtual void print(String *str, enum_query_type query_type);
void set_sum_test(Item_sum_hybrid *item) { test_sum_item= item; }; void set_sum_test(Item_sum_hybrid *item) { test_sum_item= item; };
void set_sub_test(Item_maxmin_subselect *item) { test_sub_item= item; }; void set_sub_test(Item_maxmin_subselect *item) { test_sub_item= item; };
......
...@@ -3027,6 +3027,7 @@ udf_handler::fix_fields(THD *thd, Item_result_field *func, ...@@ -3027,6 +3027,7 @@ udf_handler::fix_fields(THD *thd, Item_result_field *func,
func->maybe_null=1; func->maybe_null=1;
func->with_sum_func= func->with_sum_func || item->with_sum_func; func->with_sum_func= func->with_sum_func || item->with_sum_func;
func->with_field= func->with_field || item->with_field; func->with_field= func->with_field || item->with_field;
func->with_subselect|= item->with_subselect;
used_tables_cache|=item->used_tables(); used_tables_cache|=item->used_tables();
const_item_cache&=item->const_item(); const_item_cache&=item->const_item();
f_args.arg_type[i]=item->result_type(); f_args.arg_type[i]=item->result_type();
......
...@@ -89,6 +89,7 @@ bool Item_row::fix_fields(THD *thd, Item **ref) ...@@ -89,6 +89,7 @@ bool Item_row::fix_fields(THD *thd, Item **ref)
maybe_null|= item->maybe_null; maybe_null|= item->maybe_null;
with_sum_func= with_sum_func || item->with_sum_func; with_sum_func= with_sum_func || item->with_sum_func;
with_field= with_field || item->with_field; with_field= with_field || item->with_field;
with_subselect|= item->with_subselect;
} }
fixed= 1; fixed= 1;
return FALSE; return FALSE;
......
...@@ -588,6 +588,7 @@ Item_sum_num::fix_fields(THD *thd, Item **ref) ...@@ -588,6 +588,7 @@ Item_sum_num::fix_fields(THD *thd, Item **ref)
if (args[i]->fix_fields(thd, args + i) || args[i]->check_cols(1)) if (args[i]->fix_fields(thd, args + i) || args[i]->check_cols(1))
return TRUE; return TRUE;
set_if_bigger(decimals, args[i]->decimals); set_if_bigger(decimals, args[i]->decimals);
with_subselect|= args[i]->with_subselect;
} }
result_field=0; result_field=0;
max_length=float_length(decimals); max_length=float_length(decimals);
...@@ -618,6 +619,7 @@ Item_sum_hybrid::fix_fields(THD *thd, Item **ref) ...@@ -618,6 +619,7 @@ Item_sum_hybrid::fix_fields(THD *thd, Item **ref)
(item= args[0])->check_cols(1)) (item= args[0])->check_cols(1))
return TRUE; return TRUE;
decimals=item->decimals; decimals=item->decimals;
with_subselect= args[0]->with_subselect;
switch (hybrid_type= item->result_type()) { switch (hybrid_type= item->result_type()) {
case INT_RESULT: case INT_RESULT:
...@@ -3253,6 +3255,7 @@ Item_func_group_concat::fix_fields(THD *thd, Item **ref) ...@@ -3253,6 +3255,7 @@ Item_func_group_concat::fix_fields(THD *thd, Item **ref)
args[i]->fix_fields(thd, args + i)) || args[i]->fix_fields(thd, args + i)) ||
args[i]->check_cols(1)) args[i]->check_cols(1))
return TRUE; return TRUE;
with_subselect|= args[i]->with_subselect;
} }
if (agg_item_charsets(collation, func_name(), if (agg_item_charsets(collation, func_name(),
......
...@@ -3120,7 +3120,8 @@ public: ...@@ -3120,7 +3120,8 @@ public:
if (copy_field) /* Fix for Intel compiler */ if (copy_field) /* Fix for Intel compiler */
{ {
delete [] copy_field; delete [] copy_field;
save_copy_field= copy_field= 0; save_copy_field= copy_field= NULL;
save_copy_field_end= copy_field_end= NULL;
} }
} }
}; };
......
...@@ -20152,6 +20152,8 @@ copy_fields(TMP_TABLE_PARAM *param) ...@@ -20152,6 +20152,8 @@ copy_fields(TMP_TABLE_PARAM *param)
Copy_field *ptr=param->copy_field; Copy_field *ptr=param->copy_field;
Copy_field *end=param->copy_field_end; Copy_field *end=param->copy_field_end;
DBUG_ASSERT((ptr != NULL && end >= ptr) || (ptr == NULL && end == NULL));
for (; ptr != end; ptr++) for (; ptr != end; ptr++)
(*ptr->do_copy)(ptr); (*ptr->do_copy)(ptr);
......
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