8058 lines
		
	
	
		
			291 KiB
		
	
	
	
		
			Plaintext
		
	
	
			
		
		
	
	
			8058 lines
		
	
	
		
			291 KiB
		
	
	
	
		
			Plaintext
		
	
	
use test;
 | 
						|
Test read-locality of READ-BACKUP
 | 
						|
create table test.t1 (a int primary key,
 | 
						|
b int,
 | 
						|
c int,
 | 
						|
d int,
 | 
						|
unique(b) using hash,
 | 
						|
key(c),
 | 
						|
key(a,c))
 | 
						|
comment="NDB_TABLE=READ_BACKUP=1"
 | 
						|
   engine=ndb;
 | 
						|
Warnings:
 | 
						|
Warning	1121	Ndb does not support unique index on NULL valued attributes, index access with NULL value will become full table scan
 | 
						|
create table test.t2 (a int primary key,
 | 
						|
b int,
 | 
						|
c int,
 | 
						|
d text,
 | 
						|
unique(b) using hash,
 | 
						|
key(c))
 | 
						|
comment="NDB_TABLE=READ_BACKUP=1"
 | 
						|
   engine=ndb;
 | 
						|
Warnings:
 | 
						|
Warning	1121	Ndb does not support unique index on NULL valued attributes, index access with NULL value will become full table scan
 | 
						|
select id into @t1_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t1';
 | 
						|
select id into @t1ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t1_id and type = 3;
 | 
						|
select id into @t2_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t2';
 | 
						|
select id into @t2ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and type = 3;
 | 
						|
select id into @t2bt_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and fq_name like 'test/def/NDB$BLOB%';
 | 
						|
Put some data in.
 | 
						|
Make it more interesting for joining
 | 
						|
update test.t1 set c=c+1, d=d+1;
 | 
						|
select count(distinct node_id) into @nodes
 | 
						|
from ndbinfo.ndb$membership where group_id < 0xFFFFFF00;
 | 
						|
Check replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where fq_name='test/def/t1'
 | 
						|
   and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with table data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where fq_name='test/def/t1';
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check UI replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t1ui_id
 | 
						|
and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with UI data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t1ui_id;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Put some data in.
 | 
						|
insert into test.t2 select a,b,c,repeat('BJC',300) from test.t1;
 | 
						|
Check blob table replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t2bt_id
 | 
						|
and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with blob data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t2bt_id;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
set @partitions = 'PARTITION p2 VALUES IN (2)';
 | 
						|
set @partitions = concat(@partitions,',PARTITION p1 VALUES IN (1)');
 | 
						|
set @@new = 1;
 | 
						|
create table hints (i int primary key) engine=ndb partition by list(i) (PARTITION p2 VALUES IN (2),PARTITION p1 VALUES IN (1));
 | 
						|
insert into hints values (2);
 | 
						|
Hint node by 2 of 2
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
insert into hints values (1);
 | 
						|
Hint node by 1 of 2
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
drop table hints;
 | 
						|
delete from t1;
 | 
						|
delete from t2;
 | 
						|
drop table test.t1;
 | 
						|
drop table test.t2;
 | 
						|
Test read-locality after ALTER TABLE into READ-BACKUP
 | 
						|
create table test.t1 (a int primary key,
 | 
						|
b int,
 | 
						|
c int,
 | 
						|
d int,
 | 
						|
unique(b) using hash,
 | 
						|
key(c),
 | 
						|
key(a,c))
 | 
						|
engine=ndb;
 | 
						|
Warnings:
 | 
						|
Warning	1121	Ndb does not support unique index on NULL valued attributes, index access with NULL value will become full table scan
 | 
						|
create table test.t2 (a int primary key,
 | 
						|
b int,
 | 
						|
c int,
 | 
						|
d text,
 | 
						|
unique(b) using hash,
 | 
						|
key(c))
 | 
						|
engine=ndb;
 | 
						|
Warnings:
 | 
						|
Warning	1121	Ndb does not support unique index on NULL valued attributes, index access with NULL value will become full table scan
 | 
						|
alter table t1 algorithm=inplace, comment="NDB_TABLE=READ_BACKUP=1";
 | 
						|
alter table t2 algorithm=inplace, comment="NDB_TABLE=READ_BACKUP=1";
 | 
						|
-- t2 --
 | 
						|
Version: Any
 | 
						|
Fragment type: HashMapPartition
 | 
						|
K Value: 6
 | 
						|
Min load factor: 78
 | 
						|
Max load factor: 80
 | 
						|
Temporary table: no
 | 
						|
Number of attributes: 4
 | 
						|
Number of primary keys: 1
 | 
						|
Length of frm data: XXX
 | 
						|
Max Rows: 0
 | 
						|
Row Checksum: 1
 | 
						|
Row GCI: 1
 | 
						|
SingleUserMode: 0
 | 
						|
ForceVarPart: 1
 | 
						|
PartitionCount: 8
 | 
						|
FragmentCount: 8
 | 
						|
PartitionBalance: FOR_RP_BY_LDM
 | 
						|
ExtraRowGciBits: 0
 | 
						|
ExtraRowAuthorBits: 0
 | 
						|
TableStatus: Retrieved
 | 
						|
Table options: readbackup
 | 
						|
HashMap: DEFAULT-HASHMAP-3840-8
 | 
						|
-- Attributes --
 | 
						|
a Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
 | 
						|
b Int NULL AT=FIXED ST=MEMORY
 | 
						|
c Int NULL AT=FIXED ST=MEMORY
 | 
						|
d Text(256,2000,0;utf8mb4_0900_ai_ci) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_XX_3
 | 
						|
-- Indexes -- 
 | 
						|
