You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2015/08/01 00:42:40 UTC

[03/50] [abbrv] incubator-calcite git commit: [CALCITE-677] RemoteDriverTest.testTypeHandling fails east of Greenwich

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/7f8ce197/avatica/src/main/java/org/apache/calcite/avatica/remote/LocalService.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/LocalService.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/LocalService.java
index f35265c..bea1664 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/LocalService.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/LocalService.java
@@ -81,8 +81,9 @@ public class LocalService implements Service {
   private List<List<Object>> list2(Meta.MetaResultSet resultSet) {
     final Meta.StatementHandle h = new Meta.StatementHandle(
         resultSet.connectionId, resultSet.statementId, null);
+    final List<TypedValue> parameterValues = Collections.emptyList();
     final Iterable<Object> iterable = meta.createIterable(h,
-        resultSet.signature, Collections.emptyList(), resultSet.firstFrame);
+        resultSet.signature, parameterValues, resultSet.firstFrame);
     final List<List<Object>> list = new ArrayList<>();
     return MetaImpl.collect(resultSet.signature.cursorFactory, iterable, list);
   }
@@ -161,7 +162,7 @@ public class LocalService implements Service {
         request.connectionId, request.statementId, null);
     final Meta.Frame frame =
         meta.fetch(h,
-            TypedValue.values(request.parameterValues),
+            request.parameterValues,
             request.offset,
             request.fetchMaxRowCount);
     return new FetchResponse(frame);

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/7f8ce197/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteMeta.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteMeta.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteMeta.java
index 8a83ff9..4267186 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteMeta.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteMeta.java
@@ -173,12 +173,11 @@ class RemoteMeta extends MetaImpl {
     }
   }
 
