You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ra...@apache.org on 2014/03/14 05:45:46 UTC

git commit: Phoenix-128-Support coercion and descending sort order for ARRAY

Repository: incubator-phoenix
Updated Branches:
  refs/heads/master 49d586cd9 -> 36845baee


Phoenix-128-Support coercion and descending sort order for ARRAY


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

Branch: refs/heads/master
Commit: 36845baee19751a2d8854efafc4169188745363d
Parents: 49d586c
Author: Ramkrishna <ra...@intel.com>
Authored: Fri Mar 14 10:13:49 2014 +0530
Committer: Ramkrishna <ra...@intel.com>
Committed: Fri Mar 14 10:13:49 2014 +0530

----------------------------------------------------------------------
 .../org/apache/phoenix/end2end/ArrayIT.java     | 138 ++++-
 phoenix-core/src/main/antlr3/PhoenixSQL.g       |   2 +-
 .../phoenix/compile/ExpressionCompiler.java     |   2 +-
 .../phoenix/expression/CoerceExpression.java    |   3 +-
 .../expression/function/ArrayIndexFunction.java |  15 +-
 .../org/apache/phoenix/parse/CastParseNode.java |  23 +-
 .../apache/phoenix/parse/ParseNodeFactory.java  |  24 +-
 .../apache/phoenix/schema/PArrayDataType.java   | 112 ++--
 .../org/apache/phoenix/schema/PDataType.java    | 615 ++++++++++++++-----
 9 files changed, 707 insertions(+), 227 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/36845bae/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 03c4bd8..f947a6d 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
@@ -524,7 +524,142 @@ public class ArrayIT extends BaseClientManagedTimeIT {
             conn.close();
         }
     }
-    
+
+    @Test
+    public void testArrayWithDescOrder() throws Exception {
+        Connection conn;
+        PreparedStatement stmt;
+        ResultSet rs;
+        long ts = nextTimestamp();
+        Properties props = new Properties(TEST_PROPERTIES);
+        props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 10));
+        conn = DriverManager.getConnection(getUrl(), props);
+        conn.createStatement().execute(
+                "CREATE TABLE t ( k VARCHAR, a_string_array VARCHAR(100) ARRAY[4], b_string_array VARCHAR(100) ARRAY[4] \n"
+                        + " CONSTRAINT pk PRIMARY KEY (k, b_string_array DESC)) \n");
+        conn.close();
+        props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 30));
+        conn = DriverManager.getConnection(getUrl(), props);
+        stmt = conn.prepareStatement("UPSERT INTO t VALUES(?,?,?)");
+        stmt.setString(1, "a");
+        String[] s = new String[] { "abc", "def", "ghi", "jkll", null, null, "xxx" };
+        Array array = conn.createArrayOf("VARCHAR", s);
+        stmt.setArray(2, array);
+        s = new String[] { "abc", "def", "ghi", "jkll", null, null, null, "xxx" };
+        array = conn.createArrayOf("VARCHAR", s);
+        stmt.setArray(3, array);
+        stmt.execute();
+        conn.commit();
+        conn.close();
+
+        props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 40));
+        conn = DriverManager.getConnection(getUrl(), props);
+        rs = conn.createStatement().executeQuery("SELECT b_string_array FROM t");
+        assertTrue(rs.next());
+        PhoenixArray strArr = (PhoenixArray)rs.getArray(1);
+        assertEquals(array, strArr);
+        conn.close();
+    }
+
+    @Test
+    public void testArraySelectSingleArrayElemWithCast() throws Exception {
+        Connection conn;
+        PreparedStatement stmt;
+        ResultSet rs;
+        long ts = nextTimestamp();
+        Properties props = new Properties(TEST_PROPERTIES);
+        props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 10));
+        conn = DriverManager.getConnection(getUrl(), props);
+        conn.createStatement().execute("CREATE TABLE t ( k VARCHAR PRIMARY KEY, a bigint ARRAY[])");
+        conn.close();
+        
+        props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 30));
+        conn = DriverManager.getConnection(getUrl(), props);
+        stmt = conn.prepareStatement("UPSERT INTO t VALUES(?,?)");
+        stmt.setString(1, "a");
+        Long[] s = new Long[] {1l, 2l};
+        Array array = conn.createArrayOf("BIGINT", s);
+        stmt.setArray(2, array);
+        stmt.execute();
+        conn.commit();
+        conn.close();
+        props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 40));
+        conn = DriverManager.getConnection(getUrl(), props);
+        rs = conn.createStatement().executeQuery("SELECT k, CAST(a[2] AS DOUBLE) FROM t");
+        assertTrue(rs.next());
+        assertEquals("a",rs.getString(1));
+        Double d = new Double(2.0);
+        assertEquals(d, (Double)rs.getDouble(2));
+        conn.close();
+    }
+
+    @Test
+    public void testArrayWithCast() throws Exception {
+        Connection conn;
+        PreparedStatement stmt;
+        ResultSet rs;
+        long ts = nextTimestamp();
+        Properties props = new Properties(TEST_PROPERTIES);
+        props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 10));
+        conn = DriverManager.getConnection(getUrl(), props);
+        conn.createStatement().execute("CREATE TABLE t ( k VARCHAR PRIMARY KEY, a bigint ARRAY[])");
+        conn.close();
+
+        props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 30));
+        conn = DriverManager.getConnection(getUrl(), props);
+        stmt = conn.prepareStatement("UPSERT INTO t VALUES(?,?)");
+        stmt.setString(1, "a");
+        Long[] s = new Long[] { 1l, 2l };
+        Array array = conn.createArrayOf("BIGINT", s);
+        stmt.setArray(2, array);
+        stmt.execute();
+        conn.commit();
+        conn.close();
+        props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 40));
+        conn = DriverManager.getConnection(getUrl(), props);
+        rs = conn.createStatement().executeQuery("SELECT CAST(a AS DOUBLE []) FROM t");
+        assertTrue(rs.next());
+        Double[] d = new Double[] { 1.0, 2.0 };
+        array = conn.createArrayOf("DOUBLE", d);
+        PhoenixArray arr = (PhoenixArray)rs.getArray(1);
+        assertEquals(array, arr);
+        conn.close();
+    }
+
+    @Test
+    public void testArrayWithCastForVarLengthArr() throws Exception {
+        Connection conn;
+        PreparedStatement stmt;
+        ResultSet rs;
+        long ts = nextTimestamp();
+        Properties props = new Properties(TEST_PROPERTIES);
+        props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 10));
+        conn = DriverManager.getConnection(getUrl(), props);
+        conn.createStatement().execute("CREATE TABLE t ( k VARCHAR PRIMARY KEY, a VARCHAR(5) ARRAY)");
+        conn.close();
+        props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 30));
+        conn = DriverManager.getConnection(getUrl(), props);
+        stmt = conn.prepareStatement("UPSERT INTO t VALUES(?,?)");
+        stmt.setString(1, "a");
+        String[] s = new String[] { "1", "2" };
+        PhoenixArray array = (PhoenixArray)conn.createArrayOf("VARCHAR", s);
+        stmt.setArray(2, array);
+        stmt.execute();
+        conn.commit();
+        conn.close();
+
+        props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 40));
+        conn = DriverManager.getConnection(getUrl(), props);
+        rs = conn.createStatement().executeQuery("SELECT CAST(a AS CHAR ARRAY) FROM t");
+        assertTrue(rs.next());
+        PhoenixArray arr = (PhoenixArray)rs.getArray(1);
+        String[] array2 = (String[])array.getArray();
+        String[] array3 = (String[])arr.getArray();
+        assertEquals(array2[0], array3[0]);
+        assertEquals(array2[1], array3[1]);
+        conn.close();
+    }
+
     @Test
     public void testFixedWidthCharArray() throws Exception {
         Connection conn;
@@ -563,7 +698,6 @@ public class ArrayIT extends BaseClientManagedTimeIT {
         assertEquals("a",rs.getString(1));
         assertEquals("2",rs.getString(2));
         conn.close();
-        
     }
  
 	@Test

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/36845bae/phoenix-core/src/main/antlr3/PhoenixSQL.g
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/antlr3/PhoenixSQL.g b/phoenix-core/src/main/antlr3/PhoenixSQL.g
index 40dcc87..3998ca2 100644
--- a/phoenix-core/src/main/antlr3/PhoenixSQL.g
+++ b/phoenix-core/src/main/antlr3/PhoenixSQL.g
@@ -778,7 +778,7 @@ term returns [ParseNode ret]
     			$ret = factory.rowValueConstructor(l);
     		}	 
     	}