PRIMARY KEY(a) - UniqueHashIndex
 | 
						|
PRIMARY(a) - OrderedIndex
 | 
						|
b$unique(b) - UniqueHashIndex
 | 
						|
c(c) - OrderedIndex
 | 
						|
-- t2/PRIMARY --
 | 
						|
Version: Any
 | 
						|
Base table: t2
 | 
						|
Number of attributes: 1
 | 
						|
Logging: 0
 | 
						|
Index type: OrderedIndex
 | 
						|
Index status: Retrieved
 | 
						|
-- Attributes --
 | 
						|
a Int NOT NULL AT=FIXED ST=MEMORY
 | 
						|
-- IndexTable XX/PRIMARY --
 | 
						|
Version: Any
 | 
						|
Fragment type: FragUndefined
 | 
						|
K Value: 6
 | 
						|
Min load factor: 78
 | 
						|
Max load factor: 80
 | 
						|
Temporary table: yes
 | 
						|
Number of attributes: 2
 | 
						|
Number of primary keys: 1
 | 
						|
Length of frm data: XXX
 | 
						|
Max Rows: 0
 | 
						|
Row Checksum: 1
 | 
						|
Row GCI: 1
 | 
						|
SingleUserMode: 2
 | 
						|
ForceVarPart: 0
 | 
						|
PartitionCount: 8
 | 
						|
FragmentCount: 8
 | 
						|
PartitionBalance: FOR_RP_BY_LDM
 | 
						|
ExtraRowGciBits: 0
 | 
						|
ExtraRowAuthorBits: 0
 | 
						|
TableStatus: Retrieved
 | 
						|
Table options: readbackup
 | 
						|
-- Attributes --
 | 
						|
a Int NOT NULL DISTRIBUTION KEY AT=FIXED ST=MEMORY
 | 
						|
NDB$TNODE Unsigned [64] PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
 | 
						|
-- Indexes -- 
 | 
						|
PRIMARY KEY(NDB$TNODE) - UniqueHashIndex
 | 
						|
 | 
						|
-- t2/b$unique --
 | 
						|
Version: Any
 | 
						|
Base table: t2
 | 
						|
Number of attributes: 1
 | 
						|
Logging: 1
 | 
						|
Index type: UniqueHashIndex
 | 
						|
Index status: Retrieved
 | 
						|
-- Attributes --
 | 
						|
b Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
 | 
						|
-- IndexTable XX/b$unique --
 | 
						|
Version: Any
 | 
						|
Fragment type: HashMapPartition
 | 
						|
K Value: 6
 | 
						|
Min load factor: 78
 | 
						|
Max load factor: 80
 | 
						|
Temporary table: no
 | 
						|
Number of attributes: 2
 | 
						|
Number of primary keys: 1
 | 
						|
Length of frm data: XXX
 | 
						|
Max Rows: 0
 | 
						|
Row Checksum: 1
 | 
						|
Row GCI: 1
 | 
						|
SingleUserMode: 2
 | 
						|
ForceVarPart: 0
 | 
						|
PartitionCount: 8
 | 
						|
FragmentCount: 8
 | 
						|
PartitionBalance: FOR_RP_BY_LDM
 | 
						|
ExtraRowGciBits: 0
 | 
						|
ExtraRowAuthorBits: 0
 | 
						|
TableStatus: Retrieved
 | 
						|
Table options: readbackup
 | 
						|
HashMap: DEFAULT-HASHMAP-3840-8
 | 
						|
-- Attributes --
 | 
						|
b Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
 | 
						|
NDB$PK Unsigned [2] NOT NULL AT=FIXED ST=MEMORY
 | 
						|
-- Indexes -- 
 | 
						|
PRIMARY KEY(b) - UniqueHashIndex
 | 
						|
 | 
						|
-- t2/c --
 | 
						|
Version: Any
 | 
						|
Base table: t2
 | 
						|
Number of attributes: 1
 | 
						|
Logging: 0
 | 
						|
Index type: OrderedIndex
 | 
						|
Index status: Retrieved
 | 
						|
-- Attributes --
 | 
						|
c Int NULL AT=FIXED ST=MEMORY
 | 
						|
-- IndexTable XX/c --
 | 
						|
Version: Any
 | 
						|
Fragment type: FragUndefined
 | 
						|
K Value: 6
 | 
						|
Min load factor: 78
 | 
						|
Max load factor: 80
 | 
						|
Temporary table: yes
 | 
						|
Number of attributes: 2
 | 
						|
Number of primary keys: 1
 | 
						|
Length of frm data: XXX
 | 
						|
Max Rows: 0
 | 
						|
Row Checksum: 1
 | 
						|
Row GCI: 1
 | 
						|
SingleUserMode: 2
 | 
						|
ForceVarPart: 0
 | 
						|
PartitionCount: 8
 | 
						|
FragmentCount: 8
 | 
						|
PartitionBalance: FOR_RP_BY_LDM
 | 
						|
ExtraRowGciBits: 0
 | 
						|
ExtraRowAuthorBits: 0
 | 
						|
TableStatus: Retrieved
 | 
						|
Table options: readbackup
 | 
						|
-- Attributes --
 | 
						|
c Int NULL AT=FIXED ST=MEMORY
 | 
						|
NDB$TNODE Unsigned [64] PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
 | 
						|
-- Indexes -- 
 | 
						|
PRIMARY KEY(NDB$TNODE) - UniqueHashIndex
 | 
						|
 | 
						|
-- NDB$BLOB_XX_3 --
 | 
						|
Version: Any
 | 
						|
Fragment type: HashMapPartition
 | 
						|
K Value: 6
 | 
						|
Min load factor: 78
 | 
						|
Max load factor: 80
 | 
						|
Temporary table: no
 | 
						|
