You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ma...@apache.org on 2017/04/13 05:10:40 UTC

[2/2] phoenix git commit: PHOENIX-3785 Replace unwrap(PhoenixStatement.class) with new Calcite-Phoenix statement classes

PHOENIX-3785 Replace unwrap(PhoenixStatement.class) with new Calcite-Phoenix statement classes


Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/d9caed0a
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/d9caed0a
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/d9caed0a

Branch: refs/heads/calcite
Commit: d9caed0a8cb10b6aae3e3c22b73e9dd5b8a2a05a
Parents: a78e008
Author: maryannxue <ma...@gmail.com>
Authored: Wed Apr 12 22:10:21 2017 -0700
Committer: maryannxue <ma...@gmail.com>
Committed: Wed Apr 12 22:10:21 2017 -0700

----------------------------------------------------------------------
 .../AlterMultiTenantTableWithViewsIT.java       |   9 +-
 .../org/apache/phoenix/end2end/BaseViewIT.java  |  10 +-
 .../apache/phoenix/end2end/CreateTableIT.java   |  13 +-
 .../apache/phoenix/end2end/GroupByCaseIT.java   |   7 +-
 .../phoenix/end2end/ParallelIteratorsIT.java    |   7 +-
 .../apache/phoenix/end2end/QueryTimeoutIT.java  |   7 +-
 .../org/apache/phoenix/end2end/SequenceIT.java  |   7 +-
 .../phoenix/end2end/SerialIteratorsIT.java      |   5 +-
 .../apache/phoenix/end2end/UpsertSelectIT.java  |   6 +-
 .../apache/phoenix/end2end/UpsertValuesIT.java  |   8 +-
 .../apache/phoenix/end2end/index/IndexIT.java   |   9 +-
 .../phoenix/end2end/index/LocalIndexIT.java     |   8 +-
 .../phoenix/end2end/index/ViewIndexIT.java      |  16 +-
 .../phoenix/iterate/PhoenixQueryTimeoutIT.java  |   6 +-
 .../iterate/RoundRobinResultIteratorIT.java     |  21 +--
 .../RoundRobinResultIteratorWithStatsIT.java    |  12 +-
 .../calcite/jdbc/PhoenixCalciteFactory.java     |  31 +++-
 .../rel/PhoenixToEnumerableConverter.java       |  13 +-
 .../apache/phoenix/execute/RuntimeContext.java  |  10 +-
 .../phoenix/compile/QueryCompilerTest.java      |  28 ++--
 .../phoenix/compile/QueryOptimizerTest.java     | 166 ++++++++-----------
 .../phoenix/filter/SkipScanBigFilterTest.java   |   4 +-
 .../apache/phoenix/util/PhoenixRuntimeTest.java |   5 +-
 .../java/org/apache/phoenix/util/TestUtil.java  |  11 ++
 24 files changed, 211 insertions(+), 208 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/d9caed0a/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterMultiTenantTableWithViewsIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterMultiTenantTableWithViewsIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterMultiTenantTableWithViewsIT.java
index 7b4ff68..89df159 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterMultiTenantTableWithViewsIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterMultiTenantTableWithViewsIT.java
@@ -31,7 +31,6 @@ import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
-import java.sql.Statement;
 import java.util.List;
 import java.util.Properties;
 
@@ -41,7 +40,6 @@ import org.apache.phoenix.compile.QueryPlan;
 import org.apache.phoenix.exception.SQLExceptionCode;
 import org.apache.phoenix.jdbc.PhoenixConnection;
 import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData;
-import org.apache.phoenix.jdbc.PhoenixStatement;
 import org.apache.phoenix.schema.ColumnNotFoundException;
 import org.apache.phoenix.schema.PColumn;
 import org.apache.phoenix.schema.PTable;
@@ -50,6 +48,7 @@ import org.apache.phoenix.schema.PTableType;
 import org.apache.phoenix.util.IndexUtil;
 import org.apache.phoenix.util.PhoenixRuntime;
 import org.apache.phoenix.util.SchemaUtil;
+import org.apache.phoenix.util.TestUtil;
 import org.junit.Test;
 
 import com.google.common.base.Objects;
@@ -397,9 +396,8 @@ public class AlterMultiTenantTableWithViewsIT extends ParallelStatsDisabledIT {
             String upsert = "UPSERT INTO " + view2 + " (K1, K2, K3, V1, V2, V3) VALUES ('key1', 'key2', 'key3', 'value1', 'value2', 'value3')";
             viewConn.createStatement().executeUpdate(upsert);
             viewConn.commit();
-            Statement stmt = viewConn.createStatement();
             String sql = "SELECT V2 FROM " + view2 + " WHERE V1 = 'value1' AND K3 = 'key3'";
-            QueryPlan plan = stmt.unwrap(PhoenixStatement.class).optimizeQuery(sql);
+            QueryPlan plan = (QueryPlan) TestUtil.getQueryPlan(viewConn, sql);
             assertTrue(plan.getTableRef().getTable().getName().getString().equals(SchemaUtil.normalizeIdentifier(view2Index)));
             ResultSet rs = viewConn.createStatement().executeQuery(sql);
             verifyNewColumns(rs, "value2");
@@ -463,9 +461,8 @@ public class AlterMultiTenantTableWithViewsIT extends ParallelStatsDisabledIT {
             try (Connection viewConn = getTenantConnection("tenant2")) {
                 viewConn.createStatement().executeUpdate(upsert);
                 viewConn.commit();
-                Statement stmt = viewConn.createStatement();
                 String sql = "SELECT V3 FROM " + divergedView + " WHERE V1 = 'V1' AND PK2 = 'PK2'";
-                QueryPlan plan = stmt.unwrap(PhoenixStatement.class).optimizeQuery(sql);
+                QueryPlan plan = (QueryPlan) TestUtil.getQueryPlan(viewConn, sql);
                 assertTrue(plan.getTableRef().getTable().getName().getString().equals(SchemaUtil.normalizeIdentifier(divergedViewIndex)));
                 ResultSet rs = viewConn.createStatement().executeQuery(sql);
                 verifyNewColumns(rs, "V3");

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d9caed0a/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseViewIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseViewIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseViewIT.java
index 478b234..9b4cfd6 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseViewIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseViewIT.java
@@ -26,12 +26,13 @@ import static org.junit.Assert.assertTrue;
 import java.math.BigDecimal;
 import java.sql.Connection;
 import java.sql.DriverManager;
+import java.sql.PreparedStatement;
 import java.sql.ResultSet;
-import java.sql.Statement;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
 
+import org.apache.calcite.jdbc.PhoenixCalciteFactory.PhoenixCalcitePreparedStatement;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.client.HTableInterface;
 import org.apache.hadoop.hbase.client.Result;
@@ -40,7 +41,6 @@ import org.apache.hadoop.hbase.client.Scan;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.Pair;
 import org.apache.phoenix.jdbc.PhoenixConnection;
-import org.apache.phoenix.jdbc.PhoenixStatement;
 import org.apache.phoenix.query.KeyRange;
 import org.apache.phoenix.util.MetaDataUtil;
 import org.apache.phoenix.util.QueryUtil;
@@ -220,9 +220,9 @@ public abstract class BaseViewIT extends ParallelStatsEnabledIT {
 
         
         query = "SELECT k1, k2, s FROM " + viewName + " WHERE s = 'foo'";
-        Statement statement = conn.createStatement();
-        rs = statement.executeQuery(query);
-        Scan scan = statement.unwrap(PhoenixStatement.class).getQueryPlan().getContext().getScan();
+        PreparedStatement statement = conn.prepareStatement(query);
+        rs = statement.executeQuery();
+        Scan scan = statement.unwrap(PhoenixCalcitePreparedStatement.class).getQueryPlan().getContext().getScan();
         assertTrue(rs.next());
         assertEquals(1, rs.getInt(1));
         assertEquals(120, rs.getInt(2));

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d9caed0a/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateTableIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateTableIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateTableIT.java
index 96ba71d..a9d5197 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateTableIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateTableIT.java
@@ -27,18 +27,19 @@ import static org.junit.Assert.fail;
 
 import java.sql.Connection;
 import java.sql.DriverManager;
+import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.sql.Statement;
 import java.util.List;
 import java.util.Properties;
 
+import org.apache.calcite.jdbc.PhoenixCalciteFactory.PhoenixCalcitePreparedStatement;
 import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.client.HBaseAdmin;
 import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.phoenix.compile.QueryPlan;
 import org.apache.phoenix.exception.SQLExceptionCode;
 import org.apache.phoenix.jdbc.PhoenixConnection;
-import org.apache.phoenix.jdbc.PhoenixStatement;
 import org.apache.phoenix.query.KeyRange;
 import org.apache.phoenix.query.QueryServices;
 import org.apache.phoenix.schema.NewerTableAlreadyExistsException;
@@ -69,10 +70,10 @@ public class CreateTableIT extends BaseClientManagedTimeIT {
         String query = "select count(*) from start_stop_test where pk >= 'EA' and pk < 'EZ'";
         props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2));
         conn = DriverManager.getConnection(getUrl(), props);
-        Statement statement = conn.createStatement();
-        statement.execute(query);
-        PhoenixStatement pstatement = statement.unwrap(PhoenixStatement.class);
-        List<KeyRange>splits = pstatement.getQueryPlan().getSplits();
+        PreparedStatement statement = conn.prepareStatement(query);
+        statement.execute();
+        PhoenixCalcitePreparedStatement pstatement = statement.unwrap(PhoenixCalcitePreparedStatement.class);
+        List<KeyRange>splits = ((QueryPlan) pstatement.getQueryPlan()).getSplits();
         assertTrue(splits.size() > 0);
     }
     

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d9caed0a/phoenix-core/src/it/java/org/apache/phoenix/end2end/GroupByCaseIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/GroupByCaseIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/GroupByCaseIT.java
index e201c07..642f0c0 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/GroupByCaseIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/GroupByCaseIT.java
@@ -33,6 +33,7 @@ import java.sql.Statement;
 import java.util.List;
 import java.util.Properties;
 
+import org.apache.calcite.jdbc.PhoenixCalciteFactory.PhoenixCalcitePreparedStatement;
 import org.apache.phoenix.compile.QueryPlan;
 import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData;
 import org.apache.phoenix.jdbc.PhoenixStatement;
@@ -639,9 +640,9 @@ public class GroupByCaseIT extends ParallelStatsDisabledIT {
                     "    AND container_id IN ( 'container1','container2','container3' )\n" + 
                     "    ORDER BY score DESC\n" + 
                     "    LIMIT 2";
-            Statement stmt = conn.createStatement();
-            ResultSet rs = stmt.executeQuery(query);
-            QueryPlan plan = stmt.unwrap(PhoenixStatement.class).getQueryPlan();
+            PreparedStatement stmt = conn.prepareStatement(query);
+            ResultSet rs = stmt.executeQuery();
+            QueryPlan plan = (QueryPlan) stmt.unwrap(PhoenixCalcitePreparedStatement.class).getQueryPlan();
             assertEquals(indexName, plan.getContext().getCurrentTable().getTable().getName().getString());
             assertFalse(plan.getOrderBy().getOrderByExpressions().isEmpty());
             assertTrue(rs.next());

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d9caed0a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ParallelIteratorsIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ParallelIteratorsIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ParallelIteratorsIT.java
index 717e7ac..05ee3c9 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ParallelIteratorsIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ParallelIteratorsIT.java
@@ -34,6 +34,7 @@ import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.calcite.jdbc.PhoenixCalciteFactory.PhoenixCalcitePreparedStatement;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.client.Scan;
 import org.apache.hadoop.hbase.util.Bytes;
@@ -129,10 +130,10 @@ public class ParallelIteratorsIT extends ParallelStatsEnabledIT {
         byte[][] splits = new byte[][] { K3, K9, KR };
         createTable(conn, splits);
         
-        PhoenixStatement stmt = conn.createStatement().unwrap(PhoenixStatement.class);
-        ResultSet rs = stmt.executeQuery("SELECT * FROM " + tableName + " LIMIT 1");
+        PreparedStatement stmt = conn.prepareStatement("SELECT * FROM " + tableName + " LIMIT 1");
+        ResultSet rs = stmt.executeQuery();
         rs.next();
-        QueryPlan plan = stmt.getQueryPlan();
+        QueryPlan plan = (QueryPlan) stmt.unwrap(PhoenixCalcitePreparedStatement.class).getQueryPlan();
         List<List<Scan>> nestedScans = plan.getScans();
         assertNotNull(nestedScans);
         for (List<Scan> scans : nestedScans) {

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d9caed0a/phoenix-core/src/it/java/org/apache/phoenix/end2end/QueryTimeoutIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/QueryTimeoutIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/QueryTimeoutIT.java
index 03af042..3244307 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/QueryTimeoutIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/QueryTimeoutIT.java
@@ -32,9 +32,10 @@ import java.sql.SQLTimeoutException;
 import java.util.Map;
 import java.util.Properties;
 
+import org.apache.calcite.jdbc.PhoenixCalciteFactory.PhoenixCalciteStatement;
+import org.apache.phoenix.compile.QueryPlan;
 import org.apache.phoenix.exception.SQLExceptionCode;
 import org.apache.phoenix.jdbc.PhoenixConnection;
-import org.apache.phoenix.jdbc.PhoenixStatement;
 import org.apache.phoenix.query.ConnectionQueryServices;
 import org.apache.phoenix.query.QueryServices;
 import org.apache.phoenix.query.QueryServicesOptions;
@@ -123,13 +124,13 @@ public class QueryTimeoutIT extends BaseUniqueNamesOwnClusterIT {
         conn.commit();
         conn.createStatement().execute("UPDATE STATISTICS " + tableName);
         
-        PhoenixStatement pstmt = conn.createStatement().unwrap(PhoenixStatement.class);
+        PhoenixCalciteStatement pstmt = conn.createStatement().unwrap(PhoenixCalciteStatement.class);
         pstmt.setQueryTimeout(1);
         long startTime = System.currentTimeMillis();
         try {
             ResultSet rs = pstmt.executeQuery("SELECT count(*) FROM " + tableName);
             // Force lots of chunks so query is cancelled
-            assertTrue(pstmt.getQueryPlan().getSplits().size() > 1000);
+            assertTrue(((QueryPlan) pstmt.getQueryPlan()).getSplits().size() > 1000);
             rs.next();
             fail("Total time of query was " + (System.currentTimeMillis() - startTime) + " ms, but expected to be greater than 1000");
         } catch (SQLTimeoutException e) {

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d9caed0a/phoenix-core/src/it/java/org/apache/phoenix/end2end/SequenceIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/SequenceIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/SequenceIT.java
index 46d91da..36592c5 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/SequenceIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/SequenceIT.java
@@ -34,8 +34,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 
+import org.apache.calcite.jdbc.PhoenixCalciteFactory.PhoenixCalciteStatement;
 import org.apache.phoenix.exception.SQLExceptionCode;
-import org.apache.phoenix.jdbc.PhoenixStatement;
 import org.apache.phoenix.query.QueryServices;
 import org.apache.phoenix.schema.SchemaNotFoundException;
 import org.apache.phoenix.schema.SequenceAlreadyExistsException;
@@ -407,8 +407,9 @@ public class SequenceIT extends BaseClientManagedTimeIT {
         nextConnection();
         conn.createStatement().execute("CREATE INDEX idx ON t(v1) INCLUDE (v2)");
         nextConnection();
-        PhoenixStatement stmt = conn.createStatement().unwrap(PhoenixStatement.class);
-        stmt.optimizeQuery("SELECT k, NEXT VALUE FOR seq.perf FROM t WHERE v1 = 'bar'");
+        PhoenixCalciteStatement stmt = conn.createStatement().unwrap(PhoenixCalciteStatement.class);
+        stmt.executeQuery("SELECT k, NEXT VALUE FOR seq.perf FROM t WHERE v1 = 'bar'");
+        stmt.getQueryPlan();
 	}
 	
 	@Test

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d9caed0a/phoenix-core/src/it/java/org/apache/phoenix/end2end/SerialIteratorsIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/SerialIteratorsIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/SerialIteratorsIT.java
index 1360a08..d3d85e1 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/SerialIteratorsIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/SerialIteratorsIT.java
@@ -25,6 +25,7 @@ import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.sql.Statement;
 import java.util.Properties;
 
 import org.apache.phoenix.jdbc.PhoenixStatement;
@@ -54,7 +55,7 @@ public class SerialIteratorsIT extends ParallelStatsDisabledIT {
         createTestTable(getUrl(), ddl);
         initTableValues(conn);
         String query = "SELECT t_id from " + tableName + " order by t_id desc limit " + 10;
-        PhoenixStatement stmt = conn.createStatement().unwrap(PhoenixStatement.class);
+        Statement stmt = conn.createStatement();
         ResultSet rs = stmt.executeQuery(query);
         int i = 25;
         while (i >= 16) {
@@ -62,7 +63,7 @@ public class SerialIteratorsIT extends ParallelStatsDisabledIT {
             assertEquals(strings[i--], rs.getString(1));
         }
         query = "SELECT t_id from " + tableName + " order by t_id limit " + 10;
-        stmt = conn.createStatement().unwrap(PhoenixStatement.class);
+        stmt = conn.createStatement();
         rs = stmt.executeQuery(query);
         i = 0;
         while (i < 10) {

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d9caed0a/phoenix-core/src/it/java/org/apache/phoenix/end2end/UpsertSelectIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/UpsertSelectIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/UpsertSelectIT.java
index 0a20d47..745af34 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/UpsertSelectIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/UpsertSelectIT.java
@@ -47,9 +47,9 @@ import java.sql.SQLException;
 import java.util.Map;
 import java.util.Properties;
 
+import org.apache.calcite.jdbc.PhoenixCalciteFactory.PhoenixCalcitePreparedStatement;
 import org.apache.phoenix.compile.QueryPlan;
 import org.apache.phoenix.exception.SQLExceptionCode;
-import org.apache.phoenix.jdbc.PhoenixStatement;
 import org.apache.phoenix.query.QueryConstants;
 import org.apache.phoenix.query.QueryServices;
 import org.apache.phoenix.schema.types.PInteger;
@@ -1161,7 +1161,7 @@ public class UpsertSelectIT extends BaseClientManagedTimeIT {
             stmt.setDate(1, new Date(upsertedTs));
             stmt.setString(2, "KV3");
             rs = stmt.executeQuery();
-            QueryPlan plan = stmt.unwrap(PhoenixStatement.class).getQueryPlan();
+            QueryPlan plan = (QueryPlan) stmt.unwrap(PhoenixCalcitePreparedStatement.class).getQueryPlan();
             assertTrue(plan.getTableRef().getTable().getName().getString().equals(baseTableIdx));
             assertTrue(rs.next());
             assertEquals("KV1", rs.getString("KV1"));
@@ -1250,7 +1250,7 @@ public class UpsertSelectIT extends BaseClientManagedTimeIT {
             stmt.setDate(3, new Date(upsertedTs));
             stmt.setString(4, "KV34");
             rs = stmt.executeQuery();
-            QueryPlan plan = stmt.unwrap(PhoenixStatement.class).getQueryPlan();
+            QueryPlan plan = (QueryPlan) stmt.unwrap(PhoenixCalcitePreparedStatement.class).getQueryPlan();
             assertTrue(plan.getTableRef().getTable().getName().getString().equals(baseTableIdx));
             assertTrue(rs.next());
             assertEquals("KV13", rs.getString("KV1"));

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d9caed0a/phoenix-core/src/it/java/org/apache/phoenix/end2end/UpsertValuesIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/UpsertValuesIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/UpsertValuesIT.java
index 11df167..a055482 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/UpsertValuesIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/UpsertValuesIT.java
@@ -39,6 +39,7 @@ import java.util.Map.Entry;
 import java.util.NavigableMap;
 import java.util.Properties;
 
+import org.apache.calcite.jdbc.PhoenixCalciteFactory.PhoenixCalcitePreparedStatement;
 import org.apache.hadoop.hbase.client.HTable;
 import org.apache.hadoop.hbase.client.HTableInterface;
 import org.apache.hadoop.hbase.client.Result;
@@ -48,7 +49,6 @@ import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.phoenix.compile.QueryPlan;
 import org.apache.phoenix.exception.SQLExceptionCode;
 import org.apache.phoenix.jdbc.PhoenixConnection;
-import org.apache.phoenix.jdbc.PhoenixStatement;
 import org.apache.phoenix.query.BaseTest;
 import org.apache.phoenix.schema.types.PInteger;
 import org.apache.phoenix.util.DateUtil;
@@ -746,7 +746,7 @@ public class UpsertValuesIT extends BaseClientManagedTimeIT {
             stmt.setDate(1, rowTimestampDate);
             stmt.setString(2, "KV1");
             rs = stmt.executeQuery();
-            QueryPlan plan = stmt.unwrap(PhoenixStatement.class).getQueryPlan();
+            QueryPlan plan = (QueryPlan) stmt.unwrap(PhoenixCalcitePreparedStatement.class).getQueryPlan();
             assertTrue(plan.getTableRef().getTable().getName().getString().equals(indexName));
             assertTrue(rs.next());
             assertEquals("KV2", rs.getString("KV2"));
@@ -804,7 +804,7 @@ public class UpsertValuesIT extends BaseClientManagedTimeIT {
             stmt.setDate(1, upsertedDate);
             stmt.setString(2, "KV1");
             rs = stmt.executeQuery();
-            QueryPlan plan = stmt.unwrap(PhoenixStatement.class).getQueryPlan();
+            QueryPlan plan = (QueryPlan) stmt.unwrap(PhoenixCalcitePreparedStatement.class).getQueryPlan();
             assertTrue(plan.getTableRef().getTable().getName().getString().equals(indexName));
             assertTrue(rs.next());
             assertEquals("KV2", rs.getString(1));
@@ -863,7 +863,7 @@ public class UpsertValuesIT extends BaseClientManagedTimeIT {
             stmt.setDate(1, upsertedDate);
             stmt.setString(2, "KV1");
             rs = stmt.executeQuery();
-            QueryPlan plan = stmt.unwrap(PhoenixStatement.class).getQueryPlan();
+            QueryPlan plan = (QueryPlan) stmt.unwrap(PhoenixCalcitePreparedStatement.class).getQueryPlan();
             assertTrue(plan.getTableRef().getTable().getName().getString().equals(indexName));
             assertTrue(rs.next());
             assertEquals("KV2", rs.getString(1));

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d9caed0a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexIT.java
index 12add12..b1d4bd5 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexIT.java
@@ -40,6 +40,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Properties;
 
+import org.apache.calcite.jdbc.PhoenixCalciteFactory.PhoenixCalcitePreparedStatement;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.CellScanner;
 import org.apache.hadoop.hbase.HConstants;
@@ -53,11 +54,11 @@ import org.apache.hadoop.hbase.client.Scan;
 import org.apache.hadoop.hbase.ipc.PhoenixRpcSchedulerFactory;
 import org.apache.phoenix.compile.ColumnResolver;
 import org.apache.phoenix.compile.FromCompiler;
+import org.apache.phoenix.compile.QueryPlan;
 import org.apache.phoenix.end2end.ParallelStatsDisabledIT;
 import org.apache.phoenix.exception.SQLExceptionCode;
 import org.apache.phoenix.jdbc.PhoenixConnection;
 import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData;
-import org.apache.phoenix.jdbc.PhoenixStatement;
 import org.apache.phoenix.parse.NamedTableNode;
 import org.apache.phoenix.parse.TableName;
 import org.apache.phoenix.query.BaseTest;
@@ -323,11 +324,11 @@ public class IndexIT extends ParallelStatsDisabledIT {
                  */
                 conn2.commit();
 
-                stmt1 = conn1.createStatement();
-                rs = stmt1.executeQuery("SELECT COUNT(*) FROM " + fullTableName);
+                PreparedStatement pStmt = conn1.prepareStatement("SELECT COUNT(*) FROM " + fullTableName);
+                rs = pStmt.executeQuery();
                 assertTrue(rs.next());
                 assertEquals(4,rs.getInt(1));
-                assertEquals(fullIndexName, stmt1.unwrap(PhoenixStatement.class).getQueryPlan().getTableRef().getTable().getName().getString());
+                assertEquals(fullIndexName, ((QueryPlan) pStmt.unwrap(PhoenixCalcitePreparedStatement.class).getQueryPlan()).getTableRef().getTable().getName().getString());
 
                 String query = "SELECT /*+ NO_INDEX */ long_pk FROM " + fullTableName;
                 rs = conn1.createStatement().executeQuery(query);

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d9caed0a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java
index a7d0028..03962bb 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java
@@ -29,6 +29,7 @@ import static org.junit.Assert.fail;
 import java.io.IOException;
 import java.sql.Connection;
 import java.sql.DriverManager;
+import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
@@ -36,6 +37,7 @@ import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 
+import org.apache.calcite.jdbc.PhoenixCalciteFactory.PhoenixCalcitePreparedStatement;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.FileUtil;
@@ -363,9 +365,9 @@ public class LocalIndexIT extends BaseLocalIndexIT {
                         + "    SERVER AGGREGATE INTO ORDERED DISTINCT ROWS BY [\"V1\"]\nCLIENT MERGE SORT",
                 QueryUtil.getExplainPlan(rs));
             
-            PhoenixStatement stmt = conn1.createStatement().unwrap(PhoenixStatement.class);
-            rs = stmt.executeQuery(query);
-            QueryPlan plan = stmt.getQueryPlan();
+            PreparedStatement stmt = conn1.prepareStatement(query);
+            rs = stmt.executeQuery();
+            QueryPlan plan = (QueryPlan) stmt.unwrap(PhoenixCalcitePreparedStatement.class).getQueryPlan();
             assertEquals(indexTableName, plan.getContext().getCurrentTable().getTable().getName().getString());
             assertEquals(BaseScannerRegionObserver.KEY_ORDERED_GROUP_BY_EXPRESSIONS, plan.getGroupBy().getScanAttribName());
             assertTrue(rs.next());

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d9caed0a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java
index 25cb632..13a10fa 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java
@@ -31,16 +31,17 @@ import java.sql.DriverManager;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.sql.Statement;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
 import java.util.Properties;
 
+import org.apache.calcite.jdbc.PhoenixCalciteFactory.PhoenixCalcitePreparedStatement;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.phoenix.compile.QueryPlan;
 import org.apache.phoenix.end2end.ParallelStatsDisabledIT;
 import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData;
-import org.apache.phoenix.jdbc.PhoenixStatement;
 import org.apache.phoenix.query.KeyRange;
 import org.apache.phoenix.query.QueryServices;
 import org.apache.phoenix.schema.PNameFactory;
@@ -210,7 +211,7 @@ public class ViewIndexIT extends ParallelStatsDisabledIT {
         sql = "SELECT * FROM " + viewName + " WHERE v2 >= 100";
         stmt = conn1.prepareStatement(sql);
         stmt.executeQuery();
-        QueryPlan plan = stmt.unwrap(PhoenixStatement.class).getQueryPlan();
+        QueryPlan plan = (QueryPlan) stmt.unwrap(PhoenixCalcitePreparedStatement.class).getQueryPlan();
         assertEquals(4, plan.getSplits().size());
     }
     
@@ -262,7 +263,7 @@ public class ViewIndexIT extends ParallelStatsDisabledIT {
             stmt.setInt(1, 1);
             stmt.setString(2, "KV3");
             ResultSet rs = stmt.executeQuery();
-            QueryPlan plan = stmt.unwrap(PhoenixStatement.class).getQueryPlan();
+            QueryPlan plan = (QueryPlan) stmt.unwrap(PhoenixCalcitePreparedStatement.class).getQueryPlan();
             assertTrue(plan.getTableRef().getTable().getName().getString().equals(globalViewIdx));
             assertTrue(rs.next());
             assertEquals("KV1", rs.getString(1));
@@ -285,14 +286,14 @@ public class ViewIndexIT extends ParallelStatsDisabledIT {
             stmt.setInt(1, 1);
             stmt.setString(2, "KV3");
             rs = stmt.executeQuery();
-            plan = stmt.unwrap(PhoenixStatement.class).getQueryPlan();
+            plan = (QueryPlan) stmt.unwrap(PhoenixCalcitePreparedStatement.class).getQueryPlan();
             assertTrue(plan.getTableRef().getTable().getName().getString().equals(globalViewIdx));
             assertEquals(6, plan.getSplits().size());
         }
     }
 
     private void assertRowCount(Connection conn, String fullTableName, String fullBaseName, int expectedCount) throws SQLException {
-        PhoenixStatement stmt = conn.createStatement().unwrap(PhoenixStatement.class);
+        Statement stmt = conn.createStatement();
         ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM " + fullTableName);
         assertTrue(rs.next());
         assertEquals(expectedCount, rs.getInt(1));
@@ -304,7 +305,8 @@ public class ViewIndexIT extends ParallelStatsDisabledIT {
         }
         
         // Force it not to use index and still finds correct number of rows
-        rs = stmt.executeQuery("SELECT /*+ NO_INDEX */ * FROM " + fullTableName);
+        PreparedStatement pStmt = conn.prepareStatement("SELECT /*+ NO_INDEX */ * FROM " + fullTableName);
+        rs = pStmt.executeQuery();
         int count = 0;
         while (rs.next()) {
             count++;
@@ -312,7 +314,7 @@ public class ViewIndexIT extends ParallelStatsDisabledIT {
         
         assertEquals(expectedCount, count);
         // Ensure that the table, not index is being used
-        assertEquals(fullTableName, stmt.getQueryPlan().getContext().getCurrentTable().getTable().getName().getString());
+        assertEquals(fullTableName, pStmt.unwrap(PhoenixCalcitePreparedStatement.class).getQueryPlan().getContext().getCurrentTable().getTable().getName().getString());
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d9caed0a/phoenix-core/src/it/java/org/apache/phoenix/iterate/PhoenixQueryTimeoutIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/iterate/PhoenixQueryTimeoutIT.java b/phoenix-core/src/it/java/org/apache/phoenix/iterate/PhoenixQueryTimeoutIT.java
index 956deba..916aad5 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/iterate/PhoenixQueryTimeoutIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/iterate/PhoenixQueryTimeoutIT.java
@@ -27,8 +27,8 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.Properties;
 
+import org.apache.calcite.jdbc.PhoenixCalciteFactory.PhoenixCalcitePreparedStatement;
 import org.apache.phoenix.end2end.ParallelStatsDisabledIT;
-import org.apache.phoenix.jdbc.PhoenixStatement;
 import org.apache.phoenix.query.QueryServices;
 import org.junit.Before;
 import org.junit.Test;
@@ -110,8 +110,8 @@ public class PhoenixQueryTimeoutIT extends ParallelStatsDisabledIT {
         props.setProperty(QueryServices.THREAD_TIMEOUT_MS_ATTRIB, String.valueOf(timeoutMs));
         Connection conn = DriverManager.getConnection(getUrl(), props);
         PreparedStatement ps = conn.prepareStatement("SELECT * FROM " + tableName);
-        PhoenixStatement phoenixStmt = ps.unwrap(PhoenixStatement.class);
-        assertEquals(timeoutMs, phoenixStmt.getQueryTimeoutInMillis());
+        PhoenixCalcitePreparedStatement phoenixStmt = ps.unwrap(PhoenixCalcitePreparedStatement.class);
+        //assertEquals(timeoutMs, phoenixStmt.getQueryTimeoutInMillis());
         assertEquals(timeoutSecs, phoenixStmt.getQueryTimeout());
         return ps;
     }

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d9caed0a/phoenix-core/src/it/java/org/apache/phoenix/iterate/RoundRobinResultIteratorIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/iterate/RoundRobinResultIteratorIT.java b/phoenix-core/src/it/java/org/apache/phoenix/iterate/RoundRobinResultIteratorIT.java
index c1f7c88..6599983 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/iterate/RoundRobinResultIteratorIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/iterate/RoundRobinResultIteratorIT.java
@@ -37,14 +37,15 @@ import java.util.Set;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.calcite.jdbc.PhoenixCalciteFactory.PhoenixCalcitePreparedStatement;
+import org.apache.calcite.jdbc.PhoenixCalciteFactory.PhoenixCalciteStatement;
 import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.client.HBaseAdmin;
 import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.phoenix.compile.QueryPlan;
 import org.apache.phoenix.compile.StatementContext;
 import org.apache.phoenix.end2end.ParallelStatsDisabledIT;
 import org.apache.phoenix.jdbc.PhoenixConnection;
-import org.apache.phoenix.jdbc.PhoenixResultSet;
-import org.apache.phoenix.jdbc.PhoenixStatement;
 import org.apache.phoenix.query.ConnectionQueryServices;
 import org.apache.phoenix.query.QueryServices;
 import org.apache.phoenix.schema.PTable;
@@ -384,12 +385,12 @@ public class RoundRobinResultIteratorIT extends ParallelStatsDisabledIT {
     }
 
 
-    private static ResultIterator getResultIterator(ResultSet rs) throws SQLException {
-        return rs.unwrap(PhoenixResultSet.class).getUnderlyingIterator();
+    private static ResultIterator getResultIterator(PreparedStatement stmt) throws SQLException {
+        return ((QueryPlan) stmt.unwrap(PhoenixCalcitePreparedStatement.class).getQueryPlan()).iterator();
     }
 
-    private static void assertRoundRobinBehavior(ResultSet rs, Statement stmt, int numFetches) throws SQLException {
-        ResultIterator itr = getResultIterator(rs);
+    private static void assertRoundRobinBehavior(ResultSet rs, PreparedStatement stmt, int numFetches) throws SQLException {
+        ResultIterator itr = getResultIterator(stmt);
         if (stmt.getFetchSize() > 1) {
             assertTrue(itr instanceof RoundRobinResultIterator);
             RoundRobinResultIterator roundRobinItr = (RoundRobinResultIterator)itr;
@@ -407,11 +408,11 @@ public class RoundRobinResultIteratorIT extends ParallelStatsDisabledIT {
             MockParallelIteratorFactory parallelIteratorFactory = new MockParallelIteratorFactory();
             phxConn.setIteratorFactory(parallelIteratorFactory);
             ResultSet rs = stmt.executeQuery("SELECT * FROM " + testTable);
-            StatementContext ctx = rs.unwrap(PhoenixResultSet.class).getContext();
-            PTable table = ctx.getResolver().getTables().get(0).getTable();
+            StatementContext ctx = ((QueryPlan) stmt.unwrap(PhoenixCalciteStatement.class).getQueryPlan()).getContext();
+            PTable table = ctx.getCurrentTable().getTable();
             parallelIteratorFactory.setTable(table);
-            PhoenixStatement pstmt = stmt.unwrap(PhoenixStatement.class);
-            int numIterators = pstmt.getQueryPlan().getSplits().size();
+            PhoenixCalciteStatement pstmt = stmt.unwrap(PhoenixCalciteStatement.class);
+            int numIterators = ((QueryPlan) pstmt.getQueryPlan()).getSplits().size();
             assertEquals(8, numIterators);
             int numFetches = 2 * numIterators;
             List<String> iteratorOrder = new ArrayList<>(numFetches);

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d9caed0a/phoenix-core/src/it/java/org/apache/phoenix/iterate/RoundRobinResultIteratorWithStatsIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/iterate/RoundRobinResultIteratorWithStatsIT.java b/phoenix-core/src/it/java/org/apache/phoenix/iterate/RoundRobinResultIteratorWithStatsIT.java
index 928e161..26f1c08 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/iterate/RoundRobinResultIteratorWithStatsIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/iterate/RoundRobinResultIteratorWithStatsIT.java
@@ -28,11 +28,11 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.calcite.jdbc.PhoenixCalciteFactory.PhoenixCalciteStatement;
+import org.apache.phoenix.compile.QueryPlan;
 import org.apache.phoenix.compile.StatementContext;
 import org.apache.phoenix.end2end.BaseUniqueNamesOwnClusterIT;
 import org.apache.phoenix.jdbc.PhoenixConnection;
-import org.apache.phoenix.jdbc.PhoenixResultSet;
-import org.apache.phoenix.jdbc.PhoenixStatement;
 import org.apache.phoenix.query.QueryServices;
 import org.apache.phoenix.schema.PTable;
 import org.apache.phoenix.util.ReadOnlyProps;
@@ -85,11 +85,11 @@ public class RoundRobinResultIteratorWithStatsIT extends BaseUniqueNamesOwnClust
             MockParallelIteratorFactory parallelIteratorFactory = new MockParallelIteratorFactory();
             phxConn.setIteratorFactory(parallelIteratorFactory);
             ResultSet rs = stmt.executeQuery("SELECT * FROM " + tableName);
-            StatementContext ctx = rs.unwrap(PhoenixResultSet.class).getContext();
-            PTable table = ctx.getResolver().getTables().get(0).getTable();
+            StatementContext ctx = ((QueryPlan) stmt.unwrap(PhoenixCalciteStatement.class).getQueryPlan()).getContext();
+            PTable table = ctx.getCurrentTable().getTable();
             parallelIteratorFactory.setTable(table);
-            PhoenixStatement pstmt = stmt.unwrap(PhoenixStatement.class);
-            int numIterators = pstmt.getQueryPlan().getSplits().size();
+            PhoenixCalciteStatement pstmt = stmt.unwrap(PhoenixCalciteStatement.class);
+            int numIterators = ((QueryPlan) pstmt.getQueryPlan()).getSplits().size();
             assertTrue(numIterators > 1);
             int numFetches = 2 * numIterators;
             List<String> iteratorOrder = new ArrayList<>(numFetches);

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d9caed0a/phoenix-core/src/main/java/org/apache/calcite/jdbc/PhoenixCalciteFactory.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/calcite/jdbc/PhoenixCalciteFactory.java b/phoenix-core/src/main/java/org/apache/calcite/jdbc/PhoenixCalciteFactory.java
index d087d62..7fc949c 100644
--- a/phoenix-core/src/main/java/org/apache/calcite/jdbc/PhoenixCalciteFactory.java
+++ b/phoenix-core/src/main/java/org/apache/calcite/jdbc/PhoenixCalciteFactory.java
@@ -12,8 +12,6 @@ import java.sql.SQLException;
 import java.sql.SQLFeatureNotSupportedException;
 import java.sql.SQLXML;
 import java.sql.Savepoint;
-import java.sql.Time;
-import java.sql.Timestamp;
 import java.sql.ResultSet;
 import java.util.Calendar;
 import java.util.List;
@@ -54,6 +52,8 @@ import org.apache.calcite.sql.validate.SqlConformance;
 import org.apache.phoenix.calcite.CalciteUtils;
 import org.apache.phoenix.calcite.PhoenixSchema;
 import org.apache.phoenix.calcite.PhoenixSqlConformance;
+import org.apache.phoenix.calcite.rel.PhoenixToEnumerableConverter;
+import org.apache.phoenix.compile.StatementPlan;
 import org.apache.phoenix.exception.SQLExceptionCode;
 import org.apache.phoenix.exception.SQLExceptionInfo;
 import org.apache.phoenix.execute.RuntimeContext;
@@ -176,7 +176,7 @@ public class PhoenixCalciteFactory extends CalciteFactory {
             }
             ImmutableList<RuntimeContext> ctxList = runtimeContextMap.get(handle);
             if (ctxList == null) {
-                List<RuntimeContext> activeCtx = RuntimeContext.THREAD_LOCAL.get();
+                List<RuntimeContext> activeCtx = PhoenixToEnumerableConverter.RUNTIME_CONTEXT_LIST.get();
                 ctxList = ImmutableList.copyOf(activeCtx);
                 runtimeContextMap.put(handle, ctxList);
                 activeCtx.clear();
@@ -354,7 +354,9 @@ public class PhoenixCalciteFactory extends CalciteFactory {
         }
     }
 
-    private static class PhoenixCalciteStatement extends CalciteStatement {
+    public static class PhoenixCalciteStatement extends CalciteStatement {
+        private StatementPlan queryPlan;
+
         public PhoenixCalciteStatement(PhoenixCalciteConnection connection,
                 Meta.StatementHandle h, int resultSetType, int resultSetConcurrency,
                 int resultSetHoldability) {
@@ -362,10 +364,16 @@ public class PhoenixCalciteFactory extends CalciteFactory {
                     resultSetHoldability);
         }
 
+        public StatementPlan getQueryPlan() {
+            return this.queryPlan;
+        }
+
         @Override
         public boolean execute(String sql) throws SQLException {
             try {
-                return super.execute(sql);
+                boolean b = super.execute(sql);
+                this.queryPlan = PhoenixToEnumerableConverter.QUERY_PLAN.get();
+                return b;
             } catch (SQLException e) {
                 throw CalciteUtils.unwrapSqlException(e);
             }
@@ -374,14 +382,18 @@ public class PhoenixCalciteFactory extends CalciteFactory {
         @Override
         public ResultSet executeQuery(String sql) throws SQLException{
             try {
-                return super.executeQuery(sql);
+                ResultSet rs = super.executeQuery(sql);
+                this.queryPlan = PhoenixToEnumerableConverter.QUERY_PLAN.get();
+                return rs;
             } catch (SQLException e) {
                 throw CalciteUtils.unwrapSqlException(e);
             }
         }
     }
 
-    private static class PhoenixCalcitePreparedStatement extends CalcitePreparedStatement {
+    public static class PhoenixCalcitePreparedStatement extends CalcitePreparedStatement {
+        private final StatementPlan queryPlan;
+
         @SuppressWarnings("rawtypes")
         PhoenixCalcitePreparedStatement(PhoenixCalciteConnection connection,
                 Meta.StatementHandle h, CalcitePrepare.CalciteSignature signature,
@@ -389,6 +401,11 @@ public class PhoenixCalciteFactory extends CalciteFactory {
                         throws SQLException {
             super(connection, h, signature, resultSetType, resultSetConcurrency,
                     resultSetHoldability);
+            this.queryPlan = PhoenixToEnumerableConverter.QUERY_PLAN.get();
+        }
+
+        public StatementPlan getQueryPlan() {
+            return this.queryPlan;
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d9caed0a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixToEnumerableConverter.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixToEnumerableConverter.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixToEnumerableConverter.java
index de82139..cc3cf40 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixToEnumerableConverter.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixToEnumerableConverter.java
@@ -1,6 +1,7 @@
 package org.apache.phoenix.calcite.rel;
 
 import java.sql.SQLException;
+import java.util.LinkedList;
 import java.util.List;
 
 import org.apache.calcite.adapter.enumerable.EnumerableConvention;
@@ -43,6 +44,15 @@ import org.apache.phoenix.iterate.ResultIterator;
  * Scan of a Phoenix table.
  */
 public class PhoenixToEnumerableConverter extends ConverterImpl implements EnumerableRel {
+    public static final ThreadLocal<List<RuntimeContext>> RUNTIME_CONTEXT_LIST =
+            new ThreadLocal<List<RuntimeContext>>() {
+        @Override protected List<RuntimeContext> initialValue() {
+            return new LinkedList<RuntimeContext>();
+        }
+    };
+    public static final ThreadLocal<StatementPlan> QUERY_PLAN =
+            new ThreadLocal<StatementPlan>();
+    
     private final StatementContext context;
 
     public static PhoenixToEnumerableConverter create(
@@ -99,11 +109,12 @@ public class PhoenixToEnumerableConverter extends ConverterImpl implements Enume
     
     StatementPlan makePlan(PhoenixRel rel) {
         RuntimeContext runtimeContext = new RuntimeContextImpl();
-        RuntimeContext.THREAD_LOCAL.get().add(runtimeContext);
+        RUNTIME_CONTEXT_LIST.get().add(runtimeContext);
         final PhoenixRelImplementor phoenixImplementor =
                 new PhoenixRelImplementorImpl(context, runtimeContext);
         phoenixImplementor.pushContext(new ImplementorContext(true, false, ImmutableIntList.identity(rel.getRowType().getFieldCount())));
         final StatementPlan plan = rel.implement(phoenixImplementor);
+        QUERY_PLAN.set(plan);
         if (!(plan instanceof QueryPlan)) {
             return plan;
         }

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d9caed0a/phoenix-core/src/main/java/org/apache/phoenix/execute/RuntimeContext.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/RuntimeContext.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/RuntimeContext.java
index 34568d4..784842e 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/execute/RuntimeContext.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/RuntimeContext.java
@@ -17,21 +17,13 @@
  */
 package org.apache.phoenix.execute;
 
-import java.util.LinkedList;
-import java.util.List;
 import java.util.Map;
 
 import org.apache.phoenix.expression.Expression;
 import org.apache.phoenix.schema.tuple.Tuple;
 
 public interface RuntimeContext {
-    ThreadLocal<List<RuntimeContext>> THREAD_LOCAL =
-            new ThreadLocal<List<RuntimeContext>>() {
-        @Override protected List<RuntimeContext> initialValue() {
-            return new LinkedList<RuntimeContext>();
-        }
-    };
-    
+
     public static RuntimeContext EMPTY_CONTEXT = new RuntimeContext() {
 
         @Override

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d9caed0a/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java b/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java
index 4bc7d2b..e4275ff 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java
@@ -68,7 +68,6 @@ import org.apache.phoenix.filter.EncodedQualifiersColumnProjectionFilter;
 import org.apache.phoenix.jdbc.PhoenixConnection;
 import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData;
 import org.apache.phoenix.jdbc.PhoenixPreparedStatement;
-import org.apache.phoenix.jdbc.PhoenixStatement;
 import org.apache.phoenix.query.BaseConnectionlessQueryTest;
 import org.apache.phoenix.query.QueryConstants;
 import org.apache.phoenix.query.QueryServices;
@@ -89,6 +88,7 @@ import org.apache.phoenix.util.PropertiesUtil;
 import org.apache.phoenix.util.QueryUtil;
 import org.apache.phoenix.util.ScanUtil;
 import org.apache.phoenix.util.SchemaUtil;
+import org.apache.phoenix.util.TestUtil;
 import org.junit.Test;
 
 
@@ -1767,7 +1767,7 @@ public class QueryCompilerTest extends BaseConnectionlessQueryTest {
         String[] queries = queryList.toArray(new String[queryList.size()]);
         for (int i = 0; i < queries.length; i++) {
             String query = queries[i];
-            QueryPlan plan = conn.createStatement().unwrap(PhoenixStatement.class).compileQuery(query);
+            QueryPlan plan = (QueryPlan) TestUtil.getQueryPlan(conn, query);
             assertTrue(plan.getOrderBy() == OrderBy.FWD_ROW_KEY_ORDER_BY);
         }
         // Negative test
@@ -1776,7 +1776,7 @@ public class QueryCompilerTest extends BaseConnectionlessQueryTest {
             queryList.add(String.format("SELECT * FROM T WHERE %s(k2)=2.0", sub));
         }
         for (String query : queryList.toArray(new String[queryList.size()])) {
-            Scan scan = conn.createStatement().unwrap(PhoenixStatement.class).compileQuery(query).getContext().getScan();
+            Scan scan = ((QueryPlan) TestUtil.getQueryPlan(conn, query)).getContext().getScan();
             assertNotNull(scan.getFilter());
             assertTrue(scan.getStartRow().length == 0);
             assertTrue(scan.getStopRow().length == 0);
@@ -1799,7 +1799,7 @@ public class QueryCompilerTest extends BaseConnectionlessQueryTest {
         for (int i = 0; i < queries.length; i++) {
             String query = queries[i];
             QueryPlan plan =
-                    conn.createStatement().unwrap(PhoenixStatement.class).compileQuery(query);
+                    (QueryPlan) TestUtil.getQueryPlan(conn, query);
             assertTrue(query, plan.getOrderBy() == OrderBy.REV_ROW_KEY_ORDER_BY);
         }
         // Negative test
@@ -1808,7 +1808,7 @@ public class QueryCompilerTest extends BaseConnectionlessQueryTest {
             queryList.add(String.format("SELECT * FROM T WHERE %s(k2)=2.0", sub));
         }
         for (String query : queryList.toArray(new String[queryList.size()])) {
-            Scan scan = conn.createStatement().unwrap(PhoenixStatement.class).compileQuery(query).getContext().getScan();
+            Scan scan = ((QueryPlan) TestUtil.getQueryPlan(conn, query)).getContext().getScan();
             assertNotNull(scan.getFilter());
             assertTrue(scan.getStartRow().length == 0);
             assertTrue(scan.getStopRow().length == 0);
@@ -1835,7 +1835,7 @@ public class QueryCompilerTest extends BaseConnectionlessQueryTest {
         String query;
         for (int i = 0; i < queries.length; i++) {
             query = queries[i];
-            QueryPlan plan = conn.createStatement().unwrap(PhoenixStatement.class).compileQuery(query);
+            QueryPlan plan = (QueryPlan) TestUtil.getQueryPlan(conn, query);
             assertTrue("Expected order by to be compiled out: " + query, plan.getOrderBy() == OrderBy.FWD_ROW_KEY_ORDER_BY);
         }
     }
@@ -1854,7 +1854,7 @@ public class QueryCompilerTest extends BaseConnectionlessQueryTest {
         String query;
         for (int i = 0; i < queries.length; i++) {
             query = queries[i];
-            QueryPlan plan = conn.createStatement().unwrap(PhoenixStatement.class).compileQuery(query);
+            QueryPlan plan = (QueryPlan) TestUtil.getQueryPlan(conn, query);
             assertTrue("Expected order by to be compiled out: " + query, plan.getOrderBy() == OrderBy.REV_ROW_KEY_ORDER_BY);
         }
     }
@@ -1876,7 +1876,7 @@ public class QueryCompilerTest extends BaseConnectionlessQueryTest {
         String query;
         for (int i = 0; i < queries.length; i++) {
             query = queries[i];
-            QueryPlan plan = conn.createStatement().unwrap(PhoenixStatement.class).compileQuery(query);
+            QueryPlan plan = (QueryPlan) TestUtil.getQueryPlan(conn, query);
             assertFalse("Expected order by not to be compiled out: " + query, plan.getOrderBy().getOrderByExpressions().isEmpty());
         }
     }
@@ -1897,7 +1897,7 @@ public class QueryCompilerTest extends BaseConnectionlessQueryTest {
         String query;
         for (int i = 0; i < queries.length; i++) {
             query = queries[i];
-            QueryPlan plan = conn.createStatement().unwrap(PhoenixStatement.class).compileQuery(query);
+            QueryPlan plan = (QueryPlan) TestUtil.getQueryPlan(conn, query);
             assertTrue("Expected group by to be order preserving: " + query, plan.getGroupBy().isOrderPreserving());
         }
     }
@@ -1930,7 +1930,7 @@ public class QueryCompilerTest extends BaseConnectionlessQueryTest {
         String query;
         for (int i = 0; i < queries.length; i++) {
             query = queries[i];
-            QueryPlan plan = conn.createStatement().unwrap(PhoenixStatement.class).compileQuery(query);
+            QueryPlan plan = (QueryPlan) TestUtil.getQueryPlan(conn, query);
             assertTrue("Expected group by to be order preserving: " + query, plan.getGroupBy().isOrderPreserving());
         }
     }
@@ -1949,7 +1949,7 @@ public class QueryCompilerTest extends BaseConnectionlessQueryTest {
         String query;
         for (int i = 0; i < queries.length; i++) {
             query = queries[i];
-            QueryPlan plan = conn.createStatement().unwrap(PhoenixStatement.class).compileQuery(query);
+            QueryPlan plan = (QueryPlan) TestUtil.getQueryPlan(conn, query);
             assertFalse("Expected group by not to be order preserving: " + query, plan.getGroupBy().isOrderPreserving());
         }
     }
@@ -1968,7 +1968,7 @@ public class QueryCompilerTest extends BaseConnectionlessQueryTest {
         String query;
         for (int i = 0; i < queries.length; i++) {
             query = queries[i];
-            QueryPlan plan = conn.createStatement().unwrap(PhoenixStatement.class).compileQuery(query);
+            QueryPlan plan = (QueryPlan) TestUtil.getQueryPlan(conn, query);
             assertTrue("Expected plan to use round robin iterator " + query, plan.useRoundRobinIterator());
         }
     }
@@ -1993,7 +1993,7 @@ public class QueryCompilerTest extends BaseConnectionlessQueryTest {
         String query;
         for (int i = 0; i < queries.length; i++) {
             query = queries[i];
-            QueryPlan plan = conn.createStatement().unwrap(PhoenixStatement.class).compileQuery(query);
+            QueryPlan plan = (QueryPlan) TestUtil.getQueryPlan(conn, query);
             assertFalse("Expected plan to not use round robin iterator " + query, plan.useRoundRobinIterator());
         }
     }
@@ -2022,7 +2022,7 @@ public class QueryCompilerTest extends BaseConnectionlessQueryTest {
         String query;
         for (int i = 0; i < queries.length; i++) {
             query = queries[i];
-            QueryPlan plan = conn.createStatement().unwrap(PhoenixStatement.class).compileQuery(query);
+            QueryPlan plan = (QueryPlan) TestUtil.getQueryPlan(conn, query);
             assertFalse("Expected plan to not use round robin iterator " + query, plan.useRoundRobinIterator());
         }
     }