@Override public ExplainPlan getExplainPlan() throws SQLException { List<String> planSteps = delegate.getExplainPlan().getPlanSteps(); planSteps.add("UNNEST"); return new ExplainPlan(planSteps); }
@Override public ExplainPlan getExplainPlan() throws SQLException { return new ExplainPlan(Collections.singletonList("CREATE SEQUENCE")); } };
@Override public List<String> getPreSteps(HashJoinPlan parent) throws SQLException { List<String> steps = Lists.newArrayList(); steps.add(" EXECUTE " + (expectSingleRow ? "SINGLE" : "MULTIPLE") + "-ROW SUBQUERY"); for (String step : plan.getExplainPlan().getPlanSteps()) { steps.add(" " + step); } return steps; }
@Override public ExplainPlan getExplainPlan() throws SQLException { return new ExplainPlan(Collections.singletonList("OPEN CURSOR")); } };
@Override public List<String> getPreSteps(HashJoinPlan parent) throws SQLException { List<String> steps = Lists.newArrayList(); boolean earlyEvaluation = parent.joinInfo.earlyEvaluation()[index]; boolean skipMerge = parent.joinInfo.getSchemas()[index].getFieldCount() == 0; if (hashExpressions != null) { steps.add(" PARALLEL " + parent.joinInfo.getJoinTypes()[index].toString().toUpperCase() + "-JOIN TABLE " + index + (earlyEvaluation ? "" : "(DELAYED EVALUATION)") + (skipMerge ? " (SKIP MERGE)" : "")); } else { steps.add(" SKIP-SCAN-JOIN TABLE " + index); } for (String step : plan.getExplainPlan().getPlanSteps()) { steps.add(" " + step); } return steps; }
@Override public ExplainPlan getExplainPlan() throws SQLException { List<String> queryPlanSteps = queryPlan.getExplainPlan().getPlanSteps(); List<String> planSteps = Lists.newArrayListWithExpectedSize(queryPlanSteps.size()+1); planSteps.add("UPSERT SELECT"); planSteps.addAll(queryPlanSteps); return new ExplainPlan(planSteps); }
@Override public ExplainPlan getExplainPlan() throws SQLException { return new ExplainPlan(Collections.singletonList("CLOSE CURSOR")); } };
@Test public void testSerialHint() throws Exception { // test AggregatePlan String query = "SELECT /*+ SERIAL */ COUNT(*) FROM atable"; assertTrue("Expected a SERIAL query", compileStatement(query).getExplainPlan().getPlanSteps().get(0).contains("SERIAL")); // test ScanPlan query = "SELECT /*+ SERIAL */ * FROM atable limit 10"; assertTrue("Expected a SERIAL query", compileStatement(query, Collections.emptyList(), 10).getExplainPlan().getPlanSteps().get(0).contains("SERIAL")); } }
@Override public ExplainPlan getExplainPlan() throws SQLException { List<String> queryPlanSteps = aggPlan.getExplainPlan().getPlanSteps(); List<String> planSteps = Lists.newArrayListWithExpectedSize(queryPlanSteps.size()+1); planSteps.add("DELETE ROWS"); planSteps.addAll(queryPlanSteps); return new ExplainPlan(planSteps); }
@Override public ExplainPlan getExplainPlan() throws SQLException { return new ExplainPlan(Collections.singletonList("CREATE TABLE")); } };
@Override public Object run() throws Exception { try (Connection conn = getConnection(tenantId); Statement stmt = conn.createStatement()) { // Accessing only the 'data' from the table uses index since index tables are built on 'data' column String readTableSQL = "SELECT data FROM " + tableName; ResultSet rs = stmt.executeQuery(readTableSQL); assertNotNull(rs); int i = 0; String explainPlan = Joiner.on(" ").join(((PhoenixStatement) stmt).getQueryPlan().getExplainPlan().getPlanSteps()); assertTrue(explainPlan.contains("_IDX_")); rs = stmt.executeQuery(readTableSQL); if (tenantId != null) { rs.next(); assertEquals(((PhoenixConnection) conn).getTenantId().toString(), tenantId); // For tenant ID "o3", the value in table will be 3 assertEquals(Character.toString(tenantId.charAt(1)), rs.getString(1)); // Only 1 record is inserted per Tenant assertFalse(rs.next()); } else { while (rs.next()) { assertEquals(Integer.toString(i), rs.getString(1)); i++; } assertEquals(NUM_RECORDS, i); } } return null; } };
@Override public ExplainPlan getExplainPlan() throws SQLException { List<String> queryPlanSteps = bestPlan.getExplainPlan().getPlanSteps(); List<String> planSteps = Lists.newArrayListWithExpectedSize(queryPlanSteps.size()+1); planSteps.add("DELETE ROWS"); planSteps.addAll(queryPlanSteps); return new ExplainPlan(planSteps); }
@Override public ExplainPlan getExplainPlan() throws SQLException { return new ExplainPlan(Collections.singletonList("CREATE SCHEMA")); }
@Override public Object run() throws Exception { try (Connection conn = getConnection(tenantId); Statement stmt = conn.createStatement()) { // Accessing all the data from the table avoids the use of index String readTableSQL = "SELECT data, val FROM " + tableName; ResultSet rs = stmt.executeQuery(readTableSQL); assertNotNull(rs); int i = 0; String explainPlan = Joiner.on(" ").join(((PhoenixStatement)stmt).getQueryPlan().getExplainPlan().getPlanSteps()); rs = stmt.executeQuery(readTableSQL); if(tenantId != null) { rs.next(); assertFalse(explainPlan.contains("_IDX_")); assertEquals(((PhoenixConnection)conn).getTenantId().toString(), tenantId); // For tenant ID "o3", the value in table will be 3 assertEquals(Character.toString(tenantId.charAt(1)), rs.getString(1)); // Only 1 record is inserted per Tenant assertFalse(rs.next()); } else { while(rs.next()) { assertEquals(Integer.toString(i), rs.getString(1)); assertEquals(i, rs.getInt(2)); i++; } assertEquals(NUM_RECORDS, i); } } return null; } };
@Override public ExplainPlan getExplainPlan() throws SQLException { List<String> planSteps = Lists.newArrayList(delegate.getExplainPlan().getPlanSteps()); if (postFilter != null) { planSteps.add("CLIENT FILTER BY " + postFilter.toString()); } return new ExplainPlan(planSteps); }
@Override public ExplainPlan getExplainPlan() throws SQLException { return new ExplainPlan(Collections.singletonList("USE SCHEMA")); }
List<String> planSteps = plan.getExplainPlan().getPlanSteps(); List<Tuple> tuples = Lists.newArrayListWithExpectedSize(planSteps.size()); Long estimatedBytesToScan = plan.getEstimatedBytesToScan();
@Override public ExplainPlan getExplainPlan() throws SQLException { List<String> queryPlanSteps = aggPlan.getExplainPlan().getPlanSteps(); List<String> planSteps = Lists.newArrayListWithExpectedSize(queryPlanSteps.size()+1); planSteps.add("UPSERT ROWS"); planSteps.addAll(queryPlanSteps); return new ExplainPlan(planSteps); }
@Override public ExplainPlan getExplainPlan() throws SQLException { return new ExplainPlan(Collections.singletonList("ALTER INDEX")); }
@Override public List<String> getPreSteps(HashJoinPlan parent) throws SQLException { List<String> steps = Lists.newArrayList(); steps.add(" EXECUTE " + (expectSingleRow ? "SINGLE" : "MULTIPLE") + "-ROW SUBQUERY"); for (String step : plan.getExplainPlan().getPlanSteps()) { steps.add(" " + step); } return steps; }