Skip to content

Commit b1561d8

Browse files
committed
Add tests
1 parent ef1490f commit b1561d8

3 files changed

Lines changed: 114 additions & 8 deletions

File tree

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package org.apache.ignite.internal.sql.engine.planner.hints;
2+
3+
import java.util.function.UnaryOperator;
4+
import org.apache.ignite.internal.sql.engine.framework.TestBuilders.TableBuilder;
5+
import org.apache.ignite.internal.sql.engine.planner.AbstractPlannerTest;
6+
import org.apache.ignite.internal.sql.engine.rel.AbstractIgniteJoin;
7+
import org.apache.ignite.internal.sql.engine.rel.IgniteTableScan;
8+
import org.apache.ignite.internal.sql.engine.schema.IgniteSchema;
9+
import org.apache.ignite.internal.sql.engine.trait.IgniteDistributions;
10+
import org.apache.ignite.internal.type.NativeTypes;
11+
import org.junit.jupiter.api.BeforeAll;
12+
import org.junit.jupiter.api.Test;
13+
14+
public class HintOverridingPlannerTest extends AbstractPlannerTest {
15+
private static IgniteSchema SCHEMA;
16+
17+
private static final String TBL1 = "TBL1";
18+
19+
private static final String TBL2 = "TBL2";
20+
21+
@BeforeAll
22+
public static void setup() {
23+
SCHEMA = createSchemaFrom(
24+
createSimpleTable(TBL1, 100)
25+
.andThen(addHashIndex("ID"))
26+
.andThen(addSortIndex("VAL1"))
27+
.andThen(addSortIndex("VAL2", "VAL3"))
28+
.andThen(addSortIndex("VAL3")),
29+
createSimpleTable(TBL2, 100_000)
30+
.andThen(addHashIndex("ID"))
31+
.andThen(addSortIndex("VAL1"))
32+
.andThen(addSortIndex("VAL2"))
33+
.andThen(addSortIndex("VAL3"))
34+
);
35+
}
36+
37+
@Test
38+
public void usingDifferentIndexesForSameTable() throws Exception {
39+
var sql = "SELECT * FROM"
40+
+ " (SELECT t1.val1, t1.val2, t1.val3 FROM tbl1 /*+ NO_INDEX */ as t1"
41+
+ " LEFT JOIN tbl2 /*+ FORCE_INDEX(idx_val3) */ as t2 ON (t1.val2 = t2.val2 AND t2.val2 > 'x')) as t"
42+
+ " LEFT JOIN tbl2 /*+ FORCE_INDEX(idx_val2) */ as t3 ON (t.val3 = t3.val3 AND t3.val3 < 'a')";
43+
44+
assertPlan(sql, SCHEMA, isInstanceOf(AbstractIgniteJoin.class)
45+
.and(input(0, nodeOrAnyChild(isInstanceOf(AbstractIgniteJoin.class)
46+
.and(input(0, nodeOrAnyChild(isInstanceOf(IgniteTableScan.class))))
47+
.and(input(1, nodeOrAnyChild(isIndexScan(TBL2, "IDX_VAL3")
48+
.and(scan -> scan.searchBounds() == null)
49+
.and(scan -> ">($t0, _UTF-8'x')".equals(scan.condition().toString()))
50+
)))
51+
)))
52+
.and(input(1, nodeOrAnyChild(isIndexScan(TBL2, "IDX_VAL2")
53+
.and(scan -> scan.searchBounds() == null)
54+
.and(scan -> "<($t3, _UTF-8'a')".equals(scan.condition().toString()))
55+
)))
56+
);
57+
}
58+
59+
@Test
60+
public void testHintOverriding() throws Exception {
61+
var sql = "SELECT * FROM"
62+
+ " (SELECT /*+ NO_INDEX */ t1.val1, t1.val2, t1.val3 FROM tbl1 as t1 LEFT JOIN tbl2 as t2 ON (t1.val2 = t2.val2)) as t"
63+
+ " LEFT JOIN tbl2 /*+ FORCE_INDEX(idx_val2) */ as t3 ON (t.val3 = t3.val3)";
64+
65+
assertPlan(sql, SCHEMA, isInstanceOf(AbstractIgniteJoin.class)
66+
.and(input(0, nodeOrAnyChild(isInstanceOf(AbstractIgniteJoin.class)
67+
.and(input(0, nodeOrAnyChild(isInstanceOf(IgniteTableScan.class))))
68+
.and(input(1, nodeOrAnyChild(isInstanceOf(IgniteTableScan.class))))
69+
)))
70+
.and(input(1, nodeOrAnyChild(isIndexScan(TBL2, "IDX_VAL2"))))
71+
);
72+
73+
sql = "SELECT * FROM"
74+
+ " (SELECT /*+ FORCE_INDEX(idx_val2) */ t1.val1, t1.val2, t1.val3 FROM tbl1 /*+ NO_INDEX */ as t1 "
75+
+ " LEFT JOIN tbl2 as t2 ON (t1.val2 = t2.val2)) as t"
76+
+ " LEFT JOIN tbl2 /*+ NO_INDEX */ as t3 ON (t.val3 = t3.val3)";
77+
78+
assertPlan(sql, SCHEMA, isInstanceOf(AbstractIgniteJoin.class)
79+
.and(input(0, nodeOrAnyChild(isInstanceOf(AbstractIgniteJoin.class)
80+
.and(input(0, nodeOrAnyChild(isInstanceOf(IgniteTableScan.class))))
81+
.and(input(1, nodeOrAnyChild(isIndexScan(TBL2, "IDX_VAL2"))))
82+
)))
83+
.and(input(1, nodeOrAnyChild(isInstanceOf(IgniteTableScan.class))))
84+
);
85+
}
86+
87+
private static UnaryOperator<TableBuilder> createSimpleTable(String name, int sz) {
88+
return t -> t.name(name)
89+
.size(sz)
90+
.distribution(IgniteDistributions.single())
91+
.addKeyColumn("ID", NativeTypes.INT32)
92+
.addColumn("VAL1", NativeTypes.INT32)
93+
.addColumn("VAL2", NativeTypes.STRING)
94+
.addColumn("VAL3", NativeTypes.STRING);
95+
}
96+
}

modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/hints/IndexHintPlannerTest.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -148,15 +148,21 @@ public void testWrongIndexName(boolean force) {
148148

149149
@Test
150150
public void testSingleTable() throws Exception {
151-
var sql = "SELECT /*+ FORCE_INDEX({}) */ * FROM TBL1 WHERE val2 = 'v' AND val3 = 'v'";
151+
var sql1 = "SELECT /*+ FORCE_INDEX({}) */ * FROM TBL1 WHERE val2 = 'v' AND val3 = 'v'";
152+
var sql2 = "SELECT * FROM TBL1 /*+ FORCE_INDEX({}) */ WHERE val2 = 'v' AND val3 = 'v'";
152153

153-
assertCertainIndex(format(sql, ""), TBL1, "IDX_VAL2_VAL3");
154+
assertCertainIndex(format(sql1, ""), TBL1, "IDX_VAL2_VAL3");
155+
assertCertainIndex(format(sql2, ""), TBL1, "IDX_VAL2_VAL3");
154156

155-
assertPlan(format(sql, "IDX_VAL2_VAL3, IDX_VAL3"), SCHEMA, nodeOrAnyChild(isIndexScan(TBL1, "IDX_VAL2_VAL3")
157+
assertPlan(format(sql1, "IDX_VAL1, IDX_VAL3"), SCHEMA, nodeOrAnyChild(isIndexScan(TBL1, "IDX_VAL1")
158+
.or(isIndexScan(TBL1, "IDX_VAL3"))));
159+
assertPlan(format(sql2, "IDX_VAL1, IDX_VAL3"), SCHEMA, nodeOrAnyChild(isIndexScan(TBL1, "IDX_VAL1")
156160
.or(isIndexScan(TBL1, "IDX_VAL3"))));
157161

158-
assertPlan("SELECT /*+ FORCE_INDEX(IDX_VAL2_VAL3), FORCE_INDEX(IDX_VAL3) */ * FROM TBL1 WHERE val2 = 'v' AND val3 = 'v'", SCHEMA,
159-
nodeOrAnyChild(isIndexScan(TBL1, "IDX_VAL2_VAL3").or(isIndexScan(TBL1, "IDX_VAL3"))));
162+
assertPlan("SELECT /*+ FORCE_INDEX(IDX_VAL1), FORCE_INDEX(IDX_VAL3) */ * FROM TBL1 WHERE val2 = 'v' AND val3 = 'v'", SCHEMA,
163+
nodeOrAnyChild(isIndexScan(TBL1, "IDX_VAL1").or(isIndexScan(TBL1, "IDX_VAL3"))));
164+
assertPlan("SELECT * FROM TBL1 /*+ FORCE_INDEX(IDX_VAL1), FORCE_INDEX(IDX_VAL3) */ WHERE val2 = 'v' AND val3 = 'v'", SCHEMA,
165+
nodeOrAnyChild(isIndexScan(TBL1, "IDX_VAL1").or(isIndexScan(TBL1, "IDX_VAL3"))));
160166
}
161167

162168
@Test

modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/hints/NoIndexHintPlannerTest.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,17 @@ public static void setup() {
6060
@Test
6161
public void testSingleTable() throws Exception {
6262
assertNoAnyIndex("SELECT /*+ NO_INDEX */ * FROM TBL1 WHERE id = 0");
63+
assertNoAnyIndex("SELECT * FROM TBL1 /*+ NO_INDEX */ WHERE id = 0");
6364

64-
var sql = "SELECT /*+ NO_INDEX({}) */ * FROM TBL1 WHERE id = 0";
65-
66-
assertNoAnyIndex(format(sql, ""));
65+
assertNoAnyIndex("SELECT /*+ NO_INDEX() */ * FROM TBL1 WHERE id = 0");
66+
assertNoAnyIndex("SELECT * FROM TBL1 /*+ NO_INDEX() */ WHERE id = 0");
6767

6868
assertNoAnyIndex("SELECT /*+ NO_INDEX(IDX_VAL1, IDX_VAL2_VAL3) */ * FROM TBL1 WHERE val1=1 and val2='v'");
6969
assertNoAnyIndex("SELECT /*+ NO_INDEX(IDX_VAL1), NO_INDEX(IDX_VAL2_VAL3) */ * FROM TBL1 WHERE val1=1 and val2='v'");
70+
71+
assertNoAnyIndex(format("SELECT * FROM TBL1 /*+ NO_INDEX({}) */ WHERE id = 0", ""));
72+
assertNoAnyIndex("SELECT * FROM TBL1 /*+ NO_INDEX(IDX_VAL1, IDX_VAL2_VAL3) */ WHERE val1=1 and val2='v'");
73+
assertNoAnyIndex("SELECT * FROM TBL1 /*+ NO_INDEX(IDX_VAL1), NO_INDEX(IDX_VAL2_VAL3) */ WHERE val1=1 and val2='v'");
7074
}
7175

7276
@Test

0 commit comments

Comments
 (0)