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: