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 2016/02/02 05:00:22 UTC

[48/50] [abbrv] phoenix git commit: Sync with master; Bug fix for ResultSet object of Float type; Walkaround for PHOENIX-2647

http://git-wip-us.apache.org/repos/asf/phoenix/blob/74409be8/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteIndexIT.java
----------------------------------------------------------------------
diff --cc phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteIndexIT.java
index 1197193,0000000..f200a24
mode 100644,000000..100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteIndexIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteIndexIT.java
@@@ -1,283 -1,0 +1,283 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + * http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing, software
 + * distributed under the License is distributed on an "AS IS" BASIS,
 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 + * See the License for the specific language governing permissions and
 + * limitations under the License.
 + */
 +package org.apache.phoenix.calcite;
 +
 +import static org.junit.Assert.fail;
 +
 +import java.sql.Connection;
 +import java.sql.DriverManager;
 +import java.sql.SQLException;
 +import java.util.Arrays;
 +import java.util.Collection;
 +import java.util.Properties;
 +
 +import org.junit.Before;
 +import org.junit.Test;
 +import org.junit.runner.RunWith;
 +import org.junit.runners.Parameterized;
 +import org.junit.runners.Parameterized.Parameters;
 +
 +@RunWith(Parameterized.class)
 +public class CalciteIndexIT extends BaseCalciteIT {
 +    
 +    private final boolean localIndex;
 +    
 +    public CalciteIndexIT(boolean localIndex) {
 +        this.localIndex = localIndex;
 +    }
 +    
 +    @Parameters(name="localIndex = {0}")
 +    public static Collection<Boolean[]> data() {
 +        return Arrays.asList(new Boolean[][] {     
 +                 { false }, { true }
 +           });
 +    }
 +    
 +    @Before
 +    public void initTable() throws Exception {
 +        final String url = getUrl();
 +        final String index = localIndex ? "LOCAL INDEX" : "INDEX";
 +        initATableValues(getOrganizationId(), null, url);
 +        initSaltedTables(index);
 +        initMultiTenantTables(index);
 +        final Connection connection = DriverManager.getConnection(url);
 +        connection.createStatement().execute("CREATE " + index + " IF NOT EXISTS IDX1 ON aTable (a_string) INCLUDE (b_string, x_integer)");
 +        connection.createStatement().execute("CREATE " + index + " IF NOT EXISTS IDX2 ON aTable (b_string) INCLUDE (a_string, y_integer)");
 +        connection.createStatement().execute("CREATE " + index + " IF NOT EXISTS IDX_FULL ON aTable (b_string) INCLUDE (a_string, a_integer, a_date, a_time, a_timestamp, x_decimal, x_long, x_integer, y_integer, a_byte, a_short, a_float, a_double, a_unsigned_float, a_unsigned_double)");
 +        connection.createStatement().execute("UPDATE STATISTICS ATABLE");
 +        connection.createStatement().execute("UPDATE STATISTICS " + SALTED_TABLE_NAME);
 +        connection.createStatement().execute("UPDATE STATISTICS IDX_" + SALTED_TABLE_NAME);
 +        connection.createStatement().execute("UPDATE STATISTICS IDX1");
 +        connection.createStatement().execute("UPDATE STATISTICS IDX2");
 +        connection.createStatement().execute("UPDATE STATISTICS IDX_FULL");
 +        connection.close();
 +    }
 +    
 +    @Test public void testIndex() throws Exception {
 +        start(true).sql("select * from aTable where b_string = 'b'")
 +            .explainIs("PhoenixToEnumerableConverter\n" +
 +                       "  PhoenixServerProject(ORGANIZATION_ID=[$1], ENTITY_ID=[$2], A_STRING=[$3], B_STRING=[$0], A_INTEGER=[$4], A_DATE=[$5], A_TIME=[$6], A_TIMESTAMP=[$7], X_DECIMAL=[$8], X_LONG=[$9], X_INTEGER=[$10], Y_INTEGER=[$11], A_BYTE=[$12], A_SHORT=[$13], A_FLOAT=[$14], A_DOUBLE=[$15], A_UNSIGNED_FLOAT=[$16], A_UNSIGNED_DOUBLE=[$17])\n" +
 +                       "    PhoenixTableScan(table=[[phoenix, IDX_FULL]], filter=[=($0, 'b')])\n")
 +            .close();
 +        start(true).sql("select x_integer from aTable")
 +            .explainIs("PhoenixToEnumerableConverter\n" +
 +                       "  PhoenixServerProject(X_INTEGER=[$4])\n" +
 +                       "    PhoenixTableScan(table=[[phoenix, IDX1]])\n")
 +            .close();
 +        start(true).sql("select a_string from aTable order by a_string")
 +            .explainIs("PhoenixToEnumerableConverter\n" +
 +                       "  PhoenixServerProject(A_STRING=[$0])\n" +
 +                       "    PhoenixTableScan(table=[[phoenix, IDX1]], scanOrder=[FORWARD])\n")
 +            .close();
 +        start(true).sql("select a_string from aTable order by organization_id")
 +            .explainIs("PhoenixToEnumerableConverter\n" +
 +                       "  PhoenixServerProject(A_STRING=[$2], ORGANIZATION_ID=[$0])\n" +
 +                       "    PhoenixTableScan(table=[[phoenix, ATABLE]], scanOrder=[FORWARD])\n")
 +            .close();
 +        start(true).sql("select a_integer from aTable order by a_string")
 +            .explainIs("PhoenixToEnumerableConverter\n" +
 +                       "  PhoenixServerSort(sort0=[$1], dir0=[ASC])\n" +
 +                       "    PhoenixServerProject(A_INTEGER=[$4], A_STRING=[$2])\n" +
 +                       "      PhoenixTableScan(table=[[phoenix, ATABLE]])\n")
 +            .close();
 +        start(true).sql("select a_string, b_string from aTable where a_string = 'a'")
 +            .explainIs("PhoenixToEnumerableConverter\n" +
 +                       "  PhoenixServerProject(A_STRING=[$0], B_STRING=[$3])\n" +
 +                       "    PhoenixTableScan(table=[[phoenix, IDX1]], filter=[=($0, 'a')])\n")
 +            .close();
 +        start(true).sql("select a_string, b_string from aTable where b_string = 'b'")
 +            .explainIs("PhoenixToEnumerableConverter\n" +
 +                       "  PhoenixServerProject(A_STRING=[$3], B_STRING=[$0])\n" +
 +                       "    PhoenixTableScan(table=[[phoenix, IDX2]], filter=[=($0, 'b')])\n")
 +            .close();
 +        start(true).sql("select a_string, b_string, x_integer, y_integer from aTable where b_string = 'b'")
 +            .explainIs("PhoenixToEnumerableConverter\n" +
 +                       "  PhoenixServerProject(A_STRING=[$3], B_STRING=[$0], X_INTEGER=[$10], Y_INTEGER=[$11])\n" +
 +                       "    PhoenixTableScan(table=[[phoenix, IDX_FULL]], filter=[=($0, 'b')])\n")
 +            .close();
 +        start(true).sql("select a_string, count(*) from aTable group by a_string")
 +            .explainIs("PhoenixToEnumerableConverter\n" +
 +                       "  PhoenixServerAggregate(group=[{0}], EXPR$1=[COUNT()], isOrdered=[true])\n" +
 +                       "    PhoenixTableScan(table=[[phoenix, IDX1]], scanOrder=[FORWARD])\n")
 +            .close();
 +    }
 +    
 +    @Test public void testSaltedIndex() throws Exception {
 +        start(true).sql("select count(*) from " + NOSALT_TABLE_NAME + " where col0 > 3")
 +                .explainIs("PhoenixToEnumerableConverter\n" +
 +                           "  PhoenixServerAggregate(group=[{}], EXPR$0=[COUNT()])\n" +
 +                           "    PhoenixTableScan(table=[[phoenix, IDXSALTED_NOSALT_TEST_TABLE]], filter=[>(CAST($0):INTEGER, 3)])\n")
-                 .resultIs(new Object[][]{{2L}})
++                .resultIs(false, new Object[][]{{2L}})
 +                .close();
 +        start(true).sql("select mypk0, mypk1, col0 from " + NOSALT_TABLE_NAME + " where col0 <= 4")
 +                .explainIs("PhoenixToEnumerableConverter\n" +
 +                           "  PhoenixServerProject(MYPK0=[$1], MYPK1=[$2], COL0=[CAST($0):INTEGER])\n" +
 +                           "    PhoenixTableScan(table=[[phoenix, IDXSALTED_NOSALT_TEST_TABLE]], filter=[<=(CAST($0):INTEGER, 4)])\n")
-                 .resultIs(new Object[][] {
++                .resultIs(false, new Object[][] {
 +                        {2, 3, 4},
 +                        {1, 2, 3}})
 +                .close();
 +        start(true).sql("select * from " + SALTED_TABLE_NAME + " where mypk0 < 3")
 +                .explainIs("PhoenixToEnumerableConverter\n" +
 +                           "  PhoenixTableScan(table=[[phoenix, SALTED_TEST_TABLE]], filter=[<($0, 3)])\n")
-                 .resultIs(new Object[][] {
++                .resultIs(false, new Object[][] {
 +                        {1, 2, 3, 4},
 +                        {2, 3, 4, 5}})
 +                .close();
 +        start(true).sql("select count(*) from " + SALTED_TABLE_NAME + " where col0 > 3")
 +                .explainIs("PhoenixToEnumerableConverter\n" +
 +                           "  PhoenixServerAggregate(group=[{}], EXPR$0=[COUNT()])\n" +
 +                           "    PhoenixTableScan(table=[[phoenix, IDX_SALTED_TEST_TABLE]], filter=[>(CAST($0):INTEGER, 3)])\n")
-                 .resultIs(new Object[][]{{2L}})
++                .resultIs(false, new Object[][]{{2L}})
 +                .close();
 +        start(true).sql("select mypk0, mypk1, col0 from " + SALTED_TABLE_NAME + " where col0 <= 4")
 +                .explainIs("PhoenixToEnumerableConverter\n" +
 +                           "  PhoenixServerProject(MYPK0=[$1], MYPK1=[$2], COL0=[CAST($0):INTEGER])\n" +
 +                           "    PhoenixTableScan(table=[[phoenix, IDX_SALTED_TEST_TABLE]], filter=[<=(CAST($0):INTEGER, 4)])\n")
-                 .resultIs(new Object[][] {
++                .resultIs(false, new Object[][] {
 +                        {2, 3, 4},
 +                        {1, 2, 3}})
 +                .close();
 +        start(true).sql("select count(*) from " + SALTED_TABLE_NAME + " where col1 > 4")
 +                .explainIs("PhoenixToEnumerableConverter\n" +
 +                           "  PhoenixServerAggregate(group=[{}], EXPR$0=[COUNT()])\n" +
 +                           "    PhoenixTableScan(table=[[phoenix, IDXSALTED_SALTED_TEST_TABLE]], filter=[>(CAST($0):INTEGER, 4)])\n")
-                 .resultIs(new Object[][]{{2L}})
++                .resultIs(false, new Object[][]{{2L}})
 +                .close();
 +        start(true).sql("select * from " + SALTED_TABLE_NAME + " where col1 <= 5 order by col1")
 +                .explainIs("PhoenixToEnumerableConverter\n" +
 +                           "  PhoenixServerProject(MYPK0=[$1], MYPK1=[$2], COL0=[$3], COL1=[CAST($0):INTEGER])\n" +
 +                           "    PhoenixTableScan(table=[[phoenix, IDXSALTED_SALTED_TEST_TABLE]], filter=[<=(CAST($0):INTEGER, 5)], scanOrder=[FORWARD])\n")
-                 .resultIs(new Object[][] {
++                .resultIs(true, new Object[][] {
 +                        {1, 2, 3, 4},
 +                        {2, 3, 4, 5}})
 +                .close();
 +        start(true).sql("select * from " + SALTED_TABLE_NAME + " s1, " + SALTED_TABLE_NAME + " s2 where s1.mypk0 = s2.mypk0 and s1.mypk1 = s2.mypk1 and s1.mypk0 > 1 and s2.col1 < 6")
 +                .explainIs("PhoenixToEnumerableConverter\n" +
 +                           "  PhoenixServerJoin(condition=[AND(=($0, $4), =($1, $5))], joinType=[inner])\n" +
 +                           "    PhoenixTableScan(table=[[phoenix, SALTED_TEST_TABLE]], filter=[>($0, 1)])\n" +
 +                           "    PhoenixServerProject(MYPK0=[$1], MYPK1=[$2], COL0=[$3], COL1=[CAST($0):INTEGER])\n" +
 +                           "      PhoenixTableScan(table=[[phoenix, IDXSALTED_SALTED_TEST_TABLE]], filter=[<(CAST($0):INTEGER, 6)])\n")
-                 .resultIs(new Object[][] {
++                .resultIs(false, new Object[][] {
 +                        {2, 3, 4, 5, 2, 3, 4, 5}})
 +                .close();
 +    }
 +    
 +    @Test public void testMultiTenant() throws Exception {
 +        Properties props = getConnectionProps(true);
 +        start(props).sql("select * from " + MULTI_TENANT_TABLE)
 +                .explainIs("PhoenixToEnumerableConverter\n" +
 +                           "  PhoenixTableScan(table=[[phoenix, MULTITENANT_TEST_TABLE]])\n")
-                 .resultIs(new Object[][] {
++                .resultIs(false, new Object[][] {
 +                        {"10", "2", 3, 4, 5},
 +                        {"15", "3", 4, 5, 6},
 +                        {"20", "4", 5, 6, 7},
 +                        {"20", "5", 6, 7, 8}})
 +                .close();
 +        
 +        start(props).sql("select * from " + MULTI_TENANT_TABLE + " where tenant_id = '20' and col1 > 1")
 +                .explainIs("PhoenixToEnumerableConverter\n" +
 +                           "  PhoenixServerProject(TENANT_ID=[$0], ID=[$2], COL0=[$3], COL1=[CAST($1):INTEGER], COL2=[$4])\n" +
 +                           "    PhoenixTableScan(table=[[phoenix, IDX_MULTITENANT_TEST_TABLE]], filter=[AND(=(CAST($0):VARCHAR(2) CHARACTER SET \"ISO-8859-1\" COLLATE \"ISO-8859-1$en_US$primary\" NOT NULL, '20'), >(CAST($1):INTEGER, 1))])\n")
-                 .resultIs(new Object[][] {
++                .resultIs(false, new Object[][] {
 +                        {"20", "4", 5, 6, 7},
 +                        {"20", "5", 6, 7, 8}})
 +                .close();
 +        
 +        try {
 +            start(props).sql("select * from " + MULTI_TENANT_VIEW1)
 +                .explainIs("")
 +                .close();
 +            fail("Should have got SQLException.");
 +        } catch (SQLException e) {
 +        }
 +        
 +        props.setProperty("TenantId", "15");
 +        start(props).sql("select * from " + MULTI_TENANT_TABLE)
 +                .explainIs("PhoenixToEnumerableConverter\n" +
 +                           "  PhoenixTableScan(table=[[phoenix, MULTITENANT_TEST_TABLE]])\n")
-                 .resultIs(new Object[][] {
++                .resultIs(false, new Object[][] {
 +                        {"3", 4, 5, 6}})
 +                .close();
 +        
 +        start(props).sql("select * from " + MULTI_TENANT_TABLE + " where col1 > 1")
 +                .explainIs("PhoenixToEnumerableConverter\n" +
 +                           "  PhoenixServerProject(ID=[$1], COL0=[$2], COL1=[CAST($0):INTEGER], COL2=[$3])\n" +
 +                           "    PhoenixTableScan(table=[[phoenix, IDX_MULTITENANT_TEST_TABLE]], filter=[>(CAST($0):INTEGER, 1)])\n")
-                 .resultIs(new Object[][] {
++                .resultIs(false, new Object[][] {
 +                        {"3", 4, 5, 6}})
 +                .close();
 +        
 +        try {
 +            start(props).sql("select * from " + MULTI_TENANT_VIEW1)
 +                .explainIs("")
 +                .close();
 +            fail("Should have got SQLException.");
 +        } catch (SQLException e) {
 +        }
 +
 +        props.setProperty("TenantId", "10");
 +        start(props).sql("select * from " + MULTI_TENANT_VIEW1)
 +                .explainIs("PhoenixToEnumerableConverter\n" +
 +                           "  PhoenixTableScan(table=[[phoenix, MULTITENANT_TEST_TABLE]])\n")
-                 .resultIs(new Object[][] {
++                .resultIs(false, new Object[][] {
 +                        {"2", 3, 4, 5}})
 +                .close();
 +        
 +        start(props).sql("select * from " + MULTI_TENANT_TABLE + " where col1 > 1")
 +                .explainIs("PhoenixToEnumerableConverter\n" +
 +                           "  PhoenixServerProject(ID=[$1], COL0=[$2], COL1=[CAST($0):INTEGER], COL2=[$3])\n" +
 +                           "    PhoenixTableScan(table=[[phoenix, IDX_MULTITENANT_TEST_TABLE]], filter=[>(CAST($0):INTEGER, 1)])\n")
-                 .resultIs(new Object[][] {
++                .resultIs(false, new Object[][] {
 +                        {"2", 3, 4, 5}})
 +                .close();
 +        
 +        start(props).sql("select id, col0 from " + MULTI_TENANT_VIEW1 + " where col0 > 1")
 +                .explainIs("PhoenixToEnumerableConverter\n" +
 +                           "  PhoenixServerProject(ID=[$1], COL0=[CAST($0):INTEGER])\n" +
 +                           "    PhoenixTableScan(table=[[phoenix, S1, IDX_MULTITENANT_TEST_VIEW1]], filter=[>(CAST($0):INTEGER, 1)])\n")
-                 .resultIs(new Object[][] {
++                .resultIs(false, new Object[][] {
 +                        {"2", 3}})
 +                .close();
 +
 +        props.setProperty("TenantId", "20");
 +        start(props).sql("select * from " + MULTI_TENANT_VIEW2)
 +                .explainIs("PhoenixToEnumerableConverter\n" +
 +                           "  PhoenixTableScan(table=[[phoenix, MULTITENANT_TEST_TABLE]], filter=[>($3, 7)])\n")
-                 .resultIs(new Object[][] {
++                .resultIs(false, new Object[][] {
 +                        {"5", 6, 7, 8}})
 +                .close();
 +        
 +        start(props).sql("select id, col0 from " + MULTI_TENANT_VIEW2 + " where col0 > 1")
 +                .explainIs("PhoenixToEnumerableConverter\n" +
 +                           "  PhoenixServerProject(ID=[$1], COL0=[CAST($0):INTEGER])\n" +
 +                           "    PhoenixTableScan(table=[[phoenix, S2, IDX_MULTITENANT_TEST_VIEW2]], filter=[>(CAST($0):INTEGER, 1)])\n")
-                 .resultIs(new Object[][] {
++                .resultIs(false, new Object[][] {
 +                        {"5", 6}})
 +                .close();
 +        
 +        start(props).sql("select id, col0 from " + MULTI_TENANT_VIEW2 + " order by col0")
 +                .explainIs("PhoenixToEnumerableConverter\n" +
 +                           "  PhoenixServerProject(ID=[$1], COL0=[CAST($0):INTEGER])\n" +
 +                           "    PhoenixTableScan(table=[[phoenix, S2, IDX_MULTITENANT_TEST_VIEW2]], scanOrder=[FORWARD])\n")
-                 .resultIs(new Object[][] {
++                .resultIs(true, new Object[][] {
 +                        {"5", 6}})
 +                .close();
 +    }
 +
 +}

http://git-wip-us.apache.org/repos/asf/phoenix/blob/74409be8/phoenix-core/src/main/java/org/apache/phoenix/calcite/CalciteRuntime.java
----------------------------------------------------------------------
diff --cc phoenix-core/src/main/java/org/apache/phoenix/calcite/CalciteRuntime.java
index 52022a8,0000000..000a0c6
mode 100644,000000..100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/CalciteRuntime.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/CalciteRuntime.java
@@@ -1,148 -1,0 +1,156 @@@
 +package org.apache.phoenix.calcite;
 +
 +import org.apache.calcite.linq4j.AbstractEnumerable;
 +import org.apache.calcite.linq4j.Enumerable;
 +import org.apache.calcite.linq4j.Enumerator;
 +import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
 +import org.apache.phoenix.compile.ColumnProjector;
 +import org.apache.phoenix.compile.QueryPlan;
 +import org.apache.phoenix.compile.RowProjector;
 +import org.apache.phoenix.iterate.ResultIterator;
 +import org.apache.phoenix.schema.tuple.Tuple;
 +import org.apache.phoenix.schema.types.PDataType;
 +import org.apache.phoenix.schema.types.PDate;
 +import org.apache.phoenix.schema.types.PDateArray;
++import org.apache.phoenix.schema.types.PDouble;
++import org.apache.phoenix.schema.types.PFloat;
 +import org.apache.phoenix.schema.types.PLong;
 +import org.apache.phoenix.schema.types.PLongArray;
 +import org.apache.phoenix.schema.types.PTime;
 +import org.apache.phoenix.schema.types.PTimeArray;
 +import org.apache.phoenix.schema.types.PTimestamp;
 +import org.apache.phoenix.schema.types.PTimestampArray;
 +import org.apache.phoenix.schema.types.PUnsignedDate;
 +import org.apache.phoenix.schema.types.PUnsignedDateArray;
++import org.apache.phoenix.schema.types.PUnsignedFloat;
 +import org.apache.phoenix.schema.types.PUnsignedTime;
 +import org.apache.phoenix.schema.types.PUnsignedTimeArray;
 +import org.apache.phoenix.schema.types.PUnsignedTimestamp;
 +import org.apache.phoenix.schema.types.PUnsignedTimestampArray;
 +import org.apache.phoenix.schema.types.PhoenixArray;
 +
 +import java.sql.SQLException;
 +import java.sql.Timestamp;
 +
 +/**
 + * Methods used by code generated by Calcite.
 + */
 +public class CalciteRuntime {
 +    public static Enumerable<Object> toEnumerable2(final ResultIterator iterator, final RowProjector rowProjector) {
 +        return new AbstractEnumerable<Object>() {
 +            @Override
 +            public Enumerator<Object> enumerator() {
 +                return toEnumerator(iterator, rowProjector);
 +            }
 +        };
 +    }
 +
 +    public static Enumerable<Object> toEnumerable(final QueryPlan plan) {
 +        try {
 +            return toEnumerable2(plan.iterator(), plan.getProjector());
 +        } catch (SQLException e) {
 +            throw new RuntimeException(e);
 +        }
 +    }
 +
 +    public static Enumerator<Object> toEnumerator(final ResultIterator iterator, final RowProjector rowProjector) {
 +        final int count = rowProjector.getColumnCount();
 +        return new Enumerator<Object>() {
 +            Object current;
 +            private final ImmutableBytesWritable ptr = new ImmutableBytesWritable();
 +
 +            @Override
 +            public Object current() {
 +                return current;
 +            }
 +
 +            @Override
 +            public boolean moveNext() {
 +                try {
 +                    final Tuple tuple = iterator.next();
 +                    if (tuple == null) {
 +                        current = null;
 +                        return false;
 +                    }
 +                    if (count == 1) {
 +                        ColumnProjector projector = rowProjector.getColumnProjector(0);
 +                        current = project(tuple, projector);
 +                        return true;
 +                    }
 +                    Object[] array = new Object[count];
 +                    for (int i = 0; i < count; i++) {
 +                        ColumnProjector projector = rowProjector.getColumnProjector(i);
 +                        array[i] = project(tuple, projector);
 +                    }
 +                    current = array;
 +                    return true;
 +                } catch (SQLException e) {
 +                    throw new RuntimeException(e);
 +                }
 +            }
 +            
 +            private Object project(Tuple tuple, ColumnProjector projector) throws SQLException {
 +                @SuppressWarnings("rawtypes")
 +                PDataType type = projector.getExpression().getDataType();
 +                if (PDataType.equalsAny(
 +                        type,
++                        PUnsignedFloat.INSTANCE,
++                        PFloat.INSTANCE)) {
++                    type = PDouble.INSTANCE;
++                } else if (PDataType.equalsAny(
++                        type,
 +                        PUnsignedDate.INSTANCE,
 +                        PDate.INSTANCE,
 +                        PUnsignedTime.INSTANCE,
 +                        PTime.INSTANCE)) {
 +                    type = PLong.INSTANCE;
-                 }else if (PDataType.equalsAny(
++                } else if (PDataType.equalsAny(
 +                        type,
 +                        PUnsignedDateArray.INSTANCE,
 +                        PDateArray.INSTANCE,
 +                        PUnsignedTimeArray.INSTANCE,
 +                        PTimeArray.INSTANCE)) {
 +                    type = PLongArray.INSTANCE;
 +                }
 +                Object value = projector.getValue(tuple, type, ptr);
 +                if (value != null) {
 +                    if (type.isArrayType()) {
 +                        value = ((PhoenixArray) value).getArray();
 +                    }
 +                    if (PDataType.equalsAny(
 +                                type,
 +                                PUnsignedTimestamp.INSTANCE,
 +                                PTimestamp.INSTANCE)) {
 +                        value = ((Timestamp) value).getTime();
 +                    } else if (PDataType.equalsAny(
 +                                type,
 +                                PUnsignedTimestampArray.INSTANCE,
 +                                PTimestampArray.INSTANCE)) {
 +                        Timestamp[] array = (Timestamp[]) value;
 +                        long[] newArray = new long[array.length];
 +                        for (int i = 0; i < array.length; i++) {
 +                            newArray[i] = array[i].getTime();
 +                        }
 +                        value = newArray;
 +                    }
 +                }
 +                
 +                return value;
 +            }
 +
 +            @Override
 +            public void reset() {
 +                throw new UnsupportedOperationException();
 +            }
 +
 +            @Override
 +            public void close() {
 +                try {
 +                    iterator.close();
 +                } catch (SQLException e) {
 +                    throw new RuntimeException(e);
 +                }
 +            }
 +        };
 +    }
 +}

http://git-wip-us.apache.org/repos/asf/phoenix/blob/74409be8/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixSchema.java
----------------------------------------------------------------------
diff --cc phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixSchema.java
index 8b2c160,0000000..fd630ab
mode 100644,000000..100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixSchema.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixSchema.java
@@@ -1,331 -1,0 +1,331 @@@
 +package org.apache.phoenix.calcite;
 +
 +import com.google.common.collect.ImmutableList;
 +import com.google.common.collect.Maps;
 +import com.google.common.collect.Sets;
 +
 +import org.apache.calcite.jdbc.CalciteSchema;
 +import org.apache.calcite.linq4j.tree.Expression;
 +import org.apache.calcite.materialize.MaterializationService;
 +import org.apache.calcite.schema.*;
 +import org.apache.calcite.schema.impl.ViewTable;
 +import org.apache.phoenix.compile.ColumnResolver;
 +import org.apache.phoenix.compile.FromCompiler;
 +import org.apache.phoenix.jdbc.PhoenixConnection;
 +import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData;
 +import org.apache.phoenix.parse.ColumnDef;
 +import org.apache.phoenix.parse.NamedTableNode;
 +import org.apache.phoenix.parse.TableName;
 +import org.apache.phoenix.schema.MetaDataClient;
 +import org.apache.phoenix.schema.PColumn;
 +import org.apache.phoenix.schema.PTable;
 +import org.apache.phoenix.schema.PTable.ViewType;
 +import org.apache.phoenix.schema.PTableImpl;
 +import org.apache.phoenix.schema.PTableType;
 +import org.apache.phoenix.schema.TableNotFoundException;
 +import org.apache.phoenix.schema.TableRef;
 +import org.apache.phoenix.util.IndexUtil;
 +import org.apache.phoenix.util.SchemaUtil;
 +
 +import java.sql.Connection;
 +import java.sql.DriverManager;
 +import java.sql.ResultSet;
 +import java.sql.SQLException;
 +import java.util.Collection;
 +import java.util.Collections;
 +import java.util.List;
 +import java.util.Map;
 +import java.util.Properties;
 +import java.util.Set;
 +
 +/**
 + * Implementation of Calcite's {@link Schema} SPI for Phoenix.
 + * 
 + * TODO
 + * 1) change this to non-caching mode??
 + * 2) how to deal with define indexes and views since they require a CalciteSchema
 + *    instance??
 + *
 + */
 +public class PhoenixSchema implements Schema {
 +    public static final Factory FACTORY = new Factory();
 +
 +    public final PhoenixConnection pc;
 +    
 +    protected final String name;
 +    protected final String schemaName;
 +    protected final SchemaPlus parentSchema;
 +    protected final MetaDataClient client;
 +    
 +    protected final Map<String, Schema> subSchemas;
 +    protected final Map<String, Table> tables;
 +    protected final Map<String, Function> views;
 +    protected final Set<PTable> viewTables;
 +    
 +    protected PhoenixSchema(String name, String schemaName,
 +            SchemaPlus parentSchema, PhoenixConnection pc) {
 +        this.name = name;
 +        this.schemaName = schemaName;
 +        this.parentSchema = parentSchema;
 +        this.pc = pc;
 +        this.client = new MetaDataClient(pc);
 +        this.subSchemas = Maps.newHashMap();
 +        this.tables = Maps.newHashMap();
 +        this.views = Maps.newHashMap();
 +        this.viewTables = Sets.newHashSet();
 +    }
 +
 +    private static Schema create(SchemaPlus parentSchema,
 +            String name, Map<String, Object> operand) {
 +        String url = (String) operand.get("url");
 +        final Properties properties = new Properties();
 +        for (Map.Entry<String, Object> entry : operand.entrySet()) {
 +            properties.setProperty(entry.getKey(), String.valueOf(entry.getValue()));
 +        }
 +        try {
 +            Class.forName("org.apache.phoenix.jdbc.PhoenixDriver");
 +            final Connection connection =
 +                DriverManager.getConnection(url, properties);
 +            final PhoenixConnection phoenixConnection =
 +                connection.unwrap(PhoenixConnection.class);
 +            return new PhoenixSchema(name, null, parentSchema, phoenixConnection);
 +        } catch (ClassNotFoundException e) {
 +            throw new RuntimeException(e);
 +        } catch (SQLException e) {
 +            throw new RuntimeException(e);
 +        }
 +    }
 +
 +    @Override
 +    public Table getTable(String name) {
 +        Table table = tables.get(name);
 +        if (table != null) {
 +            return table;
 +        }
 +        
 +        try {
 +            ColumnResolver x = FromCompiler.getResolver(
 +                    NamedTableNode.create(
 +                            null,
 +                            TableName.create(schemaName, name),
 +                            ImmutableList.<ColumnDef>of()), pc);
 +            final List<TableRef> tables = x.getTables();
 +            assert tables.size() == 1;
 +            PTable pTable = tables.get(0).getTable();
 +            if (!isView(pTable)) {
 +                pTable = fixTableMultiTenancy(pTable);
 +                table = new PhoenixTable(pc, pTable);
 +            }
 +        } catch (TableNotFoundException e) {
 +        } catch (SQLException e) {
 +            throw new RuntimeException(e);
 +        }
 +        
 +        if (table == null) {
 +            table = resolveSequence(name);
 +        }
 +        
 +        if (table != null) {
 +            tables.put(name, table);
 +        }
 +        return table;
 +    }
 +
 +    @Override
 +    public Set<String> getTableNames() {
 +        return tables.keySet();
 +    }
 +
 +    @Override
 +    public Collection<Function> getFunctions(String name) {
 +        Function func = views.get(name);
 +        if (func != null) {
 +            return ImmutableList.of(func);
 +        }
 +        
 +        try {
 +            ColumnResolver x = FromCompiler.getResolver(
 +                    NamedTableNode.create(
 +                            null,
 +                            TableName.create(schemaName, name),
 +                            ImmutableList.<ColumnDef>of()), pc);
 +            final List<TableRef> tables = x.getTables();
 +            assert tables.size() == 1;
 +            PTable pTable = tables.get(0).getTable();
 +            if (isView(pTable)) {
 +                String viewSql = pTable.getViewStatement();
 +                if (viewSql == null) {
 +                    viewSql = "select * from "
 +                            + SchemaUtil.getEscapedFullTableName(
 +                                    pTable.getPhysicalName().getString());
 +                }
 +                SchemaPlus schema = parentSchema.getSubSchema(this.name);
 +                SchemaPlus viewSqlSchema =
 +                        this.schemaName == null ? schema : parentSchema;
 +                func = ViewTable.viewMacro(schema, viewSql,
 +                        CalciteSchema.from(viewSqlSchema).path(null),
 +                        pTable.getViewType() == ViewType.UPDATABLE);
 +                views.put(name, func);
 +                viewTables.add(pTable);
 +            }
 +        } catch (TableNotFoundException e) {
 +        } catch (SQLException e) {
 +            throw new RuntimeException(e);
 +        }
 +        
 +        return func == null ? Collections.<Function>emptyList() : ImmutableList.of(func);
 +    }
 +
 +    @Override
 +    public Set<String> getFunctionNames() {
 +        return views.keySet();
 +    }
 +
 +    @Override
 +    public Schema getSubSchema(String name) {
 +        if (schemaName != null) {
 +            return null;
 +        }
 +        
 +        Schema schema = subSchemas.get(name);
 +        if (schema != null) {
 +            return schema;
 +        }
 +        
 +        schema = new PhoenixSchema(name, name, parentSchema.getSubSchema(this.name), pc);
 +        subSchemas.put(name, schema);
 +        return schema;
 +    }
 +
 +    @Override
 +    public Set<String> getSubSchemaNames() {
 +        return subSchemas.keySet();
 +    }
 +
 +    @Override
 +    public Expression getExpression(SchemaPlus parentSchema, String name) {
 +        throw new UnsupportedOperationException();
 +    }
 +
 +    @Override
 +    public boolean isMutable() {
 +        return true;
 +    }
 +
 +    @Override
 +    public boolean contentsHaveChangedSince(long lastCheck, long now) {
 +        return false;
 +    }
 +    
 +    public void defineIndexesAsMaterializations() {
 +        SchemaPlus schema = parentSchema.getSubSchema(this.name);
 +        SchemaPlus viewSqlSchema =
 +                this.schemaName == null ? schema : parentSchema;
 +        CalciteSchema calciteSchema = CalciteSchema.from(schema);
 +        List<String> path = CalciteSchema.from(viewSqlSchema).path(null);
 +        try {
 +            for (Table table : tables.values()) {
 +                if (table instanceof PhoenixTable) {
 +                    PTable pTable = ((PhoenixTable) table).pTable;
 +                    for (PTable index : pTable.getIndexes()) {
 +                        addMaterialization(index, path, calciteSchema);
 +                    }
 +                }
 +            }
 +            for (PTable pTable : viewTables) {
 +                for (PTable index : pTable.getIndexes()) {
 +                    if (index.getParentName().equals(pTable.getName())) {
 +                        addMaterialization(index, path, calciteSchema);
 +                    }
 +                }                
 +            }
 +        } catch (SQLException e) {
 +            throw new RuntimeException(e);
 +        }
 +    }
 +    
 +    private void addMaterialization(PTable index, List<String> path,
 +            CalciteSchema calciteSchema) throws SQLException {
 +        index = fixTableMultiTenancy(index);
 +        StringBuffer sb = new StringBuffer();
 +        sb.append("SELECT");
 +        for (PColumn column : PhoenixTable.getMappedColumns(index)) {
 +            String indexColumnName = column.getName().getString();
 +            String dataColumnName = IndexUtil.getDataColumnName(indexColumnName);
 +            sb.append(",").append(SchemaUtil.getEscapedFullColumnName(dataColumnName));
 +            sb.append(" ").append(SchemaUtil.getEscapedFullColumnName(indexColumnName));
 +        }
 +        sb.setCharAt(6, ' '); // replace first comma with space.
 +        sb.append(" FROM ").append(SchemaUtil.getEscapedFullTableName(index.getParentName().getString()));
 +        MaterializationService.instance().defineMaterialization(
 +                calciteSchema, null, sb.toString(), path, index.getTableName().getString(), true, true);        
 +    }
 +    
 +    private boolean isView(PTable table) {
 +        return table.getType() == PTableType.VIEW
 +                && table.getViewType() != ViewType.MAPPED;
 +    }
 +    
 +    private PTable fixTableMultiTenancy(PTable table) throws SQLException {
 +        if (pc.getTenantId() != null || !table.isMultiTenant()) {
 +            return table;
 +        }
 +        return PTableImpl.makePTable(
 +                table.getTenantId(), table.getSchemaName(), table.getTableName(), table.getType(), table.getIndexState(), table.getTimeStamp(),
 +                table.getSequenceNumber(), table.getPKName(), table.getBucketNum(), PTableImpl.getColumnsToClone(table), table.getParentSchemaName(), table.getParentTableName(),
 +                table.getIndexes(), table.isImmutableRows(), table.getPhysicalNames(), table.getDefaultFamilyName(), table.getViewStatement(),
 +                table.isWALDisabled(), false, table.getStoreNulls(), table.getViewType(), table.getViewIndexId(), table.getIndexType(),
-                 table.getTableStats(), table.getBaseColumnCount(), table.rowKeyOrderOptimizable(), table.isTransactional());
++                table.rowKeyOrderOptimizable(), table.isTransactional(), table.getUpdateCacheFrequency(), table.getTableStats(), table.getBaseColumnCount());
 +    }
 +    
 +    private PhoenixSequence resolveSequence(String name) {
 +        try {
 +            // FIXME: Do this the same way as resolving a table after PHOENIX-2489.
 +            String tenantId = pc.getTenantId() == null ? null : pc.getTenantId().getString();
 +            String q = "select 1 from " + PhoenixDatabaseMetaData.SEQUENCE_FULLNAME_ESCAPED
 +                    + " where " + PhoenixDatabaseMetaData.SEQUENCE_SCHEMA
 +                    + (schemaName == null ? " is null" : " = '" + schemaName + "'")
 +                    + " and " + PhoenixDatabaseMetaData.SEQUENCE_NAME
 +                    + " = '" + name + "'"
 +                    + " and " + PhoenixDatabaseMetaData.TENANT_ID
 +                    + (tenantId == null ? " is null" : " = '" + tenantId + "'");
 +            ResultSet rs = pc.createStatement().executeQuery(q);
 +            if (rs.next()) {
 +                return new PhoenixSequence(schemaName, name, pc);
 +            }
 +        } catch (SQLException e) {
 +            throw new RuntimeException(e);
 +        }
 +        
 +        return null;
 +    }
 +
 +    /** Schema factory that creates a
 +     * {@link org.apache.phoenix.calcite.PhoenixSchema}.
 +     * This allows you to create a Phoenix schema inside a model.json file.
 +     *
 +     * <pre>{@code
 +     * {
 +     *   version: '1.0',
 +     *   defaultSchema: 'HR',
 +     *   schemas: [
 +     *     {
 +     *       name: 'HR',
 +     *       type: 'custom',
 +     *       factory: 'org.apache.phoenix.calcite.PhoenixSchema.Factory',
 +     *       operand: {
 +     *         url: "jdbc:phoenix:localhost",
 +     *         user: "scott",
 +     *         password: "tiger"
 +     *       }
 +     *     }
 +     *   ]
 +     * }
 +     * }</pre>
 +     */
 +    public static class Factory implements SchemaFactory {
 +        public Schema create(SchemaPlus parentSchema, String name, Map<String, Object> operand) {
 +            return PhoenixSchema.create(parentSchema, name, operand);
 +        }
 +    }
 +}

http://git-wip-us.apache.org/repos/asf/phoenix/blob/74409be8/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixRelImplementorImpl.java
----------------------------------------------------------------------
diff --cc phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixRelImplementorImpl.java
index 44f3031,0000000..e1afc14
mode 100644,000000..100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixRelImplementorImpl.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixRelImplementorImpl.java
@@@ -1,191 -1,0 +1,191 @@@
 +package org.apache.phoenix.calcite.rel;
 +
 +import java.sql.SQLException;
 +import java.util.Collections;
 +import java.util.List;
 +import java.util.Stack;
 +
 +import org.apache.hadoop.hbase.HConstants;
 +import org.apache.phoenix.calcite.CalciteUtils;
 +import org.apache.phoenix.calcite.PhoenixSequence;
 +import org.apache.phoenix.calcite.PhoenixTable;
 +import org.apache.phoenix.calcite.rel.PhoenixRel.ImplementorContext;
 +import org.apache.phoenix.compile.ColumnProjector;
 +import org.apache.phoenix.compile.ExpressionProjector;
 +import org.apache.phoenix.compile.QueryPlan;
 +import org.apache.phoenix.compile.RowProjector;
 +import org.apache.phoenix.compile.SequenceManager;
 +import org.apache.phoenix.compile.SequenceValueExpression;
 +import org.apache.phoenix.compile.TupleProjectionCompiler;
 +import org.apache.phoenix.coprocessor.MetaDataProtocol;
 +import org.apache.phoenix.execute.RuntimeContext;
 +import org.apache.phoenix.execute.TupleProjector;
 +import org.apache.phoenix.expression.ColumnExpression;
 +import org.apache.phoenix.expression.CorrelateVariableFieldAccessExpression;
 +import org.apache.phoenix.expression.Expression;
 +import org.apache.phoenix.parse.ParseNodeFactory;
 +import org.apache.phoenix.parse.SequenceValueParseNode;
 +import org.apache.phoenix.parse.TableName;
 +import org.apache.phoenix.schema.ColumnRef;
 +import org.apache.phoenix.schema.KeyValueSchema;
 +import org.apache.phoenix.schema.PColumn;
 +import org.apache.phoenix.schema.PColumnImpl;
 +import org.apache.phoenix.schema.PName;
 +import org.apache.phoenix.schema.PNameFactory;
 +import org.apache.phoenix.schema.PTable;
 +import org.apache.phoenix.schema.PTableImpl;
 +import org.apache.phoenix.schema.PTableType;
 +import org.apache.phoenix.schema.TableRef;
 +import org.apache.phoenix.schema.KeyValueSchema.KeyValueSchemaBuilder;
 +import org.apache.phoenix.schema.types.PDataType;
 +import org.apache.phoenix.util.SchemaUtil;
 +
 +import com.google.common.collect.Lists;
 +
 +public class PhoenixRelImplementorImpl implements PhoenixRel.Implementor {
 +    private final RuntimeContext runtimeContext;
 +	private TableRef tableRef;
 +	private List<PColumn> mappedColumns;
 +	private Stack<ImplementorContext> contextStack;
 +	private SequenceManager sequenceManager;
 +	
 +	public PhoenixRelImplementorImpl(RuntimeContext runtimeContext) {
 +	    this.runtimeContext = runtimeContext;
 +	    this.contextStack = new Stack<ImplementorContext>();
 +	}
 +	
 +    @Override
 +    public QueryPlan visitInput(int i, PhoenixRel input) {
 +        return input.implement(this);
 +    }
 +
 +	@Override
 +	public ColumnExpression newColumnExpression(int index) {
 +		ColumnRef colRef = new ColumnRef(this.tableRef, this.mappedColumns.get(index).getPosition());
 +		return colRef.newColumnExpression();
 +	}
 +    
 +    @SuppressWarnings("rawtypes")
 +    @Override
 +    public Expression newFieldAccessExpression(String variableId, int index, PDataType type) {
 +        Expression fieldAccessExpr = runtimeContext.newCorrelateVariableReference(variableId, index);
 +        return new CorrelateVariableFieldAccessExpression(runtimeContext, variableId, fieldAccessExpr);
 +    }
 +    
 +    @Override
 +    public SequenceValueExpression newSequenceExpression(PhoenixSequence seq, SequenceValueParseNode.Op op) {
 +        PName tenantName = seq.pc.getTenantId();
 +        TableName tableName = TableName.create(seq.schemaName, seq.sequenceName);
 +        try {
 +            return sequenceManager.newSequenceReference(tenantName, tableName, null, op);
 +        } catch (SQLException e) {
 +            throw new RuntimeException(e);
 +        }
 +    }
 +    
 +    @Override
 +    public RuntimeContext getRuntimeContext() {
 +        return runtimeContext;
 +    }
 +
 +    @Override
 +	public void setTableRef(TableRef tableRef) {
 +		this.tableRef = tableRef;
 +		this.mappedColumns = PhoenixTable.getMappedColumns(tableRef.getTable());
 +	}
 +    
 +    @Override
 +    public TableRef getTableRef() {
 +        return this.tableRef;
 +    }
 +    
 +    @Override
 +    public void setSequenceManager(SequenceManager sequenceManager) {
 +        this.sequenceManager = sequenceManager;
 +    }
 +
 +    @Override
 +    public void pushContext(ImplementorContext context) {
 +        this.contextStack.push(context);
 +    }
 +
 +    @Override
 +    public ImplementorContext popContext() {
 +        return contextStack.pop();
 +    }
 +
 +    @Override
 +    public ImplementorContext getCurrentContext() {
 +        return contextStack.peek();
 +    }
 +    
 +    @Override
 +    public PTable createProjectedTable() {
 +        List<ColumnRef> sourceColumnRefs = Lists.<ColumnRef> newArrayList();
 +        List<PColumn> columns = getCurrentContext().retainPKColumns ?
 +                  getTableRef().getTable().getColumns() : mappedColumns;
 +        for (PColumn column : columns) {
 +            sourceColumnRefs.add(new ColumnRef(getTableRef(), column.getPosition()));
 +        }
 +        
 +        try {
 +            return TupleProjectionCompiler.createProjectedTable(getTableRef(), sourceColumnRefs, getCurrentContext().retainPKColumns);
 +        } catch (SQLException e) {
 +            throw new RuntimeException(e);
 +        }
 +    }
 +    
 +    @Override
 +    public TupleProjector createTupleProjector() {
 +        KeyValueSchemaBuilder builder = new KeyValueSchemaBuilder(0);
 +        List<Expression> exprs = Lists.<Expression> newArrayList();
 +        for (PColumn column : mappedColumns) {
 +            if (!SchemaUtil.isPKColumn(column) || !getCurrentContext().retainPKColumns) {
 +                Expression expr = new ColumnRef(tableRef, column.getPosition()).newColumnExpression();
 +                exprs.add(expr);
 +                builder.addField(expr);                
 +            }
 +        }
 +        
 +        return new TupleProjector(builder.build(), exprs.toArray(new Expression[exprs.size()]));
 +    }
 +    
 +    @Override
 +    public RowProjector createRowProjector() {
 +        List<ColumnProjector> columnProjectors = Lists.<ColumnProjector>newArrayList();
 +        for (int i = 0; i < mappedColumns.size(); i++) {
 +            PColumn column = mappedColumns.get(i);
 +            Expression expr = newColumnExpression(i); // Do not use column.position() here.
 +            columnProjectors.add(new ExpressionProjector(column.getName().getString(), getTableRef().getTable().getName().getString(), expr, false));
 +        }
 +        // TODO get estimate row size
 +        return new RowProjector(columnProjectors, 0, false);        
 +    }
 +    
 +    @Override
 +    public TupleProjector project(List<Expression> exprs) {
 +        KeyValueSchema.KeyValueSchemaBuilder builder = new KeyValueSchema.KeyValueSchemaBuilder(0);
 +        List<PColumn> columns = Lists.<PColumn>newArrayList();
 +        for (int i = 0; i < exprs.size(); i++) {
 +            String name = ParseNodeFactory.createTempAlias();
 +            Expression expr = exprs.get(i);
 +            builder.addField(expr);
 +            columns.add(new PColumnImpl(PNameFactory.newName(name), PNameFactory.newName(TupleProjector.VALUE_COLUMN_FAMILY),
 +                    expr.getDataType(), expr.getMaxLength(), expr.getScale(), expr.isNullable(),
-                     i, expr.getSortOrder(), null, null, false, name, false));
++                    i, expr.getSortOrder(), null, null, false, name, false, false));
 +        }
 +        try {
 +            PTable pTable = PTableImpl.makePTable(null, PName.EMPTY_NAME, PName.EMPTY_NAME,
 +                    PTableType.SUBQUERY, null, MetaDataProtocol.MIN_TABLE_TIMESTAMP, PTable.INITIAL_SEQ_NUM,
 +                    null, null, columns, null, null, Collections.<PTable>emptyList(),
 +                    false, Collections.<PName>emptyList(), null, null, false, false, false, null,
-                     null, null, true, false);
++                    null, null, true, false, 0);
 +            this.setTableRef(new TableRef(CalciteUtils.createTempAlias(), pTable, HConstants.LATEST_TIMESTAMP, false));
 +        } catch (SQLException e) {
 +            throw new RuntimeException(e);
 +        }
 +        
 +        return new TupleProjector(builder.build(), exprs.toArray(new Expression[exprs.size()]));        
 +    }
 +
 +}

http://git-wip-us.apache.org/repos/asf/phoenix/blob/74409be8/phoenix-core/src/main/java/org/apache/phoenix/compile/ListJarsQueryPlan.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/phoenix/blob/74409be8/phoenix-core/src/main/java/org/apache/phoenix/compile/TraceQueryPlan.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/phoenix/blob/74409be8/phoenix-core/src/main/java/org/apache/phoenix/execute/ClientAggregatePlan.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/phoenix/blob/74409be8/phoenix-core/src/main/java/org/apache/phoenix/execute/HashJoinPlan.java
----------------------------------------------------------------------
diff --cc phoenix-core/src/main/java/org/apache/phoenix/execute/HashJoinPlan.java
index 64a9140,5fdec46..e7a00ed
--- a/phoenix-core/src/main/java/org/apache/phoenix/execute/HashJoinPlan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/HashJoinPlan.java
@@@ -450,16 -443,6 +450,16 @@@ public class HashJoinPlan extends Deleg
              return plan;
          }
      }
 +
 +    @Override
 +    public QueryPlan limit(Integer limit) {
 +        QueryPlan delegate = this.delegate.limit(limit);
 +        if (delegate == this.delegate)
 +            return this;
 +
 +        return new HashJoinPlan(this.statement, delegate, this.joinInfo, 
-                 this.subPlans, this.recompileWhereClause);
++                this.subPlans, this.recompileWhereClause, dependencies);
 +    }
  }
  
  

http://git-wip-us.apache.org/repos/asf/phoenix/blob/74409be8/phoenix-core/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java
----------------------------------------------------------------------
diff --cc phoenix-core/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java
index b3235e2,b3235e2..51715f9
--- a/phoenix-core/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java
@@@ -143,7 -143,7 +143,7 @@@ public abstract class BaseResultIterato
          if (isPointLookup || ScanUtil.isAnalyzeTable(scan)) {
              return false;
          }
--        return true;
++        return false;
      }
      
      private static void initializeScan(QueryPlan plan, Integer perScanLimit) {

http://git-wip-us.apache.org/repos/asf/phoenix/blob/74409be8/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixStatement.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/phoenix/blob/74409be8/pom.xml
----------------------------------------------------------------------
diff --cc pom.xml
index a1dab3c,4373753..fc642da
--- a/pom.xml
+++ b/pom.xml
@@@ -109,9 -109,12 +109,12 @@@
      <collections.version>3.2.1</collections.version>
      <jodatime.version>2.7</jodatime.version>
      <joni.version>2.1.2</joni.version>
 -    <calcite.version>1.6.0</calcite.version>
 +    <calcite.version>1.6.0-SNAPSHOT</calcite.version>
      <jettyVersion>8.1.7.v20120910</jettyVersion>
      <tephra.version>0.6.4</tephra.version>
+     <spark.version>1.5.2</spark.version>
+     <scala.version>2.10.4</scala.version>
+     <scala.binary.version>2.10</scala.binary.version>
  
      <!-- Test Dependencies -->
      <mockito-all.version>1.8.5</mockito-all.version>