-    |   CAST LPAREN e=expression AS dt=identifier RPAREN { $ret = factory.cast(e, dt); }
+    |   CAST LPAREN e=expression AS dt=identifier ar=(ARRAY | (LSQUARE RSQUARE))? RPAREN { $ret = ar==null ? factory.cast(e, dt) : factory.cast(e, dt, true); }
     |   (n=NEXT | CURRENT) VALUE FOR s=from_table_name { $ret = n==null ? factory.currentValueFor(s) : factory.nextValueFor(s);}    
     ;
 

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/36845bae/phoenix-core/src/main/java/org/apache/phoenix/compile/ExpressionCompiler.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/ExpressionCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/ExpressionCompiler.java
index c14e6a3..5506eb5 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/compile/ExpressionCompiler.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/ExpressionCompiler.java
@@ -513,7 +513,7 @@ public class ExpressionCompiler extends UnsupportedAllParseNodeVisitor<Expressio
                 expr =  CastParseNode.convertToRoundExpressionIfNeeded(fromDataType, targetDataType, children);
             }
         }
-        return wrapGroupByExpression(CoerceExpression.create(expr, targetDataType)); 
+        return CoerceExpression.create(expr, targetDataType, SortOrder.getDefault(), expr.getMaxLength());  
     }
     
    @Override

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/36845bae/phoenix-core/src/main/java/org/apache/phoenix/expression/CoerceExpression.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/expression/CoerceExpression.java b/phoenix-core/src/main/java/org/apache/phoenix/expression/CoerceExpression.java
index d991d63..99c1934 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/expression/CoerceExpression.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/expression/CoerceExpression.java
@@ -117,7 +117,8 @@ public class CoerceExpression extends BaseSingleExpression {
     @Override
     public boolean evaluate(Tuple tuple, ImmutableBytesWritable ptr) {
         if (getChild().evaluate(tuple, ptr)) {
-            getDataType().coerceBytes(ptr, getChild().getDataType(), getChild().getSortOrder(), getSortOrder());
+            getDataType().coerceBytes(ptr, getChild().getDataType(), getChild().getSortOrder(), getSortOrder(),
+                    getChild().getMaxLength());
             return true;
         }
         return false;

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/36845bae/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ArrayIndexFunction.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ArrayIndexFunction.java b/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ArrayIndexFunction.java
index b96b7b5..46b0eca 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ArrayIndexFunction.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ArrayIndexFunction.java
@@ -26,6 +26,7 @@ import org.apache.phoenix.parse.FunctionParseNode.BuiltInFunction;
 import org.apache.phoenix.parse.ParseException;
 import org.apache.phoenix.schema.PArrayDataType;
 import org.apache.phoenix.schema.PDataType;
+import org.apache.phoenix.schema.SortOrder;
 import org.apache.phoenix.schema.tuple.Tuple;
 
 @BuiltInFunction(name = ArrayIndexFunction.NAME, args = {
@@ -80,9 +81,15 @@ public class ArrayIndexFunction extends ScalarFunction {
 	public Integer getMaxLength() {
 	    return this.children.get(0).getMaxLength();
 	}
-		@Override
-	public String getName() {
-		return NAME;
-	}
+
+    @Override
+    public String getName() {
+        return NAME;
+    }
+    
+    @Override
+    public SortOrder getSortOrder() {
+        return this.children.get(0).getSortOrder();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/36845bae/phoenix-core/src/main/java/org/apache/phoenix/parse/CastParseNode.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/parse/CastParseNode.java b/phoenix-core/src/main/java/org/apache/phoenix/parse/CastParseNode.java
index 9bc2b41..e998422 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/parse/CastParseNode.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/parse/CastParseNode.java
@@ -40,14 +40,23 @@ public class CastParseNode extends UnaryParseNode {
 	
 	private final PDataType dt;
 	
-	CastParseNode(ParseNode expr, String dataType) {
+	CastParseNode(ParseNode expr, String dataType, boolean arr) {
 		super(expr);
-		dt = PDataType.fromSqlTypeName(SchemaUtil.normalizeIdentifier(dataType));
+		if(arr == true) {
+		    PDataType baseType = PDataType.fromSqlTypeName(SchemaUtil.normalizeIdentifier(dataType));
+		    dt = PDataType.fromTypeId(baseType.getSqlType() + PDataType.ARRAY_TYPE_BASE);
+		} else {
+		    dt = PDataType.fromSqlTypeName(SchemaUtil.normalizeIdentifier(dataType));
+		}
 	}
-	
-	CastParseNode(ParseNode expr, PDataType dataType) {
-		super(expr);
-		dt = dataType;
+
+	CastParseNode(ParseNode expr, PDataType dataType, boolean arr) {
+        super(expr);
+        if (arr == true) {
+            dt = PDataType.fromTypeId(dataType.getSqlType() + PDataType.ARRAY_TYPE_BASE);
+        } else {
+            dt = dataType;
+        }
 	}
 
 	@Override
@@ -62,7 +71,7 @@ public class CastParseNode extends UnaryParseNode {
 	public PDataType getDataType() {
 		return dt;
 	}
-	
+
 	public static Expression convertToRoundExpressionIfNeeded(PDataType fromDataType, PDataType targetDataType, List<Expression> expressions) throws SQLException {
 	    Expression firstChildExpr = expressions.get(0);
 	    if(fromDataType == targetDataType) {

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/36845bae/phoenix-core/src/main/java/org/apache/phoenix/parse/ParseNodeFactory.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/parse/ParseNodeFactory.java b/phoenix-core/src/main/java/org/apache/phoenix/parse/ParseNodeFactory.java
index 227d3d3..ce719f4 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/parse/ParseNodeFactory.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/parse/ParseNodeFactory.java
@@ -27,9 +27,6 @@ import java.util.Map;
 
 import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
 import org.apache.hadoop.hbase.util.Pair;
-
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Maps;
 import org.apache.phoenix.exception.UnknownFunctionException;
 import org.apache.phoenix.expression.Expression;
 import org.apache.phoenix.expression.ExpressionType;
@@ -42,13 +39,16 @@ import org.apache.phoenix.expression.function.FunctionExpression;
 import org.apache.phoenix.parse.FunctionParseNode.BuiltInFunction;
 import org.apache.phoenix.parse.FunctionParseNode.BuiltInFunctionInfo;
 import org.apache.phoenix.parse.JoinTableNode.JoinType;
-import org.apache.phoenix.schema.SortOrder;
 import org.apache.phoenix.schema.PDataType;
 import org.apache.phoenix.schema.PIndexState;
 import org.apache.phoenix.schema.PTableType;
+import org.apache.phoenix.schema.SortOrder;
 import org.apache.phoenix.schema.TypeMismatchException;
 import org.apache.phoenix.util.SchemaUtil;
 
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Maps;
+
 
 /**
  *
@@ -413,13 +413,21 @@ public class ParseNodeFactory {
     public LiteralParseNode literal(Object value) {
         return new LiteralParseNode(value);
     }
-    
+
     public CastParseNode cast(ParseNode expression, String dataType) {
-    	return new CastParseNode(expression, dataType);
+        return new CastParseNode(expression, dataType, false);
     }
-    
+
     public CastParseNode cast(ParseNode expression, PDataType dataType) {
-    	return new CastParseNode(expression, dataType);
+        return new CastParseNode(expression, dataType, false);
+    }
+
+    public CastParseNode cast(ParseNode expression, PDataType dataType, boolean arr) {
+        return new CastParseNode(expression, dataType, arr);
+    }
+
+    public CastParseNode cast(ParseNode expression, String dataType, boolean arr) {
+        return new CastParseNode(expression, dataType, arr);
     }
     
     public ParseNode rowValueConstructor(List<ParseNode> l) {

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/36845bae/phoenix-core/src/main/java/org/apache/phoenix/schema/PArrayDataType.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/PArrayDataType.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/PArrayDataType.java
index 89cd074..3d1fce8 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/schema/PArrayDataType.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/PArrayDataType.java
@@ -26,7 +26,6 @@ import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.Pair;
 import org.apache.phoenix.query.QueryConstants;
 import org.apache.phoenix.util.ByteUtil;
-import org.apache.phoenix.util.StringUtil;
 import org.apache.phoenix.util.TrustedByteArrayOutputStream;
 
 import com.google.common.base.Objects;
@@ -48,7 +47,7 @@ public class PArrayDataType {
 	public PArrayDataType() {
 	}
 
-	public byte[] toBytes(Object object, PDataType baseType) {
+	public byte[] toBytes(Object object, PDataType baseType, SortOrder sortOrder) {
 		if(object == null) {
 			throw new ConstraintViolationException(this + " may not be null");
 		}
@@ -75,7 +74,8 @@ public class PArrayDataType {
 		    byteStream = new TrustedByteArrayOutputStream(size);
 		}
 		DataOutputStream oStream = new DataOutputStream(byteStream);
-		return createArrayBytes(byteStream, oStream, (PhoenixArray)object, noOfElements, baseType, 0);
+		// Handles bit inversion also
+		return createArrayBytes(byteStream, oStream, (PhoenixArray)object, noOfElements, baseType, sortOrder);
 	}
 	
     public static int serializeNulls(DataOutputStream oStream, int nulls) throws IOException {
@@ -210,37 +210,45 @@ public class PArrayDataType {
 		return true;
 	}
 	
-	public void coerceBytes(ImmutableBytesWritable ptr, Object value, PDataType actualType, Integer maxLength, Integer scale,
-            Integer desiredMaxLength, Integer desiredScale, PDataType desiredType) {
-	    if (ptr.getLength() == 0 || value == null) {
-	        return;
-	    }
-	    if (Objects.equal(maxLength, desiredMaxLength)) {
-	        return;
-	    }
-	    // TODO: handle bit inversion
-	    // TODO: handle coerce between different types
-	    // TODO: validate that maxLength and desiredMaxLength come through as expected
-	    // TODO: handle when value == null correct, as you may need to re-write due to coercian to different type
-	    // or bit inversion
-	    //FIXME: don't write number of elements in the case of fixed width arrays as it will mess up sort order
-	    PhoenixArray pArr = (PhoenixArray) value;
-	    pArr = new PhoenixArray(pArr, desiredMaxLength);
-        PDataType baseType = PDataType.fromTypeId(actualType.getSqlType()
-                - PDataType.ARRAY_TYPE_BASE);
-	    ptr.set(toBytes(pArr, baseType));
-	}
+    public void coerceBytes(ImmutableBytesWritable ptr, Object value, PDataType actualType, Integer maxLength,
+            Integer scale, Integer desiredMaxLength, Integer desiredScale, PDataType desiredType,
+            SortOrder actualModifer, SortOrder expectedModifier) {
+        if (ptr.getLength() == 0) { // a zero length ptr means null which will not be coerced to anything different
+            return;
+        }
+        PDataType baseType = PDataType.fromTypeId(actualType.getSqlType() - PDataType.ARRAY_TYPE_BASE);
+        PDataType desiredBaseType = PDataType.fromTypeId(desiredType.getSqlType() - PDataType.ARRAY_TYPE_BASE);
+        if ((Objects.equal(maxLength, desiredMaxLength) || maxLength == null || desiredMaxLength == null)
+                && actualType.isBytesComparableWith(desiredType)
+                && baseType.isFixedWidth() == desiredBaseType.isFixedWidth() && actualModifer == expectedModifier) { 
+            return; 
+        }
+        if (value == null && actualType != desiredType) {
+            value = toObject(ptr.get(), ptr.getOffset(), ptr.getLength(), baseType, actualModifer, maxLength,
+                    desiredScale, desiredBaseType);
+            PhoenixArray pArr = (PhoenixArray)value;
+            // VARCHAR <=> CHAR
+            if(baseType.isFixedWidth() != desiredBaseType.isFixedWidth()) {
+                pArr = new PhoenixArray(pArr, desiredMaxLength);
+            }
+            baseType = desiredBaseType;
+            ptr.set(toBytes(pArr, baseType, expectedModifier));
+        } else {
+            PhoenixArray pArr = (PhoenixArray)value;
+            pArr = new PhoenixArray(pArr, desiredMaxLength);
+            ptr.set(toBytes(pArr, baseType, expectedModifier));
+        }
+    }
 
 
     public Object toObject(String value) {
-		// TODO: Do this as done in CSVLoader
 		throw new IllegalArgumentException("This operation is not suppported");
 	}
 
 	public Object toObject(byte[] bytes, int offset, int length, PDataType baseType, 
-			SortOrder sortOrder, Integer maxLength, Integer scale) {
+			SortOrder sortOrder, Integer maxLength, Integer scale, PDataType desiredDataType) {
 		return createPhoenixArray(bytes, offset, length, sortOrder,
-				baseType, maxLength);
+				baseType, maxLength, desiredDataType);
 	}
 
     public static void positionAtArrayElement(ImmutableBytesWritable ptr, int arrayIndex, PDataType baseDataType,
@@ -325,18 +333,19 @@ public class PArrayDataType {
 	}
 	
 	/**
-	 * ser
+	 * creates array bytes
 	 * @param byteStream
 	 * @param oStream
 	 * @param array
 	 * @param noOfElements
 	 * @param baseType
+	 * @param sortOrder 
 	 * @param maxLength 
 	 * @param capacity
 	 * @return
 	 */
     private byte[] createArrayBytes(TrustedByteArrayOutputStream byteStream, DataOutputStream oStream,
-            PhoenixArray array, int noOfElements, PDataType baseType, Integer maxLength) {
+            PhoenixArray array, int noOfElements, PDataType baseType, SortOrder sortOrder) {
         try {
             if (!baseType.isFixedWidth()) {
                 int[] offsetPos = new int[noOfElements];
@@ -349,6 +358,9 @@ public class PArrayDataType {
                     } else {
                         nulls = serializeNulls(oStream, nulls);
                         offsetPos[i] = byteStream.size();
+                        if (sortOrder == SortOrder.DESC) {
+                            SortOrder.invert(bytes, 0, bytes, 0, bytes.length);
+                        }
                         oStream.write(bytes, 0, bytes.length);
                         oStream.write(QueryConstants.SEPARATOR_BYTE);
                     }
@@ -362,15 +374,10 @@ public class PArrayDataType {
                 for (int i = 0; i < noOfElements; i++) {
                     byte[] bytes = array.toBytes(i);
                     int length = bytes.length;
-                    if(baseType == PDataType.CHAR) {
-                        oStream.write(bytes, 0, length);
-                        while(length <=  maxLength) {
-                            oStream.writeByte(StringUtil.SPACE_UTF8);
-                            length++;
-                        }
-                    } else {
-                        oStream.write(bytes, 0, length);
+                    if (sortOrder == SortOrder.DESC) {
+                        SortOrder.invert(bytes, 0, bytes, 0, bytes.length);
                     }
+                    oStream.write(bytes, 0, length);
                 }
             }
             ImmutableBytesWritable ptr = new ImmutableBytesWritable();
@@ -448,7 +455,8 @@ public class PArrayDataType {
     // a null null null b c null d would be
     // 65 0 0 3 66 0 67 0 0 1 68 0 0 0
 	// Follow the above example to understand how this works
-    private Object createPhoenixArray(byte[] bytes, int offset, int length, SortOrder sortOrder, PDataType baseDataType, Integer maxLength) {
+    private Object createPhoenixArray(byte[] bytes, int offset, int length, SortOrder sortOrder,
+            PDataType baseDataType, Integer maxLength, PDataType desiredDataType) {
         if (bytes == null || bytes.length == 0) { return null; }
         Object[] elements;
         if (!baseDataType.isFixedWidth()) {
@@ -463,7 +471,11 @@ public class PArrayDataType {
                 baseSize = Bytes.SIZEOF_INT;
                 useShort = false;
             }
-            elements = (Object[])java.lang.reflect.Array.newInstance(baseDataType.getJavaClass(), noOfElements);
+            if (baseDataType == desiredDataType) {
+                elements = (Object[])java.lang.reflect.Array.newInstance(baseDataType.getJavaClass(), noOfElements);
+            } else {
+                elements = (Object[])java.lang.reflect.Array.newInstance(desiredDataType.getJavaClass(), noOfElements);
+            }
             buffer.position(buffer.limit() - (Bytes.SIZEOF_BYTE + (2 * Bytes.SIZEOF_INT)));
             int indexOffset = buffer.getInt();
             buffer.position(initPos);
@@ -505,20 +517,36 @@ public class PArrayDataType {
                     // Subtract the seperator from the element length
                     byte[] val = new byte[elementLength - 1];
                     buffer.get(val);
-                    elements[i++] = baseDataType.toObject(val, sortOrder);
+                    if (baseDataType == desiredDataType) {
+                        elements[i++] = baseDataType.toObject(val, sortOrder);
+                    } else {
+                        elements[i++] = desiredDataType.toObject(val, sortOrder, baseDataType);
+                    }
                 }
             }
         } else {
             int elemLength = (maxLength == null ? baseDataType.getByteSize() : maxLength);
             int noOfElements = length / elemLength;
-            elements = (Object[])java.lang.reflect.Array.newInstance(baseDataType.getJavaClass(), noOfElements);
+            if (baseDataType == desiredDataType) {
+                elements = (Object[])java.lang.reflect.Array.newInstance(baseDataType.getJavaClass(), noOfElements);
+            } else {
+                elements = (Object[])java.lang.reflect.Array.newInstance(desiredDataType.getJavaClass(), noOfElements);
+            }
             ImmutableBytesWritable ptr = new ImmutableBytesWritable();
             for (int i = 0; i < noOfElements; i++) {
                 ptr.set(bytes, offset + i * elemLength, elemLength);
-                elements[i] = baseDataType.toObject(ptr, sortOrder);
+                if (baseDataType == desiredDataType) {
+                    elements[i] = baseDataType.toObject(ptr, sortOrder);
+                } else {
+                    elements[i] = desiredDataType.toObject(ptr, baseDataType, sortOrder);
+                }
             }
         }
-        return PArrayDataType.instantiatePhoenixArray(baseDataType, elements);
+        if(baseDataType == desiredDataType) {
+            return PArrayDataType.instantiatePhoenixArray(baseDataType, elements);
+        } else {
+            return PArrayDataType.instantiatePhoenixArray(desiredDataType, elements);
+        }
     }
 	
     public static PhoenixArray instantiatePhoenixArray(PDataType actualType, Object[] elements) {

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/36845bae/phoenix-core/src/main/java/org/apache/phoenix/schema/PDataType.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/PDataType.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/PDataType.java
index 07df438..34166d3 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/schema/PDataType.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/PDataType.java
@@ -3246,10 +3246,15 @@ public enum PDataType {
 			return null;
 		}
 
-		@Override
-		public byte[] toBytes(Object object) {
-			return pDataTypeForArray.toBytes(object, PDataType.INTEGER);
-		}
+        @Override
+        public byte[] toBytes(Object object) {
+            return toBytes(object, SortOrder.ASC);
+        }
+
+        @Override
+        public byte[] toBytes(Object object, SortOrder sortOrder) {
+            return pDataTypeForArray.toBytes(object, PDataType.INTEGER, sortOrder);
+        }
 
 		@Override
 		public int toBytes(Object object, byte[] bytes, int offset) {
@@ -3269,14 +3274,22 @@ public enum PDataType {
 		@Override
 		public Object toObject(byte[] bytes, int offset, int length,
 				PDataType actualType, SortOrder sortOrder, Integer maxLength, Integer scale) {
-
-			return pDataTypeForArray.toObject(bytes, offset, length, PDataType.INTEGER, sortOrder, maxLength, scale);
+            return pDataTypeForArray.toObject(bytes, offset, length, PDataType.INTEGER, sortOrder, maxLength, scale,
+                    PDataType.INTEGER);
 		}
 		
 		@Override
 		public boolean isCoercibleTo(PDataType targetType) {
 			return pDataTypeForArray.isCoercibleTo(targetType, PDataType.INTEGER_ARRAY);
 		}
+
+        @Override
+        public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength,
+                Integer scale, SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale,
+                SortOrder desiredModifier) {
+            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength, desiredScale,
+                    this, actualModifer, desiredModifier);
+        }
 		
 		@Override
 		public boolean isCoercibleTo(PDataType targetType, Object value) {
@@ -3316,10 +3329,15 @@ public enum PDataType {
 			return null;
 		}
 
-		@Override
-		public byte[] toBytes(Object object) {
-			return pDataTypeForArray.toBytes(object, PDataType.BOOLEAN);
-		}
+        @Override
+        public byte[] toBytes(Object object) {
+            return toBytes(object, SortOrder.ASC);
+        }
+
+        @Override
+        public byte[] toBytes(Object object, SortOrder sortOrder) {
+            return pDataTypeForArray.toBytes(object, PDataType.BOOLEAN, sortOrder);
+        }
 
 		@Override
 		public int toBytes(Object object, byte[] bytes, int offset) {
@@ -3339,8 +3357,8 @@ public enum PDataType {
 		@Override
 		public Object toObject(byte[] bytes, int offset, int length,
 				PDataType actualType, SortOrder sortOrder, Integer maxLength, Integer scale) {
-
-			return pDataTypeForArray.toObject(bytes, offset, length, PDataType.BOOLEAN, sortOrder, maxLength, scale);
+            return pDataTypeForArray.toObject(bytes, offset, length, PDataType.BOOLEAN, sortOrder, maxLength, scale,
+                    PDataType.BOOLEAN);
 		}
 		
 		@Override
@@ -3366,6 +3384,14 @@ public enum PDataType {
             return Types.ARRAY;
         }
 		
+        @Override
+        public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength,
+                Integer scale, SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale,
+                SortOrder desiredModifier) {
+            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength, desiredScale,
+                    this, actualModifer, desiredModifier);
+        }
+		
 	},
 	VARCHAR_ARRAY("VARCHAR_ARRAY", PDataType.ARRAY_TYPE_BASE + PDataType.VARCHAR.getSqlType(), PhoenixArray.class, null) {
 		@Override
@@ -3386,10 +3412,15 @@ public enum PDataType {
 			return null;
 		}
 
-		@Override
-		public byte[] toBytes(Object object) {
-			return pDataTypeForArray.toBytes(object, PDataType.VARCHAR);
-		}
+        @Override
+        public byte[] toBytes(Object object) {
+            return toBytes(object, SortOrder.ASC);
+        }
+
+        @Override
+        public byte[] toBytes(Object object, SortOrder sortOrder) {
+            return pDataTypeForArray.toBytes(object, PDataType.VARCHAR, sortOrder);
+        }
 
 		@Override
 		public int toBytes(Object object, byte[] bytes, int offset) {
@@ -3409,8 +3440,8 @@ public enum PDataType {
 		@Override
 		public Object toObject(byte[] bytes, int offset, int length,
 				PDataType actualType, SortOrder sortOrder, Integer maxLength, Integer scale) {
-
-			return pDataTypeForArray.toObject(bytes, offset, length, PDataType.VARCHAR, sortOrder, maxLength, scale);
+            return pDataTypeForArray.toObject(bytes, offset, length, PDataType.VARCHAR, sortOrder, maxLength, scale,
+                    PDataType.VARCHAR);
 		}
 		
 		@Override
@@ -3438,10 +3469,11 @@ public enum PDataType {
         }
 
         @Override
-        public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength, Integer scale,
-                SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale, SortOrder desiredModifier) {
-            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength,
-                    desiredScale, this);
+        public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength,
+                Integer scale, SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale,
+                SortOrder desiredModifier) {
+            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength, desiredScale,
+                    this, actualModifer, desiredModifier);
         }
 
         @Override
@@ -3469,10 +3501,15 @@ public enum PDataType {
 			return null;
 		}
 
-		@Override
-		public byte[] toBytes(Object object) {
-			return pDataTypeForArray.toBytes(object, PDataType.VARBINARY);
-		}
+        @Override
+        public byte[] toBytes(Object object) {
+            return toBytes(object, SortOrder.ASC);
+        }
+
+        @Override
+        public byte[] toBytes(Object object, SortOrder sortOrder) {
+            return pDataTypeForArray.toBytes(object, PDataType.VARBINARY, sortOrder);
+        }
 
 		@Override
 		public int toBytes(Object object, byte[] bytes, int offset) {
@@ -3492,8 +3529,8 @@ public enum PDataType {
 		@Override
 		public Object toObject(byte[] bytes, int offset, int length,
 				PDataType actualType, SortOrder sortOrder, Integer maxLength, Integer scale) {
-
-			return pDataTypeForArray.toObject(bytes, offset, length, PDataType.VARBINARY, sortOrder, maxLength, scale);
+            return pDataTypeForArray.toObject(bytes, offset, length, PDataType.VARBINARY, sortOrder, maxLength, scale,
+                    PDataType.VARBINARY);
 		}
 		
 		@Override
@@ -3522,10 +3559,11 @@ public enum PDataType {
 		}
 
         @Override
-        public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength, Integer scale,
-                SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale, SortOrder desiredModifier) {
-            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength,
-                    desiredScale, this);
+        public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength,
+                Integer scale, SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale,
+                SortOrder desiredModifier) {
+            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength, desiredScale,
+                    this, actualModifer, desiredModifier);
         }
 
         @Override
@@ -3552,10 +3590,15 @@ public enum PDataType {
 			return null;
 		}
 
-		@Override
-		public byte[] toBytes(Object object) {
-			return pDataTypeForArray.toBytes(object, PDataType.BINARY);
-		}
+        @Override
+        public byte[] toBytes(Object object) {
+            return toBytes(object, SortOrder.ASC);
+        }
+
+        @Override
+        public byte[] toBytes(Object object, SortOrder sortOrder) {
+            return pDataTypeForArray.toBytes(object, PDataType.BINARY, sortOrder);
+        }
 
 		@Override
 		public int toBytes(Object object, byte[] bytes, int offset) {
@@ -3575,8 +3618,8 @@ public enum PDataType {
 		@Override
 		public Object toObject(byte[] bytes, int offset, int length,
 				PDataType actualType, SortOrder sortOrder, Integer maxLength, Integer scale) {
-
-			return pDataTypeForArray.toObject(bytes, offset, length, PDataType.BINARY, sortOrder, maxLength, scale);
+            return pDataTypeForArray.toObject(bytes, offset, length, PDataType.BINARY, sortOrder, maxLength, scale,
+                    PDataType.BINARY);
 		}
 		
 		@Override
@@ -3605,10 +3648,11 @@ public enum PDataType {
 		}
 	
         @Override
-        public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength, Integer scale,
-                SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale, SortOrder desiredModifier) {
-            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength,
-                    desiredScale, this);
+        public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength,
+                Integer scale, SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale,
+                SortOrder desiredModifier) {
+            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength, desiredScale,
+                    this, actualModifer, desiredModifier);
         }
 
         @Override
@@ -3636,10 +3680,15 @@ public enum PDataType {
 			return null;
 		}
 
-		@Override
-		public byte[] toBytes(Object object) {
-			return pDataTypeForArray.toBytes(object, PDataType.CHAR);
-		}
+        @Override
+        public byte[] toBytes(Object object) {
+            return toBytes(object, SortOrder.ASC);
+        }
+
+        @Override
+        public byte[] toBytes(Object object, SortOrder sortOrder) {
+            return pDataTypeForArray.toBytes(object, PDataType.CHAR, sortOrder);
+        }
 
 		@Override
 		public int toBytes(Object object, byte[] bytes, int offset) {
@@ -3659,8 +3708,8 @@ public enum PDataType {
 		@Override
 		public Object toObject(byte[] bytes, int offset, int length,
 				PDataType actualType, SortOrder sortOrder, Integer maxLength, Integer scale) {
-
-			return pDataTypeForArray.toObject(bytes, offset, length, PDataType.CHAR, sortOrder, maxLength, scale);
+            return pDataTypeForArray.toObject(bytes, offset, length, PDataType.CHAR, sortOrder, maxLength, scale,
+                    PDataType.CHAR);
 		}
 		
 		@Override
@@ -3691,7 +3740,8 @@ public enum PDataType {
 		@Override
 		public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength, Integer scale,
 		        SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale, SortOrder desiredModifier) {
-		    pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength, desiredScale, this);
+            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength, desiredScale,
+                    this, actualModifer, desiredModifier);
 		}
 
         @Override
@@ -3719,10 +3769,15 @@ public enum PDataType {
 			return null;
 		}
 
-		@Override
-		public byte[] toBytes(Object object) {
-			return pDataTypeForArray.toBytes(object, PDataType.LONG);
-		}
+        @Override
+        public byte[] toBytes(Object object) {
+            return toBytes(object, SortOrder.ASC);
+        }
+
+        @Override
+        public byte[] toBytes(Object object, SortOrder sortOrder) {
+            return pDataTypeForArray.toBytes(object, PDataType.LONG, sortOrder);
+        }
 
 		@Override
 		public int toBytes(Object object, byte[] bytes, int offset) {
@@ -3742,8 +3797,8 @@ public enum PDataType {
 		@Override
 		public Object toObject(byte[] bytes, int offset, int length,
 				PDataType actualType, SortOrder sortOrder, Integer maxLength, Integer scale) {
-
-			return pDataTypeForArray.toObject(bytes, offset, length, PDataType.LONG, sortOrder, maxLength, scale);
+            return pDataTypeForArray.toObject(bytes, offset, length, PDataType.LONG, sortOrder, maxLength, scale,
+                    PDataType.LONG);
 		}
 		
 		@Override
@@ -3768,6 +3823,14 @@ public enum PDataType {
             return Types.ARRAY;
         }
 		
+        @Override
+        public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength,
+                Integer scale, SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale,
+                SortOrder desiredModifier) {
+            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength, desiredScale,
+                    this, actualModifer, desiredModifier);
+        }
+		
 	},
 	SMALLINT_ARRAY("SMALLINT_ARRAY", PDataType.ARRAY_TYPE_BASE + PDataType.SMALLINT.getSqlType(), PhoenixArray.class, null) {
 		@Override
@@ -3788,10 +3851,15 @@ public enum PDataType {
 			return null;
 		}
 
-		@Override
-		public byte[] toBytes(Object object) {
-			return pDataTypeForArray.toBytes(object, PDataType.SMALLINT);
-		}
+        @Override
+        public byte[] toBytes(Object object) {
+            return toBytes(object, SortOrder.ASC);
+        }
+
+        @Override
+        public byte[] toBytes(Object object, SortOrder sortOrder) {
+            return pDataTypeForArray.toBytes(object, PDataType.SMALLINT, sortOrder);
+        }
 
 		@Override
 		public int toBytes(Object object, byte[] bytes, int offset) {
@@ -3811,8 +3879,8 @@ public enum PDataType {
 		@Override
 		public Object toObject(byte[] bytes, int offset, int length,
 				PDataType actualType, SortOrder sortOrder, Integer maxLength, Integer scale) {
-
-			return pDataTypeForArray.toObject(bytes, offset, length, PDataType.SMALLINT, sortOrder, maxLength, scale);
+            return pDataTypeForArray.toObject(bytes, offset, length, PDataType.SMALLINT, sortOrder, maxLength, scale,
+                    PDataType.SMALLINT);
 		}
 		
 		@Override
@@ -3837,6 +3905,14 @@ public enum PDataType {
             return Types.ARRAY;
         }
 		
+        @Override
+        public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength,
+                Integer scale, SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale,
+                SortOrder desiredModifier) {
+            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength, desiredScale,
+                    this, actualModifer, desiredModifier);
+        }
+		
 	},
 	TINYINT_ARRAY("TINYINT_ARRAY", PDataType.ARRAY_TYPE_BASE + PDataType.TINYINT.getSqlType(), PhoenixArray.class, null) {
 		@Override
@@ -3857,10 +3933,15 @@ public enum PDataType {
 			return null;
 		}
 
-		@Override
-		public byte[] toBytes(Object object) {
-			return pDataTypeForArray.toBytes(object, PDataType.TINYINT);
-		}
+        @Override
+        public byte[] toBytes(Object object) {
+            return toBytes(object, SortOrder.ASC);
+        }
+
+        @Override
+        public byte[] toBytes(Object object, SortOrder sortOrder) {
+            return pDataTypeForArray.toBytes(object, PDataType.TINYINT, sortOrder);
+        }
 
 		@Override
 		public int toBytes(Object object, byte[] bytes, int offset) {
@@ -3880,14 +3961,22 @@ public enum PDataType {
 		@Override
 		public Object toObject(byte[] bytes, int offset, int length,
 				PDataType actualType, SortOrder sortOrder, Integer maxLength, Integer scale) {
-
-			return pDataTypeForArray.toObject(bytes, offset, length, PDataType.TINYINT, sortOrder, maxLength, scale);
+            return pDataTypeForArray.toObject(bytes, offset, length, PDataType.TINYINT, sortOrder, maxLength, scale,
+                    PDataType.TINYINT);
 		}
 		
 		@Override
         public boolean isCoercibleTo(PDataType targetType) {
             return pDataTypeForArray.isCoercibleTo(targetType, PDataType.TINYINT_ARRAY);
         }
+
+        @Override
+        public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength,
+                Integer scale, SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale,
+                SortOrder desiredModifier) {
+            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength, desiredScale,
+                    this, actualModifer, desiredModifier);
+        }
 		
 		@Override
         public boolean isCoercibleTo(PDataType targetType, Object value) {
@@ -3927,10 +4016,15 @@ public enum PDataType {
 			return null;
 		}
 
-		@Override
-		public byte[] toBytes(Object object) {
-			return pDataTypeForArray.toBytes(object, PDataType.FLOAT);
-		}
+        @Override
+        public byte[] toBytes(Object object) {
+            return toBytes(object, SortOrder.ASC);
+        }
+
+        @Override
+        public byte[] toBytes(Object object, SortOrder sortOrder) {
+            return pDataTypeForArray.toBytes(object, PDataType.FLOAT, sortOrder);
+        }
 
 		@Override
 		public int toBytes(Object object, byte[] bytes, int offset) {
@@ -3950,8 +4044,8 @@ public enum PDataType {
 		@Override
 		public Object toObject(byte[] bytes, int offset, int length,
 				PDataType actualType, SortOrder sortOrder, Integer maxLength, Integer scale) {
-
-			return pDataTypeForArray.toObject(bytes, offset, length, PDataType.FLOAT, sortOrder, maxLength, scale);
+            return pDataTypeForArray.toObject(bytes, offset, length, PDataType.FLOAT, sortOrder, maxLength, scale,
+                    PDataType.FLOAT);
 		}
 	
 		@Override
@@ -3976,6 +4070,14 @@ public enum PDataType {
             return Types.ARRAY;
         }
 		
+        @Override
+        public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength,
+                Integer scale, SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale,
+                SortOrder desiredModifier) {
+            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength, desiredScale,
+                    this, actualModifer, desiredModifier);
+        }
+		
 	},
 	DOUBLE_ARRAY("DOUBLE_ARRAY", PDataType.ARRAY_TYPE_BASE + PDataType.DOUBLE.getSqlType(), PhoenixArray.class, null) {
 	    final PArrayDataType pDataTypeForArray = new PArrayDataType();
@@ -3997,10 +4099,15 @@ public enum PDataType {
 			return null;
 		}
 
-		@Override
-		public byte[] toBytes(Object object) {
-			return pDataTypeForArray.toBytes(object, PDataType.DOUBLE);
-		}
+        @Override
+        public byte[] toBytes(Object object) {
+            return toBytes(object, SortOrder.ASC);
+        }
+
+        @Override
+        public byte[] toBytes(Object object, SortOrder sortOrder) {
+            return pDataTypeForArray.toBytes(object, PDataType.DOUBLE, sortOrder);
+        }
 
 		@Override
 		public int toBytes(Object object, byte[] bytes, int offset) {
@@ -4020,8 +4127,8 @@ public enum PDataType {
 		@Override
 		public Object toObject(byte[] bytes, int offset, int length,
 				PDataType actualType, SortOrder sortOrder, Integer maxLength, Integer scale) {
-
-			return pDataTypeForArray.toObject(bytes, offset, length, PDataType.DOUBLE, sortOrder, maxLength, scale);
+            return pDataTypeForArray.toObject(bytes, offset, length, PDataType.DOUBLE, sortOrder, maxLength, scale,
+                    PDataType.DOUBLE);
 		}
 		
 		@Override
@@ -4040,6 +4147,14 @@ public enum PDataType {
            }
            return true;
         }
+		
+        @Override
+        public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength,
+                Integer scale, SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale,
+                SortOrder desiredModifier) {
+            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength, desiredScale,
+                    this, actualModifer, desiredModifier);
+        }
 
         @Override
         public int getResultSetSqlType() {
@@ -4067,10 +4182,15 @@ public enum PDataType {
 			return null;
 		}
 
-		@Override
-		public byte[] toBytes(Object object) {
-			return pDataTypeForArray.toBytes(object, PDataType.DECIMAL);
-		}
+        @Override
+        public byte[] toBytes(Object object) {
+            return toBytes(object, SortOrder.ASC);
+        }
+
+        @Override
+        public byte[] toBytes(Object object, SortOrder sortOrder) {
+            return pDataTypeForArray.toBytes(object, PDataType.DECIMAL, sortOrder);
+        }
 
 		@Override
 		public int toBytes(Object object, byte[] bytes, int offset) {
@@ -4090,9 +4210,17 @@ public enum PDataType {
 		@Override
 		public Object toObject(byte[] bytes, int offset, int length,
 				PDataType actualType, SortOrder sortOrder, Integer maxLength, Integer scale) {
-
-			return pDataTypeForArray.toObject(bytes, offset, length, PDataType.DECIMAL, sortOrder, maxLength, scale);
+            return pDataTypeForArray.toObject(bytes, offset, length, PDataType.DECIMAL, sortOrder, maxLength, scale,
+                    PDataType.DECIMAL);
 		}
+		
+        @Override
+        public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength,
+                Integer scale, SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale,
+                SortOrder desiredModifier) {
+            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength, desiredScale,
+                    this, actualModifer, desiredModifier);
+        }
 	
 		@Override
         public boolean isCoercibleTo(PDataType targetType) {
@@ -4145,10 +4273,15 @@ public enum PDataType {
 			return null;
 		}
 
-		@Override
-		public byte[] toBytes(Object object) {
-			return pDataTypeForArray.toBytes(object, PDataType.TIMESTAMP);
-		}
+        @Override
+        public byte[] toBytes(Object object) {
+            return toBytes(object, SortOrder.ASC);
+        }
+
+        @Override
+        public byte[] toBytes(Object object, SortOrder sortOrder) {
+            return pDataTypeForArray.toBytes(object, PDataType.TIMESTAMP, sortOrder);
+        }
 
 		@Override
 		public int toBytes(Object object, byte[] bytes, int offset) {
@@ -4168,8 +4301,8 @@ public enum PDataType {
 		@Override
 		public Object toObject(byte[] bytes, int offset, int length,
 				PDataType actualType, SortOrder sortOrder, Integer maxLength, Integer scale) {
-
-			return pDataTypeForArray.toObject(bytes, offset, length, PDataType.TIMESTAMP, sortOrder, maxLength, scale);
+            return pDataTypeForArray.toObject(bytes, offset, length, PDataType.TIMESTAMP, sortOrder, maxLength, scale,
+                    PDataType.TIMESTAMP);
 		}
 		
 		@Override
@@ -4194,6 +4327,14 @@ public enum PDataType {
             return Types.ARRAY;
         }
 
+        @Override
+        public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength,
+                Integer scale, SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale,
+                SortOrder desiredModifier) {
+            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength, desiredScale,
+                    this, actualModifer, desiredModifier);
+        }
+
 	},
 	UNSIGNED_TIMESTAMP_ARRAY("UNSIGNED_TIMESTAMP_ARRAY", PDataType.ARRAY_TYPE_BASE + PDataType.UNSIGNED_TIMESTAMP.getSqlType(), PhoenixArray.class,
 			null) {
@@ -4215,10 +4356,15 @@ public enum PDataType {
 			return null;
 		}
 
-		@Override
-		public byte[] toBytes(Object object) {
-			return pDataTypeForArray.toBytes(object, PDataType.UNSIGNED_TIMESTAMP);
-		}
+        @Override
+        public byte[] toBytes(Object object) {
+            return toBytes(object, SortOrder.ASC);
+        }
+
+        @Override
+        public byte[] toBytes(Object object, SortOrder sortOrder) {
+            return pDataTypeForArray.toBytes(object, PDataType.UNSIGNED_TIMESTAMP, sortOrder);
+        }
 
 		@Override
 		public int toBytes(Object object, byte[] bytes, int offset) {
@@ -4238,8 +4384,8 @@ public enum PDataType {
 		@Override
 		public Object toObject(byte[] bytes, int offset, int length,
 				PDataType actualType, SortOrder sortOrder, Integer maxLength, Integer scale) {
-
-			return pDataTypeForArray.toObject(bytes, offset, length, PDataType.UNSIGNED_TIMESTAMP, sortOrder, maxLength, scale);
+            return pDataTypeForArray.toObject(bytes, offset, length, PDataType.UNSIGNED_TIMESTAMP, sortOrder,
+                    maxLength, scale, PDataType.UNSIGNED_TIMESTAMP);
 		}
 		
 		@Override
@@ -4258,6 +4404,14 @@ public enum PDataType {
            }
            return true;
         }
+		
+        @Override
+        public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength,
+                Integer scale, SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale,
+                SortOrder desiredModifier) {
+            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength, desiredScale,
+                    this, actualModifer, desiredModifier);
+        }
 
         @Override
         public int getResultSetSqlType() {
@@ -4284,15 +4438,20 @@ public enum PDataType {
 			return null;
 		}
 
-		@Override
-		public byte[] toBytes(Object object) {
-			return pDataTypeForArray.toBytes(object, PDataType.TIME);
-		}
+        @Override
+        public byte[] toBytes(Object object) {
+            return toBytes(object, SortOrder.ASC);
+        }
 
-		@Override
-		public int toBytes(Object object, byte[] bytes, int offset) {
-			return pDataTypeForArray.toBytes(object, bytes, offset);
-		}
+        @Override
+        public byte[] toBytes(Object object, SortOrder sortOrder) {
+            return pDataTypeForArray.toBytes(object, PDataType.TIME, sortOrder);
+        }
+
+        @Override
+        public int toBytes(Object object, byte[] bytes, int offset) {
+            return pDataTypeForArray.toBytes(object, bytes, offset);
+        }
 
 		@Override
 		public Object toObject(String value) {
@@ -4307,8 +4466,8 @@ public enum PDataType {
 		@Override
 		public Object toObject(byte[] bytes, int offset, int length,
 				PDataType actualType, SortOrder sortOrder, Integer maxLength, Integer scale) {
-
-			return pDataTypeForArray.toObject(bytes, offset, length, PDataType.TIME, sortOrder, maxLength, scale);
+            return pDataTypeForArray.toObject(bytes, offset, length, PDataType.TIME, sortOrder, maxLength, scale,
+                    PDataType.TIME);
 		}
 		
 		@Override
@@ -4332,6 +4491,14 @@ public enum PDataType {
         public int getResultSetSqlType() {
             return Types.ARRAY;
         }
+        
+        @Override
+        public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength,
+                Integer scale, SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale,
+                SortOrder desiredModifier) {
+            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength, desiredScale,
+                    this, actualModifer, desiredModifier);
+        }
 
 	},
 	UNSIGNED_TIME_ARRAY("UNSIGNED_TIME_ARRAY", PDataType.ARRAY_TYPE_BASE + PDataType.UNSIGNED_TIME.getSqlType(), PhoenixArray.class, null) {
@@ -4353,10 +4520,15 @@ public enum PDataType {
 			return null;
 		}
 
-		@Override
-		public byte[] toBytes(Object object) {
-			return pDataTypeForArray.toBytes(object, PDataType.UNSIGNED_TIME);
-		}
+        @Override
+        public byte[] toBytes(Object object) {
+            return toBytes(object, SortOrder.ASC);
+        }
+
+        @Override
+        public byte[] toBytes(Object object, SortOrder sortOrder) {
+            return pDataTypeForArray.toBytes(object, PDataType.UNSIGNED_TIME, sortOrder);
+        }
 
 		@Override
 		public int toBytes(Object object, byte[] bytes, int offset) {
@@ -4376,8 +4548,8 @@ public enum PDataType {
 		@Override
 		public Object toObject(byte[] bytes, int offset, int length,
 				PDataType actualType, SortOrder sortOrder, Integer maxLength, Integer scale) {
-
-			return pDataTypeForArray.toObject(bytes, offset, length, PDataType.UNSIGNED_TIME, sortOrder, maxLength, scale);
+            return pDataTypeForArray.toObject(bytes, offset, length, PDataType.UNSIGNED_TIME, sortOrder, maxLength,
+                    scale, PDataType.UNSIGNED_TIME);
 		}
 		
 		@Override
@@ -4396,6 +4568,14 @@ public enum PDataType {
            }
            return true;
         }
+		
+        @Override
+        public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength,
+                Integer scale, SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale,
+                SortOrder desiredModifier) {
+            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength, desiredScale,
+                    this, actualModifer, desiredModifier);
+        }
 
         @Override
         public int getResultSetSqlType() {
@@ -4422,10 +4602,15 @@ public enum PDataType {
 			return null;
 		}
 
-		@Override
-		public byte[] toBytes(Object object) {
-			return pDataTypeForArray.toBytes(object, PDataType.DATE);
-		}
+        @Override
+        public byte[] toBytes(Object object) {
+            return toBytes(object, SortOrder.ASC);
+        }
+
+        @Override
+        public byte[] toBytes(Object object, SortOrder sortOrder) {
+            return pDataTypeForArray.toBytes(object, PDataType.DATE, sortOrder);
+        }
 
 		@Override
 		public int toBytes(Object object, byte[] bytes, int offset) {
@@ -4445,8 +4630,8 @@ public enum PDataType {
 		@Override
 		public Object toObject(byte[] bytes, int offset, int length,
 				PDataType actualType, SortOrder sortOrder, Integer maxLength, Integer scale) {
-
-			return pDataTypeForArray.toObject(bytes, offset, length, PDataType.DATE, sortOrder, maxLength, scale);
+            return pDataTypeForArray.toObject(bytes, offset, length, PDataType.DATE, sortOrder, maxLength, scale,
+                    PDataType.DATE);
 		}
 		
 		@Override
@@ -4471,6 +4656,14 @@ public enum PDataType {
             return Types.ARRAY;
         }
 
+        @Override
+        public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength,
+                Integer scale, SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale,
+                SortOrder desiredModifier) {
+            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength, desiredScale,
+                    this, actualModifer, desiredModifier);
+        }
+
 	},
 	UNSIGNED_DATE_ARRAY("UNSIGNED_DATE_ARRAY", PDataType.ARRAY_TYPE_BASE + PDataType.UNSIGNED_DATE.getSqlType(), PhoenixArray.class, null) {
 		@Override
@@ -4491,10 +4684,15 @@ public enum PDataType {
 			return null;
 		}
 
-		@Override
-		public byte[] toBytes(Object object) {
-			return pDataTypeForArray.toBytes(object, PDataType.UNSIGNED_DATE);
-		}
+        @Override
+        public byte[] toBytes(Object object) {
+            return toBytes(object, SortOrder.ASC);
+        }
+
+        @Override
+        public byte[] toBytes(Object object, SortOrder sortOrder) {
+            return pDataTypeForArray.toBytes(object, PDataType.UNSIGNED_DATE, sortOrder);
+        }
 
 		@Override
 		public int toBytes(Object object, byte[] bytes, int offset) {
@@ -4514,8 +4712,8 @@ public enum PDataType {
 		@Override
 		public Object toObject(byte[] bytes, int offset, int length,
 				PDataType actualType, SortOrder sortOrder, Integer maxLength, Integer scale) {
-
-			return pDataTypeForArray.toObject(bytes, offset, length, PDataType.UNSIGNED_DATE, sortOrder, maxLength, scale);
+            return pDataTypeForArray.toObject(bytes, offset, length, PDataType.UNSIGNED_DATE, sortOrder, maxLength,
+                    scale, PDataType.UNSIGNED_DATE);
 		}
 		
 		@Override
@@ -4540,6 +4738,14 @@ public enum PDataType {
             return Types.ARRAY;
         }
 
+        @Override
+        public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength,
+                Integer scale, SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale,
+                SortOrder desiredModifier) {
+            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength, desiredScale,
+                    this, actualModifer, desiredModifier);
+        }
+
 	},
 	UNSIGNED_LONG_ARRAY("UNSIGNED_LONG_ARRAY", PDataType.ARRAY_TYPE_BASE + PDataType.UNSIGNED_LONG.getSqlType(), PhoenixArray.class, null) {
 		@Override
@@ -4560,10 +4766,15 @@ public enum PDataType {
 			return null;
 		}
 
-		@Override
-		public byte[] toBytes(Object object) {
-			return pDataTypeForArray.toBytes(object, PDataType.UNSIGNED_LONG);
-		}
+        @Override
+        public byte[] toBytes(Object object) {
+            return toBytes(object, SortOrder.ASC);
+        }
+
+        @Override
+        public byte[] toBytes(Object object, SortOrder sortOrder) {
+            return pDataTypeForArray.toBytes(object, PDataType.UNSIGNED_LONG, sortOrder);
+        }
 
 		@Override
 		public int toBytes(Object object, byte[] bytes, int offset) {
@@ -4583,8 +4794,8 @@ public enum PDataType {
 		@Override
 		public Object toObject(byte[] bytes, int offset, int length,
 				PDataType actualType, SortOrder sortOrder, Integer maxLength, Integer scale) {
-
-			return pDataTypeForArray.toObject(bytes, offset, length, PDataType.UNSIGNED_LONG, sortOrder, maxLength, scale);
+            return pDataTypeForArray.toObject(bytes, offset, length, PDataType.UNSIGNED_LONG, sortOrder, maxLength,
+                    scale, PDataType.UNSIGNED_LONG);
 		}
 		
 		@Override
@@ -4608,6 +4819,14 @@ public enum PDataType {
         public int getResultSetSqlType() {
             return Types.ARRAY;
         }
+
+        @Override
+        public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength,
+                Integer scale, SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale,
+                SortOrder desiredModifier) {
+            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength, desiredScale,
+                    this, actualModifer, desiredModifier);
+        }
 	
 	},
 	UNSIGNED_INT_ARRAY("UNSIGNED_INT_ARRAY", PDataType.ARRAY_TYPE_BASE + PDataType.UNSIGNED_INT.getSqlType(), PhoenixArray.class, null) {
@@ -4629,10 +4848,15 @@ public enum PDataType {
 			return null;
 		}
 
-		@Override
-		public byte[] toBytes(Object object) {
-			return pDataTypeForArray.toBytes(object, PDataType.UNSIGNED_INT);
-		}
+        @Override
+        public byte[] toBytes(Object object) {
+            return toBytes(object, SortOrder.ASC);
+        }
+
+        @Override
+        public byte[] toBytes(Object object, SortOrder sortOrder) {
+            return pDataTypeForArray.toBytes(object, PDataType.UNSIGNED_INT, sortOrder);
+        }
 
 		@Override
 		public int toBytes(Object object, byte[] bytes, int offset) {
@@ -4652,8 +4876,8 @@ public enum PDataType {
 		@Override
 		public Object toObject(byte[] bytes, int offset, int length,
 				PDataType actualType, SortOrder sortOrder, Integer maxLength, Integer scale) {
-
-			return pDataTypeForArray.toObject(bytes, offset, length, PDataType.UNSIGNED_INT, sortOrder, maxLength, scale);
+            return pDataTypeForArray.toObject(bytes, offset, length, PDataType.UNSIGNED_INT, sortOrder, maxLength,
+                    scale, PDataType.UNSIGNED_INT);
 		}
 
 		@Override
@@ -4678,6 +4902,14 @@ public enum PDataType {
             return Types.ARRAY;
         }
 
+        @Override
+        public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength,
+                Integer scale, SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale,
+                SortOrder desiredModifier) {
+            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength, desiredScale,
+                    this, actualModifer, desiredModifier);
+        }
+
 	},
 	UNSIGNED_SMALLINT_ARRAY("UNSIGNED_SMALLINT_ARRAY", PDataType.ARRAY_TYPE_BASE + PDataType.UNSIGNED_SMALLINT.getSqlType(),
 			PhoenixArray.class, null) {
@@ -4699,10 +4931,15 @@ public enum PDataType {
 			return null;
 		}
 
-		@Override
-		public byte[] toBytes(Object object) {
-			return pDataTypeForArray.toBytes(object, PDataType.UNSIGNED_SMALLINT);
-		}
+        @Override
+        public byte[] toBytes(Object object) {
+            return toBytes(object, SortOrder.ASC);
+        }
+
+        @Override
+        public byte[] toBytes(Object object, SortOrder sortOrder) {
+            return pDataTypeForArray.toBytes(object, PDataType.UNSIGNED_SMALLINT, sortOrder);
+        }
 
 		@Override
 		public int toBytes(Object object, byte[] bytes, int offset) {
@@ -4722,8 +4959,8 @@ public enum PDataType {
 		@Override
 		public Object toObject(byte[] bytes, int offset, int length,
 				PDataType actualType, SortOrder sortOrder, Integer maxLength, Integer scale) {
-
-			return pDataTypeForArray.toObject(bytes, offset, length, PDataType.UNSIGNED_SMALLINT, sortOrder, maxLength, scale);
+            return pDataTypeForArray.toObject(bytes, offset, length, PDataType.UNSIGNED_SMALLINT, sortOrder, maxLength,
+                    scale, PDataType.UNSIGNED_SMALLINT);
 		}
 		
 		@Override
@@ -4748,6 +4985,14 @@ public enum PDataType {
             return Types.ARRAY;
         }
 
+        @Override
+        public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength,
+                Integer scale, SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale,
+                SortOrder desiredModifier) {
+            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength, desiredScale,
+                    this, actualModifer, desiredModifier);
+        }
+
 	},
 	UNSIGNED_TINYINT_ARRAY("UNSIGNED_TINYINT__ARRAY", PDataType.ARRAY_TYPE_BASE + PDataType.UNSIGNED_TINYINT.getSqlType(), PhoenixArray.class,
 			null) {
@@ -4769,10 +5014,15 @@ public enum PDataType {
 			return null;
 		}
 
-		@Override
-		public byte[] toBytes(Object object) {
-			return pDataTypeForArray.toBytes(object, PDataType.UNSIGNED_TINYINT);
-		}
+        @Override
+        public byte[] toBytes(Object object) {
+            return toBytes(object, SortOrder.ASC);
+        }
+
+        @Override
+        public byte[] toBytes(Object object, SortOrder sortOrder) {
+            return pDataTypeForArray.toBytes(object, PDataType.UNSIGNED_TINYINT, sortOrder);
+        }
 
 		@Override
 		public int toBytes(Object object, byte[] bytes, int offset) {
@@ -4792,8 +5042,8 @@ public enum PDataType {
 		@Override
 		public Object toObject(byte[] bytes, int offset, int length,
 				PDataType actualType, SortOrder sortOrder, Integer maxLength, Integer scale) {
-
-			return pDataTypeForArray.toObject(bytes, offset, length, PDataType.UNSIGNED_TINYINT, sortOrder, maxLength, scale);
+            return pDataTypeForArray.toObject(bytes, offset, length, PDataType.UNSIGNED_TINYINT, sortOrder, maxLength,
+                    scale, PDataType.UNSIGNED_TINYINT);
 		}
 		
 		@Override
@@ -4817,6 +5067,14 @@ public enum PDataType {
         public int getResultSetSqlType() {
             return Types.ARRAY;
         }
+
+        @Override
+        public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength,
+                Integer scale, SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale,
+                SortOrder desiredModifier) {
+            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength, desiredScale,
+                    this, actualModifer, desiredModifier);
+        }
 	},
 	UNSIGNED_FLOAT_ARRAY("UNSIGNED_FLOAT_ARRAY", PDataType.ARRAY_TYPE_BASE + PDataType.UNSIGNED_FLOAT.getSqlType(), PhoenixArray.class, null) {
 		@Override
@@ -4837,10 +5095,15 @@ public enum PDataType {
 			return null;
 		}
 
-		@Override
-		public byte[] toBytes(Object object) {
-			return pDataTypeForArray.toBytes(object, PDataType.UNSIGNED_FLOAT);
-		}
+        @Override
+        public byte[] toBytes(Object object) {
+            return toBytes(object, SortOrder.ASC);
+        }
+
+        @Override
+        public byte[] toBytes(Object object, SortOrder sortOrder) {
+            return pDataTypeForArray.toBytes(object, PDataType.UNSIGNED_FLOAT, sortOrder);
+        }
 
 		@Override
 		public int toBytes(Object object, byte[] bytes, int offset) {
@@ -4860,8 +5123,8 @@ public enum PDataType {
 		@Override
 		public Object toObject(byte[] bytes, int offset, int length,
 				PDataType actualType, SortOrder sortOrder, Integer maxLength, Integer scale) {
-
-			return pDataTypeForArray.toObject(bytes, offset, length, PDataType.UNSIGNED_FLOAT, sortOrder, maxLength, scale);
+            return pDataTypeForArray.toObject(bytes, offset, length, PDataType.UNSIGNED_FLOAT, sortOrder, maxLength,
+                    scale, PDataType.UNSIGNED_FLOAT);
 		}
 
 		@Override
@@ -4886,6 +5149,14 @@ public enum PDataType {
             return Types.ARRAY;
         }
 
+        @Override
+        public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength,
+                Integer scale, SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale,
+                SortOrder desiredModifier) {
+            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength, desiredScale,
+                    this, actualModifer, desiredModifier);
+        }
+
 	},
 	UNSIGNED_DOUBLE_ARRAY("UNSIGNED_DOUBLE__ARRAY", PDataType.ARRAY_TYPE_BASE + PDataType.UNSIGNED_DOUBLE.getSqlType(), PhoenixArray.class,
 			null) {
@@ -4907,10 +5178,15 @@ public enum PDataType {
 			return null;
 		}
 
-		@Override
-		public byte[] toBytes(Object object) {
-			return pDataTypeForArray.toBytes(object, PDataType.UNSIGNED_DOUBLE);
-		}
+        @Override
+        public byte[] toBytes(Object object) {
+            return toBytes(object, SortOrder.ASC);
+        }
+
+        @Override
+        public byte[] toBytes(Object object, SortOrder sortOrder) {
+            return pDataTypeForArray.toBytes(object, PDataType.UNSIGNED_DOUBLE, sortOrder);
+        }
 
 		@Override
 		public int toBytes(Object object, byte[] bytes, int offset) {
@@ -4930,14 +5206,22 @@ public enum PDataType {
 		@Override
 		public Object toObject(byte[] bytes, int offset, int length,
 				PDataType actualType, SortOrder sortOrder, Integer maxLength, Integer scale) {
-
-			return pDataTypeForArray.toObject(bytes, offset, length, PDataType.UNSIGNED_DOUBLE, sortOrder, maxLength, scale);
+            return pDataTypeForArray.toObject(bytes, offset, length, PDataType.UNSIGNED_DOUBLE, sortOrder, maxLength,
+                    scale, PDataType.UNSIGNED_DOUBLE);
 		}
 		
 		@Override
         public boolean isCoercibleTo(PDataType targetType) {
             return pDataTypeForArray.isCoercibleTo(targetType, PDataType.UNSIGNED_DOUBLE_ARRAY);
         }
+
+        @Override
+        public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType, Integer maxLength,
+                Integer scale, SortOrder actualModifer, Integer desiredMaxLength, Integer desiredScale,
+                SortOrder desiredModifier) {
+            pDataTypeForArray.coerceBytes(ptr, object, actualType, maxLength, scale, desiredMaxLength, desiredScale,
+                    this, actualModifer, desiredModifier);
+        }
 		
 		@Override
         public boolean isCoercibleTo(PDataType targetType, Object value) {
@@ -6500,6 +6784,11 @@ public enum PDataType {
         coerceBytes(ptr, null, actualType, null, null, actualModifier, null, null, expectedModifier);
     }
 
+    public final void coerceBytes(ImmutableBytesWritable ptr, PDataType actualType, SortOrder actualModifier,
+            SortOrder expectedModifier, Integer desiredMaxLength) {
+        coerceBytes(ptr, null, actualType, null, null, actualModifier, desiredMaxLength, null, expectedModifier);
+    }
+
     private static Void throwConstraintViolationException(PDataType source, PDataType target) {
         throw new ConstraintViolationException(source + " cannot be coerced to " + target);
     }
@@ -6600,6 +6889,10 @@ public enum PDataType {
         return toObject(bytes, 0, bytes.length, this, sortOrder);
     }
 
+    public final Object toObject(byte[] bytes, SortOrder sortOrder, PDataType actualType) {
+        return toObject(bytes, 0, bytes.length, actualType, sortOrder);
+    }
+
     private static final Map<String, PDataType> SQL_TYPE_NAME_TO_PCOLUMN_DATA_TYPE;
     static {
         ImmutableMap.Builder<String, PDataType> builder =