5.3->5.5 merge
This commit is contained in:
commit
a48a91d90f
@ -1,5 +1,6 @@
|
||||
/*
|
||||
Copyright (c) 2000, 2011, Oracle and/or its affiliates.
|
||||
Copyright (c) 2000, 2012, Oracle and/or its affiliates.
|
||||
Copyright (c) 2010, 2012, Monty Program Ab
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright (c) 2000, 2011, Oracle and/or its affiliates
|
||||
Copyright (c) 2000, 2012, Oracle and/or its affiliates.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -1,4 +1,5 @@
|
||||
/* Copyright (c) 2010, 2012, Oracle and/or its affiliates.
|
||||
/* Copyright (c) 2011, 2012, Oracle and/or its affiliates.
|
||||
Copyright (c) 2011, 2012, Monty Program Ab
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -282,4 +282,74 @@ CREATE TABLE t1 ( i INT );
|
||||
INSERT INTO t1 VALUES ( (SELECT 1 FROM ( SELECT * FROM t1 ) as a) );
|
||||
drop table t1;
|
||||
set optimizer_switch=@save_optimizer_switch;
|
||||
#
|
||||
# MDEV-3801 Reproducible sub select join crash on 5.3.8 and 5.3.9
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
pk int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
a char(2) DEFAULT NULL,
|
||||
PRIMARY KEY (pk),
|
||||
KEY a (a)
|
||||
) ENGINE=MyISAM;
|
||||
INSERT INTO t1 (a)
|
||||
VALUES (NULL),(NULL),(NULL),('AB'),(NULL),('CD'),(NULL),(NULL);
|
||||
INSERT INTO t1 SELECT NULL, a1.a FROM t1 a1, t1 a2, t1 a3, t1 a4, t1 a5;
|
||||
CREATE TABLE t2 (
|
||||
pk int(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY
|
||||
) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL);
|
||||
INSERT INTO t2 SELECT NULL FROM t2 a1, t2 a2, t2 a3, t2 a4, t2 a5;
|
||||
CREATE TABLE t3 (
|
||||
pk int(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY
|
||||
) ENGINE=MyISAM;
|
||||
INSERT INTO t3 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL);
|
||||
INSERT INTO t3 SELECT NULL FROM t3 a1, t3 a2, t3 a3, t3 a4, t3 a5;
|
||||
CREATE TABLE t4 (
|
||||
a char(2) NOT NULL DEFAULT '',
|
||||
PRIMARY KEY (a)
|
||||
) ENGINE=MyISAM;
|
||||
INSERT INTO t4 VALUES ('CD');
|
||||
set @@tmp_table_size=8192;
|
||||
EXPLAIN
|
||||
SELECT * FROM t3 AS tx JOIN t2 AS ty ON (tx.pk = ty.pk)
|
||||
WHERE
|
||||
tx.pk IN
|
||||
(SELECT *
|
||||
FROM (SELECT DISTINCT ta.pk
|
||||
FROM t3 AS ta
|
||||
JOIN t2 AS tb ON (ta.pk = tb.pk)
|
||||
JOIN t1 AS tc ON (tb.pk = tc.pk)
|
||||
JOIN t4 AS td ON tc.a = td.a) tu)
|
||||
limit 10;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY <subquery2> ALL distinct_key NULL NULL NULL #
|
||||
1 PRIMARY tx eq_ref PRIMARY PRIMARY 4 tu.pk # Using index
|
||||
1 PRIMARY ty eq_ref PRIMARY PRIMARY 4 tu.pk # Using index
|
||||
2 MATERIALIZED <derived3> ALL NULL NULL NULL NULL #
|
||||
3 DERIVED td system PRIMARY NULL NULL NULL # Using temporary
|
||||
3 DERIVED tc ref PRIMARY,a a 3 const #
|
||||
3 DERIVED ta eq_ref PRIMARY PRIMARY 4 test.tc.pk # Using index
|
||||
3 DERIVED tb eq_ref PRIMARY PRIMARY 4 test.tc.pk # Using index; Distinct
|
||||
SELECT * FROM t3 AS tX JOIN t2 AS tY ON (tX.pk = tY.pk)
|
||||
WHERE
|
||||
tX.pk IN
|
||||
(SELECT *
|
||||
FROM (SELECT DISTINCT tA.pk
|
||||
FROM t3 AS tA
|
||||
JOIN t2 AS tB ON (tA.pk = tB.pk)
|
||||
JOIN t1 AS tC ON (tB.pk = tC.pk)
|
||||
JOIN t4 AS tD ON tC.a = tD.a) tU)
|
||||
limit 10;
|
||||
pk pk
|
||||
6 6
|
||||
16 16
|
||||
24 24
|
||||
32 32
|
||||
40 40
|
||||
48 48
|
||||
56 56
|
||||
64 64
|
||||
72 72
|
||||
80 80
|
||||
drop table t1, t2, t3, t4;
|
||||
set optimizer_switch=@exit_optimizer_switch;
|
||||
|
@ -2119,6 +2119,17 @@ FROM t2
|
||||
GROUP BY 1;
|
||||
a
|
||||
DROP TABLE t1, t2;
|
||||
FLUSH STATUS;
|
||||
CREATE TABLE t1 (f1 INT, f2 decimal(20,1), f3 blob);
|
||||
INSERT INTO t1 values(11,NULL,'blob'),(11,NULL,'blob');
|
||||
SELECT f3, MIN(f2) FROM t1 GROUP BY f1 LIMIT 1;
|
||||
f3 MIN(f2)
|
||||
blob NULL
|
||||
DROP TABLE t1;
|
||||
the value below *must* be 1
|
||||
show status like 'Created_tmp_disk_tables';
|
||||
Variable_name Value
|
||||
Created_tmp_disk_tables 1
|
||||
# End of 5.3 tests
|
||||
#
|
||||
# Bug#49771: Incorrect MIN (date) when minimum value is 0000-00-00
|
||||
|
@ -1678,6 +1678,12 @@ SELECT length(CAST(b AS CHAR)) FROM ubig;
|
||||
length(CAST(b AS CHAR))
|
||||
20
|
||||
DROP TABLE ubig;
|
||||
select 1 from information_schema.tables where table_schema=repeat('a', 2000);
|
||||
1
|
||||
grant usage on *.* to mysqltest_1@localhost;
|
||||
select 1 from information_schema.tables where table_schema=repeat('a', 2000);
|
||||
1
|
||||
drop user mysqltest_1@localhost;
|
||||
End of 5.1 tests.
|
||||
#
|
||||
# Additional test for WL#3726 "DDL locking for all metadata objects"
|
||||
|
@ -2394,6 +2394,12 @@ HAVING b > geomfromtext("")
|
||||
);
|
||||
1
|
||||
DROP TABLE t1;
|
||||
|
||||
MDEV-612 Valgrind error in ha_maria::check_if_incompatible_data
|
||||
|
||||
CREATE TABLE t1 (a INT, b INT, KEY(a)) ENGINE=Aria PARTITION BY KEY(a) PARTITIONS 2;
|
||||
ALTER TABLE t1 ADD KEY (b);
|
||||
drop table t1;
|
||||
End of 5.1 tests
|
||||
#
|
||||
# BUG#55385: UPDATE statement throws an error, but still updates
|
||||
|
@ -1221,6 +1221,153 @@ Lugansk UKR 469000
|
||||
Seattle USA 563374
|
||||
Caracas VEN 1975294
|
||||
set optimizer_switch=@save_optimizer_switch;
|
||||
#
|
||||
# Bug mdev-585: range vs index-merge with ORDER BY ... LIMIT n
|
||||
# (LP bug #637962)
|
||||
#
|
||||
DROP INDEX CountryPopulation ON City;
|
||||
DROP INDEX CountryName ON City;
|
||||
DROP INDEX CityName on City;
|
||||
CREATE INDEX Name ON City(Name);
|
||||
CREATE INDEX Population ON City(Population);
|
||||
EXPLAIN
|
||||
SELECT * FROM City
|
||||
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H'))
|
||||
AND (Population >= 100000 AND Population < 120000);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE City index_merge Country,Name,Population Name,Country 35,3 NULL # Using sort_union(Name,Country); Using where
|
||||
FLUSH STATUS;
|
||||
SELECT * FROM City
|
||||
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H'))
|
||||
AND (Population >= 100000 AND Population < 120000);
|
||||
ID Name Country Population
|
||||
384 Cabo Frio BRA 119503
|
||||
387 Camaragibe BRA 118968
|
||||
403 Catanduva BRA 107761
|
||||
412 Cachoeirinha BRA 103240
|
||||
508 Watford GBR 113080
|
||||
509 Ipswich GBR 114000
|
||||
510 Slough GBR 112000
|
||||
511 Exeter GBR 111000
|
||||
512 Cheltenham GBR 106000
|
||||
513 Gloucester GBR 107000
|
||||
514 Saint Helens GBR 106293
|
||||
515 Sutton Coldfield GBR 106001
|
||||
516 York GBR 104425
|
||||
517 Oldham GBR 103931
|
||||
518 Basildon GBR 100924
|
||||
519 Worthing GBR 100000
|
||||
635 Mallawi EGY 119283
|
||||
636 Bilbays EGY 113608
|
||||
637 Mit Ghamr EGY 101801
|
||||
638 al-Arish EGY 100447
|
||||
701 Tarragona ESP 113016
|
||||
702 Lleida (Lérida) ESP 112207
|
||||
703 Jaén ESP 109247
|
||||
704 Ourense (Orense) ESP 109120
|
||||
705 Mataró ESP 104095
|
||||
706 Algeciras ESP 103106
|
||||
707 Marbella ESP 101144
|
||||
759 Gonder ETH 112249
|
||||
869 Cabuyao PHL 106630
|
||||
870 Calapan PHL 105910
|
||||
873 Cauayan PHL 103952
|
||||
903 Serekunda GMB 102600
|
||||
909 Sohumi GEO 111700
|
||||
913 Tema GHA 109975
|
||||
914 Sekondi-Takoradi GHA 103653
|
||||
924 Villa Nueva GTM 101295
|
||||
1844 Cape Breton CAN 114733
|
||||
1847 Cambridge CAN 109186
|
||||
2406 Herakleion GRC 116178
|
||||
2407 Kallithea GRC 114233
|
||||
2408 Larisa GRC 113090
|
||||
2908 Cajamarca PER 108009
|
||||
3002 Besançon FRA 117733
|
||||
3003 Caen FRA 113987
|
||||
3004 Orléans FRA 113126
|
||||
3005 Mulhouse FRA 110359
|
||||
3006 Rouen FRA 106592
|
||||
3007 Boulogne-Billancourt FRA 106367
|
||||
3008 Perpignan FRA 105115
|
||||
3009 Nancy FRA 103605
|
||||
3411 Ceyhan TUR 102412
|
||||
3567 Carúpano VEN 119639
|
||||
3568 Catia La Mar VEN 117012
|
||||
3571 Calabozo VEN 107146
|
||||
3786 Cam Ranh VNM 114041
|
||||
3792 Tartu EST 101246
|
||||
4002 Carrollton USA 109576
|
||||
4027 Cape Coral USA 102286
|
||||
4032 Cambridge USA 101355
|
||||
SHOW STATUS LIKE 'Handler_read_%';
|
||||
Variable_name Value
|
||||
Handler_read_first 0
|
||||
Handler_read_key 2
|
||||
Handler_read_last 0
|
||||
Handler_read_next 385
|
||||
Handler_read_prev 0
|
||||
Handler_read_rnd 377
|
||||
Handler_read_rnd_deleted 0
|
||||
Handler_read_rnd_next 0
|
||||
EXPLAIN
|
||||
SELECT * FROM City
|
||||
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H'))
|
||||
AND (Population >= 100000 AND Population < 120000)
|
||||
ORDER BY Population LIMIT 5;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE City range Country,Name,Population Population 4 NULL # Using where
|
||||
FLUSH STATUS;
|
||||
SELECT * FROM City
|
||||
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H'))
|
||||
AND (Population >= 100000 AND Population < 120000)
|
||||
ORDER BY Population LIMIT 5;
|
||||
ID Name Country Population
|
||||
519 Worthing GBR 100000
|
||||
638 al-Arish EGY 100447
|
||||
518 Basildon GBR 100924
|
||||
707 Marbella ESP 101144
|
||||
3792 Tartu EST 101246
|
||||
SHOW STATUS LIKE 'Handler_read_%';
|
||||
Variable_name Value
|
||||
Handler_read_first 0
|
||||
Handler_read_key 1
|
||||
Handler_read_last 0
|
||||
Handler_read_next 59
|
||||
Handler_read_prev 0
|
||||
Handler_read_rnd 0
|
||||
Handler_read_rnd_deleted 0
|
||||
Handler_read_rnd_next 0
|
||||
set optimizer_switch='index_merge=off';
|
||||
EXPLAIN
|
||||
SELECT * FROM City
|
||||
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H'))
|
||||
AND (Population >= 100000 AND Population < 120000)
|
||||
ORDER BY Population LIMIT 5;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE City range Country,Name,Population Population 4 NULL # Using index condition; Using where
|
||||
FLUSH STATUS;
|
||||
SELECT * FROM City
|
||||
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H'))
|
||||
AND (Population >= 100000 AND Population < 120000)
|
||||
ORDER BY Population LIMIT 5;
|
||||
ID Name Country Population
|
||||
519 Worthing GBR 100000
|
||||
638 al-Arish EGY 100447
|
||||
518 Basildon GBR 100924
|
||||
707 Marbella ESP 101144
|
||||
3792 Tartu EST 101246
|
||||
SHOW STATUS LIKE 'Handler_read_%';
|
||||
Variable_name Value
|
||||
Handler_read_first 0
|
||||
Handler_read_key 1
|
||||
Handler_read_last 0
|
||||
Handler_read_next 59
|
||||
Handler_read_prev 0
|
||||
Handler_read_rnd 0
|
||||
Handler_read_rnd_deleted 0
|
||||
Handler_read_rnd_next 0
|
||||
set optimizer_switch=@save_optimizer_switch;
|
||||
DROP DATABASE world;
|
||||
use test;
|
||||
CREATE TABLE t1 (
|
||||
|
@ -1,5 +1,5 @@
|
||||
--- r/range_vs_index_merge_innodb.result 2012-03-24 17:12:02.124422000 +0100
|
||||
+++ r/range_vs_index_merge_innodb,innodb_plugin.reject 2012-03-24 18:00:13.647902620 +0100
|
||||
--- ./r/range_vs_index_merge_innodb.result 2012-11-21 19:35:14.000000000 +0100
|
||||
+++ ./r/range_vs_index_merge_innodb,innodb_plugin.reject 2012-11-21 20:56:00.000000000 +0100
|
||||
@@ -50,14 +50,14 @@
|
||||
WHERE (Population >= 100000 OR Name LIKE 'P%') AND Country='CAN' OR
|
||||
(Population < 100000 OR Name Like 'T%') AND Country='ARG';
|
||||
@ -269,3 +269,12 @@
|
||||
SELECT Name, Country, Population FROM City WHERE
|
||||
(Name='Manila' AND Country='PHL') OR
|
||||
(Name='Addis Abeba' AND Country='ETH') OR
|
||||
@@ -1346,7 +1346,7 @@
|
||||
AND (Population >= 100000 AND Population < 120000)
|
||||
ORDER BY Population LIMIT 5;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
-1 SIMPLE City range Country,Name,Population Population 4 NULL # Using index condition; Using where
|
||||
+1 SIMPLE City range Country,Name,Population Population 4 NULL # Using where
|
||||
FLUSH STATUS;
|
||||
SELECT * FROM City
|
||||
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H'))
|
||||
|
@ -1222,6 +1222,153 @@ Lugansk UKR 469000
|
||||
Seattle USA 563374
|
||||
Caracas VEN 1975294
|
||||
set optimizer_switch=@save_optimizer_switch;
|
||||
#
|
||||
# Bug mdev-585: range vs index-merge with ORDER BY ... LIMIT n
|
||||
# (LP bug #637962)
|
||||
#
|
||||
DROP INDEX CountryPopulation ON City;
|
||||
DROP INDEX CountryName ON City;
|
||||
DROP INDEX CityName on City;
|
||||
CREATE INDEX Name ON City(Name);
|
||||
CREATE INDEX Population ON City(Population);
|
||||
EXPLAIN
|
||||
SELECT * FROM City
|
||||
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H'))
|
||||
AND (Population >= 100000 AND Population < 120000);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE City index_merge Country,Name,Population Name,Country 35,3 NULL # Using sort_union(Name,Country); Using where
|
||||
FLUSH STATUS;
|
||||
SELECT * FROM City
|
||||
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H'))
|
||||
AND (Population >= 100000 AND Population < 120000);
|
||||
ID Name Country Population
|
||||
384 Cabo Frio BRA 119503
|
||||
387 Camaragibe BRA 118968
|
||||
403 Catanduva BRA 107761
|
||||
412 Cachoeirinha BRA 103240
|
||||
508 Watford GBR 113080
|
||||
509 Ipswich GBR 114000
|
||||
510 Slough GBR 112000
|
||||
511 Exeter GBR 111000
|
||||
512 Cheltenham GBR 106000
|
||||
513 Gloucester GBR 107000
|
||||
514 Saint Helens GBR 106293
|
||||
515 Sutton Coldfield GBR 106001
|
||||
516 York GBR 104425
|
||||
517 Oldham GBR 103931
|
||||
518 Basildon GBR 100924
|
||||
519 Worthing GBR 100000
|
||||
635 Mallawi EGY 119283
|
||||
636 Bilbays EGY 113608
|
||||
637 Mit Ghamr EGY 101801
|
||||
638 al-Arish EGY 100447
|
||||
701 Tarragona ESP 113016
|
||||
702 Lleida (Lérida) ESP 112207
|
||||
703 Jaén ESP 109247
|
||||
704 Ourense (Orense) ESP 109120
|
||||
705 Mataró ESP 104095
|
||||
706 Algeciras ESP 103106
|
||||
707 Marbella ESP 101144
|
||||
759 Gonder ETH 112249
|
||||
869 Cabuyao PHL 106630
|
||||
870 Calapan PHL 105910
|
||||
873 Cauayan PHL 103952
|
||||
903 Serekunda GMB 102600
|
||||
909 Sohumi GEO 111700
|
||||
913 Tema GHA 109975
|
||||
914 Sekondi-Takoradi GHA 103653
|
||||
924 Villa Nueva GTM 101295
|
||||
1844 Cape Breton CAN 114733
|
||||
1847 Cambridge CAN 109186
|
||||
2406 Herakleion GRC 116178
|
||||
2407 Kallithea GRC 114233
|
||||
2408 Larisa GRC 113090
|
||||
2908 Cajamarca PER 108009
|
||||
3002 Besançon FRA 117733
|
||||
3003 Caen FRA 113987
|
||||
3004 Orléans FRA 113126
|
||||
3005 Mulhouse FRA 110359
|
||||
3006 Rouen FRA 106592
|
||||
3007 Boulogne-Billancourt FRA 106367
|
||||
3008 Perpignan FRA 105115
|
||||
3009 Nancy FRA 103605
|
||||
3411 Ceyhan TUR 102412
|
||||
3567 Carúpano VEN 119639
|
||||
3568 Catia La Mar VEN 117012
|
||||
3571 Calabozo VEN 107146
|
||||
3786 Cam Ranh VNM 114041
|
||||
3792 Tartu EST 101246
|
||||
4002 Carrollton USA 109576
|
||||
4027 Cape Coral USA 102286
|
||||
4032 Cambridge USA 101355
|
||||
SHOW STATUS LIKE 'Handler_read_%';
|
||||
Variable_name Value
|
||||
Handler_read_first 0
|
||||
Handler_read_key 2
|
||||
Handler_read_last 0
|
||||
Handler_read_next 385
|
||||
Handler_read_prev 0
|
||||
Handler_read_rnd 377
|
||||
Handler_read_rnd_deleted 0
|
||||
Handler_read_rnd_next 0
|
||||
EXPLAIN
|
||||
SELECT * FROM City
|
||||
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H'))
|
||||
AND (Population >= 100000 AND Population < 120000)
|
||||
ORDER BY Population LIMIT 5;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE City range Country,Name,Population Population 4 NULL # Using where
|
||||
FLUSH STATUS;
|
||||
SELECT * FROM City
|
||||
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H'))
|
||||
AND (Population >= 100000 AND Population < 120000)
|
||||
ORDER BY Population LIMIT 5;
|
||||
ID Name Country Population
|
||||
519 Worthing GBR 100000
|
||||
638 al-Arish EGY 100447
|
||||
518 Basildon GBR 100924
|
||||
707 Marbella ESP 101144
|
||||
3792 Tartu EST 101246
|
||||
SHOW STATUS LIKE 'Handler_read_%';
|
||||
Variable_name Value
|
||||
Handler_read_first 0
|
||||
Handler_read_key 1
|
||||
Handler_read_last 0
|
||||
Handler_read_next 59
|
||||
Handler_read_prev 0
|
||||
Handler_read_rnd 0
|
||||
Handler_read_rnd_deleted 0
|
||||
Handler_read_rnd_next 0
|
||||
set optimizer_switch='index_merge=off';
|
||||
EXPLAIN
|
||||
SELECT * FROM City
|
||||
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H'))
|
||||
AND (Population >= 100000 AND Population < 120000)
|
||||
ORDER BY Population LIMIT 5;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE City range Country,Name,Population Population 4 NULL # Using index condition; Using where
|
||||
FLUSH STATUS;
|
||||
SELECT * FROM City
|
||||
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H'))
|
||||
AND (Population >= 100000 AND Population < 120000)
|
||||
ORDER BY Population LIMIT 5;
|
||||
ID Name Country Population
|
||||
519 Worthing GBR 100000
|
||||
638 al-Arish EGY 100447
|
||||
518 Basildon GBR 100924
|
||||
707 Marbella ESP 101144
|
||||
3792 Tartu EST 101246
|
||||
SHOW STATUS LIKE 'Handler_read_%';
|
||||
Variable_name Value
|
||||
Handler_read_first 0
|
||||
Handler_read_key 1
|
||||
Handler_read_last 0
|
||||
Handler_read_next 59
|
||||
Handler_read_prev 0
|
||||
Handler_read_rnd 0
|
||||
Handler_read_rnd_deleted 0
|
||||
Handler_read_rnd_next 0
|
||||
set optimizer_switch=@save_optimizer_switch;
|
||||
DROP DATABASE world;
|
||||
use test;
|
||||
CREATE TABLE t1 (
|
||||
|
@ -6060,6 +6060,116 @@ WHERE (col_varchar_nokey, 'x') IN
|
||||
col_int_nokey
|
||||
1
|
||||
DROP TABLE ot,it1,it2;
|
||||
#
|
||||
# MDEV-746
|
||||
# Bug#13651009 WRONG RESULT FROM DERIVED TABLE IF THE SUBQUERY
|
||||
# HAS AN EMPTY RESULT
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
pk int NOT NULL,
|
||||
col_int_nokey int NOT NULL,
|
||||
col_int_key int NOT NULL,
|
||||
col_time_key time NOT NULL,
|
||||
col_varchar_key varchar(1) NOT NULL,
|
||||
col_varchar_nokey varchar(1) NOT NULL,
|
||||
PRIMARY KEY (pk),
|
||||
KEY col_int_key (col_int_key),
|
||||
KEY col_time_key (col_time_key),
|
||||
KEY col_varchar_key (col_varchar_key,col_int_key)
|
||||
) ENGINE=MyISAM;
|
||||
CREATE TABLE t2 (
|
||||
pk int NOT NULL AUTO_INCREMENT,
|
||||
col_int_nokey int NOT NULL,
|
||||
col_int_key int NOT NULL,
|
||||
col_time_key time NOT NULL,
|
||||
col_varchar_key varchar(1) NOT NULL,
|
||||
col_varchar_nokey varchar(1) NOT NULL,
|
||||
PRIMARY KEY (pk),
|
||||
KEY col_int_key (col_int_key),
|
||||
KEY col_time_key (col_time_key),
|
||||
KEY col_varchar_key (col_varchar_key,col_int_key)
|
||||
) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES (1,4,4,'00:00:00','b','b');
|
||||
SET @var2:=4, @var3:=8;
|
||||
|
||||
Testcase without inner subquery
|
||||
EXPLAIN SELECT @var3:=12, sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key + NULL) IS NULL OR
|
||||
sq4_alias1.col_varchar_key = @var3;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
SELECT @var3:=12, sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key + NULL) IS NULL OR
|
||||
sq4_alias1.col_varchar_key = @var3;
|
||||
@var3:=12 pk col_int_nokey col_int_key col_time_key col_varchar_key col_varchar_nokey
|
||||
SELECT @var3;
|
||||
@var3
|
||||
8
|
||||
EXPLAIN SELECT * FROM ( SELECT @var3:=12, sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key + NULL) IS NULL OR
|
||||
sq4_alias1.col_varchar_key = @var3 ) AS alias3;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE <derived2> system NULL NULL NULL NULL 0 const row not found
|
||||
2 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
SELECT * FROM ( SELECT @var3:=12, sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key + NULL) IS NULL OR
|
||||
sq4_alias1.col_varchar_key = @var3 ) AS alias3;
|
||||
@var3:=12 pk col_int_nokey col_int_key col_time_key col_varchar_key col_varchar_nokey
|
||||
SELECT @var3;
|
||||
@var3
|
||||
8
|
||||
|
||||
Testcase with inner subquery; crashed WL#6095
|
||||
SET @var3=8;
|
||||
EXPLAIN SELECT sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key , sq4_alias1.col_varchar_nokey)
|
||||
NOT IN
|
||||
(SELECT c_sq1_alias1.col_varchar_key AS c_sq1_field1,
|
||||
c_sq1_alias1.col_varchar_nokey AS c_sq1_field2
|
||||
FROM t2 AS c_sq1_alias1
|
||||
WHERE (c_sq1_alias1.col_int_nokey != @var2
|
||||
OR c_sq1_alias1.pk != @var3));
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
2 DEPENDENT SUBQUERY c_sq1_alias1 system PRIMARY NULL NULL NULL 1
|
||||
SELECT sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key , sq4_alias1.col_varchar_nokey)
|
||||
NOT IN
|
||||
(SELECT c_sq1_alias1.col_varchar_key AS c_sq1_field1,
|
||||
c_sq1_alias1.col_varchar_nokey AS c_sq1_field2
|
||||
FROM t2 AS c_sq1_alias1
|
||||
WHERE (c_sq1_alias1.col_int_nokey != @var2
|
||||
OR c_sq1_alias1.pk != @var3));
|
||||
pk col_int_nokey col_int_key col_time_key col_varchar_key col_varchar_nokey
|
||||
EXPLAIN SELECT * FROM ( SELECT sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key , sq4_alias1.col_varchar_nokey)
|
||||
NOT IN
|
||||
(SELECT c_sq1_alias1.col_varchar_key AS c_sq1_field1,
|
||||
c_sq1_alias1.col_varchar_nokey AS c_sq1_field2
|
||||
FROM t2 AS c_sq1_alias1
|
||||
WHERE (c_sq1_alias1.col_int_nokey != @var2
|
||||
OR c_sq1_alias1.pk != @var3)) ) AS alias3;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
3 DEPENDENT SUBQUERY c_sq1_alias1 system PRIMARY NULL NULL NULL 1
|
||||
SELECT * FROM ( SELECT sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key , sq4_alias1.col_varchar_nokey)
|
||||
NOT IN
|
||||
(SELECT c_sq1_alias1.col_varchar_key AS c_sq1_field1,
|
||||
c_sq1_alias1.col_varchar_nokey AS c_sq1_field2
|
||||
FROM t2 AS c_sq1_alias1
|
||||
WHERE (c_sq1_alias1.col_int_nokey != @var2
|
||||
OR c_sq1_alias1.pk != @var3)) ) AS alias3;
|
||||
pk col_int_nokey col_int_key col_time_key col_varchar_key col_varchar_nokey
|
||||
DROP TABLE t1,t2;
|
||||
End of 5.2 tests
|
||||
#
|
||||
# BUG#779885: Crash in eliminate_item_equal with materialization=on in
|
||||
|
@ -6059,6 +6059,116 @@ WHERE (col_varchar_nokey, 'x') IN
|
||||
col_int_nokey
|
||||
1
|
||||
DROP TABLE ot,it1,it2;
|
||||
#
|
||||
# MDEV-746
|
||||
# Bug#13651009 WRONG RESULT FROM DERIVED TABLE IF THE SUBQUERY
|
||||
# HAS AN EMPTY RESULT
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
pk int NOT NULL,
|
||||
col_int_nokey int NOT NULL,
|
||||
col_int_key int NOT NULL,
|
||||
col_time_key time NOT NULL,
|
||||
col_varchar_key varchar(1) NOT NULL,
|
||||
col_varchar_nokey varchar(1) NOT NULL,
|
||||
PRIMARY KEY (pk),
|
||||
KEY col_int_key (col_int_key),
|
||||
KEY col_time_key (col_time_key),
|
||||
KEY col_varchar_key (col_varchar_key,col_int_key)
|
||||
) ENGINE=MyISAM;
|
||||
CREATE TABLE t2 (
|
||||
pk int NOT NULL AUTO_INCREMENT,
|
||||
col_int_nokey int NOT NULL,
|
||||
col_int_key int NOT NULL,
|
||||
col_time_key time NOT NULL,
|
||||
col_varchar_key varchar(1) NOT NULL,
|
||||
col_varchar_nokey varchar(1) NOT NULL,
|
||||
PRIMARY KEY (pk),
|
||||
KEY col_int_key (col_int_key),
|
||||
KEY col_time_key (col_time_key),
|
||||
KEY col_varchar_key (col_varchar_key,col_int_key)
|
||||
) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES (1,4,4,'00:00:00','b','b');
|
||||
SET @var2:=4, @var3:=8;
|
||||
|
||||
Testcase without inner subquery
|
||||
EXPLAIN SELECT @var3:=12, sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key + NULL) IS NULL OR
|
||||
sq4_alias1.col_varchar_key = @var3;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
SELECT @var3:=12, sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key + NULL) IS NULL OR
|
||||
sq4_alias1.col_varchar_key = @var3;
|
||||
@var3:=12 pk col_int_nokey col_int_key col_time_key col_varchar_key col_varchar_nokey
|
||||
SELECT @var3;
|
||||
@var3
|
||||
8
|
||||
EXPLAIN SELECT * FROM ( SELECT @var3:=12, sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key + NULL) IS NULL OR
|
||||
sq4_alias1.col_varchar_key = @var3 ) AS alias3;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE <derived2> system NULL NULL NULL NULL 0 const row not found
|
||||
2 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
SELECT * FROM ( SELECT @var3:=12, sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key + NULL) IS NULL OR
|
||||
sq4_alias1.col_varchar_key = @var3 ) AS alias3;
|
||||
@var3:=12 pk col_int_nokey col_int_key col_time_key col_varchar_key col_varchar_nokey
|
||||
SELECT @var3;
|
||||
@var3
|
||||
8
|
||||
|
||||
Testcase with inner subquery; crashed WL#6095
|
||||
SET @var3=8;
|
||||
EXPLAIN SELECT sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key , sq4_alias1.col_varchar_nokey)
|
||||
NOT IN
|
||||
(SELECT c_sq1_alias1.col_varchar_key AS c_sq1_field1,
|
||||
c_sq1_alias1.col_varchar_nokey AS c_sq1_field2
|
||||
FROM t2 AS c_sq1_alias1
|
||||
WHERE (c_sq1_alias1.col_int_nokey != @var2
|
||||
OR c_sq1_alias1.pk != @var3));
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
2 DEPENDENT SUBQUERY c_sq1_alias1 system PRIMARY NULL NULL NULL 1
|
||||
SELECT sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key , sq4_alias1.col_varchar_nokey)
|
||||
NOT IN
|
||||
(SELECT c_sq1_alias1.col_varchar_key AS c_sq1_field1,
|
||||
c_sq1_alias1.col_varchar_nokey AS c_sq1_field2
|
||||
FROM t2 AS c_sq1_alias1
|
||||
WHERE (c_sq1_alias1.col_int_nokey != @var2
|
||||
OR c_sq1_alias1.pk != @var3));
|
||||
pk col_int_nokey col_int_key col_time_key col_varchar_key col_varchar_nokey
|
||||
EXPLAIN SELECT * FROM ( SELECT sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key , sq4_alias1.col_varchar_nokey)
|
||||
NOT IN
|
||||
(SELECT c_sq1_alias1.col_varchar_key AS c_sq1_field1,
|
||||
c_sq1_alias1.col_varchar_nokey AS c_sq1_field2
|
||||
FROM t2 AS c_sq1_alias1
|
||||
WHERE (c_sq1_alias1.col_int_nokey != @var2
|
||||
OR c_sq1_alias1.pk != @var3)) ) AS alias3;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
3 DEPENDENT SUBQUERY c_sq1_alias1 system PRIMARY NULL NULL NULL 1
|
||||
SELECT * FROM ( SELECT sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key , sq4_alias1.col_varchar_nokey)
|
||||
NOT IN
|
||||
(SELECT c_sq1_alias1.col_varchar_key AS c_sq1_field1,
|
||||
c_sq1_alias1.col_varchar_nokey AS c_sq1_field2
|
||||
FROM t2 AS c_sq1_alias1
|
||||
WHERE (c_sq1_alias1.col_int_nokey != @var2
|
||||
OR c_sq1_alias1.pk != @var3)) ) AS alias3;
|
||||
pk col_int_nokey col_int_key col_time_key col_varchar_key col_varchar_nokey
|
||||
DROP TABLE t1,t2;
|
||||
End of 5.2 tests
|
||||
#
|
||||
# BUG#779885: Crash in eliminate_item_equal with materialization=on in
|
||||
|
@ -6055,6 +6055,116 @@ WHERE (col_varchar_nokey, 'x') IN
|
||||
col_int_nokey
|
||||
1
|
||||
DROP TABLE ot,it1,it2;
|
||||
#
|
||||
# MDEV-746
|
||||
# Bug#13651009 WRONG RESULT FROM DERIVED TABLE IF THE SUBQUERY
|
||||
# HAS AN EMPTY RESULT
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
pk int NOT NULL,
|
||||
col_int_nokey int NOT NULL,
|
||||
col_int_key int NOT NULL,
|
||||
col_time_key time NOT NULL,
|
||||
col_varchar_key varchar(1) NOT NULL,
|
||||
col_varchar_nokey varchar(1) NOT NULL,
|
||||
PRIMARY KEY (pk),
|
||||
KEY col_int_key (col_int_key),
|
||||
KEY col_time_key (col_time_key),
|
||||
KEY col_varchar_key (col_varchar_key,col_int_key)
|
||||
) ENGINE=MyISAM;
|
||||
CREATE TABLE t2 (
|
||||
pk int NOT NULL AUTO_INCREMENT,
|
||||
col_int_nokey int NOT NULL,
|
||||
col_int_key int NOT NULL,
|
||||
col_time_key time NOT NULL,
|
||||
col_varchar_key varchar(1) NOT NULL,
|
||||
col_varchar_nokey varchar(1) NOT NULL,
|
||||
PRIMARY KEY (pk),
|
||||
KEY col_int_key (col_int_key),
|
||||
KEY col_time_key (col_time_key),
|
||||
KEY col_varchar_key (col_varchar_key,col_int_key)
|
||||
) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES (1,4,4,'00:00:00','b','b');
|
||||
SET @var2:=4, @var3:=8;
|
||||
|
||||
Testcase without inner subquery
|
||||
EXPLAIN SELECT @var3:=12, sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key + NULL) IS NULL OR
|
||||
sq4_alias1.col_varchar_key = @var3;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
SELECT @var3:=12, sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key + NULL) IS NULL OR
|
||||
sq4_alias1.col_varchar_key = @var3;
|
||||
@var3:=12 pk col_int_nokey col_int_key col_time_key col_varchar_key col_varchar_nokey
|
||||
SELECT @var3;
|
||||
@var3
|
||||
8
|
||||
EXPLAIN SELECT * FROM ( SELECT @var3:=12, sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key + NULL) IS NULL OR
|
||||
sq4_alias1.col_varchar_key = @var3 ) AS alias3;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE <derived2> system NULL NULL NULL NULL 0 const row not found
|
||||
2 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
SELECT * FROM ( SELECT @var3:=12, sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key + NULL) IS NULL OR
|
||||
sq4_alias1.col_varchar_key = @var3 ) AS alias3;
|
||||
@var3:=12 pk col_int_nokey col_int_key col_time_key col_varchar_key col_varchar_nokey
|
||||
SELECT @var3;
|
||||
@var3
|
||||
8
|
||||
|
||||
Testcase with inner subquery; crashed WL#6095
|
||||
SET @var3=8;
|
||||
EXPLAIN SELECT sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key , sq4_alias1.col_varchar_nokey)
|
||||
NOT IN
|
||||
(SELECT c_sq1_alias1.col_varchar_key AS c_sq1_field1,
|
||||
c_sq1_alias1.col_varchar_nokey AS c_sq1_field2
|
||||
FROM t2 AS c_sq1_alias1
|
||||
WHERE (c_sq1_alias1.col_int_nokey != @var2
|
||||
OR c_sq1_alias1.pk != @var3));
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
2 DEPENDENT SUBQUERY c_sq1_alias1 system PRIMARY NULL NULL NULL 1
|
||||
SELECT sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key , sq4_alias1.col_varchar_nokey)
|
||||
NOT IN
|
||||
(SELECT c_sq1_alias1.col_varchar_key AS c_sq1_field1,
|
||||
c_sq1_alias1.col_varchar_nokey AS c_sq1_field2
|
||||
FROM t2 AS c_sq1_alias1
|
||||
WHERE (c_sq1_alias1.col_int_nokey != @var2
|
||||
OR c_sq1_alias1.pk != @var3));
|
||||
pk col_int_nokey col_int_key col_time_key col_varchar_key col_varchar_nokey
|
||||
EXPLAIN SELECT * FROM ( SELECT sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key , sq4_alias1.col_varchar_nokey)
|
||||
NOT IN
|
||||
(SELECT c_sq1_alias1.col_varchar_key AS c_sq1_field1,
|
||||
c_sq1_alias1.col_varchar_nokey AS c_sq1_field2
|
||||
FROM t2 AS c_sq1_alias1
|
||||
WHERE (c_sq1_alias1.col_int_nokey != @var2
|
||||
OR c_sq1_alias1.pk != @var3)) ) AS alias3;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
3 DEPENDENT SUBQUERY c_sq1_alias1 system PRIMARY NULL NULL NULL 1
|
||||
SELECT * FROM ( SELECT sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key , sq4_alias1.col_varchar_nokey)
|
||||
NOT IN
|
||||
(SELECT c_sq1_alias1.col_varchar_key AS c_sq1_field1,
|
||||
c_sq1_alias1.col_varchar_nokey AS c_sq1_field2
|
||||
FROM t2 AS c_sq1_alias1
|
||||
WHERE (c_sq1_alias1.col_int_nokey != @var2
|
||||
OR c_sq1_alias1.pk != @var3)) ) AS alias3;
|
||||
pk col_int_nokey col_int_key col_time_key col_varchar_key col_varchar_nokey
|
||||
DROP TABLE t1,t2;
|
||||
End of 5.2 tests
|
||||
#
|
||||
# BUG#779885: Crash in eliminate_item_equal with materialization=on in
|
||||
|
@ -6066,6 +6066,116 @@ WHERE (col_varchar_nokey, 'x') IN
|
||||
col_int_nokey
|
||||
1
|
||||
DROP TABLE ot,it1,it2;
|
||||
#
|
||||
# MDEV-746
|
||||
# Bug#13651009 WRONG RESULT FROM DERIVED TABLE IF THE SUBQUERY
|
||||
# HAS AN EMPTY RESULT
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
pk int NOT NULL,
|
||||
col_int_nokey int NOT NULL,
|
||||
col_int_key int NOT NULL,
|
||||
col_time_key time NOT NULL,
|
||||
col_varchar_key varchar(1) NOT NULL,
|
||||
col_varchar_nokey varchar(1) NOT NULL,
|
||||
PRIMARY KEY (pk),
|
||||
KEY col_int_key (col_int_key),
|
||||
KEY col_time_key (col_time_key),
|
||||
KEY col_varchar_key (col_varchar_key,col_int_key)
|
||||
) ENGINE=MyISAM;
|
||||
CREATE TABLE t2 (
|
||||
pk int NOT NULL AUTO_INCREMENT,
|
||||
col_int_nokey int NOT NULL,
|
||||
col_int_key int NOT NULL,
|
||||
col_time_key time NOT NULL,
|
||||
col_varchar_key varchar(1) NOT NULL,
|
||||
col_varchar_nokey varchar(1) NOT NULL,
|
||||
PRIMARY KEY (pk),
|
||||
KEY col_int_key (col_int_key),
|
||||
KEY col_time_key (col_time_key),
|
||||
KEY col_varchar_key (col_varchar_key,col_int_key)
|
||||
) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES (1,4,4,'00:00:00','b','b');
|
||||
SET @var2:=4, @var3:=8;
|
||||
|
||||
Testcase without inner subquery
|
||||
EXPLAIN SELECT @var3:=12, sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key + NULL) IS NULL OR
|
||||
sq4_alias1.col_varchar_key = @var3;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
SELECT @var3:=12, sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key + NULL) IS NULL OR
|
||||
sq4_alias1.col_varchar_key = @var3;
|
||||
@var3:=12 pk col_int_nokey col_int_key col_time_key col_varchar_key col_varchar_nokey
|
||||
SELECT @var3;
|
||||
@var3
|
||||
8
|
||||
EXPLAIN SELECT * FROM ( SELECT @var3:=12, sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key + NULL) IS NULL OR
|
||||
sq4_alias1.col_varchar_key = @var3 ) AS alias3;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE <derived2> system NULL NULL NULL NULL 0 const row not found
|
||||
2 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
SELECT * FROM ( SELECT @var3:=12, sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key + NULL) IS NULL OR
|
||||
sq4_alias1.col_varchar_key = @var3 ) AS alias3;
|
||||
@var3:=12 pk col_int_nokey col_int_key col_time_key col_varchar_key col_varchar_nokey
|
||||
SELECT @var3;
|
||||
@var3
|
||||
8
|
||||
|
||||
Testcase with inner subquery; crashed WL#6095
|
||||
SET @var3=8;
|
||||
EXPLAIN SELECT sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key , sq4_alias1.col_varchar_nokey)
|
||||
NOT IN
|
||||
(SELECT c_sq1_alias1.col_varchar_key AS c_sq1_field1,
|
||||
c_sq1_alias1.col_varchar_nokey AS c_sq1_field2
|
||||
FROM t2 AS c_sq1_alias1
|
||||
WHERE (c_sq1_alias1.col_int_nokey != @var2
|
||||
OR c_sq1_alias1.pk != @var3));
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
2 DEPENDENT SUBQUERY c_sq1_alias1 system PRIMARY NULL NULL NULL 1
|
||||
SELECT sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key , sq4_alias1.col_varchar_nokey)
|
||||
NOT IN
|
||||
(SELECT c_sq1_alias1.col_varchar_key AS c_sq1_field1,
|
||||
c_sq1_alias1.col_varchar_nokey AS c_sq1_field2
|
||||
FROM t2 AS c_sq1_alias1
|
||||
WHERE (c_sq1_alias1.col_int_nokey != @var2
|
||||
OR c_sq1_alias1.pk != @var3));
|
||||
pk col_int_nokey col_int_key col_time_key col_varchar_key col_varchar_nokey
|
||||
EXPLAIN SELECT * FROM ( SELECT sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key , sq4_alias1.col_varchar_nokey)
|
||||
NOT IN
|
||||
(SELECT c_sq1_alias1.col_varchar_key AS c_sq1_field1,
|
||||
c_sq1_alias1.col_varchar_nokey AS c_sq1_field2
|
||||
FROM t2 AS c_sq1_alias1
|
||||
WHERE (c_sq1_alias1.col_int_nokey != @var2
|
||||
OR c_sq1_alias1.pk != @var3)) ) AS alias3;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
3 DEPENDENT SUBQUERY c_sq1_alias1 system PRIMARY NULL NULL NULL 1
|
||||
SELECT * FROM ( SELECT sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key , sq4_alias1.col_varchar_nokey)
|
||||
NOT IN
|
||||
(SELECT c_sq1_alias1.col_varchar_key AS c_sq1_field1,
|
||||
c_sq1_alias1.col_varchar_nokey AS c_sq1_field2
|
||||
FROM t2 AS c_sq1_alias1
|
||||
WHERE (c_sq1_alias1.col_int_nokey != @var2
|
||||
OR c_sq1_alias1.pk != @var3)) ) AS alias3;
|
||||
pk col_int_nokey col_int_key col_time_key col_varchar_key col_varchar_nokey
|
||||
DROP TABLE t1,t2;
|
||||
End of 5.2 tests
|
||||
#
|
||||
# BUG#779885: Crash in eliminate_item_equal with materialization=on in
|
||||
|
@ -6055,6 +6055,116 @@ WHERE (col_varchar_nokey, 'x') IN
|
||||
col_int_nokey
|
||||
1
|
||||
DROP TABLE ot,it1,it2;
|
||||
#
|
||||
# MDEV-746
|
||||
# Bug#13651009 WRONG RESULT FROM DERIVED TABLE IF THE SUBQUERY
|
||||
# HAS AN EMPTY RESULT
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
pk int NOT NULL,
|
||||
col_int_nokey int NOT NULL,
|
||||
col_int_key int NOT NULL,
|
||||
col_time_key time NOT NULL,
|
||||
col_varchar_key varchar(1) NOT NULL,
|
||||
col_varchar_nokey varchar(1) NOT NULL,
|
||||
PRIMARY KEY (pk),
|
||||
KEY col_int_key (col_int_key),
|
||||
KEY col_time_key (col_time_key),
|
||||
KEY col_varchar_key (col_varchar_key,col_int_key)
|
||||
) ENGINE=MyISAM;
|
||||
CREATE TABLE t2 (
|
||||
pk int NOT NULL AUTO_INCREMENT,
|
||||
col_int_nokey int NOT NULL,
|
||||
col_int_key int NOT NULL,
|
||||
col_time_key time NOT NULL,
|
||||
col_varchar_key varchar(1) NOT NULL,
|
||||
col_varchar_nokey varchar(1) NOT NULL,
|
||||
PRIMARY KEY (pk),
|
||||
KEY col_int_key (col_int_key),
|
||||
KEY col_time_key (col_time_key),
|
||||
KEY col_varchar_key (col_varchar_key,col_int_key)
|
||||
) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES (1,4,4,'00:00:00','b','b');
|
||||
SET @var2:=4, @var3:=8;
|
||||
|
||||
Testcase without inner subquery
|
||||
EXPLAIN SELECT @var3:=12, sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key + NULL) IS NULL OR
|
||||
sq4_alias1.col_varchar_key = @var3;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
SELECT @var3:=12, sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key + NULL) IS NULL OR
|
||||
sq4_alias1.col_varchar_key = @var3;
|
||||
@var3:=12 pk col_int_nokey col_int_key col_time_key col_varchar_key col_varchar_nokey
|
||||
SELECT @var3;
|
||||
@var3
|
||||
8
|
||||
EXPLAIN SELECT * FROM ( SELECT @var3:=12, sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key + NULL) IS NULL OR
|
||||
sq4_alias1.col_varchar_key = @var3 ) AS alias3;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE <derived2> system NULL NULL NULL NULL 0 const row not found
|
||||
2 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
SELECT * FROM ( SELECT @var3:=12, sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key + NULL) IS NULL OR
|
||||
sq4_alias1.col_varchar_key = @var3 ) AS alias3;
|
||||
@var3:=12 pk col_int_nokey col_int_key col_time_key col_varchar_key col_varchar_nokey
|
||||
SELECT @var3;
|
||||
@var3
|
||||
8
|
||||
|
||||
Testcase with inner subquery; crashed WL#6095
|
||||
SET @var3=8;
|
||||
EXPLAIN SELECT sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key , sq4_alias1.col_varchar_nokey)
|
||||
NOT IN
|
||||
(SELECT c_sq1_alias1.col_varchar_key AS c_sq1_field1,
|
||||
c_sq1_alias1.col_varchar_nokey AS c_sq1_field2
|
||||
FROM t2 AS c_sq1_alias1
|
||||
WHERE (c_sq1_alias1.col_int_nokey != @var2
|
||||
OR c_sq1_alias1.pk != @var3));
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
2 DEPENDENT SUBQUERY c_sq1_alias1 system PRIMARY NULL NULL NULL 1
|
||||
SELECT sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key , sq4_alias1.col_varchar_nokey)
|
||||
NOT IN
|
||||
(SELECT c_sq1_alias1.col_varchar_key AS c_sq1_field1,
|
||||
c_sq1_alias1.col_varchar_nokey AS c_sq1_field2
|
||||
FROM t2 AS c_sq1_alias1
|
||||
WHERE (c_sq1_alias1.col_int_nokey != @var2
|
||||
OR c_sq1_alias1.pk != @var3));
|
||||
pk col_int_nokey col_int_key col_time_key col_varchar_key col_varchar_nokey
|
||||
EXPLAIN SELECT * FROM ( SELECT sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key , sq4_alias1.col_varchar_nokey)
|
||||
NOT IN
|
||||
(SELECT c_sq1_alias1.col_varchar_key AS c_sq1_field1,
|
||||
c_sq1_alias1.col_varchar_nokey AS c_sq1_field2
|
||||
FROM t2 AS c_sq1_alias1
|
||||
WHERE (c_sq1_alias1.col_int_nokey != @var2
|
||||
OR c_sq1_alias1.pk != @var3)) ) AS alias3;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
3 DEPENDENT SUBQUERY c_sq1_alias1 system PRIMARY NULL NULL NULL 1
|
||||
SELECT * FROM ( SELECT sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key , sq4_alias1.col_varchar_nokey)
|
||||
NOT IN
|
||||
(SELECT c_sq1_alias1.col_varchar_key AS c_sq1_field1,
|
||||
c_sq1_alias1.col_varchar_nokey AS c_sq1_field2
|
||||
FROM t2 AS c_sq1_alias1
|
||||
WHERE (c_sq1_alias1.col_int_nokey != @var2
|
||||
OR c_sq1_alias1.pk != @var3)) ) AS alias3;
|
||||
pk col_int_nokey col_int_key col_time_key col_varchar_key col_varchar_nokey
|
||||
DROP TABLE t1,t2;
|
||||
End of 5.2 tests
|
||||
#
|
||||
# BUG#779885: Crash in eliminate_item_equal with materialization=on in
|
||||
|
@ -498,4 +498,36 @@ DROP TABLE t1;
|
||||
#
|
||||
SET @bug12408412=1;
|
||||
SELECT GROUP_CONCAT(@bug12408412 ORDER BY 1) INTO @bug12408412;
|
||||
CREATE TABLE t1(a INT);
|
||||
INSERT INTO t1 VALUES (0);
|
||||
SELECT DISTINCT POW(COUNT(*), @a:=(SELECT 1 FROM t1 LEFT JOIN t1 AS t2 ON @a))
|
||||
AS b FROM t1 GROUP BY a;
|
||||
b
|
||||
1
|
||||
SELECT @a;
|
||||
@a
|
||||
1
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1(f1 INT, f2 INT);
|
||||
INSERT INTO t1 VALUES (1,2),(2,3),(3,1);
|
||||
CREATE TABLE t2(a INT);
|
||||
INSERT INTO t2 VALUES (1);
|
||||
SET @var=NULL;
|
||||
SELECT @var:=(SELECT f2 FROM t2 WHERE @var) FROM t1 GROUP BY f1 ORDER BY f2 DESC
|
||||
LIMIT 1;
|
||||
@var:=(SELECT f2 FROM t2 WHERE @var)
|
||||
NULL
|
||||
SELECT @var;
|
||||
@var
|
||||
NULL
|
||||
DROP TABLE t1, t2;
|
||||
CREATE TABLE t1(a INT);
|
||||
INSERT INTO t1 VALUES (0),(1),(3);
|
||||
SELECT DISTINCT POW(COUNT(distinct a), @a:=(SELECT 1 FROM t1 LEFT JOIN t1 AS t2 ON @a limit 1)) AS b FROM t1 GROUP BY a;
|
||||
b
|
||||
1
|
||||
SELECT @a;
|
||||
@a
|
||||
1
|
||||
DROP TABLE t1;
|
||||
End of 5.5 tests
|
||||
|
@ -1999,4 +1999,4 @@ connection slave;
|
||||
SET @@GLOBAL.CONCURRENT_INSERT= @OLD_SLAVE_CONCURRENT_INSERT;
|
||||
|
||||
connection default;
|
||||
source suite/federated/include/federated_cleanup.inc;
|
||||
source include/federated_cleanup.inc;
|
||||
|
@ -382,6 +382,26 @@ INSERT INTO t1 VALUES('A ', 'A ');
|
||||
ERROR 23000: Duplicate entry 'A -A ' for key 'key1'
|
||||
DROP TABLE t1;
|
||||
End of 5.0 tests
|
||||
#
|
||||
# MDEV-568 (AKA LP BUG#1007981, AKA MySQL bug#44771)
|
||||
# Wrong result for a hash index look-up if the index is unique and
|
||||
# the key is NULL
|
||||
#
|
||||
CREATE TABLE t1 ( pk INT PRIMARY KEY, val INT, UNIQUE KEY USING HASH(val)) ENGINE=MEMORY;
|
||||
INSERT INTO t1 VALUES (1, NULL);
|
||||
INSERT INTO t1 VALUES (2, NULL);
|
||||
INSERT INTO t1 VALUES (3, 1);
|
||||
INSERT INTO t1 VALUES (4, NULL);
|
||||
EXPLAIN SELECT * FROM t1 WHERE val IS NULL;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref val val 5 const 1 Using where
|
||||
SELECT * FROM t1 WHERE val IS NULL;
|
||||
pk val
|
||||
4 NULL
|
||||
2 NULL
|
||||
1 NULL
|
||||
drop table t1;
|
||||
End of 5.2 tests
|
||||
# bit index in heap tables
|
||||
create table t1 (a bit(63) not null) engine=heap;
|
||||
insert into t1 values (869751),(736494),(226312),(802616),(728912);
|
||||
|
@ -285,6 +285,23 @@ DROP TABLE t1;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-568 (AKA LP BUG#1007981, AKA MySQL bug#44771)
|
||||
--echo # Wrong result for a hash index look-up if the index is unique and
|
||||
--echo # the key is NULL
|
||||
--echo #
|
||||
CREATE TABLE t1 ( pk INT PRIMARY KEY, val INT, UNIQUE KEY USING HASH(val)) ENGINE=MEMORY;
|
||||
|
||||
INSERT INTO t1 VALUES (1, NULL);
|
||||
INSERT INTO t1 VALUES (2, NULL);
|
||||
INSERT INTO t1 VALUES (3, 1);
|
||||
INSERT INTO t1 VALUES (4, NULL);
|
||||
EXPLAIN SELECT * FROM t1 WHERE val IS NULL;
|
||||
SELECT * FROM t1 WHERE val IS NULL;
|
||||
drop table t1;
|
||||
|
||||
--echo End of 5.2 tests
|
||||
|
||||
-- echo # bit index in heap tables
|
||||
|
||||
create table t1 (a bit(63) not null) engine=heap;
|
||||
|
@ -1,4 +1,6 @@
|
||||
|
||||
--source include/not_embedded.inc
|
||||
|
||||
if (!$ADT_NULL_SO) {
|
||||
skip No NULL_AUDIT plugin;
|
||||
}
|
||||
|
@ -108,3 +108,44 @@ select * from t1;
|
||||
|
||||
drop table t1,t2;
|
||||
drop procedure p1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug mdev-3845: values of virtual columns are not computed for triggers
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (
|
||||
a INTEGER UNSIGNED NULL DEFAULT NULL,
|
||||
b INTEGER UNSIGNED GENERATED ALWAYS AS (a) VIRTUAL
|
||||
);
|
||||
|
||||
CREATE TABLE t2 (c INTEGER UNSIGNED NOT NULL);
|
||||
|
||||
DELIMITER |;
|
||||
|
||||
CREATE TRIGGER t1_ins_aft
|
||||
AFTER INSERT
|
||||
ON t1
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
INSERT INTO t2 (c) VALUES (NEW.b);
|
||||
END |
|
||||
|
||||
CREATE TRIGGER t1_del_bef
|
||||
BEFORE DELETE
|
||||
ON t1
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
INSERT INTO t2 (c) VALUES (OLD.b);
|
||||
END |
|
||||
|
||||
DELIMITER ;|
|
||||
|
||||
INSERT INTO t1 (a) VALUES (1), (2), (3);
|
||||
SELECT * FROM t2;
|
||||
DELETE FROM t1;
|
||||
SELECT * FROM t2;
|
||||
|
||||
DROP TRIGGER t1_ins_aft;
|
||||
DROP TRIGGER t1_del_bef;
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
|
@ -85,3 +85,43 @@ a b c
|
||||
300 30 30
|
||||
drop table t1,t2;
|
||||
drop procedure p1;
|
||||
#
|
||||
# Bug mdev-3845: values of virtual columns are not computed for triggers
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
a INTEGER UNSIGNED NULL DEFAULT NULL,
|
||||
b INTEGER UNSIGNED GENERATED ALWAYS AS (a) VIRTUAL
|
||||
);
|
||||
CREATE TABLE t2 (c INTEGER UNSIGNED NOT NULL);
|
||||
CREATE TRIGGER t1_ins_aft
|
||||
AFTER INSERT
|
||||
ON t1
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
INSERT INTO t2 (c) VALUES (NEW.b);
|
||||
END |
|
||||
CREATE TRIGGER t1_del_bef
|
||||
BEFORE DELETE
|
||||
ON t1
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
INSERT INTO t2 (c) VALUES (OLD.b);
|
||||
END |
|
||||
INSERT INTO t1 (a) VALUES (1), (2), (3);
|
||||
SELECT * FROM t2;
|
||||
c
|
||||
1
|
||||
2
|
||||
3
|
||||
DELETE FROM t1;
|
||||
SELECT * FROM t2;
|
||||
c
|
||||
1
|
||||
2
|
||||
3
|
||||
1
|
||||
2
|
||||
3
|
||||
DROP TRIGGER t1_ins_aft;
|
||||
DROP TRIGGER t1_del_bef;
|
||||
DROP TABLE t1,t2;
|
||||
|
@ -85,3 +85,43 @@ a b c
|
||||
300 30 30
|
||||
drop table t1,t2;
|
||||
drop procedure p1;
|
||||
#
|
||||
# Bug mdev-3845: values of virtual columns are not computed for triggers
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
a INTEGER UNSIGNED NULL DEFAULT NULL,
|
||||
b INTEGER UNSIGNED GENERATED ALWAYS AS (a) VIRTUAL
|
||||
);
|
||||
CREATE TABLE t2 (c INTEGER UNSIGNED NOT NULL);
|
||||
CREATE TRIGGER t1_ins_aft
|
||||
AFTER INSERT
|
||||
ON t1
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
INSERT INTO t2 (c) VALUES (NEW.b);
|
||||
END |
|
||||
CREATE TRIGGER t1_del_bef
|
||||
BEFORE DELETE
|
||||
ON t1
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
INSERT INTO t2 (c) VALUES (OLD.b);
|
||||
END |
|
||||
INSERT INTO t1 (a) VALUES (1), (2), (3);
|
||||
SELECT * FROM t2;
|
||||
c
|
||||
1
|
||||
2
|
||||
3
|
||||
DELETE FROM t1;
|
||||
SELECT * FROM t2;
|
||||
c
|
||||
1
|
||||
2
|
||||
3
|
||||
1
|
||||
2
|
||||
3
|
||||
DROP TRIGGER t1_ins_aft;
|
||||
DROP TRIGGER t1_del_bef;
|
||||
DROP TABLE t1,t2;
|
||||
|
@ -212,5 +212,65 @@ INSERT INTO t1 VALUES ( (SELECT 1 FROM ( SELECT * FROM t1 ) as a) );
|
||||
drop table t1;
|
||||
set optimizer_switch=@save_optimizer_switch;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-3801 Reproducible sub select join crash on 5.3.8 and 5.3.9
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (
|
||||
pk int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
a char(2) DEFAULT NULL,
|
||||
PRIMARY KEY (pk),
|
||||
KEY a (a)
|
||||
) ENGINE=MyISAM;
|
||||
INSERT INTO t1 (a)
|
||||
VALUES (NULL),(NULL),(NULL),('AB'),(NULL),('CD'),(NULL),(NULL);
|
||||
INSERT INTO t1 SELECT NULL, a1.a FROM t1 a1, t1 a2, t1 a3, t1 a4, t1 a5;
|
||||
|
||||
CREATE TABLE t2 (
|
||||
pk int(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY
|
||||
) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL);
|
||||
INSERT INTO t2 SELECT NULL FROM t2 a1, t2 a2, t2 a3, t2 a4, t2 a5;
|
||||
|
||||
CREATE TABLE t3 (
|
||||
pk int(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY
|
||||
) ENGINE=MyISAM;
|
||||
INSERT INTO t3 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL);
|
||||
INSERT INTO t3 SELECT NULL FROM t3 a1, t3 a2, t3 a3, t3 a4, t3 a5;
|
||||
|
||||
CREATE TABLE t4 (
|
||||
a char(2) NOT NULL DEFAULT '',
|
||||
PRIMARY KEY (a)
|
||||
) ENGINE=MyISAM;
|
||||
INSERT INTO t4 VALUES ('CD');
|
||||
|
||||
set @@tmp_table_size=8192;
|
||||
|
||||
--replace_column 9 #
|
||||
EXPLAIN
|
||||
SELECT * FROM t3 AS tx JOIN t2 AS ty ON (tx.pk = ty.pk)
|
||||
WHERE
|
||||
tx.pk IN
|
||||
(SELECT *
|
||||
FROM (SELECT DISTINCT ta.pk
|
||||
FROM t3 AS ta
|
||||
JOIN t2 AS tb ON (ta.pk = tb.pk)
|
||||
JOIN t1 AS tc ON (tb.pk = tc.pk)
|
||||
JOIN t4 AS td ON tc.a = td.a) tu)
|
||||
limit 10;
|
||||
|
||||
SELECT * FROM t3 AS tX JOIN t2 AS tY ON (tX.pk = tY.pk)
|
||||
WHERE
|
||||
tX.pk IN
|
||||
(SELECT *
|
||||
FROM (SELECT DISTINCT tA.pk
|
||||
FROM t3 AS tA
|
||||
JOIN t2 AS tB ON (tA.pk = tB.pk)
|
||||
JOIN t1 AS tC ON (tB.pk = tC.pk)
|
||||
JOIN t4 AS tD ON tC.a = tD.a) tU)
|
||||
limit 10;
|
||||
|
||||
drop table t1, t2, t3, t4;
|
||||
|
||||
# The following command must be the last one the file
|
||||
set optimizer_switch=@exit_optimizer_switch;
|
||||
|
@ -1469,6 +1469,20 @@ WHERE a = (
|
||||
GROUP BY 1;
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
#
|
||||
# MDEV-736 LP:1004615 - Unexpected warnings "Encountered illegal value '' when converting to DECIMAL" on a query with aggregate functions and GROUP BY
|
||||
#
|
||||
|
||||
FLUSH STATUS; # this test case *must* use Aria temp tables
|
||||
|
||||
CREATE TABLE t1 (f1 INT, f2 decimal(20,1), f3 blob);
|
||||
INSERT INTO t1 values(11,NULL,'blob'),(11,NULL,'blob');
|
||||
SELECT f3, MIN(f2) FROM t1 GROUP BY f1 LIMIT 1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo the value below *must* be 1
|
||||
show status like 'Created_tmp_disk_tables';
|
||||
|
||||
--echo # End of 5.3 tests
|
||||
|
||||
--echo #
|
||||
|
@ -1444,6 +1444,17 @@ SELECT length(CAST(b AS CHAR)) FROM ubig;
|
||||
|
||||
DROP TABLE ubig;
|
||||
|
||||
#
|
||||
# Bug #13889741: HANDLE_FATAL_SIGNAL IN _DB_ENTER_ | HANDLE_FATAL_SIGNAL IN STRNLEN
|
||||
#
|
||||
select 1 from information_schema.tables where table_schema=repeat('a', 2000);
|
||||
grant usage on *.* to mysqltest_1@localhost;
|
||||
connect (con1, localhost, mysqltest_1,,);
|
||||
connection con1;
|
||||
select 1 from information_schema.tables where table_schema=repeat('a', 2000);
|
||||
connection default;
|
||||
disconnect con1;
|
||||
drop user mysqltest_1@localhost;
|
||||
|
||||
--echo End of 5.1 tests.
|
||||
|
||||
|
@ -15,6 +15,7 @@ show tables;
|
||||
# Bug#18925: subqueries with MIN/MAX functions on INFORMATION_SCHEMA
|
||||
#
|
||||
|
||||
--sorted_result
|
||||
SELECT t.table_name, c1.column_name
|
||||
FROM information_schema.tables t
|
||||
INNER JOIN
|
||||
@ -29,6 +30,7 @@ SELECT t.table_name, c1.column_name
|
||||
c2.table_name = t.table_name AND
|
||||
c2.column_name LIKE '%SCHEMA%'
|
||||
) order by t.table_name;
|
||||
--sorted_result
|
||||
SELECT t.table_name, c1.column_name
|
||||
FROM information_schema.tables t
|
||||
INNER JOIN
|
||||
|
@ -2395,6 +2395,14 @@ SELECT 1 FROM t1 WHERE b < SOME
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo
|
||||
--echo MDEV-612 Valgrind error in ha_maria::check_if_incompatible_data
|
||||
--echo
|
||||
|
||||
CREATE TABLE t1 (a INT, b INT, KEY(a)) ENGINE=Aria PARTITION BY KEY(a) PARTITIONS 2;
|
||||
ALTER TABLE t1 ADD KEY (b);
|
||||
drop table t1;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
||||
--echo #
|
||||
|
@ -675,6 +675,64 @@ SELECT Name, Country, Population FROM City WHERE
|
||||
$cond;
|
||||
|
||||
set optimizer_switch=@save_optimizer_switch;
|
||||
|
||||
--echo #
|
||||
--echo # Bug mdev-585: range vs index-merge with ORDER BY ... LIMIT n
|
||||
--echo # (LP bug #637962)
|
||||
--echo #
|
||||
|
||||
DROP INDEX CountryPopulation ON City;
|
||||
DROP INDEX CountryName ON City;
|
||||
DROP INDEX CityName on City;
|
||||
|
||||
CREATE INDEX Name ON City(Name);
|
||||
CREATE INDEX Population ON City(Population);
|
||||
|
||||
|
||||
--replace_column 9 #
|
||||
EXPLAIN
|
||||
SELECT * FROM City
|
||||
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H'))
|
||||
AND (Population >= 100000 AND Population < 120000);
|
||||
FLUSH STATUS;
|
||||
SELECT * FROM City
|
||||
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H'))
|
||||
AND (Population >= 100000 AND Population < 120000);
|
||||
SHOW STATUS LIKE 'Handler_read_%';
|
||||
|
||||
|
||||
--replace_column 9 #
|
||||
EXPLAIN
|
||||
SELECT * FROM City
|
||||
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H'))
|
||||
AND (Population >= 100000 AND Population < 120000)
|
||||
ORDER BY Population LIMIT 5;
|
||||
|
||||
FLUSH STATUS;
|
||||
SELECT * FROM City
|
||||
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H'))
|
||||
AND (Population >= 100000 AND Population < 120000)
|
||||
ORDER BY Population LIMIT 5;
|
||||
SHOW STATUS LIKE 'Handler_read_%';
|
||||
|
||||
|
||||
set optimizer_switch='index_merge=off';
|
||||
|
||||
--replace_column 9 #
|
||||
EXPLAIN
|
||||
SELECT * FROM City
|
||||
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H'))
|
||||
AND (Population >= 100000 AND Population < 120000)
|
||||
ORDER BY Population LIMIT 5;
|
||||
|
||||
FLUSH STATUS;
|
||||
SELECT * FROM City
|
||||
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H'))
|
||||
AND (Population >= 100000 AND Population < 120000)
|
||||
ORDER BY Population LIMIT 5;
|
||||
SHOW STATUS LIKE 'Handler_read_%';
|
||||
|
||||
set optimizer_switch=@save_optimizer_switch;
|
||||
|
||||
|
||||
DROP DATABASE world;
|
||||
|
@ -5078,6 +5078,82 @@ SELECT col_int_nokey FROM ot
|
||||
|
||||
DROP TABLE ot,it1,it2;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-746
|
||||
--echo # Bug#13651009 WRONG RESULT FROM DERIVED TABLE IF THE SUBQUERY
|
||||
--echo # HAS AN EMPTY RESULT
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (
|
||||
pk int NOT NULL,
|
||||
col_int_nokey int NOT NULL,
|
||||
col_int_key int NOT NULL,
|
||||
col_time_key time NOT NULL,
|
||||
col_varchar_key varchar(1) NOT NULL,
|
||||
col_varchar_nokey varchar(1) NOT NULL,
|
||||
PRIMARY KEY (pk),
|
||||
KEY col_int_key (col_int_key),
|
||||
KEY col_time_key (col_time_key),
|
||||
KEY col_varchar_key (col_varchar_key,col_int_key)
|
||||
) ENGINE=MyISAM;
|
||||
|
||||
CREATE TABLE t2 (
|
||||
pk int NOT NULL AUTO_INCREMENT,
|
||||
col_int_nokey int NOT NULL,
|
||||
col_int_key int NOT NULL,
|
||||
col_time_key time NOT NULL,
|
||||
col_varchar_key varchar(1) NOT NULL,
|
||||
col_varchar_nokey varchar(1) NOT NULL,
|
||||
PRIMARY KEY (pk),
|
||||
KEY col_int_key (col_int_key),
|
||||
KEY col_time_key (col_time_key),
|
||||
KEY col_varchar_key (col_varchar_key,col_int_key)
|
||||
) ENGINE=MyISAM;
|
||||
|
||||
INSERT INTO t2 VALUES (1,4,4,'00:00:00','b','b');
|
||||
|
||||
SET @var2:=4, @var3:=8;
|
||||
|
||||
--echo
|
||||
--echo Testcase without inner subquery
|
||||
|
||||
let $subq=
|
||||
SELECT @var3:=12, sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key + NULL) IS NULL OR
|
||||
sq4_alias1.col_varchar_key = @var3;
|
||||
|
||||
eval EXPLAIN $subq;
|
||||
eval $subq;
|
||||
SELECT @var3;
|
||||
|
||||
# Now as derived table:
|
||||
eval EXPLAIN SELECT * FROM ( $subq ) AS alias3;
|
||||
eval SELECT * FROM ( $subq ) AS alias3;
|
||||
SELECT @var3;
|
||||
|
||||
--echo
|
||||
--echo Testcase with inner subquery; crashed WL#6095
|
||||
SET @var3=8;
|
||||
let $subq=
|
||||
SELECT sq4_alias1.*
|
||||
FROM t1 AS sq4_alias1
|
||||
WHERE (sq4_alias1.col_varchar_key , sq4_alias1.col_varchar_nokey)
|
||||
NOT IN
|
||||
(SELECT c_sq1_alias1.col_varchar_key AS c_sq1_field1,
|
||||
c_sq1_alias1.col_varchar_nokey AS c_sq1_field2
|
||||
FROM t2 AS c_sq1_alias1
|
||||
WHERE (c_sq1_alias1.col_int_nokey != @var2
|
||||
OR c_sq1_alias1.pk != @var3));
|
||||
|
||||
eval EXPLAIN $subq;
|
||||
eval $subq;
|
||||
# Now as derived table:
|
||||
eval EXPLAIN SELECT * FROM ( $subq ) AS alias3;
|
||||
eval SELECT * FROM ( $subq ) AS alias3;
|
||||
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
--echo End of 5.2 tests
|
||||
|
||||
--echo #
|
||||
|
@ -424,4 +424,32 @@ DROP TABLE t1;
|
||||
SET @bug12408412=1;
|
||||
SELECT GROUP_CONCAT(@bug12408412 ORDER BY 1) INTO @bug12408412;
|
||||
|
||||
#
|
||||
# MDEV-616 LP BUG#1002126
|
||||
# Bug #11764371 57196: MORE FUN WITH ASSERTION: !TABLE->FILE ||
|
||||
# TABLE->FILE->INITED == HANDLER::
|
||||
#
|
||||
|
||||
CREATE TABLE t1(a INT);
|
||||
INSERT INTO t1 VALUES (0);
|
||||
SELECT DISTINCT POW(COUNT(*), @a:=(SELECT 1 FROM t1 LEFT JOIN t1 AS t2 ON @a))
|
||||
AS b FROM t1 GROUP BY a;
|
||||
SELECT @a;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1(f1 INT, f2 INT);
|
||||
INSERT INTO t1 VALUES (1,2),(2,3),(3,1);
|
||||
CREATE TABLE t2(a INT);
|
||||
INSERT INTO t2 VALUES (1);
|
||||
SET @var=NULL;
|
||||
SELECT @var:=(SELECT f2 FROM t2 WHERE @var) FROM t1 GROUP BY f1 ORDER BY f2 DESC
|
||||
LIMIT 1;
|
||||
SELECT @var;
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
CREATE TABLE t1(a INT);
|
||||
INSERT INTO t1 VALUES (0),(1),(3);
|
||||
SELECT DISTINCT POW(COUNT(distinct a), @a:=(SELECT 1 FROM t1 LEFT JOIN t1 AS t2 ON @a limit 1)) AS b FROM t1 GROUP BY a;
|
||||
SELECT @a;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.5 tests
|
||||
|
@ -1,4 +1,5 @@
|
||||
/* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
/* Copyright (c) 2000, 2011, Oracle and/or its affiliates.
|
||||
Copyright (c) 2012, Monty Program Ab
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -30,7 +31,7 @@ void pack_dirname(char * to, const char *from)
|
||||
int cwd_err;
|
||||
size_t d_length,length,UNINIT_VAR(buff_length);
|
||||
char * start;
|
||||
char buff[FN_REFLEN];
|
||||
char buff[FN_REFLEN + 1];
|
||||
DBUG_ENTER("pack_dirname");
|
||||
|
||||
(void) intern_filename(to,from); /* Change to intern name */
|
||||
@ -127,7 +128,7 @@ size_t cleanup_dirname(register char *to, const char *from)
|
||||
reg3 char * from_ptr;
|
||||
reg4 char * start;
|
||||
char parent[5], /* for "FN_PARENTDIR" */
|
||||
buff[FN_REFLEN+1],*end_parentdir;
|
||||
buff[FN_REFLEN + 1],*end_parentdir;
|
||||
#ifdef BACKSLASH_MBTAIL
|
||||
CHARSET_INFO *fs= fs_character_set();
|
||||
#endif
|
||||
@ -241,7 +242,7 @@ my_bool my_use_symdir=0; /* Set this if you want to use symdirs */
|
||||
#ifdef USE_SYMDIR
|
||||
void symdirget(char *dir)
|
||||
{
|
||||
char buff[FN_REFLEN+1];
|
||||
char buff[FN_REFLEN + 1];
|
||||
char *pos=strend(dir);
|
||||
if (dir[0] && pos[-1] != FN_DEVCHAR && my_access(dir, F_OK))
|
||||
{
|
||||
@ -291,7 +292,7 @@ void symdirget(char *dir)
|
||||
size_t normalize_dirname(char *to, const char *from)
|
||||
{
|
||||
size_t length;
|
||||
char buff[FN_REFLEN];
|
||||
char buff[FN_REFLEN + 1];
|
||||
DBUG_ENTER("normalize_dirname");
|
||||
|
||||
/*
|
||||
@ -418,7 +419,7 @@ static char * expand_tilde(char **path)
|
||||
size_t unpack_filename(char * to, const char *from)
|
||||
{
|
||||
size_t length, n_length, buff_length;
|
||||
char buff[FN_REFLEN];
|
||||
char buff[FN_REFLEN + 1];
|
||||
DBUG_ENTER("unpack_filename");
|
||||
|
||||
length=dirname_part(buff, from, &buff_length);/* copy & convert dirname */
|
||||
@ -448,7 +449,7 @@ size_t system_filename(char *to, const char *from)
|
||||
char *intern_filename(char *to, const char *from)
|
||||
{
|
||||
size_t length, to_length;
|
||||
char buff[FN_REFLEN];
|
||||
char buff[FN_REFLEN + 1];
|
||||
if (from == to)
|
||||
{ /* Dirname may destroy from */
|
||||
strmov(buff,from);
|
||||
|
@ -261,18 +261,21 @@ int Url_http::send(const char* data, size_t data_length)
|
||||
Extract the first string between <h1>...</h1> tags
|
||||
and put it as a server reply into the error log.
|
||||
*/
|
||||
len= 0;
|
||||
for (;;)
|
||||
{
|
||||
size_t i= vio_read(vio, (uchar*)buf + len, sizeof(buf) - len - 1);
|
||||
size_t i= sizeof(buf) - len - 1;
|
||||
if (i)
|
||||
i= vio_read(vio, (uchar*)buf + len, i);
|
||||
if ((int)i <= 0)
|
||||
break;
|
||||
len+= i;
|
||||
}
|
||||
if (len && len < sizeof(buf))
|
||||
if (len)
|
||||
{
|
||||
char *from;
|
||||
|
||||
buf[len+1]= 0; // safety
|
||||
buf[len]= 0; // safety
|
||||
|
||||
if ((from= strstr(buf, "<h1>")))
|
||||
{
|
||||
|
@ -1,7 +1,7 @@
|
||||
#!/usr/bin/perl
|
||||
# -*- cperl -*-
|
||||
#
|
||||
# Copyright (c) 2007, 2012, Oracle and/or its affiliates
|
||||
# Copyright (c) 2007, 2012, Oracle and/or its affiliates.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
|
@ -1,6 +1,6 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Copyright (c) 2002, 2012, Oracle and/or its affiliates
|
||||
# Copyright (c) 2002, 2012, Oracle and/or its affiliates.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
|
@ -1,4 +1,3 @@
|
||||
|
||||
#!@PERL@
|
||||
# Test of table elimination feature
|
||||
|
||||
@ -93,7 +92,7 @@ $dbh->do("create view elim_current_facts as $select_current_full_facts");
|
||||
|
||||
if ($opt_lock_tables)
|
||||
{
|
||||
do_query($dbh,"LOCK TABLES elim_facts, elim_attr1, elim_attr2 WRITE");
|
||||
do_query($dbh,"LOCK TABLES elim_current_facts WRITE, elim_facts WRITE, elim_attr1 WRITE, elim_attr2 WRITE");
|
||||
}
|
||||
|
||||
if ($opt_fast && defined($server->{vacuum}))
|
||||
@ -200,12 +199,14 @@ if ($opt_lock_tables)
|
||||
|
||||
if ($opt_fast && defined($server->{vacuum}))
|
||||
{
|
||||
$server->vacuum(0,\$dbh,["elim_facts", "elim_attr1", "elim_attr2"]);
|
||||
$server->vacuum(1,\$dbh,"elim_facts");
|
||||
$server->vacuum(1,\$dbh,"elim_attr1");
|
||||
$server->vacuum(1,\$dbh,"elim_attr2");
|
||||
}
|
||||
|
||||
if ($opt_lock_tables)
|
||||
{
|
||||
do_query($dbh,"LOCK TABLES elim_facts, elim_attr1, elim_attr2 WRITE");
|
||||
do_query($dbh,"LOCK TABLES elim_current_facts READ, elim_facts READ, elim_attr1 READ, elim_attr2 READ");
|
||||
}
|
||||
|
||||
####
|
||||
|
@ -4651,8 +4651,8 @@ int ha_partition::common_index_read(uchar *buf, bool have_start_key)
|
||||
bool reverse_order= FALSE;
|
||||
DBUG_ENTER("ha_partition::common_index_read");
|
||||
|
||||
DBUG_PRINT("info", ("m_ordered %u m_ordered_scan_ong %u have_start_key %u",
|
||||
m_ordered, m_ordered_scan_ongoing, have_start_key));
|
||||
DBUG_PRINT("info", ("m_ordered: %u have_start_key: %u",
|
||||
m_ordered, have_start_key));
|
||||
|
||||
if (have_start_key)
|
||||
{
|
||||
|
@ -1569,6 +1569,15 @@ public:
|
||||
:Item_func(b), cached_result_type(INT_RESULT),
|
||||
entry(NULL), entry_thread_id(0), name(a)
|
||||
{}
|
||||
Item_func_set_user_var(Item_func_set_user_var *item)
|
||||
:Item_func(item), cached_result_type(item->cached_result_type),
|
||||
entry(item->entry), entry_thread_id(item->entry_thread_id),
|
||||
value(item->value), decimal_buff(item->decimal_buff),
|
||||
null_item(item->null_item), save_result(item->save_result),
|
||||
name(item->name)
|
||||
{
|
||||
//fixed= 1;
|
||||
}
|
||||
enum Functype functype() const { return SUSERVAR_FUNC; }
|
||||
double val_real();
|
||||
longlong val_int();
|
||||
|
@ -2510,9 +2510,8 @@ Item_sum_hybrid::min_max_update_int_field()
|
||||
void
|
||||
Item_sum_hybrid::min_max_update_decimal_field()
|
||||
{
|
||||
/* TODO: optimize: do not get result_field in case of args[0] is NULL */
|
||||
my_decimal old_val, nr_val;
|
||||
const my_decimal *old_nr= result_field->val_decimal(&old_val);
|
||||
const my_decimal *old_nr;
|
||||
const my_decimal *nr= args[0]->val_decimal(&nr_val);
|
||||
if (!args[0]->null_value)
|
||||
{
|
||||
@ -2520,16 +2519,17 @@ Item_sum_hybrid::min_max_update_decimal_field()
|
||||
old_nr=nr;
|
||||
else
|
||||
{
|
||||
old_nr= result_field->val_decimal(&old_val);
|
||||
bool res= my_decimal_cmp(old_nr, nr) > 0;
|
||||
/* (cmp_sign > 0 && res) || (!(cmp_sign > 0) && !res) */
|
||||
if ((cmp_sign > 0) ^ (!res))
|
||||
old_nr=nr;
|
||||
}
|
||||
result_field->set_notnull();
|
||||
result_field->store_decimal(old_nr);
|
||||
}
|
||||
else if (result_field->is_null(0))
|
||||
result_field->set_null();
|
||||
result_field->store_decimal(old_nr);
|
||||
}
|
||||
|
||||
|
||||
|
24
sql/log.cc
24
sql/log.cc
@ -6961,8 +6961,9 @@ int TC_LOG_MMAP::open(const char *opt_name)
|
||||
|
||||
syncing= 0;
|
||||
active=pages;
|
||||
DBUG_ASSERT(npages >= 2);
|
||||
pool=pages+1;
|
||||
pool_last=pages+npages-1;
|
||||
pool_last_ptr= &((pages+npages-1)->next);
|
||||
commit_ordered_queue= NULL;
|
||||
commit_ordered_queue_busy= false;
|
||||
|
||||
@ -6995,8 +6996,8 @@ void TC_LOG_MMAP::get_active_from_pool()
|
||||
do
|
||||
{
|
||||
best_p= p= &pool;
|
||||
if ((*p)->waiters == 0) // can the first page be used ?
|
||||
break; // yes - take it.
|
||||
if ((*p)->waiters == 0 && (*p)->free > 0) // can the first page be used ?
|
||||
break; // yes - take it.
|
||||
|
||||
best_free=0; // no - trying second strategy
|
||||
for (p=&(*p)->next; *p; p=&(*p)->next)
|
||||
@ -7013,10 +7014,10 @@ void TC_LOG_MMAP::get_active_from_pool()
|
||||
mysql_mutex_assert_owner(&LOCK_active);
|
||||
active=*best_p;
|
||||
|
||||
if ((*best_p)->next) // unlink the page from the pool
|
||||
*best_p=(*best_p)->next;
|
||||
else
|
||||
pool_last=*best_p;
|
||||
/* Unlink the page from the pool. */
|
||||
if (!(*best_p)->next)
|
||||
pool_last_ptr= best_p;
|
||||
*best_p=(*best_p)->next;
|
||||
mysql_mutex_unlock(&LOCK_pool);
|
||||
|
||||
mysql_mutex_lock(&active->lock);
|
||||
@ -7123,12 +7124,9 @@ int TC_LOG_MMAP::log_one_transaction(my_xid xid)
|
||||
mysql_mutex_unlock(&LOCK_active);
|
||||
mysql_mutex_lock(&p->lock);
|
||||
p->waiters++;
|
||||
for (;;)
|
||||
while (p->state == PS_DIRTY && syncing)
|
||||
{
|
||||
int not_dirty = p->state != PS_DIRTY;
|
||||
mysql_mutex_unlock(&p->lock);
|
||||
if (not_dirty || !syncing)
|
||||
break;
|
||||
mysql_cond_wait(&p->cond, &LOCK_sync);
|
||||
mysql_mutex_lock(&p->lock);
|
||||
}
|
||||
@ -7180,8 +7178,8 @@ int TC_LOG_MMAP::sync()
|
||||
|
||||
/* page is synced. let's move it to the pool */
|
||||
mysql_mutex_lock(&LOCK_pool);
|
||||
pool_last->next=syncing;
|
||||
pool_last=syncing;
|
||||
(*pool_last_ptr)=syncing;
|
||||
pool_last_ptr=&(syncing->next);
|
||||
syncing->next=0;
|
||||
syncing->state= err ? PS_ERROR : PS_POOL;
|
||||
mysql_cond_signal(&COND_pool); // in case somebody's waiting
|
||||
|
@ -134,7 +134,7 @@ class TC_LOG_MMAP: public TC_LOG
|
||||
my_off_t file_length;
|
||||
uint npages, inited;
|
||||
uchar *data;
|
||||
struct st_page *pages, *syncing, *active, *pool, *pool_last;
|
||||
struct st_page *pages, *syncing, *active, *pool, **pool_last_ptr;
|
||||
/*
|
||||
note that, e.g. LOCK_active is only used to protect
|
||||
'active' pointer, to protect the content of the active page
|
||||
|
@ -1633,14 +1633,20 @@ ulong acl_get(const char *host, const char *ip,
|
||||
acl_entry *entry;
|
||||
DBUG_ENTER("acl_get");
|
||||
|
||||
mysql_mutex_lock(&acl_cache->lock);
|
||||
end=strmov((tmp_db=strmov(strmov(key, ip ? ip : "")+1,user)+1),db);
|
||||
tmp_db= strmov(strmov(key, ip ? ip : "") + 1, user) + 1;
|
||||
end= strnmov(tmp_db, db, key + sizeof(key) - tmp_db);
|
||||
|
||||
if (end >= key + sizeof(key)) // db name was truncated
|
||||
DBUG_RETURN(0); // no privileges for an invalid db name
|
||||
|
||||
if (lower_case_table_names)
|
||||
{
|
||||
my_casedn_str(files_charset_info, tmp_db);
|
||||
db=tmp_db;
|
||||
}
|
||||
key_length= (size_t) (end-key);
|
||||
|
||||
mysql_mutex_lock(&acl_cache->lock);
|
||||
if (!db_is_pattern && (entry=(acl_entry*) acl_cache->search((uchar*) key,
|
||||
key_length)))
|
||||
{
|
||||
@ -4954,11 +4960,17 @@ static bool check_grant_db_routine(THD *thd, const char *db, HASH *hash)
|
||||
bool check_grant_db(THD *thd,const char *db)
|
||||
{
|
||||
Security_context *sctx= thd->security_ctx;
|
||||
char helping [SAFE_NAME_LEN + USERNAME_LENGTH+2];
|
||||
char helping [SAFE_NAME_LEN + USERNAME_LENGTH+2], *end;
|
||||
uint len;
|
||||
bool error= TRUE;
|
||||
|
||||
len= (uint) (strmov(strmov(helping, sctx->priv_user) + 1, db) - helping) + 1;
|
||||
end= strmov(helping, sctx->priv_user) + 1;
|
||||
end= strnmov(end, db, helping + sizeof(helping) - end);
|
||||
|
||||
if (end >= helping + sizeof(helping)) // db name was truncated
|
||||
return 1; // no privileges for an invalid db name
|
||||
|
||||
len= (uint) (end - helping) + 1;
|
||||
|
||||
mysql_rwlock_rdlock(&LOCK_grant);
|
||||
|
||||
|
@ -8874,7 +8874,9 @@ fill_record(THD * thd, List<Item> &fields, List<Item> &values,
|
||||
/* Update virtual fields*/
|
||||
thd->abort_on_warning= FALSE;
|
||||
if (vcol_table && vcol_table->vfield &&
|
||||
update_virtual_fields(thd, vcol_table, TRUE))
|
||||
update_virtual_fields(thd, vcol_table,
|
||||
vcol_table->triggers ? VCOL_UPDATE_ALL :
|
||||
VCOL_UPDATE_FOR_WRITE))
|
||||
goto err;
|
||||
thd->abort_on_warning= save_abort_on_warning;
|
||||
thd->no_errors= save_no_errors;
|
||||
@ -8938,7 +8940,9 @@ fill_record_n_invoke_before_triggers(THD *thd, List<Item> &fields,
|
||||
if (item_field && item_field->field &&
|
||||
(table= item_field->field->table) &&
|
||||
table->vfield)
|
||||
result= update_virtual_fields(thd, table, TRUE);
|
||||
result= update_virtual_fields(thd, table,
|
||||
table->triggers ? VCOL_UPDATE_ALL :
|
||||
VCOL_UPDATE_FOR_WRITE);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
@ -9022,7 +9026,10 @@ fill_record(THD *thd, Field **ptr, List<Item> &values, bool ignore_errors,
|
||||
}
|
||||
/* Update virtual fields*/
|
||||
thd->abort_on_warning= FALSE;
|
||||
if (table->vfield && update_virtual_fields(thd, table, TRUE))
|
||||
if (table->vfield &&
|
||||
update_virtual_fields(thd, table,
|
||||
table->triggers ? VCOL_UPDATE_ALL :
|
||||
VCOL_UPDATE_FOR_WRITE))
|
||||
goto err;
|
||||
thd->abort_on_warning= abort_on_warning_saved;
|
||||
DBUG_RETURN(thd->is_error());
|
||||
@ -9075,7 +9082,9 @@ fill_record_n_invoke_before_triggers(THD *thd, Field **ptr,
|
||||
{
|
||||
TABLE *table= (*ptr)->table;
|
||||
if (table->vfield)
|
||||
result= update_virtual_fields(thd, table, TRUE);
|
||||
result= update_virtual_fields(thd, table,
|
||||
table->triggers ? VCOL_UPDATE_ALL :
|
||||
VCOL_UPDATE_FOR_WRITE);
|
||||
}
|
||||
return result;
|
||||
|
||||
|
@ -303,7 +303,8 @@ TABLE *find_table_for_mdl_upgrade(THD *thd, const char *db,
|
||||
bool no_error);
|
||||
void mark_tmp_table_for_reuse(TABLE *table);
|
||||
bool check_if_table_exists(THD *thd, TABLE_LIST *table, bool *exists);
|
||||
int update_virtual_fields(THD *thd, TABLE *table, bool ignore_stored= FALSE);
|
||||
int update_virtual_fields(THD *thd, TABLE *table,
|
||||
enum enum_vcol_update_mode vcol_update_mode= VCOL_UPDATE_FOR_READ);
|
||||
int dynamic_column_error_message(enum_dyncol_func_result rc);
|
||||
|
||||
extern TABLE *unused_tables;
|
||||
|
@ -328,7 +328,9 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
|
||||
! thd->is_error())
|
||||
{
|
||||
if (table->vfield)
|
||||
update_virtual_fields(thd, table);
|
||||
update_virtual_fields(thd, table,
|
||||
table->triggers ? VCOL_UPDATE_ALL :
|
||||
VCOL_UPDATE_FOR_READ);
|
||||
thd->examined_row_count++;
|
||||
// thd->is_error() is tested to disallow delete row on error
|
||||
if (!select || select->skip_record(thd) > 0)
|
||||
|
@ -2505,14 +2505,24 @@ void reinit_stmt_before_use(THD *thd, LEX *lex)
|
||||
*/
|
||||
if (sl->prep_where)
|
||||
{
|
||||
sl->where= sl->prep_where->copy_andor_structure(thd);
|
||||
/*
|
||||
We need this rollback because memory allocated in
|
||||
copy_andor_structure() will be freed
|
||||
*/
|
||||
thd->change_item_tree((Item**)&sl->where,
|
||||
sl->prep_where->copy_andor_structure(thd));
|
||||
sl->where->cleanup();
|
||||
}
|
||||
else
|
||||
sl->where= NULL;
|
||||
if (sl->prep_having)
|
||||
{
|
||||
sl->having= sl->prep_having->copy_andor_structure(thd);
|
||||
/*
|
||||
We need this rollback because memory allocated in
|
||||
copy_andor_structure() will be freed
|
||||
*/
|
||||
thd->change_item_tree((Item**)&sl->having,
|
||||
sl->prep_having->copy_andor_structure(thd));
|
||||
sl->having->cleanup();
|
||||
}
|
||||
else
|
||||
|
@ -1232,11 +1232,9 @@ JOIN::optimize()
|
||||
DBUG_RETURN(1); // error == -1
|
||||
}
|
||||
if (const_table_map != found_const_table_map &&
|
||||
!(select_options & SELECT_DESCRIBE) &&
|
||||
(!conds ||
|
||||
!(conds->used_tables() & RAND_TABLE_BIT) ||
|
||||
select_lex->master_unit() == &thd->lex->unit)) // upper level SELECT
|
||||
!(select_options & SELECT_DESCRIBE))
|
||||
{
|
||||
// There is at least one empty const table
|
||||
zero_result_cause= "no matching row in const table";
|
||||
DBUG_PRINT("error",("Error: %s", zero_result_cause));
|
||||
error= 0;
|
||||
@ -9143,7 +9141,7 @@ void JOIN::drop_unused_derived_keys()
|
||||
JOIN_TAB *tab;
|
||||
for (tab= first_linear_tab(this, WITHOUT_CONST_TABLES);
|
||||
tab;
|
||||
tab= next_linear_tab(this, tab, WITHOUT_BUSH_ROOTS))
|
||||
tab= next_linear_tab(this, tab, WITH_BUSH_ROOTS))
|
||||
{
|
||||
|
||||
TABLE *table=tab->table;
|
||||
@ -16498,6 +16496,17 @@ int safe_index_read(JOIN_TAB *tab)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Reads content of constant table
|
||||
|
||||
@param tab table
|
||||
@param pos position of table in query plan
|
||||
|
||||
@retval 0 ok, one row was found or one NULL-complemented row was created
|
||||
@retval -1 ok, no row was found and no NULL-complemented row was created
|
||||
@retval 1 error
|
||||
*/
|
||||
|
||||
static int
|
||||
join_read_const_table(JOIN_TAB *tab, POSITION *pos)
|
||||
{
|
||||
@ -16616,6 +16625,16 @@ join_read_const_table(JOIN_TAB *tab, POSITION *pos)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Read a constant table when there is at most one matching row, using a table
|
||||
scan.
|
||||
|
||||
@param tab Table to read
|
||||
|
||||
@retval 0 Row was found
|
||||
@retval -1 Row was not found
|
||||
@retval 1 Got an error (other than row not found) during read
|
||||
*/
|
||||
static int
|
||||
join_read_system(JOIN_TAB *tab)
|
||||
{
|
||||
@ -16648,12 +16667,9 @@ join_read_system(JOIN_TAB *tab)
|
||||
|
||||
@param tab Table to read
|
||||
|
||||
@retval
|
||||
0 Row was found
|
||||
@retval
|
||||
-1 Row was not found
|
||||
@retval
|
||||
1 Got an error (other than row not found) during read
|
||||
@retval 0 Row was found
|
||||
@retval -1 Row was not found
|
||||
@retval 1 Got an error (other than row not found) during read
|
||||
*/
|
||||
|
||||
static int
|
||||
@ -18488,15 +18504,18 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit,
|
||||
*/
|
||||
|
||||
if (quick_type == QUICK_SELECT_I::QS_TYPE_INDEX_MERGE ||
|
||||
quick_type == QUICK_SELECT_I::QS_TYPE_INDEX_INTERSECT ||
|
||||
quick_type == QUICK_SELECT_I::QS_TYPE_INDEX_INTERSECT ||
|
||||
quick_type == QUICK_SELECT_I::QS_TYPE_ROR_UNION ||
|
||||
quick_type == QUICK_SELECT_I::QS_TYPE_ROR_INTERSECT)
|
||||
goto use_filesort;
|
||||
ref_key= select->quick->index;
|
||||
ref_key_parts= select->quick->used_key_parts;
|
||||
ref_key= MAX_KEY;
|
||||
else
|
||||
{
|
||||
ref_key= select->quick->index;
|
||||
ref_key_parts= select->quick->used_key_parts;
|
||||
}
|
||||
}
|
||||
|
||||
if (ref_key >= 0)
|
||||
if (ref_key >= 0 && ref_key != MAX_KEY)
|
||||
{
|
||||
/*
|
||||
We come here when there is a REF key.
|
||||
@ -20593,40 +20612,66 @@ change_to_use_tmp_fields(THD *thd, Item **ref_pointer_array,
|
||||
res_selected_fields.empty();
|
||||
res_all_fields.empty();
|
||||
|
||||
uint i, border= all_fields.elements - elements;
|
||||
for (i= 0; (item= it++); i++)
|
||||
uint border= all_fields.elements - elements;
|
||||
for (uint i= 0; (item= it++); i++)
|
||||
{
|
||||
Field *field;
|
||||
|
||||
if ((item->with_sum_func && item->type() != Item::SUM_FUNC_ITEM) ||
|
||||
(item->type() == Item::FUNC_ITEM &&
|
||||
((Item_func*)item)->functype() == Item_func::SUSERVAR_FUNC))
|
||||
if (item->with_sum_func && item->type() != Item::SUM_FUNC_ITEM)
|
||||
item_field= item;
|
||||
else
|
||||
else if (item->type() == Item::FIELD_ITEM)
|
||||
item_field= item->get_tmp_table_item(thd);
|
||||
else if (item->type() == Item::FUNC_ITEM &&
|
||||
((Item_func*)item)->functype() == Item_func::SUSERVAR_FUNC)
|
||||
{
|
||||
if (item->type() == Item::FIELD_ITEM)
|
||||
field= item->get_tmp_table_field();
|
||||
if (field != NULL)
|
||||
{
|
||||
item_field= item->get_tmp_table_item(thd);
|
||||
/*
|
||||
Replace "@:=<expression>" with "@:=<tmp table column>". Otherwise,
|
||||
we would re-evaluate <expression>, and if expression were
|
||||
a subquery, this would access already-unlocked tables.
|
||||
*/
|
||||
Item_func_set_user_var* suv=
|
||||
new Item_func_set_user_var((Item_func_set_user_var*) item);
|
||||
Item_field *new_field= new Item_field(field);
|
||||
if (!suv || !new_field || suv->fix_fields(thd, (Item**)&suv))
|
||||
DBUG_RETURN(true); // Fatal error
|
||||
((Item *)suv)->name= item->name;
|
||||
/*
|
||||
We are replacing the argument of Item_func_set_user_var after its
|
||||
value has been read. The argument's null_value should be set by
|
||||
now, so we must set it explicitly for the replacement argument
|
||||
since the null_value may be read without any preceeding call to
|
||||
val_*().
|
||||
*/
|
||||
new_field->update_null_value();
|
||||
List<Item> list;
|
||||
list.push_back(new_field);
|
||||
suv->set_arguments(list);
|
||||
item_field= suv;
|
||||
}
|
||||
else if ((field= item->get_tmp_table_field()))
|
||||
{
|
||||
if (item->type() == Item::SUM_FUNC_ITEM && field->table->group)
|
||||
item_field= ((Item_sum*) item)->result_item(field);
|
||||
else
|
||||
item_field= (Item*) new Item_field(field);
|
||||
if (!item_field)
|
||||
DBUG_RETURN(TRUE); // Fatal error
|
||||
else
|
||||
item_field= item;
|
||||
}
|
||||
else if ((field= item->get_tmp_table_field()))
|
||||
{
|
||||
if (item->type() == Item::SUM_FUNC_ITEM && field->table->group)
|
||||
item_field= ((Item_sum*) item)->result_item(field);
|
||||
else
|
||||
item_field= (Item*) new Item_field(field);
|
||||
if (!item_field)
|
||||
DBUG_RETURN(true); // Fatal error
|
||||
|
||||
if (item->real_item()->type() != Item::FIELD_ITEM)
|
||||
field->orig_table= 0;
|
||||
item_field->name= item->name;
|
||||
if (item->type() == Item::REF_ITEM)
|
||||
{
|
||||
Item_field *ifield= (Item_field *) item_field;
|
||||
Item_ref *iref= (Item_ref *) item;
|
||||
ifield->table_name= iref->table_name;
|
||||
ifield->db_name= iref->db_name;
|
||||
}
|
||||
if (item->real_item()->type() != Item::FIELD_ITEM)
|
||||
field->orig_table= 0;
|
||||
item_field->name= item->name;
|
||||
if (item->type() == Item::REF_ITEM)
|
||||
{
|
||||
Item_field *ifield= (Item_field *) item_field;
|
||||
Item_ref *iref= (Item_ref *) item;
|
||||
ifield->table_name= iref->table_name;
|
||||
ifield->db_name= iref->db_name;
|
||||
}
|
||||
#ifndef DBUG_OFF
|
||||
if (!item_field->name)
|
||||
{
|
||||
@ -20638,20 +20683,20 @@ change_to_use_tmp_fields(THD *thd, Item **ref_pointer_array,
|
||||
item_field->name= sql_strmake(str.ptr(),str.length());
|
||||
}
|
||||
#endif
|
||||
}
|
||||
else
|
||||
item_field= item;
|
||||
}
|
||||
else
|
||||
item_field= item;
|
||||
|
||||
res_all_fields.push_back(item_field);
|
||||
ref_pointer_array[((i < border)? all_fields.elements-i-1 : i-border)]=
|
||||
item_field;
|
||||
}
|
||||
|
||||
List_iterator_fast<Item> itr(res_all_fields);
|
||||
for (i= 0; i < border; i++)
|
||||
for (uint i= 0; i < border; i++)
|
||||
itr++;
|
||||
itr.sublist(res_selected_fields, elements);
|
||||
DBUG_RETURN(FALSE);
|
||||
DBUG_RETURN(false);
|
||||
}
|
||||
|
||||
|
||||
@ -22856,7 +22901,8 @@ test_if_cheaper_ordering(const JOIN_TAB *tab, ORDER *order, TABLE *table,
|
||||
else
|
||||
keys= usable_keys;
|
||||
|
||||
if (ref_key >= 0 && table->covering_keys.is_set(ref_key))
|
||||
if (ref_key >= 0 && ref_key != MAX_KEY &&
|
||||
table->covering_keys.is_set(ref_key))
|
||||
ref_key_quick_rows= table->quick_rows[ref_key];
|
||||
|
||||
if (join)
|
||||
|
@ -3880,8 +3880,9 @@ end:
|
||||
/* Restore original LEX value, statement's arena and THD arena values. */
|
||||
lex_end(thd->lex);
|
||||
|
||||
if (i_s_arena.free_list)
|
||||
i_s_arena.free_items();
|
||||
// Free items, before restoring backup_arena below.
|
||||
DBUG_ASSERT(i_s_arena.free_list == NULL);
|
||||
thd->free_items();
|
||||
|
||||
/*
|
||||
For safety reset list of open temporary tables before closing
|
||||
|
@ -7453,7 +7453,7 @@ copy_data_between_tables(THD *thd, TABLE *from,TABLE *to,
|
||||
}
|
||||
prev_insert_id= to->file->next_insert_id;
|
||||
if (to->vfield)
|
||||
update_virtual_fields(thd, to, TRUE);
|
||||
update_virtual_fields(thd, to, VCOL_UPDATE_FOR_WRITE);
|
||||
if (thd->is_error())
|
||||
{
|
||||
error= 1;
|
||||
|
@ -560,7 +560,9 @@ int mysql_update(THD *thd,
|
||||
while (!(error=info.read_record(&info)) && !thd->killed)
|
||||
{
|
||||
if (table->vfield)
|
||||
update_virtual_fields(thd, table);
|
||||
update_virtual_fields(thd, table,
|
||||
table->triggers ? VCOL_UPDATE_ALL :
|
||||
VCOL_UPDATE_FOR_READ);
|
||||
thd->examined_row_count++;
|
||||
if (!select || (error= select->skip_record(thd)) > 0)
|
||||
{
|
||||
@ -676,7 +678,9 @@ int mysql_update(THD *thd,
|
||||
while (!(error=info.read_record(&info)) && !thd->killed)
|
||||
{
|
||||
if (table->vfield)
|
||||
update_virtual_fields(thd, table);
|
||||
update_virtual_fields(thd, table,
|
||||
table->triggers ? VCOL_UPDATE_ALL :
|
||||
VCOL_UPDATE_FOR_READ);
|
||||
thd->examined_row_count++;
|
||||
if (!select || select->skip_record(thd) > 0)
|
||||
{
|
||||
|
21
sql/table.cc
21
sql/table.cc
@ -6416,22 +6416,25 @@ bool is_simple_order(ORDER *order)
|
||||
|
||||
@param thd Thread handle
|
||||
@param table The TABLE object
|
||||
@param for_write Requests to compute only fields needed for write
|
||||
@param vcol_update_mode Specifies what virtual column are computed
|
||||
|
||||
@details
|
||||
The function computes the values of the virtual columns of the table and
|
||||
stores them in the table record buffer.
|
||||
Only fields from vcol_set are computed, and, when the flag for_write is not
|
||||
set to TRUE, a virtual field is computed only if it's not stored.
|
||||
The flag for_write is set to TRUE for row insert/update operations.
|
||||
|
||||
If vcol_update_mode is set to VCOL_UPDATE_ALL then all virtual column are
|
||||
computed. Otherwise, only fields from vcol_set are computed: all of them,
|
||||
if vcol_update_mode is set to VCOL_UPDATE_FOR_WRITE, and, only those with
|
||||
the stored_in_db flag set to false, if vcol_update_mode is equal to
|
||||
VCOL_UPDATE_FOR_READ.
|
||||
|
||||
@retval
|
||||
0 Success
|
||||
@retval
|
||||
>0 Error occurred when storing a virtual field value
|
||||
*/
|
||||
|
||||
int update_virtual_fields(THD *thd, TABLE *table, bool for_write)
|
||||
int update_virtual_fields(THD *thd, TABLE *table,
|
||||
enum enum_vcol_update_mode vcol_update_mode)
|
||||
{
|
||||
DBUG_ENTER("update_virtual_fields");
|
||||
Field **vfield_ptr, *vfield;
|
||||
@ -6444,9 +6447,9 @@ int update_virtual_fields(THD *thd, TABLE *table, bool for_write)
|
||||
{
|
||||
vfield= (*vfield_ptr);
|
||||
DBUG_ASSERT(vfield->vcol_info && vfield->vcol_info->expr_item);
|
||||
/* Only update those fields that are marked in the vcol_set bitmap */
|
||||
if (bitmap_is_set(table->vcol_set, vfield->field_index) &&
|
||||
(for_write || !vfield->stored_in_db))
|
||||
if ((bitmap_is_set(table->vcol_set, vfield->field_index) &&
|
||||
(vcol_update_mode == VCOL_UPDATE_FOR_WRITE || !vfield->stored_in_db)) ||
|
||||
vcol_update_mode == VCOL_UPDATE_ALL)
|
||||
{
|
||||
/* Compute the actual value of the virtual fields */
|
||||
error= vfield->vcol_info->expr_item->save_in_field(vfield, 0);
|
||||
|
@ -299,6 +299,13 @@ enum tmp_table_type
|
||||
};
|
||||
enum release_type { RELEASE_NORMAL, RELEASE_WAIT_FOR_DROP };
|
||||
|
||||
enum enum_vcol_update_mode
|
||||
{
|
||||
VCOL_UPDATE_FOR_READ= 0,
|
||||
VCOL_UPDATE_FOR_WRITE,
|
||||
VCOL_UPDATE_ALL
|
||||
};
|
||||
|
||||
typedef struct st_filesort_info
|
||||
{
|
||||
IO_CACHE *io_cache; /* If sorted through filesort */
|
||||
|
@ -65,7 +65,7 @@ int heap_rkey(HP_INFO *info, uchar *record, int inx, const uchar *key,
|
||||
info->update= HA_STATE_NO_KEY;
|
||||
DBUG_RETURN(my_errno);
|
||||
}
|
||||
if (!(keyinfo->flag & HA_NOSAME))
|
||||
if ((keyinfo->flag & (HA_NOSAME | HA_NULL_PART_KEY)) != HA_NOSAME)
|
||||
memcpy(info->lastkey, key, (size_t) keyinfo->length);
|
||||
}
|
||||
memcpy(record, pos, (size_t) share->reclength);
|
||||
|
@ -3263,6 +3263,7 @@ btr_compress(
|
||||
|
||||
if (adjust) {
|
||||
nth_rec = page_rec_get_n_recs_before(btr_cur_get_rec(cursor));
|
||||
ut_ad(nth_rec > 0);
|
||||
}
|
||||
|
||||
/* Decide the page to which we try to merge and which will inherit
|
||||
@ -3498,6 +3499,7 @@ func_exit:
|
||||
mem_heap_free(heap);
|
||||
|
||||
if (adjust) {
|
||||
ut_ad(nth_rec > 0);
|
||||
btr_cur_position(
|
||||
index,
|
||||
page_rec_get_nth(merge_block->frame, nth_rec),
|
||||
@ -4011,8 +4013,22 @@ btr_index_page_validate(
|
||||
{
|
||||
page_cur_t cur;
|
||||
ibool ret = TRUE;
|
||||
#ifndef DBUG_OFF
|
||||
ulint nth = 1;
|
||||
#endif /* !DBUG_OFF */
|
||||
|
||||
page_cur_set_before_first(block, &cur);
|
||||
|
||||
/* Directory slot 0 should only contain the infimum record. */
|
||||
DBUG_EXECUTE_IF("check_table_rec_next",
|
||||
ut_a(page_rec_get_nth_const(
|
||||
page_cur_get_page(&cur), 0)
|
||||
== cur.rec);
|
||||
ut_a(page_dir_slot_get_n_owned(
|
||||
page_dir_get_nth_slot(
|
||||
page_cur_get_page(&cur), 0))
|
||||
== 1););
|
||||
|
||||
page_cur_move_to_next(&cur);
|
||||
|
||||
for (;;) {
|
||||
@ -4026,6 +4042,16 @@ btr_index_page_validate(
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
/* Verify that page_rec_get_nth_const() is correctly
|
||||
retrieving each record. */
|
||||
DBUG_EXECUTE_IF("check_table_rec_next",
|
||||
ut_a(cur.rec == page_rec_get_nth_const(
|
||||
page_cur_get_page(&cur),
|
||||
page_rec_get_n_recs_before(
|
||||
cur.rec)));
|
||||
ut_a(nth++ == page_rec_get_n_recs_before(
|
||||
cur.rec)););
|
||||
|
||||
page_cur_move_to_next(&cur);
|
||||
}
|
||||
|
||||
|
@ -1902,6 +1902,7 @@ page_cur_delete_rec(
|
||||
|
||||
/* Save to local variables some data associated with current_rec */
|
||||
cur_slot_no = page_dir_find_owner_slot(current_rec);
|
||||
ut_ad(cur_slot_no > 0);
|
||||
cur_dir_slot = page_dir_get_nth_slot(page, cur_slot_no);
|
||||
cur_n_owned = page_dir_slot_get_n_owned(cur_dir_slot);
|
||||
|
||||
|
@ -796,8 +796,8 @@ zip_reorganize:
|
||||
/* Before copying, "ret" was the predecessor
|
||||
of the predefined supremum record. If it was
|
||||
the predefined infimum record, then it would
|
||||
still be the infimum. Thus, the assertion
|
||||
ut_a(ret_pos > 0) would fail here. */
|
||||
still be the infimum, and we would have
|
||||
ret_pos == 0. */
|
||||
|
||||
if (UNIV_UNLIKELY
|
||||
(!page_zip_reorganize(new_block, index, mtr))) {
|
||||
@ -1052,6 +1052,7 @@ page_delete_rec_list_end(
|
||||
|
||||
n_owned = rec_get_n_owned_new(rec2) - count;
|
||||
slot_index = page_dir_find_owner_slot(rec2);
|
||||
ut_ad(slot_index > 0);
|
||||
slot = page_dir_get_nth_slot(page, slot_index);
|
||||
} else {
|
||||
rec_t* rec2 = rec;
|
||||
@ -1067,6 +1068,7 @@ page_delete_rec_list_end(
|
||||
|
||||
n_owned = rec_get_n_owned_old(rec2) - count;
|
||||
slot_index = page_dir_find_owner_slot(rec2);
|
||||
ut_ad(slot_index > 0);
|
||||
slot = page_dir_get_nth_slot(page, slot_index);
|
||||
}
|
||||
|
||||
@ -1471,6 +1473,10 @@ page_rec_get_nth_const(
|
||||
ulint n_owned;
|
||||
const rec_t* rec;
|
||||
|
||||
if (nth == 0) {
|
||||
return(page_get_infimum_rec(page));
|
||||
}
|
||||
|
||||
ut_ad(nth < UNIV_PAGE_SIZE / (REC_N_NEW_EXTRA_BYTES + 1));
|
||||
|
||||
for (i = 0;; i++) {
|
||||
|
@ -2484,9 +2484,10 @@ int ha_maria::info(uint flag)
|
||||
errkey= maria_info.errkey;
|
||||
my_store_ptr(dup_ref, ref_length, maria_info.dup_key_pos);
|
||||
}
|
||||
/* Faster to always update, than to do it based on flag */
|
||||
stats.update_time= maria_info.update_time;
|
||||
stats.auto_increment_value= maria_info.auto_increment;
|
||||
if (flag & HA_STATUS_TIME)
|
||||
stats.update_time= maria_info.update_time;
|
||||
if (flag & HA_STATUS_AUTO)
|
||||
stats.auto_increment_value= maria_info.auto_increment;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -4669,7 +4669,7 @@ int _ma_read_block_record2(MARIA_HA *info, uchar *record,
|
||||
uchar *data, uchar *end_of_data)
|
||||
{
|
||||
MARIA_SHARE *share= info->s;
|
||||
uchar *UNINIT_VAR(field_length_data), *blob_buffer, *start_of_data;
|
||||
uchar *UNINIT_VAR(field_length_data), *UNINIT_VAR(blob_buffer), *start_of_data;
|
||||
uint flag, null_bytes, cur_null_bytes, row_extents, field_lengths;
|
||||
my_bool found_blob= 0;
|
||||
MARIA_EXTENT_CURSOR extent;
|
||||
@ -4677,8 +4677,6 @@ int _ma_read_block_record2(MARIA_HA *info, uchar *record,
|
||||
MARIA_ROW *cur_row= &info->cur_row;
|
||||
DBUG_ENTER("_ma_read_block_record2");
|
||||
|
||||
LINT_INIT(blob_buffer);
|
||||
|
||||
start_of_data= data;
|
||||
flag= (uint) (uchar) data[0];
|
||||
cur_null_bytes= share->base.original_null_bytes;
|
||||
@ -5106,6 +5104,7 @@ int _ma_read_block_record(MARIA_HA *info, uchar *record,
|
||||
uchar *data, *end_of_data, *buff;
|
||||
uint offset;
|
||||
uint block_size= share->block_size;
|
||||
int ret;
|
||||
DBUG_ENTER("_ma_read_block_record");
|
||||
DBUG_PRINT("enter", ("rowid: %lu page: %lu rownr: %u",
|
||||
(ulong) record_pos,
|
||||
@ -5127,7 +5126,8 @@ int _ma_read_block_record(MARIA_HA *info, uchar *record,
|
||||
my_errno= HA_ERR_RECORD_DELETED; /* File crashed */
|
||||
DBUG_RETURN(HA_ERR_RECORD_DELETED);
|
||||
}
|
||||
DBUG_RETURN(_ma_read_block_record2(info, record, data, end_of_data));
|
||||
ret= _ma_read_block_record2(info, record, data, end_of_data);
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
|
||||
|
||||
|
@ -30,6 +30,7 @@
|
||||
|
||||
int maria_rrnd(MARIA_HA *info, uchar *buf, MARIA_RECORD_POS filepos)
|
||||
{
|
||||
int ret;
|
||||
DBUG_ENTER("maria_rrnd");
|
||||
|
||||
DBUG_ASSERT(filepos != HA_OFFSET_ERROR);
|
||||
@ -40,5 +41,6 @@ int maria_rrnd(MARIA_HA *info, uchar *buf, MARIA_RECORD_POS filepos)
|
||||
DBUG_RETURN(my_errno);
|
||||
|
||||
info->cur_row.lastpos= filepos; /* Remember for update */
|
||||
DBUG_RETURN((*info->s->read_record)(info, buf, filepos));
|
||||
ret= (*info->s->read_record)(info, buf, filepos);
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
|
@ -50,7 +50,7 @@ static ulong pagecache_size=8192*32;
|
||||
static enum data_file_type record_type= DYNAMIC_RECORD;
|
||||
|
||||
static uint keys=MARIA_KEYS,recant=1000;
|
||||
static uint16 key1[1001],key3[5000];
|
||||
static uint16 key1[1001],key3[5001];
|
||||
static uchar record[300],record2[300],key[100],key2[100];
|
||||
static uchar read_record[300],read_record2[300],read_record3[300];
|
||||
static HA_KEYSEG glob_keyseg[MARIA_KEYS][MAX_PARTS];
|
||||
@ -222,7 +222,7 @@ int main(int argc, char *argv[])
|
||||
blob_buffer=0;
|
||||
|
||||
for (i=1000 ; i>0 ; i--) key1[i]=0;
|
||||
for (i=4999 ; i>0 ; i--) key3[i]=0;
|
||||
for (i=5000 ; i>0 ; i--) key3[i]=0;
|
||||
|
||||
if (!silent)
|
||||
printf("- Creating maria-file\n");
|
||||
@ -280,7 +280,7 @@ int main(int argc, char *argv[])
|
||||
if (key3[n3] == 1 && first_key <3 && first_key+keys >= 3)
|
||||
{
|
||||
printf("Error: Didn't get error when writing second key: '%8d'\n",n3);
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
write_count++; key1[n1]++; key3[n3]=1;
|
||||
}
|
||||
@ -341,7 +341,7 @@ int main(int argc, char *argv[])
|
||||
key, keyinfo[0].seg[0].length))
|
||||
{
|
||||
printf("Found wrong record when searching for key: \"%s\"\n",key);
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
if (opt_delete == (uint) remove_count) /* While testing */
|
||||
goto end;
|
||||
@ -394,7 +394,7 @@ int main(int argc, char *argv[])
|
||||
printf("Found wrong record when searching for key: \"%s\"; Found \"%.*s\"\n",
|
||||
key, keyinfo[0].seg[0].length,
|
||||
read_record+keyinfo[0].seg[0].start);
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
if (use_blob)
|
||||
{
|
||||
@ -455,7 +455,7 @@ int main(int argc, char *argv[])
|
||||
if (memcmp(read_record,read_record2,reclength) != 0)
|
||||
{
|
||||
printf("maria_rsame didn't find same record\n");
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
info.recpos=maria_position(file);
|
||||
if (maria_rfirst(file,read_record2,0) ||
|
||||
@ -463,7 +463,7 @@ int main(int argc, char *argv[])
|
||||
memcmp(read_record,read_record2,reclength) != 0)
|
||||
{
|
||||
printf("maria_rsame_with_pos didn't find same record\n");
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
{
|
||||
int skr;
|
||||
@ -484,7 +484,7 @@ int main(int argc, char *argv[])
|
||||
if (ant != dupp_keys)
|
||||
{
|
||||
printf("next: Found: %d keys of %d\n",ant,dupp_keys);
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
ant=0;
|
||||
while (maria_rprev(file,read_record3,0) == 0 &&
|
||||
@ -492,7 +492,7 @@ int main(int argc, char *argv[])
|
||||
if (ant != dupp_keys)
|
||||
{
|
||||
printf("prev: Found: %d records of %d\n",ant,dupp_keys);
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
|
||||
/* Check of maria_rnext_same */
|
||||
@ -504,7 +504,7 @@ int main(int argc, char *argv[])
|
||||
if (ant != dupp_keys || my_errno != HA_ERR_END_OF_FILE)
|
||||
{
|
||||
printf("maria_rnext_same: Found: %d records of %d\n",ant,dupp_keys);
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
}
|
||||
|
||||
@ -531,7 +531,7 @@ int main(int argc, char *argv[])
|
||||
printf("Can't find last record\n");
|
||||
DBUG_DUMP("record2", read_record2, reclength);
|
||||
DBUG_DUMP("record3", read_record3, reclength);
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
ant=1;
|
||||
while (maria_rprev(file,read_record3,0) == 0 && ant < write_count+10)
|
||||
@ -539,12 +539,12 @@ int main(int argc, char *argv[])
|
||||
if (ant != write_count - opt_delete)
|
||||
{
|
||||
printf("prev: I found: %d records of %d\n",ant,write_count);
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
if (bcmp(read_record,read_record3,reclength))
|
||||
{
|
||||
printf("Can't find first record\n");
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
|
||||
if (!silent)
|
||||
@ -585,7 +585,7 @@ int main(int argc, char *argv[])
|
||||
if (bcmp(read_record+start,key,(uint) i))
|
||||
{
|
||||
puts("Didn't find right record");
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -605,7 +605,7 @@ int main(int argc, char *argv[])
|
||||
if (ant != dupp_keys-1)
|
||||
{
|
||||
printf("next: I can only find: %d keys of %d\n",ant,dupp_keys-1);
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
}
|
||||
if (dupp_keys>4)
|
||||
@ -623,7 +623,7 @@ int main(int argc, char *argv[])
|
||||
if (ant != dupp_keys-2)
|
||||
{
|
||||
printf("next: I can only find: %d keys of %d\n",ant,dupp_keys-2);
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
}
|
||||
if (dupp_keys > 6)
|
||||
@ -643,7 +643,7 @@ int main(int argc, char *argv[])
|
||||
if (ant != dupp_keys-3)
|
||||
{
|
||||
printf("next: I can only find: %d keys of %d\n",ant,dupp_keys-3);
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
|
||||
if (!silent)
|
||||
@ -658,7 +658,7 @@ int main(int argc, char *argv[])
|
||||
if (ant != dupp_keys-4)
|
||||
{
|
||||
printf("next: I can only find: %d keys of %d\n",ant,dupp_keys-4);
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
}
|
||||
|
||||
@ -687,7 +687,7 @@ int main(int argc, char *argv[])
|
||||
if (i != write_count && i != write_count - opt_delete)
|
||||
{
|
||||
printf("Found wrong number of rows while scanning table\n");
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
|
||||
if (maria_rsame_with_pos(file,read_record,0,info.recpos))
|
||||
@ -695,7 +695,7 @@ int main(int argc, char *argv[])
|
||||
if (bcmp(read_record,read_record2,reclength) != 0)
|
||||
{
|
||||
printf("maria_rsame_with_pos didn't find same record\n");
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
|
||||
for (i=min(2,keys) ; i-- > 0 ;)
|
||||
@ -704,7 +704,7 @@ int main(int argc, char *argv[])
|
||||
if (bcmp(read_record,read_record2,reclength) != 0)
|
||||
{
|
||||
printf("maria_rsame didn't find same record\n");
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
}
|
||||
if (!silent)
|
||||
@ -731,7 +731,7 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
printf("maria_records_range returned %ld; Should be about %ld\n",
|
||||
(long) range_records,(long) info.records);
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
if (verbose)
|
||||
{
|
||||
@ -768,7 +768,7 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
printf("maria_records_range for key: %d returned %lu; Should be about %lu\n",
|
||||
i, (ulong) range_records, (ulong) records);
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
if (verbose && records)
|
||||
{
|
||||
@ -783,13 +783,13 @@ int main(int argc, char *argv[])
|
||||
if (!silent)
|
||||
printf("- maria_info\n");
|
||||
maria_status(file,&info,HA_STATUS_VARIABLE | HA_STATUS_CONST);
|
||||
if (info.records != write_count-opt_delete || info.deleted > opt_delete + update
|
||||
|| info.keys != keys)
|
||||
if (info.records != write_count-opt_delete ||
|
||||
info.deleted > opt_delete + update || info.keys != keys)
|
||||
{
|
||||
puts("Wrong info from maria_info");
|
||||
printf("Got: records: %lu delete: %lu i_keys: %d\n",
|
||||
(ulong) info.records, (ulong) info.deleted, info.keys);
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
if (verbose)
|
||||
{
|
||||
@ -828,7 +828,7 @@ int main(int argc, char *argv[])
|
||||
printf("scan with cache: I can only find: %d records of %d\n",
|
||||
ant,write_count-opt_delete);
|
||||
maria_scan_end(file);
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
if (maria_extra(file,HA_EXTRA_NO_CACHE,0))
|
||||
{
|
||||
@ -848,7 +848,7 @@ int main(int argc, char *argv[])
|
||||
printf("scan with cache: I can only find: %d records of %d\n",
|
||||
ant,write_count-opt_delete);
|
||||
maria_scan_end(file);
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
maria_scan_end(file);
|
||||
|
||||
@ -872,7 +872,7 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
printf("maria_rrnd didn't advance filepointer; old: %ld, new: %ld\n",
|
||||
(long) lastpos, (long) info.recpos);
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
lastpos=info.recpos;
|
||||
if (error == 0)
|
||||
@ -897,7 +897,7 @@ int main(int argc, char *argv[])
|
||||
printf("Found blob with wrong info at %ld\n",(long) lastpos);
|
||||
maria_scan_end(file);
|
||||
my_errno= 0;
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -920,7 +920,7 @@ int main(int argc, char *argv[])
|
||||
printf("Deleted only %d of %d records (%d parts)\n",opt_delete,write_count,
|
||||
found_parts);
|
||||
maria_scan_end(file);
|
||||
goto err;
|
||||
goto err2;
|
||||
}
|
||||
if (testflag == 6)
|
||||
goto end;
|
||||
@ -1021,10 +1021,11 @@ reads: %10lu\n",
|
||||
return(0);
|
||||
err:
|
||||
printf("got error: %d when using MARIA-database\n",my_errno);
|
||||
err2:
|
||||
if (file)
|
||||
{
|
||||
if (maria_commit(file))
|
||||
goto err;
|
||||
printf("got error: %d when using MARIA-database\n",my_errno);
|
||||
maria_close(file);
|
||||
}
|
||||
maria_end();
|
||||
|
@ -1170,7 +1170,7 @@ int decimal2longlong(const decimal_t *from, longlong *to)
|
||||
|
||||
And for -1234567890.1234 it would be
|
||||
|
||||
7E F2 04 37 2D FB 2D
|
||||
7E F2 04 C7 2D FB 2D
|
||||
*/
|
||||
int decimal2bin(const decimal_t *from, uchar *to, int precision, int frac)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user