Number of attributes: 4
 | 
						|
Number of primary keys: 2
 | 
						|
Length of frm data: XXX
 | 
						|
Max Rows: 0
 | 
						|
Row Checksum: 1
 | 
						|
Row GCI: 1
 | 
						|
SingleUserMode: 0
 | 
						|
ForceVarPart: 0
 | 
						|
PartitionCount: 8
 | 
						|
FragmentCount: 8
 | 
						|
PartitionBalance: FOR_RP_BY_LDM
 | 
						|
ExtraRowGciBits: 0
 | 
						|
ExtraRowAuthorBits: 0
 | 
						|
TableStatus: Retrieved
 | 
						|
Table options: readbackup
 | 
						|
HashMap: DEFAULT-HASHMAP-3840-8
 | 
						|
-- Attributes --
 | 
						|
a Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
 | 
						|
NDB$PART Unsigned PRIMARY KEY AT=FIXED ST=MEMORY
 | 
						|
NDB$PKID Unsigned NOT NULL AT=FIXED ST=MEMORY
 | 
						|
NDB$DATA Longvarchar(2000;binary) NOT NULL AT=MEDIUM_VAR ST=MEMORY
 | 
						|
-- Indexes -- 
 | 
						|
PRIMARY KEY(a, NDB$PART) - UniqueHashIndex
 | 
						|
 | 
						|
 | 
						|
NDBT_ProgramExit: 0 - OK
 | 
						|
 | 
						|
select id into @t1_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t1';
 | 
						|
select id into @t1ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t1_id and type = 3;
 | 
						|
select id into @t2_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t2';
 | 
						|
select id into @t2ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and type = 3;
 | 
						|
select id into @t2bt_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and fq_name like 'test/def/NDB$BLOB%';
 | 
						|
Put some data in.
 | 
						|
Make it more interesting for joining
 | 
						|
update test.t1 set c=c+1, d=d+1;
 | 
						|
select count(distinct node_id) into @nodes
 | 
						|
from ndbinfo.ndb$membership where group_id < 0xFFFFFF00;
 | 
						|
Check replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where fq_name='test/def/t1'
 | 
						|
   and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with table data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where fq_name='test/def/t1';
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check UI replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t1ui_id
 | 
						|
and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with UI data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t1ui_id;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Put some data in.
 | 
						|
insert into test.t2 select a,b,c,repeat('BJC',300) from test.t1;
 | 
						|
Check blob table replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t2bt_id
 | 
						|
and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with blob data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t2bt_id;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
set @partitions = 'PARTITION p2 VALUES IN (2)';
 | 
						|
set @partitions = concat(@partitions,',PARTITION p1 VALUES IN (1)');
 | 
						|
set @@new = 1;
 | 
						|
create table hints (i int primary key) engine=ndb partition by list(i) (PARTITION p2 VALUES IN (2),PARTITION p1 VALUES IN (1));
 | 
						|
insert into hints values (2);
 | 
						|
Hint node by 2 of 2
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
insert into hints values (1);
 | 
						|
Hint node by 1 of 2
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
drop table hints;
 | 
						|
delete from t1;
 | 
						|
delete from t2;
 | 
						|
Executing RESTART on all nodes.
 | 
						|
Starting shutdown. This may take a while. Please wait...
 | 
						|
All DB nodes are being restarted.
 | 
						|
 | 
						|
-- t2 --
 | 
						|
Version: Any
 | 
						|
Fragment type: HashMapPartition
 | 
						|
K Value: 6
 | 
						|
Min load factor: 78
 | 
						|
Max load factor: 80
 | 
						|
Temporary table: no
 | 
						|
Number of attributes: 4
 | 
						|
Number of primary keys: 1
 | 
						|
Length of frm data: XXX
 | 
						|
Max Rows: 0
 | 
						|
Row Checksum: 1
 | 
						|
Row GCI: 1
 | 
						|
SingleUserMode: 0
 | 
						|
ForceVarPart: 1
 | 
						|
PartitionCount: 8
 | 
						|
FragmentCount: 8
 | 
						|
PartitionBalance: FOR_RP_BY_LDM
 | 
						|
ExtraRowGciBits: 0
 | 
						|
ExtraRowAuthorBits: 0
 | 
						|
TableStatus: Retrieved
 | 
						|
Table options: readbackup
 | 
						|
HashMap: DEFAULT-HASHMAP-3840-8
 | 
						|
-- Attributes --
 | 
						|
a Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
 | 
						|
b Int NULL AT=FIXED ST=MEMORY
 | 
						|
c Int NULL AT=FIXED ST=MEMORY
 | 
						|
d Text(256,2000,0;utf8mb4_0900_ai_ci) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_XX_3
 | 
						|
-- Indexes -- 
 | 
						|
PRIMARY KEY(a) - UniqueHashIndex
 | 
						|
PRIMARY(a) - OrderedIndex
 | 
						|
b$unique(b) - UniqueHashIndex
 | 
						|
c(c) - OrderedIndex
 | 
						|
-- t2/PRIMARY --
 | 
						|
Version: Any
 | 
						|
Base table: t2
 | 
						|
Number of attributes: 1
 | 
						|
Logging: 0
 | 
						|
Index type: OrderedIndex
 | 
						|
Index status: Retrieved
 | 
						|
-- Attributes --
 | 
						|
a Int NOT NULL AT=FIXED ST=MEMORY
 | 
						|
-- IndexTable XX/PRIMARY --
 | 
						|
Version: Any
 | 
						|
Fragment type: FragUndefined
 | 
						|
K Value: 6
 | 
						|
Min load factor: 78
 | 
						|
Max load factor: 80
 | 
						|
Temporary table: yes
 | 
						|
