http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/src/main/java/org/apache/calcite/avatica/InternalProperty.java
----------------------------------------------------------------------
diff --git 
a/avatica/src/main/java/org/apache/calcite/avatica/InternalProperty.java 
b/avatica/src/main/java/org/apache/calcite/avatica/InternalProperty.java
deleted file mode 100644
index a5a3852..0000000
--- a/avatica/src/main/java/org/apache/calcite/avatica/InternalProperty.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to you under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.calcite.avatica;
-
-import org.apache.calcite.avatica.ConnectionProperty.Type;
-import org.apache.calcite.avatica.util.Casing;
-import org.apache.calcite.avatica.util.Quoting;
-
-import java.util.Map;
-
-/**
- * Definitions of properties that drive the behavior of
- * {@link org.apache.calcite.avatica.AvaticaDatabaseMetaData}.
- */
-public enum InternalProperty {
-  /** Whether identifiers are matched case-sensitively. */
-  CASE_SENSITIVE(Type.BOOLEAN, true),
-
-  /** Character that quotes identifiers. */
-  SQL_KEYWORDS(Type.STRING, null),
-
-  /** How identifiers are quoted. */
-  QUOTING(Quoting.class, Quoting.DOUBLE_QUOTE),
-
-  /** How identifiers are stored if they are quoted. */
-  QUOTED_CASING(Casing.class, Casing.UNCHANGED),
-
-  /** How identifiers are stored if they are not quoted. */
-  UNQUOTED_CASING(Casing.class, Casing.TO_UPPER),
-
-  /** How identifiers are stored if they are not quoted. */
-  NULL_SORTING(NullSorting.class, NullSorting.END);
-
-  private final Type type;
-  private final Class enumClass;
-  private final Object defaultValue;
-
-  /** Creates an InternalProperty based on an enum. */
-  <E extends Enum> InternalProperty(Class<E> enumClass, E defaultValue) {
-    this(Type.ENUM, enumClass, defaultValue);
-  }
-
-  /** Creates an InternalProperty based on a non-enum type. */
-  InternalProperty(Type type, Object defaultValue) {
-    this(type, null, defaultValue);
-  }
-
-  private InternalProperty(Type type, Class enumClass, Object defaultValue) {
-    this.type = type;
-    this.enumClass = enumClass;
-    this.defaultValue = defaultValue;
-  }
-
-  private <T> T get_(Map<InternalProperty, Object> map, T defaultValue) {
-    final Object s = map.get(this);
-    if (s != null) {
-      return (T) s;
-    }
-    if (defaultValue != null) {
-      return (T) defaultValue;
-    }
-    throw new RuntimeException("Required property '" + name()
-        + "' not specified");
-  }
-
-  /** Returns the string value of this property, or null if not specified and
-   * no default. */
-  public String getString(Map<InternalProperty, Object> map) {
-    assert type == Type.STRING;
-    return get_(map, (String) defaultValue);
-  }
-
-  /** Returns the boolean value of this property. Throws if not set and no
-   * default. */
-  public boolean getBoolean(Map<InternalProperty, Object> map) {
-    assert type == Type.BOOLEAN;
-    return get_(map, (Boolean) defaultValue);
-  }
-
-  /** Returns the enum value of this property. Throws if not set and no
-   * default. */
-  public <E extends Enum> E getEnum(Map<InternalProperty, Object> map,
-      Class<E> enumClass) {
-    assert type == Type.ENUM;
-    //noinspection unchecked
-    return get_(map, (E) defaultValue);
-  }
-
-  /** Where nulls appear in a sorted relation. */
-  enum NullSorting {
-    START, END, LOW, HIGH,
-  }
-}
-
-// End InternalProperty.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/src/main/java/org/apache/calcite/avatica/Meta.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/Meta.java 
b/avatica/src/main/java/org/apache/calcite/avatica/Meta.java
deleted file mode 100644
index 4cc460c..0000000
--- a/avatica/src/main/java/org/apache/calcite/avatica/Meta.java
+++ /dev/null
@@ -1,1272 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to you under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.calcite.avatica;
-
-import org.apache.calcite.avatica.proto.Common;
-import org.apache.calcite.avatica.remote.TypedValue;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.annotation.JsonSubTypes;
-import com.fasterxml.jackson.annotation.JsonTypeInfo;
-import com.google.protobuf.ByteString;
-import com.google.protobuf.Descriptors.FieldDescriptor;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.math.BigDecimal;
-import java.sql.Connection;
-import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Properties;
-
-/**
- * Command handler for getting various metadata. Should be implemented by each
- * driver.
- *
- * <p>Also holds other abstract methods that are not related to metadata
- * that each provider must implement. This is not ideal.</p>
- */
-public interface Meta {
-
-  /**
-   * Returns a map of static database properties.
-   *
-   * <p>The provider can omit properties whose value is the same as the
-   * default.
-   */
-  Map<DatabaseProperty, Object> getDatabaseProperties(ConnectionHandle ch);
-
-  /** Per {@link DatabaseMetaData#getTables(String, String, String, 
String[])}. */
-  MetaResultSet getTables(ConnectionHandle ch,
-      String catalog,
-      Pat schemaPattern,
-      Pat tableNamePattern,
-      List<String> typeList);
-
-  /** Per {@link DatabaseMetaData#getColumns(String, String, String, String)}. 
*/
-  MetaResultSet getColumns(ConnectionHandle ch,
-      String catalog,
-      Pat schemaPattern,
-      Pat tableNamePattern,
-      Pat columnNamePattern);
-
-  MetaResultSet getSchemas(ConnectionHandle ch, String catalog, Pat 
schemaPattern);
-
-  /** Per {@link DatabaseMetaData#getCatalogs()}. */
-  MetaResultSet getCatalogs(ConnectionHandle ch);
-
-  /** Per {@link DatabaseMetaData#getTableTypes()}. */
-  MetaResultSet getTableTypes(ConnectionHandle ch);
-
-  /** Per {@link DatabaseMetaData#getProcedures(String, String, String)}. */
-  MetaResultSet getProcedures(ConnectionHandle ch,
-      String catalog,
-      Pat schemaPattern,
-      Pat procedureNamePattern);
-
-  /** Per {@link DatabaseMetaData#getProcedureColumns(String, String, String, 
String)}. */
-  MetaResultSet getProcedureColumns(ConnectionHandle ch,
-      String catalog,
-      Pat schemaPattern,
-      Pat procedureNamePattern,
-      Pat columnNamePattern);
-
-  /** Per {@link DatabaseMetaData#getColumnPrivileges(String, String, String, 
String)}. */
-  MetaResultSet getColumnPrivileges(ConnectionHandle ch,
-      String catalog,
-      String schema,
-      String table,
-      Pat columnNamePattern);
-
-  /** Per {@link DatabaseMetaData#getTablePrivileges(String, String, String)}. 
*/
-  MetaResultSet getTablePrivileges(ConnectionHandle ch,
-      String catalog,
-      Pat schemaPattern,
-      Pat tableNamePattern);
-
-  /** Per
-   * {@link DatabaseMetaData#getBestRowIdentifier(String, String, String, int, 
boolean)}. */
-  MetaResultSet getBestRowIdentifier(ConnectionHandle ch,
-      String catalog,
-      String schema,
-      String table,
-      int scope,
-      boolean nullable);
-
-  /** Per {@link DatabaseMetaData#getVersionColumns(String, String, String)}. 
*/
-  MetaResultSet getVersionColumns(ConnectionHandle ch, String catalog, String 
schema, String table);
-
-  /** Per {@link DatabaseMetaData#getPrimaryKeys(String, String, String)}. */
-  MetaResultSet getPrimaryKeys(ConnectionHandle ch, String catalog, String 
schema, String table);
-
-  /** Per {@link DatabaseMetaData#getImportedKeys(String, String, String)}. */
-  MetaResultSet getImportedKeys(ConnectionHandle ch, String catalog, String 
schema, String table);
-
-  /** Per {@link DatabaseMetaData#getExportedKeys(String, String, String)}. */
-  MetaResultSet getExportedKeys(ConnectionHandle ch, String catalog, String 
schema, String table);
-
-  /** Per
-   * {@link DatabaseMetaData#getCrossReference(String, String, String, String, 
String, String)}. */
-  MetaResultSet getCrossReference(ConnectionHandle ch,
-      String parentCatalog,
-      String parentSchema,
-      String parentTable,
-      String foreignCatalog,
-      String foreignSchema,
-      String foreignTable);
-
-  /** Per {@link DatabaseMetaData#getTypeInfo()}. */
-  MetaResultSet getTypeInfo(ConnectionHandle ch);
-
-  /** Per {@link DatabaseMetaData#getIndexInfo(String, String, String, 
boolean, boolean)}. */
-  MetaResultSet getIndexInfo(ConnectionHandle ch, String catalog,
-      String schema,
-      String table,
-      boolean unique,
-      boolean approximate);
-
-  /** Per {@link DatabaseMetaData#getUDTs(String, String, String, int[])}. */
-  MetaResultSet getUDTs(ConnectionHandle ch,
-      String catalog,
-      Pat schemaPattern,
-      Pat typeNamePattern,
-      int[] types);
-
-  /** Per {@link DatabaseMetaData#getSuperTypes(String, String, String)}. */
-  MetaResultSet getSuperTypes(ConnectionHandle ch,
-      String catalog,
-      Pat schemaPattern,
-      Pat typeNamePattern);
-
-  /** Per {@link DatabaseMetaData#getSuperTables(String, String, String)}. */
-  MetaResultSet getSuperTables(ConnectionHandle ch,
-      String catalog,
-      Pat schemaPattern,
-      Pat tableNamePattern);
-
-  /** Per {@link DatabaseMetaData#getAttributes(String, String, String, 
String)}. */
-  MetaResultSet getAttributes(ConnectionHandle ch,
-      String catalog,
-      Pat schemaPattern,
-      Pat typeNamePattern,
-      Pat attributeNamePattern);
-
-  /** Per {@link DatabaseMetaData#getClientInfoProperties()}. */
-  MetaResultSet getClientInfoProperties(ConnectionHandle ch);
-
-  /** Per {@link DatabaseMetaData#getFunctions(String, String, String)}. */
-  MetaResultSet getFunctions(ConnectionHandle ch,
-      String catalog,
-      Pat schemaPattern,
-      Pat functionNamePattern);
-
-  /** Per {@link DatabaseMetaData#getFunctionColumns(String, String, String, 
String)}. */
-  MetaResultSet getFunctionColumns(ConnectionHandle ch,
-      String catalog,
-      Pat schemaPattern,
-      Pat functionNamePattern,
-      Pat columnNamePattern);
-
-  /** Per {@link DatabaseMetaData#getPseudoColumns(String, String, String, 
String)}. */
-  MetaResultSet getPseudoColumns(ConnectionHandle ch,
-      String catalog,
-      Pat schemaPattern,
-      Pat tableNamePattern,
-      Pat columnNamePattern);
-
-  /** Creates an iterable for a result set.
-   *
-   * <p>The default implementation just returns {@code iterable}, which it
-   * requires to be not null; derived classes may instead choose to execute the
-   * relational expression in {@code signature}. */
-  Iterable<Object> createIterable(StatementHandle stmt, QueryState state, 
Signature signature,
-      List<TypedValue> parameterValues, Frame firstFrame);
-
-  /** Prepares a statement.
-   *
-   * @param ch Connection handle
-   * @param sql SQL query
-   * @param maxRowCount Negative for no limit (different meaning than JDBC)
-   * @return Signature of prepared statement
-   */
-  StatementHandle prepare(ConnectionHandle ch, String sql, long maxRowCount);
-
-  /** Prepares and executes a statement.
-   *
-   * @param h Statement handle
-   * @param sql SQL query
-   * @param maxRowCount Negative for no limit (different meaning than JDBC)
-   * @param callback Callback to lock, clear and assign cursor
-   *
-   * @return Result containing statement ID, and if a query, a result set and
-   *     first frame of data
-   */
-  ExecuteResult prepareAndExecute(StatementHandle h, String sql,
-      long maxRowCount, PrepareCallback callback) throws 
NoSuchStatementException;
-
-  /** Returns a frame of rows.
-   *
-   * <p>The frame describes whether there may be another frame. If there is not
-   * another frame, the current iteration is done when we have finished the
-   * rows in the this frame.
-   *
-   * <p>The default implementation always returns null.
-   *
-   * @param h Statement handle
-   * @param offset Zero-based offset of first row in the requested frame
-   * @param fetchMaxRowCount Maximum number of rows to return; negative means
-   * no limit
-   * @return Frame, or null if there are no more
-   */
-  Frame fetch(StatementHandle h, long offset, int fetchMaxRowCount) throws
-      NoSuchStatementException, MissingResultsException;
-
-  /** Executes a prepared statement.
-   *
-   * @param h Statement handle
-   * @param parameterValues A list of parameter values; may be empty, not null
-   * @param maxRowCount Maximum number of rows to return; negative means
-   * no limit
-   * @return Execute result
-   */
-  ExecuteResult execute(StatementHandle h, List<TypedValue> parameterValues,
-      long maxRowCount) throws NoSuchStatementException;
-
-  /** Called during the creation of a statement to allocate a new handle.
-   *
-   * @param ch Connection handle
-   */
-  StatementHandle createStatement(ConnectionHandle ch);
-
-  /** Closes a statement. */
-  void closeStatement(StatementHandle h);
-
-  /**
-   * Opens (creates) a connection. The client allocates its own connection ID 
which the server is
-   * then made aware of through the {@link ConnectionHandle}. The Map {@code 
info} argument is
-   * analogous to the {@link Properties} typically passed to a "normal" JDBC 
Driver. Avatica
-   * specific properties should not be included -- only properties for the 
underlying driver.
-   *
-   * @param ch A ConnectionHandle encapsulates information about the 
connection to be opened
-   *    as provided by the client.
-   * @param info A Map corresponding to the Properties typically passed to a 
JDBC Driver.
-   */
-  void openConnection(ConnectionHandle ch, Map<String, String> info);
-
-  /** Closes a connection */
-  void closeConnection(ConnectionHandle ch);
-
-  /**
-   * Re-set the {@link ResultSet} on a Statement. Not a JDBC method.
-   * @return True if there are results to fetch after resetting to the given 
offset. False otherwise
-   */
-  boolean syncResults(StatementHandle sh, QueryState state, long offset)
-      throws NoSuchStatementException;
-
-  /**
-   * Makes all changes since the last commit/rollback permanent. Analogy to
-   * {@link Connection#commit()}.
-   *
-   * @param ch A reference to the real JDBC Connection.
-   */
-  void commit(ConnectionHandle ch);
-
-  /**
-   * Undoes all changes since the last commit/rollback. Analogy to
-   * {@link Connection#rollback()};
-   *
-   * @param ch A reference to the real JDBC Connection.
-   */
-  void rollback(ConnectionHandle ch);
-
-  /** Sync client and server view of connection properties.
-   *
-   * <p>Note: this interface is considered "experimental" and may undergo 
further changes as this
-   * functionality is extended to other aspects of state management for
-   * {@link java.sql.Connection}, {@link java.sql.Statement}, and {@link 
java.sql.ResultSet}.</p>
-   */
-  ConnectionProperties connectionSync(ConnectionHandle ch, 
ConnectionProperties connProps);
-
-  /** Factory to create instances of {@link Meta}. */
-  interface Factory {
-    Meta create(List<String> args);
-  }
-
-  /** Wrapper to remind API calls that a parameter is a pattern (allows '%' and
-   * '_' wildcards, per the JDBC spec) rather than a string to be matched
-   * exactly. */
-  class Pat {
-    public final String s;
-
-    private Pat(String s) {
-      this.s = s;
-    }
-
-    @Override public String toString() {
-      return "Pat[" + s + "]";
-    }
-
-    @JsonCreator
-    public static Pat of(@JsonProperty("s") String name) {
-      return new Pat(name);
-    }
-  }
-
-  /** Database property.
-   *
-   * <p>Values exist for methods, such as
-   * {@link DatabaseMetaData#getSQLKeywords()}, which always return the same
-   * value at all times and across connections.
-   *
-   * @see #getDatabaseProperties(Meta.ConnectionHandle)
-   */
-  enum DatabaseProperty {
-    /** Database property containing the value of
-     * {@link DatabaseMetaData#getNumericFunctions()}. */
-    GET_NUMERIC_FUNCTIONS(""),
-
-    /** Database property containing the value of
-     * {@link DatabaseMetaData#getStringFunctions()}. */
-    GET_STRING_FUNCTIONS(""),
-
-    /** Database property containing the value of
-     * {@link DatabaseMetaData#getSystemFunctions()}. */
-    GET_SYSTEM_FUNCTIONS(""),
-
-    /** Database property containing the value of
-     * {@link DatabaseMetaData#getTimeDateFunctions()}. */
-    GET_TIME_DATE_FUNCTIONS(""),
-
-    /** Database property containing the value of
-     * {@link DatabaseMetaData#getSQLKeywords()}. */
-    GET_S_Q_L_KEYWORDS(""),
-
-    /** Database property containing the value of
-     * {@link DatabaseMetaData#getDefaultTransactionIsolation()}. */
-    GET_DEFAULT_TRANSACTION_ISOLATION(Connection.TRANSACTION_NONE);
-
-    public final Class<?> type;
-    public final Object defaultValue;
-    public final Method method;
-
-    <T> DatabaseProperty(T defaultValue) {
-      this.defaultValue = defaultValue;
-      final String methodName = AvaticaUtils.toCamelCase(name());
-      try {
-        this.method = DatabaseMetaData.class.getMethod(methodName);
-      } catch (NoSuchMethodException e) {
-        throw new RuntimeException(e);
-      }
-      this.type = AvaticaUtils.box(method.getReturnType());
-      assert defaultValue == null || defaultValue.getClass() == type;
-    }
-
-    /** Returns a value of this property, using the default value if the map
-     * does not contain an explicit value. */
-    public <T> T getProp(Meta meta, ConnectionHandle ch, Class<T> aClass) {
-      return getProp(meta.getDatabaseProperties(ch), aClass);
-    }
-
-    /** Returns a value of this property, using the default value if the map
-     * does not contain an explicit value. */
-    public <T> T getProp(Map<DatabaseProperty, Object> map, Class<T> aClass) {
-      assert aClass == type;
-      Object v = map.get(this);
-      if (v == null) {
-        v = defaultValue;
-      }
-      return aClass.cast(v);
-    }
-
-    public static DatabaseProperty fromProto(Common.DatabaseProperty proto) {
-      return DatabaseProperty.valueOf(proto.getName());
-    }
-
-    public Common.DatabaseProperty toProto() {
-      return Common.DatabaseProperty.newBuilder().setName(name()).build();
-    }
-  }
-
-  /** Response from execute.
-   *
-   * <p>Typically a query will have a result set and rowCount = -1;
-   * a DML statement will have a rowCount and no result sets.
-   */
-  class ExecuteResult {
-    public final List<MetaResultSet> resultSets;
-
-    public ExecuteResult(List<MetaResultSet> resultSets) {
-      this.resultSets = resultSets;
-    }
-  }
-
-  /** Meta data from which a result set can be constructed.
-   *
-   * <p>If {@code updateCount} is not -1, the result is just a count. A result
-   * set cannot be constructed. */
-  class MetaResultSet {
-    public final String connectionId;
-    public final int statementId;
-    public final boolean ownStatement;
-    public final Frame firstFrame;
-    public final Signature signature;
-    public final long updateCount;
-
-    @Deprecated // to be removed before 2.0
-    protected MetaResultSet(String connectionId, int statementId,
-        boolean ownStatement, Signature signature, Frame firstFrame,
-        int updateCount) {
-      this(connectionId, statementId, ownStatement, signature, firstFrame,
-          (long) updateCount);
-    }
-
-    protected MetaResultSet(String connectionId, int statementId,
-        boolean ownStatement, Signature signature, Frame firstFrame,
-        long updateCount) {
-      this.signature = signature;
-      this.connectionId = connectionId;
-      this.statementId = statementId;
-      this.ownStatement = ownStatement;
-      this.firstFrame = firstFrame; // may be null even if signature is not 
null
-      this.updateCount = updateCount;
-    }
-
-    public static MetaResultSet create(String connectionId, int statementId,
-        boolean ownStatement, Signature signature, Frame firstFrame) {
-      return new MetaResultSet(connectionId, statementId, ownStatement,
-          Objects.requireNonNull(signature), firstFrame, -1L);
-    }
-
-    public static MetaResultSet count(String connectionId, int statementId,
-        long updateCount) {
-      assert updateCount >= 0
-          : "Meta.count(" + connectionId + ", " + statementId + ", "
-          + updateCount + ")";
-      return new MetaResultSet(connectionId, statementId, false, null, null,
-          updateCount);
-    }
-  }
-
-  /** Information necessary to convert an {@link Iterable} into a
-   * {@link org.apache.calcite.avatica.util.Cursor}. */
-  final class CursorFactory {
-    private static final FieldDescriptor CLASS_NAME_DESCRIPTOR = 
Common.CursorFactory.
-        
getDescriptor().findFieldByNumber(Common.CursorFactory.CLASS_NAME_FIELD_NUMBER);
-
-    public final Style style;
-    public final Class clazz;
-    @JsonIgnore
-    public final List<Field> fields;
-    public final List<String> fieldNames;
-
-    private CursorFactory(Style style, Class clazz, List<Field> fields,
-        List<String> fieldNames) {
-      assert (fieldNames != null)
-          == (style == Style.RECORD_PROJECTION || style == Style.MAP);
-      assert (fields != null) == (style == Style.RECORD_PROJECTION);
-      this.style = Objects.requireNonNull(style);
-      this.clazz = clazz;
-      this.fields = fields;
-      this.fieldNames = fieldNames;
-    }
-
-    @JsonCreator
-    public static CursorFactory create(@JsonProperty("style") Style style,
-        @JsonProperty("clazz") Class clazz,
-        @JsonProperty("fieldNames") List<String> fieldNames) {
-      switch (style) {
-      case OBJECT:
-        return OBJECT;
-      case ARRAY:
-        return ARRAY;
-      case LIST:
-        return LIST;
-      case RECORD:
-        return record(clazz);
-      case RECORD_PROJECTION:
-        return record(clazz, null, fieldNames);
-      case MAP:
-        return map(fieldNames);
-      default:
-        throw new AssertionError("unknown style: " + style);
-      }
-    }
-
-    public static final CursorFactory OBJECT =
-        new CursorFactory(Style.OBJECT, null, null, null);
-
-    public static final CursorFactory ARRAY =
-        new CursorFactory(Style.ARRAY, null, null, null);
-
-    public static final CursorFactory LIST =
-        new CursorFactory(Style.LIST, null, null, null);
-
-    public static CursorFactory record(Class resultClazz) {
-      return new CursorFactory(Style.RECORD, resultClazz, null, null);
-    }
-
-    public static CursorFactory record(Class resultClass, List<Field> fields,
-        List<String> fieldNames) {
-      if (fields == null) {
-        fields = new ArrayList<>();
-        for (String fieldName : fieldNames) {
-          try {
-            fields.add(resultClass.getField(fieldName));
-          } catch (NoSuchFieldException e) {
-            throw new RuntimeException(e);
-          }
-        }
-      }
-      return new CursorFactory(Style.RECORD_PROJECTION, resultClass, fields,
-          fieldNames);
-    }
-
-    public static CursorFactory map(List<String> fieldNames) {
-      return new CursorFactory(Style.MAP, null, null, fieldNames);
-    }
-
-    public static CursorFactory deduce(List<ColumnMetaData> columns,
-        Class resultClazz) {
-      if (columns.size() == 1) {
-        return OBJECT;
-      }
-      if (resultClazz == null) {
-        return ARRAY;
-      }
-      if (resultClazz.isArray()) {
-        return ARRAY;
-      }
-      if (List.class.isAssignableFrom(resultClazz)) {
-        return LIST;
-      }
-      return record(resultClazz);
-    }
-
-    public Common.CursorFactory toProto() {
-      Common.CursorFactory.Builder builder = Common.CursorFactory.newBuilder();
-
-      if (null != clazz) {
-        builder.setClassName(clazz.getName());
-      }
-      builder.setStyle(style.toProto());
-      if (null != fieldNames) {
-        builder.addAllFieldNames(fieldNames);
-      }
-
-      return builder.build();
-    }
-
-    public static CursorFactory fromProto(Common.CursorFactory proto) {
-      // Reconstruct CursorFactory
-      Class<?> clz = null;
-
-      if (proto.hasField(CLASS_NAME_DESCRIPTOR)) {
-        try {
-          clz = Class.forName(proto.getClassName());
-        } catch (ClassNotFoundException e) {
-          throw new RuntimeException(e);
-        }
-      }
-
-      return CursorFactory.create(Style.fromProto(proto.getStyle()), clz,
-          proto.getFieldNamesList());
-    }
-
-    @Override public int hashCode() {
-      return Objects.hash(clazz, fieldNames, fields, style);
-    }
-
-    @Override public boolean equals(Object o) {
-      return o == this
-          || o instanceof CursorFactory
-          && Objects.equals(clazz, ((CursorFactory) o).clazz)
-          && Objects.equals(fieldNames, ((CursorFactory) o).fieldNames)
-          && Objects.equals(fields, ((CursorFactory) o).fields)
-          && style == ((CursorFactory) o).style;
-    }
-  }
-
-  /** How logical fields are represented in the objects returned by the
-   * iterator. */
-  enum Style {
-    OBJECT,
-    RECORD,
-    RECORD_PROJECTION,
-    ARRAY,
-    LIST,
-    MAP;
-
-    public Common.CursorFactory.Style toProto() {
-      return Common.CursorFactory.Style.valueOf(name());
-    }
-
-    public static Style fromProto(Common.CursorFactory.Style proto) {
-      return Style.valueOf(proto.name());
-    }
-  }
-
-  /** Result of preparing a statement. */
-  public class Signature {
-    private static final FieldDescriptor SQL_DESCRIPTOR = Common.Signature
-        .getDescriptor().findFieldByNumber(Common.Signature.SQL_FIELD_NUMBER);
-    private static final FieldDescriptor CURSOR_FACTORY_DESCRIPTOR = 
Common.Signature
-        
.getDescriptor().findFieldByNumber(Common.Signature.CURSOR_FACTORY_FIELD_NUMBER);
-
-    public final List<ColumnMetaData> columns;
-    public final String sql;
-    public final List<AvaticaParameter> parameters;
-    public final transient Map<String, Object> internalParameters;
-    public final CursorFactory cursorFactory;
-
-    public final Meta.StatementType statementType;
-
-    /** Creates a Signature. */
-    public Signature(List<ColumnMetaData> columns,
-        String sql,
-        List<AvaticaParameter> parameters,
-        Map<String, Object> internalParameters,
-        CursorFactory cursorFactory,
-        Meta.StatementType statementType) {
-      this.columns = columns;
-      this.sql = sql;
-      this.parameters = parameters;
-      this.internalParameters = internalParameters;
-      this.cursorFactory = cursorFactory;
-      this.statementType = statementType;
-    }
-
-    /** Used by Jackson to create a Signature by de-serializing JSON. */
-    @JsonCreator
-    public static Signature create(
-        @JsonProperty("columns") List<ColumnMetaData> columns,
-        @JsonProperty("sql") String sql,
-        @JsonProperty("parameters") List<AvaticaParameter> parameters,
-        @JsonProperty("cursorFactory") CursorFactory cursorFactory,
-        @JsonProperty("statementType") Meta.StatementType statementType) {
-      return new Signature(columns, sql, parameters,
-          Collections.<String, Object>emptyMap(), cursorFactory, 
statementType);
-    }
-
-    /** Returns a copy of this Signature, substituting given CursorFactory. */
-    public Signature setCursorFactory(CursorFactory cursorFactory) {
-      return new Signature(columns, sql, parameters, internalParameters,
-          cursorFactory, statementType);
-    }
-
-    /** Creates a copy of this Signature with null lists and maps converted to
-     * empty. */
-    public Signature sanitize() {
-      if (columns == null || parameters == null || internalParameters == null
-          || statementType == null) {
-        return new Signature(sanitize(columns), sql, sanitize(parameters),
-            sanitize(internalParameters), cursorFactory,
-            Meta.StatementType.SELECT);
-      }
-      return this;
-    }
-
-    private <E> List<E> sanitize(List<E> list) {
-      return list == null ? Collections.<E>emptyList() : list;
-    }
-
-    private <K, V> Map<K, V> sanitize(Map<K, V> map) {
-      return map == null ? Collections.<K, V>emptyMap() : map;
-    }
-
-    public Common.Signature toProto() {
-      Common.Signature.Builder builder = Common.Signature.newBuilder();
-
-      if (null != sql) {
-        builder.setSql(sql);
-      }
-
-      if (null != cursorFactory) {
-        builder.setCursorFactory(cursorFactory.toProto());
-      }
-
-      if (null != columns) {
-        for (ColumnMetaData column : columns) {
-          builder.addColumns(column.toProto());
-        }
-      }
-
-      if (null != parameters) {
-        for (AvaticaParameter parameter : parameters) {
-          builder.addParameters(parameter.toProto());
-        }
-      }
-
-      return builder.build();
-    }
-
-    public static Signature fromProto(Common.Signature protoSignature) {
-      List<ColumnMetaData> metadata = new 
ArrayList<>(protoSignature.getColumnsCount());
-      for (Common.ColumnMetaData protoMetadata : 
protoSignature.getColumnsList()) {
-        metadata.add(ColumnMetaData.fromProto(protoMetadata));
-      }
-
-      List<AvaticaParameter> parameters = new 
ArrayList<>(protoSignature.getParametersCount());
-      for (Common.AvaticaParameter protoParam : 
protoSignature.getParametersList()) {
-        parameters.add(AvaticaParameter.fromProto(protoParam));
-      }
-
-      String sql = null;
-      if (protoSignature.hasField(SQL_DESCRIPTOR)) {
-        sql = protoSignature.getSql();
-      }
-
-      CursorFactory cursorFactory = null;
-      if (protoSignature.hasField(CURSOR_FACTORY_DESCRIPTOR)) {
-        cursorFactory = 
CursorFactory.fromProto(protoSignature.getCursorFactory());
-      }
-      final Meta.StatementType statementType =
-          Meta.StatementType.fromProto(protoSignature.getStatementType());
-
-      return Signature.create(metadata, sql, parameters, cursorFactory, 
statementType);
-    }
-
-    @Override public int hashCode() {
-      return Objects.hash(columns, cursorFactory, parameters, sql);
-    }
-
-    @Override public boolean equals(Object o) {
-      return o == this
-          || o instanceof Signature
-          && Objects.equals(columns, ((Signature) o).columns)
-          && Objects.equals(cursorFactory, ((Signature) o).cursorFactory)
-          && Objects.equals(parameters, ((Signature) o).parameters)
-          && Objects.equals(sql, ((Signature) o).sql);
-    }
-  }
-
-  /** A collection of rows. */
-  class Frame {
-    private static final FieldDescriptor HAS_ARRAY_VALUE_DESCRIPTOR = 
Common.ColumnValue
-        
.getDescriptor().findFieldByNumber(Common.ColumnValue.HAS_ARRAY_VALUE_FIELD_NUMBER);
-    private static final FieldDescriptor SCALAR_VALUE_DESCRIPTOR = 
Common.ColumnValue
-        
.getDescriptor().findFieldByNumber(Common.ColumnValue.SCALAR_VALUE_FIELD_NUMBER);
-    /** Frame that has zero rows and is the last frame. */
-    public static final Frame EMPTY =
-        new Frame(0, true, Collections.emptyList());
-
-    /** Frame that has zero rows but may have another frame. */
-    public static final Frame MORE =
-        new Frame(0, false, Collections.emptyList());
-
-    /** Zero-based offset of first row. */
-    public final long offset;
-    /** Whether this is definitely the last frame of rows.
-     * If true, there are no more rows.
-     * If false, there may or may not be more rows. */
-    public final boolean done;
-    /** The rows. */
-    public final Iterable<Object> rows;
-
-    public Frame(long offset, boolean done, Iterable<Object> rows) {
-      this.offset = offset;
-      this.done = done;
-      this.rows = rows;
-    }
-
-    @JsonCreator
-    public static Frame create(@JsonProperty("offset") int offset,
-        @JsonProperty("done") boolean done,
-        @JsonProperty("rows") List<Object> rows) {
-      if (offset == 0 && done && rows.isEmpty()) {
-        return EMPTY;
-      }
-      return new Frame(offset, done, rows);
-    }
-
-    public Common.Frame toProto() {
-      Common.Frame.Builder builder = Common.Frame.newBuilder();
-
-      builder.setDone(done).setOffset(offset);
-
-      for (Object row : this.rows) {
-        if (null == row) {
-          // Does this need to be persisted for some reason?
-          continue;
-        }
-
-        if (row instanceof Object[]) {
-          final Common.Row.Builder rowBuilder = Common.Row.newBuilder();
-
-          for (Object element : (Object[]) row) {
-            final Common.ColumnValue.Builder columnBuilder = 
Common.ColumnValue.newBuilder();
-
-            if (element instanceof List) {
-              columnBuilder.setHasArrayValue(true);
-              List<?> list = (List<?>) element;
-              // Add each element in the list/array to the column's value
-              for (Object listItem : list) {
-                columnBuilder.addArrayValue(serializeScalar(listItem));
-              }
-            } else {
-              // The default value, but still explicit.
-              columnBuilder.setHasArrayValue(false);
-              // Only one value for this column, a scalar.
-              columnBuilder.setScalarValue(serializeScalar(element));
-            }
-
-            // Add value to row
-            rowBuilder.addValue(columnBuilder.build());
-          }
-
-          // Collect all rows
-          builder.addRows(rowBuilder.build());
-        } else {
-          // Can a "row" be a primitive? A struct? Only an Array?
-          throw new RuntimeException("Only arrays are supported");
-        }
-      }
-
-      return builder.build();
-    }
-
-    static Common.TypedValue serializeScalar(Object element) {
-      final Common.TypedValue.Builder valueBuilder = 
Common.TypedValue.newBuilder();
-
-      // Numbers
-      if (element instanceof Byte) {
-        valueBuilder.setType(Common.Rep.BYTE).setNumberValue(((Byte) 
element).longValue());
-      } else if (element instanceof Short) {
-        valueBuilder.setType(Common.Rep.SHORT).setNumberValue(((Short) 
element).longValue());
-      } else if (element instanceof Integer) {
-        valueBuilder.setType(Common.Rep.INTEGER)
-          .setNumberValue(((Integer) element).longValue());
-      } else if (element instanceof Long) {
-        valueBuilder.setType(Common.Rep.LONG).setNumberValue((Long) element);
-      } else if (element instanceof Double) {
-        valueBuilder.setType(Common.Rep.DOUBLE).setDoubleValue((Double) 
element);
-      } else if (element instanceof Float) {
-        valueBuilder.setType(Common.Rep.FLOAT).setNumberValue(((Float) 
element).longValue());
-      } else if (element instanceof BigDecimal) {
-        valueBuilder.setType(Common.Rep.NUMBER)
-          .setDoubleValue(((BigDecimal) element).doubleValue());
-      // Strings
-      } else if (element instanceof String) {
-        valueBuilder.setType(Common.Rep.STRING)
-          .setStringValue((String) element);
-      } else if (element instanceof Character) {
-        valueBuilder.setType(Common.Rep.CHARACTER)
-          .setStringValue(element.toString());
-      // Bytes
-      } else if (element instanceof byte[]) {
-        valueBuilder.setType(Common.Rep.BYTE_STRING)
-          .setBytesValues(ByteString.copyFrom((byte[]) element));
-      // Boolean
-      } else if (element instanceof Boolean) {
-        valueBuilder.setType(Common.Rep.BOOLEAN).setBoolValue((boolean) 
element);
-      } else if (null == element) {
-        valueBuilder.setType(Common.Rep.NULL);
-      // Unhandled
-      } else {
-        throw new RuntimeException("Unhandled type in Frame: " + 
element.getClass());
-      }
-
-      return valueBuilder.build();
-    }
-
-    public static Frame fromProto(Common.Frame proto) {
-      List<Object> parsedRows = new ArrayList<>(proto.getRowsCount());
-      for (Common.Row protoRow : proto.getRowsList()) {
-        ArrayList<Object> row = new ArrayList<>(protoRow.getValueCount());
-        for (Common.ColumnValue protoColumn : protoRow.getValueList()) {
-          final Object value;
-          if (!isNewStyleColumn(protoColumn)) {
-            // Backward compatibility
-            value = parseOldStyleColumn(protoColumn);
-          } else {
-            // Current style parsing (separate scalar and array values)
-            value = parseColumn(protoColumn);
-          }
-
-          row.add(value);
-        }
-
-        parsedRows.add(row);
-      }
-
-      return new Frame(proto.getOffset(), proto.getDone(), parsedRows);
-    }
-
-    /**
-     * Determines whether this message contains the new attributes in the
-     * message. We can't directly test for the negative because our
-     * {@code hasField} trick does not work on repeated fields.
-     *
-     * @param column The protobuf column object
-     * @return True if the message is the new style, false otherwise.
-     */
-    static boolean isNewStyleColumn(Common.ColumnValue column) {
-      return column.hasField(HAS_ARRAY_VALUE_DESCRIPTOR)
-          || column.hasField(SCALAR_VALUE_DESCRIPTOR);
-    }
-
-    /**
-     * For Calcite 1.5, we made the mistake of using array length to determine 
when the value for a
-     * column is a scalar or an array. This method performs the old parsing 
for backwards
-     * compatibility.
-     *
-     * @param column The protobuf ColumnValue object
-     * @return The parsed value for this column
-     */
-    static Object parseOldStyleColumn(Common.ColumnValue column) {
-      if (column.getValueCount() > 1) {
-        List<Object> array = new ArrayList<>(column.getValueCount());
-        for (Common.TypedValue columnValue : column.getValueList()) {
-          array.add(getScalarValue(columnValue));
-        }
-        return array;
-      } else {
-        return getScalarValue(column.getValue(0));
-      }
-    }
-
-    /**
-     * Parses the value for a ColumnValue using the separated array and scalar 
attributes.
-     *
-     * @param column The protobuf ColumnValue object
-     * @return The parse value for this column
-     */
-    static Object parseColumn(Common.ColumnValue column) {
-      // Verify that we have one or the other (scalar or array)
-      validateColumnValue(column);
-
-      if (!column.hasField(SCALAR_VALUE_DESCRIPTOR)) {
-        // Array
-        List<Object> array = new ArrayList<>(column.getArrayValueCount());
-        for (Common.TypedValue arrayValue : column.getArrayValueList()) {
-          array.add(getScalarValue(arrayValue));
-        }
-        return array;
-      } else {
-        // Scalar
-        return getScalarValue(column.getScalarValue());
-      }
-    }
-
-    /**
-     * Verifies that a ColumnValue has only a scalar or array value, not both 
and not neither.
-     *
-     * @param column The protobuf ColumnValue object
-     * @throws IllegalArgumentException When the above condition is not met
-     */
-    static void validateColumnValue(Common.ColumnValue column) {
-      final boolean hasScalar = column.hasField(SCALAR_VALUE_DESCRIPTOR);
-      final boolean hasArrayValue = column.getHasArrayValue();
-
-      // These should always be different
-      if (hasScalar == hasArrayValue) {
-        throw new IllegalArgumentException("A column must have a scalar or 
array value, not "
-            + (hasScalar ? "both" : "neither"));
-      }
-    }
-
-    static Object getScalarValue(Common.TypedValue protoElement) {
-      // TODO Should these be primitives or Objects?
-      switch (protoElement.getType()) {
-      case BYTE:
-        return Long.valueOf(protoElement.getNumberValue()).byteValue();
-      case SHORT:
-        return Long.valueOf(protoElement.getNumberValue()).shortValue();
-      case INTEGER:
-        return Long.valueOf(protoElement.getNumberValue()).intValue();
-      case LONG:
-        return protoElement.getNumberValue();
-      case FLOAT:
-        return Long.valueOf(protoElement.getNumberValue()).floatValue();
-      case DOUBLE:
-        return protoElement.getDoubleValue();
-      case NUMBER:
-        // TODO more cases here to expand on? BigInteger?
-        return BigDecimal.valueOf(protoElement.getDoubleValue());
-      case STRING:
-        return protoElement.getStringValue();
-      case CHARACTER:
-        // A single character in the string
-        return protoElement.getStringValue().charAt(0);
-      case BYTE_STRING:
-        return protoElement.getBytesValues().toByteArray();
-      case BOOLEAN:
-        return protoElement.getBoolValue();
-      case NULL:
-        return null;
-      default:
-        throw new RuntimeException("Unhandled type: " + 
protoElement.getType());
-      }
-    }
-
-    @Override public int hashCode() {
-      return Objects.hash(done, offset, rows);
-    }
-
-    @Override public boolean equals(Object o) {
-      return o == this
-          || o instanceof Frame
-          && equalRows(rows, ((Frame) o).rows)
-          && offset == ((Frame) o).offset
-          && done == ((Frame) o).done;
-    }
-
-    private static boolean equalRows(Iterable<Object> rows, Iterable<Object> 
otherRows) {
-      if (null == rows) {
-        if (null != otherRows) {
-          return false;
-        }
-      } else {
-        Iterator<Object> iter1 = rows.iterator();
-        Iterator<Object> iter2 = otherRows.iterator();
-        while (iter1.hasNext() && iter2.hasNext()) {
-          Object obj1 = iter1.next();
-          Object obj2 = iter2.next();
-
-          // Can't just call equals on an array
-          if (obj1 instanceof Object[]) {
-            if (obj2 instanceof Object[]) {
-              // Compare array and array
-              if (!Arrays.equals((Object[]) obj1, (Object[]) obj2)) {
-                return false;
-              }
-            } else if (obj2 instanceof List) {
-              // compare array and list
-              @SuppressWarnings("unchecked")
-              List<Object> obj2List = (List<Object>) obj2;
-              if (!Arrays.equals((Object[]) obj1, obj2List.toArray())) {
-                return false;
-              }
-            } else {
-              // compare array and something that isn't an array will always 
fail
-              return false;
-            }
-          } else if (obj1 instanceof List) {
-            if (obj2 instanceof Object[]) {
-              // Compare list and array
-              @SuppressWarnings("unchecked")
-              List<Object> obj1List = (List<Object>) obj1;
-              if (!Arrays.equals(obj1List.toArray(), (Object[]) obj2)) {
-                return false;
-              }
-            } else if (!obj1.equals(obj2)) {
-              // compare list and something else, let it fall to equals()
-              return false;
-            }
-          } else if (!obj1.equals(obj2)) {
-            // Not an array, leave it to equals()
-            return false;
-          }
-        }
-
-        // More elements in one of the iterables
-        if (iter1.hasNext() || iter2.hasNext()) {
-          return false;
-        }
-      }
-
-      return true;
-    }
-  }
-
-  /** Connection handle. */
-  class ConnectionHandle {
-    public final String id;
-
-    @Override public String toString() {
-      return id;
-    }
-
-    @JsonCreator
-    public ConnectionHandle(@JsonProperty("id") String id) {
-      this.id = id;
-    }
-  }
-
-  /** Statement handle. */
-  class StatementHandle {
-    private static final FieldDescriptor SIGNATURE_DESCRIPTOR = 
Common.StatementHandle
-        
.getDescriptor().findFieldByNumber(Common.StatementHandle.SIGNATURE_FIELD_NUMBER);
-    public final String connectionId;
-    public final int id;
-
-    // not final because LocalService#apply(PrepareRequest)
-    /** Only present for PreparedStatement handles, null otherwise. */
-    public Signature signature;
-
-    @Override public String toString() {
-      return connectionId + "::" + Integer.toString(id);
-    }
-
-    @JsonCreator
-    public StatementHandle(
-        @JsonProperty("connectionId") String connectionId,
-        @JsonProperty("id") int id,
-        @JsonProperty("signature") Signature signature) {
-      this.connectionId = connectionId;
-      this.id = id;
-      this.signature = signature;
-    }
-
-    public Common.StatementHandle toProto() {
-      Common.StatementHandle.Builder builder = 
Common.StatementHandle.newBuilder()
-          .setConnectionId(connectionId).setId(id);
-      if (null != signature) {
-        builder.setSignature(signature.toProto());
-      }
-      return builder.build();
-    }
-
-    public static StatementHandle fromProto(Common.StatementHandle 
protoHandle) {
-      // Signature is optional in the update path for executes.
-      Signature signature = null;
-      if (protoHandle.hasField(SIGNATURE_DESCRIPTOR)) {
-        signature = Signature.fromProto(protoHandle.getSignature());
-      }
-      return new StatementHandle(protoHandle.getConnectionId(), 
protoHandle.getId(), signature);
-    }
-
-    @Override public int hashCode() {
-      return Objects.hash(connectionId, id, signature);
-    }
-
-    @Override public boolean equals(Object o) {
-      return o == this
-          || o instanceof StatementHandle
-          && Objects.equals(connectionId, ((StatementHandle) o).connectionId)
-          && Objects.equals(signature, ((StatementHandle) o).signature)
-          && id == ((StatementHandle) o).id;
-    }
-  }
-
-  /** A pojo containing various client-settable {@link java.sql.Connection} 
properties.
-   *
-   * <p>{@code java.lang} types are used here so that {@code null} can be used 
to indicate
-   * a value has no been set.</p>
-   *
-   * <p>Note: this interface is considered "experimental" and may undergo 
further changes as this
-   * functionality is extended to other aspects of state management for
-   * {@link java.sql.Connection}, {@link java.sql.Statement}, and {@link 
java.sql.ResultSet}.</p>
-   */
-  @JsonTypeInfo(
-      use = JsonTypeInfo.Id.NAME,
-      property = "connProps",
-      defaultImpl = ConnectionPropertiesImpl.class)
-  @JsonSubTypes({
-      @JsonSubTypes.Type(value = ConnectionPropertiesImpl.class, name = 
"connPropsImpl")
-  })
-  interface ConnectionProperties {
-
-    /** Overwrite fields in {@code this} with any non-null fields in {@code 
that}
-     *
-     * @return {@code this}
-     */
-    ConnectionProperties merge(ConnectionProperties that);
-
-    /** @return {@code true} when no properies have been set, {@code false} 
otherwise. */
-    @JsonIgnore
-    boolean isEmpty();
-
-    /** Set {@code autoCommit} status.
-     *
-     * @return {@code this}
-     */
-    ConnectionProperties setAutoCommit(boolean val);
-
-    Boolean isAutoCommit();
-
-    /** Set {@code readOnly} status.
-     *
-     * @return {@code this}
-     */
-    ConnectionProperties setReadOnly(boolean val);
-
-    Boolean isReadOnly();
-
-    /** Set {@code transactionIsolation} status.
-     *
-     * @return {@code this}
-     */
-    ConnectionProperties setTransactionIsolation(int val);
-
-    Integer getTransactionIsolation();
-
-    /** Set {@code catalog}.
-     *
-     * @return {@code this}
-     */
-    ConnectionProperties setCatalog(String val);
-
-    String getCatalog();
-
-    /** Set {@code schema}.
-     *
-     * @return {@code this}
-     */
-    ConnectionProperties setSchema(String val);
-
-    String getSchema();
-
-    Common.ConnectionProperties toProto();
-  }
-
-  /** API to put a result set into a statement, being careful to enforce
-   * thread-safety and not to overwrite existing open result sets. */
-  interface PrepareCallback {
-    Object getMonitor();
-    void clear() throws SQLException;
-    void assign(Signature signature, Frame firstFrame, long updateCount)
-        throws SQLException;
-    void execute() throws SQLException;
-  }
-
-  /** Type of statement. */
-  enum StatementType {
-    SELECT, INSERT, UPDATE, DELETE, UPSERT, MERGE, OTHER_DML, IS_DML,
-    CREATE, DROP, ALTER, OTHER_DDL, CALL;
-
-    public boolean canUpdate() {
-      switch(this) {
-      case INSERT:
-        return true;
-      case IS_DML:
-        return true;
-      default:
-        return false;
-      }
-    }
-
-    public Common.StatementType toProto() {
-      return Common.StatementType.valueOf(name());
-    }
-
-    public static StatementType fromProto(Common.StatementType proto) {
-      return StatementType.valueOf(proto.name());
-    }
-  }
-}
-
-// End Meta.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/src/main/java/org/apache/calcite/avatica/MetaImpl.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/MetaImpl.java 
b/avatica/src/main/java/org/apache/calcite/avatica/MetaImpl.java
deleted file mode 100644
index 7bb99fc..0000000
--- a/avatica/src/main/java/org/apache/calcite/avatica/MetaImpl.java
+++ /dev/null
@@ -1,961 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to you under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.calcite.avatica;
-
-import org.apache.calcite.avatica.remote.TypedValue;
-import org.apache.calcite.avatica.util.ArrayIteratorCursor;
-import org.apache.calcite.avatica.util.Cursor;
-import org.apache.calcite.avatica.util.IteratorCursor;
-import org.apache.calcite.avatica.util.ListIteratorCursor;
-import org.apache.calcite.avatica.util.MapIteratorCursor;
-import org.apache.calcite.avatica.util.RecordIteratorCursor;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.sql.DatabaseMetaData;
-import java.sql.SQLException;
-import java.sql.Time;
-import java.sql.Timestamp;
-import java.sql.Types;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.NoSuchElementException;
-
-/**
- * Basic implementation of {@link Meta}.
- *
- * <p>Each sub-class must implement the two remaining abstract methods,
- * {@link #prepare} and
- * {@link #prepareAndExecute}.
- * It should also override metadata methods such as {@link 
#getCatalogs(Meta.ConnectionHandle)} and
- * {@link #getTables} for the element types for which it has instances; the
- * default metadata methods return empty collections.
- */
-public abstract class MetaImpl implements Meta {
-  /** The {@link AvaticaConnection} backing {@code this}. */
-  protected final AvaticaConnection connection;
-  /** Represents the various states specific to {@link #connection}.
-   *
-   * <p>Note: this instance is used recursively with {@link #connection}'s 
getter and setter
-   * methods.</p>
-   */
-  protected final ConnectionPropertiesImpl connProps;
-
-  public MetaImpl(AvaticaConnection connection) {
-    this.connection = connection;
-    this.connProps = new ConnectionPropertiesImpl();
-  }
-
-  /** Uses a {@link org.apache.calcite.avatica.Meta.CursorFactory} to convert
-   * an {@link Iterable} into a
-   * {@link org.apache.calcite.avatica.util.Cursor}. */
-  public static Cursor createCursor(CursorFactory cursorFactory,
-      Iterable<Object> iterable) {
-    switch (cursorFactory.style) {
-    case OBJECT:
-      return new IteratorCursor<Object>(iterable.iterator()) {
-        protected Getter createGetter(int ordinal) {
-          return new ObjectGetter(ordinal);
-        }
-      };
-    case ARRAY:
-      @SuppressWarnings("unchecked") final Iterable<Object[]> iterable1 =
-          (Iterable<Object[]>) (Iterable) iterable;
-      return new ArrayIteratorCursor(iterable1.iterator());
-    case RECORD:
-      @SuppressWarnings("unchecked") final Class<Object> clazz =
-          cursorFactory.clazz;
-      return new RecordIteratorCursor<Object>(iterable.iterator(), clazz);
-    case RECORD_PROJECTION:
-      @SuppressWarnings("unchecked") final Class<Object> clazz2 =
-          cursorFactory.clazz;
-      return new RecordIteratorCursor<Object>(iterable.iterator(), clazz2,
-          cursorFactory.fields);
-    case LIST:
-      @SuppressWarnings("unchecked") final Iterable<List<Object>> iterable2 =
-          (Iterable<List<Object>>) (Iterable) iterable;
-      return new ListIteratorCursor(iterable2.iterator());
-    case MAP:
-      @SuppressWarnings("unchecked") final Iterable<Map<String, Object>>
-          iterable3 =
-          (Iterable<Map<String, Object>>) (Iterable) iterable;
-      return new MapIteratorCursor(iterable3.iterator(),
-          cursorFactory.fieldNames);
-    default:
-      throw new AssertionError("unknown style: " + cursorFactory.style);
-    }
-  }
-
-  public static List<List<Object>> collect(CursorFactory cursorFactory,
-      final Iterator<Object> iterator, List<List<Object>> list) {
-    final Iterable<Object> iterable = new Iterable<Object>() {
-      public Iterator<Object> iterator() {
-        return iterator;
-      }
-    };
-    return collect(cursorFactory, iterable, list);
-  }
-
-  public static List<List<Object>> collect(CursorFactory cursorFactory,
-      Iterable<Object> iterable, final List<List<Object>> list) {
-    switch (cursorFactory.style) {
-    case OBJECT:
-      for (Object o : iterable) {
-        list.add(Collections.singletonList(o));
-      }
-      return list;
-    case ARRAY:
-      @SuppressWarnings("unchecked") final Iterable<Object[]> iterable1 =
-          (Iterable<Object[]>) (Iterable) iterable;
-      for (Object[] objects : iterable1) {
-        list.add(Arrays.asList(objects));
-      }
-      return list;
-    case RECORD:
-    case RECORD_PROJECTION:
-      final Field[] fields;
-      switch (cursorFactory.style) {
-      case RECORD:
-        fields = cursorFactory.clazz.getFields();
-        break;
-      default:
-        fields = cursorFactory.fields.toArray(
-            new Field[cursorFactory.fields.size()]);
-      }
-      for (Object o : iterable) {
-        final Object[] objects = new Object[fields.length];
-        for (int i = 0; i < fields.length; i++) {
-          Field field = fields[i];
-          try {
-            objects[i] = field.get(o);
-          } catch (IllegalAccessException e) {
-            throw new RuntimeException(e);
-          }
-        }
-        list.add(Arrays.asList(objects));
-      }
-      return list;
-    case LIST:
-      @SuppressWarnings("unchecked") final Iterable<List<Object>> iterable2 =
-          (Iterable<List<Object>>) (Iterable) iterable;
-      for (List<Object> objects : iterable2) {
-        list.add(objects);
-      }
-      return list;
-    case MAP:
-      @SuppressWarnings("unchecked") final Iterable<Map<String, Object>>
-          iterable3 =
-          (Iterable<Map<String, Object>>) (Iterable) iterable;
-      for (Map<String, Object> map : iterable3) {
-        final List<Object> objects = new ArrayList<Object>();
-        for (String fieldName : cursorFactory.fieldNames) {
-          objects.add(map.get(fieldName));
-        }
-        list.add(objects);
-      }
-      return list;
-    default:
-      throw new AssertionError("unknown style: " + cursorFactory.style);
-    }
-  }
-
-  @Override public void openConnection(ConnectionHandle ch, Map<String, 
String> info) {
-    // dummy implementation, connection is already created at this point
-  }
-
-  @Override public void closeConnection(ConnectionHandle ch) {
-    // TODO: implement
-    //
-    // lots of Calcite tests break with this simple implementation,
-    // requires investigation
-
-//    try {
-//      connection.close();
-//    } catch (SQLException e) {
-//      throw new RuntimeException(e);
-//    }
-  }
-
-  @Override public ConnectionProperties connectionSync(ConnectionHandle ch,
-      ConnectionProperties connProps) {
-    this.connProps.merge(connProps);
-    this.connProps.setDirty(false);
-    return this.connProps;
-  }
-
-  public StatementHandle createStatement(ConnectionHandle ch) {
-    return new StatementHandle(ch.id, connection.statementCount++, null);
-  }
-
-  /** Creates an empty result set. Useful for JDBC metadata methods that are
-   * not implemented or which query entities that are not supported (e.g.
-   * triggers in Lingual). */
-  protected <E> MetaResultSet createEmptyResultSet(final Class<E> clazz) {
-    return createResultSet(Collections.<String, Object>emptyMap(),
-        fieldMetaData(clazz).columns,
-        CursorFactory.deduce(fieldMetaData(clazz).columns, null),
-        Frame.EMPTY);
-  }
-
-  public static ColumnMetaData columnMetaData(String name, int index,
-      Class<?> type) {
-    TypeInfo pair = TypeInfo.m.get(type);
-    ColumnMetaData.Rep rep =
-        ColumnMetaData.Rep.VALUE_MAP.get(type);
-    ColumnMetaData.AvaticaType scalarType =
-        ColumnMetaData.scalar(pair.sqlType, pair.sqlTypeName, rep);
-    return new ColumnMetaData(
-        index, false, true, false, false,
-        pair.primitive
-            ? DatabaseMetaData.columnNullable
-            : DatabaseMetaData.columnNoNulls,
-        true, -1, name, name, null,
-        0, 0, null, null, scalarType, true, false, false,
-        scalarType.columnClassName());
-  }
-
-  protected static ColumnMetaData.StructType fieldMetaData(Class clazz) {
-    final List<ColumnMetaData> list = new ArrayList<ColumnMetaData>();
-    for (Field field : clazz.getFields()) {
-      if (Modifier.isPublic(field.getModifiers())
-          && !Modifier.isStatic(field.getModifiers())) {
-        list.add(
-            columnMetaData(
-                AvaticaUtils.camelToUpper(field.getName()),
-                list.size() + 1, field.getType()));
-      }
-    }
-    return ColumnMetaData.struct(list);
-  }
-
-  protected MetaResultSet createResultSet(
-      Map<String, Object> internalParameters, List<ColumnMetaData> columns,
-      CursorFactory cursorFactory, Frame firstFrame) {
-    try {
-      final AvaticaStatement statement = connection.createStatement();
-      final Signature signature =
-          new Signature(columns, "", Collections.<AvaticaParameter>emptyList(),
-              internalParameters, cursorFactory, Meta.StatementType.SELECT);
-      return MetaResultSet.create(connection.id, statement.getId(), true,
-          signature, firstFrame);
-    } catch (SQLException e) {
-      throw new RuntimeException(e);
-    }
-  }
-
-  /** An object that has a name. */
-  public interface Named {
-    @JsonIgnore String getName();
-  }
-
-  /** Metadata describing a column. */
-  public static class MetaColumn implements Named {
-    public final String tableCat;
-    public final String tableSchem;
-    public final String tableName;
-    public final String columnName;
-    public final int dataType;
-    public final String typeName;
-    public final int columnSize;
-    public final String bufferLength = null;
-    public final Integer decimalDigits;
-    public final int numPrecRadix;
-    public final int nullable;
-    public final String remarks = null;
-    public final String columnDef = null;
-    public final String sqlDataType = null;
-    public final String sqlDatetimeSub = null;
-    public final int charOctetLength;
-    public final int ordinalPosition;
-    public final String isNullable;
-    public final String scopeCatalog = null;
-    public final String scopeSchema = null;
-    public final String scopeTable = null;
-    public final String sourceDataType = null;
-    public final String isAutoincrement = null;
-    public final String isGeneratedcolumn = null;
-
-    public MetaColumn(
-        String tableCat,
-        String tableSchem,
-        String tableName,
-        String columnName,
-        int dataType,
-        String typeName,
-        int columnSize,
-        Integer decimalDigits,
-        int numPrecRadix,
-        int nullable,
-        int charOctetLength,
-        int ordinalPosition,
-        String isNullable) {
-      this.tableCat = tableCat;
-      this.tableSchem = tableSchem;
-      this.tableName = tableName;
-      this.columnName = columnName;
-      this.dataType = dataType;
-      this.typeName = typeName;
-      this.columnSize = columnSize;
-      this.decimalDigits = decimalDigits;
-      this.numPrecRadix = numPrecRadix;
-      this.nullable = nullable;
-      this.charOctetLength = charOctetLength;
-      this.ordinalPosition = ordinalPosition;
-      this.isNullable = isNullable;
-    }
-
-    public String getName() {
-      return columnName;
-    }
-  }
-
-  /** Metadata describing a TypeInfo. */
-
-  /** Metadata describing a table. */
-  public static class MetaTable implements Named {
-    public final String tableCat;
-    public final String tableSchem;
-    public final String tableName;
-    public final String tableType;
-    public final String remarks = null;
-    public final String typeCat = null;
-    public final String typeSchem = null;
-    public final String typeName = null;
-    public final String selfReferencingColName = null;
-    public final String refGeneration = null;
-
-    public MetaTable(String tableCat,
-        String tableSchem,
-        String tableName,
-        String tableType) {
-      this.tableCat = tableCat;
-      this.tableSchem = tableSchem;
-      this.tableName = tableName;
-      this.tableType = tableType;
-    }
-
-    public String getName() {
-      return tableName;
-    }
-  }
-
-  /** Metadata describing a schema. */
-  public static class MetaSchema implements Named {
-    public final String tableCatalog;
-    public final String tableSchem;
-
-    public MetaSchema(
-        String tableCatalog,
-        String tableSchem) {
-      this.tableCatalog = tableCatalog;
-      this.tableSchem = tableSchem;
-    }
-
-    public String getName() {
-      return tableSchem;
-    }
-  }
-
-  /** Metadata describing a catalog. */
-  public static class MetaCatalog implements Named {
-    public final String tableCat;
-
-    public MetaCatalog(
-        String tableCatalog) {
-      this.tableCat = tableCatalog;
-    }
-
-    public String getName() {
-      return tableCat;
-    }
-  }
-
-  /** Metadata describing a table type. */
-  public static class MetaTableType {
-    public final String tableType;
-
-    public MetaTableType(String tableType) {
-      this.tableType = tableType;
-    }
-  }
-
-  /** Metadata describing a procedure. */
-  public static class MetaProcedure {
-  }
-
-  /** Metadata describing a procedure column. */
-  public static class MetaProcedureColumn {
-  }
-
-  /** Metadata describing a column privilege. */
-  public static class MetaColumnPrivilege {
-  }
-
-  /** Metadata describing a table privilege. */
-  public static class MetaTablePrivilege {
-  }
-
-  /** Metadata describing the best identifier for a row. */
-  public static class MetaBestRowIdentifier {
-  }
-
-  /** Metadata describing a version column. */
-  public static class MetaVersionColumn {
-    public final short scope;
-    public final String columnName;
-    public final int dataType;
-    public final String typeName;
-    public final int columnSize;
-    public final int bufferLength;
-    public final short decimalDigits;
-    public final short pseudoColumn;
-
-    MetaVersionColumn(short scope, String columnName, int dataType,
-        String typeName, int columnSize, int bufferLength, short decimalDigits,
-        short pseudoColumn) {
-      this.scope = scope;
-      this.columnName = columnName;
-      this.dataType = dataType;
-      this.typeName = typeName;
-      this.columnSize = columnSize;
-      this.bufferLength = bufferLength;
-      this.decimalDigits = decimalDigits;
-      this.pseudoColumn = pseudoColumn;
-    }
-  }
-
-  /** Metadata describing a primary key. */
-  public static class MetaPrimaryKey {
-    public final String tableCat;
-    public final String tableSchem;
-    public final String tableName;
-    public final String columnName;
-    public final short keySeq;
-    public final String pkName;
-
-    MetaPrimaryKey(String tableCat, String tableSchem, String tableName,
-        String columnName, short keySeq, String pkName) {
-      this.tableCat = tableCat;
-      this.tableSchem = tableSchem;
-      this.tableName = tableName;
-      this.columnName = columnName;
-      this.keySeq = keySeq;
-      this.pkName = pkName;
-    }
-  }
-
-  /** Metadata describing an imported key. */
-  public static class MetaImportedKey {
-  }
-
-  /** Metadata describing an exported key. */
-  public static class MetaExportedKey {
-  }
-
-  /** Metadata describing a cross reference. */
-  public static class MetaCrossReference {
-  }
-
-  /** Metadata describing type info. */
-  public static class MetaTypeInfo implements Named {
-    public final String typeName;
-    public final int dataType;
-    public final int precision;
-    public final String literalPrefix;
-    public final String literalSuffix;
-    //TODO: Add create parameter for type on DDL
-    public final String createParams = null;
-    public final int nullable;
-    public final boolean caseSensitive;
-    public final int searchable;
-    public final boolean unsignedAttribute;
-    public final boolean fixedPrecScale;
-    public final boolean autoIncrement;
-    public final String localTypeName;
-    public final int minimumScale;
-    public final int maximumScale;
-    public final int sqlDataType = 0;
-    public final int sqlDatetimeSub = 0;
-    public final Integer numPrecRadix; //nullable int
-
-    public MetaTypeInfo(
-        String typeName,
-        int dataType,
-        int precision,
-        String literalPrefix,
-        String literalSuffix,
-        int nullable,
-        boolean caseSensitive,
-        int searchable,
-        boolean unsignedAttribute,
-        boolean fixedPrecScale,
-        boolean autoIncrement,
-        int minimumScale,
-        int maximumScale,
-        int numPrecRadix) {
-      this.typeName = typeName;
-      this.dataType = dataType;
-      this.precision = precision;
-      this.literalPrefix = literalPrefix;
-      this.literalSuffix = literalSuffix;
-      this.nullable = nullable;
-      this.caseSensitive = caseSensitive;
-      this.searchable = searchable;
-      this.unsignedAttribute = unsignedAttribute;
-      this.fixedPrecScale = fixedPrecScale;
-      this.autoIncrement = autoIncrement;
-      this.localTypeName = typeName;
-      // Make min to be 0 instead of -1
-      this.minimumScale = minimumScale == -1 ? 0 : minimumScale;
-      this.maximumScale = maximumScale == -1 ? 0 : maximumScale;
-      this.numPrecRadix = numPrecRadix == 0 ? null : numPrecRadix;
-    }
-
-    public String getName() {
-      return typeName;
-    }
-  }
-
-  /** Metadata describing index info. */
-  public static class MetaIndexInfo {
-  }
-
-  /** Metadata describing a user-defined type. */
-  public static class MetaUdt {
-  }
-
-  /** Metadata describing a super-type. */
-  public static class MetaSuperType {
-  }
-
-  /** Metadata describing an attribute. */
-  public static class MetaAttribute {
-  }
-
-  /** Metadata describing a client info property. */
-  public static class MetaClientInfoProperty {
-  }
-
-  /** Metadata describing a function. */
-  public static class MetaFunction {
-  }
-
-  /** Metadata describing a function column. */
-  public static class MetaFunctionColumn {
-  }
-
-  /** Metadata describing a pseudo column. */
-  public static class MetaPseudoColumn {
-  }
-
-  /** Metadata describing a super-table. */
-  public static class MetaSuperTable {
-  }
-
-  public Map<DatabaseProperty, Object> getDatabaseProperties(ConnectionHandle 
ch) {
-    return Collections.emptyMap();
-  }
-
-  public MetaResultSet getTables(ConnectionHandle ch,
-      String catalog,
-      Pat schemaPattern,
-      Pat tableNamePattern,
-      List<String> typeList) {
-    return createEmptyResultSet(MetaTable.class);
-  }
-
-  public MetaResultSet getColumns(ConnectionHandle ch, String catalog,
-      Pat schemaPattern,
-      Pat tableNamePattern,
-      Pat columnNamePattern) {
-    return createEmptyResultSet(MetaColumn.class);
-  }
-
-  public MetaResultSet getSchemas(ConnectionHandle ch, String catalog, Pat 
schemaPattern) {
-    return createEmptyResultSet(MetaSchema.class);
-  }
-
-  public MetaResultSet getCatalogs(ConnectionHandle ch) {
-    return createEmptyResultSet(MetaCatalog.class);
-  }
-
-  public MetaResultSet getTableTypes(ConnectionHandle ch) {
-    return createEmptyResultSet(MetaTableType.class);
-  }
-
-  public MetaResultSet getProcedures(ConnectionHandle ch,
-      String catalog,
-      Pat schemaPattern,
-      Pat procedureNamePattern) {
-    return createEmptyResultSet(MetaProcedure.class);
-  }
-
-  public MetaResultSet getProcedureColumns(ConnectionHandle ch,
-      String catalog,
-      Pat schemaPattern,
-      Pat procedureNamePattern,
-      Pat columnNamePattern) {
-    return createEmptyResultSet(MetaProcedureColumn.class);
-  }
-
-  public MetaResultSet getColumnPrivileges(ConnectionHandle ch,
-      String catalog,
-      String schema,
-      String table,
-      Pat columnNamePattern) {
-    return createEmptyResultSet(MetaColumnPrivilege.class);
-  }
-
-  public MetaResultSet getTablePrivileges(ConnectionHandle ch,
-      String catalog,
-      Pat schemaPattern,
-      Pat tableNamePattern) {
-    return createEmptyResultSet(MetaTablePrivilege.class);
-  }
-
-  public MetaResultSet getBestRowIdentifier(ConnectionHandle ch,
-      String catalog,
-      String schema,
-      String table,
-      int scope,
-      boolean nullable) {
-    return createEmptyResultSet(MetaBestRowIdentifier.class);
-  }
-
-  public MetaResultSet getVersionColumns(ConnectionHandle ch,
-      String catalog,
-      String schema,
-      String table) {
-    return createEmptyResultSet(MetaVersionColumn.class);
-  }
-
-  public MetaResultSet getPrimaryKeys(ConnectionHandle ch,
-      String catalog,
-      String schema,
-      String table) {
-    return createEmptyResultSet(MetaPrimaryKey.class);
-  }
-
-  public MetaResultSet getImportedKeys(ConnectionHandle ch,
-      String catalog,
-      String schema,
-      String table) {
-    return createEmptyResultSet(MetaImportedKey.class);
-  }
-
-  public MetaResultSet getExportedKeys(ConnectionHandle ch,
-      String catalog,
-      String schema,
-      String table) {
-    return createEmptyResultSet(MetaExportedKey.class);
-  }
-
-  public MetaResultSet getCrossReference(ConnectionHandle ch,
-      String parentCatalog,
-      String parentSchema,
-      String parentTable,
-      String foreignCatalog,
-      String foreignSchema,
-      String foreignTable) {
-    return createEmptyResultSet(MetaCrossReference.class);
-  }
-
-  public MetaResultSet getTypeInfo(ConnectionHandle ch) {
-    return createEmptyResultSet(MetaTypeInfo.class);
-  }
-
-  public MetaResultSet getIndexInfo(ConnectionHandle ch,
-      String catalog,
-      String schema,
-      String table,
-      boolean unique,
-      boolean approximate) {
-    return createEmptyResultSet(MetaIndexInfo.class);
-  }
-
-  public MetaResultSet getUDTs(ConnectionHandle ch,
-      String catalog,
-      Pat schemaPattern,
-      Pat typeNamePattern,
-      int[] types) {
-    return createEmptyResultSet(MetaUdt.class);
-  }
-
-  public MetaResultSet getSuperTypes(ConnectionHandle ch,
-      String catalog,
-      Pat schemaPattern,
-      Pat typeNamePattern) {
-    return createEmptyResultSet(MetaSuperType.class);
-  }
-
-  public MetaResultSet getSuperTables(ConnectionHandle ch,
-      String catalog,
-      Pat schemaPattern,
-      Pat tableNamePattern) {
-    return createEmptyResultSet(MetaSuperTable.class);
-  }
-
-  public MetaResultSet getAttributes(ConnectionHandle ch,
-      String catalog,
-      Pat schemaPattern,
-      Pat typeNamePattern,
-      Pat attributeNamePattern) {
-    return createEmptyResultSet(MetaAttribute.class);
-  }
-
-  public MetaResultSet getClientInfoProperties(ConnectionHandle ch) {
-    return createEmptyResultSet(MetaClientInfoProperty.class);
-  }
-
-  public MetaResultSet getFunctions(ConnectionHandle ch,
-      String catalog,
-      Pat schemaPattern,
-      Pat functionNamePattern) {
-    return createEmptyResultSet(MetaFunction.class);
-  }
-
-  public MetaResultSet getFunctionColumns(ConnectionHandle ch,
-      String catalog,
-      Pat schemaPattern,
-      Pat functionNamePattern,
-      Pat columnNamePattern) {
-    return createEmptyResultSet(MetaFunctionColumn.class);
-  }
-
-  public MetaResultSet getPseudoColumns(ConnectionHandle ch,
-      String catalog,
-      Pat schemaPattern,
-      Pat tableNamePattern,
-      Pat columnNamePattern) {
-    return createEmptyResultSet(MetaPseudoColumn.class);
-  }
-
-  @Override public Iterable<Object> createIterable(StatementHandle handle, 
QueryState state,
-      Signature signature, List<TypedValue> parameterValues, Frame firstFrame) 
{
-    if (firstFrame != null && firstFrame.done) {
-      return firstFrame.rows;
-    }
-    AvaticaStatement stmt;
-    try {
-      stmt = connection.lookupStatement(handle);
-    } catch (SQLException e) {
-      throw new RuntimeException(e);
-    }
-    return new FetchIterable(stmt, state,
-        firstFrame, parameterValues);
-  }
-
-  public Frame fetch(AvaticaStatement stmt, List<TypedValue> parameterValues,
-      long offset, int fetchMaxRowCount) throws NoSuchStatementException, 
MissingResultsException {
-    return null;
-  }
-
-  /** Information about a type. */
-  private static class TypeInfo {
-    private static Map<Class<?>, TypeInfo> m =
-        new HashMap<Class<?>, TypeInfo>();
-    static {
-      put(boolean.class, true, Types.BOOLEAN, "BOOLEAN");
-      put(Boolean.class, false, Types.BOOLEAN, "BOOLEAN");
-      put(byte.class, true, Types.TINYINT, "TINYINT");
-      put(Byte.class, false, Types.TINYINT, "TINYINT");
-      put(short.class, true, Types.SMALLINT, "SMALLINT");
-      put(Short.class, false, Types.SMALLINT, "SMALLINT");
-      put(int.class, true, Types.INTEGER, "INTEGER");
-      put(Integer.class, false, Types.INTEGER, "INTEGER");
-      put(long.class, true, Types.BIGINT, "BIGINT");
-      put(Long.class, false, Types.BIGINT, "BIGINT");
-      put(float.class, true, Types.FLOAT, "FLOAT");
-      put(Float.class, false, Types.FLOAT, "FLOAT");
-      put(double.class, true, Types.DOUBLE, "DOUBLE");
-      put(Double.class, false, Types.DOUBLE, "DOUBLE");
-      put(String.class, false, Types.VARCHAR, "VARCHAR");
-      put(java.sql.Date.class, false, Types.DATE, "DATE");
-      put(Time.class, false, Types.TIME, "TIME");
-      put(Timestamp.class, false, Types.TIMESTAMP, "TIMESTAMP");
-    }
-
-    private final boolean primitive;
-    private final int sqlType;
-    private final String sqlTypeName;
-
-    public TypeInfo(boolean primitive, int sqlType, String sqlTypeName) {
-      this.primitive = primitive;
-      this.sqlType = sqlType;
-      this.sqlTypeName = sqlTypeName;
-    }
-
-    static void put(Class clazz, boolean primitive, int sqlType,
-        String sqlTypeName) {
-      m.put(clazz, new TypeInfo(primitive, sqlType, sqlTypeName));
-    }
-  }
-
-  /** Iterator that never returns any elements. */
-  private static class EmptyIterator implements Iterator<Object> {
-    public static final Iterator<Object> INSTANCE = new EmptyIterator();
-
-    public void remove() {
-      throw new UnsupportedOperationException();
-    }
-
-    public boolean hasNext() {
-      return false;
-    }
-
-    public Object next() {
-      throw new NoSuchElementException();
-    }
-  }
-
-  /** Iterable that yields an iterator over rows coming from a sequence of
-   * {@link Meta.Frame}s. */
-  private class FetchIterable implements Iterable<Object> {
-    private final AvaticaStatement stmt;
-    private final QueryState state;
-    private final Frame firstFrame;
-    private final List<TypedValue> parameterValues;
-
-    public FetchIterable(AvaticaStatement stmt, QueryState state, Frame 
firstFrame,
-        List<TypedValue> parameterValues) {
-      this.stmt = stmt;
-      this.state = state;
-      this.firstFrame = firstFrame;
-      this.parameterValues = parameterValues;
-    }
-
-    public Iterator<Object> iterator() {
-      return new FetchIterator(stmt, state, firstFrame, parameterValues);
-    }
-  }
-
-  /** Iterator over rows coming from a sequence of {@link Meta.Frame}s. */
-  private class FetchIterator implements Iterator<Object> {
-    private final AvaticaStatement stmt;
-    private final QueryState state;
-    private Frame frame;
-    private Iterator<Object> rows;
-    private List<TypedValue> parameterValues;
-    private List<TypedValue> originalParameterValues;
-    private long currentOffset = 0;
-
-    public FetchIterator(AvaticaStatement stmt, QueryState state, Frame 
firstFrame,
-        List<TypedValue> parameterValues) {
-      this.stmt = stmt;
-      this.state = state;
-      this.parameterValues = parameterValues;
-      this.originalParameterValues = parameterValues;
-      if (firstFrame == null) {
-        frame = Frame.MORE;
-        rows = EmptyIterator.INSTANCE;
-      } else {
-        frame = firstFrame;
-        rows = firstFrame.rows.iterator();
-      }
-      moveNext();
-    }
-
-    public void remove() {
-      throw new UnsupportedOperationException("remove");
-    }
-
-    public boolean hasNext() {
-      return rows != null;
-    }
-
-    public Object next() {
-      if (rows == null) {
-        throw new NoSuchElementException();
-      }
-      final Object o = rows.next();
-      currentOffset++;
-      moveNext();
-      return o;
-    }
-
-    private void moveNext() {
-      for (;;) {
-        if (rows.hasNext()) {
-          break;
-        }
-        if (frame.done) {
-          rows = null;
-          break;
-        }
-        try {
-          // currentOffset updated after element is read from `rows` iterator
-          frame = fetch(stmt.handle, currentOffset, 
AvaticaStatement.DEFAULT_FETCH_SIZE);
-        } catch (NoSuchStatementException e) {
-          resetStatement();
-          // re-fetch the batch where we left off
-          continue;
-        } catch (MissingResultsException e) {
-          try {
-            // We saw the statement, but it didnt' have a resultset 
initialized. So, reset it.
-            if (!stmt.syncResults(state, currentOffset)) {
-              // This returned false, so there aren't actually any more 
results to iterate over
-              frame = null;
-              rows = null;
-              break;
-            }
-            // syncResults returning true means we need to fetch those results
-          } catch (NoSuchStatementException e1) {
-            // Tried to reset the result set, but lost the statement, save a 
loop before retrying.
-            resetStatement();
-            // Will just loop back around to a MissingResultsException, but 
w/e recursion
-          }
-          // Kick back to the top to try to fetch again (in both branches)
-          continue;
-        }
-        parameterValues = null; // don't execute next time
-        if (frame == null) {
-          rows = null;
-          break;
-        }
-        // It is valid for rows to be empty, so we go around the loop again to
-        // check
-        rows = frame.rows.iterator();
-      }
-    }
-
-    private void resetStatement() {
-      // If we have to reset the statement, we need to reset the 
parameterValues too
-      parameterValues = originalParameterValues;
-      // Defer to the statement to reset itself
-      stmt.resetStatement();
-    }
-  }
-
-  /** Returns whether a list of parameter values has any null elements. */
-  public static boolean checkParameterValueHasNull(List<TypedValue> 
parameterValues) {
-    for (TypedValue x : parameterValues) {
-      if (x == null) {
-        return true;
-      }
-    }
-    return false;
-  }
-}
-
-// End MetaImpl.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/src/main/java/org/apache/calcite/avatica/MissingResultsException.java
----------------------------------------------------------------------
diff --git 
a/avatica/src/main/java/org/apache/calcite/avatica/MissingResultsException.java 
b/avatica/src/main/java/org/apache/calcite/avatica/MissingResultsException.java
deleted file mode 100644
index 7746769..0000000
--- 
a/avatica/src/main/java/org/apache/calcite/avatica/MissingResultsException.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to you under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.calcite.avatica;
-
-import org.apache.calcite.avatica.Meta.StatementHandle;
-
-import java.sql.ResultSet;
-
-/**
- * An Exception which denotes that a cached Statement is present but has no 
{@link ResultSet}.
- */
-public class MissingResultsException extends Exception {
-
-  private static final long serialVersionUID = 1L;
-
-  private final StatementHandle handle;
-
-  public MissingResultsException(StatementHandle handle) {
-    this.handle = handle;
-  }
-
-  public StatementHandle getHandle() {
-    return handle;
-  }
-}
-
-// End MissingResultsException.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/src/main/java/org/apache/calcite/avatica/NoSuchConnectionException.java
----------------------------------------------------------------------
diff --git 
a/avatica/src/main/java/org/apache/calcite/avatica/NoSuchConnectionException.java
 
