mirror of
https://github.com/MariaDB/server.git
synced 2025-01-21 14:32:34 +01:00
987e146604
Constant expressions in WHERE/HAVING/ON clauses aren't cached and evaluated for each row. This causes slowdown of query execution especially if constant UDF/SP function are used. Now WHERE/HAVING/ON expressions are analyzed in the top-bottom direction with help of the compile function. When analyzer meets a constant item it sets a flag for the tree transformer to cache the item and doesn't allow tree walker to go deeper. Thus, the topmost item of a constant expression if cached. This is done after all other optimizations were applied to WHERE/HAVING/ON expressions A helper function called cache_const_exprs is added to the JOIN class. It calls compile method with caching analyzer and transformer on WHERE, HAVING, ON expressions if they're present. The cache_const_expr_analyzer and cache_const_expr_transformer functions are added to the Item class. The first one check if the item can be cached and the second caches it if so. A new Item_cache_datetime class is derived from the Item_cache class. It caches both int and string values of the underlying item independently to avoid DATETIME aware int-to-string conversion. Thus it completely relies on the ability of the underlying item to correctly convert DATETIME value from int to string and vice versa. mysql-test/r/func_like.result: A test case result is corrected after fixing bug#33546. mysql-test/r/func_time.result: A test case result is corrected after fixing bug#33546. mysql-test/r/select.result: Added a test case for the bug#33546. mysql-test/r/subselect.result: A test case result is corrected after fixing bug#33546. mysql-test/r/udf.result: Added a test case for the bug#33546. mysql-test/t/select.test: Added a test case for the bug#33546. mysql-test/t/udf.test: Added a test case for the bug#33546. sql/item.cc: Bug#33546: Slowdown on re-evaluation of constant expressions. The cache_const_expr_analyzer and cache_const_expr_transformer functions are added to the Item class. The first one check if the item can be cached and the second caches it if so. Item_cache_datetime class implementation is added. sql/item.h: Bug#33546: Slowdown on re-evaluation of constant expressions. Item_ref and Item_cache classes now returns basic_const_item from underlying item. The cache_const_expr_analyzer and cache_const_expr_transformer functions are added to the Item class. sql/sql_select.cc: Bug#33546: Slowdown on re-evaluation of constant expressions. A helper function called cache_const_exprs is added to the JOIN class. It calls compile method with caching analyzer and transformer on WHERE, HAVING, ON expressions if they're present. sql/sql_select.h: Bug#33546: Slowdown on re-evaluation of constant expressions. A helper function called cache_const_exprs is added to the JOIN class.
171 lines
3.9 KiB
Text
171 lines
3.9 KiB
Text
drop table if exists t1;
|
|
create table t1 (a varchar(10), key(a));
|
|
insert into t1 values ("a"),("abc"),("abcd"),("hello"),("test");
|
|
explain extended select * from t1 where a like 'abc%';
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 index a a 13 NULL 5 20.00 Using where; Using index
|
|
Warnings:
|
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where (`test`.`t1`.`a` like 'abc%')
|
|
explain extended select * from t1 where a like concat('abc','%');
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 index a a 13 NULL 5 20.00 Using where; Using index
|
|
Warnings:
|
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where (`test`.`t1`.`a` like <cache>(concat('abc','%')))
|
|
select * from t1 where a like "abc%";
|
|
a
|
|
abc
|
|
abcd
|
|
select * from t1 where a like concat("abc","%");
|
|
a
|
|
abc
|
|
abcd
|
|
select * from t1 where a like "ABC%";
|
|
a
|
|
abc
|
|
abcd
|
|
select * from t1 where a like "test%";
|
|
a
|
|
test
|
|
select * from t1 where a like "te_t";
|
|
a
|
|
test
|
|
select * from t1 where a like "%a%";
|
|
a
|
|
a
|
|
abc
|
|
abcd
|
|
select * from t1 where a like "%abcd%";
|
|
a
|
|
abcd
|
|
select * from t1 where a like "%abc\d%";
|
|
a
|
|
abcd
|
|
drop table t1;
|
|
create table t1 (a varchar(10), key(a));
|
|
insert into t1 values ('a'), ('a\\b');
|
|
select * from t1 where a like 'a\\%' escape '#';
|
|
a
|
|
a\b
|
|
select * from t1 where a like 'a\\%' escape '#' and a like 'a\\\\b';
|
|
a
|
|
a\b
|
|
prepare stmt1 from 'select * from t1 where a like \'a\\%\' escape ?';
|
|
set @esc='#';
|
|
execute stmt1 using @esc;
|
|
a
|
|
a\b
|
|
deallocate prepare stmt1;
|
|
drop table t1;
|
|
create table t1 (a datetime);
|
|
insert into t1 values ('2004-03-11 12:00:21');
|
|
select * from t1 where a like '2004-03-11 12:00:21';
|
|
a
|
|
2004-03-11 12:00:21
|
|
drop table t1;
|
|
SET NAMES koi8r;
|
|
CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET koi8r);
|
|
INSERT INTO t1 VALUES ('ÆÙ×Á'),('æÙ×Á'),('Æù×Á'),('ÆÙ÷Á'),('ÆÙ×á'),('æù÷á');
|
|
INSERT INTO t1 VALUES ('ÆÙ×ÁÐÒÏÌÄÖ'),('æÙ×ÁÐÒÏÌÄÖ'),('Æù×ÁÐÒÏÌÄÖ'),('ÆÙ÷ÁÐÒÏÌÄÖ');
|
|
INSERT INTO t1 VALUES ('ÆÙ×áÐÒÏÌÄÖ'),('ÆÙ×ÁðÒÏÌÄÖ'),('ÆÙ×ÁÐòÏÌÄÖ'),('ÆÙ×ÁÐÒïÌÄÖ');
|
|
INSERT INTO t1 VALUES ('ÆÙ×ÁÐÒÏìÄÖ'),('ÆÙ×ÁÐÒÏÌäÖ'),('ÆÙ×ÁÐÒÏÌÄö'),('æù÷áðòïìäö');
|
|
SELECT * FROM t1 WHERE a LIKE '%Æù×Á%';
|
|
a
|
|
ÆÙ×Á
|
|
æÙ×Á
|
|
Æù×Á
|
|
ÆÙ÷Á
|
|
ÆÙ×á
|
|
æù÷á
|
|
ÆÙ×ÁÐÒÏÌÄÖ
|
|
æÙ×ÁÐÒÏÌÄÖ
|
|
Æù×ÁÐÒÏÌÄÖ
|
|
ÆÙ÷ÁÐÒÏÌÄÖ
|
|
ÆÙ×áÐÒÏÌÄÖ
|
|
ÆÙ×ÁðÒÏÌÄÖ
|
|
ÆÙ×ÁÐòÏÌÄÖ
|
|
ÆÙ×ÁÐÒïÌÄÖ
|
|
ÆÙ×ÁÐÒÏìÄÖ
|
|
ÆÙ×ÁÐÒÏÌäÖ
|
|
ÆÙ×ÁÐÒÏÌÄö
|
|
æù÷áðòïìäö
|
|
SELECT * FROM t1 WHERE a LIKE '%Æù×%';
|
|
a
|
|
ÆÙ×Á
|
|
æÙ×Á
|
|
Æù×Á
|
|
ÆÙ÷Á
|
|
ÆÙ×á
|
|
æù÷á
|
|
ÆÙ×ÁÐÒÏÌÄÖ
|
|
æÙ×ÁÐÒÏÌÄÖ
|
|
Æù×ÁÐÒÏÌÄÖ
|
|
ÆÙ÷ÁÐÒÏÌÄÖ
|
|
ÆÙ×áÐÒÏÌÄÖ
|
|
ÆÙ×ÁðÒÏÌÄÖ
|
|
ÆÙ×ÁÐòÏÌÄÖ
|
|
ÆÙ×ÁÐÒïÌÄÖ
|
|
ÆÙ×ÁÐÒÏìÄÖ
|
|
ÆÙ×ÁÐÒÏÌäÖ
|
|
ÆÙ×ÁÐÒÏÌÄö
|
|
æù÷áðòïìäö
|
|
SELECT * FROM t1 WHERE a LIKE 'Æù×Á%';
|
|
a
|
|
ÆÙ×Á
|
|
æÙ×Á
|
|
Æù×Á
|
|
ÆÙ÷Á
|
|
ÆÙ×á
|
|
æù÷á
|
|
ÆÙ×ÁÐÒÏÌÄÖ
|
|
æÙ×ÁÐÒÏÌÄÖ
|
|
Æù×ÁÐÒÏÌÄÖ
|
|
ÆÙ÷ÁÐÒÏÌÄÖ
|
|
ÆÙ×áÐÒÏÌÄÖ
|
|
ÆÙ×ÁðÒÏÌÄÖ
|
|
ÆÙ×ÁÐòÏÌÄÖ
|
|
ÆÙ×ÁÐÒïÌÄÖ
|
|
ÆÙ×ÁÐÒÏìÄÖ
|
|
ÆÙ×ÁÐÒÏÌäÖ
|
|
ÆÙ×ÁÐÒÏÌÄö
|
|
æù÷áðòïìäö
|
|
DROP TABLE t1;
|
|
SET NAMES cp1250;
|
|
CREATE TABLE t1 (a varchar(250) NOT NULL) DEFAULT CHARACTER SET=cp1250;
|
|
INSERT INTO t1 VALUES
|
|
('Techni Tapes Sp. z o.o.'),
|
|
('Pojazdy Szynowe PESA Bydgoszcz SA Holding'),
|
|
('AKAPESTER 1 P.P.H.U.'),
|
|
('Pojazdy Szynowe PESA Bydgoszcz S A Holding'),
|
|
('PPUH PESKA-I Maria Struniarska');
|
|
select * from t1 where a like '%PESA%';
|
|
a
|
|
Pojazdy Szynowe PESA Bydgoszcz SA Holding
|
|
Pojazdy Szynowe PESA Bydgoszcz S A Holding
|
|
select * from t1 where a like '%PESA %';
|
|
a
|
|
Pojazdy Szynowe PESA Bydgoszcz SA Holding
|
|
Pojazdy Szynowe PESA Bydgoszcz S A Holding
|
|
select * from t1 where a like '%PES%';
|
|
a
|
|
Techni Tapes Sp. z o.o.
|
|
Pojazdy Szynowe PESA Bydgoszcz SA Holding
|
|
AKAPESTER 1 P.P.H.U.
|
|
Pojazdy Szynowe PESA Bydgoszcz S A Holding
|
|
PPUH PESKA-I Maria Struniarska
|
|
select * from t1 where a like '%PESKA%';
|
|
a
|
|
PPUH PESKA-I Maria Struniarska
|
|
select * from t1 where a like '%ESKA%';
|
|
a
|
|
PPUH PESKA-I Maria Struniarska
|
|
DROP TABLE t1;
|
|
select _cp866'aaaaaaaaa' like _cp866'%aaaa%' collate cp866_bin;
|
|
_cp866'aaaaaaaaa' like _cp866'%aaaa%' collate cp866_bin
|
|
1
|
|
set names koi8r;
|
|
select 'andre%' like 'andreÊ%' escape 'Ê';
|
|
'andre%' like 'andreÊ%' escape 'Ê'
|
|
1
|
|
select _cp1251'andre%' like convert('andreÊ%' using cp1251) escape 'Ê';
|
|
_cp1251'andre%' like convert('andreÊ%' using cp1251) escape 'Ê'
|
|
1
|