Number of attributes: 2
 | 
						|
Number of primary keys: 1
 | 
						|
Length of frm data: XXX
 | 
						|
Max Rows: 0
 | 
						|
Row Checksum: 1
 | 
						|
Row GCI: 1
 | 
						|
SingleUserMode: 2
 | 
						|
ForceVarPart: 0
 | 
						|
PartitionCount: 8
 | 
						|
FragmentCount: 8
 | 
						|
PartitionBalance: FOR_RP_BY_LDM
 | 
						|
ExtraRowGciBits: 0
 | 
						|
ExtraRowAuthorBits: 0
 | 
						|
TableStatus: Retrieved
 | 
						|
Table options: readbackup
 | 
						|
-- Attributes --
 | 
						|
a Int NOT NULL DISTRIBUTION KEY AT=FIXED ST=MEMORY
 | 
						|
NDB$TNODE Unsigned [64] PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
 | 
						|
-- Indexes -- 
 | 
						|
PRIMARY KEY(NDB$TNODE) - UniqueHashIndex
 | 
						|
 | 
						|
-- t2/b$unique --
 | 
						|
Version: Any
 | 
						|
Base table: t2
 | 
						|
Number of attributes: 1
 | 
						|
Logging: 1
 | 
						|
Index type: UniqueHashIndex
 | 
						|
Index status: Retrieved
 | 
						|
-- Attributes --
 | 
						|
b Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
 | 
						|
-- IndexTable XX/b$unique --
 | 
						|
Version: Any
 | 
						|
Fragment type: HashMapPartition
 | 
						|
K Value: 6
 | 
						|
Min load factor: 78
 | 
						|
Max load factor: 80
 | 
						|
Temporary table: no
 | 
						|
Number of attributes: 2
 | 
						|
Number of primary keys: 1
 | 
						|
Length of frm data: XXX
 | 
						|
Max Rows: 0
 | 
						|
Row Checksum: 1
 | 
						|
Row GCI: 1
 | 
						|
SingleUserMode: 2
 | 
						|
ForceVarPart: 0
 | 
						|
PartitionCount: 8
 | 
						|
FragmentCount: 8
 | 
						|
PartitionBalance: FOR_RP_BY_LDM
 | 
						|
ExtraRowGciBits: 0
 | 
						|
ExtraRowAuthorBits: 0
 | 
						|
TableStatus: Retrieved
 | 
						|
Table options: readbackup
 | 
						|
HashMap: DEFAULT-HASHMAP-3840-8
 | 
						|
-- Attributes --
 | 
						|
b Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
 | 
						|
NDB$PK Unsigned [2] NOT NULL AT=FIXED ST=MEMORY
 | 
						|
-- Indexes -- 
 | 
						|
PRIMARY KEY(b) - UniqueHashIndex
 | 
						|
 | 
						|
-- t2/c --
 | 
						|
Version: Any
 | 
						|
Base table: t2
 | 
						|
Number of attributes: 1
 | 
						|
Logging: 0
 | 
						|
Index type: OrderedIndex
 | 
						|
Index status: Retrieved
 | 
						|
-- Attributes --
 | 
						|
c Int NULL AT=FIXED ST=MEMORY
 | 
						|
-- IndexTable XX/c --
 | 
						|
Version: Any
 | 
						|
Fragment type: FragUndefined
 | 
						|
K Value: 6
 | 
						|
Min load factor: 78
 | 
						|
Max load factor: 80
 | 
						|
Temporary table: yes
 | 
						|
Number of attributes: 2
 | 
						|
Number of primary keys: 1
 | 
						|
Length of frm data: XXX
 | 
						|
Max Rows: 0
 | 
						|
Row Checksum: 1
 | 
						|
Row GCI: 1
 | 
						|
SingleUserMode: 2
 | 
						|
ForceVarPart: 0
 | 
						|
PartitionCount: 8
 | 
						|
FragmentCount: 8
 | 
						|
PartitionBalance: FOR_RP_BY_LDM
 | 
						|
ExtraRowGciBits: 0
 | 
						|
ExtraRowAuthorBits: 0
 | 
						|
TableStatus: Retrieved
 | 
						|
Table options: readbackup
 | 
						|
-- Attributes --
 | 
						|
c Int NULL AT=FIXED ST=MEMORY
 | 
						|
NDB$TNODE Unsigned [64] PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
 | 
						|
-- Indexes -- 
 | 
						|
PRIMARY KEY(NDB$TNODE) - UniqueHashIndex
 | 
						|
 | 
						|
-- NDB$BLOB_XX_3 --
 | 
						|
Version: Any
 | 
						|
Fragment type: HashMapPartition
 | 
						|
K Value: 6
 | 
						|
Min load factor: 78
 | 
						|
Max load factor: 80
 | 
						|
Temporary table: no
 | 
						|
Number of attributes: 4
 | 
						|
Number of primary keys: 2
 | 
						|
Length of frm data: XXX
 | 
						|
Max Rows: 0
 | 
						|
Row Checksum: 1
 | 
						|
Row GCI: 1
 | 
						|
SingleUserMode: 0
 | 
						|
ForceVarPart: 0
 | 
						|
PartitionCount: 8
 | 
						|
FragmentCount: 8
 | 
						|
PartitionBalance: FOR_RP_BY_LDM
 | 
						|
ExtraRowGciBits: 0
 | 
						|
ExtraRowAuthorBits: 0
 | 
						|
TableStatus: Retrieved
 | 
						|
Table options: readbackup
 | 
						|
HashMap: DEFAULT-HASHMAP-3840-8
 | 
						|
-- Attributes --
 | 
						|
a Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
 | 
						|
NDB$PART Unsigned PRIMARY KEY AT=FIXED ST=MEMORY
 | 
						|