b/avatica/src/main/java/org/apache/calcite/avatica/NoSuchConnectionException.java
deleted file mode 100644
index b5a940d..0000000
--- 
a/avatica/src/main/java/org/apache/calcite/avatica/NoSuchConnectionException.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to you under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.calcite.avatica;
-
-/**
- * An Exception that denotes that the given Connection is not cached.
- */
-public class NoSuchConnectionException extends RuntimeException {
-
-  private static final long serialVersionUID = 1L;
-
-  private final String connectionId;
-
-  public NoSuchConnectionException(String connectionId) {
-    this.connectionId = connectionId;
-  }
-
-  public String getConnectionId() {
-    return connectionId;
-  }
-}
-
-// End NoSuchConnectionException.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/src/main/java/org/apache/calcite/avatica/NoSuchStatementException.java
----------------------------------------------------------------------
diff --git 
a/avatica/src/main/java/org/apache/calcite/avatica/NoSuchStatementException.java
 
b/avatica/src/main/java/org/apache/calcite/avatica/NoSuchStatementException.java
deleted file mode 100644
index 321011b..0000000
--- 
a/avatica/src/main/java/org/apache/calcite/avatica/NoSuchStatementException.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to you under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.calcite.avatica;
-
-import org.apache.calcite.avatica.Meta.StatementHandle;
-
-/**
- * An Exception that denotes that the given Statement is not cached.
- */
-public class NoSuchStatementException extends Exception {
-
-  private static final long serialVersionUID = 1L;
-
-  private final StatementHandle stmtHandle;
-
-  public NoSuchStatementException(StatementHandle stmtHandle) {
-    this.stmtHandle = stmtHandle;
-  }
-
-  public StatementHandle getStatementHandle() {
-    return stmtHandle;
-  }
-}
-
-// End NoSuchStatementException.java

Reply via email to