use of io.trino.sql.planner.Plan in project trino by trinodb.
the class TestUnion method testUnionOnProbeSide.
@Test
public void testUnionOnProbeSide() {
Plan plan = plan("SELECT * FROM (SELECT * FROM nation UNION ALL SELECT * from nation) n, region r WHERE n.regionkey=r.regionkey", OPTIMIZED_AND_VALIDATED, false);
assertPlanIsFullyDistributed(plan);
}
use of io.trino.sql.planner.Plan in project trino by trinodb.
the class TestUnion method testUnionUnderTopN.
@Test
public void testUnionUnderTopN() {
Plan plan = plan("SELECT * FROM (" + " SELECT regionkey FROM nation " + " UNION ALL " + " SELECT nationkey FROM nation" + ") t(a) " + "ORDER BY a LIMIT 1", OPTIMIZED_AND_VALIDATED, false);
List<PlanNode> remotes = searchFrom(plan.getRoot()).where(TestUnion::isRemoteExchange).findAll();
assertEquals(remotes.size(), 1, "There should be exactly one RemoteExchange");
assertEquals(((ExchangeNode) Iterables.getOnlyElement(remotes)).getType(), GATHER);
int numberOfpartialTopN = searchFrom(plan.getRoot()).where(planNode -> planNode instanceof TopNNode && ((TopNNode) planNode).getStep() == TopNNode.Step.PARTIAL).count();
assertEquals(numberOfpartialTopN, 2, "There should be exactly two partial TopN nodes");
assertPlanIsFullyDistributed(plan);
}
use of io.trino.sql.planner.Plan in project trino by trinodb.
the class TestUnion method testSimpleUnion.
@Test
public void testSimpleUnion() {
Plan plan = plan("SELECT suppkey FROM supplier UNION ALL SELECT nationkey FROM nation", OPTIMIZED_AND_VALIDATED, false);
List<PlanNode> remotes = searchFrom(plan.getRoot()).where(TestUnion::isRemoteExchange).findAll();
assertEquals(remotes.size(), 1, "There should be exactly one RemoteExchange");
assertEquals(((ExchangeNode) Iterables.getOnlyElement(remotes)).getType(), GATHER);
assertPlanIsFullyDistributed(plan);
}
use of io.trino.sql.planner.Plan in project trino by trinodb.
the class RuleAssert method matches.
public void matches(PlanMatchPattern pattern) {
RuleApplication ruleApplication = applyRule();
TypeProvider types = ruleApplication.types;
if (!ruleApplication.wasRuleApplied()) {
fail(format("%s did not fire for:\n%s", rule, formatPlan(plan, types)));
}
PlanNode actual = ruleApplication.getTransformedPlan();
if (actual == plan) {
// plans are not comparable, so we can only ensure they are not the same instance
fail(format("%s: rule fired but return the original plan:\n%s", rule, formatPlan(plan, types)));
}
if (!ImmutableSet.copyOf(plan.getOutputSymbols()).equals(ImmutableSet.copyOf(actual.getOutputSymbols()))) {
fail(format("%s: output schema of transformed and original plans are not equivalent\n" + "\texpected: %s\n" + "\tactual: %s", rule, plan.getOutputSymbols(), actual.getOutputSymbols()));
}
inTransaction(session -> {
assertPlan(session, metadata, functionManager, ruleApplication.statsProvider, new Plan(actual, types, StatsAndCosts.empty()), ruleApplication.lookup, pattern);
return null;
});
}
use of io.trino.sql.planner.Plan in project trino by trinodb.
the class BasePlanTest method assertPlanWithSession.
protected void assertPlanWithSession(@Language("SQL") String sql, Session session, boolean forceSingleNode, PlanMatchPattern pattern, Consumer<Plan> planValidator) {
queryRunner.inTransaction(session, transactionSession -> {
Plan actualPlan = queryRunner.createPlan(transactionSession, sql, OPTIMIZED_AND_VALIDATED, forceSingleNode, WarningCollector.NOOP);
PlanAssert.assertPlan(transactionSession, queryRunner.getMetadata(), queryRunner.getFunctionManager(), queryRunner.getStatsCalculator(), actualPlan, pattern);
planValidator.accept(actualPlan);
return null;
});
}
Aggregations