[09/12] phoenix git commit: PHOENIX-2160 - Projection of specific array index does not work (Dumindu Buddhika)

2015-09-03 Thread maryannxue
PHOENIX-2160 - Projection of specific array index does not work (Dumindu
Buddhika)


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

Branch: refs/heads/calcite
Commit: 7d7c21786f4c1224027aec05a9b72411a3a1c07b
Parents: ed3f3bb
Author: ramkrishna 
Authored: Wed Sep 2 14:40:49 2015 +0530
Committer: ramkrishna 
Committed: Wed Sep 2 14:40:49 2015 +0530

--
 .../org/apache/phoenix/end2end/ArrayIT.java | 441 +++
 .../phoenix/compile/ProjectionCompiler.java | 130 --
 .../apache/phoenix/compile/RowProjector.java|   4 +-
 .../coprocessor/BaseScannerRegionObserver.java  |  15 +-
 .../expression/ProjectedColumnExpression.java   |   7 +-
 .../visitor/CloneExpressionVisitor.java |  47 +-
 .../apache/phoenix/iterate/ExplainTable.java|   3 +
 .../phoenix/compile/QueryCompilerTest.java  |  77 
 .../expression/ArithmeticOperationTest.java |   8 +-
 9 files changed, 660 insertions(+), 72 deletions(-)
--


http://git-wip-us.apache.org/repos/asf/phoenix/blob/7d7c2178/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java
--
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java
index 800a7b4..b7a2ad2 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java
@@ -2238,4 +2238,445 @@ public class ArrayIT extends BaseClientManagedTimeIT {
 rs = stmt.executeQuery();
 assertTrue(rs.next());
 }