NDB$PKID Unsigned NOT NULL AT=FIXED ST=MEMORY
 | 
						|
NDB$DATA Longvarchar(2000;binary) NOT NULL AT=MEDIUM_VAR ST=MEMORY
 | 
						|
-- Indexes -- 
 | 
						|
PRIMARY KEY(a, NDB$PART) - UniqueHashIndex
 | 
						|
 | 
						|
 | 
						|
NDBT_ProgramExit: 0 - OK
 | 
						|
 | 
						|
select id into @t1_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t1';
 | 
						|
select id into @t1ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t1_id and type = 3;
 | 
						|
select id into @t2_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t2';
 | 
						|
select id into @t2ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and type = 3;
 | 
						|
select id into @t2bt_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and fq_name like 'test/def/NDB$BLOB%';
 | 
						|
Put some data in.
 | 
						|
Make it more interesting for joining
 | 
						|
update test.t1 set c=c+1, d=d+1;
 | 
						|
select count(distinct node_id) into @nodes
 | 
						|
from ndbinfo.ndb$membership where group_id < 0xFFFFFF00;
 | 
						|
Check replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where fq_name='test/def/t1'
 | 
						|
   and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with table data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where fq_name='test/def/t1';
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check UI replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t1ui_id
 | 
						|
and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with UI data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t1ui_id;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Put some data in.
 | 
						|
insert into test.t2 select a,b,c,repeat('BJC',300) from test.t1;
 | 
						|
Check blob table replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t2bt_id
 | 
						|
and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with blob data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t2bt_id;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
set @partitions = 'PARTITION p2 VALUES IN (2)';
 | 
						|
set @partitions = concat(@partitions,',PARTITION p1 VALUES IN (1)');
 | 
						|
set @@new = 1;
 | 
						|
create table hints (i int primary key) engine=ndb partition by list(i) (PARTITION p2 VALUES IN (2),PARTITION p1 VALUES IN (1));
 | 
						|
insert into hints values (2);
 | 
						|
Hint node by 2 of 2
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
insert into hints values (1);
 | 
						|
Hint node by 1 of 2
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
drop table hints;
 | 
						|
delete from t1;
 | 
						|
delete from t2;
 | 
						|
drop table test.t1;
 | 
						|
drop table test.t2;
 | 
						|
Test read-locality of FULLY-REPLICATED
 | 
						|
create table test.t1 (a int primary key,
 | 
						|
b int,
 | 
						|
c int,
 | 
						|
d int,
 | 
						|
unique(b) using hash,
 | 
						|
key(c),
 | 
						|
key(a,c))
 | 
						|
comment="NDB_TABLE=FULLY_REPLICATED=1"
 | 
						|
   engine=ndb;
 | 
						|
Warnings:
 | 
						|
Warning	1121	Ndb does not support unique index on NULL valued attributes, index access with NULL value will become full table scan
 | 
						|
create table test.t2 (a int primary key,
 | 
						|
b int,
 | 
						|
c int,
 | 
						|
d text,
 | 
						|
unique(b) using hash,
 | 
						|
key(c))
 | 
						|
comment="NDB_TABLE=FULLY_REPLICATED=1"
 | 
						|
   engine=ndb;
 | 
						|
Warnings:
 | 
						|
Warning	1121	Ndb does not support unique index on NULL valued attributes, index access with NULL value will become full table scan
 | 
						|
select id into @t1_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t1';
 | 
						|
select id into @t1ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t1_id and type = 3;
 | 
						|
select id into @t2_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t2';
 | 
						|
select id into @t2ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and type = 3;
 | 
						|
select id into @t2bt_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and fq_name like 'test/def/NDB$BLOB%';
 | 
						|
Put some data in.
 | 
						|
Make it more interesting for joining
 | 
						|
update test.t1 set c=c+1, d=d+1;
 | 
						|
select count(distinct node_id) into @nodes
 | 
						|
from ndbinfo.ndb$membership where group_id < 0xFFFFFF00;
 | 
						|
Check replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where fq_name='test/def/t1'
 | 
						|
   and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with table data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where fq_name='test/def/t1';
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check UI replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t1ui_id
 | 
						|
and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with UI data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t1ui_id;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Put some data in.
 | 
						|
insert into test.t2 select a,b,c,repeat('BJC',300) from test.t1;
 | 
						|
Check blob table replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t2bt_id
 | 
						|
and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with blob data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t2bt_id;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
set @partitions = 'PARTITION p2 VALUES IN (2)';
 | 
						|
set @partitions = concat(@partitions,',PARTITION p1 VALUES IN (1)');
 | 
						|
set @@new = 1;
 | 
						|
create table hints (i int primary key) engine=ndb partition by list(i) (PARTITION p2 VALUES IN (2),PARTITION p1 VALUES IN (1));
 | 
						|
insert into hints values (2);
 | 
						|
Hint node by 2 of 2
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
insert into hints values (1);
 | 
						|
Hint node by 1 of 2
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
drop table hints;
 | 
						|
delete from t1;
 | 
						|
delete from t2;
 | 
						|
Nodegroup 1 created
 | 
						|
alter table t1 algorithm=inplace, reorganize partition;
 | 
						|
alter table t2 algorithm=inplace, reorganize partition;
 | 
						|
select id into @t1_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t1';
 | 
						|
select id into @t1ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t1_id and type = 3;
 | 
						|
select id into @t2_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t2';
 | 
						|
select id into @t2ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and type = 3;
 | 
						|
select id into @t2bt_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and fq_name like 'test/def/NDB$BLOB%';
 | 
						|
Put some data in.
 | 
						|
Make it more interesting for joining
 | 
						|
