Repository: phoenix
Updated Branches:
  refs/heads/calcite 421ddc977 -> 700a94181


Fix data type adaptor in CalciteUtils


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

Branch: refs/heads/calcite
Commit: 700a94181308156c41d9c3aee49253b0c08b4a1a
Parents: 421ddc9
Author: maryannxue <[email protected]>
Authored: Wed Jun 1 16:06:55 2016 -0400
Committer: maryannxue <[email protected]>
Committed: Wed Jun 1 16:06:55 2016 -0400

----------------------------------------------------------------------
 .../apache/phoenix/calcite/CalciteUtils.java    | 33 ++++++++++++++------
 1 file changed, 23 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/700a9418/phoenix-core/src/main/java/org/apache/phoenix/calcite/CalciteUtils.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/calcite/CalciteUtils.java 
b/phoenix-core/src/main/java/org/apache/phoenix/calcite/CalciteUtils.java
index ce5a718..252f44e 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/CalciteUtils.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/CalciteUtils.java
@@ -16,6 +16,7 @@ import org.apache.calcite.rel.RelFieldCollation.Direction;
 import org.apache.calcite.rel.RelFieldCollation.NullDirection;
 import org.apache.calcite.rel.core.JoinRelType;
 import org.apache.calcite.rel.core.Project;
+import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rex.RexCall;
 import org.apache.calcite.rex.RexCorrelVariable;
 import org.apache.calcite.rex.RexDynamicParam;
@@ -30,6 +31,7 @@ import org.apache.calcite.sql.SqlFunction;
 import org.apache.calcite.sql.SqlKind;
 import org.apache.calcite.sql.SqlOperator;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
+import org.apache.calcite.sql.type.ArraySqlType;
 import org.apache.calcite.sql.type.SqlTypeName;
 import org.apache.calcite.util.NlsString;
 import org.apache.calcite.util.Util;
@@ -120,8 +122,19 @@ public class CalciteUtils {
     }
     
     @SuppressWarnings("rawtypes")
-    public static PDataType sqlTypeNameToPDataType(SqlTypeName sqlTypeName) {
-        return PDataType.fromTypeId(sqlTypeName.getJdbcOrdinal());
+    public static PDataType relDataTypeToPDataType(RelDataType relDataType) {
+        SqlTypeName sqlTypeName = relDataType.getSqlTypeName();
+        final boolean isArrayType = sqlTypeName == SqlTypeName.ARRAY;
+        if (isArrayType) {
+            sqlTypeName = ((ArraySqlType) 
relDataType).getComponentType().getSqlTypeName();
+        }
+        final int ordinal = sqlTypeName.getJdbcOrdinal();
+        if (ordinal >= PDataType.ARRAY_TYPE_BASE) {
+            throw new UnsupportedOperationException(
+                    "Cannot convert RelDataType: " + relDataType +
+                    " to PDataType");
+        }
+        return PDataType.fromTypeId(ordinal + (isArrayType ? 
PDataType.ARRAY_TYPE_BASE : 0));
     }
     
     public static JoinType convertJoinType(JoinRelType type) {
@@ -365,7 +378,7 @@ public class CalciteUtils {
                         throw TypeMismatchException.newException(theType, 
node.toString());
                     }
                     
-                    PDataType targetType = 
sqlTypeNameToPDataType(node.getType().getSqlTypeName());
+                    PDataType targetType = 
relDataTypeToPDataType(node.getType());
                     return cast(targetType, expr, implementor);
                 } catch (SQLException e) {
                     throw new RuntimeException(e);
@@ -478,7 +491,7 @@ public class CalciteUtils {
                     } else {
                         throw TypeMismatchException.newException(theType, 
node.toString());
                     }
-                    PDataType targetType = 
sqlTypeNameToPDataType(node.getType().getSqlTypeName());
+                    PDataType targetType = 
relDataTypeToPDataType(node.getType());
                     return cast(targetType, expr, implementor);
                 } catch (SQLException e) {
                     throw new RuntimeException(e);
@@ -525,7 +538,7 @@ public class CalciteUtils {
                     } else {
                         expr = LiteralExpression.newConstant(null, theType, 
determinism);
                     }
-                    PDataType targetType = 
sqlTypeNameToPDataType(node.getType().getSqlTypeName());
+                    PDataType targetType = 
relDataTypeToPDataType(node.getType());
                     return cast(targetType, expr, implementor);
                 } catch (SQLException e) {
                     throw new RuntimeException(e);
@@ -572,7 +585,7 @@ public class CalciteUtils {
                     } else {
                         expr = LiteralExpression.newConstant(null, theType, 
determinism);
                     }
-                    PDataType targetType = 
sqlTypeNameToPDataType(node.getType().getSqlTypeName());
+                    PDataType targetType = 
relDataTypeToPDataType(node.getType());
                     return cast(targetType, expr, implementor);
                 } catch (SQLException e) {
                     throw new RuntimeException(e);
@@ -586,7 +599,7 @@ public class CalciteUtils {
             @Override
                        public Expression newExpression(RexNode node, 
PhoenixRelImplementor implementor) {
                                RexLiteral lit = (RexLiteral) node;
-                PDataType targetType = 
sqlTypeNameToPDataType(node.getType().getSqlTypeName());
+                PDataType targetType = relDataTypeToPDataType(node.getType());
                                Object o = lit.getValue();
                                if (o instanceof NlsString) {
                                    o = ((NlsString) o).getValue();
@@ -622,7 +635,7 @@ public class CalciteUtils {
                 }
                 String varId = ((RexCorrelVariable) refExpr).getName();
                 int index = fieldAccess.getField().getIndex();
-                PDataType type = 
sqlTypeNameToPDataType(node.getType().getSqlTypeName());
+                PDataType type = relDataTypeToPDataType(node.getType());
                 return implementor.newFieldAccessExpression(varId, index, 
type);
             }              
                });
@@ -632,7 +645,7 @@ public class CalciteUtils {
             public Expression newExpression(RexNode node, 
PhoenixRelImplementor implementor) {
                 RexDynamicParam param = (RexDynamicParam) node;
                 int index = param.getIndex();
-                PDataType type = 
sqlTypeNameToPDataType(node.getType().getSqlTypeName());
+                PDataType type = relDataTypeToPDataType(node.getType());
                 Integer maxLength =
                         (type == PChar.INSTANCE
                             || type == PCharArray.INSTANCE
@@ -649,7 +662,7 @@ public class CalciteUtils {
             public Expression newExpression(RexNode node,
                     PhoenixRelImplementor implementor) {                
                 List<Expression> children = convertChildren((RexCall) node, 
implementor);
-                PDataType targetType = 
sqlTypeNameToPDataType(node.getType().getSqlTypeName());
+                PDataType targetType = relDataTypeToPDataType(node.getType());
                 try {
                     return cast(targetType, children.get(0), implementor);
                 } catch (SQLException e) {

Reply via email to