+
+@Test
+public void testServerArrayElementProjection1() throws SQLException {
+long ts = nextTimestamp();
+Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 10));
+Connection conn = DriverManager.getConnection(getUrl(), props);
+String ddl = "CREATE TABLE a (p INTEGER PRIMARY KEY, arr1 INTEGER 
ARRAY, arr2 VARCHAR ARRAY)";
+conn.createStatement().execute(ddl);
+conn.close();
+
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 30));
+conn = DriverManager.getConnection(getUrl(), props);
+PreparedStatement stmt = conn.prepareStatement("UPSERT INTO a VALUES 
(1, ARRAY[1, 2], ARRAY['a', 'b'])");
+stmt.execute();
+conn.commit();
+conn.close();
+
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 40));
+conn = DriverManager.getConnection(getUrl(), props);
+ResultSet rs;
+stmt = conn.prepareStatement("SELECT arr1, arr1[1], arr2[1] FROM a");
+rs = stmt.executeQuery();
+assertTrue(rs.next());
+assertEquals(conn.createArrayOf("INTEGER", new Integer[]{1, 2}), 
rs.getArray(1));
+assertEquals(1, rs.getInt(2));
+assertEquals("a", rs.getString(3));
+}
+
+@Test
+public void testServerArrayElementProjection2() throws SQLException {
+long ts = nextTimestamp();
+Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 10));
+Connection conn = DriverManager.getConnection(getUrl(), props);
+String ddl = "CREATE TABLE a (p INTEGER PRIMARY KEY, arr1 INTEGER 
ARRAY, arr2 VARCHAR ARRAY, arr3 INTEGER ARRAY)";
+conn.createStatement().execute(ddl);
+conn.close();
+
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 30));
+conn = DriverManager.getConnection(getUrl(), props);
+PreparedStatement stmt = conn.prepareStatement("UPSERT INTO a VALUES 
(1, ARRAY[1, 2], ARRAY['a', 'b'], ARRAY[2, 3])");
+stmt.execute();
+conn.commit();
+conn.close();
+
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 40));
+conn = DriverManager.getConnection(getUrl(), props);
+ResultSet rs;
+stmt = conn.prepareStatement("SELECT arr1, arr1[1], arr2[1], arr3[1] 
from a");
+rs = stmt.executeQuery();
+assertTrue(rs.next());
+assertEquals(conn.createArrayOf("INTEGER", new Integer[]{1, 2}), 
rs.getArray(1));
+assertEquals(1, rs.getInt(2));
+assertEquals("a", rs.getString(3));
+assertEquals(2, rs.getInt(4));
+}
+
+@Test
+public void testServerArrayElementProjection3() throws SQLException {
+long ts = 

phoenix git commit: PHOENIX-2160 Projection of specific array index does not work (Dumindu Buddhika)

2015-09-03 Thread ramkrishna
Repository: phoenix
Updated Branches:
  refs/heads/4.x-HBase-1.0 92d01e116 -> 4fa725937


PHOENIX-2160 Projection of specific array index does not work (Dumindu
Buddhika)


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

Branch: refs/heads/4.x-HBase-1.0
Commit: 4fa72593727e80790d85a12125382cafd62b85a3
Parents: 92d01e1
Author: ramkrishna 
Authored: Fri Sep 4 11:11:55 2015 +0530
Committer: ramkrishna 
Committed: Fri Sep 4 11:11:55 2015 +0530

--
 .../org/apache/phoenix/end2end/ArrayIT.java | 441 +++
 .../phoenix/compile/ProjectionCompiler.java | 130 --
 .../apache/phoenix/compile/RowProjector.java|   4 +-
 .../coprocessor/BaseScannerRegionObserver.java  |  15 +-
 .../expression/ProjectedColumnExpression.java   |   7 +-
 .../visitor/CloneExpressionVisitor.java |  47 +-
 .../CloneNonDeterministicExpressionVisitor.java |  30 ++
 .../ProjectedColumnExpressionVisitor.java   |  25 ++
 .../ReplaceArrayFunctionExpressionVisitor.java  |  46 ++
 .../apache/phoenix/iterate/ExplainTable.java|   3 +
 .../phoenix/compile/QueryCompilerTest.java  |  77 
 .../expression/ArithmeticOperationTest.java |   8 +-
 12 files changed, 761 insertions(+), 72 deletions(-)
--


http://git-wip-us.apache.org/repos/asf/phoenix/blob/4fa72593/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java
--
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java
index 800a7b4..b7a2ad2 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java
@@ -2238,4 +2238,445 @@ public class ArrayIT extends BaseClientManagedTimeIT {
 rs = stmt.executeQuery();
 assertTrue(rs.next());
 }
+
+@Test
+public void testServerArrayElementProjection1() throws SQLException {
+long ts = nextTimestamp();
+Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 10));
+Connection conn = DriverManager.getConnection(getUrl(), props);
+String ddl = "CREATE TABLE a (p INTEGER PRIMARY KEY, arr1 INTEGER 
ARRAY, arr2 VARCHAR ARRAY)";
+conn.createStatement().execute(ddl);
+conn.close();
+
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 30));
+conn = DriverManager.getConnection(getUrl(), props);
+PreparedStatement stmt = conn.prepareStatement("UPSERT INTO a VALUES 
(1, ARRAY[1, 2], ARRAY['a', 'b'])");
+stmt.execute();
+conn.commit();
+conn.close();
+
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 40));
+conn = DriverManager.getConnection(getUrl(), props);
+ResultSet rs;
+stmt = conn.prepareStatement("SELECT arr1, arr1[1], arr2[1] FROM a");
+rs = stmt.executeQuery();
+assertTrue(rs.next());
+assertEquals(conn.createArrayOf("INTEGER", new Integer[]{1, 2}), 
rs.getArray(1));
+assertEquals(1, rs.getInt(2));
+assertEquals("a", rs.getString(3));
+}
+
+@Test
+public void testServerArrayElementProjection2() throws SQLException {
+long ts = nextTimestamp();
+Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 10));
+Connection conn = DriverManager.getConnection(getUrl(), props);
+String ddl = "CREATE TABLE a (p INTEGER PRIMARY KEY, arr1 INTEGER 
ARRAY, arr2 VARCHAR ARRAY, arr3 INTEGER ARRAY)";
+conn.createStatement().execute(ddl);
+conn.close();
+
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 30));
+conn = DriverManager.getConnection(getUrl(), props);
+PreparedStatement stmt = conn.prepareStatement("UPSERT INTO a VALUES 
(1, ARRAY[1, 2], ARRAY['a', 'b'], ARRAY[2, 3])");
+stmt.execute();
+conn.commit();
+conn.close();
+
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 40));
+conn = DriverManager.getConnection(getUrl(), props);
+ResultSet rs;
+stmt = conn.prepareStatement("SELECT arr1, arr1[1], arr2[1], arr3[1] 
from a");
+rs = stmt.executeQuery();
+assertTrue(rs.next());
+assertEquals(conn.createArrayOf("INTEGER", new Integer[]{1, 2}), 

phoenix git commit: PHOENIX-2160 Projection of specific array index does not work (Dumindu Buddhika)

2015-09-03 Thread ramkrishna
Repository: phoenix
Updated Branches:
  refs/heads/4.5-HBase-1.0 4d809a2d2 -> 7d5e3640d


PHOENIX-2160 Projection of specific array index does not work (Dumindu
Buddhika)


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

Branch: refs/heads/4.5-HBase-1.0
Commit: 7d5e3640d712fb870ee32e18c8b5e9bcb5beabb4
Parents: 4d809a2
Author: ramkrishna 
Authored: Fri Sep 4 11:16:27 2015 +0530
Committer: ramkrishna 
Committed: Fri Sep 4 11:16:27 2015 +0530

--
 .../org/apache/phoenix/end2end/ArrayIT.java | 441 +++
 .../phoenix/compile/ProjectionCompiler.java | 130 --
 .../apache/phoenix/compile/RowProjector.java|   4 +-
 .../coprocessor/BaseScannerRegionObserver.java  |  15 +-
 .../expression/ProjectedColumnExpression.java   |   7 +-
 .../visitor/CloneExpressionVisitor.java |  47 +-
 .../CloneNonDeterministicExpressionVisitor.java |  30 ++
 .../ProjectedColumnExpressionVisitor.java   |  25 ++
 .../ReplaceArrayFunctionExpressionVisitor.java  |  46 ++
 .../apache/phoenix/iterate/ExplainTable.java|   3 +
 .../phoenix/compile/QueryCompilerTest.java  |  77 
 .../expression/ArithmeticOperationTest.java |   8 +-
 12 files changed, 761 insertions(+), 72 deletions(-)
--


http://git-wip-us.apache.org/repos/asf/phoenix/blob/7d5e3640/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java
--
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java
index 800a7b4..b7a2ad2 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java
@@ -2238,4 +2238,445 @@ public class ArrayIT extends BaseClientManagedTimeIT {
 rs = stmt.executeQuery();
 assertTrue(rs.next());
 }
+
+@Test
+public void testServerArrayElementProjection1() throws SQLException {
+long ts = nextTimestamp();
+Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 10));
+Connection conn = DriverManager.getConnection(getUrl(), props);
+String ddl = "CREATE TABLE a (p INTEGER PRIMARY KEY, arr1 INTEGER 
ARRAY, arr2 VARCHAR ARRAY)";
+conn.createStatement().execute(ddl);
+conn.close();
+
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 30));
+conn = DriverManager.getConnection(getUrl(), props);
+PreparedStatement stmt = conn.prepareStatement("UPSERT INTO a VALUES 
(1, ARRAY[1, 2], ARRAY['a', 'b'])");
+stmt.execute();
+conn.commit();
+conn.close();
+
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 40));
+conn = DriverManager.getConnection(getUrl(), props);
+ResultSet rs;
+stmt = conn.prepareStatement("SELECT arr1, arr1[1], arr2[1] FROM a");
+rs = stmt.executeQuery();
+assertTrue(rs.next());
+assertEquals(conn.createArrayOf("INTEGER", new Integer[]{1, 2}), 
rs.getArray(1));
+assertEquals(1, rs.getInt(2));
+assertEquals("a", rs.getString(3));
+}
+
+@Test
+public void testServerArrayElementProjection2() throws SQLException {
+long ts = nextTimestamp();
+Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 10));
+Connection conn = DriverManager.getConnection(getUrl(), props);
+String ddl = "CREATE TABLE a (p INTEGER PRIMARY KEY, arr1 INTEGER 
ARRAY, arr2 VARCHAR ARRAY, arr3 INTEGER ARRAY)";
+conn.createStatement().execute(ddl);
+conn.close();
+
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 30));
+conn = DriverManager.getConnection(getUrl(), props);
+PreparedStatement stmt = conn.prepareStatement("UPSERT INTO a VALUES 
(1, ARRAY[1, 2], ARRAY['a', 'b'], ARRAY[2, 3])");
+stmt.execute();
+conn.commit();
+conn.close();
+
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 40));
+conn = DriverManager.getConnection(getUrl(), props);
+ResultSet rs;
+stmt = conn.prepareStatement("SELECT arr1, arr1[1], arr2[1], arr3[1] 
from a");
+rs = stmt.executeQuery();
+assertTrue(rs.next());
+assertEquals(conn.createArrayOf("INTEGER", new Integer[]{1, 2}), 

phoenix git commit: PHOENIX-2160 Projection of specific array index does not work (Dumindu Buddhika)

2015-09-03 Thread ramkrishna
Repository: phoenix
Updated Branches:
  refs/heads/4.x-HBase-0.98 c261ea3ac -> 9ab693258


PHOENIX-2160 Projection of specific array index does not work (Dumindu
Buddhika)


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

Branch: refs/heads/4.x-HBase-0.98
Commit: 9ab69325830792efcba314ee4256505d5a7f46d9
Parents: c261ea3
Author: ramkrishna 
Authored: Fri Sep 4 10:50:13 2015 +0530
Committer: ramkrishna 
Committed: Fri Sep 4 10:50:13 2015 +0530

--
 .../org/apache/phoenix/end2end/ArrayIT.java | 441 +++
 .../phoenix/compile/ProjectionCompiler.java | 130 --
 .../apache/phoenix/compile/RowProjector.java|   4 +-
 .../coprocessor/BaseScannerRegionObserver.java  |  15 +-
 .../expression/ProjectedColumnExpression.java   |   7 +-
 .../visitor/CloneExpressionVisitor.java |  47 +-
 .../CloneNonDeterministicExpressionVisitor.java |  30 ++
 .../ProjectedColumnExpressionVisitor.java   |  25 ++
 .../ReplaceArrayFunctionExpressionVisitor.java  |  46 ++
 .../apache/phoenix/iterate/ExplainTable.java|   3 +
 .../phoenix/compile/QueryCompilerTest.java  |  77 
 .../expression/ArithmeticOperationTest.java |   8 +-
 12 files changed, 761 insertions(+), 72 deletions(-)
--


http://git-wip-us.apache.org/repos/asf/phoenix/blob/9ab69325/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java
--
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java
index 800a7b4..b7a2ad2 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java
@@ -2238,4 +2238,445 @@ public class ArrayIT extends BaseClientManagedTimeIT {
 rs = stmt.executeQuery();
 assertTrue(rs.next());
 }
+
+@Test
+public void testServerArrayElementProjection1() throws SQLException {
+long ts = nextTimestamp();
+Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 10));
+Connection conn = DriverManager.getConnection(getUrl(), props);
+String ddl = "CREATE TABLE a (p INTEGER PRIMARY KEY, arr1 INTEGER 
ARRAY, arr2 VARCHAR ARRAY)";
+conn.createStatement().execute(ddl);
+conn.close();
+
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 30));
+conn = DriverManager.getConnection(getUrl(), props);
+PreparedStatement stmt = conn.prepareStatement("UPSERT INTO a VALUES 
(1, ARRAY[1, 2], ARRAY['a', 'b'])");
+stmt.execute();
+conn.commit();
+conn.close();
+
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 40));
+conn = DriverManager.getConnection(getUrl(), props);
+ResultSet rs;
+stmt = conn.prepareStatement("SELECT arr1, arr1[1], arr2[1] FROM a");
+rs = stmt.executeQuery();
+assertTrue(rs.next());
+assertEquals(conn.createArrayOf("INTEGER", new Integer[]{1, 2}), 
rs.getArray(1));
+assertEquals(1, rs.getInt(2));
+assertEquals("a", rs.getString(3));
+}
+
+@Test
+public void testServerArrayElementProjection2() throws SQLException {
+long ts = nextTimestamp();
+Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 10));
+Connection conn = DriverManager.getConnection(getUrl(), props);
+String ddl = "CREATE TABLE a (p INTEGER PRIMARY KEY, arr1 INTEGER 
ARRAY, arr2 VARCHAR ARRAY, arr3 INTEGER ARRAY)";
+conn.createStatement().execute(ddl);
+conn.close();
+
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 30));
+conn = DriverManager.getConnection(getUrl(), props);
+PreparedStatement stmt = conn.prepareStatement("UPSERT INTO a VALUES 
(1, ARRAY[1, 2], ARRAY['a', 'b'], ARRAY[2, 3])");
+stmt.execute();
+conn.commit();
+conn.close();
+
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 40));
+conn = DriverManager.getConnection(getUrl(), props);
+ResultSet rs;
+stmt = conn.prepareStatement("SELECT arr1, arr1[1], arr2[1], arr3[1] 
from a");
+rs = stmt.executeQuery();
+assertTrue(rs.next());
+assertEquals(conn.createArrayOf("INTEGER", new Integer[]{1, 2}), 

phoenix git commit: PHOENIX-2160 Projection of specific array index does not work (Dumindu Buddhika)

2015-09-03 Thread ramkrishna
Repository: phoenix
Updated Branches:
  refs/heads/4.5-HBase-0.98 1aa04df62 -> b4a1ba82c


PHOENIX-2160 Projection of specific array index does not work (Dumindu
Buddhika)


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

Branch: refs/heads/4.5-HBase-0.98
Commit: b4a1ba82ce432074c261a8bd50f30b9bad4945c7
Parents: 1aa04df
Author: ramkrishna 
Authored: Fri Sep 4 11:19:30 2015 +0530
Committer: ramkrishna 
Committed: Fri Sep 4 11:19:30 2015 +0530

--
 .../org/apache/phoenix/end2end/ArrayIT.java | 441 +++
 .../phoenix/compile/ProjectionCompiler.java | 130 --
 .../apache/phoenix/compile/RowProjector.java|   4 +-
 .../coprocessor/BaseScannerRegionObserver.java  |  15 +-
 .../expression/ProjectedColumnExpression.java   |   7 +-
 .../visitor/CloneExpressionVisitor.java |  47 +-
 .../CloneNonDeterministicExpressionVisitor.java |  30 ++
 .../ProjectedColumnExpressionVisitor.java   |  25 ++
 .../ReplaceArrayFunctionExpressionVisitor.java  |  46 ++
 .../apache/phoenix/iterate/ExplainTable.java|   3 +
 .../phoenix/compile/QueryCompilerTest.java  |  77 
 .../expression/ArithmeticOperationTest.java |   8 +-
 12 files changed, 761 insertions(+), 72 deletions(-)
--


http://git-wip-us.apache.org/repos/asf/phoenix/blob/b4a1ba82/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java
--
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java
index 800a7b4..b7a2ad2 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java
@@ -2238,4 +2238,445 @@ public class ArrayIT extends BaseClientManagedTimeIT {
 rs = stmt.executeQuery();
 assertTrue(rs.next());
 }
+
+@Test
+public void testServerArrayElementProjection1() throws SQLException {
+long ts = nextTimestamp();
+Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 10));
+Connection conn = DriverManager.getConnection(getUrl(), props);
+String ddl = "CREATE TABLE a (p INTEGER PRIMARY KEY, arr1 INTEGER 
ARRAY, arr2 VARCHAR ARRAY)";
+conn.createStatement().execute(ddl);
+conn.close();
+
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 30));
+conn = DriverManager.getConnection(getUrl(), props);
+PreparedStatement stmt = conn.prepareStatement("UPSERT INTO a VALUES 
(1, ARRAY[1, 2], ARRAY['a', 'b'])");
+stmt.execute();
+conn.commit();
+conn.close();
+
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 40));
+conn = DriverManager.getConnection(getUrl(), props);
+ResultSet rs;
+stmt = conn.prepareStatement("SELECT arr1, arr1[1], arr2[1] FROM a");
+rs = stmt.executeQuery();
+assertTrue(rs.next());
+assertEquals(conn.createArrayOf("INTEGER", new Integer[]{1, 2}), 
rs.getArray(1));
+assertEquals(1, rs.getInt(2));
+assertEquals("a", rs.getString(3));
+}
+
+@Test
+public void testServerArrayElementProjection2() throws SQLException {
+long ts = nextTimestamp();
+Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 10));
+Connection conn = DriverManager.getConnection(getUrl(), props);
+String ddl = "CREATE TABLE a (p INTEGER PRIMARY KEY, arr1 INTEGER 
ARRAY, arr2 VARCHAR ARRAY, arr3 INTEGER ARRAY)";
+conn.createStatement().execute(ddl);
+conn.close();
+
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 30));
+conn = DriverManager.getConnection(getUrl(), props);
+PreparedStatement stmt = conn.prepareStatement("UPSERT INTO a VALUES 
(1, ARRAY[1, 2], ARRAY['a', 'b'], ARRAY[2, 3])");
+stmt.execute();
+conn.commit();
+conn.close();
+
+props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts 
+ 40));
+conn = DriverManager.getConnection(getUrl(), props);
+ResultSet rs;
+stmt = conn.prepareStatement("SELECT arr1, arr1[1], arr2[1], arr3[1] 
from a");
+rs = stmt.executeQuery();
+assertTrue(rs.next());
+assertEquals(conn.createArrayOf("INTEGER", new Integer[]{1, 2}),