update test.t1 set c=c+1, d=d+1;
 | 
						|
select count(distinct node_id) into @nodes
 | 
						|
from ndbinfo.ndb$membership where group_id < 0xFFFFFF00;
 | 
						|
Check replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where fq_name='test/def/t1'
 | 
						|
   and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with table data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where fq_name='test/def/t1';
 | 
						|
count(distinct node_id)
 | 
						|
4
 | 
						|
Check UI replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t1ui_id
 | 
						|
and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with UI data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t1ui_id;
 | 
						|
count(distinct node_id)
 | 
						|
4
 | 
						|
Put some data in.
 | 
						|
insert into test.t2 select a,b,c,repeat('BJC',300) from test.t1;
 | 
						|
Check blob table replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t2bt_id
 | 
						|
and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with blob data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t2bt_id;
 | 
						|
count(distinct node_id)
 | 
						|
4
 | 
						|
set @partitions = 'PARTITION p4 VALUES IN (4)';
 | 
						|
set @partitions = concat(@partitions,',PARTITION p3 VALUES IN (3)');
 | 
						|
set @partitions = concat(@partitions,',PARTITION p2 VALUES IN (2)');
 | 
						|
set @partitions = concat(@partitions,',PARTITION p1 VALUES IN (1)');
 | 
						|
set @@new = 1;
 | 
						|
create table hints (i int primary key) engine=ndb partition by list(i) (PARTITION p4 VALUES IN (4),PARTITION p3 VALUES IN (3),PARTITION p2 VALUES IN (2),PARTITION p1 VALUES IN (1));
 | 
						|
insert into hints values (4);
 | 
						|
Hint node by 4 of 4
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 4;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 4;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 4;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
insert into hints values (3);
 | 
						|
Hint node by 3 of 4
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 3;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 3;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 3;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
insert into hints values (2);
 | 
						|
Hint node by 2 of 4
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
insert into hints values (1);
 | 
						|
Hint node by 1 of 4
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
drop table hints;
 | 
						|
delete from t1;
 | 
						|
delete from t2;
 | 
						|
Nodegroup 2 created
 | 
						|
alter table t1 algorithm=inplace, reorganize partition;
 | 
						|
alter table t2 algorithm=inplace, reorganize partition;
 | 
						|
select id into @t1_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t1';
 | 
						|
select id into @t1ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t1_id and type = 3;
 | 
						|
select id into @t2_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t2';
 | 
						|
select id into @t2ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and type = 3;
 | 
						|
select id into @t2bt_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and fq_name like 'test/def/NDB$BLOB%';
 | 
						|
Put some data in.
 | 
						|
Make it more interesting for joining
 | 
						|
update test.t1 set c=c+1, d=d+1;
 | 
						|
select count(distinct node_id) into @nodes
 | 
						|
from ndbinfo.ndb$membership where group_id < 0xFFFFFF00;
 | 
						|
Check replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where fq_name='test/def/t1'
 | 
						|
   and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with table data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where fq_name='test/def/t1';
 | 
						|
count(distinct node_id)
 | 
						|
6
 | 
						|
Check UI replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t1ui_id
 | 
						|
and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with UI data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t1ui_id;
 | 
						|
count(distinct node_id)
 | 
						|
6
 | 
						|
Put some data in.
 | 
						|
insert into test.t2 select a,b,c,repeat('BJC',300) from test.t1;
 | 
						|
Check blob table replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t2bt_id
 | 
						|
and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with blob data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t2bt_id;
 | 
						|
count(distinct node_id)
 | 
						|
6
 | 
						|
set @partitions = 'PARTITION p6 VALUES IN (6)';
 | 
						|
set @partitions = concat(@partitions,',PARTITION p5 VALUES IN (5)');
 | 
						|
set @partitions = concat(@partitions,',PARTITION p4 VALUES IN (4)');
 | 
						|
set @partitions = concat(@partitions,',PARTITION p3 VALUES IN (3)');
 | 
						|
set @partitions = concat(@partitions,',PARTITION p2 VALUES IN (2)');
 | 
						|
set @partitions = concat(@partitions,',PARTITION p1 VALUES IN (1)');
 | 
						|
set @@new = 1;
 | 
						|
create table hints (i int primary key) engine=ndb partition by list(i) (PARTITION p6 VALUES IN (6),PARTITION p5 VALUES IN (5),PARTITION p4 VALUES IN (4),PARTITION p3 VALUES IN (3),PARTITION p2 VALUES IN (2),PARTITION p1 VALUES IN (1));
 | 
						|
insert into hints values (6);
 | 
						|
Hint node by 6 of 6
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 6;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 6;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 6;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
insert into hints values (5);
 | 
						|
Hint node by 5 of 6
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 5;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 5;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 5;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
insert into hints values (4);
 | 
						|
Hint node by 4 of 6
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 4;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 4;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 4;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
insert into hints values (3);
 | 
						|
Hint node by 3 of 6
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 3;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 3;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 3;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
insert into hints values (2);
 | 
						|
Hint node by 2 of 6
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
insert into hints values (1);
 | 
						|
Hint node by 1 of 6
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
drop table hints;
 | 
						|
delete from t1;
 | 
						|
delete from t2;
 | 
						|
drop table test.t1;
 | 
						|
drop table test.t2;
 | 
						|
Drop Node Group 2 done
 | 
						|
Drop Node Group 1 done
 | 
						|
Test read-locality of FULLY-REPLICATED with FOR_RA_BY_NODE
 | 
						|
create table test.t1 (a int primary key,
 | 
						|
b int,
 | 
						|
c int,
 | 
						|
d int,
 | 
						|
unique(b) using hash,
 | 
						|
key(c),
 | 
						|
key(a,c))
 | 
						|
comment="NDB_TABLE=FULLY_REPLICATED=1,PARTITION_BALANCE=FOR_RA_BY_NODE"
 | 
						|
   engine=ndb;
 | 
						|
Warnings:
 | 
						|
Warning	1121	Ndb does not support unique index on NULL valued attributes, index access with NULL value will become full table scan
 | 
						|
create table test.t2 (a int primary key,
 | 
						|
b int,
 | 
						|
c int,
 | 
						|
d text,
 | 
						|
unique(b) using hash,
 | 
						|
key(c))
 | 
						|
comment="NDB_TABLE=FULLY_REPLICATED=1,PARTITION_BALANCE=FOR_RA_BY_NODE"
 | 
						|
   engine=ndb;
 | 
						|
Warnings:
 | 
						|
Warning	1121	Ndb does not support unique index on NULL valued attributes, index access with NULL value will become full table scan
 | 
						|
select id into @t1_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t1';
 | 
						|
select id into @t1ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t1_id and type = 3;
 | 
						|
select id into @t2_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t2';
 | 
						|
select id into @t2ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and type = 3;
 | 
						|
select id into @t2bt_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and fq_name like 'test/def/NDB$BLOB%';
 | 
						|
Put some data in.
 | 
						|
Make it more interesting for joining
 | 
						|
update test.t1 set c=c+1, d=d+1;
 | 
						|
select count(distinct node_id) into @nodes
 | 
						|
from ndbinfo.ndb$membership where group_id < 0xFFFFFF00;
 | 
						|
Check replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where fq_name='test/def/t1'
 | 
						|
   and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with table data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where fq_name='test/def/t1';
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check UI replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t1ui_id
 | 
						|
and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with UI data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t1ui_id;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Put some data in.
 | 
						|
insert into test.t2 select a,b,c,repeat('BJC',300) from test.t1;
 | 
						|
Check blob table replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t2bt_id
 | 
						|
and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with blob data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t2bt_id;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
set @partitions = 'PARTITION p2 VALUES IN (2)';
 | 
						|
set @partitions = concat(@partitions,',PARTITION p1 VALUES IN (1)');
 | 
						|
set @@new = 1;
 | 
						|
create table hints (i int primary key) engine=ndb partition by list(i) (PARTITION p2 VALUES IN (2),PARTITION p1 VALUES IN (1));
 | 
						|
insert into hints values (2);
 | 
						|
Hint node by 2 of 2
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
insert into hints values (1);
 | 
						|
Hint node by 1 of 2
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
drop table hints;
 | 
						|
delete from t1;
 | 
						|
delete from t2;
 | 
						|
Nodegroup 1 created
 | 
						|
alter table t1 algorithm=inplace, reorganize partition;
 | 
						|
alter table t2 algorithm=inplace, reorganize partition;
 | 
						|
select id into @t1_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t1';
 | 
						|
select id into @t1ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t1_id and type = 3;
 | 
						|
select id into @t2_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t2';
 | 
						|
select id into @t2ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and type = 3;
 | 
						|
select id into @t2bt_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and fq_name like 'test/def/NDB$BLOB%';
 | 
						|
Put some data in.
 | 
						|
Make it more interesting for joining
 | 
						|
update test.t1 set c=c+1, d=d+1;
 | 
						|
select count(distinct node_id) into @nodes
 | 
						|
from ndbinfo.ndb$membership where group_id < 0xFFFFFF00;
 | 
						|
Check replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where fq_name='test/def/t1'
 | 
						|
   and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with table data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where fq_name='test/def/t1';
 | 
						|
count(distinct node_id)
 | 
						|
4
 | 
						|
Check UI replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t1ui_id
 | 
						|
and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with UI data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t1ui_id;
 | 
						|
count(distinct node_id)
 | 
						|
4
 | 
						|
Put some data in.
 | 
						|
insert into test.t2 select a,b,c,repeat('BJC',300) from test.t1;
 | 
						|
Check blob table replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t2bt_id
 | 
						|
and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with blob data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t2bt_id;
 | 
						|
count(distinct node_id)
 | 
						|
4
 | 
						|
set @partitions = 'PARTITION p4 VALUES IN (4)';
 | 
						|
set @partitions = concat(@partitions,',PARTITION p3 VALUES IN (3)');
 | 
						|
set @partitions = concat(@partitions,',PARTITION p2 VALUES IN (2)');
 | 
						|
set @partitions = concat(@partitions,',PARTITION p1 VALUES IN (1)');
 | 
						|
set @@new = 1;
 | 
						|
create table hints (i int primary key) engine=ndb partition by list(i) (PARTITION p4 VALUES IN (4),PARTITION p3 VALUES IN (3),PARTITION p2 VALUES IN (2),PARTITION p1 VALUES IN (1));
 | 
						|
insert into hints values (4);
 | 
						|
Hint node by 4 of 4
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 4;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 4;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 4;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
insert into hints values (3);
 | 
						|
Hint node by 3 of 4
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 3;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 3;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 3;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
insert into hints values (2);
 | 
						|
Hint node by 2 of 4
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
insert into hints values (1);
 | 
						|
Hint node by 1 of 4
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
drop table hints;
 | 
						|
delete from t1;
 | 
						|
delete from t2;
 | 
						|
Nodegroup 2 created
 | 
						|
alter table t1 algorithm=inplace, reorganize partition;
 | 
						|
alter table t2 algorithm=inplace, reorganize partition;
 | 
						|
select id into @t1_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t1';
 | 
						|
select id into @t1ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t1_id and type = 3;
 | 
						|
select id into @t2_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t2';
 | 
						|
select id into @t2ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and type = 3;
 | 
						|
select id into @t2bt_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and fq_name like 'test/def/NDB$BLOB%';
 | 
						|
Put some data in.
 | 
						|
Make it more interesting for joining
 | 
						|
update test.t1 set c=c+1, d=d+1;
 | 
						|
select count(distinct node_id) into @nodes
 | 
						|
from ndbinfo.ndb$membership where group_id < 0xFFFFFF00;
 | 
						|
Check replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where fq_name='test/def/t1'
 | 
						|
   and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with table data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where fq_name='test/def/t1';
 | 
						|
count(distinct node_id)
 | 
						|
6
 | 
						|
Check UI replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t1ui_id
 | 
						|
and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with UI data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t1ui_id;
 | 
						|
count(distinct node_id)
 | 
						|
6
 | 
						|
Put some data in.
 | 
						|
insert into test.t2 select a,b,c,repeat('BJC',300) from test.t1;
 | 
						|
Check blob table replicas
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t2bt_id
 | 
						|
and fragment_num=0;
 | 
						|
count(distinct node_id)
 | 
						|
2
 | 
						|
Check nodes with blob data
 | 
						|
select count(distinct node_id)
 | 
						|
from ndbinfo.operations_per_fragment
 | 
						|
where table_id = @t2bt_id;
 | 
						|
count(distinct node_id)
 | 
						|
6
 | 
						|
set @partitions = 'PARTITION p6 VALUES IN (6)';
 | 
						|
set @partitions = concat(@partitions,',PARTITION p5 VALUES IN (5)');
 | 
						|
set @partitions = concat(@partitions,',PARTITION p4 VALUES IN (4)');
 | 
						|
set @partitions = concat(@partitions,',PARTITION p3 VALUES IN (3)');
 | 
						|
set @partitions = concat(@partitions,',PARTITION p2 VALUES IN (2)');
 | 
						|
set @partitions = concat(@partitions,',PARTITION p1 VALUES IN (1)');
 | 
						|
set @@new = 1;
 | 
						|
create table hints (i int primary key) engine=ndb partition by list(i) (PARTITION p6 VALUES IN (6),PARTITION p5 VALUES IN (5),PARTITION p4 VALUES IN (4),PARTITION p3 VALUES IN (3),PARTITION p2 VALUES IN (2),PARTITION p1 VALUES IN (1));
 | 
						|
insert into hints values (6);
 | 
						|
Hint node by 6 of 6
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 6;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 6;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 6;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
insert into hints values (5);
 | 
						|
Hint node by 5 of 6
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 5;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 5;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 5;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
insert into hints values (4);
 | 
						|
Hint node by 4 of 6
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 4;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 4;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 4;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
insert into hints values (3);
 | 
						|
Hint node by 3 of 6
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 3;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 3;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 3;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
insert into hints values (2);
 | 
						|
Hint node by 2 of 6
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 2;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
insert into hints values (1);
 | 
						|
Hint node by 1 of 6
 | 
						|
Tests on T1 (!Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
PK lookups
 | 
						|
explain select * from test.t1 where t1.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t1 where t1.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t1 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t1;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t1	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Test pushed queries (SPJ)
 | 
						|
Pushed pk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed uk->pk
 | 
						|
Lookup to get a.d, feeding pk lookup of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a
 | 
						|
where a.b = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	b	b	5	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed pk->uk
 | 
						|
Lookup to get a.d, feeding uk lookup of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b
 | 
						|
where a.a = 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	eq_ref	PRIMARY,a	PRIMARY	4	const	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding pk lookups of b.a
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	PRIMARY,a	PRIMARY	4	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.a;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-lookups
 | 
						|
Table scan to get a.d, feeding uk lookups of b.b
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	ALL	NULL	NULL	NULL	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
 | 
						|
1	SIMPLE	b	#	eq_ref	b	b	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
a.d = b.b;
 | 
						|
commit;
 | 
						|
 | 
						|
Pushed scan originating sub-scans
 | 
						|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
 | 
						|
explain select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	a	#	range	PRIMARY,a	PRIMARY	4	NULL	#	#	Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
 | 
						|
1	SIMPLE	b	#	ref	c	c	5	test.a.d	#	#	Child of 'a' in pushed join@1
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
 | 
						|
Error insert to ensure that SPJ requests are purely local
 | 
						|
 | 
						|
begin;
 | 
						|
select * from hints where i = 1;
 | 
						|
select a.a, a.d, b.d
 | 
						|
from
 | 
						|
test.t1 a
 | 
						|
join
 | 
						|
test.t1 b
 | 
						|
on
 | 
						|
b.c=a.d
 | 
						|
where
 | 
						|
a.a>10;
 | 
						|
commit;
 | 
						|
 | 
						|
Tests on T2 (Blobs)
 | 
						|
Test some basic NdbApi
 | 
						|
explain select * from test.t2 where t2.a=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	PRIMARY	PRIMARY	4	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
UI lookups
 | 
						|
explain select * from test.t2 where t2.b=6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	eq_ref	b	b	5	const	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
OI scan
 | 
						|
explain select * from test.t2 where c > 6;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	range	c	c	5	NULL	#	#	Using pushed condition (`test`.`t2`.`c` > 6)
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
Table scan
 | 
						|
explain select * from test.t2;
 | 
						|
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | 
						|
1	SIMPLE	t2	#	ALL	NULL	NULL	NULL	NULL	#	#	NULL
 | 
						|
Warnings:
 | 
						|
Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
 | 
						|
Error insert to ensure that TC requests are purely local
 | 
						|
 | 
						|
 | 
						|
drop table hints;
 | 
						|
delete from t1;
 | 
						|
delete from t2;
 | 
						|
drop table test.t1;
 | 
						|
drop table test.t2;
 |