Commit 316c3378 authored by Oleg Smirnov's avatar Oleg Smirnov

MDEV-33281 Fix code review comments

parent 189c8eb9
...@@ -208,3 +208,30 @@ DROP PACKAGE test.pkg; ...@@ -208,3 +208,30 @@ DROP PACKAGE test.pkg;
# #
# End of 11.4 tests # End of 11.4 tests
# #
#
# Start of 11.7 tests
#
#
# MDEV-33281 Implement optimizer hints like in MySQL
#
SET NAMES utf8mb4;
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (1), (2);
SELECT /*+BKA(a) BKA(å)*/ a.a FROM t1 a, t1 å;
a
1
2
1
2
SELECT a.a, A.a FROM t1 a, t1 A;
ERROR 42000: Not unique table/alias: 'A'
SELECT /*+BKA(a) BKA(A)*/ a.a FROM t1 a;
a
1
2
Warnings:
Warning 4202 Hint BKA("A") is ignored as conflicting/duplicated
DROP TABLE t1;
#
# End of 11.7 tests
#
...@@ -205,3 +205,33 @@ DROP PACKAGE test.pkg; ...@@ -205,3 +205,33 @@ DROP PACKAGE test.pkg;
--echo # --echo #
--echo # End of 11.4 tests --echo # End of 11.4 tests
--echo # --echo #
--echo #
--echo # Start of 11.7 tests
--echo #
--echo #
--echo # MDEV-33281 Implement optimizer hints like in MySQL
--echo #
SET NAMES utf8mb4;
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (1), (2);
# Test that aliases are accent sensitive with lowercase-table-names=1
# Test that table names in hints are also accent sensitive
SELECT /*+BKA(a) BKA(å)*/ a.a FROM t1 a, t1 å;
# Test that aliases are case insensitive with lowercase-table-names=1
--error ER_NONUNIQ_TABLE
SELECT a.a, A.a FROM t1 a, t1 A;
# Test that table names in hints are also case insensitive
SELECT /*+BKA(a) BKA(A)*/ a.a FROM t1 a;
DROP TABLE t1;
--echo #
--echo # End of 11.7 tests
--echo #
...@@ -189,3 +189,28 @@ DROP DATABASE MYSQL; ...@@ -189,3 +189,28 @@ DROP DATABASE MYSQL;
# #
# End of 10.5 tests # End of 10.5 tests
# #
#
# Start of 11.7 tests
#
#
# MDEV-33281 Implement optimizer hints like in MySQL
#
SET NAMES utf8mb4;
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (1), (2);
SELECT /*+BKA(a) BKA(å)*/ a.a, å.a FROM t1 a, t1 å;
a a
1 1
2 1
1 2
2 2
SELECT /*+BKA(a) BKA(A)*/ a.a, A.a FROM t1 a, t1 A;
a a
1 1
2 1
1 2
2 2
DROP TABLE t1;
#
# End of 11.7 tests
#
...@@ -187,3 +187,30 @@ DROP DATABASE MYSQL; ...@@ -187,3 +187,30 @@ DROP DATABASE MYSQL;
--echo # --echo #
--echo # End of 10.5 tests --echo # End of 10.5 tests
--echo # --echo #
--echo #
--echo # Start of 11.7 tests
--echo #
--echo #
--echo # MDEV-33281 Implement optimizer hints like in MySQL
--echo #
SET NAMES utf8mb4;
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (1), (2);
# Test that table aliases are accent sensitive with lowercase-table-names=0
# Test that table names in hints are also accent sensitive
SELECT /*+BKA(a) BKA(å)*/ a.a, å.a FROM t1 a, t1 å;
# Test that table aliases are case sensitive with lowercase-table-names=0
# Test that table names in hints are also case sensitive
SELECT /*+BKA(a) BKA(A)*/ a.a, A.a FROM t1 a, t1 A;
DROP TABLE t1;
--echo #
--echo # End of 11.7 tests
--echo #
This diff is collapsed.
--echo # WL#8017 Infrastructure for Optimizer Hints
--enable_prepare_warnings --enable_prepare_warnings
SET NAMES utf8mb4;
--echo # Testing that index names in hints are accent sensitive case insensitive
CREATE TABLE t1 (a INT, ä INT, INDEX idx_a(a), INDEX idx_ä(ä));
INSERT INTO t1 VALUES (1,1),(2,2);
SELECT /*+ NO_MRR(t1 idx_a) */ a FROM t1;
SELECT /*+ NO_MRR(t1 idx_A) */ a FROM t1;
SELECT /*+ NO_MRR(t1 idx_å) */ a FROM t1;
SELECT /*+ NO_MRR(t1 idx_a, idx_å, idx_A) */ a FROM t1;
DROP TABLE t1;
--echo # Testing that query block names are accent sensitive case insensitive
CREATE TABLE t1 (a INT);
SELECT /*+ QB_NAME(a) BKA(t1@a) BKA(t1@A) */ * FROM t1;
SELECT /*+ QB_NAME(a) BKA(t1@a) BKA(t1@å) */ * FROM t1;
DROP TABLE t1;
CREATE TABLE t1(f1 INT, f2 INT); CREATE TABLE t1(f1 INT, f2 INT);
INSERT INTO t1 VALUES INSERT INTO t1 VALUES
(1,1),(2,2),(3,3); (1,1),(2,2),(3,3);
...@@ -31,7 +47,6 @@ ANALYZE TABLE t1; ...@@ -31,7 +47,6 @@ ANALYZE TABLE t1;
ANALYZE TABLE t2; ANALYZE TABLE t2;
ANALYZE TABLE t3; ANALYZE TABLE t3;
--echo # NO_RANGE_OPTIMIZATION hint testing --echo # NO_RANGE_OPTIMIZATION hint testing
set optimizer_switch=default; set optimizer_switch=default;
...@@ -50,16 +65,44 @@ SHOW STATUS LIKE 'handler_read%'; ...@@ -50,16 +65,44 @@ SHOW STATUS LIKE 'handler_read%';
EXPLAIN EXTENDED SELECT f1 FROM t3 WHERE f1 > 30 AND f1 < 33; EXPLAIN EXTENDED SELECT f1 FROM t3 WHERE f1 > 30 AND f1 < 33;
--echo # Turn off range access for PRIMARY key --echo # Turn off range access for PRIMARY key
--echo # Should use range access by f2_idx key --echo # Should use range access by f2_idx key
EXPLAIN EXTENDED SELECT /*+ NO_RANGE_OPTIMIZATION(t3 PRIMARY) */ f1 FROM t3 WHERE f1 > 30 AND f1 < 33; EXPLAIN EXTENDED SELECT /*+ NO_RANGE_OPTIMIZATION(t3 PRIMARY) */ f1
FROM t3 WHERE f1 > 30 AND f1 < 33;
--echo # Turn off range access for PRIMARY & f2_idx keys --echo # Turn off range access for PRIMARY & f2_idx keys
--echo # Should use index access --echo # Should use index access
EXPLAIN EXTENDED SELECT /*+ NO_RANGE_OPTIMIZATION(t3 PRIMARY, f2_idx) */ f1 FROM t3 WHERE f1 > 30 AND f1 < 33; EXPLAIN EXTENDED SELECT /*+ NO_RANGE_OPTIMIZATION(t3 PRIMARY, f2_idx) */ f1
FROM t3 WHERE f1 > 30 AND f1 < 33;
--echo # Turn off range access for all keys --echo # Turn off range access for all keys
--echo # Should use index access --echo # Should use index access
EXPLAIN EXTENDED SELECT /*+ NO_RANGE_OPTIMIZATION(t3) */ f1 FROM t3 WHERE f1 > 30 AND f1 < 33; EXPLAIN EXTENDED SELECT /*+ NO_RANGE_OPTIMIZATION(t3) */ f1
FROM t3 WHERE f1 > 30 AND f1 < 33;
--echo # Turn off range access for PRIMARY & f2_idx keys --echo # Turn off range access for PRIMARY & f2_idx keys
--echo # Should use index access --echo # Should use index access
EXPLAIN EXTENDED SELECT /*+ NO_RANGE_OPTIMIZATION(t3 PRIMARY) NO_RANGE_OPTIMIZATION(t3 f2_idx) */ f1 FROM t3 WHERE f1 > 30 AND f1 < 33; EXPLAIN EXTENDED SELECT /*+ NO_RANGE_OPTIMIZATION(t3 PRIMARY) NO_RANGE_OPTIMIZATION(t3 f2_idx) */ f1
FROM t3 WHERE f1 > 30 AND f1 < 33;
--echo # Create a clone of t3 with cyrillic names
CREATE TABLE таблица (f1 INT NOT NULL, поле2 INT, поле3 VARCHAR(32),
PRIMARY KEY(f1), KEY f2_индекс(f1), KEY f3_индекс(поле3))
AS SELECT * FROM t3;
ANALYZE TABLE таблица;
--echo # Turn off range access for PRIMARY key
--echo # Should use range access by f2_индекс key
EXPLAIN EXTENDED SELECT /*+ NO_RANGE_OPTIMIZATION(таблица PRIMARY) */ f1
FROM таблица WHERE f1 > 30 AND f1 < 33;
--echo # Turn off range access for PRIMARY & f2_индекс keys
--echo # Should use index access
EXPLAIN EXTENDED SELECT /*+ NO_RANGE_OPTIMIZATION(таблица PRIMARY, f2_индекс) */ f1
FROM таблица WHERE f1 > 30 AND f1 < 33;
--echo # Turn off range access for all keys
--echo # Should use index access
EXPLAIN EXTENDED SELECT /*+ NO_RANGE_OPTIMIZATION(таблица) */ f1
FROM таблица WHERE f1 > 30 AND f1 < 33;
--echo # Turn off range access for PRIMARY & f2_индекс keys
--echo # Should use index access
EXPLAIN EXTENDED
SELECT /*+ NO_RANGE_OPTIMIZATION(таблица PRIMARY) NO_RANGE_OPTIMIZATION(таблица f2_индекс) */ f1
FROM таблица WHERE f1 > 30 AND f1 < 33;
DROP TABLE таблица;
--echo # NO_ICP hint testing --echo # NO_ICP hint testing
set optimizer_switch='index_condition_pushdown=on'; set optimizer_switch='index_condition_pushdown=on';
...@@ -79,6 +122,12 @@ EXPLAIN EXTENDED SELECT /*+ NO_ICP(t5@qb1 x_idx) */ * FROM ...@@ -79,6 +122,12 @@ EXPLAIN EXTENDED SELECT /*+ NO_ICP(t5@qb1 x_idx) */ * FROM
(SELECT /*+ QB_NAME(QB1) */ t4.x, t5.y FROM t4, t4 t5 (SELECT /*+ QB_NAME(QB1) */ t4.x, t5.y FROM t4, t4 t5
WHERE t4.y = 8 AND t5.x BETWEEN 7 AND t4.y+0) AS TD; WHERE t4.y = 8 AND t5.x BETWEEN 7 AND t4.y+0) AS TD;
--echo # Cyrillic query block name
EXPLAIN EXTENDED SELECT /*+ NO_ICP(t5@блок1 x_idx) */ * FROM
(SELECT /*+ QB_NAME(блок1) */ t4.x, t5.y FROM t4, t4 t5
WHERE t4.y = 8 AND t5.x BETWEEN 7 AND t4.y+0) AS TD;
--echo # Expected warning for z_idx key, unresolved name. --echo # Expected warning for z_idx key, unresolved name.
EXPLAIN EXTENDED SELECT * FROM EXPLAIN EXTENDED SELECT * FROM
(SELECT /*+ NO_ICP(t5 y_idx, x_idx, z_idx) */ t4.x, t5.y FROM t4, t4 t5 (SELECT /*+ NO_ICP(t5 y_idx, x_idx, z_idx) */ t4.x, t5.y FROM t4, t4 t5
...@@ -157,7 +206,7 @@ EXPLAIN EXTENDED SELECT /*+ NO_BKA(t12) */ * FROM t12, t13 ...@@ -157,7 +206,7 @@ EXPLAIN EXTENDED SELECT /*+ NO_BKA(t12) */ * FROM t12, t13
EXPLAIN EXTENDED SELECT /*+ QB_NAME(QB1) NO_BKA(t13@QB1) */ * FROM t12, t13 EXPLAIN EXTENDED SELECT /*+ QB_NAME(QB1) NO_BKA(t13@QB1) */ * FROM t12, t13
WHERE t12.a=t13.a AND (t13.b+1 <= t13.b+1); WHERE t12.a=t13.a AND (t13.b+1 <= t13.b+1);
--echo # UPDATE|DELETE|INSERT hint testing --echo # UPDATE|DELETE|INSERT|REPLACE hint testing
EXPLAIN EXTENDED UPDATE t3 EXPLAIN EXTENDED UPDATE t3
SET f3 = 'mnbv' WHERE f1 > 30 AND f1 < 33 AND (t3.f1, t3.f2, t3.f3) IN SET f3 = 'mnbv' WHERE f1 > 30 AND f1 < 33 AND (t3.f1, t3.f2, t3.f3) IN
(SELECT t2.f1, t2.f2, t2.f3 FROM t1,t2 WHERE t1.f1=t2.f1 AND (SELECT t2.f1, t2.f2, t2.f3 FROM t1,t2 WHERE t1.f1=t2.f1 AND
...@@ -207,6 +256,25 @@ EXPLAIN EXTENDED INSERT /*+ NO_ICP(t5@QB1 x_idx) */ INTO t3(f1, f2, f3) ...@@ -207,6 +256,25 @@ EXPLAIN EXTENDED INSERT /*+ NO_ICP(t5@QB1 x_idx) */ INTO t3(f1, f2, f3)
(SELECT /*+ QB_NAME(qb1) */ t4.x, t5.y, 'filler' FROM t4, t4 t5 (SELECT /*+ QB_NAME(qb1) */ t4.x, t5.y, 'filler' FROM t4, t4 t5
WHERE t4.y = 8 AND t5.x BETWEEN 7 AND t4.y+0); WHERE t4.y = 8 AND t5.x BETWEEN 7 AND t4.y+0);
--echo # Make sure ICP is expected to be used when there are no hints
EXPLAIN EXTENDED REPLACE INTO t3(f1, f2, f3)
(SELECT t4.x, t5.y, 'filler' FROM t4, t4 t5 WHERE t4.y = 8 AND t5.x BETWEEN 7 AND t4.y+0);
--echo # Turn off ICP. ICP should not be used.
EXPLAIN EXTENDED REPLACE INTO t3(f1, f2, f3)
(SELECT /*+ NO_ICP(t5) */t4.x, t5.y, 'filler' FROM t4, t4 t5
WHERE t4.y = 8 AND t5.x BETWEEN 7 AND t4.y+0);
--echo # Turn off ICP for a particular table
EXPLAIN EXTENDED REPLACE /*+ NO_ICP(t5@QB1) */ INTO t3(f1, f2, f3)
(SELECT /*+ QB_NAME(qb1) */ t4.x, t5.y, 'filler' FROM t4, t4 t5
WHERE t4.y = 8 AND t5.x BETWEEN 7 AND t4.y+0);
--echo # Turn off ICP for a particular table and a key
EXPLAIN EXTENDED REPLACE /*+ NO_ICP(t5@QB1 x_idx) */ INTO t3(f1, f2, f3)
(SELECT /*+ QB_NAME(qb1) */ t4.x, t5.y, 'filler' FROM t4, t4 t5
WHERE t4.y = 8 AND t5.x BETWEEN 7 AND t4.y+0);
--echo # Misc tests --echo # Misc tests
--echo # Should issue warning --echo # Should issue warning
...@@ -475,7 +543,6 @@ SELECT /*+ NO_ICP ( ) */ 1; ...@@ -475,7 +543,6 @@ SELECT /*+ NO_ICP ( ) */ 1;
SELECT /*+ NO_ICP() */ 1 UNION SELECT 1; SELECT /*+ NO_ICP() */ 1 UNION SELECT 1;
(SELECT /*+ NO_ICP() */ 1) UNION (SELECT 1); (SELECT /*+ NO_ICP() */ 1) UNION (SELECT 1);
--echo # OLEGS: this one does not issue a warning although should:
((SELECT /* + NO_ICP() */ 1)); ((SELECT /* + NO_ICP() */ 1));
UPDATE /*+ NO_ICP() */ t1 SET i = 10; UPDATE /*+ NO_ICP() */ t1 SET i = 10;
......
...@@ -895,7 +895,7 @@ CREATE TABLE t ( ...@@ -895,7 +895,7 @@ CREATE TABLE t (
INSERT INTO t(a,b) VALUES(1,'cccc'); INSERT INTO t(a,b) VALUES(1,'cccc');
let $query= let $query=
SELECT /*+ bka() */ 1 AS c FROM t AS b RIGHT JOIN t AS c ON b.a > c.c SELECT 1 AS c FROM t AS b RIGHT JOIN t AS c ON b.a > c.c
WHERE b.b>c.a; WHERE b.b>c.a;
eval EXPLAIN $query; eval EXPLAIN $query;
eval $query; eval $query;
...@@ -1022,13 +1022,12 @@ VALUES (1, 'j'), (2, 'c'), (0, 'a'); ...@@ -1022,13 +1022,12 @@ VALUES (1, 'j'), (2, 'c'), (0, 'a');
ANALYZE TABLE t1, t2, t3, t4; ANALYZE TABLE t1, t2, t3, t4;
# Hint is added to avoid materialization of the subquery
let query= let query=
SELECT /*+ NO_SEMIJOIN(@subq1) */ t1.c1, t2.i1 SELECT t1.c1, t2.i1
FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2 FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2
WHERE ( t3.pk IN WHERE ( t3.pk IN
( (
SELECT /*+ QB_NAME(subq1) */ t4.i1 SELECT t4.i1
FROM t4 FROM t4
WHERE t4.c1 < 'o' WHERE t4.c1 < 'o'
) )
...@@ -1049,13 +1048,12 @@ if ($support_virtual_index) ...@@ -1049,13 +1048,12 @@ if ($support_virtual_index)
ALTER TABLE t3 ADD INDEX v_idx2 (i2_key, i1); ALTER TABLE t3 ADD INDEX v_idx2 (i2_key, i1);
} }
# Hint is added to avoid materialization of the subquery
let query= let query=
SELECT /*+ NO_SEMIJOIN(@subq1) */ t1.c1, t2.i1 SELECT t1.c1, t2.i1
FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2 FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2
WHERE ( t3.pk IN WHERE ( t3.pk IN
( (
SELECT /*+ QB_NAME(subq1) */ t4.i1 SELECT t4.i1
FROM t4 FROM t4
WHERE t4.c1 < 'o' WHERE t4.c1 < 'o'
) )
...@@ -1079,11 +1077,11 @@ ALTER TABLE t3 DROP INDEX v_idx; ...@@ -1079,11 +1077,11 @@ ALTER TABLE t3 DROP INDEX v_idx;
# Hint is added to avoid materialization of the subquery # Hint is added to avoid materialization of the subquery
let query= let query=
SELECT /*+ NO_SEMIJOIN(@subq1) */ t1.c1, t2.i1 SELECT t1.c1, t2.i1
FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2 FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2
WHERE ( t3.pk IN WHERE ( t3.pk IN
( (
SELECT /*+ QB_NAME(subq1) */ t4.i1 SELECT t4.i1
FROM t4 FROM t4
WHERE t4.c1 < 'o' WHERE t4.c1 < 'o'
) )
...@@ -1117,11 +1115,11 @@ VALUES (10,1), (11,1), (12,1), (13,1), (14,1),(15,1), (16,1),(17,1), (18,1), ...@@ -1117,11 +1115,11 @@ VALUES (10,1), (11,1), (12,1), (13,1), (14,1),(15,1), (16,1),(17,1), (18,1),
--echo # non-covering. --echo # non-covering.
# Hint is added to avoid materialization of the subquery # Hint is added to avoid materialization of the subquery
let query= let query=
SELECT /*+ NO_SEMIJOIN(@subq1) */ t1.c1, t2.i1, t3.i1 SELECT t1.c1, t2.i1, t3.i1
FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2 FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2
WHERE ( t3.pk IN WHERE ( t3.pk IN
( (
SELECT /*+ QB_NAME(subq1) */ t4.i1 SELECT t4.i1
FROM t4 FROM t4
WHERE t4.c1 < 'o' WHERE t4.c1 < 'o'
) )
...@@ -1154,11 +1152,11 @@ eval $query; ...@@ -1154,11 +1152,11 @@ eval $query;
# an extra query condition is added to the subquery. # an extra query condition is added to the subquery.
# Hint is added to avoid materialization of the subquery # Hint is added to avoid materialization of the subquery
let query= let query=
SELECT /*+ NO_SEMIJOIN(@subq1) */ t1.c1, t2.i1 SELECT t1.c1, t2.i1
FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2 FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2
WHERE ( t3.pk IN WHERE ( t3.pk IN
( (
SELECT /*+ QB_NAME(subq1) */ t4.i1 SELECT t4.i1
FROM t4 FROM t4
WHERE t4.c1 < 'o' and t4.i1 < (t2.i1 + 1) WHERE t4.c1 < 'o' and t4.i1 < (t2.i1 + 1)
) )
......
...@@ -444,7 +444,7 @@ Note 1265 Data truncated for column 'c13' at row 1 ...@@ -444,7 +444,7 @@ Note 1265 Data truncated for column 'c13' at row 1
Note 1265 Data truncated for column 'c11' at row 2 Note 1265 Data truncated for column 'c11' at row 2
Note 1265 Data truncated for column 'c13' at row 2 Note 1265 Data truncated for column 'c13' at row 2
CREATE VIEW view_C AS SELECT * FROM C; CREATE VIEW view_C AS SELECT * FROM C;
SELECT /*+ NO_BNL(t1) */ t1.c13 FROM C AS t2 STRAIGHT_JOIN C AS t1 FORCE INDEX(c13); SELECT t1.c13 FROM C AS t2 STRAIGHT_JOIN C AS t1 FORCE INDEX(c13);
c13 c13
00:00:00 00:00:00
00:00:00 00:00:00
......
...@@ -555,12 +555,12 @@ c BLOB GENERATED ALWAYS AS (a+b) VIRTUAL, ...@@ -555,12 +555,12 @@ c BLOB GENERATED ALWAYS AS (a+b) VIRTUAL,
UNIQUE KEY i0008 (a) UNIQUE KEY i0008 (a)
); );
INSERT INTO t(a,b) VALUES(1,'cccc'); INSERT INTO t(a,b) VALUES(1,'cccc');
EXPLAIN SELECT /*+ bka() */ 1 AS c FROM t AS b RIGHT JOIN t AS c ON b.a > c.c EXPLAIN SELECT 1 AS c FROM t AS b RIGHT JOIN t AS c ON b.a > c.c
WHERE b.b>c.a; WHERE b.b>c.a;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE b ALL i0008 NULL NULL NULL 1 1 SIMPLE b ALL i0008 NULL NULL NULL 1
1 SIMPLE c ALL i0008 NULL NULL NULL 1 Range checked for each record (index map: 0x1) 1 SIMPLE c ALL i0008 NULL NULL NULL 1 Range checked for each record (index map: 0x1)
SELECT /*+ bka() */ 1 AS c FROM t AS b RIGHT JOIN t AS c ON b.a > c.c SELECT 1 AS c FROM t AS b RIGHT JOIN t AS c ON b.a > c.c
WHERE b.b>c.a; WHERE b.b>c.a;
c c
Warnings: Warnings:
...@@ -689,11 +689,11 @@ test.t3 analyze status Engine-independent statistics collected ...@@ -689,11 +689,11 @@ test.t3 analyze status Engine-independent statistics collected
test.t3 analyze status OK test.t3 analyze status OK
test.t4 analyze status Engine-independent statistics collected test.t4 analyze status Engine-independent statistics collected
test.t4 analyze status OK test.t4 analyze status OK
EXPLAIN SELECT /*+ NO_SEMIJOIN(@subq1) */ t1.c1, t2.i1 EXPLAIN SELECT t1.c1, t2.i1
FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2 FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2
WHERE ( t3.pk IN WHERE ( t3.pk IN
( (
SELECT /*+ QB_NAME(subq1) */ t4.i1 SELECT t4.i1
FROM t4 FROM t4
WHERE t4.c1 < 'o' WHERE t4.c1 < 'o'
) )
...@@ -704,11 +704,11 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -704,11 +704,11 @@ id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using join buffer (flat, BNL join) 1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using join buffer (flat, BNL join)
1 PRIMARY t3 eq_ref PRIMARY PRIMARY 4 test.t4.i1 1 Using where; End temporary 1 PRIMARY t3 eq_ref PRIMARY PRIMARY 4 test.t4.i1 1 Using where; End temporary
1 PRIMARY t2 ALL NULL NULL NULL NULL 5 Using join buffer (flat, BNL join) 1 PRIMARY t2 ALL NULL NULL NULL NULL 5 Using join buffer (flat, BNL join)
SELECT /*+ NO_SEMIJOIN(@subq1) */ t1.c1, t2.i1 SELECT t1.c1, t2.i1
FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2 FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2
WHERE ( t3.pk IN WHERE ( t3.pk IN
( (
SELECT /*+ QB_NAME(subq1) */ t4.i1 SELECT t4.i1
FROM t4 FROM t4
WHERE t4.c1 < 'o' WHERE t4.c1 < 'o'
) )
...@@ -743,11 +743,11 @@ t 9 ...@@ -743,11 +743,11 @@ t 9
# #
# Test 2: Two alternative covering indexes for the range scan # Test 2: Two alternative covering indexes for the range scan
# #
EXPLAIN SELECT /*+ NO_SEMIJOIN(@subq1) */ t1.c1, t2.i1 EXPLAIN SELECT t1.c1, t2.i1
FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2 FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2
WHERE ( t3.pk IN WHERE ( t3.pk IN
( (
SELECT /*+ QB_NAME(subq1) */ t4.i1 SELECT t4.i1
FROM t4 FROM t4
WHERE t4.c1 < 'o' WHERE t4.c1 < 'o'
) )
...@@ -758,11 +758,11 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -758,11 +758,11 @@ id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using join buffer (flat, BNL join) 1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using join buffer (flat, BNL join)
1 PRIMARY t3 eq_ref PRIMARY PRIMARY 4 test.t4.i1 1 Using where; End temporary 1 PRIMARY t3 eq_ref PRIMARY PRIMARY 4 test.t4.i1 1 Using where; End temporary
1 PRIMARY t2 ALL NULL NULL NULL NULL 5 Using join buffer (flat, BNL join) 1 PRIMARY t2 ALL NULL NULL NULL NULL 5 Using join buffer (flat, BNL join)
SELECT /*+ NO_SEMIJOIN(@subq1) */ t1.c1, t2.i1 SELECT t1.c1, t2.i1
FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2 FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2
WHERE ( t3.pk IN WHERE ( t3.pk IN
( (
SELECT /*+ QB_NAME(subq1) */ t4.i1 SELECT t4.i1
FROM t4 FROM t4
WHERE t4.c1 < 'o' WHERE t4.c1 < 'o'
) )
...@@ -798,11 +798,11 @@ t 9 ...@@ -798,11 +798,11 @@ t 9
# Test 3: One covering index including the base column for the virtual # Test 3: One covering index including the base column for the virtual
# column # column
# #
EXPLAIN SELECT /*+ NO_SEMIJOIN(@subq1) */ t1.c1, t2.i1 EXPLAIN SELECT t1.c1, t2.i1
FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2 FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2
WHERE ( t3.pk IN WHERE ( t3.pk IN
( (
SELECT /*+ QB_NAME(subq1) */ t4.i1 SELECT t4.i1
FROM t4 FROM t4
WHERE t4.c1 < 'o' WHERE t4.c1 < 'o'
) )
...@@ -813,11 +813,11 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -813,11 +813,11 @@ id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using join buffer (flat, BNL join) 1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using join buffer (flat, BNL join)
1 PRIMARY t3 eq_ref PRIMARY PRIMARY 4 test.t4.i1 1 Using where; End temporary 1 PRIMARY t3 eq_ref PRIMARY PRIMARY 4 test.t4.i1 1 Using where; End temporary
1 PRIMARY t2 ALL NULL NULL NULL NULL 5 Using join buffer (flat, BNL join) 1 PRIMARY t2 ALL NULL NULL NULL NULL 5 Using join buffer (flat, BNL join)
SELECT /*+ NO_SEMIJOIN(@subq1) */ t1.c1, t2.i1 SELECT t1.c1, t2.i1
FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2 FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2
WHERE ( t3.pk IN WHERE ( t3.pk IN
( (
SELECT /*+ QB_NAME(subq1) */ t4.i1 SELECT t4.i1
FROM t4 FROM t4
WHERE t4.c1 < 'o' WHERE t4.c1 < 'o'
) )
...@@ -861,11 +861,11 @@ VALUES (10,1), (11,1), (12,1), (13,1), (14,1),(15,1), (16,1),(17,1), (18,1), ...@@ -861,11 +861,11 @@ VALUES (10,1), (11,1), (12,1), (13,1), (14,1),(15,1), (16,1),(17,1), (18,1),
(28,1), (29,1); (28,1), (29,1);
# Change the query to read an extra column (t3.i1) making the index # Change the query to read an extra column (t3.i1) making the index
# non-covering. # non-covering.
EXPLAIN SELECT /*+ NO_SEMIJOIN(@subq1) */ t1.c1, t2.i1, t3.i1 EXPLAIN SELECT t1.c1, t2.i1, t3.i1
FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2 FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2
WHERE ( t3.pk IN WHERE ( t3.pk IN
( (
SELECT /*+ QB_NAME(subq1) */ t4.i1 SELECT t4.i1
FROM t4 FROM t4
WHERE t4.c1 < 'o' WHERE t4.c1 < 'o'
) )
...@@ -876,11 +876,11 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -876,11 +876,11 @@ id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using join buffer (flat, BNL join) 1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using join buffer (flat, BNL join)
1 PRIMARY t3 eq_ref PRIMARY PRIMARY 4 test.t4.i1 1 Using where; End temporary 1 PRIMARY t3 eq_ref PRIMARY PRIMARY 4 test.t4.i1 1 Using where; End temporary
1 PRIMARY t2 ALL NULL NULL NULL NULL 5 Using join buffer (flat, BNL join) 1 PRIMARY t2 ALL NULL NULL NULL NULL 5 Using join buffer (flat, BNL join)
SELECT /*+ NO_SEMIJOIN(@subq1) */ t1.c1, t2.i1, t3.i1 SELECT t1.c1, t2.i1, t3.i1
FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2 FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2
WHERE ( t3.pk IN WHERE ( t3.pk IN
( (
SELECT /*+ QB_NAME(subq1) */ t4.i1 SELECT t4.i1
FROM t4 FROM t4
WHERE t4.c1 < 'o' WHERE t4.c1 < 'o'
) )
...@@ -916,11 +916,11 @@ t 9 48 ...@@ -916,11 +916,11 @@ t 9 48
# Test 5: Test where the added primary key to secondary indexes is # Test 5: Test where the added primary key to secondary indexes is
# used after it has been included in the join buffer # used after it has been included in the join buffer
# #
EXPLAIN SELECT /*+ NO_SEMIJOIN(@subq1) */ t1.c1, t2.i1 EXPLAIN SELECT t1.c1, t2.i1
FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2 FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2
WHERE ( t3.pk IN WHERE ( t3.pk IN
( (
SELECT /*+ QB_NAME(subq1) */ t4.i1 SELECT t4.i1
FROM t4 FROM t4
WHERE t4.c1 < 'o' and t4.i1 < (t2.i1 + 1) WHERE t4.c1 < 'o' and t4.i1 < (t2.i1 + 1)
) )
...@@ -931,11 +931,11 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -931,11 +931,11 @@ id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using join buffer (flat, BNL join) 1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using join buffer (flat, BNL join)
1 PRIMARY t3 eq_ref PRIMARY PRIMARY 4 test.t4.i1 1 Using where 1 PRIMARY t3 eq_ref PRIMARY PRIMARY 4 test.t4.i1 1 Using where
1 PRIMARY t2 ALL NULL NULL NULL NULL 5 Using where; End temporary; Using join buffer (flat, BNL join) 1 PRIMARY t2 ALL NULL NULL NULL NULL 5 Using where; End temporary; Using join buffer (flat, BNL join)
SELECT /*+ NO_SEMIJOIN(@subq1) */ t1.c1, t2.i1 SELECT t1.c1, t2.i1
FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2 FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2
WHERE ( t3.pk IN WHERE ( t3.pk IN
( (
SELECT /*+ QB_NAME(subq1) */ t4.i1 SELECT t4.i1
FROM t4 FROM t4
WHERE t4.c1 < 'o' and t4.i1 < (t2.i1 + 1) WHERE t4.c1 < 'o' and t4.i1 < (t2.i1 + 1)
) )
......
...@@ -1174,14 +1174,14 @@ c BLOB GENERATED ALWAYS AS (a+b) VIRTUAL, ...@@ -1174,14 +1174,14 @@ c BLOB GENERATED ALWAYS AS (a+b) VIRTUAL,
UNIQUE KEY i0008 (a) UNIQUE KEY i0008 (a)
); );
INSERT INTO t(a,b) VALUES(1,'cccc'); INSERT INTO t(a,b) VALUES(1,'cccc');
EXPLAIN SELECT /*+ bka() */ 1 AS c FROM t AS b RIGHT JOIN t AS c ON b.a > c.c EXPLAIN SELECT 1 AS c FROM t AS b RIGHT JOIN t AS c ON b.a > c.c
WHERE b.b>c.a; WHERE b.b>c.a;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
Warnings: Warnings:
Warning 1292 Truncated incorrect DOUBLE value: 'cccc' Warning 1292 Truncated incorrect DOUBLE value: 'cccc'
Warning 1292 Truncated incorrect DECIMAL value: 'cccc' Warning 1292 Truncated incorrect DECIMAL value: 'cccc'
SELECT /*+ bka() */ 1 AS c FROM t AS b RIGHT JOIN t AS c ON b.a > c.c SELECT 1 AS c FROM t AS b RIGHT JOIN t AS c ON b.a > c.c
WHERE b.b>c.a; WHERE b.b>c.a;
c c
Warnings: Warnings:
...@@ -1315,11 +1315,11 @@ test.t3 analyze status Engine-independent statistics collected ...@@ -1315,11 +1315,11 @@ test.t3 analyze status Engine-independent statistics collected
test.t3 analyze status OK test.t3 analyze status OK
test.t4 analyze status Engine-independent statistics collected test.t4 analyze status Engine-independent statistics collected
test.t4 analyze status OK test.t4 analyze status OK
EXPLAIN SELECT /*+ NO_SEMIJOIN(@subq1) */ t1.c1, t2.i1 EXPLAIN SELECT t1.c1, t2.i1
FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2 FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2
WHERE ( t3.pk IN WHERE ( t3.pk IN
( (
SELECT /*+ QB_NAME(subq1) */ t4.i1 SELECT t4.i1
FROM t4 FROM t4
WHERE t4.c1 < 'o' WHERE t4.c1 < 'o'
) )
...@@ -1330,11 +1330,11 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -1330,11 +1330,11 @@ id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using join buffer (flat, BNL join) 1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using join buffer (flat, BNL join)
1 PRIMARY t3 eq_ref PRIMARY,v_idx PRIMARY 4 test.t4.i1 1 Using where; End temporary 1 PRIMARY t3 eq_ref PRIMARY,v_idx PRIMARY 4 test.t4.i1 1 Using where; End temporary
1 PRIMARY t2 ALL NULL NULL NULL NULL 5 Using join buffer (flat, BNL join) 1 PRIMARY t2 ALL NULL NULL NULL NULL 5 Using join buffer (flat, BNL join)
SELECT /*+ NO_SEMIJOIN(@subq1) */ t1.c1, t2.i1 SELECT t1.c1, t2.i1
FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2 FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2
WHERE ( t3.pk IN WHERE ( t3.pk IN
( (
SELECT /*+ QB_NAME(subq1) */ t4.i1 SELECT t4.i1
FROM t4 FROM t4
WHERE t4.c1 < 'o' WHERE t4.c1 < 'o'
) )
...@@ -1370,11 +1370,11 @@ t 9 ...@@ -1370,11 +1370,11 @@ t 9
# Test 2: Two alternative covering indexes for the range scan # Test 2: Two alternative covering indexes for the range scan
# #
ALTER TABLE t3 ADD INDEX v_idx2 (i2_key, i1); ALTER TABLE t3 ADD INDEX v_idx2 (i2_key, i1);
EXPLAIN SELECT /*+ NO_SEMIJOIN(@subq1) */ t1.c1, t2.i1 EXPLAIN SELECT t1.c1, t2.i1
FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2 FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2
WHERE ( t3.pk IN WHERE ( t3.pk IN
( (
SELECT /*+ QB_NAME(subq1) */ t4.i1 SELECT t4.i1
FROM t4 FROM t4
WHERE t4.c1 < 'o' WHERE t4.c1 < 'o'
) )
...@@ -1385,11 +1385,11 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -1385,11 +1385,11 @@ id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using join buffer (flat, BNL join) 1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using join buffer (flat, BNL join)
1 PRIMARY t3 eq_ref PRIMARY,v_idx,v_idx2 PRIMARY 4 test.t4.i1 1 Using where; End temporary 1 PRIMARY t3 eq_ref PRIMARY,v_idx,v_idx2 PRIMARY 4 test.t4.i1 1 Using where; End temporary
1 PRIMARY t2 ALL NULL NULL NULL NULL 5 Using join buffer (flat, BNL join) 1 PRIMARY t2 ALL NULL NULL NULL NULL 5 Using join buffer (flat, BNL join)
SELECT /*+ NO_SEMIJOIN(@subq1) */ t1.c1, t2.i1 SELECT t1.c1, t2.i1
FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2 FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2
WHERE ( t3.pk IN WHERE ( t3.pk IN
( (
SELECT /*+ QB_NAME(subq1) */ t4.i1 SELECT t4.i1
FROM t4 FROM t4
WHERE t4.c1 < 'o' WHERE t4.c1 < 'o'
) )
...@@ -1427,11 +1427,11 @@ t 9 ...@@ -1427,11 +1427,11 @@ t 9
# #
# Drop the index with only the virtual column # Drop the index with only the virtual column
ALTER TABLE t3 DROP INDEX v_idx; ALTER TABLE t3 DROP INDEX v_idx;
EXPLAIN SELECT /*+ NO_SEMIJOIN(@subq1) */ t1.c1, t2.i1 EXPLAIN SELECT t1.c1, t2.i1
FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2 FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2
WHERE ( t3.pk IN WHERE ( t3.pk IN
( (
SELECT /*+ QB_NAME(subq1) */ t4.i1 SELECT t4.i1
FROM t4 FROM t4
WHERE t4.c1 < 'o' WHERE t4.c1 < 'o'
) )
...@@ -1442,11 +1442,11 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -1442,11 +1442,11 @@ id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using join buffer (flat, BNL join) 1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using join buffer (flat, BNL join)
1 PRIMARY t3 eq_ref PRIMARY,v_idx2 PRIMARY 4 test.t4.i1 1 Using where; End temporary 1 PRIMARY t3 eq_ref PRIMARY,v_idx2 PRIMARY 4 test.t4.i1 1 Using where; End temporary
1 PRIMARY t2 ALL NULL NULL NULL NULL 5 Using join buffer (flat, BNL join) 1 PRIMARY t2 ALL NULL NULL NULL NULL 5 Using join buffer (flat, BNL join)
SELECT /*+ NO_SEMIJOIN(@subq1) */ t1.c1, t2.i1 SELECT t1.c1, t2.i1
FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2 FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2
WHERE ( t3.pk IN WHERE ( t3.pk IN
( (
SELECT /*+ QB_NAME(subq1) */ t4.i1 SELECT t4.i1
FROM t4 FROM t4
WHERE t4.c1 < 'o' WHERE t4.c1 < 'o'
) )
...@@ -1493,11 +1493,11 @@ VALUES (10,1), (11,1), (12,1), (13,1), (14,1),(15,1), (16,1),(17,1), (18,1), ...@@ -1493,11 +1493,11 @@ VALUES (10,1), (11,1), (12,1), (13,1), (14,1),(15,1), (16,1),(17,1), (18,1),
(28,1), (29,1); (28,1), (29,1);
# Change the query to read an extra column (t3.i1) making the index # Change the query to read an extra column (t3.i1) making the index
# non-covering. # non-covering.
EXPLAIN SELECT /*+ NO_SEMIJOIN(@subq1) */ t1.c1, t2.i1, t3.i1 EXPLAIN SELECT t1.c1, t2.i1, t3.i1
FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2 FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2
WHERE ( t3.pk IN WHERE ( t3.pk IN
( (
SELECT /*+ QB_NAME(subq1) */ t4.i1 SELECT t4.i1
FROM t4 FROM t4
WHERE t4.c1 < 'o' WHERE t4.c1 < 'o'
) )
...@@ -1508,11 +1508,11 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -1508,11 +1508,11 @@ id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using join buffer (flat, BNL join) 1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using join buffer (flat, BNL join)
1 PRIMARY t3 eq_ref PRIMARY,v_idx PRIMARY 4 test.t4.i1 1 Using where; End temporary 1 PRIMARY t3 eq_ref PRIMARY,v_idx PRIMARY 4 test.t4.i1 1 Using where; End temporary
1 PRIMARY t2 ALL NULL NULL NULL NULL 5 Using join buffer (flat, BNL join) 1 PRIMARY t2 ALL NULL NULL NULL NULL 5 Using join buffer (flat, BNL join)
SELECT /*+ NO_SEMIJOIN(@subq1) */ t1.c1, t2.i1, t3.i1 SELECT t1.c1, t2.i1, t3.i1
FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2 FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2
WHERE ( t3.pk IN WHERE ( t3.pk IN
( (
SELECT /*+ QB_NAME(subq1) */ t4.i1 SELECT t4.i1
FROM t4 FROM t4
WHERE t4.c1 < 'o' WHERE t4.c1 < 'o'
) )
...@@ -1548,11 +1548,11 @@ t 9 48 ...@@ -1548,11 +1548,11 @@ t 9 48
# Test 5: Test where the added primary key to secondary indexes is # Test 5: Test where the added primary key to secondary indexes is
# used after it has been included in the join buffer # used after it has been included in the join buffer
# #
EXPLAIN SELECT /*+ NO_SEMIJOIN(@subq1) */ t1.c1, t2.i1 EXPLAIN SELECT t1.c1, t2.i1
FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2 FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2
WHERE ( t3.pk IN WHERE ( t3.pk IN
( (
SELECT /*+ QB_NAME(subq1) */ t4.i1 SELECT t4.i1
FROM t4 FROM t4
WHERE t4.c1 < 'o' and t4.i1 < (t2.i1 + 1) WHERE t4.c1 < 'o' and t4.i1 < (t2.i1 + 1)
) )
...@@ -1563,11 +1563,11 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -1563,11 +1563,11 @@ id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using join buffer (flat, BNL join) 1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using join buffer (flat, BNL join)
1 PRIMARY t3 eq_ref PRIMARY,v_idx PRIMARY 4 test.t4.i1 1 Using where 1 PRIMARY t3 eq_ref PRIMARY,v_idx PRIMARY 4 test.t4.i1 1 Using where
1 PRIMARY t2 ALL NULL NULL NULL NULL 5 Using where; End temporary; Using join buffer (flat, BNL join) 1 PRIMARY t2 ALL NULL NULL NULL NULL 5 Using where; End temporary; Using join buffer (flat, BNL join)
SELECT /*+ NO_SEMIJOIN(@subq1) */ t1.c1, t2.i1 SELECT t1.c1, t2.i1
FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2 FROM t1 STRAIGHT_JOIN t3 STRAIGHT_JOIN t2
WHERE ( t3.pk IN WHERE ( t3.pk IN
( (
SELECT /*+ QB_NAME(subq1) */ t4.i1 SELECT t4.i1
FROM t4 FROM t4
WHERE t4.c1 < 'o' and t4.i1 < (t2.i1 + 1) WHERE t4.c1 < 'o' and t4.i1 < (t2.i1 + 1)
) )
......
...@@ -429,7 +429,7 @@ INSERT INTO C (c8,c9) VALUES('1970-01-01',0),('1970-01-01',1); ...@@ -429,7 +429,7 @@ INSERT INTO C (c8,c9) VALUES('1970-01-01',0),('1970-01-01',1);
CREATE VIEW view_C AS SELECT * FROM C; CREATE VIEW view_C AS SELECT * FROM C;
SELECT /*+ NO_BNL(t1) */ t1.c13 FROM C AS t2 STRAIGHT_JOIN C AS t1 FORCE INDEX(c13); SELECT t1.c13 FROM C AS t2 STRAIGHT_JOIN C AS t1 FORCE INDEX(c13);
SELECT DISTINCT t1.c13 FROM C AS t1, view_C AS t2; SELECT DISTINCT t1.c13 FROM C AS t1, view_C AS t2;
DROP TABLE C; DROP TABLE C;
......
...@@ -469,7 +469,7 @@ id jid val ...@@ -469,7 +469,7 @@ id jid val
2 1 2 2 1 2
2 2 4 2 2 4
2 3 6 2 3 6
SELECT /*+ JOIN_ORDER(jt, t1) */ id, jt.* SELECT id, jt.*
FROM t1, FROM t1,
JSON_TABLE(jd, '$[*]' COLUMNS (jid FOR ORDINALITY, JSON_TABLE(jd, '$[*]' COLUMNS (jid FOR ORDINALITY,
val INT PATH '$')) AS jt; val INT PATH '$')) AS jt;
...@@ -480,14 +480,14 @@ id jid val ...@@ -480,14 +480,14 @@ id jid val
2 1 2 2 1 2
2 2 4 2 2 4
2 3 6 2 3 6
EXPLAIN SELECT /*+ JOIN_ORDER(jt, t1) */ id, jt.* EXPLAIN SELECT id, jt.*
FROM t1, FROM t1,
JSON_TABLE(jd, '$[*]' COLUMNS (jid FOR ORDINALITY, JSON_TABLE(jd, '$[*]' COLUMNS (jid FOR ORDINALITY,
val INT PATH '$')) AS jt; val INT PATH '$')) AS jt;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 1 SIMPLE t1 ALL NULL NULL NULL NULL 2
1 SIMPLE jt ALL NULL NULL NULL NULL 40 Table function: json_table 1 SIMPLE jt ALL NULL NULL NULL NULL 40 Table function: json_table
SELECT /*+ JOIN_ORDER(t2,jt) */ t1.id, t2.id, jt.* SELECT t1.id, t2.id, jt.*
FROM t1, FROM t1,
JSON_TABLE(t1.jd, '$[*]' COLUMNS (jid FOR ORDINALITY, JSON_TABLE(t1.jd, '$[*]' COLUMNS (jid FOR ORDINALITY,
val INT PATH '$')) AS jt, val INT PATH '$')) AS jt,
...@@ -514,7 +514,7 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -514,7 +514,7 @@ id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 1 SIMPLE t1 ALL NULL NULL NULL NULL 2
1 SIMPLE t2 ALL NULL NULL NULL NULL 2 Using join buffer (flat, BNL join) 1 SIMPLE t2 ALL NULL NULL NULL NULL 2 Using join buffer (flat, BNL join)
1 SIMPLE jt ALL NULL NULL NULL NULL 40 Table function: json_table 1 SIMPLE jt ALL NULL NULL NULL NULL 40 Table function: json_table
EXPLAIN SELECT /*+ JOIN_ORDER(t2,jt) */ t1.id, t2.id, jt.* EXPLAIN SELECT t1.id, t2.id, jt.*
FROM t1, FROM t1,
JSON_TABLE(t1.jd, '$[*]' COLUMNS (jid FOR ORDINALITY, JSON_TABLE(t1.jd, '$[*]' COLUMNS (jid FOR ORDINALITY,
val INT PATH '$')) AS jt, val INT PATH '$')) AS jt,
......
...@@ -379,18 +379,18 @@ INSERT INTO t1 values (1, '[1,3,5]'),(2,'[2,4,6]'); ...@@ -379,18 +379,18 @@ INSERT INTO t1 values (1, '[1,3,5]'),(2,'[2,4,6]');
SELECT id, jt.* FROM t1, SELECT id, jt.* FROM t1,
JSON_TABLE(jd, '$[*]' COLUMNS (jid FOR ORDINALITY, JSON_TABLE(jd, '$[*]' COLUMNS (jid FOR ORDINALITY,
val INT PATH '$')) AS jt; val INT PATH '$')) AS jt;
SELECT /*+ JOIN_ORDER(jt, t1) */ id, jt.* SELECT id, jt.*
FROM t1, FROM t1,
JSON_TABLE(jd, '$[*]' COLUMNS (jid FOR ORDINALITY, JSON_TABLE(jd, '$[*]' COLUMNS (jid FOR ORDINALITY,
val INT PATH '$')) AS jt; val INT PATH '$')) AS jt;
EXPLAIN SELECT /*+ JOIN_ORDER(jt, t1) */ id, jt.* EXPLAIN SELECT id, jt.*
FROM t1, FROM t1,
JSON_TABLE(jd, '$[*]' COLUMNS (jid FOR ORDINALITY, JSON_TABLE(jd, '$[*]' COLUMNS (jid FOR ORDINALITY,
val INT PATH '$')) AS jt; val INT PATH '$')) AS jt;
--sorted_result --sorted_result
SELECT /*+ JOIN_ORDER(t2,jt) */ t1.id, t2.id, jt.* SELECT t1.id, t2.id, jt.*
FROM t1, FROM t1,
JSON_TABLE(t1.jd, '$[*]' COLUMNS (jid FOR ORDINALITY, JSON_TABLE(t1.jd, '$[*]' COLUMNS (jid FOR ORDINALITY,
val INT PATH '$')) AS jt, val INT PATH '$')) AS jt,
...@@ -402,7 +402,7 @@ EXPLAIN SELECT t1.id, t2.id, jt.* ...@@ -402,7 +402,7 @@ EXPLAIN SELECT t1.id, t2.id, jt.*
val INT PATH '$')) AS jt, val INT PATH '$')) AS jt,
t1 AS t2; t1 AS t2;
EXPLAIN SELECT /*+ JOIN_ORDER(t2,jt) */ t1.id, t2.id, jt.* EXPLAIN SELECT t1.id, t2.id, jt.*
FROM t1, FROM t1,
JSON_TABLE(t1.jd, '$[*]' COLUMNS (jid FOR ORDINALITY, JSON_TABLE(t1.jd, '$[*]' COLUMNS (jid FOR ORDINALITY,
val INT PATH '$')) AS jt, val INT PATH '$')) AS jt,
......
This diff is collapsed.
/* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. /* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
Copyright (c) 2024, MariaDB plc.
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
...@@ -53,7 +54,7 @@ enum opt_hints_enum ...@@ -53,7 +54,7 @@ enum opt_hints_enum
struct st_opt_hint_info struct st_opt_hint_info
{ {
const char* hint_name; // Hint name. LEX_CSTRING hint_name; // Hint name.
bool check_upper_lvl; // true if upper level hint check is needed (for hints bool check_upper_lvl; // true if upper level hint check is needed (for hints
// which can be specified on more than one level). // which can be specified on more than one level).
bool switch_hint; // true if hint is not complex. bool switch_hint; // true if hint is not complex.
...@@ -81,7 +82,7 @@ class Opt_hints_map : public Sql_alloc ...@@ -81,7 +82,7 @@ class Opt_hints_map : public Sql_alloc
Check if hint is specified. Check if hint is specified.
@param type_arg hint type @param type_arg hint type
@return true if hint is specified, @return true if hint is specified,
false otherwise false otherwise
*/ */
...@@ -111,15 +112,13 @@ class Opt_hints_map : public Sql_alloc ...@@ -111,15 +112,13 @@ class Opt_hints_map : public Sql_alloc
@return switch value. @return switch value.
*/ */
bool switch_on(opt_hints_enum type_arg) const bool is_switched_on(opt_hints_enum type_arg) const
{ {
return hints.is_set(type_arg); return hints.is_set(type_arg);
} }
}; };
class PT_hint;
class PT_hint_max_execution_time;
class Opt_hints_key; class Opt_hints_key;
...@@ -129,15 +128,16 @@ class Opt_hints_key; ...@@ -129,15 +128,16 @@ class Opt_hints_key;
Opt_hints_global class is hierarchical structure. Opt_hints_global class is hierarchical structure.
It contains information about global hints and also It contains information about global hints and also
conains array of QUERY BLOCK level objects (Opt_hints_qb class). contains array of QUERY BLOCK level objects (Opt_hints_qb class).
Each QUERY BLOCK level object contains array of TABLE level hints Each QUERY BLOCK level object contains array of TABLE level hints
(class Opt_hints_table). Each TABLE level hint contains array of (class Opt_hints_table). Each TABLE level hint contains array of
KEY lelev hints (Opt_hints_key class). KEY level hints (Opt_hints_key class).
Hint information(specified, on|off state) is stored in hints_map object. Hint information(specified, on|off state) is stored in hints_map object.
*/ */
class Opt_hints : public Sql_alloc class Opt_hints : public Sql_alloc
{ {
protected:
/* /*
Name of object referred by the hint. Name of object referred by the hint.
This name is empty for global level, This name is empty for global level,
...@@ -146,6 +146,7 @@ class Opt_hints : public Sql_alloc ...@@ -146,6 +146,7 @@ class Opt_hints : public Sql_alloc
for key level. for key level.
*/ */
Lex_ident_sys name; Lex_ident_sys name;
private:
/* /*
Parent object. There is no parent for global level, Parent object. There is no parent for global level,
for query block level parent is Opt_hints_global object, for query block level parent is Opt_hints_global object,
...@@ -209,9 +210,14 @@ class Opt_hints : public Sql_alloc ...@@ -209,9 +210,14 @@ class Opt_hints : public Sql_alloc
*/ */
bool get_switch(opt_hints_enum type_arg) const; bool get_switch(opt_hints_enum type_arg) const;
virtual const LEX_CSTRING *get_name() const virtual CHARSET_INFO *charset_info() const
{
return Lex_ident_column::charset_info();
}
const LEX_CSTRING get_name() const
{ {
return name.str ? &name : nullptr; return name;
} }
void set_name(const Lex_ident_sys &name_arg) { name= name_arg; } void set_name(const Lex_ident_sys &name_arg) { name= name_arg; }
Opt_hints *get_parent() const { return parent; } Opt_hints *get_parent() const { return parent; }
...@@ -230,25 +236,11 @@ class Opt_hints : public Sql_alloc ...@@ -230,25 +236,11 @@ class Opt_hints : public Sql_alloc
child_array.push_back(hint_arg); child_array.push_back(hint_arg);
} }
// OLEGS: remove it if not used
/**
Returns pointer to complex hint for a given type
@param type hint type
@return pointer to complex hint for a given type.
*/
// virtual PT_hint *get_complex_hints(uint type)
// {
// DBUG_ASSERT(0);
// return NULL; /* error C4716: must return a value*/
// };
/** /**
Find hint among lower-level hint objects. Find hint among lower-level hint objects.
@param name_arg hint name @param name_arg hint name
@return hint if found, @return hint if found,
NULL otherwise NULL otherwise
*/ */
...@@ -303,16 +295,11 @@ class Opt_hints_global : public Opt_hints ...@@ -303,16 +295,11 @@ class Opt_hints_global : public Opt_hints
{ {
public: public:
PT_hint_max_execution_time *max_exec_time;
Opt_hints_global(MEM_ROOT *mem_root_arg) Opt_hints_global(MEM_ROOT *mem_root_arg)
: Opt_hints(Lex_ident_sys(), NULL, mem_root_arg) : Opt_hints(Lex_ident_sys(), NULL, mem_root_arg)
{ {}
max_exec_time= NULL;
}
virtual void append_name(THD *thd, String *str) {} virtual void append_name(THD *thd, String *str) override {}
virtual PT_hint *get_complex_hints(uint type);
}; };
...@@ -334,10 +321,9 @@ class Opt_hints_qb : public Opt_hints ...@@ -334,10 +321,9 @@ class Opt_hints_qb : public Opt_hints
MEM_ROOT *mem_root_arg, MEM_ROOT *mem_root_arg,
uint select_number_arg); uint select_number_arg);
const LEX_CSTRING *get_print_name() const LEX_CSTRING get_print_name()
{ {
const LEX_CSTRING *str= Opt_hints::get_name(); return name.str ? name : sys_name;
return str ? str : &sys_name;
} }
/** /**
...@@ -348,10 +334,10 @@ class Opt_hints_qb : public Opt_hints ...@@ -348,10 +334,10 @@ class Opt_hints_qb : public Opt_hints
*/ */
void append_qb_hint(THD *thd, String *str) void append_qb_hint(THD *thd, String *str)
{ {
if (get_name()) if (name.str)
{ {
str->append(STRING_WITH_LEN("QB_NAME(")); str->append(STRING_WITH_LEN("QB_NAME("));
append_identifier(thd, str, get_name()->str, get_name()->length); append_identifier(thd, str, &name);
str->append(STRING_WITH_LEN(") ")); str->append(STRING_WITH_LEN(") "));
} }
} }
...@@ -361,10 +347,11 @@ class Opt_hints_qb : public Opt_hints ...@@ -361,10 +347,11 @@ class Opt_hints_qb : public Opt_hints
@param thd pointer to THD object @param thd pointer to THD object
@param str pointer to String object @param str pointer to String object
*/ */
virtual void append_name(THD *thd, String *str) virtual void append_name(THD *thd, String *str) override
{ {
str->append(STRING_WITH_LEN("@")); str->append(STRING_WITH_LEN("@"));
append_identifier(thd, str, get_print_name()->str, get_print_name()->length); const LEX_CSTRING print_name= get_print_name();
append_identifier(thd, str, &print_name);
} }
/** /**
...@@ -399,15 +386,21 @@ class Opt_hints_table : public Opt_hints ...@@ -399,15 +386,21 @@ class Opt_hints_table : public Opt_hints
keyinfo_array(mem_root_arg) keyinfo_array(mem_root_arg)
{ } { }
CHARSET_INFO *charset_info() const override
{
return Lex_ident_table::charset_info();
}
/** /**
Append table name. Append table name.
@param thd pointer to THD object @param thd pointer to THD object
@param str pointer to String object @param str pointer to String object
*/ */
virtual void append_name(THD *thd, String *str) virtual void append_name(THD *thd, String *str) override
{ {
append_identifier(thd, str, get_name()->str, get_name()->length); append_identifier(thd, str, &name);
get_parent()->append_name(thd, str); get_parent()->append_name(thd, str);
} }
/** /**
...@@ -445,11 +438,11 @@ class Opt_hints_key : public Opt_hints ...@@ -445,11 +438,11 @@ class Opt_hints_key : public Opt_hints
@param thd pointer to THD object @param thd pointer to THD object
@param str pointer to String object @param str pointer to String object
*/ */
virtual void append_name(THD *thd, String *str) virtual void append_name(THD *thd, String *str) override
{ {
get_parent()->append_name(thd, str); get_parent()->append_name(thd, str);
str->append(' '); str->append(' ');
append_identifier(thd, str, get_name()->str, get_name()->length); append_identifier(thd, str, &name);
} }
virtual uint get_warn_unresolved_code() const override virtual uint get_warn_unresolved_code() const override
...@@ -507,5 +500,4 @@ bool hint_table_state(const THD *thd, const TABLE *table, ...@@ -507,5 +500,4 @@ bool hint_table_state(const THD *thd, const TABLE *table,
bool hint_table_state_or_fallback(const THD *thd, const TABLE *table, bool hint_table_state_or_fallback(const THD *thd, const TABLE *table,
opt_hints_enum type_arg, opt_hints_enum type_arg,
bool fallback_value); bool fallback_value);
#endif /* OPT_HINTS_INCLUDED */ #endif /* OPT_HINTS_INCLUDED */
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include "sql_error.h" #include "sql_error.h"
#include "mysqld_error.h" #include "mysqld_error.h"
#include "sql_class.h" #include "sql_class.h"
#include "sql_show.h"
extern struct st_opt_hint_info opt_hint_info[]; extern struct st_opt_hint_info opt_hint_info[];
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include "lex_ident_sys.h" #include "lex_ident_sys.h"
#include "simple_tokenizer.h" #include "simple_tokenizer.h"
#include "sql_list.h" #include "sql_list.h"
#include "sql_string.h"
#include "simple_parser.h" #include "simple_parser.h"
class st_select_lex; class st_select_lex;
...@@ -565,7 +566,6 @@ class Optimizer_hint_parser: public Optimizer_hint_tokenizer, ...@@ -565,7 +566,6 @@ class Optimizer_hint_parser: public Optimizer_hint_tokenizer,
{ {
public: public:
using OR3::OR3; using OR3::OR3;
}; };
...@@ -579,8 +579,6 @@ class Optimizer_hint_parser: public Optimizer_hint_tokenizer, ...@@ -579,8 +579,6 @@ class Optimizer_hint_parser: public Optimizer_hint_tokenizer,
size_t count() const { return elements; } size_t count() const { return elements; }
}; };
public:
class Hint_list: public LIST<PARSER, Hint_list_container, class Hint_list: public LIST<PARSER, Hint_list_container,
Hint, TokenID::tNULL/*not separated list*/, 1> Hint, TokenID::tNULL/*not separated list*/, 1>
{ {
...@@ -590,6 +588,7 @@ class Optimizer_hint_parser: public Optimizer_hint_tokenizer, ...@@ -590,6 +588,7 @@ class Optimizer_hint_parser: public Optimizer_hint_tokenizer,
bool resolve(Parse_context *pc); bool resolve(Parse_context *pc);
}; };
public:
/* /*
The main rule: The main rule:
hints ::= hint_list EOF hints ::= hint_list EOF
...@@ -608,10 +607,10 @@ class Optimizer_hint_parser: public Optimizer_hint_tokenizer, ...@@ -608,10 +607,10 @@ class Optimizer_hint_parser: public Optimizer_hint_tokenizer,
instead of including the entire opt_hints_parser.h. instead of including the entire opt_hints_parser.h.
(forward declarations of qualified nested classes are not possible in C++) (forward declarations of qualified nested classes are not possible in C++)
*/ */
class Optimizer_hint_parser_output: public Optimizer_hint_parser::Hint_list class Optimizer_hint_parser_output: public Optimizer_hint_parser::Hints
{ {
public: public:
using Hint_list::Hint_list; using Hints::Hints;
}; };
......
...@@ -196,7 +196,7 @@ class Parser_templates ...@@ -196,7 +196,7 @@ class Parser_templates
/* /*
A rule consisting of three other rules in a row: A rule consisting of four other rules in a row:
rule ::= rule1 rule2 rule3 rule4 rule ::= rule1 rule2 rule3 rule4
*/ */
template<class PARSER, class A, class B, class C, class D> template<class PARSER, class A, class B, class C, class D>
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
#define SIMPLE_TOKENIZER_INCLUDED #define SIMPLE_TOKENIZER_INCLUDED
#include "lex_ident.h" #include "lex_string.h"
#include "scan_char.h" #include "scan_char.h"
/** /**
......
...@@ -3111,7 +3111,7 @@ void st_select_lex::init_query() ...@@ -3111,7 +3111,7 @@ void st_select_lex::init_query()
pushdown_select= 0; pushdown_select= 0;
orig_names_of_item_list_elems= 0; orig_names_of_item_list_elems= 0;
opt_hints_qb= 0; opt_hints_qb= 0;
parsed_optimizer_hints= 0; // OLEGS: remove if not used parsed_optimizer_hints= 0;
} }
void st_select_lex::init_select() void st_select_lex::init_select()
...@@ -3166,7 +3166,7 @@ void st_select_lex::init_select() ...@@ -3166,7 +3166,7 @@ void st_select_lex::init_select()
orig_names_of_item_list_elems= 0; orig_names_of_item_list_elems= 0;
item_list_usage= MARK_COLUMNS_READ; item_list_usage= MARK_COLUMNS_READ;
opt_hints_qb= 0; opt_hints_qb= 0;
parsed_optimizer_hints= 0; // OLEGS: remove if not used parsed_optimizer_hints= 0;
} }
/* /*
...@@ -10684,6 +10684,7 @@ bool LEX::parsed_insert_select(SELECT_LEX *first_select) ...@@ -10684,6 +10684,7 @@ bool LEX::parsed_insert_select(SELECT_LEX *first_select)
return true; return true;
// fix "main" select // fix "main" select
resolve_optimizer_hints_in_last_select();
SELECT_LEX *blt __attribute__((unused))= pop_select(); SELECT_LEX *blt __attribute__((unused))= pop_select();
DBUG_ASSERT(blt == &builtin_select); DBUG_ASSERT(blt == &builtin_select);
push_select(first_select); push_select(first_select);
...@@ -12452,7 +12453,7 @@ LEX::parse_optimizer_hints(const Lex_comment_st &hints_str) ...@@ -12452,7 +12453,7 @@ LEX::parse_optimizer_hints(const Lex_comment_st &hints_str)
} }
void LEX::resolve_optimizer_hints() void LEX::resolve_optimizer_hints_in_last_select()
{ {
SELECT_LEX *select_lex; SELECT_LEX *select_lex;
if (likely(select_stack_top)) if (likely(select_stack_top))
......
...@@ -1380,6 +1380,7 @@ class st_select_lex: public st_select_lex_node ...@@ -1380,6 +1380,7 @@ class st_select_lex: public st_select_lex_node
bool setup_ref_array(THD *thd, uint order_group_num); bool setup_ref_array(THD *thd, uint order_group_num);
uint get_cardinality_of_ref_ptrs_slice(uint order_group_num_arg); uint get_cardinality_of_ref_ptrs_slice(uint order_group_num_arg);
void print(THD *thd, String *str, enum_query_type query_type); void print(THD *thd, String *str, enum_query_type query_type);
void print_hints(THD *thd, String *hint_str);
void print_item_list(THD *thd, String *str, enum_query_type query_type); void print_item_list(THD *thd, String *str, enum_query_type query_type);
void print_set_clause(THD *thd, String *str, enum_query_type query_type); void print_set_clause(THD *thd, String *str, enum_query_type query_type);
void print_on_duplicate_key_clause(THD *thd, String *str, void print_on_duplicate_key_clause(THD *thd, String *str,
...@@ -3724,7 +3725,7 @@ struct LEX: public Query_tables_list ...@@ -3724,7 +3725,7 @@ struct LEX: public Query_tables_list
DBUG_RETURN(select_lex); DBUG_RETURN(select_lex);
} }
void resolve_optimizer_hints(); void resolve_optimizer_hints_in_last_select();
SELECT_LEX *current_select_or_default() SELECT_LEX *current_select_or_default()
{ {
......
...@@ -31452,35 +31452,10 @@ void st_select_lex::print(THD *thd, String *str, enum_query_type query_type) ...@@ -31452,35 +31452,10 @@ void st_select_lex::print(THD *thd, String *str, enum_query_type query_type)
return; return;
} }
char buff[NAME_LEN]; if (sel_type == SELECT_CMD ||
String hint_str(buff, sizeof(buff), system_charset_info); sel_type == INSERT_CMD ||
hint_str.length(0); sel_type == REPLACE_CMD)
if (thd->lex->opt_hints_global) print_hints(thd, str);
{
char tmp_buff[NAME_LEN];
String hints_tmp(tmp_buff, sizeof(tmp_buff), system_charset_info);
hints_tmp.length(0);
if (select_number == 1)
{
if (opt_hints_qb)
opt_hints_qb->append_qb_hint(thd, &hints_tmp);
thd->lex->opt_hints_global->print(thd, &hints_tmp);
}
else if (opt_hints_qb)
opt_hints_qb->append_qb_hint(thd, &hints_tmp);
if (hints_tmp.length() > 0)
{
hint_str.append(STRING_WITH_LEN("/*+ "));
hint_str.append(hints_tmp);
hint_str.append(STRING_WITH_LEN("*/ "));
}
}
if (hint_str.length() > 0 && (sel_type == SELECT_CMD ||
sel_type == INSERT_CMD ||
sel_type == REPLACE_CMD))
str->append(hint_str);
/* First add options */ /* First add options */
if (options & SELECT_STRAIGHT_JOIN) if (options & SELECT_STRAIGHT_JOIN)
...@@ -31537,8 +31512,7 @@ void st_select_lex::print(THD *thd, String *str, enum_query_type query_type) ...@@ -31537,8 +31512,7 @@ void st_select_lex::print(THD *thd, String *str, enum_query_type query_type)
if (sel_type == UPDATE_CMD || sel_type == DELETE_CMD) if (sel_type == UPDATE_CMD || sel_type == DELETE_CMD)
{ {
str->append(get_explainable_cmd_name(sel_type)); str->append(get_explainable_cmd_name(sel_type));
if (hint_str.length() > 0) print_hints(thd, str);
str->append(hint_str);
} }
if (sel_type == DELETE_CMD) if (sel_type == DELETE_CMD)
{ {
...@@ -31668,6 +31642,36 @@ void st_select_lex::print(THD *thd, String *str, enum_query_type query_type) ...@@ -31668,6 +31642,36 @@ void st_select_lex::print(THD *thd, String *str, enum_query_type query_type)
} }
void st_select_lex::print_hints(THD *thd,
String *str)
{
if (!thd->lex->opt_hints_global)
return;
constexpr LEX_CSTRING header={STRING_WITH_LEN("/*+ ")};
str->append(header);
uint32 len_before_hints= str->length();
if (select_number == 1)
{
if (opt_hints_qb)
opt_hints_qb->append_qb_hint(thd, str);
thd->lex->opt_hints_global->print(thd, str);
}
else if (opt_hints_qb)
opt_hints_qb->append_qb_hint(thd, str);
if (str->length() > len_before_hints)
{
// Some hints were printed, close the hint string
str->append(STRING_WITH_LEN("*/ "));
}
else
{
// No hints were added, rollback the previouly added header
str->length(len_before_hints - header.length);
}
}
/** /**
Change the select_result object of the JOIN. Change the select_result object of the JOIN.
...@@ -1011,10 +1011,6 @@ class String: public Charset, public Binary_string ...@@ -1011,10 +1011,6 @@ class String: public Charset, public Binary_string
{ {
return Binary_string::append(s); return Binary_string::append(s);
} }
bool append(const char *s)
{
return append(s, (uint) strlen(s));
}
inline bool append(char chr) inline bool append(char chr)
{ {
return Binary_string::append_char(chr); return Binary_string::append_char(chr);
......
...@@ -8765,6 +8765,7 @@ query_specification: ...@@ -8765,6 +8765,7 @@ query_specification:
opt_having_clause opt_having_clause
opt_window_clause opt_window_clause
{ {
Lex->resolve_optimizer_hints_in_last_select();
$$= Lex->pop_select(); $$= Lex->pop_select();
} }
; ;
...@@ -8778,6 +8779,7 @@ select_into_query_specification: ...@@ -8778,6 +8779,7 @@ select_into_query_specification:
opt_having_clause opt_having_clause
opt_window_clause opt_window_clause
{ {
Lex->resolve_optimizer_hints_in_last_select();
$$= Lex->pop_select(); $$= Lex->pop_select();
} }
; ;
...@@ -8917,7 +8919,6 @@ query_expression_body: ...@@ -8917,7 +8919,6 @@ query_expression_body:
query_simple query_simple
{ {
Lex->push_select($1); Lex->push_select($1);
Lex->resolve_optimizer_hints();
if (!($$= Lex->create_unit($1))) if (!($$= Lex->create_unit($1)))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
...@@ -13338,7 +13339,7 @@ insert: ...@@ -13338,7 +13339,7 @@ insert:
insert_field_spec opt_insert_update opt_returning insert_field_spec opt_insert_update opt_returning
insert_stmt_end insert_stmt_end
{ {
Lex->resolve_optimizer_hints(); Lex->resolve_optimizer_hints_in_last_select();
Lex->mark_first_table_as_inserting(); Lex->mark_first_table_as_inserting();
thd->get_stmt_da()->reset_current_row_for_warning(0); thd->get_stmt_da()->reset_current_row_for_warning(0);
} }
...@@ -13358,8 +13359,9 @@ replace: ...@@ -13358,8 +13359,9 @@ replace:
Select->set_lock_for_tables($5, true, false); Select->set_lock_for_tables($5, true, false);
} }
insert_field_spec opt_returning insert_field_spec opt_returning
stmt_end insert_stmt_end
{ {
Lex->resolve_optimizer_hints_in_last_select();
Lex->mark_first_table_as_inserting(); Lex->mark_first_table_as_inserting();
thd->get_stmt_da()->reset_current_row_for_warning(0); thd->get_stmt_da()->reset_current_row_for_warning(0);
} }
...@@ -13375,7 +13377,7 @@ insert_start: { ...@@ -13375,7 +13377,7 @@ insert_start: {
; ;
stmt_end: { stmt_end: {
Lex->resolve_optimizer_hints(); Lex->resolve_optimizer_hints_in_last_select();
Lex->pop_select(); //main select Lex->pop_select(); //main select
if (Lex->check_main_unit_semantics()) if (Lex->check_main_unit_semantics())
MYSQL_YYABORT; MYSQL_YYABORT;
...@@ -13742,7 +13744,7 @@ delete: ...@@ -13742,7 +13744,7 @@ delete:
{ {
if (Lex->check_cte_dependencies_and_resolve_references()) if (Lex->check_cte_dependencies_and_resolve_references())
MYSQL_YYABORT; MYSQL_YYABORT;
Lex->resolve_optimizer_hints(); Lex->resolve_optimizer_hints_in_last_select();
} }
; ;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment