@@ -378,322 +378,7 @@ SHOW STATUS LIKE 'handler_read%';
378378
379379DEALLOCATE PREPARE stmt1;
380380
381- DROP TABLE t1, t2, t3, t10, t11, t12, t13;
382-
383- --echo #
384- --echo # BNL and NO_BNL hint testing
385- --echo #
386-
387- set optimizer_switch=default;
388-
389- CREATE TABLE t1 (a INT, b INT);
390- INSERT INTO t1 VALUES (1,1),(2,2);
391- CREATE TABLE t2 (a INT, b INT);
392- INSERT INTO t2 VALUES (1,1),(2,2);
393- CREATE TABLE t3 (a INT, b INT);
394- INSERT INTO t3 VALUES (1,1),(2,2);
395-
396- --disable_ps2_protocol
397- --disable_cursor_protocol
398- --echo # Check statistics without hint
399- FLUSH STATUS;
400- SELECT t1.* FROM t1,t2,t3;
401- SHOW STATUS LIKE 'handler_read%';
402-
403- --echo # Check statistics with hint
404- FLUSH STATUS;
405- SELECT /*+ NO_BNL() */t1.* FROM t1,t2,t3;
406- SHOW STATUS LIKE 'handler_read%';
407- --enable_ps2_protocol
408- --enable_cursor_protocol
409-
410- EXPLAIN EXTENDED SELECT t1.* FROM t1,t2,t3;
411- EXPLAIN EXTENDED SELECT /*+ NO_BNL() */t1.* FROM t1,t2,t3;
412- EXPLAIN EXTENDED SELECT /*+ NO_BNL(t2, t3) */t1.* FROM t1,t2,t3;
413- EXPLAIN EXTENDED SELECT /*+ NO_BNL(t1, t3) */t1.* FROM t1,t2,t3;
414-
415- --echo # Make sure query results are the same for any hints combination
416- --sorted_result
417- SELECT * FROM t1,t2,t3;
418- --sorted_result
419- SELECT /*+ NO_BNL(t1, t2) */* FROM t1,t2,t3;
420- --sorted_result
421- SELECT /*+ NO_BNL(t1, t3) */* FROM t1,t2,t3;
422- --sorted_result
423- SELECT /*+ NO_BNL(t2, t3) */* FROM t1,t2,t3;
424-
425- --echo # BNL() overrides current join_cache_level setting
426- set join_cache_level = 0;
427- EXPLAIN EXTENDED SELECT t1.* FROM t1,t2,t3;
428- EXPLAIN EXTENDED SELECT /*+ BNL() */t1.* FROM t1,t2,t3;
429- EXPLAIN EXTENDED SELECT /*+ BNL(t1, t2) */t1.* FROM t1,t2,t3;
430- EXPLAIN EXTENDED SELECT /*+ BNL(t1, t3) */t1.* FROM t1,t2,t3;
431- EXPLAIN EXTENDED SELECT /*+ BNL(t2, t3) */t1.* FROM t1,t2,t3;
432- EXPLAIN EXTENDED SELECT /*+ BNL(t2) BNL(t3) */t1.* FROM t1,t2,t3;
433-
434- DROP TABLE t1, t2, t3;
435- set join_cache_level = 8;
436-
437- --echo # BNL in subquery
438- set optimizer_switch = DEFAULT;
439- CREATE TABLE t1 (a INT, b INT, PRIMARY KEY (a));
440- CREATE TABLE t2 (a INT);
441- CREATE TABLE t3 (a INT, b INT, INDEX a (a,b));
442- INSERT INTO t1 VALUES (1,10), (2,20), (3,30), (4,40);
443- INSERT INTO t2 VALUES (2), (3), (4), (5);
444- INSERT INTO t3 VALUES (10,3), (20,4), (30,5);
445- ANALYZE TABLE t1, t2, t3;
446-
447- EXPLAIN EXTENDED SELECT /*+ QB_NAME(q) */ * FROM t1 JOIN t2 ON t1.a = t2.a WHERE
448- t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
449-
450- EXPLAIN EXTENDED SELECT /*+ QB_NAME(q) NO_BNL() */ *
451- FROM t1 JOIN t2 ON t1.a = t2.a
452- WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
453-
454- EXPLAIN EXTENDED SELECT /*+ QB_NAME(q) NO_BNL(t1, t2) */ *
455- FROM t1 JOIN t2 ON t1.a = t2.a
456- WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
457-
458- EXPLAIN EXTENDED SELECT /*+ QB_NAME(q) NO_BNL(@subq1) */ *
459- FROM t1 JOIN t2 ON t1.a = t2.a
460- WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
461-
462- EXPLAIN EXTENDED SELECT /*+ QB_NAME(q) NO_BNL(t4@subq1) */ *
463- FROM t1 JOIN t2 ON t1.a = t2.a
464- WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
465-
466- EXPLAIN EXTENDED SELECT /*+ QB_NAME(q) NO_BNL(t3@subq1,t4@subq1) */ *
467- FROM t1 JOIN t2 ON t1.a = t2.a
468- WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
469-
470- EXPLAIN EXTENDED SELECT /*+ QB_NAME(q) NO_BNL(@subq1 t3, t4) */ *
471- FROM t1 JOIN t2 ON t1.a = t2.a
472- WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
473-
474- EXPLAIN EXTENDED SELECT /*+ QB_NAME(q) */ *
475- FROM t1 JOIN t2 ON t1.a = t2.a
476- WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) NO_BNL(t3, t4) */ t3.b
477- FROM t3 JOIN t1 t4 ON t3.a = t4.b);
478-
479- --echo # Make sure query results are the same for any hints combination
480- # --sorted_result
481- SELECT * FROM t1 JOIN t2 ON t1.a = t2.a WHERE
482- t2.a IN (SELECT t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
483- # --sorted_result
484- SELECT /*+ QB_NAME(q) */ * FROM t1 JOIN t2 ON t1.a = t2.a WHERE
485- t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
486- --sorted_result
487- SELECT /*+ QB_NAME(q) NO_BNL() */ *
488- FROM t1 JOIN t2 ON t1.a = t2.a
489- WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
490- --sorted_result
491- SELECT /*+ QB_NAME(q) NO_BNL(t1, t2) */ *
492- FROM t1 JOIN t2 ON t1.a = t2.a
493- WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
494- --sorted_result
495- SELECT /*+ QB_NAME(q) NO_BNL(@subq1) */ *
496- FROM t1 JOIN t2 ON t1.a = t2.a
497- WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
498- --sorted_result
499- SELECT /*+ QB_NAME(q) NO_BNL(t4@subq1) */ *
500- FROM t1 JOIN t2 ON t1.a = t2.a
501- WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
502- --sorted_result
503- SELECT /*+ QB_NAME(q) NO_BNL(t3@subq1,t4@subq1) */ *
504- FROM t1 JOIN t2 ON t1.a = t2.a
505- WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
506- --sorted_result
507- SELECT /*+ QB_NAME(q) NO_BNL(@subq1 t3, t4) */ *
508- FROM t1 JOIN t2 ON t1.a = t2.a
509- WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
510- --sorted_result
511- SELECT /*+ QB_NAME(q) */ *
512- FROM t1 JOIN t2 ON t1.a = t2.a
513- WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) NO_BNL(t3, t4) */ t3.b
514- FROM t3 JOIN t1 t4 ON t3.a = t4.b);
515-
516- DROP TABLE t1, t2, t3, t4;
517-
518- --echo #
519- --echo # BNL() and NO_BNL() for LEFT JOINs
520- --echo #
521-
522- CREATE TABLE t1 (a int);
523- CREATE TABLE t2 (a int);
524- CREATE TABLE t3 (a int);
525- CREATE TABLE t4 (a int);
526-
527- INSERT INTO t1 VALUES (null), (2), (null), (1);
528-
529- set join_cache_level = 8;
530-
531- --echo # Two join buffers are employed by default (without hints):
532- EXPLAIN SELECT t1.a
533- FROM t1 LEFT JOIN (t2 LEFT JOIN t3 ON t2.a) ON 0
534- WHERE t1.a OR t3.a;
535-
536- --echo # Disabling either of join buffers disables another one automatically due
537- --echo # to join buffer employment rules:
538- EXPLAIN SELECT /*+ NO_BNL(t2) */ t1.a
539- FROM t1 LEFT JOIN (t2 LEFT JOIN t3 ON t2.a) ON 0
540- WHERE t1.a OR t3.a;
541-
542- EXPLAIN SELECT /*+ NO_BNL(t3) */ t1.a
543- FROM t1 LEFT JOIN (t2 LEFT JOIN t3 ON t2.a) ON 0
544- WHERE t1.a OR t3.a;
545-
546- --echo # Three join buffers are employed here by default (without hints):
547- EXPLAIN SELECT t1.a
548- FROM t1 LEFT JOIN (t2 LEFT JOIN (t3 LEFT JOIN t4 ON 1) ON t2.a) ON 0
549- WHERE t1.a OR t4.a;
550-
551- --echo # Disabling either of join buffers disables others automatically due
552- --echo # to join buffer employment rules:
553- EXPLAIN SELECT /*+ NO_BNL(t2)*/ t1.a
554- FROM t1 LEFT JOIN (t2 LEFT JOIN (t3 LEFT JOIN t4 ON 1) ON t2.a) ON 0
555- WHERE t1.a OR t4.a;
556- EXPLAIN SELECT /*+ NO_BNL(t3)*/ t1.a
557- FROM t1 LEFT JOIN (t2 LEFT JOIN (t3 LEFT JOIN t4 ON 1) ON t2.a) ON 0
558- WHERE t1.a OR t4.a;
559- EXPLAIN SELECT /*+ NO_BNL(t4)*/ t1.a
560- FROM t1 LEFT JOIN (t2 LEFT JOIN (t3 LEFT JOIN t4 ON 1) ON t2.a) ON 0
561- WHERE t1.a OR t4.a;
562-
563- set join_cache_level=0;
564- --echo # It is not allowed to enable join buffers on some subset of inner tables
565- --echo # of an outer join. Either all tables should use join buffers or none:
566- EXPLAIN SELECT /*+ BNL(t2)*/ t1.a
567- FROM t1 LEFT JOIN (t2 LEFT JOIN (t3 LEFT JOIN t4 ON 1) ON t2.a) ON 0
568- WHERE t1.a OR t4.a;
569- EXPLAIN SELECT /*+ BNL(t2, t3)*/ t1.a
570- FROM t1 LEFT JOIN (t2 LEFT JOIN (t3 LEFT JOIN t4 ON 1) ON t2.a) ON 0
571- WHERE t1.a OR t4.a;
572- EXPLAIN SELECT /*+ BNL(t2, t3, t4)*/ t1.a
573- FROM t1 LEFT JOIN (t2 LEFT JOIN (t3 LEFT JOIN t4 ON 1) ON t2.a) ON 0
574- WHERE t1.a OR t4.a;
575-
576- set join_cache_level=8;
577- INSERT INTO t2 VALUES (1), (2), (null), (1);
578- --echo # BNLH buffer is used when allowed by JCL setting
579- EXPLAIN SELECT * FROM t1, t2 WHERE t1.a=t2.a;
580-
581- --echo # Make sure the hint enables BNL even when JCL=0:
582- set join_cache_level=0;
583- EXPLAIN SELECT /*+BNL(t2) */ * FROM t1, t2 WHERE t1.a=t2.a;
584-
585- set join_cache_level=2;
586- EXPLAIN SELECT /*+BNL(t2) */ * FROM t1, t2 WHERE t1.a=t2.a;
587-
588- DROP TABLE t1,t2,t3,t4;
589-
590-
591- --echo #
592- --echo # Mix of BNL/BKA flat and incremental join buffers for OUTER JOINs
593- --echo #
594-
595- set optimizer_switch='outer_join_with_cache=on,mrr=on,mrr_sort_keys=on,index_condition_pushdown=on';
596-
597- CREATE TABLE t1 (a1 varchar(32)) ;
598- INSERT INTO t1 VALUES ('s'),('k');
599-
600- CREATE TABLE t2 (a2 int PRIMARY KEY, b2 varchar(32)) ;
601- INSERT INTO t2 VALUES (7,'s');
602-
603- CREATE TABLE t3 (a3 int PRIMARY KEY, b3 varchar(32)) ;
604- INSERT INTO t3 VALUES (7,'s');
605-
606- CREATE TABLE t4 (a4 int);
607- INSERT INTO t4 VALUES (9);
608-
609- CREATE TABLE t5(a5 int PRIMARY KEY, b5 int) ;
610- INSERT INTO t5 VALUES (7,0);
611- --disable_result_log
612- ANALYZE TABLES t1, t2, t3, t4, t5;
613- --enable_result_log
614-
615- --echo # Disable join buffering to enable it selectively on particular tables
616- SET SESSION join_cache_level = 0;
617- EXPLAIN
618- SELECT t4.a4, t5.b5
619- FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
620- LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
621- SELECT t4.a4, t5.b5
622- FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
623- LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
624-
625- EXPLAIN
626- SELECT /*+ BNL(t4) */ t4.a4, t5.b5
627- FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
628- LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
629- SELECT /*+ BNL(t4) */ t4.a4, t5.b5
630- FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
631- LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
632-
633- EXPLAIN
634- SELECT /*+ BNL(t4, t5) */ t4.a4, t5.b5
635- FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
636- LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
637- SELECT /*+ BNL(t4, t5) */ t4.a4, t5.b5
638- FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
639- LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
640-
641- --echo # BNL() hint overrides join_cache_levels from 0 to 3 increasing it to 4
642- set join_cache_level = 1;
643- EXPLAIN
644- SELECT /*+ BNL(t4, t5) */ t4.a4, t5.b5
645- FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
646- LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
647-
648- set join_cache_level = 2;
649- EXPLAIN
650- SELECT /*+ BNL(t4, t5) */ t4.a4, t5.b5
651- FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
652- LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
653-
654- set join_cache_level = 3;
655- EXPLAIN
656- SELECT /*+ BNL(t4, t5) */ t4.a4, t5.b5
657- FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
658- LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
659-
660- --echo # Enable all join buffering capabilities:
661- SET SESSION join_cache_level = 8;
662- EXPLAIN
663- SELECT t4.a4, t5.b5
664- FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
665- LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
666- SELECT t4.a4, t5.b5
667- FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
668- LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
669-
670- EXPLAIN
671- SELECT /*+ NO_BNL(t4)*/ t4.a4, t5.b5
672- FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
673- LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
674- SELECT /*+ NO_BNL(t4)*/ t4.a4, t5.b5
675- FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
676- LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
677-
678- --echo # Disable BKA so the BNLH join buffer will be employed:
679- EXPLAIN
680- SELECT /*+ NO_BKA(t5)*/ t4.a4, t5.b5
681- FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
682- LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
683- SELECT /*+ NO_BKA(t5)*/ t4.a4, t5.b5
684- FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
685- LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
686-
687- EXPLAIN
688- SELECT /*+ NO_BKA(t5) NO_BNL(t5)*/ t4.a4, t5.b5
689- FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
690- LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
691- SELECT /*+ NO_BKA(t5) NO_BNL(t5)*/ t4.a4, t5.b5
692- FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
693- LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
694-
695- DROP TABLE t1,t2,t3,t4,t5;
696-
381+ DROP TABLE t1, t2, t3, t4, t10, t11, t12, t13;
697382
698383--echo # MRR & NO_MRR hint testing
699384set optimizer_switch=default;
0 commit comments