-  @Override public Frame fetch(StatementHandle h, List<Object> parameterValues,
-      int offset, int fetchMaxRowCount) {
-    final List<TypedValue> typedValues = TypedValue.list(parameterValues);
+  @Override public Frame fetch(StatementHandle h,
+      List<TypedValue> parameterValues, int offset, int fetchMaxRowCount) {
     final Service.FetchResponse response =
         service.apply(
-            new Service.FetchRequest(h.connectionId, h.id, typedValues,
+            new Service.FetchRequest(h.connectionId, h.id, parameterValues,
                 offset, fetchMaxRowCount));
     return response.frame;
   }

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/7f8ce197/avatica/src/main/java/org/apache/calcite/avatica/remote/TypedValue.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/TypedValue.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/TypedValue.java
index 04c4199..d12fc40 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/TypedValue.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/TypedValue.java
@@ -23,11 +23,103 @@ import org.apache.calcite.avatica.util.DateTimeUtils;
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
+import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
 import java.util.List;
 
-/** Value and type. */
+/** Value and type.
+ *
+ * <p>There are 3 representations:
+ * <ul>
+ *   <li>JDBC - the representation used by JDBC get and set methods
+ *   <li>Serial - suitable for serializing using JSON
+ *   <li>Local - used by Calcite for efficient computation
+ * </ul>
+ *
+ * <p>The following table shows the Java type(s) that may represent each SQL
+ * type in each representation.
+ *
+ * <table>
+ *   <caption>SQL types and their representations</caption>
+ *   <tr>
+ *     <th>Type</th> <th>JDBC</th> <th>Serial</th> <th>Local</th>
+ *   </tr>
+ *   <tr>
+ *     <td>BOOLEAN</td> <td>boolean</td> <td>boolean</td> <td>boolean</td>
+ *   </tr>
+ *   <tr>
+ *     <td>BINARY, VARBINARY</td> <td>byte[]</td>
+ *                    <td>String (base64)</td> <td>{@link ByteString}</td>
+ *   </tr>
+ *   <tr>
+ *     <td>DATE</td> <td>{@link java.sql.Date}</td>
+ *                                   <td>int</td> <td>int</td>
+ *   </tr>
+ *   <tr>
+ *     <td>TIME</td> <td>{@link java.sql.Time}</td>
+ *                                   <td>int</td> <td>int</td>
+ *   </tr>
+ *   <tr>
+ *     <td>DATE</td> <td>{@link java.sql.Timestamp}</td>
+ *                                   <td>long</td> <td>long</td>
+ *   </tr>
+ *   <tr>
+ *     <td>CHAR, VARCHAR</td>
+ *                   <td>String</td> <td>String</td> <td>String</td>
+ *   </tr>
+ *   <tr>
+ *     <td>TINYINT</td> <td>byte</td> <td>Number</td> <td>byte</td>
+ *   </tr>
+ *   <tr>
+ *     <td>SMALLINT</td> <td>short</td> <td>Number</td> <td>short</td>
+ *   </tr>
+ *   <tr>
+ *     <td>INTEGER</td> <td>int</td> <td>Number</td> <td>int</td>
+ *   </tr>
+ *   <tr>
+ *     <td>BIGINT</td> <td>long</td> <td>Number</td> <td>long</td>
+ *   </tr>
+ *   <tr>
+ *     <td>REAL</td> <td>float</td> <td>Number</td> <td>float</td>
+ *   </tr>
+ *   <tr>
+ *     <td>FLOAT, DOUBLE</td>
+ *                   <td>double</td> <td>Number</td> <td>double</td>
+ *   </tr>
+ *   <tr>
+ *     <td>DECIMAL</td>
+ *                   <td>BigDecimal</td> <td>Number</td> <td>BigDecimal</td>
+ *   </tr>
+ * </table>
+ *
+ * Note:
+ * <ul>
+ *   <li>The various numeric types (TINYINT, SMALLINT, INTEGER, BIGINT, REAL,
+ *   FLOAT, DOUBLE) are represented by {@link Number} in serial format because
+ *   JSON numbers are not strongly typed. A {@code float} value {@code 3.0} is
+ *   transmitted as {@code 3}, and is therefore decoded as an {@code int}.
+ *
+ *   <li>The date-time types (DATE, TIME, TIMESTAMP) are represented in JDBC as
+ *   {@link java.sql.Date}, {@link java.sql.Time}, {@link java.sql.Timestamp},
+ *   all sub-classes of {@link java.util.Date}. When they are passed to and
+ *   from the server, they are interpreted in terms of a time zone, by default
+ *   the current connection's time zone. Their serial and local representations
+ *   as {@code int} (days since 1970-01-01 for DATE, milliseconds since
+ *   00:00:00.000 for TIME), and long (milliseconds since 1970-01-01
+ *   00:00:00.000 for TIMESTAMP) are easier to work with, because it is clear
+ *   that time zone is not involved.
+ *
+ *   <li>BINARY and VARBINARY values are represented as base64-encoded strings
+ *   for serialization over JSON.
+ * </ul>
+ */
 public class TypedValue {
+  public static final TypedValue NULL =
+      new TypedValue(ColumnMetaData.Rep.OBJECT, null);
+
   /** Type of the value. */
   public final ColumnMetaData.Rep type;
 
@@ -39,31 +131,83 @@ public class TypedValue {
 
   private TypedValue(ColumnMetaData.Rep rep, Object value) {
     this.type = rep;
-    this.value = serialize(rep, value);
+    this.value = value;
+    assert isSerial(rep, value) : "rep: " + rep + ", value: " + value;
+  }
+
+  private boolean isSerial(ColumnMetaData.Rep rep, Object value) {
+    if (value == null) {
+      return true;
+    }
+    switch (rep) {
+    case BYTE_STRING:
+      return value instanceof String;
+    case JAVA_SQL_DATE:
+    case JAVA_SQL_TIME:
+      return value instanceof Integer;
+    case JAVA_SQL_TIMESTAMP:
+    case JAVA_UTIL_DATE:
+      return value instanceof Long;
+    default:
+      return true;
+    }
   }
 
   @JsonCreator
   public static TypedValue create(@JsonProperty("type") String type,
       @JsonProperty("value") Object value) {
+    if (value == null) {
+      return NULL;
+    }
     ColumnMetaData.Rep rep = ColumnMetaData.Rep.valueOf(type);
-    return new TypedValue(rep, deserialize(rep, value));
+    return ofLocal(rep, serialToLocal(rep, value));
   }
 
-  /** Converts the value into the preferred representation.
+  /** Creates a TypedValue from a value in local representation. */
+  public static TypedValue ofLocal(ColumnMetaData.Rep rep, Object value) {
+    return new TypedValue(rep, localToSerial(rep, value));
+  }
+
+  /** Creates a TypedValue from a value in serial representation. */
+  public static TypedValue ofSerial(ColumnMetaData.Rep rep, Object value) {
+    return new TypedValue(rep, value);
+  }
+
+  /** Creates a TypedValue from a value in JDBC representation. */
+  public static TypedValue ofJdbc(ColumnMetaData.Rep rep, Object value,
+      Calendar calendar) {
+    if (value == null) {
+      return NULL;
+    }
+    return new TypedValue(rep, jdbcToSerial(rep, value, calendar));
+  }
+
+  /** Creates a TypedValue from a value in JDBC representation,
+   * deducing its type. */
+  public static TypedValue ofJdbc(Object value, Calendar calendar) {
+    if (value == null) {
+      return NULL;
+    }
+    final ColumnMetaData.Rep rep = ColumnMetaData.Rep.of(value.getClass());
+    return new TypedValue(rep, jdbcToSerial(rep, value, calendar));
+  }
+
+  /** Converts the value into the local representation.
    *
    * <p>For example, a byte string is represented as a {@link ByteString};
    * a long is represented as a {@link Long} (not just some {@link Number}).
    */
-  public Object deserialize() {
-    return deserialize(type, value);
+  public Object toLocal() {
+    if (value == null) {
+      return null;
+    }
+    return serialToLocal(type, value);
   }
 
   /** Converts a value to the exact type required for the given
    * representation. */
-  private static Object deserialize(ColumnMetaData.Rep rep, Object value) {
-    if (value == null) {
-      return null;
-    }
+  private static Object serialToLocal(ColumnMetaData.Rep rep, Object value) {
+    assert value != null;
     if (value.getClass() == rep.clazz) {
       return value;
     }
@@ -73,44 +217,105 @@ public class TypedValue {
     case SHORT:
       return ((Number) value).shortValue();
     case INTEGER:
+    case JAVA_SQL_DATE:
+    case JAVA_SQL_TIME:
       return ((Number) value).intValue();
     case LONG:
+    case JAVA_UTIL_DATE:
+    case JAVA_SQL_TIMESTAMP:
       return ((Number) value).longValue();
     case FLOAT:
       return ((Number) value).floatValue();
     case DOUBLE:
       return ((Number) value).doubleValue();
+    case NUMBER:
+      return value instanceof BigDecimal ? value
+          : value instanceof BigInteger ? new BigDecimal((BigInteger) value)
+          : value instanceof Double ? new BigDecimal((Double) value)
+          : value instanceof Float ? new BigDecimal((Float) value)
+          : new BigDecimal(((Number) value).longValue());
     case BYTE_STRING:
       return ByteString.ofBase64((String) value);
+    default:
+      throw new IllegalArgumentException("cannot convert " + value + " ("
+          + value.getClass() + ") to " + rep);
+    }
+  }
+
+  /** Converts the value into the JDBC representation.
+   *
+   * <p>For example, a byte string is represented as a {@link ByteString};
+   * a long is represented as a {@link Long} (not just some {@link Number}).
+   */
+  public Object toJdbc(Calendar calendar) {
+    if (value == null) {
+      return null;
+    }
+    return serialToJdbc(type, value, calendar);
+  }
+
+  private static Object serialToJdbc(ColumnMetaData.Rep type, Object value,
+      Calendar calendar) {
+    switch (type) {
+    case BYTE_STRING:
+      return ByteString.ofBase64((String) value).getBytes();
     case JAVA_UTIL_DATE:
-      return new java.util.Date((Long) value);
+      return new java.util.Date(adjust((Number) value, calendar));
     case JAVA_SQL_DATE:
-      return new java.sql.Date((long) (Integer) value
-          * DateTimeUtils.MILLIS_PER_DAY);
+      return new java.sql.Date(
+          adjust(((Number) value).longValue() * DateTimeUtils.MILLIS_PER_DAY,
+              calendar));
     case JAVA_SQL_TIME:
-      return new java.sql.Time((Integer) value);
+      return new java.sql.Time(adjust((Number) value, calendar));
     case JAVA_SQL_TIMESTAMP:
-      return new java.sql.Timestamp((Long) value);
+      return new java.sql.Timestamp(adjust((Number) value, calendar));
     default:
-      throw new IllegalArgumentException("cannot convert " + value + " ("
-          + value.getClass() + ") to " + rep);
+      return serialToLocal(type, value);
     }
   }
 
-  /** Converts a value to a type that can be serialized as JSON. */
-  private static Object serialize(ColumnMetaData.Rep rep, Object value) {
+  private static long adjust(Number number, Calendar calendar) {
+    long t = number.longValue();
+    if (calendar != null) {
+      t -= calendar.getTimeZone().getOffset(t);
+    }
+    return t;
+  }
+
+  /** Converts a value from JDBC format to a type that can be serialized as
+   * JSON. */
+  private static Object jdbcToSerial(ColumnMetaData.Rep rep, Object value,
+      Calendar calendar) {
     switch (rep) {
     case BYTE_STRING:
-      return ((ByteString) value).toBase64String();
+      return new ByteString((byte[]) value).toBase64String();
     case JAVA_UTIL_DATE:
     case JAVA_SQL_TIMESTAMP:
-      return ((java.util.Date) value).getTime();
     case JAVA_SQL_DATE:
-      return (int) DateTimeUtils.floorDiv(((java.sql.Date) value).getTime(),
-          DateTimeUtils.MILLIS_PER_DAY);
     case JAVA_SQL_TIME:
-      return (int) DateTimeUtils.floorMod(((java.sql.Time) value).getTime(),
-          DateTimeUtils.MILLIS_PER_DAY);
+      long t = ((Date) value).getTime();
+      if (calendar != null) {
+        t += calendar.getTimeZone().getOffset(t);
+      }
+      switch (rep) {
+      case JAVA_SQL_DATE:
+        return (int) DateTimeUtils.floorDiv(t, DateTimeUtils.MILLIS_PER_DAY);
+      case JAVA_SQL_TIME:
+        return (int) DateTimeUtils.floorMod(t, DateTimeUtils.MILLIS_PER_DAY);
+      default:
+        return t;
+      }
+    default:
+      return value;
+    }
+  }
+
+  /** Converts a value from internal format to a type that can be serialized
+   * as JSON. */
+  private static Object localToSerial(ColumnMetaData.Rep rep, Object value) {
+    switch (rep) {
+    case BYTE_STRING:
+      return ((ByteString) value).toBase64String();
     default:
       return value;
     }
@@ -120,27 +325,10 @@ public class TypedValue {
   public static List<Object> values(List<TypedValue> typedValues) {
     final List<Object> list = new ArrayList<>();
     for (TypedValue typedValue : typedValues) {
-      list.add(typedValue.deserialize());
+      list.add(typedValue.toLocal());
     }
     return list;
   }
-
-  /** Converts a list of values to a list of {@code TypedValue}. */
-  public static List<TypedValue> list(List<Object> values) {
-    final List<TypedValue> list = new ArrayList<>();
-    for (Object value : values) {
-      list.add(create(value));
-    }
-    return list;
-  }
-
-  private static TypedValue create(Object value) {
-    if (value == null) {
-      return new TypedValue(ColumnMetaData.Rep.OBJECT, null);
-    }
-    final ColumnMetaData.Rep rep = ColumnMetaData.Rep.of(value.getClass());
-    return new TypedValue(rep, value);
-  }
 }
 
 // End TypedValue.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/7f8ce197/avatica/src/main/java/org/apache/calcite/avatica/util/AbstractCursor.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/util/AbstractCursor.java b/avatica/src/main/java/org/apache/calcite/avatica/util/AbstractCursor.java
index 8871ea3..17ccfde 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/util/AbstractCursor.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/util/AbstractCursor.java
@@ -16,7 +16,7 @@
  */
 package org.apache.calcite.avatica.util;
 
-import org.apache.calcite.avatica.AvaticaParameter;
+import org.apache.calcite.avatica.AvaticaSite;
 import org.apache.calcite.avatica.AvaticaUtils;
 import org.apache.calcite.avatica.ColumnMetaData;
 
@@ -666,7 +666,7 @@ public abstract class AbstractCursor implements Cursor {
       if (n == null) {
         return null;
       }
-      return AvaticaParameter.toBigDecimal(n)
+      return AvaticaSite.toBigDecimal(n)
           .setScale(scale, BigDecimal.ROUND_UNNECESSARY);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/7f8ce197/avatica/src/main/java/org/apache/calcite/avatica/util/DateTimeUtils.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/util/DateTimeUtils.java b/avatica/src/main/java/org/apache/calcite/avatica/util/DateTimeUtils.java
index 92f50ef..a9b17a7 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/util/DateTimeUtils.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/util/DateTimeUtils.java
@@ -700,6 +700,17 @@ public class DateTimeUtils {
     }
   }
 
+  /** Resets to zero the "time" part of a timestamp. */
+  public static long resetTime(long timestamp) {
+    int date = (int) (timestamp / MILLIS_PER_DAY);
+    return (long) date * MILLIS_PER_DAY;
+  }
+
+  /** Resets to epoch (1970-01-01) the "date" part of a timestamp. */
+  public static long resetDate(long timestamp) {
+    return floorMod(timestamp, MILLIS_PER_DAY);
+  }
+
   public static long unixTimestampFloor(TimeUnitRange range, long timestamp) {
     int date = (int) (timestamp / MILLIS_PER_DAY);
     final int f = julianDateFloor(range, date + EPOCH_JULIAN, true);

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/7f8ce197/core/src/main/java/org/apache/calcite/jdbc/CalciteConnectionImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/jdbc/CalciteConnectionImpl.java b/core/src/main/java/org/apache/calcite/jdbc/CalciteConnectionImpl.java
index 94b2bb7..f3819fe 100644
--- a/core/src/main/java/org/apache/calcite/jdbc/CalciteConnectionImpl.java
+++ b/core/src/main/java/org/apache/calcite/jdbc/CalciteConnectionImpl.java
@@ -20,12 +20,13 @@ import org.apache.calcite.DataContext;
 import org.apache.calcite.adapter.java.JavaTypeFactory;
 import org.apache.calcite.avatica.AvaticaConnection;
 import org.apache.calcite.avatica.AvaticaFactory;
-import org.apache.calcite.avatica.AvaticaParameter;
+import org.apache.calcite.avatica.AvaticaSite;
 import org.apache.calcite.avatica.AvaticaStatement;
 import org.apache.calcite.avatica.Helper;
 import org.apache.calcite.avatica.InternalProperty;
 import org.apache.calcite.avatica.Meta;
 import org.apache.calcite.avatica.UnregisteredDriver;
+import org.apache.calcite.avatica.remote.TypedValue;
 import org.apache.calcite.config.CalciteConnectionConfig;
 import org.apache.calcite.config.CalciteConnectionConfigImpl;
 import org.apache.calcite.linq4j.BaseQueryable;
@@ -224,10 +225,10 @@ abstract class CalciteConnectionImpl
       CalcitePrepare.CalciteSignature<T> signature) throws SQLException {
     Map<String, Object> map = Maps.newLinkedHashMap();
     AvaticaStatement statement = lookupStatement(handle);
-    final List<Object> parameterValues =
+    final List<TypedValue> parameterValues =
         TROJAN.getParameterValues(statement);
-    for (Ord<Object> o : Ord.zip(parameterValues)) {
-      map.put("?" + o.i, o.e);
+    for (Ord<TypedValue> o : Ord.zip(parameterValues)) {
+      map.put("?" + o.i, o.e.toLocal());
     }
     map.putAll(signature.internalParameters);
     final DataContext dataContext = createDataContext(map);
@@ -329,7 +330,7 @@ abstract class CalciteConnectionImpl
       for (Map.Entry<String, Object> entry : parameters.entrySet()) {
         Object e = entry.getValue();
         if (e == null) {
-          e = AvaticaParameter.DUMMY_VALUE;
+          e = AvaticaSite.DUMMY_VALUE;
         }
         builder.put(entry.getKey(), e);
       }
@@ -338,7 +339,7 @@ abstract class CalciteConnectionImpl
 
     public synchronized Object get(String name) {
       Object o = map.get(name);
-      if (o == AvaticaParameter.DUMMY_VALUE) {
+      if (o == AvaticaSite.DUMMY_VALUE) {
         return null;
       }
       if (o == null && Variable.SQL_ADVISOR.camelName.equals(name)) {

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/7f8ce197/core/src/main/java/org/apache/calcite/jdbc/CalciteJdbc41Factory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/jdbc/CalciteJdbc41Factory.java b/core/src/main/java/org/apache/calcite/jdbc/CalciteJdbc41Factory.java
index e5a567c..f44e871 100644
--- a/core/src/main/java/org/apache/calcite/jdbc/CalciteJdbc41Factory.java
+++ b/core/src/main/java/org/apache/calcite/jdbc/CalciteJdbc41Factory.java
@@ -138,121 +138,118 @@ public class CalciteJdbc41Factory extends CalciteFactory {
     public void setRowId(
         int parameterIndex,
         RowId x) throws SQLException {
-      getParameter(parameterIndex).setRowId(slots, parameterIndex, x);
+      getSite(parameterIndex).setRowId(x);
     }
 
     public void setNString(
         int parameterIndex, String value) throws SQLException {
-      getParameter(parameterIndex).setNString(slots, parameterIndex, value);
+      getSite(parameterIndex).setNString(value);
     }
 
     public void setNCharacterStream(
         int parameterIndex,
         Reader value,
         long length) throws SQLException {
-      getParameter(parameterIndex)
-          .setNCharacterStream(slots, parameterIndex, value, length);
+      getSite(parameterIndex)
+          .setNCharacterStream(value, length);
     }
 
     public void setNClob(
         int parameterIndex,
         NClob value) throws SQLException {
-      getParameter(parameterIndex).setNClob(slots, parameterIndex, value);
+      getSite(parameterIndex).setNClob(value);
     }
 
     public void setClob(
         int parameterIndex,
         Reader reader,
         long length) throws SQLException {
-      getParameter(parameterIndex)
-          .setClob(slots, parameterIndex, reader, length);
+      getSite(parameterIndex)
+          .setClob(reader, length);
     }
 
     public void setBlob(
         int parameterIndex,
         InputStream inputStream,
         long length) throws SQLException {
-      getParameter(parameterIndex)
-          .setBlob(slots, parameterIndex, inputStream, length);
+      getSite(parameterIndex)
+          .setBlob(inputStream, length);
     }
 
     public void setNClob(
         int parameterIndex,
         Reader reader,
         long length) throws SQLException {
-      getParameter(parameterIndex).setNClob(slots,
-          parameterIndex,
-          reader,
-          length);
+      getSite(parameterIndex).setNClob(reader, length);
     }
 
     public void setSQLXML(
         int parameterIndex, SQLXML xmlObject) throws SQLException {
-      getParameter(parameterIndex).setSQLXML(slots, parameterIndex, xmlObject);
+      getSite(parameterIndex).setSQLXML(xmlObject);
     }
 
     public void setAsciiStream(
         int parameterIndex,
         InputStream x,
         long length) throws SQLException {
-      getParameter(parameterIndex)
-          .setAsciiStream(slots, parameterIndex, x, length);
+      getSite(parameterIndex)
+          .setAsciiStream(x, length);
     }
 
     public void setBinaryStream(
         int parameterIndex,
         InputStream x,
         long length) throws SQLException {
-      getParameter(parameterIndex)
-          .setBinaryStream(slots, parameterIndex, x, length);
+      getSite(parameterIndex)
+          .setBinaryStream(x, length);
     }
 
     public void setCharacterStream(
         int parameterIndex,
         Reader reader,
         long length) throws SQLException {
-      getParameter(parameterIndex)
-          .setCharacterStream(slots, parameterIndex, reader, length);
+      getSite(parameterIndex)
+          .setCharacterStream(reader, length);
     }
 
     public void setAsciiStream(
         int parameterIndex, InputStream x) throws SQLException {
-      getParameter(parameterIndex).setAsciiStream(slots, parameterIndex, x);
+      getSite(parameterIndex).setAsciiStream(x);
     }
 
     public void setBinaryStream(
         int parameterIndex, InputStream x) throws SQLException {
-      getParameter(parameterIndex).setBinaryStream(slots, parameterIndex, x);
+      getSite(parameterIndex).setBinaryStream(x);
     }
 
     public void setCharacterStream(
         int parameterIndex, Reader reader) throws SQLException {
-      getParameter(parameterIndex)
-          .setCharacterStream(slots, parameterIndex, reader);
+      getSite(parameterIndex)
+          .setCharacterStream(reader);
     }
 
     public void setNCharacterStream(
         int parameterIndex, Reader value) throws SQLException {
-      getParameter(parameterIndex)
-          .setNCharacterStream(slots, parameterIndex, value);
+      getSite(parameterIndex)
+          .setNCharacterStream(value);
     }
 
     public void setClob(
         int parameterIndex,
         Reader reader) throws SQLException {
-      getParameter(parameterIndex).setClob(slots, parameterIndex, reader);
+      getSite(parameterIndex).setClob(reader);
     }
 
     public void setBlob(
         int parameterIndex, InputStream inputStream) throws SQLException {
-      getParameter(parameterIndex)
-          .setBlob(slots, parameterIndex, inputStream);
+      getSite(parameterIndex)
+          .setBlob(inputStream);
     }
 
     public void setNClob(
         int parameterIndex, Reader reader) throws SQLException {
-      getParameter(parameterIndex)
-          .setNClob(slots, parameterIndex, reader);
+      getSite(parameterIndex)
+          .setNClob(reader);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/7f8ce197/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java b/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java
index 7054685..e08e6a2 100644
--- a/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java
+++ b/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java
@@ -25,6 +25,7 @@ import org.apache.calcite.avatica.AvaticaUtils;
 import org.apache.calcite.avatica.ColumnMetaData;
 import org.apache.calcite.avatica.Meta;
 import org.apache.calcite.avatica.MetaImpl;
+import org.apache.calcite.avatica.remote.TypedValue;
 import org.apache.calcite.linq4j.Enumerable;
 import org.apache.calcite.linq4j.Enumerator;
 import org.apache.calcite.linq4j.Linq4j;
@@ -457,7 +458,7 @@ public class CalciteMetaImpl extends MetaImpl {
   }
 
   @Override public Iterable<Object> createIterable(StatementHandle handle,
-      Signature signature, List<Object> parameterValues, Frame firstFrame) {
+      Signature signature, List<TypedValue> parameterValues, Frame firstFrame) {
     try {
       //noinspection unchecked
       final CalcitePrepare.CalciteSignature<Object> calciteSignature =
@@ -504,7 +505,7 @@ public class CalciteMetaImpl extends MetaImpl {
     // TODO: share code with prepare and createIterable
   }
 
-  @Override public Frame fetch(StatementHandle h, List<Object> parameterValues,
+  @Override public Frame fetch(StatementHandle h, List<TypedValue> parameterValues,
       int offset, int fetchMaxRowCount) {
     final CalciteConnectionImpl calciteConnection = getConnection();
     CalciteServerStatement stmt = calciteConnection.server.getStatement(h);
@@ -512,7 +513,7 @@ public class CalciteMetaImpl extends MetaImpl {
     final Iterator<Object> iterator;
     if (parameterValues != null) {
       final Iterable<Object> iterable =
-          createIterable(h, signature, Collections.emptyList(), null);
+          createIterable(h, signature, parameterValues, null);
       iterator = iterable.iterator();
       stmt.setResultSet(iterator);
     } else {

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/7f8ce197/core/src/test/java/org/apache/calcite/jdbc/CalciteRemoteDriverTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/jdbc/CalciteRemoteDriverTest.java b/core/src/test/java/org/apache/calcite/jdbc/CalciteRemoteDriverTest.java
index f9a32ac..f0b3b93 100644
--- a/core/src/test/java/org/apache/calcite/jdbc/CalciteRemoteDriverTest.java
+++ b/core/src/test/java/org/apache/calcite/jdbc/CalciteRemoteDriverTest.java
@@ -285,7 +285,7 @@ public class CalciteRemoteDriverTest {
       }
       int param = map.get(sqlType);
       Class clazz = entry.getKey();
-      for (Object sampleValue : values(sqlType.clazz)) {
+      for (Object sampleValue : values(sqlType.boxedClass())) {
         switch (sqlType) {
         case DATE:
         case TIME: