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/10/23 04:38:50 UTC

[01/11] incubator-calcite git commit: [CALCITE-912] Add Avatica OpenConnectionRequest (Bruno Dumon)

Repository: incubator-calcite
Updated Branches:
  refs/heads/master d50c46a1a -> 86610552e


http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/avatica/src/main/java/org/apache/calcite/avatica/remote/Service.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/Service.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/Service.java
index ae3bd77..3717ab5 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/Service.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/Service.java
@@ -52,6 +52,7 @@ public interface Service {
   FetchResponse apply(FetchRequest request);
   CreateStatementResponse apply(CreateStatementRequest request);
   CloseStatementResponse apply(CloseStatementRequest request);
+  OpenConnectionResponse apply(OpenConnectionRequest request);
   CloseConnectionResponse apply(CloseConnectionRequest request);
   ConnectionSyncResponse apply(ConnectionSyncRequest request);
   DatabasePropertyResponse apply(DatabasePropertyRequest request);
@@ -82,6 +83,8 @@ public interface Service {
           name = "createStatement"),
       @JsonSubTypes.Type(value = CloseStatementRequest.class,
           name = "closeStatement"),
+      @JsonSubTypes.Type(value = OpenConnectionRequest.class,
+          name = "openConnection"),
       @JsonSubTypes.Type(value = CloseConnectionRequest.class,
           name = "closeConnection"),
       @JsonSubTypes.Type(value = ConnectionSyncRequest.class, name = "connectionSync"),
@@ -98,6 +101,7 @@ public interface Service {
       property = "response",
       defaultImpl = ResultSetResponse.class)
   @JsonSubTypes({
+      @JsonSubTypes.Type(value = OpenConnectionResponse.class, name = "openConnection"),
       @JsonSubTypes.Type(value = ResultSetResponse.class, name = "resultSet"),
       @JsonSubTypes.Type(value = PrepareResponse.class, name = "prepare"),
       @JsonSubTypes.Type(value = FetchResponse.class, name = "fetch"),
@@ -116,8 +120,19 @@ public interface Service {
   }
 
   /** Request for
-   * {@link org.apache.calcite.avatica.Meta#getCatalogs()}. */
+   * {@link org.apache.calcite.avatica.Meta#getCatalogs(Meta.ConnectionHandle)}. */
   class CatalogsRequest extends Request {
+    public final String connectionId;
+
+    public CatalogsRequest() {
+      connectionId = null;
+    }
+
+    @JsonCreator
+    public CatalogsRequest(@JsonProperty("connectionId") String connectionId) {
+      this.connectionId = connectionId;
+    }
+
     ResultSetResponse accept(Service service) {
       return service.apply(this);
     }
@@ -128,31 +143,67 @@ public interface Service {
             "Expected CatalogsRequest, but got " + genericMsg.getClass().getName());
       }
 
-      // No state to set
-      return new CatalogsRequest();
+      final Requests.CatalogsRequest msg = (Requests.CatalogsRequest) genericMsg;
+      final Descriptor desc = msg.getDescriptorForType();
+
+      String connectionId = null;
+      if (ProtobufService.hasField(msg, desc,
+          Requests.CatalogsRequest.CONNECTION_ID_FIELD_NUMBER)) {
+        connectionId = msg.getConnectionId();
+      }
+
+      return new CatalogsRequest(connectionId);
     }
 
     @Override Requests.CatalogsRequest serialize() {
-      return Requests.CatalogsRequest.newBuilder().build();
+      Requests.CatalogsRequest.Builder builder = Requests.CatalogsRequest.newBuilder();
+
+      if (null != connectionId) {
+        builder.setConnectionId(connectionId);
+      }
+
+      return builder.build();
     }
 
     @Override public int hashCode() {
-      return 0;
+      return connectionId == null ? 0 : connectionId.hashCode();
     }
 
     @Override public boolean equals(Object o) {
       if (o == this) {
         return true;
       }
-      return o instanceof CatalogsRequest;
+
+      if (o instanceof CatalogsRequest) {
+        CatalogsRequest other = (CatalogsRequest) o;
+
+        if (null == connectionId) {
+          if (null != other.connectionId) {
+            return false;
+          }
+        } else if (!connectionId.equals(other.connectionId)) {
+          return false;
+        }
+
+        return true;
+      }
+
+      return false;
     }
   }
 
   /** Request for
-   * {@link org.apache.calcite.avatica.Meta#getDatabaseProperties()}. */
+   * {@link org.apache.calcite.avatica.Meta#getDatabaseProperties(Meta.ConnectionHandle)}. */
   class DatabasePropertyRequest extends Request {
-    @JsonCreator
+    public final String connectionId;
+
     public DatabasePropertyRequest() {
+      connectionId = null;
+    }
+
+    @JsonCreator
+    public DatabasePropertyRequest(@JsonProperty("connectionId") String connectionId) {
+      this.connectionId = connectionId;
     }
 
     DatabasePropertyResponse accept(Service service) {
@@ -165,38 +216,73 @@ public interface Service {
             "Expected DatabasePropertyRequest, but got " + genericMsg.getClass().getName());
       }
 
-      return new DatabasePropertyRequest();
+      final Requests.DatabasePropertyRequest msg = (Requests.DatabasePropertyRequest) genericMsg;
+      final Descriptor desc = msg.getDescriptorForType();
+
+      String connectionId = null;
+      if (ProtobufService.hasField(msg, desc,
+          Requests.DatabasePropertyRequest.CONNECTION_ID_FIELD_NUMBER)) {
+        connectionId = msg.getConnectionId();
+      }
+
+      return new DatabasePropertyRequest(connectionId);
     }
 
     @Override Requests.DatabasePropertyRequest serialize() {
-      return Requests.DatabasePropertyRequest.newBuilder().build();
+      Requests.DatabasePropertyRequest.Builder builder =
+          Requests.DatabasePropertyRequest.newBuilder();
+
+      if (null != connectionId) {
+        builder.setConnectionId(connectionId);
+      }
+
+      return builder.build();
     }
 
     @Override public int hashCode() {
-      return 0;
+      return connectionId == null ? 0 : connectionId.hashCode();
     }
 
     @Override public boolean equals(Object o) {
       if (o == this) {
         return true;
       }
-      return o instanceof DatabasePropertyRequest;
+
+      if (o instanceof DatabasePropertyRequest) {
+        DatabasePropertyRequest other = (DatabasePropertyRequest) o;
+
+        if (null == connectionId) {
+          if (null != other.connectionId) {
+            return false;
+          }
+        } else if (!connectionId.equals(other.connectionId)) {
+          return false;
+        }
+
+        return true;
+      }
+
+      return false;
     }
   }
   /** Request for
-   * {@link Meta#getSchemas(String, org.apache.calcite.avatica.Meta.Pat)}. */
+   * {@link Meta#getSchemas(Meta.ConnectionHandle, String, Meta.Pat)}. */
   class SchemasRequest extends Request {
+    public final String connectionId;
     public final String catalog;
     public final String schemaPattern;
 
     SchemasRequest() {
+      connectionId = null;
       catalog = null;
       schemaPattern = null;
     }
 
     @JsonCreator
-    public SchemasRequest(@JsonProperty("catalog") String catalog,
+    public SchemasRequest(@JsonProperty("connectionId") String connectionId,
+        @JsonProperty("catalog") String catalog,
         @JsonProperty("schemaPattern") String schemaPattern) {
+      this.connectionId = connectionId;
       this.catalog = catalog;
       this.schemaPattern = schemaPattern;
     }
@@ -214,6 +300,11 @@ public interface Service {
       final Requests.SchemasRequest msg = (Requests.SchemasRequest) genericMsg;
       final Descriptor desc = msg.getDescriptorForType();
 
+      String connectionId = null;
+      if (ProtobufService.hasField(msg, desc, Requests.SchemasRequest.CONNECTION_ID_FIELD_NUMBER)) {
+        connectionId = msg.getConnectionId();
+      }
+
       String catalog = null;
       if (ProtobufService.hasField(msg, desc, Requests.SchemasRequest.CATALOG_FIELD_NUMBER)) {
         catalog = msg.getCatalog();
@@ -225,11 +316,14 @@ public interface Service {
         schemaPattern = msg.getSchemaPattern();
       }
 
-      return new SchemasRequest(catalog, schemaPattern);
+      return new SchemasRequest(connectionId, catalog, schemaPattern);
     }
 
     @Override Requests.SchemasRequest serialize() {
       Requests.SchemasRequest.Builder builder = Requests.SchemasRequest.newBuilder();
+      if (null != connectionId) {
+        builder.setConnectionId(connectionId);
+      }
       if (null != catalog) {
         builder.setCatalog(catalog);
       }
@@ -243,6 +337,7 @@ public interface Service {
     @Override public int hashCode() {
       final int prime = 31;
       int result = 1;
+      result = prime * result + ((connectionId == null) ? 0 : connectionId.hashCode());
       result = prime * result + ((catalog == null) ? 0 : catalog.hashCode());
       result = prime * result + ((schemaPattern == null) ? 0 : schemaPattern.hashCode());
       return result;
@@ -255,6 +350,14 @@ public interface Service {
       if (o instanceof SchemasRequest) {
         SchemasRequest other = (SchemasRequest) o;
 
+        if (null == connectionId) {
+          if (null != other.connectionId) {
+            return false;
+          }
+        } else if (!connectionId.equals(other.connectionId)) {
+          return false;
+        }
+
         if (null == catalog) {
           // We're null, other is not
           if (null != other.catalog) {
@@ -281,15 +384,17 @@ public interface Service {
   }
 
   /** Request for
-   * {@link Meta#getTables(String, org.apache.calcite.avatica.Meta.Pat, org.apache.calcite.avatica.Meta.Pat, java.util.List)}
+   * {@link Meta#getTables(Meta.ConnectionHandle, String, org.apache.calcite.avatica.Meta.Pat, org.apache.calcite.avatica.Meta.Pat, java.util.List)}
    */
   class TablesRequest extends Request {
+    public final String connectionId;
     public final String catalog;
     public final String schemaPattern;
     public final String tableNamePattern;
     public final List<String> typeList;
 
     TablesRequest() {
+      connectionId = null;
       catalog = null;
       schemaPattern = null;
       tableNamePattern = null;
@@ -297,10 +402,12 @@ public interface Service {
     }
 
     @JsonCreator
-    public TablesRequest(@JsonProperty("catalog") String catalog,
+    public TablesRequest(@JsonProperty("connectionId") String connectionId,
+        @JsonProperty("catalog") String catalog,
         @JsonProperty("schemaPattern") String schemaPattern,
         @JsonProperty("tableNamePattern") String tableNamePattern,
         @JsonProperty("typeList") List<String> typeList) {
+      this.connectionId = connectionId;
       this.catalog = catalog;
       this.schemaPattern = schemaPattern;
       this.tableNamePattern = tableNamePattern;
@@ -320,6 +427,11 @@ public interface Service {
       final Requests.TablesRequest msg = (Requests.TablesRequest) genericMsg;
       final Descriptor desc = msg.getDescriptorForType();
 
+      String connectionId = null;
+      if (ProtobufService.hasField(msg, desc, Requests.TablesRequest.CONNECTION_ID_FIELD_NUMBER)) {
+        connectionId = msg.getConnectionId();
+      }
+
       String catalog = null;
       if (ProtobufService.hasField(msg, desc, Requests.TablesRequest.CATALOG_FIELD_NUMBER)) {
         catalog = msg.getCatalog();
@@ -343,12 +455,15 @@ public interface Service {
         typeList = msg.getTypeListList();
       }
 
-      return new TablesRequest(catalog, schemaPattern, tableNamePattern, typeList);
+      return new TablesRequest(connectionId, catalog, schemaPattern, tableNamePattern, typeList);
     }
 
     @Override Requests.TablesRequest serialize() {
       Requests.TablesRequest.Builder builder = Requests.TablesRequest.newBuilder();
 
+      if (null != connectionId) {
+        builder.setConnectionId(connectionId);
+      }
       if (null != catalog) {
         builder.setCatalog(catalog);
       }
@@ -371,6 +486,7 @@ public interface Service {
     @Override public int hashCode() {
       final int prime = 31;
       int result = 1;
+      result = prime * result + ((connectionId == null) ? 0 : connectionId.hashCode());
       result = prime * result + ((catalog == null) ? 0 : catalog.hashCode());
       result = prime * result + ((schemaPattern == null) ? 0 : schemaPattern.hashCode());
       result = prime * result + ((tableNamePattern == null) ? 0 : tableNamePattern.hashCode());
@@ -385,8 +501,16 @@ public interface Service {
       if (o instanceof TablesRequest) {
         TablesRequest other = (TablesRequest) o;
 
+        if (null == connectionId) {
+          if (null != other.connectionId) {
+            return false;
+          }
+        } else if (!connectionId.equals(other.connectionId)) {
+          return false;
+        }
+
         if (null == catalog) {
-          if (null != catalog) {
+          if (null != other.catalog) {
             return false;
           }
         } else if (!catalog.equals(other.catalog)) {
@@ -425,9 +549,20 @@ public interface Service {
   }
 
   /**
-   * Request for {@link Meta#getTableTypes()}.
+   * Request for {@link Meta#getTableTypes(Meta.ConnectionHandle)}.
    */
   class TableTypesRequest extends Request {
+    public final String connectionId;
+
+    public TableTypesRequest() {
+      this.connectionId = null;
+    }
+
+    @JsonCreator
+    public TableTypesRequest(@JsonProperty("connectionId") String connectionId) {
+      this.connectionId = connectionId;
+    }
+
     @Override ResultSetResponse accept(Service service) {
       return service.apply(this);
     }
@@ -438,35 +573,65 @@ public interface Service {
             "Expected TableTypesRequest, but got " + genericMsg.getClass().getName());
       }
 
-      return new TableTypesRequest();
+      final Requests.TableTypesRequest msg = (Requests.TableTypesRequest) genericMsg;
+      final Descriptor desc = msg.getDescriptorForType();
+
+      String connectionId = null;
+      if (ProtobufService.hasField(msg, desc,
+          Requests.TableTypesRequest.CONNECTION_ID_FIELD_NUMBER)) {
+        connectionId = msg.getConnectionId();
+      }
+
+      return new TableTypesRequest(connectionId);
     }
 
     @Override Requests.TableTypesRequest serialize() {
-      return Requests.TableTypesRequest.newBuilder().build();
+      Requests.TableTypesRequest.Builder builder = Requests.TableTypesRequest.newBuilder();
+      if (null != connectionId) {
+        builder.setConnectionId(connectionId);
+      }
+
+      return builder.build();
     }
 
     @Override public int hashCode() {
-      return 0;
+      return connectionId == null ? 0 : connectionId.hashCode();
     }
 
     @Override public boolean equals(Object o) {
       if (o == this) {
         return true;
       }
-      return o instanceof TableTypesRequest;
+      if (o instanceof TableTypesRequest) {
+        TableTypesRequest other = (TableTypesRequest) o;
+
+        if (null == connectionId) {
+          if (null != other.connectionId) {
+            return false;
+          }
+        } else if (!connectionId.equals(other.connectionId)) {
+          return false;
+        }
+
+        return true;
+      }
+
+      return false;
     }
   }
 
   /** Request for
-   * {@link Meta#getColumns(String, org.apache.calcite.avatica.Meta.Pat, org.apache.calcite.avatica.Meta.Pat, org.apache.calcite.avatica.Meta.Pat)}.
+   * {@link Meta#getColumns(Meta.ConnectionHandle, String, org.apache.calcite.avatica.Meta.Pat, org.apache.calcite.avatica.Meta.Pat, org.apache.calcite.avatica.Meta.Pat)}.
    */
   class ColumnsRequest extends Request {
+    public final String connectionId;
     public final String catalog;
     public final String schemaPattern;
     public final String tableNamePattern;
     public final String columnNamePattern;
 
     ColumnsRequest() {
+      connectionId = null;
       catalog = null;
       schemaPattern = null;
       tableNamePattern = null;
@@ -474,10 +639,12 @@ public interface Service {
     }
 
     @JsonCreator
-    public ColumnsRequest(@JsonProperty("catalog") String catalog,
+    public ColumnsRequest(@JsonProperty("connectionId") String connectionId,
+        @JsonProperty("catalog") String catalog,
         @JsonProperty("schemaPattern") String schemaPattern,
         @JsonProperty("tableNamePattern") String tableNamePattern,
         @JsonProperty("columnNamePattern") String columnNamePattern) {
+      this.connectionId = connectionId;
       this.catalog = catalog;
       this.schemaPattern = schemaPattern;
       this.tableNamePattern = tableNamePattern;
@@ -497,6 +664,11 @@ public interface Service {
       final Requests.ColumnsRequest msg = (Requests.ColumnsRequest) genericMsg;
       final Descriptor desc = msg.getDescriptorForType();
 
+      String connectionId = null;
+      if (ProtobufService.hasField(msg, desc, Requests.ColumnsRequest.CONNECTION_ID_FIELD_NUMBER)) {
+        connectionId = msg.getConnectionId();
+      }
+
       String catalog = null;
       if (ProtobufService.hasField(msg, desc, Requests.ColumnsRequest.CATALOG_FIELD_NUMBER)) {
         catalog = msg.getCatalog();
@@ -520,12 +692,16 @@ public interface Service {
         columnNamePattern = msg.getColumnNamePattern();
       }
 
-      return new ColumnsRequest(catalog, schemaPattern, tableNamePattern, columnNamePattern);
+      return new ColumnsRequest(connectionId, catalog, schemaPattern, tableNamePattern,
+          columnNamePattern);
     }
 
     @Override Requests.ColumnsRequest serialize() {
       Requests.ColumnsRequest.Builder builder = Requests.ColumnsRequest.newBuilder();
 
+      if (null != connectionId) {
+        builder.setConnectionId(connectionId);
+      }
       if (null != catalog) {
         builder.setCatalog(catalog);
       }
@@ -545,6 +721,7 @@ public interface Service {
     @Override public int hashCode() {
       final int prime = 31;
       int result = 1;
+      result = prime * result + ((connectionId == null) ? 0 : connectionId.hashCode());
       result = prime * result + ((catalog == null) ? 0 : catalog.hashCode());
       result = prime * result + ((columnNamePattern == null) ? 0 : columnNamePattern.hashCode());
       result = prime * result + ((schemaPattern == null) ? 0 : schemaPattern.hashCode());
@@ -559,6 +736,14 @@ public interface Service {
       if (o instanceof ColumnsRequest) {
         ColumnsRequest other = (ColumnsRequest) o;
 
+        if (null == connectionId) {
+          if (null != other.connectionId) {
+            return false;
+          }
+        } else if (!connectionId.equals(other.connectionId)) {
+          return false;
+        }
+
         if (null == catalog) {
           if (null != other.catalog) {
             return false;
@@ -599,8 +784,19 @@ public interface Service {
   }
 
   /** Request for
-   * {@link Meta#getTypeInfo()}. */
+   * {@link Meta#getTypeInfo(Meta.ConnectionHandle)}. */
   class TypeInfoRequest extends Request {
+    public final String connectionId;
+
+    public TypeInfoRequest() {
+      connectionId = null;
+    }
+
+    @JsonCreator
+    public TypeInfoRequest(@JsonProperty("connectionId") String connectionId) {
+      this.connectionId = connectionId;
+    }
+
     @Override ResultSetResponse accept(Service service) {
       return service.apply(this);
     }
@@ -611,22 +807,50 @@ public interface Service {
             "Expected TypeInfoRequest, but got " + genericMsg.getClass().getName());
       }
 
-      return new TypeInfoRequest();
+      final Requests.TypeInfoRequest msg = (Requests.TypeInfoRequest) genericMsg;
+      final Descriptor desc = msg.getDescriptorForType();
+
+      String connectionId = null;
+      if (ProtobufService.hasField(msg, desc,
+          Requests.TypeInfoRequest.CONNECTION_ID_FIELD_NUMBER)) {
+        connectionId = msg.getConnectionId();
+      }
+
+      return new TypeInfoRequest(connectionId);
     }
 
     @Override Requests.TypeInfoRequest serialize() {
-      return Requests.TypeInfoRequest.newBuilder().build();
+      Requests.TypeInfoRequest.Builder builder = Requests.TypeInfoRequest.newBuilder();
+      if (null != connectionId) {
+        builder.setConnectionId(connectionId);
+      }
+
+      return builder.build();
     }
 
     @Override public int hashCode() {
-      return 0;
+      return connectionId == null ? 0 : connectionId.hashCode();
     }
 
     @Override public boolean equals(Object o) {
       if (o == this) {
         return true;
       }
-      return o instanceof TypeInfoRequest;
+      if (o instanceof TypeInfoRequest) {
+        TypeInfoRequest other = (TypeInfoRequest) o;
+
+        if (null == connectionId) {
+          if (null != other.connectionId) {
+            return false;
+          }
+        } else if (!connectionId.equals(other.connectionId)) {
+          return false;
+        }
+
+        return true;
+      }
+
+      return false;
     }
   }
 
@@ -637,10 +861,10 @@ public interface Service {
    * no signature and no other data.
    *
    * <p>Several types of request, including
-   * {@link org.apache.calcite.avatica.Meta#getCatalogs()} and
-   * {@link org.apache.calcite.avatica.Meta#getSchemas(String, org.apache.calcite.avatica.Meta.Pat)}
-   * {@link Meta#getTables(String, Meta.Pat, Meta.Pat, List)}
-   * {@link Meta#getTableTypes()}
+   * {@link org.apache.calcite.avatica.Meta#getCatalogs(Meta.ConnectionHandle)} and
+   * {@link org.apache.calcite.avatica.Meta#getSchemas(Meta.ConnectionHandle, String, org.apache.calcite.avatica.Meta.Pat)}
+   * {@link Meta#getTables(Meta.ConnectionHandle, String, Meta.Pat, Meta.Pat, List)}
+   * {@link Meta#getTableTypes(Meta.ConnectionHandle)}
    * return this response. */
   class ResultSetResponse extends Response {
     public final String connectionId;
@@ -1679,6 +1903,136 @@ public interface Service {
   }
 
   /** Request for
+   * {@link Meta#openConnection}. */
+  class OpenConnectionRequest extends Request {
+    public final String connectionId;
+    public final Map<String, String> info;
+
+    public OpenConnectionRequest() {
+      connectionId = null;
+      info = null;
+    }
+
+    @JsonCreator
+    public OpenConnectionRequest(@JsonProperty("connectionId") String connectionId,
+        @JsonProperty("info") Map<String, String> info) {
+      this.connectionId = connectionId;
+      this.info = info;
+    }
+
+    @Override OpenConnectionResponse accept(Service service) {
+      return service.apply(this);
+    }
+
+    @Override
+    Request deserialize(Message genericMsg) {
+      if (!(genericMsg instanceof Requests.OpenConnectionRequest)) {
+        throw new IllegalArgumentException(
+            "Expected OpenConnectionRequest, but got" + genericMsg.getClass().getName());
+      }
+
+      final Requests.OpenConnectionRequest msg = (Requests.OpenConnectionRequest) genericMsg;
+      final Descriptor desc = msg.getDescriptorForType();
+
+      String connectionId = null;
+      if (ProtobufService.hasField(msg, desc,
+          Requests.OpenConnectionRequest.CONNECTION_ID_FIELD_NUMBER)) {
+        connectionId = msg.getConnectionId();
+      }
+
+      Map<String, String> info = msg.getInfo();
+      if (info.isEmpty()) {
+        info = null;
+      }
+
+      return new OpenConnectionRequest(connectionId, info);
+    }
+
+    @Override
+    Message serialize() {
+      Requests.OpenConnectionRequest.Builder builder = Requests.OpenConnectionRequest.newBuilder();
+      if (null != connectionId) {
+        builder.setConnectionId(connectionId);
+      }
+      if (null != info) {
+        builder.getMutableInfo().putAll(info);
+      }
+
+      return builder.build();
+    }
+
+    @Override public int hashCode() {
+      final int prime = 31;
+      int result = 1;
+      result = prime * result + ((connectionId == null) ? 0 : connectionId.hashCode());
+      result = prime * result + ((info == null) ? 0 : info.hashCode());
+      return result;
+    }
+
+    @Override public boolean equals(Object o) {
+      if (o == this) {
+        return true;
+      }
+      if (o instanceof OpenConnectionRequest) {
+        OpenConnectionRequest other = (OpenConnectionRequest) o;
+
+        if (null == connectionId) {
+          if (null != other.connectionId) {
+            return false;
+          }
+        } else if (!connectionId.equals(other.connectionId)) {
+          return false;
+        }
+
+        if (null == info) {
+          if (null != other.info) {
+            return false;
+          }
+        } else if (!info.equals(other.info)) {
+          return false;
+        }
+
+        return true;
+      }
+
+      return false;
+    }
+  }
+
+  /** Response from
+   * {@link org.apache.calcite.avatica.remote.Service.OpenConnectionRequest}. */
+  class OpenConnectionResponse extends Response {
+
+    @JsonCreator
+    public OpenConnectionResponse() {
+    }
+
+    @Override OpenConnectionResponse deserialize(Message genericMsg) {
+      if (!(genericMsg instanceof Responses.OpenConnectionResponse)) {
+        throw new IllegalArgumentException(
+            "Expected OpenConnectionResponse, but got " + genericMsg.getClass().getName());
+      }
+
+      return new OpenConnectionResponse();
+    }
+
+    @Override Responses.OpenConnectionResponse serialize() {
+      return Responses.OpenConnectionResponse.newBuilder().build();
+    }
+
+    @Override public int hashCode() {
+      return 0;
+    }
+
+    @Override public boolean equals(Object o) {
+      if (o == this) {
+        return true;
+      }
+      return o instanceof OpenConnectionResponse;
+    }
+  }
+
+  /** Request for
    * {@link Meta#closeConnection(org.apache.calcite.avatica.Meta.ConnectionHandle)}. */
   class CloseConnectionRequest extends Request {
     public final String connectionId;
@@ -1951,7 +2305,7 @@ public interface Service {
   }
 
   /** Response for
-   * {@link Meta#getDatabaseProperties()}. */
+   * {@link Meta#getDatabaseProperties(Meta.ConnectionHandle)}. */
   class DatabasePropertyResponse extends Response {
     public final Map<Meta.DatabaseProperty, Object> map;
 
@@ -2082,6 +2436,78 @@ public interface Service {
       return false;
     }
   }
+
+  /**
+   * ErrorResponse can be used in response to any kind of request. It is used internally
+   * by the transport layers to format errors for transport over the wire.
+   * Thus, {@link Request#apply} will never return an ErrorResponse.
+   */
+  class ErrorResponse extends Response {
+    public final String message;
+
+    public ErrorResponse() {
+      message = null;
+    }
+
+    @JsonCreator
+    public ErrorResponse(@JsonProperty("message") String message) {
+      this.message = message;
+    }
+
+    @Override ErrorResponse deserialize(Message genericMsg) {
+      if (!(genericMsg instanceof Responses.ErrorResponse)) {
+        throw new IllegalArgumentException(
+            "Expected ErrorResponse, but got " + genericMsg.getClass().getName());
+      }
+
+      final Responses.ErrorResponse msg = (Responses.ErrorResponse) genericMsg;
+      final Descriptor desc = msg.getDescriptorForType();
+
+      String message = null;
+      if (ProtobufService.hasField(msg, desc,
+          Responses.ErrorResponse.MESSAGE_FIELD_NUMBER)) {
+        message = msg.getMessage();
+      }
+
+      return new ErrorResponse(message);
+    }
+
+    @Override Responses.ErrorResponse serialize() {
+      Responses.ErrorResponse.Builder builder = Responses.ErrorResponse.newBuilder();
+
+      if (null != message) {
+        builder.setMessage(message);
+      }
+
+      return builder.build();
+    }
+
+    @Override public int hashCode() {
+      return message == null ? 0 : message.hashCode();
+    }
+
+    @Override public boolean equals(Object o) {
+      if (o == this) {
+        return true;
+      }
+
+      if (o instanceof ErrorResponse) {
+        ErrorResponse other = (ErrorResponse) o;
+
+        if (null == message) {
+          if (null != other.message) {
+            return false;
+          }
+        } else if (!message.equals(other.message)) {
+          return false;
+        }
+
+        return true;
+      }
+
+      return false;
+    }
+  }
 }
 
 // End Service.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/avatica/src/main/protobuf/requests.proto
----------------------------------------------------------------------
diff --git a/avatica/src/main/protobuf/requests.proto b/avatica/src/main/protobuf/requests.proto
index 2a144c1..02451da 100644
--- a/avatica/src/main/protobuf/requests.proto
+++ b/avatica/src/main/protobuf/requests.proto
@@ -22,18 +22,19 @@ import "common.proto";
 
 // Request for Meta#getCatalogs()
 message CatalogsRequest {
-
+  string connection_id = 1;
 }
 
 // Request for Meta#getDatabaseProperties()
 message DatabasePropertyRequest {
-
+  string connection_id = 1;
 }
 
 // Request for Meta#getSchemas(String, org.apache.calcite.avatica.Meta.Pat)}
 message SchemasRequest {
   string catalog = 1;
   string schema_pattern = 2;
+  string connection_id = 3;
 }
 
 // Request for Request for Meta#getTables(String, org.apache.calcite.avatica.Meta.Pat,
@@ -44,11 +45,12 @@ message TablesRequest {
   string table_name_pattern = 3;
   repeated string type_list = 4;
   bool has_type_list = 6; // Having an empty type_list is distinct from a null type_list
+  string connection_id = 7;
 }
 
 // Request for Meta#getTableTypes()
 message TableTypesRequest {
-
+  string connection_id = 1;
 }
 
 // Request for Meta#getColumns(String, org.apache.calcite.avatica.Meta.Pat,
@@ -58,11 +60,12 @@ message ColumnsRequest {
   string schema_pattern = 2;
   string table_name_pattern = 3;
   string column_name_pattern = 4;
+  string connection_id = 5;
 }
 
 // Request for Meta#getTypeInfo()
 message TypeInfoRequest {
-
+  string connection_id = 1;
 }
 
 // Request for Meta#prepareAndExecute(Meta.StatementHandle, String, long, Meta.PrepareCallback)
@@ -99,6 +102,12 @@ message CloseStatementRequest {
   uint32 statement_id = 2;
 }
 
+// Request for Meta#openConnection(Meta.ConnectionHandle, Map<String, String>)
+message OpenConnectionRequest {
+  string connection_id = 1;
+  map<string, string> info = 2;
+}
+
 // Request for Meta#closeConnection(Meta.ConnectionHandle)
 message CloseConnectionRequest {
   string connection_id = 1;

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/avatica/src/main/protobuf/responses.proto
----------------------------------------------------------------------
diff --git a/avatica/src/main/protobuf/responses.proto b/avatica/src/main/protobuf/responses.proto
index 1fad9c8..e4f52a3 100644
--- a/avatica/src/main/protobuf/responses.proto
+++ b/avatica/src/main/protobuf/responses.proto
@@ -57,6 +57,11 @@ message CloseStatementResponse {
 
 }
 
+// Response to OpenConnectionRequest {
+message OpenConnectionResponse {
+
+}
+
 // Response to CloseConnectionRequest {
 message CloseConnectionResponse {
 
@@ -76,3 +81,7 @@ message DatabasePropertyElement {
 message DatabasePropertyResponse {
   repeated DatabasePropertyElement props = 1;
 }
+
+message ErrorResponse {
+  string message = 1;
+}

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/avatica/src/test/java/org/apache/calcite/avatica/remote/ProtobufTranslationImplTest.java
----------------------------------------------------------------------
diff --git a/avatica/src/test/java/org/apache/calcite/avatica/remote/ProtobufTranslationImplTest.java b/avatica/src/test/java/org/apache/calcite/avatica/remote/ProtobufTranslationImplTest.java
index c76fd1a..337932e 100644
--- a/avatica/src/test/java/org/apache/calcite/avatica/remote/ProtobufTranslationImplTest.java
+++ b/avatica/src/test/java/org/apache/calcite/avatica/remote/ProtobufTranslationImplTest.java
@@ -27,6 +27,7 @@ import org.apache.calcite.avatica.Meta.Style;
 import org.apache.calcite.avatica.MetaImpl;
 import org.apache.calcite.avatica.remote.Service.CatalogsRequest;
 import org.apache.calcite.avatica.remote.Service.CloseConnectionRequest;
+import org.apache.calcite.avatica.remote.Service.CloseConnectionResponse;
 import org.apache.calcite.avatica.remote.Service.CloseStatementRequest;
 import org.apache.calcite.avatica.remote.Service.CloseStatementResponse;
 import org.apache.calcite.avatica.remote.Service.ColumnsRequest;
@@ -36,9 +37,12 @@ import org.apache.calcite.avatica.remote.Service.CreateStatementRequest;
 import org.apache.calcite.avatica.remote.Service.CreateStatementResponse;
 import org.apache.calcite.avatica.remote.Service.DatabasePropertyRequest;
 import org.apache.calcite.avatica.remote.Service.DatabasePropertyResponse;
+import org.apache.calcite.avatica.remote.Service.ErrorResponse;
 import org.apache.calcite.avatica.remote.Service.ExecuteResponse;
 import org.apache.calcite.avatica.remote.Service.FetchRequest;
 import org.apache.calcite.avatica.remote.Service.FetchResponse;
+import org.apache.calcite.avatica.remote.Service.OpenConnectionRequest;
+import org.apache.calcite.avatica.remote.Service.OpenConnectionResponse;
 import org.apache.calcite.avatica.remote.Service.PrepareAndExecuteRequest;
 import org.apache.calcite.avatica.remote.Service.PrepareRequest;
 import org.apache.calcite.avatica.remote.Service.PrepareResponse;
@@ -158,13 +162,13 @@ public class ProtobufTranslationImplTest<T> {
 
     requests.add(new CatalogsRequest());
     requests.add(new DatabasePropertyRequest());
-    requests.add(new SchemasRequest("catalog", "schemaPattern"));
+    requests.add(new SchemasRequest("connectionId", "catalog", "schemaPattern"));
     requests.add(
-        new TablesRequest("catalog", "schemaPattern", "tableNamePattern",
+        new TablesRequest("connectionId", "catalog", "schemaPattern", "tableNamePattern",
             Arrays.asList("STRING", "BOOLEAN", "INT")));
     requests.add(new TableTypesRequest());
     requests.add(
-        new ColumnsRequest("catalog", "schemaPattern", "tableNamePattern",
+        new ColumnsRequest("connectionId", "catalog", "schemaPattern", "tableNamePattern",
             "columnNamePattern"));
     requests.add(new TypeInfoRequest());
     requests.add(
@@ -181,6 +185,10 @@ public class ProtobufTranslationImplTest<T> {
 
     requests.add(new CreateStatementRequest("connectionId"));
     requests.add(new CloseStatementRequest("connectionId", Integer.MAX_VALUE));
+    Map<String, String> info = new HashMap<>();
+    info.put("param1", "value1");
+    info.put("param2", "value2");
+    requests.add(new OpenConnectionRequest("connectionId", info));
     requests.add(new CloseConnectionRequest("connectionId"));
     requests.add(
         new ConnectionSyncRequest("connectionId",
@@ -194,14 +202,15 @@ public class ProtobufTranslationImplTest<T> {
     LinkedList<Request> requests = new LinkedList<>();
 
     // We're pretty fast and loose on what can be null.
-    requests.add(new SchemasRequest(null, null));
+    requests.add(new SchemasRequest(null, null, null));
     // Repeated fields default to an empty list
-    requests.add(new TablesRequest(null, null, null, Collections.<String>emptyList()));
-    requests.add(new ColumnsRequest(null, null, null, null));
+    requests.add(new TablesRequest(null, null, null, null, Collections.<String>emptyList()));
+    requests.add(new ColumnsRequest(null, null, null, null, null));
     requests.add(new PrepareAndExecuteRequest(null, 0, null, 0));
     requests.add(new PrepareRequest(null, null, 0));
     requests.add(new CreateStatementRequest(null));
     requests.add(new CloseStatementRequest(null, 0));
+    requests.add(new OpenConnectionRequest(null, null));
     requests.add(new CloseConnectionRequest(null));
     requests.add(new ConnectionSyncRequest(null, null));
 
@@ -246,6 +255,9 @@ public class ProtobufTranslationImplTest<T> {
         Integer.MAX_VALUE, "catalog", "schema");
     responses.add(new ConnectionSyncResponse(connProps));
 
+    responses.add(new OpenConnectionResponse());
+    responses.add(new CloseConnectionResponse());
+
     responses.add(new CreateStatementResponse("connectionId", Integer.MAX_VALUE));
 
     Map<Meta.DatabaseProperty, Object> propertyMap = new HashMap<>();
@@ -261,6 +273,8 @@ public class ProtobufTranslationImplTest<T> {
             new Meta.StatementHandle("connectionId", Integer.MAX_VALUE,
                 signature)));
 
+    responses.add(new ErrorResponse("an error occurred"));
+
     return responses;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/avatica/src/test/java/org/apache/calcite/avatica/test/JsonHandlerTest.java
----------------------------------------------------------------------
diff --git a/avatica/src/test/java/org/apache/calcite/avatica/test/JsonHandlerTest.java b/avatica/src/test/java/org/apache/calcite/avatica/test/JsonHandlerTest.java
index 14d4bd2..18d66e9 100644
--- a/avatica/src/test/java/org/apache/calcite/avatica/test/JsonHandlerTest.java
+++ b/avatica/src/test/java/org/apache/calcite/avatica/test/JsonHandlerTest.java
@@ -95,6 +95,10 @@ public class JsonHandlerTest {
       return null;
     }
 
+    @Override public OpenConnectionResponse apply(OpenConnectionRequest request) {
+      return null;
+    }
+
     @Override public CloseConnectionResponse apply(CloseConnectionRequest request) {
       return null;
     }

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/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 f836a71..73c0880 100644
--- a/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java
+++ b/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java
@@ -214,7 +214,7 @@ public class CalciteMetaImpl extends MetaImpl {
     return (CalciteConnectionImpl) connection;
   }
 
-  @Override public Map<DatabaseProperty, Object> getDatabaseProperties() {
+  @Override public Map<DatabaseProperty, Object> getDatabaseProperties(ConnectionHandle ch) {
     final ImmutableMap.Builder<DatabaseProperty, Object> builder =
         ImmutableMap.builder();
     for (DatabaseProperty p : DatabaseProperty.values()) {
@@ -243,7 +243,8 @@ public class CalciteMetaImpl extends MetaImpl {
     }
   }
 
-  public MetaResultSet getTables(String catalog,
+  public MetaResultSet getTables(ConnectionHandle ch,
+      String catalog,
       final Pat schemaPattern,
       final Pat tableNamePattern,
       final List<String> typeList) {
@@ -280,7 +281,7 @@ public class CalciteMetaImpl extends MetaImpl {
         "REF_GENERATION");
   }
 
-  public MetaResultSet getTypeInfo() {
+  public MetaResultSet getTypeInfo(ConnectionHandle ch) {
     return createResultSet(allTypeInfo(),
         MetaTypeInfo.class,
         "TYPE_NAME",
@@ -303,7 +304,8 @@ public class CalciteMetaImpl extends MetaImpl {
         "NUM_PREC_RADIX");
   }
 
-  public MetaResultSet getColumns(String catalog,
+  public MetaResultSet getColumns(ConnectionHandle ch,
+      String catalog,
       Pat schemaPattern,
       Pat tableNamePattern,
       Pat columnNamePattern) {
@@ -506,7 +508,7 @@ public class CalciteMetaImpl extends MetaImpl {
             });
   }
 
-  public MetaResultSet getSchemas(String catalog, Pat schemaPattern) {
+  public MetaResultSet getSchemas(ConnectionHandle ch, String catalog, Pat schemaPattern) {
     final Predicate1<MetaSchema> schemaMatcher = namedMatcher(schemaPattern);
     return createResultSet(schemas(catalog).where(schemaMatcher),
         MetaSchema.class,
@@ -514,13 +516,13 @@ public class CalciteMetaImpl extends MetaImpl {
         "TABLE_CATALOG");
   }
 
-  public MetaResultSet getCatalogs() {
+  public MetaResultSet getCatalogs(ConnectionHandle ch) {
     return createResultSet(catalogs(),
         MetaCatalog.class,
         "TABLE_CAT");
   }
 
-  public MetaResultSet getTableTypes() {
+  public MetaResultSet getTableTypes(ConnectionHandle ch) {
     return createResultSet(tableTypes(),
         MetaTableType.class,
         "TABLE_TYPE");

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 0cac4a1..ae53317 100644
--- a/pom.xml
+++ b/pom.xml
@@ -317,6 +317,12 @@ limitations under the License.
         <artifactId>xalan</artifactId>
         <version>2.7.1</version>
       </dependency>
+      <dependency>
+        <groupId>com.github.stephenc.jcip</groupId>
+        <artifactId>jcip-annotations</artifactId>
+        <version>1.0-1</version>
+        <scope>test</scope>
+      </dependency>
     </dependencies>
   </dependencyManagement>
 



[05/11] incubator-calcite git commit: [CALCITE-645] Implement AvaticaSqlException to pass server-side exception information to clients (Josh Elser)

Posted by jh...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/main/java/org/apache/calcite/avatica/remote/MockProtobufService.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/MockProtobufService.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/MockProtobufService.java
index fe357fd..8cca9d9 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/MockProtobufService.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/MockProtobufService.java
@@ -34,23 +34,30 @@ import java.util.Map;
  */
 public class MockProtobufService extends ProtobufService {
 
-  private static final Map<Request, Response> MAPPING;
-  static {
+  private final String connectionId;
+  private final Map<Request, Response> mapping;
+
+  public MockProtobufService(String connectionId) {
+    this.connectionId = connectionId;
+    this.mapping = createMapping();
+  }
+
+  private Map<Request, Response> createMapping() {
     HashMap<Request, Response> mappings = new HashMap<>();
 
     // Add in mappings
 
     mappings.put(
-        new OpenConnectionRequest("0", new HashMap<String, String>()),
+        new OpenConnectionRequest(connectionId, new HashMap<String, String>()),
         new OpenConnectionResponse());
 
     // Get the schema, no.. schema..?
     mappings.put(
-        new SchemasRequest("0", null, null),
+        new SchemasRequest(connectionId, null, null),
         new ResultSetResponse(null, 1, true, null, Meta.Frame.EMPTY, -1));
 
     // Get the tables, no tables exist
-    mappings.put(new TablesRequest("0", null, null, null, Collections.<String>emptyList()),
+    mappings.put(new TablesRequest(connectionId, null, null, null, Collections.<String>emptyList()),
         new ResultSetResponse(null, 150, true, null, Meta.Frame.EMPTY, -1));
 
     // Create a statement, get back an id
@@ -58,7 +65,7 @@ public class MockProtobufService extends ProtobufService {
 
     // Prepare and execute a query. Values and schema are returned
     mappings.put(
-        new PrepareAndExecuteRequest("0", 1,
+        new PrepareAndExecuteRequest(connectionId, 1,
             "select * from (\\n values (1, 'a'), (null, 'b'), (3, 'c')) as t (c1, c2)", -1),
         new ResultSetResponse("0", 1, true,
             Meta.Signature.create(
@@ -72,7 +79,7 @@ public class MockProtobufService extends ProtobufService {
 
     // Prepare a query. Schema for results are returned, but no values
     mappings.put(
-        new PrepareRequest("0",
+        new PrepareRequest(connectionId,
             "select * from (\\n values(1, 'a'), (null, 'b'), (3, 'c')), as t (c1, c2)", -1),
         new ResultSetResponse("0", 1, true,
             Meta.Signature.create(
@@ -84,7 +91,7 @@ public class MockProtobufService extends ProtobufService {
             null, -1));
 
     mappings.put(
-        new ColumnsRequest(null, null, "my_table", null),
+        new ColumnsRequest(connectionId, null, null, "my_table", null),
         new ResultSetResponse("00000000-0000-0000-0000-000000000000", -1, true,
             Meta.Signature.create(
                 Arrays.<ColumnMetaData>asList(
@@ -94,7 +101,7 @@ public class MockProtobufService extends ProtobufService {
             Meta.Frame.create(0, true,
                 Arrays.<Object>asList(new Object[] {new Object[]{"my_table", 10}})), -1));
 
-    MAPPING = Collections.unmodifiableMap(mappings);
+    return Collections.unmodifiableMap(mappings);
   }
 
   @Override public Response _apply(Request request) {
@@ -113,20 +120,7 @@ public class MockProtobufService extends ProtobufService {
    * @throws RuntimeException if no mapping is found for the request
    */
   private Response dispatch(Request request) {
-    // Canonicalize connectionId's to 0
-    if (request instanceof OpenConnectionRequest) {
-      OpenConnectionRequest req = (OpenConnectionRequest) request;
-      request = new OpenConnectionRequest("0", req.info);
-    } else if (request instanceof TablesRequest) {
-      TablesRequest req = (TablesRequest) request;
-      request = new TablesRequest("0", req.catalog, req.schemaPattern,
-          req.tableNamePattern, req.typeList);
-    } else if (request instanceof SchemasRequest) {
-      SchemasRequest req = (SchemasRequest) request;
-      request = new SchemasRequest("0", req.catalog, req.schemaPattern);
-    }
-
-    Response response = MAPPING.get(request);
+    Response response = mapping.get(request);
 
     if (null == response) {
       throw new RuntimeException("Had no response mapping for " + request);
@@ -140,7 +134,7 @@ public class MockProtobufService extends ProtobufService {
    */
   public static class MockProtobufServiceFactory implements Service.Factory {
     @Override public Service create(AvaticaConnection connection) {
-      return new MockProtobufService();
+      return new MockProtobufService(connection.handle.id);
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/main/java/org/apache/calcite/avatica/remote/ProtobufHandler.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/ProtobufHandler.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/ProtobufHandler.java
index 52f0a03..d77b52d 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/ProtobufHandler.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/ProtobufHandler.java
@@ -18,8 +18,6 @@ package org.apache.calcite.avatica.remote;
 
 import org.apache.calcite.avatica.remote.Service.Response;
 
-import com.google.protobuf.InvalidProtocolBufferException;
-
 import java.io.IOException;
 
 /**
@@ -27,36 +25,25 @@ import java.io.IOException;
  * by converting them to the POJO Request. Returns back the serialized protocol
  * buffer response.
  */
-public class ProtobufHandler implements Handler<byte[]> {
+public class ProtobufHandler extends AbstractHandler<byte[]> {
 
-  private final Service service;
   private final ProtobufTranslation translation;
 
   public ProtobufHandler(Service service, ProtobufTranslation translation) {
-    this.service = service;
+    super(service);
     this.translation = translation;
   }
 
-  @Override public byte[] apply(byte[] requestBytes) {
-    // Transform the protocol buffer bytes into a POJO
-    // Encapsulate the task of transforming this since
-    // the bytes also contain the PB request class name.
-    Service.Request requestPojo;
-    try {
-      requestPojo = translation.parseRequest(requestBytes);
-    } catch (InvalidProtocolBufferException e) {
-      throw new RuntimeException(e);
-    }
-
-    // Get the response for the request
-    Response response = requestPojo.accept(service);
-
-    try {
-      // Serialize it into bytes for the wire.
-      return translation.serializeResponse(response);
-    } catch (IOException e) {
-      throw new RuntimeException(e);
-    }
+  @Override public HandlerResponse<byte[]> apply(byte[] requestBytes) {
+    return super.apply(requestBytes);
+  }
+
+  @Override Service.Request decode(byte[] serializedRequest) throws IOException {
+    return translation.parseRequest(serializedRequest);
+  }
+
+  @Override byte[] encode(Response response) throws IOException {
+    return translation.serializeResponse(response);
   }
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/main/java/org/apache/calcite/avatica/remote/ProtobufService.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/ProtobufService.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/ProtobufService.java
index e41e9f6..35cb35a 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/ProtobufService.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/ProtobufService.java
@@ -74,8 +74,7 @@ public abstract class ProtobufService extends AbstractService {
     return (CloseStatementResponse) _apply(request);
   }
 
-  @Override
-  public OpenConnectionResponse apply(OpenConnectionRequest request) {
+  @Override public OpenConnectionResponse apply(OpenConnectionRequest request) {
     return (OpenConnectionResponse) _apply(request);
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteProtobufService.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteProtobufService.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteProtobufService.java
index 8cf0f0d..fa447de 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteProtobufService.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteProtobufService.java
@@ -38,6 +38,8 @@ public class RemoteProtobufService extends ProtobufService {
   }
 
   @Override public Response _apply(Request request) {
+    final InputStream inputStream;
+
     try {
       final HttpURLConnection connection =
           (HttpURLConnection) url.openConnection();
@@ -52,21 +54,29 @@ public class RemoteProtobufService extends ProtobufService {
       }
       final int responseCode = connection.getResponseCode();
       if (responseCode != HttpURLConnection.HTTP_OK) {
-        InputStream errorStream = connection.getErrorStream();
-        if (errorStream != null) {
-          byte[] errorResponse = AvaticaUtils.readFullyToBytes(errorStream);
-          ErrorResponse response = (ErrorResponse) translation.parseResponse(errorResponse);
-          throw new RuntimeException("Remote driver error: " + response.message);
-        } else {
-          throw new RuntimeException("response code " + responseCode);
-        }
+        inputStream = connection.getErrorStream();
+      } else {
+        inputStream = connection.getInputStream();
       }
-      final InputStream inputStream = connection.getInputStream();
+    } catch (IOException e) {
+      throw new RuntimeException(e);
+    }
+
+    Response resp;
+    try {
       // Read the (serialized protobuf) response off the wire and convert it back to a Response
-      return translation.parseResponse(AvaticaUtils.readFullyToBytes(inputStream));
+      resp = translation.parseResponse(AvaticaUtils.readFullyToBytes(inputStream));
     } catch (IOException e) {
+      // Not a protobuf that we could parse.
       throw new RuntimeException(e);
     }
+
+    // The server had an error, throw an Exception for that.
+    if (resp instanceof ErrorResponse) {
+      throw ((ErrorResponse) resp).toException();
+    }
+
+    return resp;
   }
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteService.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteService.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteService.java
index 298aa95..f661cbd 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteService.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteService.java
@@ -53,22 +53,19 @@ public class RemoteService extends JsonService {
           wr.close();
         }
       }
-      int responseCode = connection.getResponseCode();
+      final int responseCode = connection.getResponseCode();
+      final InputStream inputStream;
       if (responseCode != HttpURLConnection.HTTP_OK) {
-        InputStream errorStream = connection.getErrorStream();
-        if (errorStream != null) {
-          String errorResponse = AvaticaUtils.readFully(errorStream);
-          ErrorResponse response = decode(errorResponse, ErrorResponse.class);
-          throw new RuntimeException("Remote driver error: " + response.message);
-        } else {
-          throw new RuntimeException("response code " + responseCode);
-        }
+        inputStream = connection.getErrorStream();
+      } else {
+        inputStream = connection.getInputStream();
       }
-      final InputStream inputStream = connection.getInputStream();
+
       return AvaticaUtils.readFully(inputStream);
     } catch (IOException e) {
       throw new RuntimeException(e);
     }
+
   }
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/main/java/org/apache/calcite/avatica/remote/Service.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/Service.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/Service.java
index 3717ab5..2309661 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/Service.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/Service.java
@@ -16,7 +16,9 @@
  */
 package org.apache.calcite.avatica.remote;
 
+import org.apache.calcite.avatica.AvaticaClientRuntimeException;
 import org.apache.calcite.avatica.AvaticaConnection;
+import org.apache.calcite.avatica.AvaticaSeverity;
 import org.apache.calcite.avatica.ConnectionPropertiesImpl;
 import org.apache.calcite.avatica.Meta;
 import org.apache.calcite.avatica.proto.Common;
@@ -30,11 +32,16 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import com.google.protobuf.Descriptors.Descriptor;
 import com.google.protobuf.Message;
 
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.sql.SQLException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Objects;
 
 /**
  * API for request-response calls to an Avatica server.
@@ -113,7 +120,8 @@ public interface Service {
           name = "closeConnection"),
       @JsonSubTypes.Type(value = ConnectionSyncResponse.class, name = "connectionSync"),
       @JsonSubTypes.Type(value = DatabasePropertyResponse.class, name = "databaseProperties"),
-      @JsonSubTypes.Type(value = ExecuteResponse.class, name = "executeResults") })
+      @JsonSubTypes.Type(value = ExecuteResponse.class, name = "executeResults"),
+      @JsonSubTypes.Type(value = ErrorResponse.class, name = "error") })
   abstract class Response {
     abstract Response deserialize(Message genericMsg);
     abstract Message serialize();
@@ -1924,8 +1932,7 @@ public interface Service {
       return service.apply(this);
     }
 
-    @Override
-    Request deserialize(Message genericMsg) {
+    @Override Request deserialize(Message genericMsg) {
       if (!(genericMsg instanceof Requests.OpenConnectionRequest)) {
         throw new IllegalArgumentException(
             "Expected OpenConnectionRequest, but got" + genericMsg.getClass().getName());
@@ -1948,8 +1955,7 @@ public interface Service {
       return new OpenConnectionRequest(connectionId, info);
     }
 
-    @Override
-    Message serialize() {
+    @Override Message serialize() {
       Requests.OpenConnectionRequest.Builder builder = Requests.OpenConnectionRequest.newBuilder();
       if (null != connectionId) {
         builder.setConnectionId(connectionId);
@@ -2112,6 +2118,7 @@ public interface Service {
   /** Response from
    * {@link org.apache.calcite.avatica.remote.Service.CloseConnectionRequest}. */
   class CloseConnectionResponse extends Response {
+
     @JsonCreator
     public CloseConnectionResponse() {}
 
@@ -2438,74 +2445,149 @@ public interface Service {
   }
 
   /**
-   * ErrorResponse can be used in response to any kind of request. It is used internally
-   * by the transport layers to format errors for transport over the wire.
-   * Thus, {@link Request#apply} will never return an ErrorResponse.
+   * Response for any request that the server failed to successfully perform.
+   * It is used internally by the transport layers to format errors for
+   * transport over the wire. Thus, {@link Request#apply} will never return
+   * an ErrorResponse.
    */
-  class ErrorResponse extends Response {
-    public final String message;
+  public class ErrorResponse extends Response {
+    public static final int UNKNOWN_ERROR_CODE = -1;
+    public static final String UNKNOWN_SQL_STATE = "00000";
+
+    public final List<String> exceptions;
+    public final String errorMessage;
+    public final int errorCode;
+    public final String sqlState;
+    public final AvaticaSeverity severity;
 
-    public ErrorResponse() {
-      message = null;
+    ErrorResponse() {
+      exceptions = Collections.singletonList("Unhandled exception");
+      errorMessage = "Unknown message";
+      errorCode = -1;
+      sqlState = UNKNOWN_SQL_STATE;
+      severity = AvaticaSeverity.UNKNOWN;
     }
 
     @JsonCreator
-    public ErrorResponse(@JsonProperty("message") String message) {
-      this.message = message;
+    public ErrorResponse(@JsonProperty("exceptions") List<String> exceptions,
+        @JsonProperty("errorMessage") String errorMessage,
+        @JsonProperty("errorCode") int errorCode,
+        @JsonProperty("sqlState") String sqlState,
+        @JsonProperty("severity") AvaticaSeverity severity) {
+      this.exceptions = exceptions;
+      this.errorMessage = errorMessage;
+      this.errorCode = errorCode;
+      this.sqlState = sqlState;
+      this.severity = severity;
+    }
+
+    protected ErrorResponse(Exception e, String errorMessage, int code, String sqlState,
+        AvaticaSeverity severity) {
+      this(errorMessage, code, sqlState, severity, toStackTraces(e));
+    }
+
+    protected ErrorResponse(String errorMessage, int code, String sqlState,
+        AvaticaSeverity severity, List<String> exceptions) {
+      this.exceptions = exceptions;
+      this.errorMessage = errorMessage;
+      this.errorCode = code;
+      this.sqlState = sqlState;
+      this.severity = severity;
+    }
+
+    static List<String> toStackTraces(Exception e) {
+      List<String> stackTraces = new ArrayList<>();
+      stackTraces.add(toString(e));
+      if (e instanceof SQLException) {
+        SQLException next = ((SQLException) e).getNextException();
+        while (null != next) {
+          stackTraces.add(toString(next));
+          next = next.getNextException();
+        }
+      }
+      return stackTraces;
+    }
+
+    static String toString(Exception e) {
+      StringWriter sw = new StringWriter();
+      Objects.requireNonNull(e).printStackTrace(new PrintWriter(sw));
+      return sw.toString();
     }
 
     @Override ErrorResponse deserialize(Message genericMsg) {
       if (!(genericMsg instanceof Responses.ErrorResponse)) {
-        throw new IllegalArgumentException(
-            "Expected ErrorResponse, but got " + genericMsg.getClass().getName());
-      }
-
-      final Responses.ErrorResponse msg = (Responses.ErrorResponse) genericMsg;
-      final Descriptor desc = msg.getDescriptorForType();
-
-      String message = null;
-      if (ProtobufService.hasField(msg, desc,
-          Responses.ErrorResponse.MESSAGE_FIELD_NUMBER)) {
-        message = msg.getMessage();
+        throw new IllegalArgumentException("Expected ErrorResponse, but got "
+          + genericMsg.getClass());
       }
 
-      return new ErrorResponse(message);
+      Responses.ErrorResponse msg = (Responses.ErrorResponse) genericMsg;
+      return new ErrorResponse(msg.getExceptionsList(), msg.getErrorMessage(),
+          msg.getErrorCode(), msg.getSqlState(), AvaticaSeverity.fromProto(msg.getSeverity()));
     }
 
     @Override Responses.ErrorResponse serialize() {
       Responses.ErrorResponse.Builder builder = Responses.ErrorResponse.newBuilder();
-
-      if (null != message) {
-        builder.setMessage(message);
-      }
-
-      return builder.build();
+      return builder.addAllExceptions(exceptions).setErrorMessage(errorMessage)
+          .setErrorCode(errorCode).setSqlState(sqlState).setSeverity(severity.toProto()).build();
     }
 
     @Override public int hashCode() {
-      return message == null ? 0 : message.hashCode();
+      final int prime = 31;
+      int result = 1;
+      result = prime * result + ((exceptions == null) ? 0 : exceptions.hashCode());
+      result = prime * result + errorCode;
+      result = prime * result + ((sqlState == null) ? 0 : sqlState.hashCode());
+      result = prime * result + ((severity == null) ? 0 : severity.hashCode());
+      return result;
     }
 
-    @Override public boolean equals(Object o) {
-      if (o == this) {
+    @Override public boolean equals(Object obj) {
+      if (this == obj) {
         return true;
       }
+      if (!(obj instanceof ErrorResponse)) {
+        return false;
+      }
 
-      if (o instanceof ErrorResponse) {
-        ErrorResponse other = (ErrorResponse) o;
+      ErrorResponse other = (ErrorResponse) obj;
+      if (exceptions == null) {
+        if (other.exceptions != null) {
+          return false;
+        }
+      } else if (!exceptions.equals(other.exceptions)) {
+        return false;
+      }
 
-        if (null == message) {
-          if (null != other.message) {
-            return false;
-          }
-        } else if (!message.equals(other.message)) {
+      if (errorMessage == null) {
+        if (other.errorMessage != null) {
           return false;
         }
+      } else if (!errorMessage.equals(other.errorMessage)) {
+        return false;
+      }
 
-        return true;
+      if (errorCode != other.errorCode) {
+        return false;
       }
 
-      return false;
+      if (sqlState == null) {
+        if (other.sqlState != null) {
+          return false;
+        }
+      } else if (!sqlState.equals(other.sqlState)) {
+        return false;
+      }
+
+      if (severity != other.severity) {
+        return false;
+      }
+
+      return true;
+    }
+
+    public AvaticaClientRuntimeException toException() {
+      return new AvaticaClientRuntimeException("Remote driver error: " + errorMessage, errorCode,
+          sqlState, severity, exceptions);
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/main/protobuf/common.proto
----------------------------------------------------------------------
diff --git a/avatica/src/main/protobuf/common.proto b/avatica/src/main/protobuf/common.proto
index 05bb7c2..3716c7e 100644
--- a/avatica/src/main/protobuf/common.proto
+++ b/avatica/src/main/protobuf/common.proto
@@ -189,3 +189,12 @@ message TypedValue {
   double double_value = 6; // big numbers
   bool null = 7; // a null object
 }
+
+// The severity of some unexpected outcome to an operation.
+// Protobuf enum values must be unique across all other enums
+enum Severity {
+  UNKNOWN_SEVERITY = 0;
+  FATAL_SEVERITY = 1;
+  ERROR_SEVERITY = 2;
+  WARNING_SEVERITY = 3;
+}

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/main/protobuf/responses.proto
----------------------------------------------------------------------
diff --git a/avatica/src/main/protobuf/responses.proto b/avatica/src/main/protobuf/responses.proto
index e4f52a3..7c52be7 100644
--- a/avatica/src/main/protobuf/responses.proto
+++ b/avatica/src/main/protobuf/responses.proto
@@ -82,6 +82,11 @@ message DatabasePropertyResponse {
   repeated DatabasePropertyElement props = 1;
 }
 
+// Send contextual information about some error over the wire from the server.
 message ErrorResponse {
-  string message = 1;
+  repeated string exceptions = 1; // exception stacktraces, many for linked exceptions.
+  string error_message = 2; // human readable description
+  Severity severity = 3;
+  uint32 error_code = 4; // numeric identifier for error
+  string sql_state = 5; // five-character standard-defined value
 }

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/test/java/org/apache/calcite/avatica/remote/AbstractHandlerTest.java
----------------------------------------------------------------------
diff --git a/avatica/src/test/java/org/apache/calcite/avatica/remote/AbstractHandlerTest.java b/avatica/src/test/java/org/apache/calcite/avatica/remote/AbstractHandlerTest.java
new file mode 100644
index 0000000..012cccc
--- /dev/null
+++ b/avatica/src/test/java/org/apache/calcite/avatica/remote/AbstractHandlerTest.java
@@ -0,0 +1,165 @@
+/*
+ * 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.remote;
+
+import org.apache.calcite.avatica.AvaticaSeverity;
+import org.apache.calcite.avatica.remote.Handler.HandlerResponse;
+import org.apache.calcite.avatica.remote.Service.ErrorResponse;
+import org.apache.calcite.avatica.remote.Service.Request;
+import org.apache.calcite.avatica.remote.Service.Response;
+
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.Arrays;
+import java.util.Objects;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Test for common functionality across {@link Handler} implementations.
+ */
+public class AbstractHandlerTest {
+
+  private String exceptionToString(Exception e) {
+    StringWriter sw = new StringWriter();
+    PrintWriter pw = new PrintWriter(sw);
+    Objects.requireNonNull(e).printStackTrace(pw);
+    return sw.toString();
+  }
+
+  @Test public void testExceptionUnwrappingWithoutContext() {
+    @SuppressWarnings("unchecked")
+    AbstractHandler<String> handler = Mockito.mock(AbstractHandler.class);
+
+    Mockito.when(handler.unwrapException(Mockito.any(Exception.class))).thenCallRealMethod();
+
+    Exception e = new RuntimeException();
+    Response resp = handler.unwrapException(e);
+    assertTrue("Response should be ErrorResponse, but was " + resp.getClass(),
+        resp instanceof ErrorResponse);
+    ErrorResponse errorResp = (ErrorResponse) resp;
+    assertEquals(ErrorResponse.UNKNOWN_ERROR_CODE, errorResp.errorCode);
+    assertEquals(AvaticaSeverity.UNKNOWN, errorResp.severity);
+    assertEquals(Arrays.asList(exceptionToString(e)), errorResp.exceptions);
+
+    e = new AvaticaRuntimeException();
+    resp = handler.unwrapException(e);
+    assertTrue("Response should be ErrorResponse, but was " + resp.getClass(),
+        resp instanceof ErrorResponse);
+    errorResp = (ErrorResponse) resp;
+    assertEquals(ErrorResponse.UNKNOWN_ERROR_CODE, errorResp.errorCode);
+    assertEquals(AvaticaSeverity.UNKNOWN, errorResp.severity);
+    assertEquals(Arrays.asList(exceptionToString(e)), errorResp.exceptions);
+  }
+
+  @Test public void testExceptionUnwrappingWithContext() {
+    @SuppressWarnings("unchecked")
+    AbstractHandler<String> handler = Mockito.mock(AbstractHandler.class);
+
+    Mockito.when(handler.unwrapException(Mockito.any(Exception.class))).thenCallRealMethod();
+
+    final String msg = "Something failed!";
+    AvaticaRuntimeException e = new AvaticaRuntimeException(msg,
+        ErrorResponse.UNKNOWN_ERROR_CODE, ErrorResponse.UNKNOWN_SQL_STATE, AvaticaSeverity.FATAL);
+    Response resp = handler.unwrapException(e);
+    assertTrue("Response should be ErrorResponse, but was " + resp.getClass(),
+        resp instanceof ErrorResponse);
+    ErrorResponse errorResp = (ErrorResponse) resp;
+    assertEquals(ErrorResponse.UNKNOWN_ERROR_CODE, errorResp.errorCode);
+    assertEquals(AvaticaSeverity.FATAL, errorResp.severity);
+    assertEquals(Arrays.asList(exceptionToString(e)), errorResp.exceptions);
+    assertEquals(msg, errorResp.errorMessage);
+  }
+
+  @Test public void testFailedResponseSerialization() throws IOException {
+    @SuppressWarnings("unchecked")
+    final AbstractHandler<String> handler = Mockito.mock(AbstractHandler.class);
+    final Request request = Mockito.mock(Request.class);
+    final Response response = Mockito.mock(Response.class);
+    final IOException exception = new IOException();
+    final ErrorResponse errorResponse = Mockito.mock(ErrorResponse.class);
+    final String serializedErrorResponse = "An ErrorResponse";
+
+    // Accept a serialized request
+    Mockito.when(handler.apply(Mockito.anyString())).thenCallRealMethod();
+    // Deserialize it back into a POJO
+    Mockito.when(handler.decode(Mockito.anyString())).thenReturn(request);
+    // Construct the Response for that Request
+    Mockito.when(request.accept(Mockito.any(Service.class))).thenReturn(response);
+    // Throw an IOException when serializing the Response.
+    Mockito.when(handler.encode(response)).thenThrow(exception);
+    // Convert the IOException into an ErrorResponse
+    Mockito.when(handler.unwrapException(exception)).thenReturn(errorResponse);
+    Mockito.when(handler.encode(errorResponse)).thenReturn(serializedErrorResponse);
+
+    HandlerResponse<String> handlerResp = handler.apply("this is mocked out");
+    assertEquals(500, handlerResp.getStatusCode());
+    assertEquals(serializedErrorResponse, handlerResp.getResponse());
+  }
+
+  @Test public void testFailedErrorResponseSerialization() throws IOException {
+    @SuppressWarnings("unchecked")
+    final AbstractHandler<String> handler = Mockito.mock(AbstractHandler.class);
+    final Request request = Mockito.mock(Request.class);
+    final Response response = Mockito.mock(Response.class);
+    final IOException exception = new IOException();
+    final ErrorResponse errorResponse = Mockito.mock(ErrorResponse.class);
+
+    // Accept a serialized request
+    Mockito.when(handler.apply(Mockito.anyString())).thenCallRealMethod();
+    // Deserialize it back into a POJO
+    Mockito.when(handler.decode(Mockito.anyString())).thenReturn(request);
+    // Construct the Response for that Request
+    Mockito.when(request.accept(Mockito.any(Service.class))).thenReturn(response);
+    // Throw an IOException when serializing the Response.
+    Mockito.when(handler.encode(response)).thenThrow(exception);
+    // Convert the IOException into an ErrorResponse
+    Mockito.when(handler.unwrapException(exception)).thenReturn(errorResponse);
+    // Fail to serialize the ErrorResponse
+    Mockito.when(handler.encode(errorResponse)).thenThrow(exception);
+
+    try {
+      handler.apply("this is mocked out");
+    } catch (RuntimeException e) {
+      assertEquals(exception, e.getCause());
+    }
+  }
+
+  @Test public void testFailedRequestDeserialization() throws IOException {
+    @SuppressWarnings("unchecked")
+    final AbstractHandler<String> handler = Mockito.mock(AbstractHandler.class);
+    final IOException exception = new IOException();
+
+    // Accept a serialized request
+    Mockito.when(handler.apply(Mockito.anyString())).thenCallRealMethod();
+    // Throw an Exception trying to convert it back into a POJO
+    Mockito.when(handler.decode(Mockito.anyString())).thenThrow(exception);
+
+    try {
+      handler.apply("this is mocked out");
+    } catch (RuntimeException e) {
+      assertEquals(exception, e.getCause());
+    }
+  }
+}
+
+// End AbstractHandlerTest.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/test/java/org/apache/calcite/avatica/remote/ErrorResponseTest.java
----------------------------------------------------------------------
diff --git a/avatica/src/test/java/org/apache/calcite/avatica/remote/ErrorResponseTest.java b/avatica/src/test/java/org/apache/calcite/avatica/remote/ErrorResponseTest.java
new file mode 100644
index 0000000..7ee6fcf
--- /dev/null
+++ b/avatica/src/test/java/org/apache/calcite/avatica/remote/ErrorResponseTest.java
@@ -0,0 +1,63 @@
+/*
+ * 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.remote;
+
+import org.apache.calcite.avatica.AvaticaClientRuntimeException;
+import org.apache.calcite.avatica.AvaticaSeverity;
+import org.apache.calcite.avatica.remote.Service.ErrorResponse;
+
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * A test class for ErrorResponse.
+ */
+public class ErrorResponseTest {
+
+  @Test public void testEquality() {
+    final String message = "There was an error";
+    final int code = 23;
+    final String state = "a1b2c";
+    final AvaticaSeverity severity = AvaticaSeverity.ERROR;
+    final List<String> exceptions = Arrays.asList("Server Stacktrace 1", "Server Stacktace 2");
+    assertEquals(new ErrorResponse(message, code, state, severity, exceptions),
+        new ErrorResponse(message, code, state, severity, exceptions));
+  }
+
+  @Test public void testToClientRTE() {
+    final String message = "There was an error";
+    final int code = 23;
+    final String state = "a1b2c";
+    final AvaticaSeverity severity = AvaticaSeverity.ERROR;
+    final List<String> exceptions = Arrays.asList("Server Stacktrace 1", "Server Stacktace 2");
+    final ErrorResponse resp = new ErrorResponse(message, code, state, severity, exceptions);
+    AvaticaClientRuntimeException exception = resp.toException();
+    assertTrue("Expected error message to end with '" + resp.errorMessage + "', but was '"
+        + exception.getMessage() + "'", exception.getMessage().endsWith(resp.errorMessage));
+    assertEquals(resp.errorCode, exception.getErrorCode());
+    assertEquals(resp.severity, exception.getSeverity());
+    assertEquals(resp.sqlState, exception.getSqlState());
+    assertEquals(resp.exceptions, exception.getServerExceptions());
+  }
+}
+
+// End ErrorResponseTest.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/test/java/org/apache/calcite/avatica/remote/ProtobufHandlerTest.java
----------------------------------------------------------------------
diff --git a/avatica/src/test/java/org/apache/calcite/avatica/remote/ProtobufHandlerTest.java b/avatica/src/test/java/org/apache/calcite/avatica/remote/ProtobufHandlerTest.java
index 2e307ca..aa03c3c 100644
--- a/avatica/src/test/java/org/apache/calcite/avatica/remote/ProtobufHandlerTest.java
+++ b/avatica/src/test/java/org/apache/calcite/avatica/remote/ProtobufHandlerTest.java
@@ -21,6 +21,7 @@ import org.apache.calcite.avatica.Meta.Frame;
 import org.apache.calcite.avatica.proto.Common;
 import org.apache.calcite.avatica.proto.Requests;
 import org.apache.calcite.avatica.proto.Responses;
+import org.apache.calcite.avatica.remote.Handler.HandlerResponse;
 import org.apache.calcite.avatica.remote.Service.FetchRequest;
 import org.apache.calcite.avatica.remote.Service.FetchResponse;
 
@@ -90,7 +91,9 @@ public class ProtobufHandlerTest {
     when(translation.serializeResponse(response))
         .thenReturn(response.serialize().toByteArray());
 
-    byte[] serializedResponse = handler.apply(serializedRequest);
+    HandlerResponse<byte[]> handlerResponse = handler.apply(serializedRequest);
+    byte[] serializedResponse = handlerResponse.getResponse();
+    assertEquals(200, handlerResponse.getStatusCode());
 
     Responses.FetchResponse protoResponse = Responses.FetchResponse.parseFrom(serializedResponse);
 

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/test/java/org/apache/calcite/avatica/remote/ProtobufTranslationImplTest.java
----------------------------------------------------------------------
diff --git a/avatica/src/test/java/org/apache/calcite/avatica/remote/ProtobufTranslationImplTest.java b/avatica/src/test/java/org/apache/calcite/avatica/remote/ProtobufTranslationImplTest.java
index 337932e..d385054 100644
--- a/avatica/src/test/java/org/apache/calcite/avatica/remote/ProtobufTranslationImplTest.java
+++ b/avatica/src/test/java/org/apache/calcite/avatica/remote/ProtobufTranslationImplTest.java
@@ -17,6 +17,7 @@
 package org.apache.calcite.avatica.remote;
 
 import org.apache.calcite.avatica.AvaticaParameter;
+import org.apache.calcite.avatica.AvaticaSeverity;
 import org.apache.calcite.avatica.ColumnMetaData;
 import org.apache.calcite.avatica.ColumnMetaData.Rep;
 import org.apache.calcite.avatica.ConnectionPropertiesImpl;
@@ -60,6 +61,8 @@ import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
 
 import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
 import java.sql.Types;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -273,7 +276,11 @@ public class ProtobufTranslationImplTest<T> {
             new Meta.StatementHandle("connectionId", Integer.MAX_VALUE,
                 signature)));
 
-    responses.add(new ErrorResponse("an error occurred"));
+    StringWriter sw = new StringWriter();
+    new Exception().printStackTrace(new PrintWriter(sw));
+    responses.add(new ErrorResponse(Collections.singletonList(sw.toString()), "Test Error Message",
+        ErrorResponse.UNKNOWN_ERROR_CODE, ErrorResponse.UNKNOWN_SQL_STATE,
+        AvaticaSeverity.WARNING));
 
     return responses;
   }

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/test/java/org/apache/calcite/avatica/test/AvaticaClientRuntimeExceptionTest.java
----------------------------------------------------------------------
diff --git a/avatica/src/test/java/org/apache/calcite/avatica/test/AvaticaClientRuntimeExceptionTest.java b/avatica/src/test/java/org/apache/calcite/avatica/test/AvaticaClientRuntimeExceptionTest.java
new file mode 100644
index 0000000..d457aa3
--- /dev/null
+++ b/avatica/src/test/java/org/apache/calcite/avatica/test/AvaticaClientRuntimeExceptionTest.java
@@ -0,0 +1,50 @@
+/*
+ * 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.test;
+
+import org.apache.calcite.avatica.AvaticaClientRuntimeException;
+import org.apache.calcite.avatica.AvaticaSeverity;
+
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Test class for {@link AvaticaClientRuntimeException}.
+ */
+public class AvaticaClientRuntimeExceptionTest {
+
+  @Test public void testGetters() {
+    final String errorMsg = "My error message";
+    final int errorCode = 10;
+    final String sqlState = "abc12";
+    final AvaticaSeverity severity = AvaticaSeverity.ERROR;
+    final List<String> stacktraces = Arrays.asList("my stack trace");
+    AvaticaClientRuntimeException e = new AvaticaClientRuntimeException(errorMsg, errorCode,
+        sqlState, severity, stacktraces);
+    assertEquals(errorMsg, e.getMessage());
+    assertEquals(errorCode, e.getErrorCode());
+    assertEquals(severity, e.getSeverity());
+    assertEquals(stacktraces, e.getServerExceptions());
+  }
+
+}
+
+// End AvaticaClientRuntimeExceptionTest.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/test/java/org/apache/calcite/avatica/test/AvaticaSeverityTest.java
----------------------------------------------------------------------
diff --git a/avatica/src/test/java/org/apache/calcite/avatica/test/AvaticaSeverityTest.java b/avatica/src/test/java/org/apache/calcite/avatica/test/AvaticaSeverityTest.java
new file mode 100644
index 0000000..945f959
--- /dev/null
+++ b/avatica/src/test/java/org/apache/calcite/avatica/test/AvaticaSeverityTest.java
@@ -0,0 +1,39 @@
+/*
+ * 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.test;
+
+import org.apache.calcite.avatica.AvaticaSeverity;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Tests for {@link AvaticaSeverity}.
+ */
+public class AvaticaSeverityTest {
+
+  @Test
+  public void testProtobufSerialization() {
+    for (AvaticaSeverity severity : AvaticaSeverity.values()) {
+      assertEquals(severity, AvaticaSeverity.fromProto(severity.toProto()));
+    }
+  }
+
+}
+
+// End AvaticaSeverityTest.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/test/java/org/apache/calcite/avatica/test/AvaticaSqlExceptionTest.java
----------------------------------------------------------------------
diff --git a/avatica/src/test/java/org/apache/calcite/avatica/test/AvaticaSqlExceptionTest.java b/avatica/src/test/java/org/apache/calcite/avatica/test/AvaticaSqlExceptionTest.java
new file mode 100644
index 0000000..fb10c45
--- /dev/null
+++ b/avatica/src/test/java/org/apache/calcite/avatica/test/AvaticaSqlExceptionTest.java
@@ -0,0 +1,49 @@
+/*
+ * 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.test;
+
+import org.apache.calcite.avatica.AvaticaSqlException;
+
+import org.junit.Test;
+
+import java.util.Arrays;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Tests for {@link AvaticaSqlException}.
+ */
+public class AvaticaSqlExceptionTest {
+
+  @Test public void testGetters() {
+    final String msg = "My query failed!";
+    final int code = 42;
+    final String sql = "SELECT foo FROM bar;";
+    final String stacktrace = "My Stack Trace";
+
+    AvaticaSqlException e = new AvaticaSqlException(msg, sql, code, Arrays.asList(stacktrace));
+    assertTrue(e.getMessage().contains(msg));
+    assertEquals(code, e.getErrorCode());
+    assertEquals(sql, e.getSQLState());
+    assertEquals(1, e.getStackTraces().size());
+    assertEquals(stacktrace, e.getStackTraces().get(0));
+  }
+
+}
+
+// End AvaticaSqlExceptionTest.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/core/src/test/java/org/apache/calcite/test/ExceptionMessageTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/ExceptionMessageTest.java b/core/src/test/java/org/apache/calcite/test/ExceptionMessageTest.java
index 4147bcd..59a3bfa 100644
--- a/core/src/test/java/org/apache/calcite/test/ExceptionMessageTest.java
+++ b/core/src/test/java/org/apache/calcite/test/ExceptionMessageTest.java
@@ -109,7 +109,7 @@ public class ExceptionMessageTest {
       fail("Query badEntries should result in an exception");
     } catch (SQLException e) {
       assertThat(e.getMessage(),
-          equalTo("error while executing SQL \"select * from \"badEntries\"\": "
+          equalTo("Error while executing SQL \"select * from \"badEntries\"\": "
               + "Can't iterate over badEntries"));
     }
   }
@@ -120,7 +120,7 @@ public class ExceptionMessageTest {
       fail("Query should fail");
     } catch (SQLException e) {
       assertThat(e.getMessage(),
-          equalTo("error while executing SQL \"invalid sql\": parse failed: "
+          equalTo("Error while executing SQL \"invalid sql\": parse failed: "
               + "Non-query expression encountered in illegal context"));
     }
   }



[04/11] incubator-calcite git commit: [CALCITE-912] Add Avatica OpenConnectionRequest (Bruno Dumon)

Posted by jh...@apache.org.
[CALCITE-912] Add Avatica OpenConnectionRequest (Bruno Dumon)

Goal: passing of connection properties (the 'info') from the remote
avatica driver to the corresponding server-side connection.

Changes include:
 * in Meta: explicit opening of connections: there is a new
   openConnection() call. Client decides on the connection id.
   Implicit creation of unknown connections is gone.
 * JdbcMeta: default connection is gone, all methods have been
   extended with a connection id.
 * correspondingly, the various Service.Request's now carry a
   connection id (will make fixing CALCITE-871 easy)
 * (unrelated, but was useful for testing) more meaningful error
   messages in remote driver


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

Branch: refs/heads/master
Commit: a63639b1ab7c52f5b425a69359d66ce08ee59bbc
Parents: d50c46a
Author: Bruno Dumon <br...@ngdata.com>
Authored: Thu Oct 15 19:32:32 2015 +0200
Committer: Julian Hyde <jh...@apache.org>
Committed: Thu Oct 22 18:27:45 2015 -0700

----------------------------------------------------------------------
 avatica-server/pom.xml                          |    5 +
 .../apache/calcite/avatica/jdbc/JdbcMeta.java   |  119 +-
 .../calcite/avatica/server/AvaticaHandler.java  |   29 +-
 .../avatica/server/AvaticaProtobufHandler.java  |   25 +-
 .../calcite/avatica/RemoteDriverMockTest.java   |    3 +-
 .../calcite/avatica/RemoteDriverTest.java       |   23 +-
 .../calcite/avatica/remote/RemoteMetaTest.java  |   56 +
 .../calcite/avatica/AvaticaConnection.java      |    3 +-
 .../avatica/AvaticaDatabaseMetaData.java        |   63 +-
 .../java/org/apache/calcite/avatica/Meta.java   |   87 +-
 .../org/apache/calcite/avatica/MetaImpl.java    |   77 +-
 .../apache/calcite/avatica/proto/Requests.java  | 2030 +++++++++++++++---
 .../apache/calcite/avatica/proto/Responses.java |  804 ++++++-
 .../apache/calcite/avatica/remote/Driver.java   |   49 +-
 .../calcite/avatica/remote/JsonHandler.java     |    8 +-
 .../calcite/avatica/remote/JsonService.java     |    8 +
 .../calcite/avatica/remote/LocalService.java    |   27 +-
 .../calcite/avatica/remote/MockJsonService.java |   39 +-
 .../avatica/remote/MockProtobufService.java     |   21 +-
 .../calcite/avatica/remote/ProtobufService.java |    5 +
 .../avatica/remote/ProtobufTranslationImpl.java |   10 +
 .../calcite/avatica/remote/RemoteMeta.java      |   34 +-
 .../avatica/remote/RemoteProtobufService.java   |    9 +-
 .../calcite/avatica/remote/RemoteService.java   |   11 +-
 .../apache/calcite/avatica/remote/Service.java  |  500 ++++-
 avatica/src/main/protobuf/requests.proto        |   17 +-
 avatica/src/main/protobuf/responses.proto       |    9 +
 .../remote/ProtobufTranslationImplTest.java     |   26 +-
 .../calcite/avatica/test/JsonHandlerTest.java   |    4 +
 .../apache/calcite/jdbc/CalciteMetaImpl.java    |   16 +-
 pom.xml                                         |    6 +
 31 files changed, 3612 insertions(+), 511 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/avatica-server/pom.xml
----------------------------------------------------------------------
diff --git a/avatica-server/pom.xml b/avatica-server/pom.xml
index 1695c07..2d98046 100644
--- a/avatica-server/pom.xml
+++ b/avatica-server/pom.xml
@@ -95,6 +95,11 @@ limitations under the License.
       <artifactId>mockito-all</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>com.github.stephenc.jcip</groupId>
+      <artifactId>jcip-annotations</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <build>

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java
----------------------------------------------------------------------
diff --git a/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java b/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java
index 3585185..4054939 100644
--- a/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java
+++ b/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java
@@ -84,7 +84,6 @@ public class JdbcMeta implements Meta {
 
   private final String url;
   private final Properties info;
-  private final Connection connection; // TODO: remove default connection
   private final Cache<String, Connection> connectionCache;
   private final Cache<Integer, StatementInfo> statementCache;
 
@@ -129,7 +128,6 @@ public class JdbcMeta implements Meta {
   public JdbcMeta(String url, Properties info) throws SQLException {
     this.url = url;
     this.info = info;
-    this.connection = DriverManager.getConnection(url, info);
 
     int concurrencyLevel = Integer.parseInt(
         info.getProperty(ConnectionCacheSettings.CONCURRENCY_LEVEL.key(),
@@ -247,10 +245,10 @@ public class JdbcMeta implements Meta {
     return signature(metaData, null, null, null);
   }
 
-  public Map<DatabaseProperty, Object> getDatabaseProperties() {
+  public Map<DatabaseProperty, Object> getDatabaseProperties(ConnectionHandle ch) {
     try {
       final Map<DatabaseProperty, Object> map = new HashMap<>();
-      final DatabaseMetaData metaData = connection.getMetaData();
+      final DatabaseMetaData metaData = getConnection(ch.id).getMetaData();
       for (DatabaseProperty p : DatabaseProperty.values()) {
         addProperty(map, metaData, p);
       }
@@ -269,11 +267,11 @@ public class JdbcMeta implements Meta {
     }
   }
 
-  public MetaResultSet getTables(String catalog, Pat schemaPattern,
+  public MetaResultSet getTables(ConnectionHandle ch, String catalog, Pat schemaPattern,
       Pat tableNamePattern, List<String> typeList) {
     try {
       final ResultSet rs =
-          connection.getMetaData().getTables(catalog, schemaPattern.s,
+          getConnection(ch.id).getMetaData().getTables(catalog, schemaPattern.s,
               tableNamePattern.s, toArray(typeList));
       return JdbcResultSet.create(DEFAULT_CONN_ID, -1, rs);
     } catch (SQLException e) {
@@ -281,63 +279,63 @@ public class JdbcMeta implements Meta {
     }
   }
 
-  public MetaResultSet getColumns(String catalog, Pat schemaPattern,
+  public MetaResultSet getColumns(ConnectionHandle ch, String catalog, Pat schemaPattern,
       Pat tableNamePattern, Pat columnNamePattern) {
     try {
       final ResultSet rs =
-          connection.getMetaData().getColumns(
-              catalog, schemaPattern.s, tableNamePattern.s, columnNamePattern.s);
+          getConnection(ch.id).getMetaData().getColumns(catalog, schemaPattern.s,
+              tableNamePattern.s, columnNamePattern.s);
       return JdbcResultSet.create(DEFAULT_CONN_ID, -1, rs, UNLIMITED_COUNT);
     } catch (SQLException e) {
       throw new RuntimeException(e);
     }
   }
 
-  public MetaResultSet getSchemas(String catalog, Pat schemaPattern) {
+  public MetaResultSet getSchemas(ConnectionHandle ch, String catalog, Pat schemaPattern) {
     try {
       final ResultSet rs =
-          connection.getMetaData().getSchemas(catalog, schemaPattern.s);
+          getConnection(ch.id).getMetaData().getSchemas(catalog, schemaPattern.s);
       return JdbcResultSet.create(DEFAULT_CONN_ID, -1, rs, UNLIMITED_COUNT);
     } catch (SQLException e) {
       throw new RuntimeException(e);
     }
   }
 
-  public MetaResultSet getCatalogs() {
+  public MetaResultSet getCatalogs(ConnectionHandle ch) {
     try {
-      final ResultSet rs = connection.getMetaData().getCatalogs();
+      final ResultSet rs = getConnection(ch.id).getMetaData().getCatalogs();
       return JdbcResultSet.create(DEFAULT_CONN_ID, -1, rs, UNLIMITED_COUNT);
     } catch (SQLException e) {
       throw new RuntimeException(e);
     }
   }
 
-  public MetaResultSet getTableTypes() {
+  public MetaResultSet getTableTypes(ConnectionHandle ch) {
     try {
-      final ResultSet rs = connection.getMetaData().getTableTypes();
+      final ResultSet rs = getConnection(ch.id).getMetaData().getTableTypes();
       return JdbcResultSet.create(DEFAULT_CONN_ID, -1, rs, UNLIMITED_COUNT);
     } catch (SQLException e) {
       throw new RuntimeException(e);
     }
   }
 
-  public MetaResultSet getProcedures(String catalog, Pat schemaPattern,
+  public MetaResultSet getProcedures(ConnectionHandle ch, String catalog, Pat schemaPattern,
       Pat procedureNamePattern) {
     try {
       final ResultSet rs =
-          connection.getMetaData().getProcedures(
-              catalog, schemaPattern.s, procedureNamePattern.s);
+          getConnection(ch.id).getMetaData().getProcedures(catalog, schemaPattern.s,
+              procedureNamePattern.s);
       return JdbcResultSet.create(DEFAULT_CONN_ID, -1, rs, UNLIMITED_COUNT);
     } catch (SQLException e) {
       throw new RuntimeException(e);
     }
   }
 
-  public MetaResultSet getProcedureColumns(String catalog, Pat schemaPattern,
+  public MetaResultSet getProcedureColumns(ConnectionHandle ch, String catalog, Pat schemaPattern,
       Pat procedureNamePattern, Pat columnNamePattern) {
     try {
       final ResultSet rs =
-          connection.getMetaData().getProcedureColumns(catalog,
+          getConnection(ch.id).getMetaData().getProcedureColumns(catalog,
               schemaPattern.s, procedureNamePattern.s, columnNamePattern.s);
       return JdbcResultSet.create(DEFAULT_CONN_ID, -1, rs, UNLIMITED_COUNT);
     } catch (SQLException e) {
@@ -345,11 +343,11 @@ public class JdbcMeta implements Meta {
     }
   }
 
-  public MetaResultSet getColumnPrivileges(String catalog, String schema,
+  public MetaResultSet getColumnPrivileges(ConnectionHandle ch, String catalog, String schema,
       String table, Pat columnNamePattern) {
     try {
       final ResultSet rs =
-          connection.getMetaData().getColumnPrivileges(catalog, schema,
+          getConnection(ch.id).getMetaData().getColumnPrivileges(catalog, schema,
               table, columnNamePattern.s);
       return JdbcResultSet.create(DEFAULT_CONN_ID, -1, rs, UNLIMITED_COUNT);
     } catch (SQLException e) {
@@ -357,11 +355,11 @@ public class JdbcMeta implements Meta {
     }
   }
 
-  public MetaResultSet getTablePrivileges(String catalog, Pat schemaPattern,
+  public MetaResultSet getTablePrivileges(ConnectionHandle ch, String catalog, Pat schemaPattern,
       Pat tableNamePattern) {
     try {
       final ResultSet rs =
-          connection.getMetaData().getTablePrivileges(catalog,
+          getConnection(ch.id).getMetaData().getTablePrivileges(catalog,
               schemaPattern.s, tableNamePattern.s);
       return JdbcResultSet.create(DEFAULT_CONN_ID, -1, rs, UNLIMITED_COUNT);
     } catch (SQLException e) {
@@ -369,7 +367,7 @@ public class JdbcMeta implements Meta {
     }
   }
 
-  public MetaResultSet getBestRowIdentifier(String catalog, String schema,
+  public MetaResultSet getBestRowIdentifier(ConnectionHandle ch, String catalog, String schema,
       String table, int scope, boolean nullable) {
     if (LOG.isTraceEnabled()) {
       LOG.trace("getBestRowIdentifier catalog:" + catalog + " schema:" + schema
@@ -377,7 +375,7 @@ public class JdbcMeta implements Meta {
     }
     try {
       final ResultSet rs =
-          connection.getMetaData().getBestRowIdentifier(catalog, schema,
+          getConnection(ch.id).getMetaData().getBestRowIdentifier(catalog, schema,
               table, scope, nullable);
       return JdbcResultSet.create(DEFAULT_CONN_ID, -1, rs, UNLIMITED_COUNT);
     } catch (SQLException e) {
@@ -385,99 +383,99 @@ public class JdbcMeta implements Meta {
     }
   }
 
-  public MetaResultSet getVersionColumns(String catalog, String schema,
+  public MetaResultSet getVersionColumns(ConnectionHandle ch, String catalog, String schema,
       String table) {
     if (LOG.isTraceEnabled()) {
       LOG.trace("getVersionColumns catalog:" + catalog + " schema:" + schema + " table:" + table);
     }
     try {
       final ResultSet rs =
-          connection.getMetaData().getVersionColumns(catalog, schema, table);
+          getConnection(ch.id).getMetaData().getVersionColumns(catalog, schema, table);
       return JdbcResultSet.create(DEFAULT_CONN_ID, -1, rs, UNLIMITED_COUNT);
     } catch (SQLException e) {
       throw new RuntimeException(e);
     }
   }
 
-  public MetaResultSet getPrimaryKeys(String catalog, String schema,
+  public MetaResultSet getPrimaryKeys(ConnectionHandle ch, String catalog, String schema,
       String table) {
     if (LOG.isTraceEnabled()) {
       LOG.trace("getPrimaryKeys catalog:" + catalog + " schema:" + schema + " table:" + table);
     }
     try {
       final ResultSet rs =
-          connection.getMetaData().getPrimaryKeys(catalog, schema, table);
+          getConnection(ch.id).getMetaData().getPrimaryKeys(catalog, schema, table);
       return JdbcResultSet.create(DEFAULT_CONN_ID, -1, rs, UNLIMITED_COUNT);
     } catch (SQLException e) {
       throw new RuntimeException(e);
     }
   }
 
-  public MetaResultSet getImportedKeys(String catalog, String schema,
+  public MetaResultSet getImportedKeys(ConnectionHandle ch, String catalog, String schema,
       String table) {
     return null;
   }
 
-  public MetaResultSet getExportedKeys(String catalog, String schema,
+  public MetaResultSet getExportedKeys(ConnectionHandle ch, String catalog, String schema,
       String table) {
     return null;
   }
 
-  public MetaResultSet getCrossReference(String parentCatalog,
+  public MetaResultSet getCrossReference(ConnectionHandle ch, String parentCatalog,
       String parentSchema, String parentTable, String foreignCatalog,
       String foreignSchema, String foreignTable) {
     return null;
   }
 
-  public MetaResultSet getTypeInfo() {
+  public MetaResultSet getTypeInfo(ConnectionHandle ch) {
     try {
-      final ResultSet rs = connection.getMetaData().getTypeInfo();
+      final ResultSet rs = getConnection(ch.id).getMetaData().getTypeInfo();
       return JdbcResultSet.create(DEFAULT_CONN_ID, -1, rs, UNLIMITED_COUNT);
     } catch (SQLException e) {
       throw new RuntimeException(e);
     }
   }
 
-  public MetaResultSet getIndexInfo(String catalog, String schema, String table,
-      boolean unique, boolean approximate) {
+  public MetaResultSet getIndexInfo(ConnectionHandle ch, String catalog, String schema,
+      String table, boolean unique, boolean approximate) {
     return null;
   }
 
-  public MetaResultSet getUDTs(String catalog, Pat schemaPattern,
+  public MetaResultSet getUDTs(ConnectionHandle ch, String catalog, Pat schemaPattern,
       Pat typeNamePattern, int[] types) {
     return null;
   }
 
-  public MetaResultSet getSuperTypes(String catalog, Pat schemaPattern,
+  public MetaResultSet getSuperTypes(ConnectionHandle ch, String catalog, Pat schemaPattern,
       Pat typeNamePattern) {
     return null;
   }
 
-  public MetaResultSet getSuperTables(String catalog, Pat schemaPattern,
+  public MetaResultSet getSuperTables(ConnectionHandle ch, String catalog, Pat schemaPattern,
       Pat tableNamePattern) {
     return null;
   }
 
-  public MetaResultSet getAttributes(String catalog, Pat schemaPattern,
+  public MetaResultSet getAttributes(ConnectionHandle ch, String catalog, Pat schemaPattern,
       Pat typeNamePattern, Pat attributeNamePattern) {
     return null;
   }
 
-  public MetaResultSet getClientInfoProperties() {
+  public MetaResultSet getClientInfoProperties(ConnectionHandle ch) {
     return null;
   }
 
-  public MetaResultSet getFunctions(String catalog, Pat schemaPattern,
+  public MetaResultSet getFunctions(ConnectionHandle ch, String catalog, Pat schemaPattern,
       Pat functionNamePattern) {
     return null;
   }
 
-  public MetaResultSet getFunctionColumns(String catalog, Pat schemaPattern,
+  public MetaResultSet getFunctionColumns(ConnectionHandle ch, String catalog, Pat schemaPattern,
       Pat functionNamePattern, Pat columnNamePattern) {
     return null;
   }
 
-  public MetaResultSet getPseudoColumns(String catalog, Pat schemaPattern,
+  public MetaResultSet getPseudoColumns(ConnectionHandle ch, String catalog, Pat schemaPattern,
       Pat tableNamePattern, Pat columnNamePattern) {
     return null;
   }
@@ -488,10 +486,12 @@ public class JdbcMeta implements Meta {
   }
 
   protected Connection getConnection(String id) throws SQLException {
+    if (id == null) {
+      throw new NullPointerException("Connection id is null.");
+    }
     Connection conn = connectionCache.getIfPresent(id);
     if (conn == null) {
-      conn = DriverManager.getConnection(url, info);
-      connectionCache.put(id, conn);
+      throw new RuntimeException("Connection not found: invalid id, closed, or expired: " + id);
     }
     return conn;
   }
@@ -533,6 +533,27 @@ public class JdbcMeta implements Meta {
     }
   }
 
+  @Override
+  public void openConnection(ConnectionHandle ch, Map<String, String> info) {
+    Properties fullInfo = new Properties();
+    fullInfo.putAll(this.info);
+    if (info != null) {
+      fullInfo.putAll(info);
+    }
+
+    synchronized (this) {
+      try {
+        if (connectionCache.asMap().containsKey(ch.id)) {
+          throw new RuntimeException("Connection already exists: " + ch.id);
+        }
+        Connection conn = DriverManager.getConnection(url, fullInfo);
+        connectionCache.put(ch.id, conn);
+      } catch (SQLException e) {
+        throw new RuntimeException(e);
+      }
+    }
+  }
+
   @Override public void closeConnection(ConnectionHandle ch) {
     Connection conn = connectionCache.getIfPresent(ch.id);
     if (conn == null) {
@@ -839,10 +860,6 @@ public class JdbcMeta implements Meta {
     public void onRemoval(RemovalNotification<String, Connection> notification) {
       String connectionId = notification.getKey();
       Connection doomed = notification.getValue();
-      // is String.equals() more efficient?
-      if (notification.getValue() == connection) {
-        return;
-      }
       if (LOG.isDebugEnabled()) {
         LOG.debug("Expiring connection " + connectionId + " because "
                 + notification.getCause());

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaHandler.java
----------------------------------------------------------------------
diff --git a/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaHandler.java b/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaHandler.java
index 2ada444..acb7fcf 100644
--- a/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaHandler.java
+++ b/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaHandler.java
@@ -23,6 +23,11 @@ import org.apache.calcite.avatica.remote.Service;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+import com.google.common.base.Function;
+import com.google.common.base.Joiner;
+import com.google.common.base.Throwables;
+import com.google.common.collect.Iterables;
+
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.handler.AbstractHandler;
 
@@ -63,7 +68,14 @@ public class AvaticaHandler extends AbstractHandler {
       if (LOG.isTraceEnabled()) {
         LOG.trace("request: " + jsonRequest);
       }
-      final String jsonResponse = jsonHandler.apply(jsonRequest);
+      String jsonResponse;
+      try {
+        jsonResponse = jsonHandler.apply(jsonRequest);
+      } catch (Throwable t) {
+        LOG.error("Error handling request: " + jsonRequest, t);
+        response.setStatus(500);
+        jsonResponse = createErrorResponse(t);
+      }
       if (LOG.isTraceEnabled()) {
         LOG.trace("response: " + jsonResponse);
       }
@@ -71,6 +83,21 @@ public class AvaticaHandler extends AbstractHandler {
       response.getWriter().println(jsonResponse);
     }
   }
+
+  private String createErrorResponse(Throwable t) throws IOException {
+    return jsonHandler.encode(new Service.ErrorResponse(getErrorMessage(t)));
+  }
+
+  public static String getErrorMessage(Throwable t) {
+    return Joiner.on(" -> ").join(
+        Iterables.transform(Throwables.getCausalChain(t), new Function<Throwable, String>() {
+          @Override
+          public String apply(Throwable input) {
+            return input.getMessage() == null
+                ? "(null exception message)" : input.getMessage();
+          }
+        }));
+  }
 }
 
 // End AvaticaHandler.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaProtobufHandler.java
----------------------------------------------------------------------
diff --git a/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaProtobufHandler.java b/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaProtobufHandler.java
index 419ad1f..9432824 100644
--- a/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaProtobufHandler.java
+++ b/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaProtobufHandler.java
@@ -18,14 +18,17 @@ package org.apache.calcite.avatica.server;
 
 import org.apache.calcite.avatica.AvaticaUtils;
 import org.apache.calcite.avatica.remote.ProtobufHandler;
+import org.apache.calcite.avatica.remote.ProtobufTranslation;
 import org.apache.calcite.avatica.remote.ProtobufTranslationImpl;
 import org.apache.calcite.avatica.remote.Service;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.handler.AbstractHandler;
 
 import java.io.IOException;
-
 import javax.servlet.ServletException;
 import javax.servlet.ServletInputStream;
 import javax.servlet.http.HttpServletRequest;
@@ -35,11 +38,14 @@ import javax.servlet.http.HttpServletResponse;
  * Jetty handler that executes Avatica JSON request-responses.
  */
 public class AvaticaProtobufHandler extends AbstractHandler {
+  private static final Log LOG = LogFactory.getLog(AvaticaHandler.class);
 
   private final ProtobufHandler pbHandler;
+  private final ProtobufTranslation protobufTranslation;
 
   public AvaticaProtobufHandler(Service service) {
-    this.pbHandler = new ProtobufHandler(service, new ProtobufTranslationImpl());
+    this.protobufTranslation = new ProtobufTranslationImpl();
+    this.pbHandler = new ProtobufHandler(service, protobufTranslation);
   }
 
   public void handle(String target, Request baseRequest,
@@ -53,13 +59,26 @@ public class AvaticaProtobufHandler extends AbstractHandler {
         requestBytes = AvaticaUtils.readFullyToBytes(inputStream);
       }
 
-      byte[] responseBytes = pbHandler.apply(requestBytes);
+      byte[] responseBytes;
+      try {
+        responseBytes = pbHandler.apply(requestBytes);
+      } catch (Throwable t) {
+        LOG.error("Error handling request", t);
+        response.setStatus(500);
+        responseBytes = createErrorResponse(t);
+      }
 
       baseRequest.setHandled(true);
       response.getOutputStream().write(responseBytes);
     }
   }
 
+  private byte[] createErrorResponse(Throwable t) throws IOException {
+    Service.ErrorResponse errorResponse = new Service.ErrorResponse(
+        AvaticaHandler.getErrorMessage(t));
+    return protobufTranslation.serializeResponse(errorResponse);
+  }
+
 }
 
 // End AvaticaProtobufHandler.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/avatica-server/src/test/java/org/apache/calcite/avatica/RemoteDriverMockTest.java
----------------------------------------------------------------------
diff --git a/avatica-server/src/test/java/org/apache/calcite/avatica/RemoteDriverMockTest.java b/avatica-server/src/test/java/org/apache/calcite/avatica/RemoteDriverMockTest.java
index 5c4423d..9749ef6 100644
--- a/avatica-server/src/test/java/org/apache/calcite/avatica/RemoteDriverMockTest.java
+++ b/avatica-server/src/test/java/org/apache/calcite/avatica/RemoteDriverMockTest.java
@@ -94,8 +94,7 @@ public class RemoteDriverMockTest {
   }
 
   @Test public void testRegister() throws Exception {
-    final Connection connection =
-        DriverManager.getConnection("jdbc:avatica:remote:");
+    final Connection connection = getMockConnection();
     assertThat(connection.isClosed(), is(false));
     connection.close();
     assertThat(connection.isClosed(), is(true));

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/avatica-server/src/test/java/org/apache/calcite/avatica/RemoteDriverTest.java
----------------------------------------------------------------------
diff --git a/avatica-server/src/test/java/org/apache/calcite/avatica/RemoteDriverTest.java b/avatica-server/src/test/java/org/apache/calcite/avatica/RemoteDriverTest.java
index b3f45fd..a26f192 100644
--- a/avatica-server/src/test/java/org/apache/calcite/avatica/RemoteDriverTest.java
+++ b/avatica-server/src/test/java/org/apache/calcite/avatica/RemoteDriverTest.java
@@ -27,6 +27,8 @@ import org.apache.calcite.avatica.remote.Service;
 
 import com.google.common.cache.Cache;
 
+import net.jcip.annotations.NotThreadSafe;
+
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
@@ -69,6 +71,7 @@ import static org.junit.Assert.fail;
  * Unit test for Avatica Remote JDBC driver.
  */
 @RunWith(Parameterized.class)
+@NotThreadSafe // for testConnectionIsolation
 public class RemoteDriverTest {
   public static final String LJS =
       LocalJdbcServiceFactory.class.getName();
@@ -214,8 +217,7 @@ public class RemoteDriverTest {
   }
 
   @Test public void testRegister() throws Exception {
-    final Connection connection =
-        DriverManager.getConnection("jdbc:avatica:remote:");
+    final Connection connection = getLocalConnection();
     assertThat(connection.isClosed(), is(false));
     connection.close();
     assertThat(connection.isClosed(), is(true));
@@ -789,23 +791,26 @@ public class RemoteDriverTest {
   @Test public void testConnectionIsolation() throws Exception {
     ConnectionSpec.getDatabaseLock().lock();
     try {
-      final String sql = "select * from (values (1, 'a'))";
-      Connection conn1 = getLocalConnection();
-      Connection conn2 = getLocalConnection();
       Cache<String, Connection> connectionMap = getLocalConnectionInternals()
-          .getRemoteConnectionMap((AvaticaConnection) conn1);
+          .getRemoteConnectionMap((AvaticaConnection) getLocalConnection());
       // Other tests being run might leave connections in the cache.
       // The lock guards against more connections being cached during the test.
       connectionMap.invalidateAll();
+
+      final String sql = "select * from (values (1, 'a'))";
       assertEquals("connection cache should start empty",
           0, connectionMap.size());
+      Connection conn1 = getLocalConnection();
+      Connection conn2 = getLocalConnection();
+      assertEquals("we now have two connections open",
+          2, connectionMap.size());
       PreparedStatement conn1stmt1 = conn1.prepareStatement(sql);
       assertEquals(
-          "statement creation implicitly creates a connection server-side",
-          1, connectionMap.size());
+          "creating a statement does not cause new connection",
+          2, connectionMap.size());
       PreparedStatement conn2stmt1 = conn2.prepareStatement(sql);
       assertEquals(
-          "statement creation implicitly creates a connection server-side",
+          "creating a statement does not cause new connection",
           2, connectionMap.size());
       AvaticaPreparedStatement s1 = (AvaticaPreparedStatement) conn1stmt1;
       AvaticaPreparedStatement s2 = (AvaticaPreparedStatement) conn2stmt1;

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/avatica-server/src/test/java/org/apache/calcite/avatica/remote/RemoteMetaTest.java
----------------------------------------------------------------------
diff --git a/avatica-server/src/test/java/org/apache/calcite/avatica/remote/RemoteMetaTest.java b/avatica-server/src/test/java/org/apache/calcite/avatica/remote/RemoteMetaTest.java
index 1172335..df5983a 100644
--- a/avatica-server/src/test/java/org/apache/calcite/avatica/remote/RemoteMetaTest.java
+++ b/avatica-server/src/test/java/org/apache/calcite/avatica/remote/RemoteMetaTest.java
@@ -50,11 +50,13 @@ import java.util.Map;
 import java.util.Random;
 import java.util.UUID;
 
+import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 /** Tests covering {@link RemoteMeta}. */
 @RunWith(Parameterized.class)
@@ -295,6 +297,60 @@ public class RemoteMetaTest {
       ConnectionSpec.getDatabaseLock().unlock();
     }
   }
+
+  @Test public void testOpenConnectionWithProperties() throws Exception {
+    // This tests that username and password are used for creating a connection on the
+    // server. If this was not the case, it would succeed.
+    try {
+      DriverManager.getConnection(url, "john", "doe");
+      fail("expected exception");
+    } catch (RuntimeException e) {
+      assertEquals("Remote driver error:"
+          + " java.sql.SQLInvalidAuthorizationSpecException: invalid authorization specification"
+          + " - not found: john"
+          + " -> invalid authorization specification - not found: john"
+          + " -> invalid authorization specification - not found: john",
+          e.getMessage());
+    }
+  }
+
+  @Test public void testRemoteConnectionsAreDifferent() throws SQLException {
+    Connection conn1 = DriverManager.getConnection(url);
+    Statement stmt = conn1.createStatement();
+    stmt.execute("DECLARE LOCAL TEMPORARY TABLE"
+        + " buffer (id INTEGER PRIMARY KEY, textdata VARCHAR(100))");
+    stmt.execute("insert into buffer(id, textdata) values(1, 'abc')");
+    stmt.executeQuery("select * from buffer");
+
+    // The local temporary table is local to the connection above, and should
+    // not be visible on another connection
+    Connection conn2 = DriverManager.getConnection(url);
+    Statement stmt2 = conn2.createStatement();
+    try {
+      stmt2.executeQuery("select * from buffer");
+      fail("expected exception");
+    } catch (Exception e) {
+      assertEquals("Remote driver error: java.sql.SQLSyntaxErrorException: user lacks privilege"
+          + " or object not found: BUFFER -> user lacks privilege or object not found: BUFFER"
+          + " -> user lacks privilege or object not found: BUFFER", e.getCause().getMessage());
+    }
+  }
+
+  @Test public void testRemoteConnectionClosing() throws Exception {
+    AvaticaConnection conn = (AvaticaConnection) DriverManager.getConnection(url);
+    // Verify connection is usable
+    conn.createStatement();
+    conn.close();
+
+    // After closing the connection, it should not be usable anymore
+    try {
+      conn.createStatement();
+      fail("expected exception");
+    } catch (RuntimeException e) {
+      assertThat(e.getMessage(), containsString("Remote driver error:"
+          + " Connection not found: invalid id, closed, or expired"));
+    }
+  }
 }
 
 // End RemoteMetaTest.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/avatica/src/main/java/org/apache/calcite/avatica/AvaticaConnection.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaConnection.java b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaConnection.java
index 66c03dd..5386543 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaConnection.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaConnection.java
@@ -284,8 +284,7 @@ public abstract class AvaticaConnection implements Connection {
       int resultSetConcurrency,
       int resultSetHoldability) throws SQLException {
     try {
-      final Meta.ConnectionHandle ch = new Meta.ConnectionHandle(id);
-      final Meta.StatementHandle h = meta.prepare(ch, sql, -1);
+      final Meta.StatementHandle h = meta.prepare(handle, sql, -1);
       return factory.newPreparedStatement(this, h, h.signature, resultSetType,
           resultSetConcurrency, resultSetHoldability);
     } catch (RuntimeException e) {

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/avatica/src/main/java/org/apache/calcite/avatica/AvaticaDatabaseMetaData.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaDatabaseMetaData.java b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaDatabaseMetaData.java
index 2c5e6e6..27a2687 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaDatabaseMetaData.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaDatabaseMetaData.java
@@ -183,27 +183,27 @@ public class AvaticaDatabaseMetaData implements DatabaseMetaData {
 
   public String getSQLKeywords() throws SQLException {
     return Meta.DatabaseProperty.GET_S_Q_L_KEYWORDS
-        .getProp(connection.meta, String.class);
+        .getProp(connection.meta, connection.handle, String.class);
   }
 
   public String getNumericFunctions() throws SQLException {
     return Meta.DatabaseProperty.GET_NUMERIC_FUNCTIONS
-        .getProp(connection.meta, String.class);
+        .getProp(connection.meta, connection.handle, String.class);
   }
 
   public String getStringFunctions() throws SQLException {
     return Meta.DatabaseProperty.GET_STRING_FUNCTIONS
-        .getProp(connection.meta, String.class);
+        .getProp(connection.meta, connection.handle, String.class);
   }
 
   public String getSystemFunctions() throws SQLException {
     return Meta.DatabaseProperty.GET_SYSTEM_FUNCTIONS
-        .getProp(connection.meta, String.class);
+        .getProp(connection.meta, connection.handle, String.class);
   }
 
   public String getTimeDateFunctions() throws SQLException {
     return Meta.DatabaseProperty.GET_TIME_DATE_FUNCTIONS
-        .getProp(connection.meta, String.class);
+        .getProp(connection.meta, connection.handle, String.class);
   }
 
   public String getSearchStringEscape() throws SQLException {
@@ -529,7 +529,7 @@ public class AvaticaDatabaseMetaData implements DatabaseMetaData {
 
   public int getDefaultTransactionIsolation() throws SQLException {
     return Meta.DatabaseProperty.GET_DEFAULT_TRANSACTION_ISOLATION
-        .getProp(connection.meta, Integer.class);
+        .getProp(connection.meta, connection.handle, Integer.class);
   }
 
   public boolean supportsTransactions() throws SQLException {
@@ -564,7 +564,7 @@ public class AvaticaDatabaseMetaData implements DatabaseMetaData {
       String schemaPattern,
       String procedureNamePattern) throws SQLException {
     return connection.createResultSet(
-        connection.meta.getProcedures(catalog, pat(schemaPattern),
+        connection.meta.getProcedures(connection.handle, catalog, pat(schemaPattern),
             pat(procedureNamePattern)));
   }
 
@@ -574,7 +574,7 @@ public class AvaticaDatabaseMetaData implements DatabaseMetaData {
       String procedureNamePattern,
       String columnNamePattern) throws SQLException {
     return connection.createResultSet(
-        connection.meta.getProcedureColumns(catalog, pat(schemaPattern),
+        connection.meta.getProcedureColumns(connection.handle, catalog, pat(schemaPattern),
             pat(procedureNamePattern), pat(columnNamePattern)));
   }
 
@@ -585,7 +585,7 @@ public class AvaticaDatabaseMetaData implements DatabaseMetaData {
       String[] types) throws SQLException {
     List<String> typeList = types == null ? null : Arrays.asList(types);
     return connection.createResultSet(
-        connection.meta.getTables(catalog, pat(schemaPattern),
+        connection.meta.getTables(connection.handle, catalog, pat(schemaPattern),
             pat(tableNamePattern), typeList));
   }
 
@@ -598,7 +598,7 @@ public class AvaticaDatabaseMetaData implements DatabaseMetaData {
     // TODO: add a 'catch ... throw new SQLException' logic to this and other
     // getXxx methods. Right now any error will throw a RuntimeException
     return connection.createResultSet(
-        connection.meta.getSchemas(catalog, pat(schemaPattern)));
+        connection.meta.getSchemas(connection.handle, catalog, pat(schemaPattern)));
   }
 
   public ResultSet getSchemas() throws SQLException {
@@ -606,11 +606,11 @@ public class AvaticaDatabaseMetaData implements DatabaseMetaData {
   }
 
   public ResultSet getCatalogs() throws SQLException {
-    return connection.createResultSet(connection.meta.getCatalogs());
+    return connection.createResultSet(connection.meta.getCatalogs(connection.handle));
   }
 
   public ResultSet getTableTypes() throws SQLException {
-    return connection.createResultSet(connection.meta.getTableTypes());
+    return connection.createResultSet(connection.meta.getTableTypes(connection.handle));
   }
 
   public ResultSet getColumns(
@@ -619,7 +619,8 @@ public class AvaticaDatabaseMetaData implements DatabaseMetaData {
       String tableNamePattern,
       String columnNamePattern) throws SQLException {
     return connection.createResultSet(
-        connection.meta.getColumns(catalog, pat(schemaPattern),
+        connection.meta.getColumns(connection.handle,
+            catalog, pat(schemaPattern),
             pat(tableNamePattern), pat(columnNamePattern)));
   }
 
@@ -629,7 +630,7 @@ public class AvaticaDatabaseMetaData implements DatabaseMetaData {
       String table,
       String columnNamePattern) throws SQLException {
     return connection.createResultSet(
-        connection.meta.getColumnPrivileges(catalog, schema, table,
+        connection.meta.getColumnPrivileges(connection.handle, catalog, schema, table,
             pat(columnNamePattern)));
   }
 
@@ -638,7 +639,7 @@ public class AvaticaDatabaseMetaData implements DatabaseMetaData {
       String schemaPattern,
       String tableNamePattern) throws SQLException {
     return connection.createResultSet(
-        connection.meta.getTablePrivileges(catalog, pat(schemaPattern),
+        connection.meta.getTablePrivileges(connection.handle, catalog, pat(schemaPattern),
             pat(tableNamePattern)));
   }
 
@@ -649,32 +650,32 @@ public class AvaticaDatabaseMetaData implements DatabaseMetaData {
       int scope,
       boolean nullable) throws SQLException {
     return connection.createResultSet(
-        connection.meta.getBestRowIdentifier(catalog, schema, table, scope,
+        connection.meta.getBestRowIdentifier(connection.handle, catalog, schema, table, scope,
             nullable));
   }
 
   public ResultSet getVersionColumns(
       String catalog, String schema, String table) throws SQLException {
     return connection.createResultSet(
-        connection.meta.getVersionColumns(catalog, schema, table));
+        connection.meta.getVersionColumns(connection.handle, catalog, schema, table));
   }
 
   public ResultSet getPrimaryKeys(
       String catalog, String schema, String table) throws SQLException {
     return connection.createResultSet(
-        connection.meta.getPrimaryKeys(catalog, schema, table));
+        connection.meta.getPrimaryKeys(connection.handle, catalog, schema, table));
   }
 
   public ResultSet getImportedKeys(
       String catalog, String schema, String table) throws SQLException {
     return connection.createResultSet(
-        connection.meta.getImportedKeys(catalog, schema, table));
+        connection.meta.getImportedKeys(connection.handle, catalog, schema, table));
   }
 
   public ResultSet getExportedKeys(
       String catalog, String schema, String table) throws SQLException {
     return connection.createResultSet(
-        connection.meta.getExportedKeys(catalog, schema, table));
+        connection.meta.getExportedKeys(connection.handle, catalog, schema, table));
   }
 
   public ResultSet getCrossReference(
@@ -685,12 +686,12 @@ public class AvaticaDatabaseMetaData implements DatabaseMetaData {
       String foreignSchema,
       String foreignTable) throws SQLException {
     return connection.createResultSet(
-        connection.meta.getCrossReference(parentCatalog, parentSchema,
+        connection.meta.getCrossReference(connection.handle, parentCatalog, parentSchema,
             parentTable, foreignCatalog, foreignSchema, foreignTable));
   }
 
   public ResultSet getTypeInfo() throws SQLException {
-    return connection.createResultSet(connection.meta.getTypeInfo());
+    return connection.createResultSet(connection.meta.getTypeInfo(connection.handle));
   }
 
   public ResultSet getIndexInfo(
@@ -700,7 +701,7 @@ public class AvaticaDatabaseMetaData implements DatabaseMetaData {
       boolean unique,
       boolean approximate) throws SQLException {
     return connection.createResultSet(
-        connection.meta.getIndexInfo(catalog, schema, table, unique,
+        connection.meta.getIndexInfo(connection.handle, catalog, schema, table, unique,
             approximate));
   }
 
@@ -760,7 +761,7 @@ public class AvaticaDatabaseMetaData implements DatabaseMetaData {
       String typeNamePattern,
       int[] types) throws SQLException {
     return connection.createResultSet(
-        connection.meta.getUDTs(catalog, pat(schemaPattern),
+        connection.meta.getUDTs(connection.handle, catalog, pat(schemaPattern),
             pat(typeNamePattern), types));
   }
 
@@ -789,7 +790,7 @@ public class AvaticaDatabaseMetaData implements DatabaseMetaData {
       String schemaPattern,
       String typeNamePattern) throws SQLException {
     return connection.createResultSet(
-        connection.meta.getSuperTypes(catalog, pat(schemaPattern),
+        connection.meta.getSuperTypes(connection.handle, catalog, pat(schemaPattern),
             pat(typeNamePattern)));
   }
 
@@ -798,7 +799,7 @@ public class AvaticaDatabaseMetaData implements DatabaseMetaData {
       String schemaPattern,
       String tableNamePattern) throws SQLException {
     return connection.createResultSet(
-        connection.meta.getSuperTables(catalog, pat(schemaPattern),
+        connection.meta.getSuperTables(connection.handle, catalog, pat(schemaPattern),
             pat(tableNamePattern)));
   }
 
@@ -808,7 +809,7 @@ public class AvaticaDatabaseMetaData implements DatabaseMetaData {
       String typeNamePattern,
       String attributeNamePattern) throws SQLException {
     return connection.createResultSet(
-        connection.meta.getAttributes(catalog, pat(schemaPattern),
+        connection.meta.getAttributes(connection.handle, catalog, pat(schemaPattern),
             pat(typeNamePattern), pat(attributeNamePattern)));
   }
 
@@ -864,7 +865,7 @@ public class AvaticaDatabaseMetaData implements DatabaseMetaData {
 
   public ResultSet getClientInfoProperties() throws SQLException {
     return connection.createResultSet(
-        connection.meta.getClientInfoProperties());
+        connection.meta.getClientInfoProperties(connection.handle));
   }
 
   public ResultSet getFunctions(
@@ -872,7 +873,7 @@ public class AvaticaDatabaseMetaData implements DatabaseMetaData {
       String schemaPattern,
       String functionNamePattern) throws SQLException {
     return connection.createResultSet(
-        connection.meta.getFunctions(catalog, pat(schemaPattern),
+        connection.meta.getFunctions(connection.handle, catalog, pat(schemaPattern),
             pat(functionNamePattern)));
   }
 
@@ -882,7 +883,7 @@ public class AvaticaDatabaseMetaData implements DatabaseMetaData {
       String functionNamePattern,
       String columnNamePattern) throws SQLException {
     return connection.createResultSet(
-        connection.meta.getFunctionColumns(catalog, pat(schemaPattern),
+        connection.meta.getFunctionColumns(connection.handle, catalog, pat(schemaPattern),
             pat(functionNamePattern), pat(columnNamePattern)));
   }
 
@@ -892,7 +893,7 @@ public class AvaticaDatabaseMetaData implements DatabaseMetaData {
       String tableNamePattern,
       String columnNamePattern) throws SQLException {
     return connection.createResultSet(
-        connection.meta.getPseudoColumns(catalog, pat(schemaPattern),
+        connection.meta.getPseudoColumns(connection.handle, catalog, pat(schemaPattern),
             pat(tableNamePattern), pat(columnNamePattern)));
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/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
index ac0eb74..a16ffa1 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/Meta.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/Meta.java
@@ -58,73 +58,81 @@ public interface Meta {
    * <p>The provider can omit properties whose value is the same as the
    * default.
    */
-  Map<DatabaseProperty, Object> getDatabaseProperties();
+  Map<DatabaseProperty, Object> getDatabaseProperties(ConnectionHandle ch);
 
   /** Per {@link DatabaseMetaData#getTables(String, String, String, String[])}. */
-  MetaResultSet getTables(String catalog,
+  MetaResultSet getTables(ConnectionHandle ch,
+      String catalog,
       Pat schemaPattern,
       Pat tableNamePattern,
       List<String> typeList);
 
   /** Per {@link DatabaseMetaData#getColumns(String, String, String, String)}. */
-  MetaResultSet getColumns(String catalog,
+  MetaResultSet getColumns(ConnectionHandle ch,
+      String catalog,
       Pat schemaPattern,
       Pat tableNamePattern,
       Pat columnNamePattern);
 
-  MetaResultSet getSchemas(String catalog, Pat schemaPattern);
+  MetaResultSet getSchemas(ConnectionHandle ch, String catalog, Pat schemaPattern);
 
   /** Per {@link DatabaseMetaData#getCatalogs()}. */
-  MetaResultSet getCatalogs();
+  MetaResultSet getCatalogs(ConnectionHandle ch);
 
   /** Per {@link DatabaseMetaData#getTableTypes()}. */
-  MetaResultSet getTableTypes();
+  MetaResultSet getTableTypes(ConnectionHandle ch);
 
   /** Per {@link DatabaseMetaData#getProcedures(String, String, String)}. */
-  MetaResultSet getProcedures(String catalog,
+  MetaResultSet getProcedures(ConnectionHandle ch,
+      String catalog,
       Pat schemaPattern,
       Pat procedureNamePattern);
 
   /** Per {@link DatabaseMetaData#getProcedureColumns(String, String, String, String)}. */
-  MetaResultSet getProcedureColumns(String catalog,
+  MetaResultSet getProcedureColumns(ConnectionHandle ch,
+      String catalog,
       Pat schemaPattern,
       Pat procedureNamePattern,
       Pat columnNamePattern);
 
   /** Per {@link DatabaseMetaData#getColumnPrivileges(String, String, String, String)}. */
-  MetaResultSet getColumnPrivileges(String catalog,
+  MetaResultSet getColumnPrivileges(ConnectionHandle ch,
+      String catalog,
       String schema,
       String table,
       Pat columnNamePattern);
 
   /** Per {@link DatabaseMetaData#getTablePrivileges(String, String, String)}. */
-  MetaResultSet getTablePrivileges(String catalog,
+  MetaResultSet getTablePrivileges(ConnectionHandle ch,
+      String catalog,
       Pat schemaPattern,
       Pat tableNamePattern);
 
   /** Per
    * {@link DatabaseMetaData#getBestRowIdentifier(String, String, String, int, boolean)}. */
-  MetaResultSet getBestRowIdentifier(String catalog,
+  MetaResultSet getBestRowIdentifier(ConnectionHandle ch,
+      String catalog,
       String schema,
       String table,
       int scope,
       boolean nullable);
 
   /** Per {@link DatabaseMetaData#getVersionColumns(String, String, String)}. */
-  MetaResultSet getVersionColumns(String catalog, String schema, String table);
+  MetaResultSet getVersionColumns(ConnectionHandle ch, String catalog, String schema, String table);
 
   /** Per {@link DatabaseMetaData#getPrimaryKeys(String, String, String)}. */
-  MetaResultSet getPrimaryKeys(String catalog, String schema, String table);
+  MetaResultSet getPrimaryKeys(ConnectionHandle ch, String catalog, String schema, String table);
 
   /** Per {@link DatabaseMetaData#getImportedKeys(String, String, String)}. */
-  MetaResultSet getImportedKeys(String catalog, String schema, String table);
+  MetaResultSet getImportedKeys(ConnectionHandle ch, String catalog, String schema, String table);
 
   /** Per {@link DatabaseMetaData#getExportedKeys(String, String, String)}. */
-  MetaResultSet getExportedKeys(String catalog, String schema, String table);
+  MetaResultSet getExportedKeys(ConnectionHandle ch, String catalog, String schema, String table);
 
   /** Per
    * {@link DatabaseMetaData#getCrossReference(String, String, String, String, String, String)}. */
-  MetaResultSet getCrossReference(String parentCatalog,
+  MetaResultSet getCrossReference(ConnectionHandle ch,
+      String parentCatalog,
       String parentSchema,
       String parentTable,
       String foreignCatalog,
@@ -132,53 +140,60 @@ public interface Meta {
       String foreignTable);
 
   /** Per {@link DatabaseMetaData#getTypeInfo()}. */
-  MetaResultSet getTypeInfo();
+  MetaResultSet getTypeInfo(ConnectionHandle ch);
 
   /** Per {@link DatabaseMetaData#getIndexInfo(String, String, String, boolean, boolean)}. */
-  MetaResultSet getIndexInfo(String catalog,
+  MetaResultSet getIndexInfo(ConnectionHandle ch, String catalog,
       String schema,
       String table,
       boolean unique,
       boolean approximate);
 
   /** Per {@link DatabaseMetaData#getUDTs(String, String, String, int[])}. */
-  MetaResultSet getUDTs(String catalog,
+  MetaResultSet getUDTs(ConnectionHandle ch,
+      String catalog,
       Pat schemaPattern,
       Pat typeNamePattern,
       int[] types);
 
   /** Per {@link DatabaseMetaData#getSuperTypes(String, String, String)}. */
-  MetaResultSet getSuperTypes(String catalog,
+  MetaResultSet getSuperTypes(ConnectionHandle ch,
+      String catalog,
       Pat schemaPattern,
       Pat typeNamePattern);
 
   /** Per {@link DatabaseMetaData#getSuperTables(String, String, String)}. */
-  MetaResultSet getSuperTables(String catalog,
+  MetaResultSet getSuperTables(ConnectionHandle ch,
+      String catalog,
       Pat schemaPattern,
       Pat tableNamePattern);
 
   /** Per {@link DatabaseMetaData#getAttributes(String, String, String, String)}. */
-  MetaResultSet getAttributes(String catalog,
+  MetaResultSet getAttributes(ConnectionHandle ch,
+      String catalog,
       Pat schemaPattern,
       Pat typeNamePattern,
       Pat attributeNamePattern);
 
   /** Per {@link DatabaseMetaData#getClientInfoProperties()}. */
-  MetaResultSet getClientInfoProperties();
+  MetaResultSet getClientInfoProperties(ConnectionHandle ch);
 
   /** Per {@link DatabaseMetaData#getFunctions(String, String, String)}. */
-  MetaResultSet getFunctions(String catalog,
+  MetaResultSet getFunctions(ConnectionHandle ch,
+      String catalog,
       Pat schemaPattern,
       Pat functionNamePattern);
 
   /** Per {@link DatabaseMetaData#getFunctionColumns(String, String, String, String)}. */
-  MetaResultSet getFunctionColumns(String catalog,
+  MetaResultSet getFunctionColumns(ConnectionHandle ch,
+      String catalog,
       Pat schemaPattern,
       Pat functionNamePattern,
       Pat columnNamePattern);
 
   /** Per {@link DatabaseMetaData#getPseudoColumns(String, String, String, String)}. */
-  MetaResultSet getPseudoColumns(String catalog,
+  MetaResultSet getPseudoColumns(ConnectionHandle ch,
+      String catalog,
       Pat schemaPattern,
       Pat tableNamePattern,
       Pat columnNamePattern);
@@ -249,7 +264,19 @@ public interface Meta {
   /** Closes a statement. */
   void closeStatement(StatementHandle h);
 
-  /** Closes a connection. */
+  /**
+   * 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);
 
   /** Sync client and server view of connection properties.
@@ -291,7 +318,7 @@ public interface Meta {
    * {@link DatabaseMetaData#getSQLKeywords()}, which always return the same
    * value at all times and across connections.
    *
-   * @see #getDatabaseProperties()
+   * @see #getDatabaseProperties(Meta.ConnectionHandle)
    */
   enum DatabaseProperty {
     /** Database property containing the value of
@@ -336,8 +363,8 @@ public interface Meta {
 
     /** 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, Class<T> aClass) {
-      return getProp(meta.getDatabaseProperties(), aClass);
+    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

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/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
index 867933d..b34b325 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/MetaImpl.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/MetaImpl.java
@@ -48,7 +48,7 @@ import java.util.NoSuchElementException;
  * <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()} and
+ * 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.
  */
@@ -180,6 +180,10 @@ public abstract class MetaImpl implements Meta {
     }
   }
 
+  @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
     //
@@ -569,63 +573,69 @@ public abstract class MetaImpl implements Meta {
   public static class MetaSuperTable {
   }
 
-  public Map<DatabaseProperty, Object> getDatabaseProperties() {
+  public Map<DatabaseProperty, Object> getDatabaseProperties(ConnectionHandle ch) {
     return Collections.emptyMap();
   }
 
-  public MetaResultSet getTables(String catalog,
+  public MetaResultSet getTables(ConnectionHandle ch,
+      String catalog,
       Pat schemaPattern,
       Pat tableNamePattern,
       List<String> typeList) {
     return createEmptyResultSet(MetaTable.class);
   }
 
-  public MetaResultSet getColumns(String catalog,
+  public MetaResultSet getColumns(ConnectionHandle ch, String catalog,
       Pat schemaPattern,
       Pat tableNamePattern,
       Pat columnNamePattern) {
     return createEmptyResultSet(MetaColumn.class);
   }
 
-  public MetaResultSet getSchemas(String catalog, Pat schemaPattern) {
+  public MetaResultSet getSchemas(ConnectionHandle ch, String catalog, Pat schemaPattern) {
     return createEmptyResultSet(MetaSchema.class);
   }
 
-  public MetaResultSet getCatalogs() {
+  public MetaResultSet getCatalogs(ConnectionHandle ch) {
     return createEmptyResultSet(MetaCatalog.class);
   }
 
-  public MetaResultSet getTableTypes() {
+  public MetaResultSet getTableTypes(ConnectionHandle ch) {
     return createEmptyResultSet(MetaTableType.class);
   }
 
-  public MetaResultSet getProcedures(String catalog,
+  public MetaResultSet getProcedures(ConnectionHandle ch,
+      String catalog,
       Pat schemaPattern,
       Pat procedureNamePattern) {
     return createEmptyResultSet(MetaProcedure.class);
   }
 
-  public MetaResultSet getProcedureColumns(String catalog,
+  public MetaResultSet getProcedureColumns(ConnectionHandle ch,
+      String catalog,
       Pat schemaPattern,
       Pat procedureNamePattern,
       Pat columnNamePattern) {
     return createEmptyResultSet(MetaProcedureColumn.class);
   }
 
-  public MetaResultSet getColumnPrivileges(String catalog,
+  public MetaResultSet getColumnPrivileges(ConnectionHandle ch,
+      String catalog,
       String schema,
       String table,
       Pat columnNamePattern) {
     return createEmptyResultSet(MetaColumnPrivilege.class);
   }
 
-  public MetaResultSet getTablePrivileges(String catalog,
+  public MetaResultSet getTablePrivileges(ConnectionHandle ch,
+      String catalog,
       Pat schemaPattern,
       Pat tableNamePattern) {
     return createEmptyResultSet(MetaTablePrivilege.class);
   }
 
-  public MetaResultSet getBestRowIdentifier(String catalog,
+  public MetaResultSet getBestRowIdentifier(ConnectionHandle ch,
+      String catalog,
       String schema,
       String table,
       int scope,
@@ -633,31 +643,36 @@ public abstract class MetaImpl implements Meta {
     return createEmptyResultSet(MetaBestRowIdentifier.class);
   }
 
-  public MetaResultSet getVersionColumns(String catalog,
+  public MetaResultSet getVersionColumns(ConnectionHandle ch,
+      String catalog,
       String schema,
       String table) {
     return createEmptyResultSet(MetaVersionColumn.class);
   }
 
-  public MetaResultSet getPrimaryKeys(String catalog,
+  public MetaResultSet getPrimaryKeys(ConnectionHandle ch,
+      String catalog,
       String schema,
       String table) {
     return createEmptyResultSet(MetaPrimaryKey.class);
   }
 
-  public MetaResultSet getImportedKeys(String catalog,
+  public MetaResultSet getImportedKeys(ConnectionHandle ch,
+      String catalog,
       String schema,
       String table) {
     return createEmptyResultSet(MetaImportedKey.class);
   }
 
-  public MetaResultSet getExportedKeys(String catalog,
+  public MetaResultSet getExportedKeys(ConnectionHandle ch,
+      String catalog,
       String schema,
       String table) {
     return createEmptyResultSet(MetaExportedKey.class);
   }
 
-  public MetaResultSet getCrossReference(String parentCatalog,
+  public MetaResultSet getCrossReference(ConnectionHandle ch,
+      String parentCatalog,
       String parentSchema,
       String parentTable,
       String foreignCatalog,
@@ -666,11 +681,12 @@ public abstract class MetaImpl implements Meta {
     return createEmptyResultSet(MetaCrossReference.class);
   }
 
-  public MetaResultSet getTypeInfo() {
+  public MetaResultSet getTypeInfo(ConnectionHandle ch) {
     return createEmptyResultSet(MetaTypeInfo.class);
   }
 
-  public MetaResultSet getIndexInfo(String catalog,
+  public MetaResultSet getIndexInfo(ConnectionHandle ch,
+      String catalog,
       String schema,
       String table,
       boolean unique,
@@ -678,50 +694,57 @@ public abstract class MetaImpl implements Meta {
     return createEmptyResultSet(MetaIndexInfo.class);
   }
 
-  public MetaResultSet getUDTs(String catalog,
+  public MetaResultSet getUDTs(ConnectionHandle ch,
+      String catalog,
       Pat schemaPattern,
       Pat typeNamePattern,
       int[] types) {
     return createEmptyResultSet(MetaUdt.class);
   }
 
-  public MetaResultSet getSuperTypes(String catalog,
+  public MetaResultSet getSuperTypes(ConnectionHandle ch,
+      String catalog,
       Pat schemaPattern,
       Pat typeNamePattern) {
     return createEmptyResultSet(MetaSuperType.class);
   }
 
-  public MetaResultSet getSuperTables(String catalog,
+  public MetaResultSet getSuperTables(ConnectionHandle ch,
+      String catalog,
       Pat schemaPattern,
       Pat tableNamePattern) {
     return createEmptyResultSet(MetaSuperTable.class);
   }
 
-  public MetaResultSet getAttributes(String catalog,
+  public MetaResultSet getAttributes(ConnectionHandle ch,
+      String catalog,
       Pat schemaPattern,
       Pat typeNamePattern,
       Pat attributeNamePattern) {
     return createEmptyResultSet(MetaAttribute.class);
   }
 
-  public MetaResultSet getClientInfoProperties() {
+  public MetaResultSet getClientInfoProperties(ConnectionHandle ch) {
     return createEmptyResultSet(MetaClientInfoProperty.class);
   }
 
-  public MetaResultSet getFunctions(String catalog,
+  public MetaResultSet getFunctions(ConnectionHandle ch,
+      String catalog,
       Pat schemaPattern,
       Pat functionNamePattern) {
     return createEmptyResultSet(MetaFunction.class);
   }
 
-  public MetaResultSet getFunctionColumns(String catalog,
+  public MetaResultSet getFunctionColumns(ConnectionHandle ch,
+      String catalog,
       Pat schemaPattern,
       Pat functionNamePattern,
       Pat columnNamePattern) {
     return createEmptyResultSet(MetaFunctionColumn.class);
   }
 
-  public MetaResultSet getPseudoColumns(String catalog,
+  public MetaResultSet getPseudoColumns(ConnectionHandle ch,
+      String catalog,
       Pat schemaPattern,
       Pat tableNamePattern,
       Pat columnNamePattern) {


[10/11] incubator-calcite git commit: [CALCITE-908] Bump protobuf to 3.0.0-beta-1, fix deprecations and update docs (Josh Elser)

Posted by jh...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/86610552/avatica/src/main/java/org/apache/calcite/avatica/proto/Common.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/proto/Common.java b/avatica/src/main/java/org/apache/calcite/avatica/proto/Common.java
index f66f493..c63355d 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/proto/Common.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/proto/Common.java
@@ -164,8 +164,8 @@ package org.apache.calcite.avatica.proto;
         internalGetValueMap() {
       return internalValueMap;
     }
-    private static com.google.protobuf.Internal.EnumLiteMap<StatementType>
-        internalValueMap =
+    private static final com.google.protobuf.Internal.EnumLiteMap<
+        StatementType> internalValueMap =
           new com.google.protobuf.Internal.EnumLiteMap<StatementType>() {
             public StatementType findValueByNumber(int number) {
               return StatementType.valueOf(number);
@@ -481,8 +481,8 @@ package org.apache.calcite.avatica.proto;
         internalGetValueMap() {
       return internalValueMap;
     }
-    private static com.google.protobuf.Internal.EnumLiteMap<Rep>
-        internalValueMap =
+    private static final com.google.protobuf.Internal.EnumLiteMap<
+        Rep> internalValueMap =
           new com.google.protobuf.Internal.EnumLiteMap<Rep>() {
             public Rep findValueByNumber(int number) {
               return Rep.valueOf(number);
@@ -596,8 +596,8 @@ package org.apache.calcite.avatica.proto;
         internalGetValueMap() {
       return internalValueMap;
     }
-    private static com.google.protobuf.Internal.EnumLiteMap<Severity>
-        internalValueMap =
+    private static final com.google.protobuf.Internal.EnumLiteMap<
+        Severity> internalValueMap =
           new com.google.protobuf.Internal.EnumLiteMap<Severity>() {
             public Severity findValueByNumber(int number) {
               return Severity.valueOf(number);
@@ -716,7 +716,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:ConnectionProperties)
       ConnectionPropertiesOrBuilder {
     // Use ConnectionProperties.newBuilder() to construct.
-    private ConnectionProperties(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private ConnectionProperties(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private ConnectionProperties() {
@@ -737,8 +737,7 @@ package org.apache.calcite.avatica.proto;
     }
     private ConnectionProperties(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -776,15 +775,15 @@ package org.apache.calcite.avatica.proto;
               break;
             }
             case 42: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              catalog_ = bs;
+              catalog_ = s;
               break;
             }
             case 50: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              schema_ = bs;
+              schema_ = s;
               break;
             }
             case 56: {
@@ -800,10 +799,11 @@ package org.apache.calcite.avatica.proto;
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         makeExtensionsImmutable();
       }
@@ -820,21 +820,6 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Common.ConnectionProperties.class, org.apache.calcite.avatica.proto.Common.ConnectionProperties.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<ConnectionProperties> PARSER =
-        new com.google.protobuf.AbstractParser<ConnectionProperties>() {
-      public ConnectionProperties parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new ConnectionProperties(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<ConnectionProperties> getParserForType() {
-      return PARSER;
-    }
-
     public static final int IS_DIRTY_FIELD_NUMBER = 1;
     private boolean isDirty_;
     /**
@@ -898,7 +883,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int CATALOG_FIELD_NUMBER = 5;
-    private java.lang.Object catalog_;
+    private volatile java.lang.Object catalog_;
     /**
      * <code>optional string catalog = 5;</code>
      */
@@ -910,9 +895,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          catalog_ = s;
-        }
+        catalog_ = s;
         return s;
       }
     }
@@ -934,7 +917,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int SCHEMA_FIELD_NUMBER = 6;
-    private java.lang.Object schema_;
+    private volatile java.lang.Object schema_;
     /**
      * <code>optional string schema = 6;</code>
      */
@@ -946,9 +929,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          schema_ = s;
-        }
+        schema_ = s;
         return s;
       }
     }
@@ -981,7 +962,6 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
       if (isDirty_ != false) {
         output.writeBool(1, isDirty_);
       }
@@ -995,10 +975,10 @@ package org.apache.calcite.avatica.proto;
         output.writeUInt32(4, transactionIsolation_);
       }
       if (!getCatalogBytes().isEmpty()) {
-        output.writeBytes(5, getCatalogBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 5, catalog_);
       }
       if (!getSchemaBytes().isEmpty()) {
-        output.writeBytes(6, getSchemaBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 6, schema_);
       }
       if (hasAutoCommit_ != false) {
         output.writeBool(7, hasAutoCommit_);
@@ -1008,9 +988,8 @@ package org.apache.calcite.avatica.proto;
       }
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
@@ -1031,12 +1010,10 @@ package org.apache.calcite.avatica.proto;
           .computeUInt32Size(4, transactionIsolation_);
       }
       if (!getCatalogBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(5, getCatalogBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(5, catalog_);
       }
       if (!getSchemaBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(6, getSchemaBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(6, schema_);
       }
       if (hasAutoCommit_ != false) {
         size += com.google.protobuf.CodedOutputStream
@@ -1046,7 +1023,7 @@ package org.apache.calcite.avatica.proto;
         size += com.google.protobuf.CodedOutputStream
           .computeBoolSize(8, hasReadOnly_);
       }
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -1104,12 +1081,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Common.ConnectionProperties prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -1459,9 +1441,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            catalog_ = s;
-          }
+          catalog_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -1513,7 +1493,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         catalog_ = value;
         onChanged();
         return this;
@@ -1529,9 +1510,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            schema_ = s;
-          }
+          schema_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -1583,7 +1562,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         schema_ = value;
         onChanged();
         return this;
@@ -1603,16 +1583,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:ConnectionProperties)
-    private static final org.apache.calcite.avatica.proto.Common.ConnectionProperties defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Common.ConnectionProperties();
+    private static final org.apache.calcite.avatica.proto.Common.ConnectionProperties DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Common.ConnectionProperties();
     }
 
     public static org.apache.calcite.avatica.proto.Common.ConnectionProperties getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<ConnectionProperties>
+        PARSER = new com.google.protobuf.AbstractParser<ConnectionProperties>() {
+      public ConnectionProperties parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new ConnectionProperties(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }
+    };
+
+    public static com.google.protobuf.Parser<ConnectionProperties> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<ConnectionProperties> getParserForType() {
+      return PARSER;
     }
 
     public org.apache.calcite.avatica.proto.Common.ConnectionProperties getDefaultInstanceForType() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
     }
 
   }
@@ -1661,7 +1670,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:StatementHandle)
       StatementHandleOrBuilder {
     // Use StatementHandle.newBuilder() to construct.
-    private StatementHandle(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private StatementHandle(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private StatementHandle() {
@@ -1676,8 +1685,7 @@ package org.apache.calcite.avatica.proto;
     }
     private StatementHandle(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -1695,9 +1703,9 @@ package org.apache.calcite.avatica.proto;
               break;
             }
             case 10: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              connectionId_ = bs;
+              connectionId_ = s;
               break;
             }
             case 16: {
@@ -1710,7 +1718,7 @@ package org.apache.calcite.avatica.proto;
               if (signature_ != null) {
                 subBuilder = signature_.toBuilder();
               }
-              signature_ = input.readMessage(org.apache.calcite.avatica.proto.Common.Signature.PARSER, extensionRegistry);
+              signature_ = input.readMessage(org.apache.calcite.avatica.proto.Common.Signature.parser(), extensionRegistry);
               if (subBuilder != null) {
                 subBuilder.mergeFrom(signature_);
                 signature_ = subBuilder.buildPartial();
@@ -1721,10 +1729,11 @@ package org.apache.calcite.avatica.proto;
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         makeExtensionsImmutable();
       }
@@ -1741,23 +1750,8 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Common.StatementHandle.class, org.apache.calcite.avatica.proto.Common.StatementHandle.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<StatementHandle> PARSER =
-        new com.google.protobuf.AbstractParser<StatementHandle>() {
-      public StatementHandle parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new StatementHandle(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<StatementHandle> getParserForType() {
-      return PARSER;
-    }
-
     public static final int CONNECTION_ID_FIELD_NUMBER = 1;
-    private java.lang.Object connectionId_;
+    private volatile java.lang.Object connectionId_;
     /**
      * <code>optional string connection_id = 1;</code>
      */
@@ -1769,9 +1763,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          connectionId_ = s;
-        }
+        connectionId_ = s;
         return s;
       }
     }
@@ -1834,9 +1826,8 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
       if (!getConnectionIdBytes().isEmpty()) {
-        output.writeBytes(1, getConnectionIdBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 1, connectionId_);
       }
       if (id_ != 0) {
         output.writeUInt32(2, id_);
@@ -1846,15 +1837,13 @@ package org.apache.calcite.avatica.proto;
       }
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
       if (!getConnectionIdBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, getConnectionIdBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(1, connectionId_);
       }
       if (id_ != 0) {
         size += com.google.protobuf.CodedOutputStream
@@ -1864,7 +1853,7 @@ package org.apache.calcite.avatica.proto;
         size += com.google.protobuf.CodedOutputStream
           .computeMessageSize(3, getSignature());
       }
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -1922,12 +1911,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Common.StatementHandle prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -2074,9 +2068,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            connectionId_ = s;
-          }
+          connectionId_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -2128,7 +2120,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         connectionId_ = value;
         onChanged();
         return this;
@@ -2291,16 +2284,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:StatementHandle)
-    private static final org.apache.calcite.avatica.proto.Common.StatementHandle defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Common.StatementHandle();
+    private static final org.apache.calcite.avatica.proto.Common.StatementHandle DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Common.StatementHandle();
     }
 
     public static org.apache.calcite.avatica.proto.Common.StatementHandle getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<StatementHandle>
+        PARSER = new com.google.protobuf.AbstractParser<StatementHandle>() {
+      public StatementHandle parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new StatementHandle(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }
+    };
+
+    public static com.google.protobuf.Parser<StatementHandle> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<StatementHandle> getParserForType() {
+      return PARSER;
     }
 
     public org.apache.calcite.avatica.proto.Common.StatementHandle getDefaultInstanceForType() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
     }
 
   }
@@ -2401,7 +2423,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:Signature)
       SignatureOrBuilder {
     // Use Signature.newBuilder() to construct.
-    private Signature(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private Signature(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private Signature() {
@@ -2418,8 +2440,7 @@ package org.apache.calcite.avatica.proto;
     }
     private Signature(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -2441,13 +2462,13 @@ package org.apache.calcite.avatica.proto;
                 columns_ = new java.util.ArrayList<org.apache.calcite.avatica.proto.Common.ColumnMetaData>();
                 mutable_bitField0_ |= 0x00000001;
               }
-              columns_.add(input.readMessage(org.apache.calcite.avatica.proto.Common.ColumnMetaData.PARSER, extensionRegistry));
+              columns_.add(input.readMessage(org.apache.calcite.avatica.proto.Common.ColumnMetaData.parser(), extensionRegistry));
               break;
             }
             case 18: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              sql_ = bs;
+              sql_ = s;
               break;
             }
             case 26: {
@@ -2455,7 +2476,7 @@ package org.apache.calcite.avatica.proto;
                 parameters_ = new java.util.ArrayList<org.apache.calcite.avatica.proto.Common.AvaticaParameter>();
                 mutable_bitField0_ |= 0x00000004;
               }
-              parameters_.add(input.readMessage(org.apache.calcite.avatica.proto.Common.AvaticaParameter.PARSER, extensionRegistry));
+              parameters_.add(input.readMessage(org.apache.calcite.avatica.proto.Common.AvaticaParameter.parser(), extensionRegistry));
               break;
             }
             case 34: {
@@ -2463,7 +2484,7 @@ package org.apache.calcite.avatica.proto;
               if (cursorFactory_ != null) {
                 subBuilder = cursorFactory_.toBuilder();
               }
-              cursorFactory_ = input.readMessage(org.apache.calcite.avatica.proto.Common.CursorFactory.PARSER, extensionRegistry);
+              cursorFactory_ = input.readMessage(org.apache.calcite.avatica.proto.Common.CursorFactory.parser(), extensionRegistry);
               if (subBuilder != null) {
                 subBuilder.mergeFrom(cursorFactory_);
                 cursorFactory_ = subBuilder.buildPartial();
@@ -2480,10 +2501,11 @@ package org.apache.calcite.avatica.proto;
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
           columns_ = java.util.Collections.unmodifiableList(columns_);
@@ -2506,21 +2528,6 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Common.Signature.class, org.apache.calcite.avatica.proto.Common.Signature.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<Signature> PARSER =
-        new com.google.protobuf.AbstractParser<Signature>() {
-      public Signature parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new Signature(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<Signature> getParserForType() {
-      return PARSER;
-    }
-
     private int bitField0_;
     public static final int COLUMNS_FIELD_NUMBER = 1;
     private java.util.List<org.apache.calcite.avatica.proto.Common.ColumnMetaData> columns_;
@@ -2558,7 +2565,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int SQL_FIELD_NUMBER = 2;
-    private java.lang.Object sql_;
+    private volatile java.lang.Object sql_;
     /**
      * <code>optional string sql = 2;</code>
      */
@@ -2570,9 +2577,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          sql_ = s;
-        }
+        sql_ = s;
         return s;
       }
     }
@@ -2677,12 +2682,11 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
       for (int i = 0; i < columns_.size(); i++) {
         output.writeMessage(1, columns_.get(i));
       }
       if (!getSqlBytes().isEmpty()) {
-        output.writeBytes(2, getSqlBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 2, sql_);
       }
       for (int i = 0; i < parameters_.size(); i++) {
         output.writeMessage(3, parameters_.get(i));
@@ -2695,9 +2699,8 @@ package org.apache.calcite.avatica.proto;
       }
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
@@ -2706,8 +2709,7 @@ package org.apache.calcite.avatica.proto;
           .computeMessageSize(1, columns_.get(i));
       }
       if (!getSqlBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(2, getSqlBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(2, sql_);
       }
       for (int i = 0; i < parameters_.size(); i++) {
         size += com.google.protobuf.CodedOutputStream
@@ -2721,7 +2723,7 @@ package org.apache.calcite.avatica.proto;
         size += com.google.protobuf.CodedOutputStream
           .computeEnumSize(5, statementType_);
       }
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -2779,12 +2781,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Common.Signature prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -3259,9 +3266,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            sql_ = s;
-          }
+          sql_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -3313,7 +3318,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         sql_ = value;
         onChanged();
         return this;
@@ -3734,16 +3740,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:Signature)
-    private static final org.apache.calcite.avatica.proto.Common.Signature defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Common.Signature();
+    private static final org.apache.calcite.avatica.proto.Common.Signature DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Common.Signature();
     }
 
     public static org.apache.calcite.avatica.proto.Common.Signature getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<Signature>
+        PARSER = new com.google.protobuf.AbstractParser<Signature>() {
+      public Signature parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new Signature(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }
+    };
+
+    public static com.google.protobuf.Parser<Signature> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<Signature> getParserForType() {
+      return PARSER;
     }
 
     public org.apache.calcite.avatica.proto.Common.Signature getDefaultInstanceForType() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
     }
 
   }
@@ -3898,7 +3933,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:ColumnMetaData)
       ColumnMetaDataOrBuilder {
     // Use ColumnMetaData.newBuilder() to construct.
-    private ColumnMetaData(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private ColumnMetaData(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private ColumnMetaData() {
@@ -3930,8 +3965,7 @@ package org.apache.calcite.avatica.proto;
     }
     private ColumnMetaData(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -3989,21 +4023,21 @@ package org.apache.calcite.avatica.proto;
               break;
             }
             case 74: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              label_ = bs;
+              label_ = s;
               break;
             }
             case 82: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              columnName_ = bs;
+              columnName_ = s;
               break;
             }
             case 90: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              schemaName_ = bs;
+              schemaName_ = s;
               break;
             }
             case 96: {
@@ -4017,15 +4051,15 @@ package org.apache.calcite.avatica.proto;
               break;
             }
             case 114: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              tableName_ = bs;
+              tableName_ = s;
               break;
             }
             case 122: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              catalogName_ = bs;
+              catalogName_ = s;
               break;
             }
             case 128: {
@@ -4044,9 +4078,9 @@ package org.apache.calcite.avatica.proto;
               break;
             }
             case 154: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              columnClassName_ = bs;
+              columnClassName_ = s;
               break;
             }
             case 162: {
@@ -4054,7 +4088,7 @@ package org.apache.calcite.avatica.proto;
               if (type_ != null) {
                 subBuilder = type_.toBuilder();
               }
-              type_ = input.readMessage(org.apache.calcite.avatica.proto.Common.AvaticaType.PARSER, extensionRegistry);
+              type_ = input.readMessage(org.apache.calcite.avatica.proto.Common.AvaticaType.parser(), extensionRegistry);
               if (subBuilder != null) {
                 subBuilder.mergeFrom(type_);
                 type_ = subBuilder.buildPartial();
@@ -4065,10 +4099,11 @@ package org.apache.calcite.avatica.proto;
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         makeExtensionsImmutable();
       }
@@ -4085,21 +4120,6 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Common.ColumnMetaData.class, org.apache.calcite.avatica.proto.Common.ColumnMetaData.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<ColumnMetaData> PARSER =
-        new com.google.protobuf.AbstractParser<ColumnMetaData>() {
-      public ColumnMetaData parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new ColumnMetaData(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<ColumnMetaData> getParserForType() {
-      return PARSER;
-    }
-
     public static final int ORDINAL_FIELD_NUMBER = 1;
     private int ordinal_;
     /**
@@ -4173,7 +4193,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int LABEL_FIELD_NUMBER = 9;
-    private java.lang.Object label_;
+    private volatile java.lang.Object label_;
     /**
      * <code>optional string label = 9;</code>
      */
@@ -4185,9 +4205,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          label_ = s;
-        }
+        label_ = s;
         return s;
       }
     }
@@ -4209,7 +4227,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int COLUMN_NAME_FIELD_NUMBER = 10;
-    private java.lang.Object columnName_;
+    private volatile java.lang.Object columnName_;
     /**
      * <code>optional string column_name = 10;</code>
      */
@@ -4221,9 +4239,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          columnName_ = s;
-        }
+        columnName_ = s;
         return s;
       }
     }
@@ -4245,7 +4261,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int SCHEMA_NAME_FIELD_NUMBER = 11;
-    private java.lang.Object schemaName_;
+    private volatile java.lang.Object schemaName_;
     /**
      * <code>optional string schema_name = 11;</code>
      */
@@ -4257,9 +4273,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          schemaName_ = s;
-        }
+        schemaName_ = s;
         return s;
       }
     }
@@ -4299,7 +4313,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int TABLE_NAME_FIELD_NUMBER = 14;
-    private java.lang.Object tableName_;
+    private volatile java.lang.Object tableName_;
     /**
      * <code>optional string table_name = 14;</code>
      */
@@ -4311,9 +4325,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          tableName_ = s;
-        }
+        tableName_ = s;
         return s;
       }
     }
@@ -4335,7 +4347,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int CATALOG_NAME_FIELD_NUMBER = 15;
-    private java.lang.Object catalogName_;
+    private volatile java.lang.Object catalogName_;
     /**
      * <code>optional string catalog_name = 15;</code>
      */
@@ -4347,9 +4359,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          catalogName_ = s;
-        }
+        catalogName_ = s;
         return s;
       }
     }
@@ -4398,7 +4408,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int COLUMN_CLASS_NAME_FIELD_NUMBER = 19;
-    private java.lang.Object columnClassName_;
+    private volatile java.lang.Object columnClassName_;
     /**
      * <code>optional string column_class_name = 19;</code>
      */
@@ -4410,9 +4420,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          columnClassName_ = s;
-        }
+        columnClassName_ = s;
         return s;
       }
     }
@@ -4466,7 +4474,6 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
       if (ordinal_ != 0) {
         output.writeUInt32(1, ordinal_);
       }
@@ -4492,13 +4499,13 @@ package org.apache.calcite.avatica.proto;
         output.writeUInt32(8, displaySize_);
       }
       if (!getLabelBytes().isEmpty()) {
-        output.writeBytes(9, getLabelBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 9, label_);
       }
       if (!getColumnNameBytes().isEmpty()) {
-        output.writeBytes(10, getColumnNameBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 10, columnName_);
       }
       if (!getSchemaNameBytes().isEmpty()) {
-        output.writeBytes(11, getSchemaNameBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 11, schemaName_);
       }
       if (precision_ != 0) {
         output.writeUInt32(12, precision_);
@@ -4507,10 +4514,10 @@ package org.apache.calcite.avatica.proto;
         output.writeUInt32(13, scale_);
       }
       if (!getTableNameBytes().isEmpty()) {
-        output.writeBytes(14, getTableNameBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 14, tableName_);
       }
       if (!getCatalogNameBytes().isEmpty()) {
-        output.writeBytes(15, getCatalogNameBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 15, catalogName_);
       }
       if (readOnly_ != false) {
         output.writeBool(16, readOnly_);
@@ -4522,16 +4529,15 @@ package org.apache.calcite.avatica.proto;
         output.writeBool(18, definitelyWritable_);
       }
       if (!getColumnClassNameBytes().isEmpty()) {
-        output.writeBytes(19, getColumnClassNameBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 19, columnClassName_);
       }
       if (type_ != null) {
         output.writeMessage(20, getType());
       }
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
@@ -4568,16 +4574,13 @@ package org.apache.calcite.avatica.proto;
           .computeUInt32Size(8, displaySize_);
       }
       if (!getLabelBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(9, getLabelBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(9, label_);
       }
       if (!getColumnNameBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(10, getColumnNameBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(10, columnName_);
       }
       if (!getSchemaNameBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(11, getSchemaNameBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(11, schemaName_);
       }
       if (precision_ != 0) {
         size += com.google.protobuf.CodedOutputStream
@@ -4588,12 +4591,10 @@ package org.apache.calcite.avatica.proto;
           .computeUInt32Size(13, scale_);
       }
       if (!getTableNameBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(14, getTableNameBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(14, tableName_);
       }
       if (!getCatalogNameBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(15, getCatalogNameBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(15, catalogName_);
       }
       if (readOnly_ != false) {
         size += com.google.protobuf.CodedOutputStream
@@ -4608,14 +4609,13 @@ package org.apache.calcite.avatica.proto;
           .computeBoolSize(18, definitelyWritable_);
       }
       if (!getColumnClassNameBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(19, getColumnClassNameBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(19, columnClassName_);
       }
       if (type_ != null) {
         size += com.google.protobuf.CodedOutputStream
           .computeMessageSize(20, getType());
       }
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -4673,12 +4673,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Common.ColumnMetaData prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -5136,9 +5141,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            label_ = s;
-          }
+          label_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -5190,7 +5193,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         label_ = value;
         onChanged();
         return this;
@@ -5206,9 +5210,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            columnName_ = s;
-          }
+          columnName_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -5260,7 +5262,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         columnName_ = value;
         onChanged();
         return this;
@@ -5276,9 +5279,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            schemaName_ = s;
-          }
+          schemaName_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -5330,7 +5331,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         schemaName_ = value;
         onChanged();
         return this;
@@ -5398,9 +5400,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            tableName_ = s;
-          }
+          tableName_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -5452,7 +5452,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         tableName_ = value;
         onChanged();
         return this;
@@ -5468,9 +5469,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            catalogName_ = s;
-          }
+          catalogName_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -5522,7 +5521,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         catalogName_ = value;
         onChanged();
         return this;
@@ -5616,9 +5616,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            columnClassName_ = s;
-          }
+          columnClassName_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -5670,7 +5668,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         columnClassName_ = value;
         onChanged();
         return this;
@@ -5807,16 +5806,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:ColumnMetaData)
-    private static final org.apache.calcite.avatica.proto.Common.ColumnMetaData defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Common.ColumnMetaData();
+    private static final org.apache.calcite.avatica.proto.Common.ColumnMetaData DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Common.ColumnMetaData();
     }
 
     public static org.apache.calcite.avatica.proto.Common.ColumnMetaData getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<ColumnMetaData>
+        PARSER = new com.google.protobuf.AbstractParser<ColumnMetaData>() {
+      public ColumnMetaData parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new ColumnMetaData(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }
+    };
+
+    public static com.google.protobuf.Parser<ColumnMetaData> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<ColumnMetaData> getParserForType() {
+      return PARSER;
     }
 
     public org.apache.calcite.avatica.proto.Common.ColumnMetaData getDefaultInstanceForType() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
     }
 
   }
@@ -5930,7 +5958,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:AvaticaType)
       AvaticaTypeOrBuilder {
     // Use AvaticaType.newBuilder() to construct.
-    private AvaticaType(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private AvaticaType(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private AvaticaType() {
@@ -5947,8 +5975,7 @@ package org.apache.calcite.avatica.proto;
     }
     private AvaticaType(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -5971,9 +5998,9 @@ package org.apache.calcite.avatica.proto;
               break;
             }
             case 18: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              name_ = bs;
+              name_ = s;
               break;
             }
             case 24: {
@@ -5987,7 +6014,7 @@ package org.apache.calcite.avatica.proto;
                 columns_ = new java.util.ArrayList<org.apache.calcite.avatica.proto.Common.ColumnMetaData>();
                 mutable_bitField0_ |= 0x00000008;
               }
-              columns_.add(input.readMessage(org.apache.calcite.avatica.proto.Common.ColumnMetaData.PARSER, extensionRegistry));
+              columns_.add(input.readMessage(org.apache.calcite.avatica.proto.Common.ColumnMetaData.parser(), extensionRegistry));
               break;
             }
             case 42: {
@@ -5995,7 +6022,7 @@ package org.apache.calcite.avatica.proto;
               if (component_ != null) {
                 subBuilder = component_.toBuilder();
               }
-              component_ = input.readMessage(org.apache.calcite.avatica.proto.Common.AvaticaType.PARSER, extensionRegistry);
+              component_ = input.readMessage(org.apache.calcite.avatica.proto.Common.AvaticaType.parser(), extensionRegistry);
               if (subBuilder != null) {
                 subBuilder.mergeFrom(component_);
                 component_ = subBuilder.buildPartial();
@@ -6006,10 +6033,11 @@ package org.apache.calcite.avatica.proto;
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
           columns_ = java.util.Collections.unmodifiableList(columns_);
@@ -6029,21 +6057,6 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Common.AvaticaType.class, org.apache.calcite.avatica.proto.Common.AvaticaType.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<AvaticaType> PARSER =
-        new com.google.protobuf.AbstractParser<AvaticaType>() {
-      public AvaticaType parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new AvaticaType(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<AvaticaType> getParserForType() {
-      return PARSER;
-    }
-
     private int bitField0_;
     public static final int ID_FIELD_NUMBER = 1;
     private int id_;
@@ -6055,7 +6068,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int NAME_FIELD_NUMBER = 2;
-    private java.lang.Object name_;
+    private volatile java.lang.Object name_;
     /**
      * <code>optional string name = 2;</code>
      */
@@ -6067,9 +6080,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          name_ = s;
-        }
+        name_ = s;
         return s;
       }
     }
@@ -6206,12 +6217,11 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
       if (id_ != 0) {
         output.writeUInt32(1, id_);
       }
       if (!getNameBytes().isEmpty()) {
-        output.writeBytes(2, getNameBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 2, name_);
       }
       if (rep_ != org.apache.calcite.avatica.proto.Common.Rep.PRIMITIVE_BOOLEAN.getNumber()) {
         output.writeEnum(3, rep_);
@@ -6224,9 +6234,8 @@ package org.apache.calcite.avatica.proto;
       }
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
@@ -6235,8 +6244,7 @@ package org.apache.calcite.avatica.proto;
           .computeUInt32Size(1, id_);
       }
       if (!getNameBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(2, getNameBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(2, name_);
       }
       if (rep_ != org.apache.calcite.avatica.proto.Common.Rep.PRIMITIVE_BOOLEAN.getNumber()) {
         size += com.google.protobuf.CodedOutputStream
@@ -6250,7 +6258,7 @@ package org.apache.calcite.avatica.proto;
         size += com.google.protobuf.CodedOutputStream
           .computeMessageSize(5, getComponent());
       }
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -6308,12 +6316,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Common.AvaticaType prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -6538,9 +6551,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            name_ = s;
-          }
+          name_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -6592,7 +6603,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         name_ = value;
         onChanged();
         return this;
@@ -7121,16 +7133,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:AvaticaType)
-    private static final org.apache.calcite.avatica.proto.Common.AvaticaType defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Common.AvaticaType();
+    private static final org.apache.calcite.avatica.proto.Common.AvaticaType DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Common.AvaticaType();
     }
 
     public static org.apache.calcite.avatica.proto.Common.AvaticaType getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<AvaticaType>
+        PARSER = new com.google.protobuf.AbstractParser<AvaticaType>() {
+      public AvaticaType parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new AvaticaType(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }
+    };
+
+    public static com.google.protobuf.Parser<AvaticaType> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<AvaticaType> getParserForType() {
+      return PARSER;
     }
 
     public org.apache.calcite.avatica.proto.Common.AvaticaType getDefaultInstanceForType() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
     }
 
   }
@@ -7201,7 +7242,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:AvaticaParameter)
       AvaticaParameterOrBuilder {
     // Use AvaticaParameter.newBuilder() to construct.
-    private AvaticaParameter(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private AvaticaParameter(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private AvaticaParameter() {
@@ -7221,8 +7262,7 @@ package org.apache.calcite.avatica.proto;
     }
     private AvaticaParameter(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -7260,30 +7300,31 @@ package org.apache.calcite.avatica.proto;
               break;
             }
             case 42: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              typeName_ = bs;
+              typeName_ = s;
               break;
             }
             case 50: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              className_ = bs;
+              className_ = s;
               break;
             }
             case 58: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              name_ = bs;
+              name_ = s;
               break;
             }
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         makeExtensionsImmutable();
       }
@@ -7300,21 +7341,6 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Common.AvaticaParameter.class, org.apache.calcite.avatica.proto.Common.AvaticaParameter.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<AvaticaParameter> PARSER =
-        new com.google.protobuf.AbstractParser<AvaticaParameter>() {
-      public AvaticaParameter parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new AvaticaParameter(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<AvaticaParameter> getParserForType() {
-      return PARSER;
-    }
-
     public static final int SIGNED_FIELD_NUMBER = 1;
     private boolean signed_;
     /**
@@ -7352,7 +7378,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int TYPE_NAME_FIELD_NUMBER = 5;
-    private java.lang.Object typeName_;
+    private volatile java.lang.Object typeName_;
     /**
      * <code>optional string type_name = 5;</code>
      */
@@ -7364,9 +7390,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          typeName_ = s;
-        }
+        typeName_ = s;
         return s;
       }
     }
@@ -7388,7 +7412,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int CLASS_NAME_FIELD_NUMBER = 6;
-    private java.lang.Object className_;
+    private volatile java.lang.Object className_;
     /**
      * <code>optional string class_name = 6;</code>
      */
@@ -7400,9 +7424,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          className_ = s;
-        }
+        className_ = s;
         return s;
       }
     }
@@ -7424,7 +7446,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int NAME_FIELD_NUMBER = 7;
-    private java.lang.Object name_;
+    private volatile java.lang.Object name_;
     /**
      * <code>optional string name = 7;</code>
      */
@@ -7436,9 +7458,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          name_ = s;
-        }
+        name_ = s;
         return s;
       }
     }
@@ -7471,7 +7491,6 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
       if (signed_ != false) {
         output.writeBool(1, signed_);
       }
@@ -7485,19 +7504,18 @@ package org.apache.calcite.avatica.proto;
         output.writeUInt32(4, parameterType_);
       }
       if (!getTypeNameBytes().isEmpty()) {
-        output.writeBytes(5, getTypeNameBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 5, typeName_);
       }
       if (!getClassNameBytes().isEmpty()) {
-        output.writeBytes(6, getClassNameBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 6, className_);
       }
       if (!getNameBytes().isEmpty()) {
-        output.writeBytes(7, getNameBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 7, name_);
       }
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
@@ -7518,18 +7536,15 @@ package org.apache.calcite.avatica.proto;
           .computeUInt32Size(4, parameterType_);
       }
       if (!getTypeNameBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(5, getTypeNameBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(5, typeName_);
       }
       if (!getClassNameBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(6, getClassNameBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(6, className_);
       }
       if (!getNameBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(7, getNameBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(7, name_);
       }
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -7587,12 +7602,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Common.AvaticaParameter prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -7861,9 +7881,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            typeName_ = s;
-          }
+          typeName_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -7915,7 +7933,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         typeName_ = value;
         onChanged();
         return this;
@@ -7931,9 +7950,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            className_ = s;
-          }
+          className_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -7985,7 +8002,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         className_ = value;
         onChanged();
         return this;
@@ -8001,9 +8019,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            name_ = s;
-          }
+          name_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -8055,7 +8071,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         name_ = value;
         onChanged();
         return this;
@@ -8075,16 +8092,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:AvaticaParameter)
-    private static final org.apache.calcite.avatica.proto.Common.AvaticaParameter defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Common.AvaticaParameter();
+    private static final org.apache.calcite.avatica.proto.Common.AvaticaParameter DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Common.AvaticaParameter();
     }
 
     public static org.apache.calcite.avatica.proto.Common.AvaticaParameter getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<AvaticaParameter>
+        PARSER = new com.google.protobuf.AbstractParser<AvaticaParameter>() {
+      public AvaticaParameter parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new AvaticaParameter(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }
+    };
+
+    public static com.google.protobuf.Parser<AvaticaParameter> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<AvaticaParameter> getParserForType() {
+      return PARSER;
     }
 
     public org.apache.calcite.avatica.proto.Common.AvaticaParameter getDefaultInstanceForType() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
     }
 
   }
@@ -8143,7 +8189,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:CursorFactory)
       CursorFactoryOrBuilder {
     // Use CursorFactory.newBuilder() to construct.
-    private CursorFactory(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private CursorFactory(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private CursorFactory() {
@@ -8159,8 +8205,7 @@ package org.apache.calcite.avatica.proto;
     }
     private CursorFactory(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -8184,27 +8229,28 @@ package org.apache.calcite.avatica.proto;
               break;
             }
             case 18: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              className_ = bs;
+              className_ = s;
               break;
             }
             case 26: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
               if (!((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
                 fieldNames_ = new com.google.protobuf.LazyStringArrayList();
                 mutable_bitField0_ |= 0x00000004;
               }
-              fieldNames_.add(bs);
+              fieldNames_.add(s);
               break;
             }
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         if (((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
           fieldNames_ = fieldNames_.getUnmodifiableView();
@@ -8224,21 +8270,6 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Common.CursorFactory.class, org.apache.calcite.avatica.proto.Common.CursorFactory.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<CursorFactory> PARSER =
-        new com.google.protobuf.AbstractParser<CursorFactory>() {
-      public CursorFactory parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new CursorFactory(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<CursorFactory> getParserForType() {
-      return PARSER;
-    }
-
     /**
      * Protobuf enum {@code CursorFactory.Style}
      */
@@ -8321,8 +8352,8 @@ package org.apache.calcite.avatica.proto;
           internalGetValueMap() {
         return internalValueMap;
       }
-      private static com.google.protobuf.Internal.EnumLiteMap<Style>
-          internalValueMap =
+      private static final com.google.protobuf.Internal.EnumLiteMap<
+          Style> internalValueMap =
             new com.google.protobuf.Internal.EnumLiteMap<Style>() {
               public Style findValueByNumber(int number) {
                 return Style.valueOf(number);
@@ -8385,7 +8416,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int CLASS_NAME_FIELD_NUMBER = 2;
-    private java.lang.Object className_;
+    private volatile java.lang.Object className_;
     /**
      * <code>optional string class_name = 2;</code>
      */
@@ -8397,9 +8428,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          className_ = s;
-        }
+        className_ = s;
         return s;
       }
     }
@@ -8461,21 +8490,19 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
       if (style_ != org.apache.calcite.avatica.proto.Common.CursorFactory.Style.OBJECT.getNumber()) {
         output.writeEnum(1, style_);
       }
       if (!getClassNameBytes().isEmpty()) {
-        output.writeBytes(2, getClassNameBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 2, className_);
       }
       for (int i = 0; i < fieldNames_.size(); i++) {
-        output.writeBytes(3, fieldNames_.getByteString(i));
+        com.google.protobuf.GeneratedMessage.writeString(output, 3, fieldNames_.getRaw(i));
       }
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
@@ -8484,19 +8511,17 @@ package org.apache.calcite.avatica.proto;
           .computeEnumSize(1, style_);
       }
       if (!getClassNameBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(2, getClassNameBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(2, className_);
       }
       {
         int dataSize = 0;
         for (int i = 0; i < fieldNames_.size(); i++) {
-          dataSize += com.google.protobuf.CodedOutputStream
-            .computeBytesSizeNoTag(fieldNames_.getByteString(i));
+          dataSize += computeStringSizeNoTag(fieldNames_.getRaw(i));
         }
         size += dataSize;
         size += 1 * getFieldNamesList().size();
       }
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -8554,12 +8579,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Common.CursorFactory prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -8757,9 +8787,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            className_ = s;
-          }
+          className_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -8811,7 +8839,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         className_ = value;
         onChanged();
         return this;
@@ -8904,7 +8933,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  ensureFieldNamesIsMutable();
+  checkByteStringIsUtf8(value);
+        ensureFieldNamesIsMutable();
         fieldNames_.add(value);
         onChanged();
         return this;
@@ -8924,16 +8954,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:CursorFactory)
-    private static final org.apache.calcite.avatica.proto.Common.CursorFactory defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Common.CursorFactory();
+    private static final org.apache.calcite.avatica.proto.Common.CursorFactory DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Common.CursorFactory();
     }
 
     public static org.apache.calcite.avatica.proto.Common.CursorFactory getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<CursorFactory>
+        PARSER = new com.google.protobuf.AbstractParser<CursorFactory>() {
+      public CursorFactory parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new CursorFactory(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }
+    };
+
+    public static com.google.protobuf.Parser<CursorFactory> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<CursorFactory> getParserForType() {
+      return PARSER;
     }
 
     public org.apache.calcite.avatica.proto.Common.CursorFactory getDefaultInstanceForType() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
     }
 
   }
@@ -8988,7 +9047,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:Frame)
       FrameOrBuilder {
     // Use Frame.newBuilder() to construct.
-    private Frame(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private Frame(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private Frame() {
@@ -9004,8 +9063,7 @@ package org.apache.calcite.avatica.proto;
     }
     private Frame(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -9037,16 +9095,17 @@ package org.apache.calcite.avatica.proto;
                 rows_ = new java.util.ArrayList<org.apache.calcite.avatica.proto.Common.Row>();
                 mutable_bitField0_ |= 0x00000004;
               }
-              rows_.add(input.readMessage(org.apache.calcite.avatica.proto.Common.Row.PARSER, extensionRegistry));
+              rows_.add(input.readMessage(org.apache.calcite.avatica.proto.Common.Row.parser(), extensionRegistry));
               break;
             }
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         if (((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
           rows_ = java.util.Collections.unmodifiableList(rows_);
@@ -9066,21 +9125,6 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Common.Frame.class, org.apache.calcite.avatica.proto.Common.Frame.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<Frame> PARSER =
-        new com.google.protobuf.AbstractParser<Frame>() {
-      public Frame parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new Frame(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<Frame> getParserForType() {
-      return PARSER;
-    }
-
     private int bitField0_;
     public static final int OFFSET_FIELD_NUMBER = 1;
     private long offset_;
@@ -9147,7 +9191,6 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
       if (offset_ != 0L) {
         output.writeUInt64(1, offset_);
       }
@@ -9159,9 +9202,8 @@ package org.apache.calcite.avatica.proto;
       }
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
@@ -9177,7 +9219,7 @@ package org.apache.calcite.avatica.proto;
         size += com.google.protobuf.CodedOutputStream
           .computeMessageSize(3, rows_.get(i));
       }
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -9235,12 +9277,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Common.Frame prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -9714,16 +9761,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:Frame)
-    private static final org.apache.calcite.avatica.proto.Common.Frame defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Common.Frame();
+    private static final org.apache.calcite.avatica.proto.Common.Frame DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Common.Frame();
     }
 
     public static org.apache.calcite.avatica.proto.Common.Frame getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<Frame>
+        PARSER = new com.google.protobuf.AbstractParser<Frame>() {
+      public Frame parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new Frame(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }

<TRUNCATED>


[11/11] incubator-calcite git commit: [CALCITE-908] Bump protobuf to 3.0.0-beta-1, fix deprecations and update docs (Josh Elser)

Posted by jh...@apache.org.
[CALCITE-908] Bump protobuf to 3.0.0-beta-1, fix deprecations and update docs (Josh Elser)

Close apache/incubator-calcite#144


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

Branch: refs/heads/master
Commit: 86610552e3bcb47814db98108e7753320ad1af84
Parents: 5be93fb
Author: Josh Elser <el...@apache.org>
Authored: Thu Oct 15 20:13:28 2015 -0400
Committer: Julian Hyde <jh...@apache.org>
Committed: Thu Oct 22 18:28:44 2015 -0700

----------------------------------------------------------------------
 .../apache/calcite/avatica/proto/Common.java    | 1450 +++++++------
 .../apache/calcite/avatica/proto/Requests.java  | 2036 ++++++++++--------
 .../apache/calcite/avatica/proto/Responses.java | 1114 ++++++----
 .../avatica/remote/ProtobufTranslationImpl.java |   56 +-
 .../remote/ProtobufTranslationImplTest.java     |    9 +-
 pom.xml                                         |    2 +-
 site/_docs/howto.md                             |    4 +-
 7 files changed, 2603 insertions(+), 2068 deletions(-)
----------------------------------------------------------------------



[09/11] incubator-calcite git commit: [CALCITE-908] Bump protobuf to 3.0.0-beta-1, fix deprecations and update docs (Josh Elser)

Posted by jh...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/86610552/avatica/src/main/java/org/apache/calcite/avatica/proto/Requests.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/proto/Requests.java b/avatica/src/main/java/org/apache/calcite/avatica/proto/Requests.java
index 00b8623..15a9a2e 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/proto/Requests.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/proto/Requests.java
@@ -50,7 +50,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:CatalogsRequest)
       CatalogsRequestOrBuilder {
     // Use CatalogsRequest.newBuilder() to construct.
-    private CatalogsRequest(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private CatalogsRequest(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private CatalogsRequest() {
@@ -64,8 +64,7 @@ package org.apache.calcite.avatica.proto;
     }
     private CatalogsRequest(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -83,18 +82,19 @@ package org.apache.calcite.avatica.proto;
               break;
             }
             case 10: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              connectionId_ = bs;
+              connectionId_ = s;
               break;
             }
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         makeExtensionsImmutable();
       }
@@ -111,23 +111,8 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Requests.CatalogsRequest.class, org.apache.calcite.avatica.proto.Requests.CatalogsRequest.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<CatalogsRequest> PARSER =
-        new com.google.protobuf.AbstractParser<CatalogsRequest>() {
-      public CatalogsRequest parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new CatalogsRequest(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<CatalogsRequest> getParserForType() {
-      return PARSER;
-    }
-
     public static final int CONNECTION_ID_FIELD_NUMBER = 1;
-    private java.lang.Object connectionId_;
+    private volatile java.lang.Object connectionId_;
     /**
      * <code>optional string connection_id = 1;</code>
      */
@@ -139,9 +124,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          connectionId_ = s;
-        }
+        connectionId_ = s;
         return s;
       }
     }
@@ -174,23 +157,20 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
       if (!getConnectionIdBytes().isEmpty()) {
-        output.writeBytes(1, getConnectionIdBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 1, connectionId_);
       }
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
       if (!getConnectionIdBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, getConnectionIdBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(1, connectionId_);
       }
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -248,12 +228,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Requests.CatalogsRequest prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -380,9 +365,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            connectionId_ = s;
-          }
+          connectionId_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -434,7 +417,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         connectionId_ = value;
         onChanged();
         return this;
@@ -454,16 +438,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:CatalogsRequest)
-    private static final org.apache.calcite.avatica.proto.Requests.CatalogsRequest defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Requests.CatalogsRequest();
+    private static final org.apache.calcite.avatica.proto.Requests.CatalogsRequest DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Requests.CatalogsRequest();
     }
 
     public static org.apache.calcite.avatica.proto.Requests.CatalogsRequest getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<CatalogsRequest>
+        PARSER = new com.google.protobuf.AbstractParser<CatalogsRequest>() {
+      public CatalogsRequest parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new CatalogsRequest(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }
+    };
+
+    public static com.google.protobuf.Parser<CatalogsRequest> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<CatalogsRequest> getParserForType() {
+      return PARSER;
     }
 
     public org.apache.calcite.avatica.proto.Requests.CatalogsRequest getDefaultInstanceForType() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
     }
 
   }
@@ -494,7 +507,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:DatabasePropertyRequest)
       DatabasePropertyRequestOrBuilder {
     // Use DatabasePropertyRequest.newBuilder() to construct.
-    private DatabasePropertyRequest(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private DatabasePropertyRequest(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private DatabasePropertyRequest() {
@@ -508,8 +521,7 @@ package org.apache.calcite.avatica.proto;
     }
     private DatabasePropertyRequest(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -527,18 +539,19 @@ package org.apache.calcite.avatica.proto;
               break;
             }
             case 10: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              connectionId_ = bs;
+              connectionId_ = s;
               break;
             }
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         makeExtensionsImmutable();
       }
@@ -555,23 +568,8 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Requests.DatabasePropertyRequest.class, org.apache.calcite.avatica.proto.Requests.DatabasePropertyRequest.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<DatabasePropertyRequest> PARSER =
-        new com.google.protobuf.AbstractParser<DatabasePropertyRequest>() {
-      public DatabasePropertyRequest parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new DatabasePropertyRequest(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<DatabasePropertyRequest> getParserForType() {
-      return PARSER;
-    }
-
     public static final int CONNECTION_ID_FIELD_NUMBER = 1;
-    private java.lang.Object connectionId_;
+    private volatile java.lang.Object connectionId_;
     /**
      * <code>optional string connection_id = 1;</code>
      */
@@ -583,9 +581,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          connectionId_ = s;
-        }
+        connectionId_ = s;
         return s;
       }
     }
@@ -618,23 +614,20 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
       if (!getConnectionIdBytes().isEmpty()) {
-        output.writeBytes(1, getConnectionIdBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 1, connectionId_);
       }
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
       if (!getConnectionIdBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, getConnectionIdBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(1, connectionId_);
       }
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -692,12 +685,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Requests.DatabasePropertyRequest prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -824,9 +822,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            connectionId_ = s;
-          }
+          connectionId_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -878,7 +874,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         connectionId_ = value;
         onChanged();
         return this;
@@ -898,16 +895,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:DatabasePropertyRequest)
-    private static final org.apache.calcite.avatica.proto.Requests.DatabasePropertyRequest defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Requests.DatabasePropertyRequest();
+    private static final org.apache.calcite.avatica.proto.Requests.DatabasePropertyRequest DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Requests.DatabasePropertyRequest();
     }
 
     public static org.apache.calcite.avatica.proto.Requests.DatabasePropertyRequest getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<DatabasePropertyRequest>
+        PARSER = new com.google.protobuf.AbstractParser<DatabasePropertyRequest>() {
+      public DatabasePropertyRequest parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new DatabasePropertyRequest(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }
+    };
+
+    public static com.google.protobuf.Parser<DatabasePropertyRequest> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<DatabasePropertyRequest> getParserForType() {
+      return PARSER;
     }
 
     public org.apache.calcite.avatica.proto.Requests.DatabasePropertyRequest getDefaultInstanceForType() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
     }
 
   }
@@ -958,7 +984,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:SchemasRequest)
       SchemasRequestOrBuilder {
     // Use SchemasRequest.newBuilder() to construct.
-    private SchemasRequest(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private SchemasRequest(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private SchemasRequest() {
@@ -974,8 +1000,7 @@ package org.apache.calcite.avatica.proto;
     }
     private SchemasRequest(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -993,30 +1018,31 @@ package org.apache.calcite.avatica.proto;
               break;
             }
             case 10: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              catalog_ = bs;
+              catalog_ = s;
               break;
             }
             case 18: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              schemaPattern_ = bs;
+              schemaPattern_ = s;
               break;
             }
             case 26: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              connectionId_ = bs;
+              connectionId_ = s;
               break;
             }
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         makeExtensionsImmutable();
       }
@@ -1033,23 +1059,8 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Requests.SchemasRequest.class, org.apache.calcite.avatica.proto.Requests.SchemasRequest.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<SchemasRequest> PARSER =
-        new com.google.protobuf.AbstractParser<SchemasRequest>() {
-      public SchemasRequest parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new SchemasRequest(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<SchemasRequest> getParserForType() {
-      return PARSER;
-    }
-
     public static final int CATALOG_FIELD_NUMBER = 1;
-    private java.lang.Object catalog_;
+    private volatile java.lang.Object catalog_;
     /**
      * <code>optional string catalog = 1;</code>
      */
@@ -1061,9 +1072,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          catalog_ = s;
-        }
+        catalog_ = s;
         return s;
       }
     }
@@ -1085,7 +1094,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int SCHEMA_PATTERN_FIELD_NUMBER = 2;
-    private java.lang.Object schemaPattern_;
+    private volatile java.lang.Object schemaPattern_;
     /**
      * <code>optional string schema_pattern = 2;</code>
      */
@@ -1097,9 +1106,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          schemaPattern_ = s;
-        }
+        schemaPattern_ = s;
         return s;
       }
     }
@@ -1121,7 +1128,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int CONNECTION_ID_FIELD_NUMBER = 3;
-    private java.lang.Object connectionId_;
+    private volatile java.lang.Object connectionId_;
     /**
      * <code>optional string connection_id = 3;</code>
      */
@@ -1133,9 +1140,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          connectionId_ = s;
-        }
+        connectionId_ = s;
         return s;
       }
     }
@@ -1168,37 +1173,32 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
       if (!getCatalogBytes().isEmpty()) {
-        output.writeBytes(1, getCatalogBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 1, catalog_);
       }
       if (!getSchemaPatternBytes().isEmpty()) {
-        output.writeBytes(2, getSchemaPatternBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 2, schemaPattern_);
       }
       if (!getConnectionIdBytes().isEmpty()) {
-        output.writeBytes(3, getConnectionIdBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 3, connectionId_);
       }
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
       if (!getCatalogBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, getCatalogBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(1, catalog_);
       }
       if (!getSchemaPatternBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(2, getSchemaPatternBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(2, schemaPattern_);
       }
       if (!getConnectionIdBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(3, getConnectionIdBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(3, connectionId_);
       }
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -1256,12 +1256,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Requests.SchemasRequest prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -1402,9 +1407,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            catalog_ = s;
-          }
+          catalog_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -1456,7 +1459,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         catalog_ = value;
         onChanged();
         return this;
@@ -1472,9 +1476,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            schemaPattern_ = s;
-          }
+          schemaPattern_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -1526,7 +1528,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         schemaPattern_ = value;
         onChanged();
         return this;
@@ -1542,9 +1545,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            connectionId_ = s;
-          }
+          connectionId_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -1596,7 +1597,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         connectionId_ = value;
         onChanged();
         return this;
@@ -1616,16 +1618,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:SchemasRequest)
-    private static final org.apache.calcite.avatica.proto.Requests.SchemasRequest defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Requests.SchemasRequest();
+    private static final org.apache.calcite.avatica.proto.Requests.SchemasRequest DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Requests.SchemasRequest();
     }
 
     public static org.apache.calcite.avatica.proto.Requests.SchemasRequest getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<SchemasRequest>
+        PARSER = new com.google.protobuf.AbstractParser<SchemasRequest>() {
+      public SchemasRequest parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new SchemasRequest(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }
+    };
+
+    public static com.google.protobuf.Parser<SchemasRequest> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<SchemasRequest> getParserForType() {
+      return PARSER;
     }
 
     public org.apache.calcite.avatica.proto.Requests.SchemasRequest getDefaultInstanceForType() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
     }
 
   }
@@ -1715,7 +1746,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:TablesRequest)
       TablesRequestOrBuilder {
     // Use TablesRequest.newBuilder() to construct.
-    private TablesRequest(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private TablesRequest(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private TablesRequest() {
@@ -1734,8 +1765,7 @@ package org.apache.calcite.avatica.proto;
     }
     private TablesRequest(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -1753,30 +1783,30 @@ package org.apache.calcite.avatica.proto;
               break;
             }
             case 10: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              catalog_ = bs;
+              catalog_ = s;
               break;
             }
             case 18: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              schemaPattern_ = bs;
+              schemaPattern_ = s;
               break;
             }
             case 26: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              tableNamePattern_ = bs;
+              tableNamePattern_ = s;
               break;
             }
             case 34: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
               if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
                 typeList_ = new com.google.protobuf.LazyStringArrayList();
                 mutable_bitField0_ |= 0x00000008;
               }
-              typeList_.add(bs);
+              typeList_.add(s);
               break;
             }
             case 48: {
@@ -1785,18 +1815,19 @@ package org.apache.calcite.avatica.proto;
               break;
             }
             case 58: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              connectionId_ = bs;
+              connectionId_ = s;
               break;
             }
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
           typeList_ = typeList_.getUnmodifiableView();
@@ -1816,24 +1847,9 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Requests.TablesRequest.class, org.apache.calcite.avatica.proto.Requests.TablesRequest.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<TablesRequest> PARSER =
-        new com.google.protobuf.AbstractParser<TablesRequest>() {
-      public TablesRequest parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new TablesRequest(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<TablesRequest> getParserForType() {
-      return PARSER;
-    }
-
     private int bitField0_;
     public static final int CATALOG_FIELD_NUMBER = 1;
-    private java.lang.Object catalog_;
+    private volatile java.lang.Object catalog_;
     /**
      * <code>optional string catalog = 1;</code>
      */
@@ -1845,9 +1861,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          catalog_ = s;
-        }
+        catalog_ = s;
         return s;
       }
     }
@@ -1869,7 +1883,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int SCHEMA_PATTERN_FIELD_NUMBER = 2;
-    private java.lang.Object schemaPattern_;
+    private volatile java.lang.Object schemaPattern_;
     /**
      * <code>optional string schema_pattern = 2;</code>
      */
@@ -1881,9 +1895,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          schemaPattern_ = s;
-        }
+        schemaPattern_ = s;
         return s;
       }
     }
@@ -1905,7 +1917,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int TABLE_NAME_PATTERN_FIELD_NUMBER = 3;
-    private java.lang.Object tableNamePattern_;
+    private volatile java.lang.Object tableNamePattern_;
     /**
      * <code>optional string table_name_pattern = 3;</code>
      */
@@ -1917,9 +1929,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          tableNamePattern_ = s;
-        }
+        tableNamePattern_ = s;
         return s;
       }
     }
@@ -1983,7 +1993,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int CONNECTION_ID_FIELD_NUMBER = 7;
-    private java.lang.Object connectionId_;
+    private volatile java.lang.Object connectionId_;
     /**
      * <code>optional string connection_id = 7;</code>
      */
@@ -1995,9 +2005,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          connectionId_ = s;
-        }
+        connectionId_ = s;
         return s;
       }
     }
@@ -2030,50 +2038,44 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
       if (!getCatalogBytes().isEmpty()) {
-        output.writeBytes(1, getCatalogBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 1, catalog_);
       }
       if (!getSchemaPatternBytes().isEmpty()) {
-        output.writeBytes(2, getSchemaPatternBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 2, schemaPattern_);
       }
       if (!getTableNamePatternBytes().isEmpty()) {
-        output.writeBytes(3, getTableNamePatternBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 3, tableNamePattern_);
       }
       for (int i = 0; i < typeList_.size(); i++) {
-        output.writeBytes(4, typeList_.getByteString(i));
+        com.google.protobuf.GeneratedMessage.writeString(output, 4, typeList_.getRaw(i));
       }
       if (hasTypeList_ != false) {
         output.writeBool(6, hasTypeList_);
       }
       if (!getConnectionIdBytes().isEmpty()) {
-        output.writeBytes(7, getConnectionIdBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 7, connectionId_);
       }
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
       if (!getCatalogBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, getCatalogBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(1, catalog_);
       }
       if (!getSchemaPatternBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(2, getSchemaPatternBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(2, schemaPattern_);
       }
       if (!getTableNamePatternBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(3, getTableNamePatternBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(3, tableNamePattern_);
       }
       {
         int dataSize = 0;
         for (int i = 0; i < typeList_.size(); i++) {
-          dataSize += com.google.protobuf.CodedOutputStream
-            .computeBytesSizeNoTag(typeList_.getByteString(i));
+          dataSize += computeStringSizeNoTag(typeList_.getRaw(i));
         }
         size += dataSize;
         size += 1 * getTypeListList().size();
@@ -2083,10 +2085,9 @@ package org.apache.calcite.avatica.proto;
           .computeBoolSize(6, hasTypeList_);
       }
       if (!getConnectionIdBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(7, getConnectionIdBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(7, connectionId_);
       }
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -2144,12 +2145,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Requests.TablesRequest prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -2325,9 +2331,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            catalog_ = s;
-          }
+          catalog_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -2379,7 +2383,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         catalog_ = value;
         onChanged();
         return this;
@@ -2395,9 +2400,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            schemaPattern_ = s;
-          }
+          schemaPattern_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -2449,7 +2452,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         schemaPattern_ = value;
         onChanged();
         return this;
@@ -2465,9 +2469,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            tableNamePattern_ = s;
-          }
+          tableNamePattern_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -2519,7 +2521,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         tableNamePattern_ = value;
         onChanged();
         return this;
@@ -2612,7 +2615,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  ensureTypeListIsMutable();
+  checkByteStringIsUtf8(value);
+        ensureTypeListIsMutable();
         typeList_.add(value);
         onChanged();
         return this;
@@ -2666,9 +2670,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            connectionId_ = s;
-          }
+          connectionId_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -2720,7 +2722,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         connectionId_ = value;
         onChanged();
         return this;
@@ -2740,16 +2743,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:TablesRequest)
-    private static final org.apache.calcite.avatica.proto.Requests.TablesRequest defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Requests.TablesRequest();
+    private static final org.apache.calcite.avatica.proto.Requests.TablesRequest DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Requests.TablesRequest();
     }
 
     public static org.apache.calcite.avatica.proto.Requests.TablesRequest getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<TablesRequest>
+        PARSER = new com.google.protobuf.AbstractParser<TablesRequest>() {
+      public TablesRequest parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new TablesRequest(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }
+    };
+
+    public static com.google.protobuf.Parser<TablesRequest> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<TablesRequest> getParserForType() {
+      return PARSER;
     }
 
     public org.apache.calcite.avatica.proto.Requests.TablesRequest getDefaultInstanceForType() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
     }
 
   }
@@ -2780,7 +2812,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:TableTypesRequest)
       TableTypesRequestOrBuilder {
     // Use TableTypesRequest.newBuilder() to construct.
-    private TableTypesRequest(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private TableTypesRequest(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private TableTypesRequest() {
@@ -2794,8 +2826,7 @@ package org.apache.calcite.avatica.proto;
     }
     private TableTypesRequest(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -2813,18 +2844,19 @@ package org.apache.calcite.avatica.proto;
               break;
             }
             case 10: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              connectionId_ = bs;
+              connectionId_ = s;
               break;
             }
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         makeExtensionsImmutable();
       }
@@ -2841,23 +2873,8 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Requests.TableTypesRequest.class, org.apache.calcite.avatica.proto.Requests.TableTypesRequest.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<TableTypesRequest> PARSER =
-        new com.google.protobuf.AbstractParser<TableTypesRequest>() {
-      public TableTypesRequest parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new TableTypesRequest(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<TableTypesRequest> getParserForType() {
-      return PARSER;
-    }
-
     public static final int CONNECTION_ID_FIELD_NUMBER = 1;
-    private java.lang.Object connectionId_;
+    private volatile java.lang.Object connectionId_;
     /**
      * <code>optional string connection_id = 1;</code>
      */
@@ -2869,9 +2886,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          connectionId_ = s;
-        }
+        connectionId_ = s;
         return s;
       }
     }
@@ -2904,23 +2919,20 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
       if (!getConnectionIdBytes().isEmpty()) {
-        output.writeBytes(1, getConnectionIdBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 1, connectionId_);
       }
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
       if (!getConnectionIdBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, getConnectionIdBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(1, connectionId_);
       }
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -2978,12 +2990,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Requests.TableTypesRequest prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -3110,9 +3127,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            connectionId_ = s;
-          }
+          connectionId_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -3164,7 +3179,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         connectionId_ = value;
         onChanged();
         return this;
@@ -3184,16 +3200,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:TableTypesRequest)
-    private static final org.apache.calcite.avatica.proto.Requests.TableTypesRequest defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Requests.TableTypesRequest();
+    private static final org.apache.calcite.avatica.proto.Requests.TableTypesRequest DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Requests.TableTypesRequest();
     }
 
     public static org.apache.calcite.avatica.proto.Requests.TableTypesRequest getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<TableTypesRequest>
+        PARSER = new com.google.protobuf.AbstractParser<TableTypesRequest>() {
+      public TableTypesRequest parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new TableTypesRequest(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }
+    };
+
+    public static com.google.protobuf.Parser<TableTypesRequest> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<TableTypesRequest> getParserForType() {
+      return PARSER;
     }
 
     public org.apache.calcite.avatica.proto.Requests.TableTypesRequest getDefaultInstanceForType() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
     }
 
   }
@@ -3265,7 +3310,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:ColumnsRequest)
       ColumnsRequestOrBuilder {
     // Use ColumnsRequest.newBuilder() to construct.
-    private ColumnsRequest(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private ColumnsRequest(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private ColumnsRequest() {
@@ -3283,8 +3328,7 @@ package org.apache.calcite.avatica.proto;
     }
     private ColumnsRequest(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -3302,42 +3346,43 @@ package org.apache.calcite.avatica.proto;
               break;
             }
             case 10: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              catalog_ = bs;
+              catalog_ = s;
               break;
             }
             case 18: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              schemaPattern_ = bs;
+              schemaPattern_ = s;
               break;
             }
             case 26: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              tableNamePattern_ = bs;
+              tableNamePattern_ = s;
               break;
             }
             case 34: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              columnNamePattern_ = bs;
+              columnNamePattern_ = s;
               break;
             }
             case 42: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              connectionId_ = bs;
+              connectionId_ = s;
               break;
             }
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         makeExtensionsImmutable();
       }
@@ -3350,27 +3395,12 @@ package org.apache.calcite.avatica.proto;
     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
         internalGetFieldAccessorTable() {
       return org.apache.calcite.avatica.proto.Requests.internal_static_ColumnsRequest_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              org.apache.calcite.avatica.proto.Requests.ColumnsRequest.class, org.apache.calcite.avatica.proto.Requests.ColumnsRequest.Builder.class);
-    }
-
-    public static final com.google.protobuf.Parser<ColumnsRequest> PARSER =
-        new com.google.protobuf.AbstractParser<ColumnsRequest>() {
-      public ColumnsRequest parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new ColumnsRequest(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<ColumnsRequest> getParserForType() {
-      return PARSER;
+          .ensureFieldAccessorsInitialized(
+              org.apache.calcite.avatica.proto.Requests.ColumnsRequest.class, org.apache.calcite.avatica.proto.Requests.ColumnsRequest.Builder.class);
     }
 
     public static final int CATALOG_FIELD_NUMBER = 1;
-    private java.lang.Object catalog_;
+    private volatile java.lang.Object catalog_;
     /**
      * <code>optional string catalog = 1;</code>
      */
@@ -3382,9 +3412,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          catalog_ = s;
-        }
+        catalog_ = s;
         return s;
       }
     }
@@ -3406,7 +3434,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int SCHEMA_PATTERN_FIELD_NUMBER = 2;
-    private java.lang.Object schemaPattern_;
+    private volatile java.lang.Object schemaPattern_;
     /**
      * <code>optional string schema_pattern = 2;</code>
      */
@@ -3418,9 +3446,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          schemaPattern_ = s;
-        }
+        schemaPattern_ = s;
         return s;
       }
     }
@@ -3442,7 +3468,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int TABLE_NAME_PATTERN_FIELD_NUMBER = 3;
-    private java.lang.Object tableNamePattern_;
+    private volatile java.lang.Object tableNamePattern_;
     /**
      * <code>optional string table_name_pattern = 3;</code>
      */
@@ -3454,9 +3480,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          tableNamePattern_ = s;
-        }
+        tableNamePattern_ = s;
         return s;
       }
     }
@@ -3478,7 +3502,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int COLUMN_NAME_PATTERN_FIELD_NUMBER = 4;
-    private java.lang.Object columnNamePattern_;
+    private volatile java.lang.Object columnNamePattern_;
     /**
      * <code>optional string column_name_pattern = 4;</code>
      */
@@ -3490,9 +3514,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          columnNamePattern_ = s;
-        }
+        columnNamePattern_ = s;
         return s;
       }
     }
@@ -3514,7 +3536,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int CONNECTION_ID_FIELD_NUMBER = 5;
-    private java.lang.Object connectionId_;
+    private volatile java.lang.Object connectionId_;
     /**
      * <code>optional string connection_id = 5;</code>
      */
@@ -3526,9 +3548,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          connectionId_ = s;
-        }
+        connectionId_ = s;
         return s;
       }
     }
@@ -3561,51 +3581,44 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
       if (!getCatalogBytes().isEmpty()) {
-        output.writeBytes(1, getCatalogBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 1, catalog_);
       }
       if (!getSchemaPatternBytes().isEmpty()) {
-        output.writeBytes(2, getSchemaPatternBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 2, schemaPattern_);
       }
       if (!getTableNamePatternBytes().isEmpty()) {
-        output.writeBytes(3, getTableNamePatternBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 3, tableNamePattern_);
       }
       if (!getColumnNamePatternBytes().isEmpty()) {
-        output.writeBytes(4, getColumnNamePatternBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 4, columnNamePattern_);
       }
       if (!getConnectionIdBytes().isEmpty()) {
-        output.writeBytes(5, getConnectionIdBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 5, connectionId_);
       }
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
       if (!getCatalogBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, getCatalogBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(1, catalog_);
       }
       if (!getSchemaPatternBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(2, getSchemaPatternBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(2, schemaPattern_);
       }
       if (!getTableNamePatternBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(3, getTableNamePatternBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(3, tableNamePattern_);
       }
       if (!getColumnNamePatternBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(4, getColumnNamePatternBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(4, columnNamePattern_);
       }
       if (!getConnectionIdBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(5, getConnectionIdBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(5, connectionId_);
       }
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -3663,12 +3676,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Requests.ColumnsRequest prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -3824,9 +3842,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            catalog_ = s;
-          }
+          catalog_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -3878,7 +3894,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         catalog_ = value;
         onChanged();
         return this;
@@ -3894,9 +3911,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            schemaPattern_ = s;
-          }
+          schemaPattern_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -3948,7 +3963,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         schemaPattern_ = value;
         onChanged();
         return this;
@@ -3964,9 +3980,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            tableNamePattern_ = s;
-          }
+          tableNamePattern_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -4018,7 +4032,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         tableNamePattern_ = value;
         onChanged();
         return this;
@@ -4034,9 +4049,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            columnNamePattern_ = s;
-          }
+          columnNamePattern_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -4088,7 +4101,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         columnNamePattern_ = value;
         onChanged();
         return this;
@@ -4104,9 +4118,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            connectionId_ = s;
-          }
+          connectionId_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -4158,7 +4170,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         connectionId_ = value;
         onChanged();
         return this;
@@ -4178,16 +4191,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:ColumnsRequest)
-    private static final org.apache.calcite.avatica.proto.Requests.ColumnsRequest defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Requests.ColumnsRequest();
+    private static final org.apache.calcite.avatica.proto.Requests.ColumnsRequest DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Requests.ColumnsRequest();
     }
 
     public static org.apache.calcite.avatica.proto.Requests.ColumnsRequest getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<ColumnsRequest>
+        PARSER = new com.google.protobuf.AbstractParser<ColumnsRequest>() {
+      public ColumnsRequest parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new ColumnsRequest(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }
+    };
+
+    public static com.google.protobuf.Parser<ColumnsRequest> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<ColumnsRequest> getParserForType() {
+      return PARSER;
     }
 
     public org.apache.calcite.avatica.proto.Requests.ColumnsRequest getDefaultInstanceForType() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
     }
 
   }
@@ -4218,7 +4260,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:TypeInfoRequest)
       TypeInfoRequestOrBuilder {
     // Use TypeInfoRequest.newBuilder() to construct.
-    private TypeInfoRequest(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private TypeInfoRequest(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private TypeInfoRequest() {
@@ -4232,8 +4274,7 @@ package org.apache.calcite.avatica.proto;
     }
     private TypeInfoRequest(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -4251,18 +4292,19 @@ package org.apache.calcite.avatica.proto;
               break;
             }
             case 10: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              connectionId_ = bs;
+              connectionId_ = s;
               break;
             }
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         makeExtensionsImmutable();
       }
@@ -4279,23 +4321,8 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Requests.TypeInfoRequest.class, org.apache.calcite.avatica.proto.Requests.TypeInfoRequest.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<TypeInfoRequest> PARSER =
-        new com.google.protobuf.AbstractParser<TypeInfoRequest>() {
-      public TypeInfoRequest parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new TypeInfoRequest(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<TypeInfoRequest> getParserForType() {
-      return PARSER;
-    }
-
     public static final int CONNECTION_ID_FIELD_NUMBER = 1;
-    private java.lang.Object connectionId_;
+    private volatile java.lang.Object connectionId_;
     /**
      * <code>optional string connection_id = 1;</code>
      */
@@ -4307,9 +4334,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          connectionId_ = s;
-        }
+        connectionId_ = s;
         return s;
       }
     }
@@ -4342,23 +4367,20 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
       if (!getConnectionIdBytes().isEmpty()) {
-        output.writeBytes(1, getConnectionIdBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 1, connectionId_);
       }
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
       if (!getConnectionIdBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, getConnectionIdBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(1, connectionId_);
       }
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -4416,12 +4438,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Requests.TypeInfoRequest prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -4548,9 +4575,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            connectionId_ = s;
-          }
+          connectionId_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -4602,7 +4627,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         connectionId_ = value;
         onChanged();
         return this;
@@ -4622,16 +4648,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:TypeInfoRequest)
-    private static final org.apache.calcite.avatica.proto.Requests.TypeInfoRequest defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Requests.TypeInfoRequest();
+    private static final org.apache.calcite.avatica.proto.Requests.TypeInfoRequest DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Requests.TypeInfoRequest();
     }
 
     public static org.apache.calcite.avatica.proto.Requests.TypeInfoRequest getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<TypeInfoRequest>
+        PARSER = new com.google.protobuf.AbstractParser<TypeInfoRequest>() {
+      public TypeInfoRequest parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new TypeInfoRequest(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }
+    };
+
+    public static com.google.protobuf.Parser<TypeInfoRequest> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<TypeInfoRequest> getParserForType() {
+      return PARSER;
     }
 
     public org.apache.calcite.avatica.proto.Requests.TypeInfoRequest getDefaultInstanceForType() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
     }
 
   }
@@ -4682,7 +4737,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:PrepareAndExecuteRequest)
       PrepareAndExecuteRequestOrBuilder {
     // Use PrepareAndExecuteRequest.newBuilder() to construct.
-    private PrepareAndExecuteRequest(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private PrepareAndExecuteRequest(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private PrepareAndExecuteRequest() {
@@ -4699,8 +4754,7 @@ package org.apache.calcite.avatica.proto;
     }
     private PrepareAndExecuteRequest(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -4718,15 +4772,15 @@ package org.apache.calcite.avatica.proto;
               break;
             }
             case 10: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              connectionId_ = bs;
+              connectionId_ = s;
               break;
             }
             case 18: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              sql_ = bs;
+              sql_ = s;
               break;
             }
             case 24: {
@@ -4742,10 +4796,11 @@ package org.apache.calcite.avatica.proto;
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         makeExtensionsImmutable();
       }
@@ -4762,23 +4817,8 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Requests.PrepareAndExecuteRequest.class, org.apache.calcite.avatica.proto.Requests.PrepareAndExecuteRequest.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<PrepareAndExecuteRequest> PARSER =
-        new com.google.protobuf.AbstractParser<PrepareAndExecuteRequest>() {
-      public PrepareAndExecuteRequest parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new PrepareAndExecuteRequest(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<PrepareAndExecuteRequest> getParserForType() {
-      return PARSER;
-    }
-
     public static final int CONNECTION_ID_FIELD_NUMBER = 1;
-    private java.lang.Object connectionId_;
+    private volatile java.lang.Object connectionId_;
     /**
      * <code>optional string connection_id = 1;</code>
      */
@@ -4790,9 +4830,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          connectionId_ = s;
-        }
+        connectionId_ = s;
         return s;
       }
     }
@@ -4814,7 +4852,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int SQL_FIELD_NUMBER = 2;
-    private java.lang.Object sql_;
+    private volatile java.lang.Object sql_;
     /**
      * <code>optional string sql = 2;</code>
      */
@@ -4826,9 +4864,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          sql_ = s;
-        }
+        sql_ = s;
         return s;
       }
     }
@@ -4879,12 +4915,11 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
       if (!getConnectionIdBytes().isEmpty()) {
-        output.writeBytes(1, getConnectionIdBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 1, connectionId_);
       }
       if (!getSqlBytes().isEmpty()) {
-        output.writeBytes(2, getSqlBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 2, sql_);
       }
       if (maxRowCount_ != 0L) {
         output.writeUInt64(3, maxRowCount_);
@@ -4894,19 +4929,16 @@ package org.apache.calcite.avatica.proto;
       }
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
       if (!getConnectionIdBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, getConnectionIdBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(1, connectionId_);
       }
       if (!getSqlBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(2, getSqlBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(2, sql_);
       }
       if (maxRowCount_ != 0L) {
         size += com.google.protobuf.CodedOutputStream
@@ -4916,7 +4948,7 @@ package org.apache.calcite.avatica.proto;
         size += com.google.protobuf.CodedOutputStream
           .computeUInt32Size(4, statementId_);
       }
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -4974,12 +5006,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Requests.PrepareAndExecuteRequest prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -5125,9 +5162,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            connectionId_ = s;
-          }
+          connectionId_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -5179,7 +5214,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         connectionId_ = value;
         onChanged();
         return this;
@@ -5195,9 +5231,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            sql_ = s;
-          }
+          sql_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -5249,7 +5283,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         sql_ = value;
         onChanged();
         return this;
@@ -5321,16 +5356,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:PrepareAndExecuteRequest)
-    private static final org.apache.calcite.avatica.proto.Requests.PrepareAndExecuteRequest defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Requests.PrepareAndExecuteRequest();
+    private static final org.apache.calcite.avatica.proto.Requests.PrepareAndExecuteRequest DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Requests.PrepareAndExecuteRequest();
     }
 
     public static org.apache.calcite.avatica.proto.Requests.PrepareAndExecuteRequest getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<PrepareAndExecuteRequest>
+        PARSER = new com.google.protobuf.AbstractParser<PrepareAndExecuteRequest>() {
+      public PrepareAndExecuteRequest parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new PrepareAndExecuteRequest(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }
+    };
+
+    public static com.google.protobuf.Parser<PrepareAndExecuteRequest> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<PrepareAndExecuteRequest> getParserForType() {
+      return PARSER;
     }
 
     public org.apache.calcite.avatica.proto.Requests.PrepareAndExecuteRequest getDefaultInstanceForType() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
     }
 
   }
@@ -5376,7 +5440,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:PrepareRequest)
       PrepareRequestOrBuilder {
     // Use PrepareRequest.newBuilder() to construct.
-    private PrepareRequest(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private PrepareRequest(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private PrepareRequest() {
@@ -5392,8 +5456,7 @@ package org.apache.calcite.avatica.proto;
     }
     private PrepareRequest(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -5411,15 +5474,15 @@ package org.apache.calcite.avatica.proto;
               break;
             }
             case 10: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              connectionId_ = bs;
+              connectionId_ = s;
               break;
             }
             case 18: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              sql_ = bs;
+              sql_ = s;
               break;
             }
             case 24: {
@@ -5430,10 +5493,11 @@ package org.apache.calcite.avatica.proto;
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         makeExtensionsImmutable();
       }
@@ -5450,23 +5514,8 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Requests.PrepareRequest.class, org.apache.calcite.avatica.proto.Requests.PrepareRequest.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<PrepareRequest> PARSER =
-        new com.google.protobuf.AbstractParser<PrepareRequest>() {
-      public PrepareRequest parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new PrepareRequest(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<PrepareRequest> getParserForType() {
-      return PARSER;
-    }
-
     public static final int CONNECTION_ID_FIELD_NUMBER = 1;
-    private java.lang.Object connectionId_;
+    private volatile java.lang.Object connectionId_;
     /**
      * <code>optional string connection_id = 1;</code>
      */
@@ -5478,9 +5527,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          connectionId_ = s;
-        }
+        connectionId_ = s;
         return s;
       }
     }
@@ -5502,7 +5549,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int SQL_FIELD_NUMBER = 2;
-    private java.lang.Object sql_;
+    private volatile java.lang.Obje

<TRUNCATED>


[08/11] incubator-calcite git commit: [CALCITE-908] Bump protobuf to 3.0.0-beta-1, fix deprecations and update docs (Josh Elser)

Posted by jh...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/86610552/avatica/src/main/java/org/apache/calcite/avatica/proto/Responses.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/proto/Responses.java b/avatica/src/main/java/org/apache/calcite/avatica/proto/Responses.java
index e41078a..82cc88e 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/proto/Responses.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/proto/Responses.java
@@ -95,7 +95,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:ResultSetResponse)
       ResultSetResponseOrBuilder {
     // Use ResultSetResponse.newBuilder() to construct.
-    private ResultSetResponse(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private ResultSetResponse(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private ResultSetResponse() {
@@ -112,8 +112,7 @@ package org.apache.calcite.avatica.proto;
     }
     private ResultSetResponse(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -131,9 +130,9 @@ package org.apache.calcite.avatica.proto;
               break;
             }
             case 10: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              connectionId_ = bs;
+              connectionId_ = s;
               break;
             }
             case 16: {
@@ -151,7 +150,7 @@ package org.apache.calcite.avatica.proto;
               if (signature_ != null) {
                 subBuilder = signature_.toBuilder();
               }
-              signature_ = input.readMessage(org.apache.calcite.avatica.proto.Common.Signature.PARSER, extensionRegistry);
+              signature_ = input.readMessage(org.apache.calcite.avatica.proto.Common.Signature.parser(), extensionRegistry);
               if (subBuilder != null) {
                 subBuilder.mergeFrom(signature_);
                 signature_ = subBuilder.buildPartial();
@@ -164,7 +163,7 @@ package org.apache.calcite.avatica.proto;
               if (firstFrame_ != null) {
                 subBuilder = firstFrame_.toBuilder();
               }
-              firstFrame_ = input.readMessage(org.apache.calcite.avatica.proto.Common.Frame.PARSER, extensionRegistry);
+              firstFrame_ = input.readMessage(org.apache.calcite.avatica.proto.Common.Frame.parser(), extensionRegistry);
               if (subBuilder != null) {
                 subBuilder.mergeFrom(firstFrame_);
                 firstFrame_ = subBuilder.buildPartial();
@@ -180,10 +179,11 @@ package org.apache.calcite.avatica.proto;
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         makeExtensionsImmutable();
       }
@@ -200,23 +200,8 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Responses.ResultSetResponse.class, org.apache.calcite.avatica.proto.Responses.ResultSetResponse.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<ResultSetResponse> PARSER =
-        new com.google.protobuf.AbstractParser<ResultSetResponse>() {
-      public ResultSetResponse parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new ResultSetResponse(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<ResultSetResponse> getParserForType() {
-      return PARSER;
-    }
-
     public static final int CONNECTION_ID_FIELD_NUMBER = 1;
-    private java.lang.Object connectionId_;
+    private volatile java.lang.Object connectionId_;
     /**
      * <code>optional string connection_id = 1;</code>
      */
@@ -228,9 +213,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          connectionId_ = s;
-        }
+        connectionId_ = s;
         return s;
       }
     }
@@ -336,9 +319,8 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
       if (!getConnectionIdBytes().isEmpty()) {
-        output.writeBytes(1, getConnectionIdBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 1, connectionId_);
       }
       if (statementId_ != 0) {
         output.writeUInt32(2, statementId_);
@@ -357,15 +339,13 @@ package org.apache.calcite.avatica.proto;
       }
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
       if (!getConnectionIdBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, getConnectionIdBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(1, connectionId_);
       }
       if (statementId_ != 0) {
         size += com.google.protobuf.CodedOutputStream
@@ -387,7 +367,7 @@ package org.apache.calcite.avatica.proto;
         size += com.google.protobuf.CodedOutputStream
           .computeUInt64Size(6, updateCount_);
       }
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -445,12 +425,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Responses.ResultSetResponse prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -623,9 +608,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            connectionId_ = s;
-          }
+          connectionId_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -677,7 +660,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         connectionId_ = value;
         onChanged();
         return this;
@@ -1021,16 +1005,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:ResultSetResponse)
-    private static final org.apache.calcite.avatica.proto.Responses.ResultSetResponse defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Responses.ResultSetResponse();
+    private static final org.apache.calcite.avatica.proto.Responses.ResultSetResponse DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Responses.ResultSetResponse();
     }
 
     public static org.apache.calcite.avatica.proto.Responses.ResultSetResponse getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<ResultSetResponse>
+        PARSER = new com.google.protobuf.AbstractParser<ResultSetResponse>() {
+      public ResultSetResponse parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new ResultSetResponse(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }
+    };
+
+    public static com.google.protobuf.Parser<ResultSetResponse> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<ResultSetResponse> getParserForType() {
+      return PARSER;
     }
 
     public org.apache.calcite.avatica.proto.Responses.ResultSetResponse getDefaultInstanceForType() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
     }
 
   }
@@ -1075,7 +1088,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:ExecuteResponse)
       ExecuteResponseOrBuilder {
     // Use ExecuteResponse.newBuilder() to construct.
-    private ExecuteResponse(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private ExecuteResponse(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private ExecuteResponse() {
@@ -1089,8 +1102,7 @@ package org.apache.calcite.avatica.proto;
     }
     private ExecuteResponse(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -1112,16 +1124,17 @@ package org.apache.calcite.avatica.proto;
                 results_ = new java.util.ArrayList<org.apache.calcite.avatica.proto.Responses.ResultSetResponse>();
                 mutable_bitField0_ |= 0x00000001;
               }
-              results_.add(input.readMessage(org.apache.calcite.avatica.proto.Responses.ResultSetResponse.PARSER, extensionRegistry));
+              results_.add(input.readMessage(org.apache.calcite.avatica.proto.Responses.ResultSetResponse.parser(), extensionRegistry));
               break;
             }
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
           results_ = java.util.Collections.unmodifiableList(results_);
@@ -1141,21 +1154,6 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Responses.ExecuteResponse.class, org.apache.calcite.avatica.proto.Responses.ExecuteResponse.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<ExecuteResponse> PARSER =
-        new com.google.protobuf.AbstractParser<ExecuteResponse>() {
-      public ExecuteResponse parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new ExecuteResponse(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<ExecuteResponse> getParserForType() {
-      return PARSER;
-    }
-
     public static final int RESULTS_FIELD_NUMBER = 1;
     private java.util.List<org.apache.calcite.avatica.proto.Responses.ResultSetResponse> results_;
     /**
@@ -1203,15 +1201,13 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
       for (int i = 0; i < results_.size(); i++) {
         output.writeMessage(1, results_.get(i));
       }
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
@@ -1219,7 +1215,7 @@ package org.apache.calcite.avatica.proto;
         size += com.google.protobuf.CodedOutputStream
           .computeMessageSize(1, results_.get(i));
       }
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -1277,12 +1273,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Responses.ExecuteResponse prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -1690,16 +1691,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:ExecuteResponse)
-    private static final org.apache.calcite.avatica.proto.Responses.ExecuteResponse defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Responses.ExecuteResponse();
+    private static final org.apache.calcite.avatica.proto.Responses.ExecuteResponse DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Responses.ExecuteResponse();
     }
 
     public static org.apache.calcite.avatica.proto.Responses.ExecuteResponse getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<ExecuteResponse>
+        PARSER = new com.google.protobuf.AbstractParser<ExecuteResponse>() {
+      public ExecuteResponse parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new ExecuteResponse(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }
+    };
+
+    public static com.google.protobuf.Parser<ExecuteResponse> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<ExecuteResponse> getParserForType() {
+      return PARSER;
     }
 
     public org.apache.calcite.avatica.proto.Responses.ExecuteResponse getDefaultInstanceForType() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
     }
 
   }
@@ -1733,7 +1763,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:PrepareResponse)
       PrepareResponseOrBuilder {
     // Use PrepareResponse.newBuilder() to construct.
-    private PrepareResponse(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private PrepareResponse(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private PrepareResponse() {
@@ -1746,8 +1776,7 @@ package org.apache.calcite.avatica.proto;
     }
     private PrepareResponse(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -1769,7 +1798,7 @@ package org.apache.calcite.avatica.proto;
               if (statement_ != null) {
                 subBuilder = statement_.toBuilder();
               }
-              statement_ = input.readMessage(org.apache.calcite.avatica.proto.Common.StatementHandle.PARSER, extensionRegistry);
+              statement_ = input.readMessage(org.apache.calcite.avatica.proto.Common.StatementHandle.parser(), extensionRegistry);
               if (subBuilder != null) {
                 subBuilder.mergeFrom(statement_);
                 statement_ = subBuilder.buildPartial();
@@ -1780,10 +1809,11 @@ package org.apache.calcite.avatica.proto;
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         makeExtensionsImmutable();
       }
@@ -1800,21 +1830,6 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Responses.PrepareResponse.class, org.apache.calcite.avatica.proto.Responses.PrepareResponse.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<PrepareResponse> PARSER =
-        new com.google.protobuf.AbstractParser<PrepareResponse>() {
-      public PrepareResponse parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new PrepareResponse(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<PrepareResponse> getParserForType() {
-      return PARSER;
-    }
-
     public static final int STATEMENT_FIELD_NUMBER = 1;
     private org.apache.calcite.avatica.proto.Common.StatementHandle statement_;
     /**
@@ -1848,15 +1863,13 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
       if (statement_ != null) {
         output.writeMessage(1, getStatement());
       }
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
@@ -1864,7 +1877,7 @@ package org.apache.calcite.avatica.proto;
         size += com.google.protobuf.CodedOutputStream
           .computeMessageSize(1, getStatement());
       }
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -1922,12 +1935,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Responses.PrepareResponse prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -2182,16 +2200,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:PrepareResponse)
-    private static final org.apache.calcite.avatica.proto.Responses.PrepareResponse defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Responses.PrepareResponse();
+    private static final org.apache.calcite.avatica.proto.Responses.PrepareResponse DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Responses.PrepareResponse();
     }
 
     public static org.apache.calcite.avatica.proto.Responses.PrepareResponse getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<PrepareResponse>
+        PARSER = new com.google.protobuf.AbstractParser<PrepareResponse>() {
+      public PrepareResponse parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new PrepareResponse(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }
+    };
+
+    public static com.google.protobuf.Parser<PrepareResponse> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<PrepareResponse> getParserForType() {
+      return PARSER;
     }
 
     public org.apache.calcite.avatica.proto.Responses.PrepareResponse getDefaultInstanceForType() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
     }
 
   }
@@ -2225,7 +2272,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:FetchResponse)
       FetchResponseOrBuilder {
     // Use FetchResponse.newBuilder() to construct.
-    private FetchResponse(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private FetchResponse(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private FetchResponse() {
@@ -2238,8 +2285,7 @@ package org.apache.calcite.avatica.proto;
     }
     private FetchResponse(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -2261,7 +2307,7 @@ package org.apache.calcite.avatica.proto;
               if (frame_ != null) {
                 subBuilder = frame_.toBuilder();
               }
-              frame_ = input.readMessage(org.apache.calcite.avatica.proto.Common.Frame.PARSER, extensionRegistry);
+              frame_ = input.readMessage(org.apache.calcite.avatica.proto.Common.Frame.parser(), extensionRegistry);
               if (subBuilder != null) {
                 subBuilder.mergeFrom(frame_);
                 frame_ = subBuilder.buildPartial();
@@ -2272,10 +2318,11 @@ package org.apache.calcite.avatica.proto;
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         makeExtensionsImmutable();
       }
@@ -2292,21 +2339,6 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Responses.FetchResponse.class, org.apache.calcite.avatica.proto.Responses.FetchResponse.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<FetchResponse> PARSER =
-        new com.google.protobuf.AbstractParser<FetchResponse>() {
-      public FetchResponse parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new FetchResponse(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<FetchResponse> getParserForType() {
-      return PARSER;
-    }
-
     public static final int FRAME_FIELD_NUMBER = 1;
     private org.apache.calcite.avatica.proto.Common.Frame frame_;
     /**
@@ -2340,15 +2372,13 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
       if (frame_ != null) {
         output.writeMessage(1, getFrame());
       }
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
@@ -2356,7 +2386,7 @@ package org.apache.calcite.avatica.proto;
         size += com.google.protobuf.CodedOutputStream
           .computeMessageSize(1, getFrame());
       }
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -2414,12 +2444,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Responses.FetchResponse prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -2674,16 +2709,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:FetchResponse)
-    private static final org.apache.calcite.avatica.proto.Responses.FetchResponse defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Responses.FetchResponse();
+    private static final org.apache.calcite.avatica.proto.Responses.FetchResponse DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Responses.FetchResponse();
     }
 
     public static org.apache.calcite.avatica.proto.Responses.FetchResponse getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<FetchResponse>
+        PARSER = new com.google.protobuf.AbstractParser<FetchResponse>() {
+      public FetchResponse parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new FetchResponse(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }
+    };
+
+    public static com.google.protobuf.Parser<FetchResponse> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<FetchResponse> getParserForType() {
+      return PARSER;
     }
 
     public org.apache.calcite.avatica.proto.Responses.FetchResponse getDefaultInstanceForType() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
     }
 
   }
@@ -2719,7 +2783,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:CreateStatementResponse)
       CreateStatementResponseOrBuilder {
     // Use CreateStatementResponse.newBuilder() to construct.
-    private CreateStatementResponse(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private CreateStatementResponse(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private CreateStatementResponse() {
@@ -2734,8 +2798,7 @@ package org.apache.calcite.avatica.proto;
     }
     private CreateStatementResponse(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -2753,9 +2816,9 @@ package org.apache.calcite.avatica.proto;
               break;
             }
             case 10: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              connectionId_ = bs;
+              connectionId_ = s;
               break;
             }
             case 16: {
@@ -2766,10 +2829,11 @@ package org.apache.calcite.avatica.proto;
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         makeExtensionsImmutable();
       }
@@ -2786,23 +2850,8 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Responses.CreateStatementResponse.class, org.apache.calcite.avatica.proto.Responses.CreateStatementResponse.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<CreateStatementResponse> PARSER =
-        new com.google.protobuf.AbstractParser<CreateStatementResponse>() {
-      public CreateStatementResponse parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new CreateStatementResponse(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<CreateStatementResponse> getParserForType() {
-      return PARSER;
-    }
-
     public static final int CONNECTION_ID_FIELD_NUMBER = 1;
-    private java.lang.Object connectionId_;
+    private volatile java.lang.Object connectionId_;
     /**
      * <code>optional string connection_id = 1;</code>
      */
@@ -2814,9 +2863,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          connectionId_ = s;
-        }
+        connectionId_ = s;
         return s;
       }
     }
@@ -2858,30 +2905,27 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
       if (!getConnectionIdBytes().isEmpty()) {
-        output.writeBytes(1, getConnectionIdBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 1, connectionId_);
       }
       if (statementId_ != 0) {
         output.writeUInt32(2, statementId_);
       }
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
       if (!getConnectionIdBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, getConnectionIdBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(1, connectionId_);
       }
       if (statementId_ != 0) {
         size += com.google.protobuf.CodedOutputStream
           .computeUInt32Size(2, statementId_);
       }
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -2939,12 +2983,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Responses.CreateStatementResponse prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -3077,9 +3126,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            connectionId_ = s;
-          }
+          connectionId_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -3131,7 +3178,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         connectionId_ = value;
         onChanged();
         return this;
@@ -3177,16 +3225,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:CreateStatementResponse)
-    private static final org.apache.calcite.avatica.proto.Responses.CreateStatementResponse defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Responses.CreateStatementResponse();
+    private static final org.apache.calcite.avatica.proto.Responses.CreateStatementResponse DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Responses.CreateStatementResponse();
     }
 
     public static org.apache.calcite.avatica.proto.Responses.CreateStatementResponse getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<CreateStatementResponse>
+        PARSER = new com.google.protobuf.AbstractParser<CreateStatementResponse>() {
+      public CreateStatementResponse parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new CreateStatementResponse(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }
+    };
+
+    public static com.google.protobuf.Parser<CreateStatementResponse> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<CreateStatementResponse> getParserForType() {
+      return PARSER;
     }
 
     public org.apache.calcite.avatica.proto.Responses.CreateStatementResponse getDefaultInstanceForType() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
     }
 
   }
@@ -3207,7 +3284,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:CloseStatementResponse)
       CloseStatementResponseOrBuilder {
     // Use CloseStatementResponse.newBuilder() to construct.
-    private CloseStatementResponse(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private CloseStatementResponse(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private CloseStatementResponse() {
@@ -3220,8 +3297,7 @@ package org.apache.calcite.avatica.proto;
     }
     private CloseStatementResponse(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       try {
         boolean done = false;
@@ -3240,10 +3316,11 @@ package org.apache.calcite.avatica.proto;
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         makeExtensionsImmutable();
       }
@@ -3260,21 +3337,6 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Responses.CloseStatementResponse.class, org.apache.calcite.avatica.proto.Responses.CloseStatementResponse.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<CloseStatementResponse> PARSER =
-        new com.google.protobuf.AbstractParser<CloseStatementResponse>() {
-      public CloseStatementResponse parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new CloseStatementResponse(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<CloseStatementResponse> getParserForType() {
-      return PARSER;
-    }
-
     private byte memoizedIsInitialized = -1;
     public final boolean isInitialized() {
       byte isInitialized = memoizedIsInitialized;
@@ -3287,16 +3349,14 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -3354,12 +3414,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Responses.CloseStatementResponse prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -3483,16 +3548,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:CloseStatementResponse)
-    private static final org.apache.calcite.avatica.proto.Responses.CloseStatementResponse defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Responses.CloseStatementResponse();
+    private static final org.apache.calcite.avatica.proto.Responses.CloseStatementResponse DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Responses.CloseStatementResponse();
     }
 
     public static org.apache.calcite.avatica.proto.Responses.CloseStatementResponse getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<CloseStatementResponse>
+        PARSER = new com.google.protobuf.AbstractParser<CloseStatementResponse>() {
+      public CloseStatementResponse parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new CloseStatementResponse(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }
+    };
+
+    public static com.google.protobuf.Parser<CloseStatementResponse> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<CloseStatementResponse> getParserForType() {
+      return PARSER;
     }
 
     public org.apache.calcite.avatica.proto.Responses.CloseStatementResponse getDefaultInstanceForType() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
     }
 
   }
@@ -3513,7 +3607,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:OpenConnectionResponse)
       OpenConnectionResponseOrBuilder {
     // Use OpenConnectionResponse.newBuilder() to construct.
-    private OpenConnectionResponse(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private OpenConnectionResponse(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private OpenConnectionResponse() {
@@ -3526,8 +3620,7 @@ package org.apache.calcite.avatica.proto;
     }
     private OpenConnectionResponse(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       try {
         boolean done = false;
@@ -3546,10 +3639,11 @@ package org.apache.calcite.avatica.proto;
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         makeExtensionsImmutable();
       }
@@ -3566,21 +3660,6 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse.class, org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<OpenConnectionResponse> PARSER =
-        new com.google.protobuf.AbstractParser<OpenConnectionResponse>() {
-      public OpenConnectionResponse parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new OpenConnectionResponse(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<OpenConnectionResponse> getParserForType() {
-      return PARSER;
-    }
-
     private byte memoizedIsInitialized = -1;
     public final boolean isInitialized() {
       byte isInitialized = memoizedIsInitialized;
@@ -3593,16 +3672,14 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -3660,12 +3737,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -3789,16 +3871,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:OpenConnectionResponse)
-    private static final org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse();
+    private static final org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse();
     }
 
     public static org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<OpenConnectionResponse>
+        PARSER = new com.google.protobuf.AbstractParser<OpenConnectionResponse>() {
+      public OpenConnectionResponse parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new OpenConnectionResponse(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }
+    };
+
+    public static com.google.protobuf.Parser<OpenConnectionResponse> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<OpenConnectionResponse> getParserForType() {
+      return PARSER;
     }
 
     public org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse getDefaultInstanceForType() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
     }
 
   }
@@ -3819,7 +3930,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:CloseConnectionResponse)
       CloseConnectionResponseOrBuilder {
     // Use CloseConnectionResponse.newBuilder() to construct.
-    private CloseConnectionResponse(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private CloseConnectionResponse(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private CloseConnectionResponse() {
@@ -3832,8 +3943,7 @@ package org.apache.calcite.avatica.proto;
     }
     private CloseConnectionResponse(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       try {
         boolean done = false;
@@ -3852,10 +3962,11 @@ package org.apache.calcite.avatica.proto;
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         makeExtensionsImmutable();
       }
@@ -3872,21 +3983,6 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Responses.CloseConnectionResponse.class, org.apache.calcite.avatica.proto.Responses.CloseConnectionResponse.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<CloseConnectionResponse> PARSER =
-        new com.google.protobuf.AbstractParser<CloseConnectionResponse>() {
-      public CloseConnectionResponse parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new CloseConnectionResponse(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<CloseConnectionResponse> getParserForType() {
-      return PARSER;
-    }
-
     private byte memoizedIsInitialized = -1;
     public final boolean isInitialized() {
       byte isInitialized = memoizedIsInitialized;
@@ -3899,16 +3995,14 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -3966,12 +4060,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Responses.CloseConnectionResponse prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -4095,16 +4194,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:CloseConnectionResponse)
-    private static final org.apache.calcite.avatica.proto.Responses.CloseConnectionResponse defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Responses.CloseConnectionResponse();
+    private static final org.apache.calcite.avatica.proto.Responses.CloseConnectionResponse DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Responses.CloseConnectionResponse();
     }
 
     public static org.apache.calcite.avatica.proto.Responses.CloseConnectionResponse getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<CloseConnectionResponse>
+        PARSER = new com.google.protobuf.AbstractParser<CloseConnectionResponse>() {
+      public CloseConnectionResponse parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new CloseConnectionResponse(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }
+    };
+
+    public static com.google.protobuf.Parser<CloseConnectionResponse> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<CloseConnectionResponse> getParserForType() {
+      return PARSER;
     }
 
     public org.apache.calcite.avatica.proto.Responses.CloseConnectionResponse getDefaultInstanceForType() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
     }
 
   }
@@ -4138,7 +4266,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:ConnectionSyncResponse)
       ConnectionSyncResponseOrBuilder {
     // Use ConnectionSyncResponse.newBuilder() to construct.
-    private ConnectionSyncResponse(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private ConnectionSyncResponse(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private ConnectionSyncResponse() {
@@ -4151,8 +4279,7 @@ package org.apache.calcite.avatica.proto;
     }
     private ConnectionSyncResponse(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -4174,7 +4301,7 @@ package org.apache.calcite.avatica.proto;
               if (connProps_ != null) {
                 subBuilder = connProps_.toBuilder();
               }
-              connProps_ = input.readMessage(org.apache.calcite.avatica.proto.Common.ConnectionProperties.PARSER, extensionRegistry);
+              connProps_ = input.readMessage(org.apache.calcite.avatica.proto.Common.ConnectionProperties.parser(), extensionRegistry);
               if (subBuilder != null) {
                 subBuilder.mergeFrom(connProps_);
                 connProps_ = subBuilder.buildPartial();
@@ -4185,10 +4312,11 @@ package org.apache.calcite.avatica.proto;
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         makeExtensionsImmutable();
       }
@@ -4205,21 +4333,6 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Responses.ConnectionSyncResponse.class, org.apache.calcite.avatica.proto.Responses.ConnectionSyncResponse.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<ConnectionSyncResponse> PARSER =
-        new com.google.protobuf.AbstractParser<ConnectionSyncResponse>() {
-      public ConnectionSyncResponse parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new ConnectionSyncResponse(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<ConnectionSyncResponse> getParserForType() {
-      return PARSER;
-    }
-
     public static final int CONN_PROPS_FIELD_NUMBER = 1;
     private org.apache.calcite.avatica.proto.Common.ConnectionProperties connProps_;
     /**
@@ -4253,15 +4366,13 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
       if (connProps_ != null) {
         output.writeMessage(1, getConnProps());
       }
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
@@ -4269,7 +4380,7 @@ package org.apache.calcite.avatica.proto;
         size += com.google.protobuf.CodedOutputStream
           .computeMessageSize(1, getConnProps());
       }
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -4327,12 +4438,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Responses.ConnectionSyncResponse prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -4587,16 +4703,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:ConnectionSyncResponse)
-    private static final org.apache.calcite.avatica.proto.Responses.ConnectionSyncResponse defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Responses.ConnectionSyncResponse();
+    private static final org.apache.calcite.avatica.proto.Responses.ConnectionSyncResponse DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Responses.ConnectionSyncResponse();
     }
 
     public static org.apache.calcite.avatica.proto.Responses.ConnectionSyncResponse getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<ConnectionSyncResponse>
+        PARSER = new com.google.protobuf.AbstractParser<ConnectionSyncResponse>() {
+      public ConnectionSyncResponse parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new ConnectionSyncResponse(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }
+    };
+
+    public static com.google.protobuf.Parser<ConnectionSyncResponse> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<ConnectionSyncResponse> getParserForType() {
+      return PARSER;
     }
 
     public org.apache.calcite.avatica.proto.Responses.ConnectionSyncResponse getDefaultInstanceForType() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
     }
 
   }
@@ -4639,7 +4784,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:DatabasePropertyElement)
       DatabasePropertyElementOrBuilder {
     // Use DatabasePropertyElement.newBuilder() to construct.
-    private DatabasePropertyElement(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private DatabasePropertyElement(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private DatabasePropertyElement() {
@@ -4652,8 +4797,7 @@ package org.apache.calcite.avatica.proto;
     }
     private DatabasePropertyElement(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -4675,7 +4819,7 @@ package org.apache.calcite.avatica.proto;
               if (key_ != null) {
                 subBuilder = key_.toBuilder();
               }
-              key_ = input.readMessage(org.apache.calcite.avatica.proto.Common.DatabaseProperty.PARSER, extensionRegistry);
+              key_ = input.readMessage(org.apache.calcite.avatica.proto.Common.DatabaseProperty.parser(), extensionRegistry);
               if (subBuilder != null) {
                 subBuilder.mergeFrom(key_);
                 key_ = subBuilder.buildPartial();
@@ -4688,7 +4832,7 @@ package org.apache.calcite.avatica.proto;
               if (value_ != null) {
                 subBuilder = value_.toBuilder();
               }
-              value_ = input.readMessage(org.apache.calcite.avatica.proto.Common.TypedValue.PARSER, extensionRegistry);
+              value_ = input.readMessage(org.apache.calcite.avatica.proto.Common.TypedValue.parser(), extensionRegistry);
               if (subBuilder != null) {
                 subBuilder.mergeFrom(value_);
                 value_ = subBuilder.buildPartial();
@@ -4699,10 +4843,11 @@ package org.apache.calcite.avatica.proto;
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         makeExtensionsImmutable();
       }
@@ -4719,21 +4864,6 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Responses.DatabasePropertyElement.class, org.apache.calcite.avatica.proto.Responses.DatabasePropertyElement.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<DatabasePropertyElement> PARSER =
-        new com.google.protobuf.AbstractParser<DatabasePropertyElement>() {
-      public DatabasePropertyElement parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new DatabasePropertyElement(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<DatabasePropertyElement> getParserForType() {
-      return PARSER;
-    }
-
     public static final int KEY_FIELD_NUMBER = 1;
     private org.apache.calcite.avatica.proto.Common.DatabaseProperty key_;
     /**
@@ -4788,7 +4918,6 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
       if (key_ != null) {
         output.writeMessage(1, getKey());
       }
@@ -4797,9 +4926,8 @@ package org.apache.calcite.avatica.proto;
       }
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
@@ -4811,7 +4939,7 @@ package org.apache.calcite.avatica.proto;
         size += com.google.protobuf.CodedOutputStream
           .computeMessageSize(2, getValue());
       }
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -4869,12 +4997,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Responses.DatabasePropertyElement prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -5256,16 +5389,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:DatabasePropertyElement)
-    private static final org.apache.calcite.avatica.proto.Responses.DatabasePropertyElement defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Responses.DatabasePropertyElement();
+    private static final org.apache.calcite.avatica.proto.Responses.DatabasePropertyElement DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Responses.DatabasePropertyElement();
     }
 
     public static org.apache.calcite.avatica.proto.Responses.DatabasePropertyElement getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<DatabasePropertyElement>
+        PARSER = new com.google.protobuf.AbstractParser<DatabasePropertyElement>() {
+      public DatabasePropertyElement parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new DatabasePropertyElement(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }
+    };
+
+    public static com.google.protobuf.Parser<DatabasePropertyElement> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<DatabasePropertyElement> getParserForType() {
+      return PARSER;
     }
 
     public org.apache.calcite.avatica.proto.Responses.DatabasePropertyElement getDefaultInstanceForType() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
     }
 
   }
@@ -5310,7 +5472,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:DatabasePropertyResponse)
       DatabasePropertyResponseOrBuilder {
     // Use DatabasePropertyResponse.newBuilder() to construct.
-    private DatabasePropertyResponse(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private DatabasePropertyResponse(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private DatabasePropertyResponse() {
@@ -5324,8 +5486,7 @@ package org.apache.calcite.avatica.proto;
     }
     private DatabasePropertyResponse(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -5347,16 +5508,17 @@ package org.apache.calcite.avatica.proto;
                 props_ = new java.util.ArrayList<org.apache.calcite.avatica.proto.Responses.DatabasePropertyElement>();
                 mutable_bitField0_ |= 0x00000001;
               }
-              props_.add(input.readMessage(org.apache.calcite.avatica.proto.Responses.DatabasePropertyElement.PARSER, extensionRegistry));
+              props_.add(input.readMessage(org.apache.calcite.avatica.proto.Responses.DatabasePropertyElement.parser(), extensionRegistry));
               break;
             }
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
           props_ = java.util.Collections.unmodifiableList(props_);
@@ -5376,21 +5538,6 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Responses.DatabasePropertyResponse.class, org.apache.calcite.avatica.proto.Responses.DatabasePropertyResponse.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<DatabasePropertyResponse> PARSER =
-        new com.google.protobuf.AbstractParser<DatabasePropertyResponse>() {
-      public DatabasePropertyResponse parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new DatabasePropertyResponse(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<DatabasePropertyResponse> getParserForType() {
-      return PARSER;
-    }
-
     public static final int PROPS_FIELD_NUMBER = 1;
     private java.util.List<org.apache.calcite.avatica.proto.Responses.DatabasePropertyElement> props_;
     /**
@@ -5438,15 +5585,13 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
       for (int i = 0; i < props_.size(); i++) {
         output.writeMessage(1, props_.get(i));
       }
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
@@ -5454,7 +5599,7 @@ package org.apache.calcite.avatica.proto;
         size += com.google.protobuf.CodedOutputStream
           .computeMessageSize(1, props_.get(i));
       }
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -5512,12 +5657,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Responses.DatabasePropertyResponse prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -5925,16 +6075,45 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:DatabasePropertyResponse)
-    private static final org.apache.calcite.avatica.proto.Responses.DatabasePropertyResponse defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Responses.DatabasePropertyResponse();
+    private static final org.apache.calcite.avatica.proto.Responses.DatabasePropertyResponse DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Responses.DatabasePropertyResponse();
     }
 
     public static org.apache.calcite.avatica.proto.Responses.DatabasePropertyResponse getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<DatabasePropertyResponse>
+        PARSER = new com.google.protobuf.AbstractParser<DatabasePropertyResponse>() {
+      public DatabasePropertyResponse parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new DatabasePropertyResponse(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferException) {
+            throw (com.google.protobuf.InvalidProtocolBufferException)
+                e.getCause();
+          }
+          throw e;
+        }
+      }
+    };
+
+    public static com.google.protobuf.Parser<DatabasePropertyResponse> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<DatabasePropertyResponse> getParserForType() {
+      return PARSER;
     }
 
     public org.apache.calcite.avatica.proto.Responses.DatabasePropertyResponse getDefaultInstanceForType() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
     }
 
   }
@@ -6044,7 +6223,7 @@ package org.apache.calcite.avatica.proto;
       // @@protoc_insertion_point(message_implements:ErrorResponse)
       ErrorResponseOrBuilder {
     // Use ErrorResponse.newBuilder() to construct.
-    private ErrorResponse(com.google.protobuf.GeneratedMessage.Builder builder) {
+    private ErrorResponse(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
       super(builder);
     }
     private ErrorResponse() {
@@ -6062,8 +6241,7 @@ package org.apache.calcite.avatica.proto;
     }
     private ErrorResponse(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -6081,18 +6259,18 @@ package org.apache.calcite.avatica.proto;
               break;
             }
             case 10: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
               if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
                 exceptions_ = new com.google.protobuf.LazyStringArrayList();
                 mutable_bitField0_ |= 0x00000001;
               }
-              exceptions_.add(bs);
+              exceptions_.add(s);
               break;
             }
             case 18: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              errorMessage_ = bs;
+              errorMessage_ = s;
               break;
             }
             case 24: {
@@ -6107,18 +6285,19 @@ package org.apache.calcite.avatica.proto;
               break;
             }
             case 42: {
-              com.google.protobuf.ByteString bs = input.readBytes();
+              String s = input.readStringRequireUtf8();
 
-              sqlState_ = bs;
+              sqlState_ = s;
               break;
             }
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
+        throw new RuntimeException(e.setUnfinishedMessage(this));
       } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
+        throw new RuntimeException(
+            new com.google.protobuf.InvalidProtocolBufferException(
+                e.getMessage()).setUnfinishedMessage(this));
       } finally {
         if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
           exceptions_ = exceptions_.getUnmodifiableView();
@@ -6138,21 +6317,6 @@ package org.apache.calcite.avatica.proto;
               org.apache.calcite.avatica.proto.Responses.ErrorResponse.class, org.apache.calcite.avatica.proto.Responses.ErrorResponse.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<ErrorResponse> PARSER =
-        new com.google.protobuf.AbstractParser<ErrorResponse>() {
-      public ErrorResponse parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new ErrorResponse(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<ErrorResponse> getParserForType() {
-      return PARSER;
-    }
-
     private int bitField0_;
     public static final int EXCEPTIONS_FIELD_NUMBER = 1;
     private com.google.protobuf.LazyStringList exceptions_;
@@ -6200,7 +6364,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int ERROR_MESSAGE_FIELD_NUMBER = 2;
-    private java.lang.Object errorMessage_;
+    private volatile java.lang.Object errorMessage_;
     /**
      * <code>optional string error_message = 2;</code>
      *
@@ -6216,9 +6380,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          errorMessage_ = s;
-        }
+        errorMessage_ = s;
         return s;
       }
     }
@@ -6273,7 +6435,7 @@ package org.apache.calcite.avatica.proto;
     }
 
     public static final int SQL_STATE_FIELD_NUMBER = 5;
-    private java.lang.Object sqlState_;
+    private volatile java.lang.Object sqlState_;
     /**
      * <code>optional string sql_state = 5;</code>
      *
@@ -6289,9 +6451,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          sqlState_ = s;
-        }
+        sqlState_ = s;
         return s;
       }
     }
@@ -6328,12 +6488,11 @@ package org.apache.calcite.avatica.proto;
 
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
       for (int i = 0; i < exceptions_.size(); i++) {
-        output.writeBytes(1, exceptions_.getByteString(i));
+        com.google.protobuf.GeneratedMessage.writeString(output, 1, exceptions_.getRaw(i));
       }
       if (!getErrorMessageBytes().isEmpty()) {
-        output.writeBytes(2, getErrorMessageBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 2, errorMessage_);
       }
       if (severity_ != org.apache.calcite.avatica.proto.Common.Severity.UNKNOWN_SEVERITY.getNumber()) {
         output.writeEnum(3, severity_);
@@ -6342,28 +6501,25 @@ package org.apache.calcite.avatica.proto;
         output.writeUInt32(4, errorCode_);
       }
       if (!getSqlStateBytes().isEmpty()) {
-        output.writeBytes(5, getSqlStateBytes());
+        com.google.protobuf.GeneratedMessage.writeString(output, 5, sqlState_);
       }
     }
 
-    private int memoizedSerializedSize = -1;
     public int getSerializedSize() {
-      int size = memoizedSerializedSize;
+      int size = memoizedSize;
       if (size != -1) return size;
 
       size = 0;
       {
         int dataSize = 0;
         for (int i = 0; i < exceptions_.size(); i++) {
-          dataSize += com.google.protobuf.CodedOutputStream
-            .computeBytesSizeNoTag(exceptions_.getByteString(i));
+          dataSize += computeStringSizeNoTag(exceptions_.getRaw(i));
         }
         size += dataSize;
         size += 1 * getExceptionsList().size();
       }
       if (!getErrorMessageBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(2, getErrorMessageBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(2, errorMessage_);
       }
       if (severity_ != org.apache.calcite.avatica.proto.Common.Severity.UNKNOWN_SEVERITY.getNumber()) {
         size += com.google.protobuf.CodedOutputStream
@@ -6374,10 +6530,9 @@ package org.apache.calcite.avatica.proto;
           .computeUInt32Size(4, errorCode_);
       }
       if (!getSqlStateBytes().isEmpty()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(5, getSqlStateBytes());
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(5, sqlState_);
       }
-      memoizedSerializedSize = size;
+      memoizedSize = size;
       return size;
     }
 
@@ -6435,12 +6590,17 @@ package org.apache.calcite.avatica.proto;
       return PARSER.parseFrom(input, extensionRegistry);
     }
 
-    public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
     public static Builder newBuilder(org.apache.calcite.avatica.proto.Responses.ErrorResponse prototype) {
-      return newBuilder().mergeFrom(prototype);
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    public Builder toBuilder() { return newBuilder(this); }
 
     @java.lang.Override
     protected Builder newBuilderForType(
@@ -6720,7 +6880,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  ensureExceptionsIsMutable();
+  checkByteStringIsUtf8(value);
+        ensureExceptionsIsMutable();
         exceptions_.add(value);
         onChanged();
         return this;
@@ -6740,9 +6901,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            errorMessage_ = s;
-          }
+          errorMessage_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -6810,7 +6969,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         errorMessage_ = value;
         onChanged();
         return this;
@@ -6912,9 +7072,7 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            sqlState_ = s;
-          }
+          sqlState_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
@@ -6982,7 +7140,8 @@ package org.apache.calcite.avatica.proto;
         if (value == null) {
     throw new NullPointerException();
   }
-  
+  checkByteStringIsUtf8(value);
+        
         sqlState_ = value;
         onChanged();
         return this;
@@ -7002,76 +7161,105 @@ package org.apache.calcite.avatica.proto;
     }
 
     // @@protoc_insertion_point(class_scope:ErrorResponse)
-    private static final org.apache.calcite.avatica.proto.Responses.ErrorResponse defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Responses.ErrorResponse();
+    private static final org.apache.calcite.avatica.proto.Responses.ErrorResponse DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.calcite.avatica.proto.Responses.ErrorResponse();
     }
 
     public static org.apache.calcite.avatica.proto.Responses.ErrorResponse getDefaultInstance() {
-      return defaultInstance;
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<ErrorResponse>
+        PARSER = new com.google.protobuf.AbstractParser<ErrorResponse>() {
+      public ErrorResponse parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new ErrorResponse(input, extensionRegistry);
+        } catch (RuntimeException e) {
+          if (e.getCause() instanceof
+              com.google.protobuf.InvalidProtocolBufferExcepti

<TRUNCATED>


[03/11] incubator-calcite git commit: [CALCITE-912] Add Avatica OpenConnectionRequest (Bruno Dumon)

Posted by jh...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/avatica/src/main/java/org/apache/calcite/avatica/proto/Requests.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/proto/Requests.java b/avatica/src/main/java/org/apache/calcite/avatica/proto/Requests.java
index bdcb140..00b8623 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/proto/Requests.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/proto/Requests.java
@@ -27,6 +27,16 @@ package org.apache.calcite.avatica.proto;
   public interface CatalogsRequestOrBuilder extends
       // @@protoc_insertion_point(interface_extends:CatalogsRequest)
       com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>optional string connection_id = 1;</code>
+     */
+    java.lang.String getConnectionId();
+    /**
+     * <code>optional string connection_id = 1;</code>
+     */
+    com.google.protobuf.ByteString
+        getConnectionIdBytes();
   }
   /**
    * Protobuf type {@code CatalogsRequest}
@@ -44,6 +54,7 @@ package org.apache.calcite.avatica.proto;
       super(builder);
     }
     private CatalogsRequest() {
+      connectionId_ = "";
     }
 
     @java.lang.Override
@@ -56,6 +67,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       this();
+      int mutable_bitField0_ = 0;
       try {
         boolean done = false;
         while (!done) {
@@ -70,6 +82,12 @@ package org.apache.calcite.avatica.proto;
               }
               break;
             }
+            case 10: {
+              com.google.protobuf.ByteString bs = input.readBytes();
+
+              connectionId_ = bs;
+              break;
+            }
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
@@ -108,6 +126,42 @@ package org.apache.calcite.avatica.proto;
       return PARSER;
     }
 
+    public static final int CONNECTION_ID_FIELD_NUMBER = 1;
+    private java.lang.Object connectionId_;
+    /**
+     * <code>optional string connection_id = 1;</code>
+     */
+    public java.lang.String getConnectionId() {
+      java.lang.Object ref = connectionId_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        if (bs.isValidUtf8()) {
+          connectionId_ = s;
+        }
+        return s;
+      }
+    }
+    /**
+     * <code>optional string connection_id = 1;</code>
+     */
+    public com.google.protobuf.ByteString
+        getConnectionIdBytes() {
+      java.lang.Object ref = connectionId_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        connectionId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
     private byte memoizedIsInitialized = -1;
     public final boolean isInitialized() {
       byte isInitialized = memoizedIsInitialized;
@@ -121,6 +175,9 @@ package org.apache.calcite.avatica.proto;
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
       getSerializedSize();
+      if (!getConnectionIdBytes().isEmpty()) {
+        output.writeBytes(1, getConnectionIdBytes());
+      }
     }
 
     private int memoizedSerializedSize = -1;
@@ -129,6 +186,10 @@ package org.apache.calcite.avatica.proto;
       if (size != -1) return size;
 
       size = 0;
+      if (!getConnectionIdBytes().isEmpty()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(1, getConnectionIdBytes());
+      }
       memoizedSerializedSize = size;
       return size;
     }
@@ -239,6 +300,8 @@ package org.apache.calcite.avatica.proto;
       }
       public Builder clear() {
         super.clear();
+        connectionId_ = "";
+
         return this;
       }
 
@@ -261,6 +324,7 @@ package org.apache.calcite.avatica.proto;
 
       public org.apache.calcite.avatica.proto.Requests.CatalogsRequest buildPartial() {
         org.apache.calcite.avatica.proto.Requests.CatalogsRequest result = new org.apache.calcite.avatica.proto.Requests.CatalogsRequest(this);
+        result.connectionId_ = connectionId_;
         onBuilt();
         return result;
       }
@@ -276,6 +340,10 @@ package org.apache.calcite.avatica.proto;
 
       public Builder mergeFrom(org.apache.calcite.avatica.proto.Requests.CatalogsRequest other) {
         if (other == org.apache.calcite.avatica.proto.Requests.CatalogsRequest.getDefaultInstance()) return this;
+        if (!other.getConnectionId().isEmpty()) {
+          connectionId_ = other.connectionId_;
+          onChanged();
+        }
         onChanged();
         return this;
       }
@@ -301,6 +369,76 @@ package org.apache.calcite.avatica.proto;
         }
         return this;
       }
+
+      private java.lang.Object connectionId_ = "";
+      /**
+       * <code>optional string connection_id = 1;</code>
+       */
+      public java.lang.String getConnectionId() {
+        java.lang.Object ref = connectionId_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          if (bs.isValidUtf8()) {
+            connectionId_ = s;
+          }
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>optional string connection_id = 1;</code>
+       */
+      public com.google.protobuf.ByteString
+          getConnectionIdBytes() {
+        java.lang.Object ref = connectionId_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          connectionId_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>optional string connection_id = 1;</code>
+       */
+      public Builder setConnectionId(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        connectionId_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string connection_id = 1;</code>
+       */
+      public Builder clearConnectionId() {
+        
+        connectionId_ = getDefaultInstance().getConnectionId();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string connection_id = 1;</code>
+       */
+      public Builder setConnectionIdBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        connectionId_ = value;
+        onChanged();
+        return this;
+      }
       public final Builder setUnknownFields(
           final com.google.protobuf.UnknownFieldSet unknownFields) {
         return this;
@@ -333,6 +471,16 @@ package org.apache.calcite.avatica.proto;
   public interface DatabasePropertyRequestOrBuilder extends
       // @@protoc_insertion_point(interface_extends:DatabasePropertyRequest)
       com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>optional string connection_id = 1;</code>
+     */
+    java.lang.String getConnectionId();
+    /**
+     * <code>optional string connection_id = 1;</code>
+     */
+    com.google.protobuf.ByteString
+        getConnectionIdBytes();
   }
   /**
    * Protobuf type {@code DatabasePropertyRequest}
@@ -350,6 +498,7 @@ package org.apache.calcite.avatica.proto;
       super(builder);
     }
     private DatabasePropertyRequest() {
+      connectionId_ = "";
     }
 
     @java.lang.Override
@@ -362,6 +511,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       this();
+      int mutable_bitField0_ = 0;
       try {
         boolean done = false;
         while (!done) {
@@ -376,6 +526,12 @@ package org.apache.calcite.avatica.proto;
               }
               break;
             }
+            case 10: {
+              com.google.protobuf.ByteString bs = input.readBytes();
+
+              connectionId_ = bs;
+              break;
+            }
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
@@ -414,6 +570,42 @@ package org.apache.calcite.avatica.proto;
       return PARSER;
     }
 
+    public static final int CONNECTION_ID_FIELD_NUMBER = 1;
+    private java.lang.Object connectionId_;
+    /**
+     * <code>optional string connection_id = 1;</code>
+     */
+    public java.lang.String getConnectionId() {
+      java.lang.Object ref = connectionId_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        if (bs.isValidUtf8()) {
+          connectionId_ = s;
+        }
+        return s;
+      }
+    }
+    /**
+     * <code>optional string connection_id = 1;</code>
+     */
+    public com.google.protobuf.ByteString
+        getConnectionIdBytes() {
+      java.lang.Object ref = connectionId_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        connectionId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
     private byte memoizedIsInitialized = -1;
     public final boolean isInitialized() {
       byte isInitialized = memoizedIsInitialized;
@@ -427,6 +619,9 @@ package org.apache.calcite.avatica.proto;
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
       getSerializedSize();
+      if (!getConnectionIdBytes().isEmpty()) {
+        output.writeBytes(1, getConnectionIdBytes());
+      }
     }
 
     private int memoizedSerializedSize = -1;
@@ -435,6 +630,10 @@ package org.apache.calcite.avatica.proto;
       if (size != -1) return size;
 
       size = 0;
+      if (!getConnectionIdBytes().isEmpty()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(1, getConnectionIdBytes());
+      }
       memoizedSerializedSize = size;
       return size;
     }
@@ -545,6 +744,8 @@ package org.apache.calcite.avatica.proto;
       }
       public Builder clear() {
         super.clear();
+        connectionId_ = "";
+
         return this;
       }
 
@@ -567,6 +768,7 @@ package org.apache.calcite.avatica.proto;
 
       public org.apache.calcite.avatica.proto.Requests.DatabasePropertyRequest buildPartial() {
         org.apache.calcite.avatica.proto.Requests.DatabasePropertyRequest result = new org.apache.calcite.avatica.proto.Requests.DatabasePropertyRequest(this);
+        result.connectionId_ = connectionId_;
         onBuilt();
         return result;
       }
@@ -582,6 +784,10 @@ package org.apache.calcite.avatica.proto;
 
       public Builder mergeFrom(org.apache.calcite.avatica.proto.Requests.DatabasePropertyRequest other) {
         if (other == org.apache.calcite.avatica.proto.Requests.DatabasePropertyRequest.getDefaultInstance()) return this;
+        if (!other.getConnectionId().isEmpty()) {
+          connectionId_ = other.connectionId_;
+          onChanged();
+        }
         onChanged();
         return this;
       }
@@ -607,41 +813,111 @@ package org.apache.calcite.avatica.proto;
         }
         return this;
       }
-      public final Builder setUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return this;
-      }
 
-      public final Builder mergeUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return this;
+      private java.lang.Object connectionId_ = "";
+      /**
+       * <code>optional string connection_id = 1;</code>
+       */
+      public java.lang.String getConnectionId() {
+        java.lang.Object ref = connectionId_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          if (bs.isValidUtf8()) {
+            connectionId_ = s;
+          }
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
       }
-
-
-      // @@protoc_insertion_point(builder_scope:DatabasePropertyRequest)
-    }
-
-    // @@protoc_insertion_point(class_scope:DatabasePropertyRequest)
-    private static final org.apache.calcite.avatica.proto.Requests.DatabasePropertyRequest defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Requests.DatabasePropertyRequest();
-    }
-
-    public static org.apache.calcite.avatica.proto.Requests.DatabasePropertyRequest getDefaultInstance() {
-      return defaultInstance;
-    }
-
-    public org.apache.calcite.avatica.proto.Requests.DatabasePropertyRequest getDefaultInstanceForType() {
-      return defaultInstance;
-    }
-
-  }
-
-  public interface SchemasRequestOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:SchemasRequest)
-      com.google.protobuf.MessageOrBuilder {
-
-    /**
-     * <code>optional string catalog = 1;</code>
+      /**
+       * <code>optional string connection_id = 1;</code>
+       */
+      public com.google.protobuf.ByteString
+          getConnectionIdBytes() {
+        java.lang.Object ref = connectionId_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          connectionId_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>optional string connection_id = 1;</code>
+       */
+      public Builder setConnectionId(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        connectionId_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string connection_id = 1;</code>
+       */
+      public Builder clearConnectionId() {
+        
+        connectionId_ = getDefaultInstance().getConnectionId();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string connection_id = 1;</code>
+       */
+      public Builder setConnectionIdBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        connectionId_ = value;
+        onChanged();
+        return this;
+      }
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return this;
+      }
+
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return this;
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:DatabasePropertyRequest)
+    }
+
+    // @@protoc_insertion_point(class_scope:DatabasePropertyRequest)
+    private static final org.apache.calcite.avatica.proto.Requests.DatabasePropertyRequest defaultInstance;static {
+      defaultInstance = new org.apache.calcite.avatica.proto.Requests.DatabasePropertyRequest();
+    }
+
+    public static org.apache.calcite.avatica.proto.Requests.DatabasePropertyRequest getDefaultInstance() {
+      return defaultInstance;
+    }
+
+    public org.apache.calcite.avatica.proto.Requests.DatabasePropertyRequest getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+
+  }
+
+  public interface SchemasRequestOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:SchemasRequest)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>optional string catalog = 1;</code>
      */
     java.lang.String getCatalog();
     /**
@@ -659,6 +935,16 @@ package org.apache.calcite.avatica.proto;
      */
     com.google.protobuf.ByteString
         getSchemaPatternBytes();
+
+    /**
+     * <code>optional string connection_id = 3;</code>
+     */
+    java.lang.String getConnectionId();
+    /**
+     * <code>optional string connection_id = 3;</code>
+     */
+    com.google.protobuf.ByteString
+        getConnectionIdBytes();
   }
   /**
    * Protobuf type {@code SchemasRequest}
@@ -678,6 +964,7 @@ package org.apache.calcite.avatica.proto;
     private SchemasRequest() {
       catalog_ = "";
       schemaPattern_ = "";
+      connectionId_ = "";
     }
 
     @java.lang.Override
@@ -717,6 +1004,12 @@ package org.apache.calcite.avatica.proto;
               schemaPattern_ = bs;
               break;
             }
+            case 26: {
+              com.google.protobuf.ByteString bs = input.readBytes();
+
+              connectionId_ = bs;
+              break;
+            }
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
@@ -827,6 +1120,42 @@ package org.apache.calcite.avatica.proto;
       }
     }
 
+    public static final int CONNECTION_ID_FIELD_NUMBER = 3;
+    private java.lang.Object connectionId_;
+    /**
+     * <code>optional string connection_id = 3;</code>
+     */
+    public java.lang.String getConnectionId() {
+      java.lang.Object ref = connectionId_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        if (bs.isValidUtf8()) {
+          connectionId_ = s;
+        }
+        return s;
+      }
+    }
+    /**
+     * <code>optional string connection_id = 3;</code>
+     */
+    public com.google.protobuf.ByteString
+        getConnectionIdBytes() {
+      java.lang.Object ref = connectionId_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        connectionId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
     private byte memoizedIsInitialized = -1;
     public final boolean isInitialized() {
       byte isInitialized = memoizedIsInitialized;
@@ -846,6 +1175,9 @@ package org.apache.calcite.avatica.proto;
       if (!getSchemaPatternBytes().isEmpty()) {
         output.writeBytes(2, getSchemaPatternBytes());
       }
+      if (!getConnectionIdBytes().isEmpty()) {
+        output.writeBytes(3, getConnectionIdBytes());
+      }
     }
 
     private int memoizedSerializedSize = -1;
@@ -862,6 +1194,10 @@ package org.apache.calcite.avatica.proto;
         size += com.google.protobuf.CodedOutputStream
           .computeBytesSize(2, getSchemaPatternBytes());
       }
+      if (!getConnectionIdBytes().isEmpty()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(3, getConnectionIdBytes());
+      }
       memoizedSerializedSize = size;
       return size;
     }
@@ -976,6 +1312,8 @@ package org.apache.calcite.avatica.proto;
 
         schemaPattern_ = "";
 
+        connectionId_ = "";
+
         return this;
       }
 
@@ -1000,6 +1338,7 @@ package org.apache.calcite.avatica.proto;
         org.apache.calcite.avatica.proto.Requests.SchemasRequest result = new org.apache.calcite.avatica.proto.Requests.SchemasRequest(this);
         result.catalog_ = catalog_;
         result.schemaPattern_ = schemaPattern_;
+        result.connectionId_ = connectionId_;
         onBuilt();
         return result;
       }
@@ -1023,6 +1362,10 @@ package org.apache.calcite.avatica.proto;
           schemaPattern_ = other.schemaPattern_;
           onChanged();
         }
+        if (!other.getConnectionId().isEmpty()) {
+          connectionId_ = other.connectionId_;
+          onChanged();
+        }
         onChanged();
         return this;
       }
@@ -1188,6 +1531,76 @@ package org.apache.calcite.avatica.proto;
         onChanged();
         return this;
       }
+
+      private java.lang.Object connectionId_ = "";
+      /**
+       * <code>optional string connection_id = 3;</code>
+       */
+      public java.lang.String getConnectionId() {
+        java.lang.Object ref = connectionId_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          if (bs.isValidUtf8()) {
+            connectionId_ = s;
+          }
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>optional string connection_id = 3;</code>
+       */
+      public com.google.protobuf.ByteString
+          getConnectionIdBytes() {
+        java.lang.Object ref = connectionId_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          connectionId_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>optional string connection_id = 3;</code>
+       */
+      public Builder setConnectionId(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        connectionId_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string connection_id = 3;</code>
+       */
+      public Builder clearConnectionId() {
+        
+        connectionId_ = getDefaultInstance().getConnectionId();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string connection_id = 3;</code>
+       */
+      public Builder setConnectionIdBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        connectionId_ = value;
+        onChanged();
+        return this;
+      }
       public final Builder setUnknownFields(
           final com.google.protobuf.UnknownFieldSet unknownFields) {
         return this;
@@ -1278,6 +1691,16 @@ package org.apache.calcite.avatica.proto;
      * </pre>
      */
     boolean getHasTypeList();
+
+    /**
+     * <code>optional string connection_id = 7;</code>
+     */
+    java.lang.String getConnectionId();
+    /**
+     * <code>optional string connection_id = 7;</code>
+     */
+    com.google.protobuf.ByteString
+        getConnectionIdBytes();
   }
   /**
    * Protobuf type {@code TablesRequest}
@@ -1301,6 +1724,7 @@ package org.apache.calcite.avatica.proto;
       tableNamePattern_ = "";
       typeList_ = com.google.protobuf.LazyStringArrayList.EMPTY;
       hasTypeList_ = false;
+      connectionId_ = "";
     }
 
     @java.lang.Override
@@ -1360,6 +1784,12 @@ package org.apache.calcite.avatica.proto;
               hasTypeList_ = input.readBool();
               break;
             }
+            case 58: {
+              com.google.protobuf.ByteString bs = input.readBytes();
+
+              connectionId_ = bs;
+              break;
+            }
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
@@ -1552,23 +1982,59 @@ package org.apache.calcite.avatica.proto;
       return hasTypeList_;
     }
 
-    private byte memoizedIsInitialized = -1;
-    public final boolean isInitialized() {
-      byte isInitialized = memoizedIsInitialized;
-      if (isInitialized == 1) return true;
-      if (isInitialized == 0) return false;
-
-      memoizedIsInitialized = 1;
-      return true;
-    }
-
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      getSerializedSize();
-      if (!getCatalogBytes().isEmpty()) {
-        output.writeBytes(1, getCatalogBytes());
+    public static final int CONNECTION_ID_FIELD_NUMBER = 7;
+    private java.lang.Object connectionId_;
+    /**
+     * <code>optional string connection_id = 7;</code>
+     */
+    public java.lang.String getConnectionId() {
+      java.lang.Object ref = connectionId_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        if (bs.isValidUtf8()) {
+          connectionId_ = s;
+        }
+        return s;
       }
-      if (!getSchemaPatternBytes().isEmpty()) {
+    }
+    /**
+     * <code>optional string connection_id = 7;</code>
+     */
+    public com.google.protobuf.ByteString
+        getConnectionIdBytes() {
+      java.lang.Object ref = connectionId_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        connectionId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (!getCatalogBytes().isEmpty()) {
+        output.writeBytes(1, getCatalogBytes());
+      }
+      if (!getSchemaPatternBytes().isEmpty()) {
         output.writeBytes(2, getSchemaPatternBytes());
       }
       if (!getTableNamePatternBytes().isEmpty()) {
@@ -1580,6 +2046,9 @@ package org.apache.calcite.avatica.proto;
       if (hasTypeList_ != false) {
         output.writeBool(6, hasTypeList_);
       }
+      if (!getConnectionIdBytes().isEmpty()) {
+        output.writeBytes(7, getConnectionIdBytes());
+      }
     }
 
     private int memoizedSerializedSize = -1;
@@ -1613,6 +2082,10 @@ package org.apache.calcite.avatica.proto;
         size += com.google.protobuf.CodedOutputStream
           .computeBoolSize(6, hasTypeList_);
       }
+      if (!getConnectionIdBytes().isEmpty()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(7, getConnectionIdBytes());
+      }
       memoizedSerializedSize = size;
       return size;
     }
@@ -1734,6 +2207,8 @@ package org.apache.calcite.avatica.proto;
         bitField0_ = (bitField0_ & ~0x00000008);
         hasTypeList_ = false;
 
+        connectionId_ = "";
+
         return this;
       }
 
@@ -1767,6 +2242,7 @@ package org.apache.calcite.avatica.proto;
         }
         result.typeList_ = typeList_;
         result.hasTypeList_ = hasTypeList_;
+        result.connectionId_ = connectionId_;
         result.bitField0_ = to_bitField0_;
         onBuilt();
         return result;
@@ -1808,6 +2284,10 @@ package org.apache.calcite.avatica.proto;
         if (other.getHasTypeList() != false) {
           setHasTypeList(other.getHasTypeList());
         }
+        if (!other.getConnectionId().isEmpty()) {
+          connectionId_ = other.connectionId_;
+          onChanged();
+        }
         onChanged();
         return this;
       }
@@ -2175,6 +2655,76 @@ package org.apache.calcite.avatica.proto;
         onChanged();
         return this;
       }
+
+      private java.lang.Object connectionId_ = "";
+      /**
+       * <code>optional string connection_id = 7;</code>
+       */
+      public java.lang.String getConnectionId() {
+        java.lang.Object ref = connectionId_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          if (bs.isValidUtf8()) {
+            connectionId_ = s;
+          }
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>optional string connection_id = 7;</code>
+       */
+      public com.google.protobuf.ByteString
+          getConnectionIdBytes() {
+        java.lang.Object ref = connectionId_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          connectionId_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>optional string connection_id = 7;</code>
+       */
+      public Builder setConnectionId(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        connectionId_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string connection_id = 7;</code>
+       */
+      public Builder clearConnectionId() {
+        
+        connectionId_ = getDefaultInstance().getConnectionId();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string connection_id = 7;</code>
+       */
+      public Builder setConnectionIdBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        connectionId_ = value;
+        onChanged();
+        return this;
+      }
       public final Builder setUnknownFields(
           final com.google.protobuf.UnknownFieldSet unknownFields) {
         return this;
@@ -2207,6 +2757,16 @@ package org.apache.calcite.avatica.proto;
   public interface TableTypesRequestOrBuilder extends
       // @@protoc_insertion_point(interface_extends:TableTypesRequest)
       com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>optional string connection_id = 1;</code>
+     */
+    java.lang.String getConnectionId();
+    /**
+     * <code>optional string connection_id = 1;</code>
+     */
+    com.google.protobuf.ByteString
+        getConnectionIdBytes();
   }
   /**
    * Protobuf type {@code TableTypesRequest}
@@ -2224,6 +2784,7 @@ package org.apache.calcite.avatica.proto;
       super(builder);
     }
     private TableTypesRequest() {
+      connectionId_ = "";
     }
 
     @java.lang.Override
@@ -2236,6 +2797,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       this();
+      int mutable_bitField0_ = 0;
       try {
         boolean done = false;
         while (!done) {
@@ -2250,6 +2812,12 @@ package org.apache.calcite.avatica.proto;
               }
               break;
             }
+            case 10: {
+              com.google.protobuf.ByteString bs = input.readBytes();
+
+              connectionId_ = bs;
+              break;
+            }
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
@@ -2288,6 +2856,42 @@ package org.apache.calcite.avatica.proto;
       return PARSER;
     }
 
+    public static final int CONNECTION_ID_FIELD_NUMBER = 1;
+    private java.lang.Object connectionId_;
+    /**
+     * <code>optional string connection_id = 1;</code>
+     */
+    public java.lang.String getConnectionId() {
+      java.lang.Object ref = connectionId_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        if (bs.isValidUtf8()) {
+          connectionId_ = s;
+        }
+        return s;
+      }
+    }
+    /**
+     * <code>optional string connection_id = 1;</code>
+     */
+    public com.google.protobuf.ByteString
+        getConnectionIdBytes() {
+      java.lang.Object ref = connectionId_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        connectionId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
     private byte memoizedIsInitialized = -1;
     public final boolean isInitialized() {
       byte isInitialized = memoizedIsInitialized;
@@ -2301,6 +2905,9 @@ package org.apache.calcite.avatica.proto;
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
       getSerializedSize();
+      if (!getConnectionIdBytes().isEmpty()) {
+        output.writeBytes(1, getConnectionIdBytes());
+      }
     }
 
     private int memoizedSerializedSize = -1;
@@ -2309,6 +2916,10 @@ package org.apache.calcite.avatica.proto;
       if (size != -1) return size;
 
       size = 0;
+      if (!getConnectionIdBytes().isEmpty()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(1, getConnectionIdBytes());
+      }
       memoizedSerializedSize = size;
       return size;
     }
@@ -2419,6 +3030,8 @@ package org.apache.calcite.avatica.proto;
       }
       public Builder clear() {
         super.clear();
+        connectionId_ = "";
+
         return this;
       }
 
@@ -2441,6 +3054,7 @@ package org.apache.calcite.avatica.proto;
 
       public org.apache.calcite.avatica.proto.Requests.TableTypesRequest buildPartial() {
         org.apache.calcite.avatica.proto.Requests.TableTypesRequest result = new org.apache.calcite.avatica.proto.Requests.TableTypesRequest(this);
+        result.connectionId_ = connectionId_;
         onBuilt();
         return result;
       }
@@ -2456,6 +3070,10 @@ package org.apache.calcite.avatica.proto;
 
       public Builder mergeFrom(org.apache.calcite.avatica.proto.Requests.TableTypesRequest other) {
         if (other == org.apache.calcite.avatica.proto.Requests.TableTypesRequest.getDefaultInstance()) return this;
+        if (!other.getConnectionId().isEmpty()) {
+          connectionId_ = other.connectionId_;
+          onChanged();
+        }
         onChanged();
         return this;
       }
@@ -2481,6 +3099,76 @@ package org.apache.calcite.avatica.proto;
         }
         return this;
       }
+
+      private java.lang.Object connectionId_ = "";
+      /**
+       * <code>optional string connection_id = 1;</code>
+       */
+      public java.lang.String getConnectionId() {
+        java.lang.Object ref = connectionId_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          if (bs.isValidUtf8()) {
+            connectionId_ = s;
+          }
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>optional string connection_id = 1;</code>
+       */
+      public com.google.protobuf.ByteString
+          getConnectionIdBytes() {
+        java.lang.Object ref = connectionId_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          connectionId_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>optional string connection_id = 1;</code>
+       */
+      public Builder setConnectionId(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        connectionId_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string connection_id = 1;</code>
+       */
+      public Builder clearConnectionId() {
+        
+        connectionId_ = getDefaultInstance().getConnectionId();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string connection_id = 1;</code>
+       */
+      public Builder setConnectionIdBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        connectionId_ = value;
+        onChanged();
+        return this;
+      }
       public final Builder setUnknownFields(
           final com.google.protobuf.UnknownFieldSet unknownFields) {
         return this;
@@ -2553,13 +3241,23 @@ package org.apache.calcite.avatica.proto;
      */
     com.google.protobuf.ByteString
         getColumnNamePatternBytes();
-  }
-  /**
-   * Protobuf type {@code ColumnsRequest}
-   *
-   * <pre>
-   * Request for Meta#getColumns(String, org.apache.calcite.avatica.Meta.Pat,
-   *   org.apache.calcite.avatica.Meta.Pat, org.apache.calcite.avatica.Meta.Pat).
+
+    /**
+     * <code>optional string connection_id = 5;</code>
+     */
+    java.lang.String getConnectionId();
+    /**
+     * <code>optional string connection_id = 5;</code>
+     */
+    com.google.protobuf.ByteString
+        getConnectionIdBytes();
+  }
+  /**
+   * Protobuf type {@code ColumnsRequest}
+   *
+   * <pre>
+   * Request for Meta#getColumns(String, org.apache.calcite.avatica.Meta.Pat,
+   *   org.apache.calcite.avatica.Meta.Pat, org.apache.calcite.avatica.Meta.Pat).
    * </pre>
    */
   public  static final class ColumnsRequest extends
@@ -2575,6 +3273,7 @@ package org.apache.calcite.avatica.proto;
       schemaPattern_ = "";
       tableNamePattern_ = "";
       columnNamePattern_ = "";
+      connectionId_ = "";
     }
 
     @java.lang.Override
@@ -2626,6 +3325,12 @@ package org.apache.calcite.avatica.proto;
               columnNamePattern_ = bs;
               break;
             }
+            case 42: {
+              com.google.protobuf.ByteString bs = input.readBytes();
+
+              connectionId_ = bs;
+              break;
+            }
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
@@ -2808,6 +3513,42 @@ package org.apache.calcite.avatica.proto;
       }
     }
 
+    public static final int CONNECTION_ID_FIELD_NUMBER = 5;
+    private java.lang.Object connectionId_;
+    /**
+     * <code>optional string connection_id = 5;</code>
+     */
+    public java.lang.String getConnectionId() {
+      java.lang.Object ref = connectionId_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        if (bs.isValidUtf8()) {
+          connectionId_ = s;
+        }
+        return s;
+      }
+    }
+    /**
+     * <code>optional string connection_id = 5;</code>
+     */
+    public com.google.protobuf.ByteString
+        getConnectionIdBytes() {
+      java.lang.Object ref = connectionId_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        connectionId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
     private byte memoizedIsInitialized = -1;
     public final boolean isInitialized() {
       byte isInitialized = memoizedIsInitialized;
@@ -2833,6 +3574,9 @@ package org.apache.calcite.avatica.proto;
       if (!getColumnNamePatternBytes().isEmpty()) {
         output.writeBytes(4, getColumnNamePatternBytes());
       }
+      if (!getConnectionIdBytes().isEmpty()) {
+        output.writeBytes(5, getConnectionIdBytes());
+      }
     }
 
     private int memoizedSerializedSize = -1;
@@ -2857,6 +3601,10 @@ package org.apache.calcite.avatica.proto;
         size += com.google.protobuf.CodedOutputStream
           .computeBytesSize(4, getColumnNamePatternBytes());
       }
+      if (!getConnectionIdBytes().isEmpty()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(5, getConnectionIdBytes());
+      }
       memoizedSerializedSize = size;
       return size;
     }
@@ -2976,6 +3724,8 @@ package org.apache.calcite.avatica.proto;
 
         columnNamePattern_ = "";
 
+        connectionId_ = "";
+
         return this;
       }
 
@@ -3002,6 +3752,7 @@ package org.apache.calcite.avatica.proto;
         result.schemaPattern_ = schemaPattern_;
         result.tableNamePattern_ = tableNamePattern_;
         result.columnNamePattern_ = columnNamePattern_;
+        result.connectionId_ = connectionId_;
         onBuilt();
         return result;
       }
@@ -3033,6 +3784,10 @@ package org.apache.calcite.avatica.proto;
           columnNamePattern_ = other.columnNamePattern_;
           onChanged();
         }
+        if (!other.getConnectionId().isEmpty()) {
+          connectionId_ = other.connectionId_;
+          onChanged();
+        }
         onChanged();
         return this;
       }
@@ -3338,6 +4093,76 @@ package org.apache.calcite.avatica.proto;
         onChanged();
         return this;
       }
+
+      private java.lang.Object connectionId_ = "";
+      /**
+       * <code>optional string connection_id = 5;</code>
+       */
+      public java.lang.String getConnectionId() {
+        java.lang.Object ref = connectionId_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          if (bs.isValidUtf8()) {
+            connectionId_ = s;
+          }
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>optional string connection_id = 5;</code>
+       */
+      public com.google.protobuf.ByteString
+          getConnectionIdBytes() {
+        java.lang.Object ref = connectionId_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          connectionId_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>optional string connection_id = 5;</code>
+       */
+      public Builder setConnectionId(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        connectionId_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string connection_id = 5;</code>
+       */
+      public Builder clearConnectionId() {
+        
+        connectionId_ = getDefaultInstance().getConnectionId();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string connection_id = 5;</code>
+       */
+      public Builder setConnectionIdBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        connectionId_ = value;
+        onChanged();
+        return this;
+      }
       public final Builder setUnknownFields(
           final com.google.protobuf.UnknownFieldSet unknownFields) {
         return this;
@@ -3370,6 +4195,16 @@ package org.apache.calcite.avatica.proto;
   public interface TypeInfoRequestOrBuilder extends
       // @@protoc_insertion_point(interface_extends:TypeInfoRequest)
       com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>optional string connection_id = 1;</code>
+     */
+    java.lang.String getConnectionId();
+    /**
+     * <code>optional string connection_id = 1;</code>
+     */
+    com.google.protobuf.ByteString
+        getConnectionIdBytes();
   }
   /**
    * Protobuf type {@code TypeInfoRequest}
@@ -3387,6 +4222,7 @@ package org.apache.calcite.avatica.proto;
       super(builder);
     }
     private TypeInfoRequest() {
+      connectionId_ = "";
     }
 
     @java.lang.Override
@@ -3399,6 +4235,7 @@ package org.apache.calcite.avatica.proto;
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       this();
+      int mutable_bitField0_ = 0;
       try {
         boolean done = false;
         while (!done) {
@@ -3413,6 +4250,12 @@ package org.apache.calcite.avatica.proto;
               }
               break;
             }
+            case 10: {
+              com.google.protobuf.ByteString bs = input.readBytes();
+
+              connectionId_ = bs;
+              break;
+            }
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
@@ -3451,6 +4294,42 @@ package org.apache.calcite.avatica.proto;
       return PARSER;
     }
 
+    public static final int CONNECTION_ID_FIELD_NUMBER = 1;
+    private java.lang.Object connectionId_;
+    /**
+     * <code>optional string connection_id = 1;</code>
+     */
+    public java.lang.String getConnectionId() {
+      java.lang.Object ref = connectionId_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        if (bs.isValidUtf8()) {
+          connectionId_ = s;
+        }
+        return s;
+      }
+    }
+    /**
+     * <code>optional string connection_id = 1;</code>
+     */
+    public com.google.protobuf.ByteString
+        getConnectionIdBytes() {
+      java.lang.Object ref = connectionId_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        connectionId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
     private byte memoizedIsInitialized = -1;
     public final boolean isInitialized() {
       byte isInitialized = memoizedIsInitialized;
@@ -3464,6 +4343,9 @@ package org.apache.calcite.avatica.proto;
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
       getSerializedSize();
+      if (!getConnectionIdBytes().isEmpty()) {
+        output.writeBytes(1, getConnectionIdBytes());
+      }
     }
 
     private int memoizedSerializedSize = -1;
@@ -3472,6 +4354,10 @@ package org.apache.calcite.avatica.proto;
       if (size != -1) return size;
 
       size = 0;
+      if (!getConnectionIdBytes().isEmpty()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(1, getConnectionIdBytes());
+      }
       memoizedSerializedSize = size;
       return size;
     }
@@ -3582,6 +4468,8 @@ package org.apache.calcite.avatica.proto;
       }
       public Builder clear() {
         super.clear();
+        connectionId_ = "";
+
         return this;
       }
 
@@ -3604,6 +4492,7 @@ package org.apache.calcite.avatica.proto;
 
       public org.apache.calcite.avatica.proto.Requests.TypeInfoRequest buildPartial() {
         org.apache.calcite.avatica.proto.Requests.TypeInfoRequest result = new org.apache.calcite.avatica.proto.Requests.TypeInfoRequest(this);
+        result.connectionId_ = connectionId_;
         onBuilt();
         return result;
       }
@@ -3619,6 +4508,10 @@ package org.apache.calcite.avatica.proto;
 
       public Builder mergeFrom(org.apache.calcite.avatica.proto.Requests.TypeInfoRequest other) {
         if (other == org.apache.calcite.avatica.proto.Requests.TypeInfoRequest.getDefaultInstance()) return this;
+        if (!other.getConnectionId().isEmpty()) {
+          connectionId_ = other.connectionId_;
+          onChanged();
+        }
         onChanged();
         return this;
       }
@@ -3644,21 +4537,91 @@ package org.apache.calcite.avatica.proto;
         }
         return this;
       }
-      public final Builder setUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return this;
-      }
 
-      public final Builder mergeUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
+      private java.lang.Object connectionId_ = "";
+      /**
+       * <code>optional string connection_id = 1;</code>
+       */
+      public java.lang.String getConnectionId() {
+        java.lang.Object ref = connectionId_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          if (bs.isValidUtf8()) {
+            connectionId_ = s;
+          }
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>optional string connection_id = 1;</code>
+       */
+      public com.google.protobuf.ByteString
+          getConnectionIdBytes() {
+        java.lang.Object ref = connectionId_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          connectionId_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>optional string connection_id = 1;</code>
+       */
+      public Builder setConnectionId(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        connectionId_ = value;
+        onChanged();
         return this;
       }
-
-
-      // @@protoc_insertion_point(builder_scope:TypeInfoRequest)
-    }
-
-    // @@protoc_insertion_point(class_scope:TypeInfoRequest)
+      /**
+       * <code>optional string connection_id = 1;</code>
+       */
+      public Builder clearConnectionId() {
+        
+        connectionId_ = getDefaultInstance().getConnectionId();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string connection_id = 1;</code>
+       */
+      public Builder setConnectionIdBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        connectionId_ = value;
+        onChanged();
+        return this;
+      }
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return this;
+      }
+
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return this;
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:TypeInfoRequest)
+    }
+
+    // @@protoc_insertion_point(class_scope:TypeInfoRequest)
     private static final org.apache.calcite.avatica.proto.Requests.TypeInfoRequest defaultInstance;static {
       defaultInstance = new org.apache.calcite.avatica.proto.Requests.TypeInfoRequest();
     }
@@ -5751,7 +6714,462 @@ package org.apache.calcite.avatica.proto;
     };
 
     @java.lang.Override
-    public com.google.protobuf.Parser<CreateStatementRequest> getParserForType() {
+    public com.google.protobuf.Parser<CreateStatementRequest> getParserForType() {
+      return PARSER;
+    }
+
+    public static final int CONNECTION_ID_FIELD_NUMBER = 1;
+    private java.lang.Object connectionId_;
+    /**
+     * <code>optional string connection_id = 1;</code>
+     */
+    public java.lang.String getConnectionId() {
+      java.lang.Object ref = connectionId_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        if (bs.isValidUtf8()) {
+          connectionId_ = s;
+        }
+        return s;
+      }
+    }
+    /**
+     * <code>optional string connection_id = 1;</code>
+     */
+    public com.google.protobuf.ByteString
+        getConnectionIdBytes() {
+      java.lang.Object ref = connectionId_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        connectionId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (!getConnectionIdBytes().isEmpty()) {
+        output.writeBytes(1, getConnectionIdBytes());
+      }
+    }
+
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (!getConnectionIdBytes().isEmpty()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(1, getConnectionIdBytes());
+      }
+      memoizedSerializedSize = size;
+      return size;
+    }
+
+    private static final long serialVersionUID = 0L;
+    public static org.apache.calcite.avatica.proto.Requests.CreateStatementRequest parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.calcite.avatica.proto.Requests.CreateStatementRequest parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.calcite.avatica.proto.Requests.CreateStatementRequest parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.calcite.avatica.proto.Requests.CreateStatementRequest parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.calcite.avatica.proto.Requests.CreateStatementRequest parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static org.apache.calcite.avatica.proto.Requests.CreateStatementRequest parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+    public static org.apache.calcite.avatica.proto.Requests.CreateStatementRequest parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input);
+    }
+    public static org.apache.calcite.avatica.proto.Requests.CreateStatementRequest parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    }
+    public static org.apache.calcite.avatica.proto.Requests.CreateStatementRequest parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static org.apache.calcite.avatica.proto.Requests.CreateStatementRequest parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+
+    public static Builder newBuilder() { return new Builder(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(org.apache.calcite.avatica.proto.Requests.CreateStatementRequest prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code CreateStatementRequest}
+     *
+     * <pre>
+     * Request for Meta#createStatement(Meta.ConnectionHandle)
+     * </pre>
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:CreateStatementRequest)
+        org.apache.calcite.avatica.proto.Requests.CreateStatementRequestOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return org.apache.calcite.avatica.proto.Requests.internal_static_CreateStatementRequest_descriptor;
+      }
+
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return org.apache.calcite.avatica.proto.Requests.internal_static_CreateStatementRequest_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                org.apache.calcite.avatica.proto.Requests.CreateStatementRequest.class, org.apache.calcite.avatica.proto.Requests.CreateStatementRequest.Builder.class);
+      }
+
+      // Construct using org.apache.calcite.avatica.proto.Requests.CreateStatementRequest.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+        }
+      }
+      public Builder clear() {
+        super.clear();
+        connectionId_ = "";
+
+        return this;
+      }
+
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return org.apache.calcite.avatica.proto.Requests.internal_static_CreateStatementRequest_descriptor;
+      }
+
+      public org.apache.calcite.avatica.proto.Requests.CreateStatementRequest getDefaultInstanceForType() {
+        return org.apache.calcite.avatica.proto.Requests.CreateStatementRequest.getDefaultInstance();
+      }
+
+      public org.apache.calcite.avatica.proto.Requests.CreateStatementRequest build() {
+        org.apache.calcite.avatica.proto.Requests.CreateStatementRequest result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      public org.apache.calcite.avatica.proto.Requests.CreateStatementRequest buildPartial() {
+        org.apache.calcite.avatica.proto.Requests.CreateStatementRequest result = new org.apache.calcite.avatica.proto.Requests.CreateStatementRequest(this);
+        result.connectionId_ = connectionId_;
+        onBuilt();
+        return result;
+      }
+
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof org.apache.calcite.avatica.proto.Requests.CreateStatementRequest) {
+          return mergeFrom((org.apache.calcite.avatica.proto.Requests.CreateStatementRequest)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(org.apache.calcite.avatica.proto.Requests.CreateStatementRequest other) {
+        if (other == org.apache.calcite.avatica.proto.Requests.CreateStatementRequest.getDefaultInstance()) return this;
+        if (!other.getConnectionId().isEmpty()) {
+          connectionId_ = other.connectionId_;
+          onChanged();
+        }
+        onChanged();
+        return this;
+      }
+
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        org.apache.calcite.avatica.proto.Requests.CreateStatementRequest parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (org.apache.calcite.avatica.proto.Requests.CreateStatementRequest) e.getUnfinishedMessage();
+          throw e;
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+
+      private java.lang.Object connectionId_ = "";
+      /**
+       * <code>optional string connection_id = 1;</code>
+       */
+      public java.lang.String getConnectionId() {
+        java.lang.Object ref = connectionId_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          if (bs.isValidUtf8()) {
+            connectionId_ = s;
+          }
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>optional string connection_id = 1;</code>
+       */
+      public com.google.protobuf.ByteString
+          getConnectionIdBytes() {
+        java.lang.Object ref = connectionId_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          connectionId_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>optional string connection_id = 1;</code>
+       */
+      public Builder setConnectionId(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        connectionId_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string connection_id = 1;</code>
+       */
+      public Builder clearConnectionId() {
+        
+        connectionId_ = getDefaultInstance().getConnectionId();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string connection_id = 1;</code>
+       */
+      public Builder setConnectionIdBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        connectionId_ = value;
+        onChanged();
+        return this;
+      }
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return this;
+      }
+
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return this;
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:CreateStatementRequest)
+    }
+
+    // @@protoc_insertion_point(class_scope:CreateStatementRequest)
+    private static final org.apache.calcite.avatica.proto.Requests.CreateStatementRequest defaultInstance;static {
+      defaultInstance = new org.apache.calcite.avatica.proto.Requests.CreateStatementRequest();
+    }
+
+    public static org.apache.calcite.avatica.proto.Requests.CreateStatementRequest getDefaultInstance() {
+      return defaultInstance;
+    }
+
+    public org.apache.calcite.avatica.proto.Requests.CreateStatementRequest getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+
+  }
+
+  public interface CloseStatementRequestOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:CloseStatementRequest)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>optional string connection_id = 1;</code>
+     */
+    java.lang.String getConnectionId();
+    /**
+     * <code>optional string connection_id = 1;</code>
+     */
+    com.google.protobuf.ByteString
+        getConnectionIdBytes();
+
+    /**
+     * <code>optional uint32 statement_id = 2;</code>
+     */
+    int getStatementId();
+  }
+  /**
+   * Protobuf type {@code CloseStatementRequest}
+   *
+   * <pre>
+   * Request for Meta#closeStatement(Meta.StatementHandle)
+   * </pre>
+   */
+  public  static final class CloseStatementRequest extends
+      com.google.protobuf.GeneratedMessage implements
+      // @@protoc_insertion_point(message_implements:CloseStatementRequest)
+      CloseStatementRequestOrBuilder {
+    // Use CloseStatementRequest.newBuilder() to construct.
+    private CloseStatementRequest(com.google.protobuf.GeneratedMessage.Builder builder) {
+      super(builder);
+    }
+    private CloseStatementRequest() {
+      connectionId_ = "";
+      statementId_ = 0;
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return com.google.protobuf.UnknownFieldSet.getDefaultInstance();
+    }
+    private CloseStatementRequest(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      int mutable_bitField0_ = 0;
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            default: {
+              if (!input.skipField(tag)) {
+                done = true;
+              }
+              break;
+            }
+            case 10: {
+              com.google.protobuf.ByteString bs = input.readBytes();
+
+              connectionId_ = bs;
+              break;
+            }
+            case 16: {
+
+              statementId_ = input.readUInt32();
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e.getMessage()).setUnfinishedMessage(this);
+      } finally {
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return org.apache.calcite.avatica.proto.Requests.internal_static_CloseStatementRequest_descriptor;
+    }
+
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return org.apache.calcite.avatica.proto.Requests.internal_static_CloseStatementRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              org.apache.calcite.avatica.proto.Requests.CloseStatementRequest.class, org.apache.calcite.avatica.proto.Requests.CloseStatementRequest.Builder.class);
+    }
+
+    public static final com.google.protobuf.Parser<CloseStatementRequest> PARSER =
+        new com.google.protobuf.AbstractParser<CloseStatementRequest>() {
+      public CloseStatementRequest parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new CloseStatementRequest(input, extensionRegistry);
+      }
+    };
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<CloseStatementRequest> getParserForType() {
       return PARSER;
     }
 
@@ -5791,6 +7209,15 @@ package org.apache.calcite.avatica.proto;
       }
     }
 
+    public static final int STATEMENT_ID_FIELD_NUMBER = 2;
+    private int statementId_;
+    /**
+     * <code>optional uint32 statement_id = 2;</code>
+     */
+    public int getStatementId() {
+      return statementId_;
+    }
+
     private byte memoizedIsInitialized = -1;
     public final boolean isInitialized() {
       byte isInitialized = memoizedIsInitialized;
@@ -5807,6 +7234,9 @@ package org.apache.calcite.avatica.proto;
       if (!getConnectionIdBytes().isEmpty()) {
         output.writeBytes(1, getConnectionIdBytes());
       }
+      if (statementId_ != 0) {
+        output.writeUInt32(2, statementId_);
+      }
     }
 
     private int memoizedSerializedSize = -1;
@@ -5819,58 +7249,62 @@ package org.apache.calcite.avatica.proto;
         size += com.google.protobuf.CodedOutputStream
           .computeBytesSize(1, getConnectionIdBytes());
       }
+      if (statementId_ != 0) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeUInt32Size(2, statementId_);
+      }
       memoizedSerializedSize = size;
       return size;
     }
 
     private static final long serialVersionUID = 0L;
-    public static org.apache.calcite.avatica.proto.Requests.CreateStatementRequest parseFrom(
+    public static org.apache.calcite.avatica.proto.Requests.CloseStatementRequest parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static org.apache.calcite.avatica.proto.Requests.CreateStatementRequest parseFrom(
+    public static org.apache.calcite.avatica.proto.Requests.CloseStatementRequest parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static org.apache.calcite.avatica.proto.Requests.CreateStatementRequest parseFrom(byte[] data)
+    public static org.apache.calcite.avatica.proto.Requests.CloseStatementRequest parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static org.apache.calcite.avatica.proto.Requests.CreateStatementRequest parseFrom(
+    public static org.apache.calcite.avatica.proto.Requests.CloseStatementRequest parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static org.apache.calcite.avatica.proto.Requests.CreateStatementRequest parseFrom(java.io.InputStream input)
+    public static org.apache.calcite.avatica.proto.Requests.CloseStatementRequest parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return PARSER.parseFrom(input);
     }
-    public static org.apache.calcite.avatica.proto.Requests.CreateStatementRequest parseFrom(
+    public static org.apache.calcite.avatica.proto.Requests.CloseStatementRequest parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return PARSER.parseFrom(input, extensionRegistry);
     }
-    public static org.apache.calcite.avatica.proto.Requests.CreateStatementRequest parseDelimitedFrom(java.io.InputStream input)
+    public static org.apache.calcite.avatica.proto.Requests.CloseStatementRequest parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return PARSER.parseDelimitedFrom(input);
     }
-    public static org.apache.calcite.avatica.proto.Requests.CreateStatementRequest parseDelimitedFrom(
+    public static org.apache.calcite.avatica.proto.Requests.CloseStatementRequest parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return PARSER.parseDelimitedFrom(input, extensionRegistry);
     }
-    public static org.apache.calcite.avatica.proto.Requests.CreateStatementRequest parseFrom(
+    public static org.apache.calcite.avatica.proto.Requests.CloseStatementRequest parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return PARSER.parseFrom(input);
     }
-    public static org.apache.calcite.avatica.proto.Requests.CreateStatementRequest parseFrom(
+    public static org.apache.calcite.avatica.proto.Requests.CloseStatementRequest parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -5879,7 +7313,7 @@ package org.apache.calcite.avatica.proto;
 
     public static Builder newBuilder() { return new Builder(); }
     public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder(org.apache.calcite.avatica.proto.Requests.CreateStatementRequest prototype) {
+    public static Builder newBuilder(org.apache.calcite.avatica.proto.Requests.CloseStatementRequest prototype) {
       return newBuilder().mergeFrom(prototype);
     }
     public Builder toBuilder() { return newBuilder(this); }
@@ -5891,29 +7325,29 @@ package org.apache.calcite.avatica.proto;
       return builder;
     }
     /**
-     * Protobuf type {@code CreateStatementRequest}
+     * Protobuf type {@code CloseStatementRequest}
      *
      * <pre>
-     * Request for Meta#createStatement(Meta.ConnectionHandle)
+     * Request for Meta#closeStatement(Meta.StatementHandle)
      * </pre>
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:CreateStatementRequest)
-        org.apache.calcite.avatica.proto.Requests.CreateStatementRequestOrBuilder {
+        // @@protoc_insertion_point(builder_implements:CloseStatementRequest)
+        org.apache.calcite.avatica.proto.Requests.CloseStatementRequestOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return org.apache.calcite.avatica.proto.Requests.internal_static_CreateStatementRequest_descriptor;
+        return org.apache.calcite.avatica.proto.Requests.internal_static_CloseStatementRequest_descriptor;
       }
 
       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return org.apache.calcite.avatica.proto.Requests.internal_static_CreateStatementRequest_fieldAccessorTable
+        return org.apache.calcite.avatica.proto.Requests.internal_static_CloseStatementRequest_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                org.apache.calcite.avatica.proto.Requests.CreateStatementRequest.class, org.apache.calcite.avatica.proto.Requests.CreateStatementRequest.Builder.class);
+                org.apache.calcite.avatica.proto.Requests.CloseStatementRequest.class, org.apache.calcite.avatica.proto.Requests.CloseStatementRequest.Builder.class);
       }
 
-      // Construct using org.apache.calcite.avatica.proto.Requests.CreateStatementRequest.newBuilder()
+      // Construct using org.apache.calcite.avatica.proto.Requests.CloseStatementRequest.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -5931,48 +7365,54 @@ package org.apache.calcite.avatica.proto;
         super.clear();
         connectionId_ = "";
 
+        statementId_ = 0;
+
         return this;
       }
 
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return org.apache.calcite.avatica.proto.Requests.internal_static_CreateStatementRequest_descriptor;
+        return org.apache.calcite.avatica.proto.Requests.internal_static_CloseStatementRequest_descriptor;
       }
 
-      public org.apache.calcite.avatica.proto.Requests.CreateStatementRequest getDefaultInstanceForType() {
-        return org.apache.calcite.avatica.proto.Requests.CreateStatementRequest.getDefaultInstance();
+      public org.apache.calcite.avatica.proto.Requests.CloseStatementRequest getDefaultInstanceForType() {
+        return org.apache.calcite.avatica.proto.Requests.CloseStatementRequest.getDefaultInstance();
       }
 
-      public org.apache.calcite.avatica.proto.Requests.CreateStatementRequest build() {
-        org.apache.calcite.avatica.proto.Requests.CreateStatementRequest result = buildPartial();
+      public org.apache.calcite.avatica.proto.Requests.CloseStatementRequest build() {
+        org.apache.calcite.avatica.proto.Requests.CloseStatementRequest result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
         return result;
       }
 
-      public org.apache.calcite.avatica.proto.Requests.CreateStatementRequest buildPartial() {
-        org.apache.calcite.avatica.proto.Requests.CreateStatementRequest result = new org.apache.calcite.avatica.proto.Requests.CreateStatementRequest(this);
+      public org.apache.calcite.avatica.proto.Requests.CloseStatementRequest buildPartial() {
+        org.apache.calcite.avatica.proto.Requests.CloseStatementRequest result = new org.apache.calcite.avatica.proto.Requests.CloseStatementRequest(this);
         result.connectionId_ = connectionId_;
+        result.statementId_ = statementId_;
         onBuilt();
         return result;
       }
 
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof org.apache.calcite.avatica.proto.Requests.CreateStatementRequest) {
-          return mergeFrom((org.apache.calcite.avatica.proto.Requests.CreateStatementRequest)other);
+        if (other instanceof org.apache.calcite.avatica.proto.Requests.CloseStatementRequest) {
+          return mergeFrom((org.apache.calcite.avatica.proto.Requests.CloseStatementRequest)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(org.apache.calcite.avatica.proto.Requests.CreateStatementRequest other) {
-        if (other == org.apache.calcite.avatica.proto.Requests.CreateStatementRequest.getDefaultInstance()) return this;
+      public Builder mergeFrom(org.apache.calcite.avatica.proto.Requests.CloseStatementRequest other) {
+        if (other == org.apache.calcite.avatica.proto.Requests.CloseStatementRequest.getDefaultInstance()) return this;
         if (!other.getConnectionId().isEmpty()) {
           connectionId_ = other.connectionId_;
           onChanged();
         }
+        if (other.getStatementId() != 0) {
+          setStatementId(other.getStatementId());
+        }
         onChanged();
         return this;
       }
@@ -5985,11 +7425,11 @@ package org.apache.calcite.avatica.proto;
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        org.apache.calcite.avatica.proto.Requests.CreateStatementRequest parsedMessage = null;
+        org.apache.calcite.avatica.proto.Requests.CloseStatementRequest parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (org.apache.calcite.avatica.proto.Requests.CreateStatementRequest) e.getUnfinishedMessage();
+          parsedMessage = (org.apache.calcite.avatica.proto.Requests.CloseStatementRequest) e.getUnfinishedMessage();
           throw e;
         } finally {
           if (parsedMessage != null) {
@@ -6068,6 +7508,32 @@ package org.apache.calcite.avatica.proto;
         onChanged();
         return this;
       }
+
+      private int statementId_ ;
+      /**
+       * <code>optional uint32 statement_id = 2;</code>
+       */
+      public int getStatementId() {
+        return statementId_;
+      }
+      /**
+       * <code>optional uint32 statement_id = 2;</code>
+       */
+      public Builder setStatementId(int value) {
+        
+        statementId_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional uint32 statement_id = 2;</code>
+       */
+      public Builder clearStatementId() {
+        
+        statementId_ = 0;
+        onChanged();
+        return this;
+      }
       public final Builder setUnknownFields(
           final com.google.protobuf.UnknownFieldSet unknownFields) {
         return this;
@@ -6079,26 +7545,26 @@ package org.apache.calcite.avatica.proto;
       }
 
 
-      // @@protoc_insertion_point(builder_scope:CreateStatementRequest)
+      // @@protoc_insertion_point(builder_scope:CloseStatementRequest)
     }
 
-    // @@protoc_insertion_point(class_scope:CreateStatementRequest)
-    private static final org.apache.calcite.avatica.proto.Requests.CreateStatementRequest defaultInstance;static {
-      defaultInstance = new org.apache.calcite.avatica.proto.Requests.CreateStatementRequest();
+    // @@protoc_insertion_point(class_scope:CloseStatementRequest)
+    private static final org.apache.calcite.avatica.proto.Requests.CloseStatementRequest defaultInstance;static {
+      defaultInstance = new org.apache.calcite.avatica.proto.Requests.CloseStatementRequest();
     }
 
-    public static org.apache.calcite.avatica.proto.Requests.CreateStatementRequest getDefaultInstance() {
+    public static org.apache.calcite.avatica.proto.Requests.CloseStatementRequest getDefaultInstance() {
       return defaultInstance;
     }
 
-    public org.apache.calcite.avatica.proto.Requests.CreateStatementRequest getDefaultInstanceForType() {
+    public org.apache.calcite.avatica.proto.Requests.CloseStatementRequest getDefaultInstanceForType() {
       return defaultInstance;
     }
 
   }
 
-  public interface CloseStatementRequestOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:CloseStatementRequest)
+  public interface OpenConnectionRequestOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:OpenConnectionRequest)
       com.google.protobuf.MessageOrBuilder {
 
     /**
@@ -6112,28 +7578,28 @@ package org.apache.calcite.avatica.proto;
         getConnectionIdBytes();
 
     /**
-     * <code>optional uint32 statement_id = 2;</code>
+     * <code>map&lt;string, string&gt; info = 2;</code>
      */
-    int getStatementId();
+    java.util.Map<java.lang.String, java.lang.String>
+    getInfo();
   }
   /**
-   * Protobuf type {@code CloseStatementRequest}
+   * Protobuf type {@code OpenConnectionRequest}
    *
    * <pre>
-   * Request for Meta#closeStatement(Meta.StatementHandle)
+   * Request for Meta#openConnection(Meta.ConnectionHandle, Map&lt;String, String&gt;)
    * </pre>
    */
-  public  static final class CloseStatementRequest extends
+  public  static final class OpenConnectionRequest extends
       com.google.protobuf.GeneratedMessage implements
-      // @@protoc_insertion_point(message_implements:CloseStatementRequest)
-      CloseStatementRequestOrBuilder {
-    // Use CloseStatementRequest.newBuilder() to construct.
-    private CloseStatementRequest(com.google.protobuf.GeneratedMessage.Builder builder) {
+      // @@protoc_insertion_point(message_implements:OpenConnectionRequest)
+      OpenConnectionRequestOrBuilder {
+    // Use OpenConnectionRequest.newBuilder() to construct.
+    private OpenConnectionRequest(com.google.protobuf.GeneratedMessage.Builder builder) {
       super(builder);
     }
-    private CloseStatementRequest() {
+    private OpenConnectionRequest() {
       connectionId_ = "";
-      statementId_ = 0;
     }
 
     @java.lang.Override
@@ -6141,7 +7607,7 @@ package org.apache.calcite.avatica.proto;
     getUnknownFields() {
       return com.google.protobuf.UnknownFieldSet.getDefaultInstance();
     }
-    private CloseStatementRequest(
+    private OpenConnectionRequest(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -6167,9 +7633,16 @@ package org.apache.calcite.avatica.proto;
               connectionId_ = bs;
               break;
             }
-            case 16: {
-
-              statementId_ = input.readUInt32();
+            case 18: {
+              if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
+                info_ = com.google.protobuf.MapField.newMapField(
+                    infoDefaultEntry);
+                mutable_bitField0_ |= 0x00000002;
+              }
+              com.google.protobuf.MapEntry<java.lang.String, java.lang.String>
+              info = input.readMessage(
+                  infoDefaultEntry.getParserForType(), extensionRegistry);
+              info_.getMutableMap().put(info.getKey(), info.getValue());
               break;
             }
           }
@@ -6185,31 +7658,43 @@ package org.apache.calcite.avatica.proto;
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return org.apache.calcite.avatica.proto.Requests.internal_static_CloseStatementRequest_descriptor;
+      return org.apache.calcite.avatica.proto.Requests.internal_static_OpenConnectionRequest_descriptor;
     }
 
+    @SuppressWarnings({"rawtypes"})
+    protected com.google.protobuf.MapField internalGetMapField(
+        int number) {
+      switch (number) {
+        case 2:
+          return info_;
+        default:
+          throw new RuntimeException(
+              "Invalid map field number: " + number);
+      }
+    }
     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return org.apache.calcite.avatica.proto.Requests.internal_static_CloseStatementRequest_fieldAccessorTable
+      return org.apache.calcite.avatica.proto.Requests.internal_static_OpenConnectionRequest_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              org.apache.calcite.avatica.proto.Requests.CloseStatementRequest.class, org.apache.calcite.avatica.proto.Requests.CloseStatementRequest.Builder.class);
+              org.apache.calcite.avatica.proto.Requests.OpenConnectionRequest.class, org.apache.calcite.avatica.proto.Requests.OpenConnectionRequest.Builder.class);
     }
 
-    public static final com.google.protobuf.Parser<CloseStatementRequest> PARSER =
-        new com.google.protobuf.AbstractParser<CloseStatementRequest>() {
-      public CloseStatementRequest parsePartialFrom(
+    public static final com.google.protobuf.Parser<OpenConnectionRequest> PARSER =
+        new com.google.protobuf.AbstractParser<OpenConnectionRequest>() {
+      public OpenConnectionRequest parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new CloseStatementRequest(input, extensionRegistry);
+        return new OpenConnectionRequest(input, extensionRegistry);
       }
     };
 
     @java.lang.Override
-    public com.google.protobuf.Parser<CloseStatementRequest> getParserForType() {
+    public c

<TRUNCATED>


[06/11] incubator-calcite git commit: [CALCITE-645] Implement AvaticaSqlException to pass server-side exception information to clients (Josh Elser)

Posted by jh...@apache.org.
[CALCITE-645] Implement AvaticaSqlException to pass server-side exception information to clients (Josh Elser)

Created ErrorResponse to serve as the message to pass between client and server.
Attempted to introduce information necessary to fill out SQLException. Some refactoring
of the server Handlers was included to unify exception handling.


Project: http://git-wip-us.apache.org/repos/asf/incubator-calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-calcite/commit/5be93fb4
Tree: http://git-wip-us.apache.org/repos/asf/incubator-calcite/tree/5be93fb4
Diff: http://git-wip-us.apache.org/repos/asf/incubator-calcite/diff/5be93fb4

Branch: refs/heads/master
Commit: 5be93fb40e7b41fdeeef57e622118427a90cc037
Parents: a63639b
Author: Josh Elser <el...@apache.org>
Authored: Tue Oct 6 18:15:32 2015 -0400
Committer: Julian Hyde <jh...@apache.org>
Committed: Thu Oct 22 18:28:33 2015 -0700

----------------------------------------------------------------------
 .../apache/calcite/avatica/jdbc/JdbcMeta.java   |   4 +-
 .../calcite/avatica/server/AvaticaHandler.java  |  35 +-
 .../avatica/server/AvaticaProtobufHandler.java  |  20 +-
 .../calcite/avatica/remote/RemoteMetaTest.java  |  41 +-
 .../avatica/AvaticaClientRuntimeException.java  |  86 +++
 .../apache/calcite/avatica/AvaticaSeverity.java |  90 +++
 .../calcite/avatica/AvaticaSqlException.java    |  59 ++
 .../calcite/avatica/AvaticaStatement.java       |   8 +-
 .../java/org/apache/calcite/avatica/Helper.java |  11 +
 .../java/org/apache/calcite/avatica/Meta.java   |   1 +
 .../apache/calcite/avatica/proto/Common.java    | 121 ++-
 .../apache/calcite/avatica/proto/Responses.java | 735 +++++++++++++++++--
 .../calcite/avatica/remote/AbstractHandler.java | 142 ++++
 .../avatica/remote/AvaticaRuntimeException.java | 102 +++
 .../apache/calcite/avatica/remote/Driver.java   |  14 +-
 .../apache/calcite/avatica/remote/Handler.java  |  28 +-
 .../calcite/avatica/remote/JsonHandler.java     |  28 +-
 .../calcite/avatica/remote/JsonService.java     |  11 +-
 .../calcite/avatica/remote/LocalService.java    |  57 +-
 .../calcite/avatica/remote/MockJsonService.java |  38 +-
 .../avatica/remote/MockProtobufService.java     |  42 +-
 .../calcite/avatica/remote/ProtobufHandler.java |  37 +-
 .../calcite/avatica/remote/ProtobufService.java |   3 +-
 .../avatica/remote/RemoteProtobufService.java   |  30 +-
 .../calcite/avatica/remote/RemoteService.java   |  17 +-
 .../apache/calcite/avatica/remote/Service.java  | 170 +++--
 avatica/src/main/protobuf/common.proto          |   9 +
 avatica/src/main/protobuf/responses.proto       |   7 +-
 .../avatica/remote/AbstractHandlerTest.java     | 165 +++++
 .../avatica/remote/ErrorResponseTest.java       |  63 ++
 .../avatica/remote/ProtobufHandlerTest.java     |   5 +-
 .../remote/ProtobufTranslationImplTest.java     |   9 +-
 .../test/AvaticaClientRuntimeExceptionTest.java |  50 ++
 .../avatica/test/AvaticaSeverityTest.java       |  39 +
 .../avatica/test/AvaticaSqlExceptionTest.java   |  49 ++
 .../calcite/test/ExceptionMessageTest.java      |   4 +-
 36 files changed, 2023 insertions(+), 307 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java
----------------------------------------------------------------------
diff --git a/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java b/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java
index 4054939..3f00dcb 100644
--- a/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java
+++ b/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java
@@ -533,8 +533,8 @@ public class JdbcMeta implements Meta {
     }
   }
 
-  @Override
-  public void openConnection(ConnectionHandle ch, Map<String, String> info) {
+  @Override public void openConnection(ConnectionHandle ch,
+      Map<String, String> info) {
     Properties fullInfo = new Properties();
     fullInfo.putAll(this.info);
     if (info != null) {

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaHandler.java
----------------------------------------------------------------------
diff --git a/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaHandler.java b/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaHandler.java
index acb7fcf..f7c4800 100644
--- a/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaHandler.java
+++ b/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaHandler.java
@@ -17,17 +17,13 @@
 package org.apache.calcite.avatica.server;
 
 import org.apache.calcite.avatica.AvaticaUtils;
+import org.apache.calcite.avatica.remote.Handler.HandlerResponse;
 import org.apache.calcite.avatica.remote.JsonHandler;
 import org.apache.calcite.avatica.remote.Service;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Joiner;
-import com.google.common.base.Throwables;
-import com.google.common.collect.Iterables;
-
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.handler.AbstractHandler;
 
@@ -68,36 +64,17 @@ public class AvaticaHandler extends AbstractHandler {
       if (LOG.isTraceEnabled()) {
         LOG.trace("request: " + jsonRequest);
       }
-      String jsonResponse;
-      try {
-        jsonResponse = jsonHandler.apply(jsonRequest);
-      } catch (Throwable t) {
-        LOG.error("Error handling request: " + jsonRequest, t);
-        response.setStatus(500);
-        jsonResponse = createErrorResponse(t);
-      }
+
+      final HandlerResponse<String> jsonResponse = jsonHandler.apply(jsonRequest);
       if (LOG.isTraceEnabled()) {
         LOG.trace("response: " + jsonResponse);
       }
       baseRequest.setHandled(true);
-      response.getWriter().println(jsonResponse);
+      // Set the status code and write out the response.
+      response.setStatus(jsonResponse.getStatusCode());
+      response.getWriter().println(jsonResponse.getResponse());
     }
   }
-
-  private String createErrorResponse(Throwable t) throws IOException {
-    return jsonHandler.encode(new Service.ErrorResponse(getErrorMessage(t)));
-  }
-
-  public static String getErrorMessage(Throwable t) {
-    return Joiner.on(" -> ").join(
-        Iterables.transform(Throwables.getCausalChain(t), new Function<Throwable, String>() {
-          @Override
-          public String apply(Throwable input) {
-            return input.getMessage() == null
-                ? "(null exception message)" : input.getMessage();
-          }
-        }));
-  }
 }
 
 // End AvaticaHandler.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaProtobufHandler.java
----------------------------------------------------------------------
diff --git a/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaProtobufHandler.java b/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaProtobufHandler.java
index 9432824..9dc6df0 100644
--- a/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaProtobufHandler.java
+++ b/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaProtobufHandler.java
@@ -17,6 +17,7 @@
 package org.apache.calcite.avatica.server;
 
 import org.apache.calcite.avatica.AvaticaUtils;
+import org.apache.calcite.avatica.remote.Handler.HandlerResponse;
 import org.apache.calcite.avatica.remote.ProtobufHandler;
 import org.apache.calcite.avatica.remote.ProtobufTranslation;
 import org.apache.calcite.avatica.remote.ProtobufTranslationImpl;
@@ -59,26 +60,13 @@ public class AvaticaProtobufHandler extends AbstractHandler {
         requestBytes = AvaticaUtils.readFullyToBytes(inputStream);
       }
 
-      byte[] responseBytes;
-      try {
-        responseBytes = pbHandler.apply(requestBytes);
-      } catch (Throwable t) {
-        LOG.error("Error handling request", t);
-        response.setStatus(500);
-        responseBytes = createErrorResponse(t);
-      }
+      HandlerResponse<byte[]> handlerResponse = pbHandler.apply(requestBytes);
 
       baseRequest.setHandled(true);
-      response.getOutputStream().write(responseBytes);
+      response.setStatus(handlerResponse.getStatusCode());
+      response.getOutputStream().write(handlerResponse.getResponse());
     }
   }
-
-  private byte[] createErrorResponse(Throwable t) throws IOException {
-    Service.ErrorResponse errorResponse = new Service.ErrorResponse(
-        AvaticaHandler.getErrorMessage(t));
-    return protobufTranslation.serializeResponse(errorResponse);
-  }
-
 }
 
 // End AvaticaProtobufHandler.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica-server/src/test/java/org/apache/calcite/avatica/remote/RemoteMetaTest.java
----------------------------------------------------------------------
diff --git a/avatica-server/src/test/java/org/apache/calcite/avatica/remote/RemoteMetaTest.java b/avatica-server/src/test/java/org/apache/calcite/avatica/remote/RemoteMetaTest.java
index df5983a..5e14427 100644
--- a/avatica-server/src/test/java/org/apache/calcite/avatica/remote/RemoteMetaTest.java
+++ b/avatica-server/src/test/java/org/apache/calcite/avatica/remote/RemoteMetaTest.java
@@ -17,11 +17,13 @@
 package org.apache.calcite.avatica.remote;
 
 import org.apache.calcite.avatica.AvaticaConnection;
+import org.apache.calcite.avatica.AvaticaSqlException;
 import org.apache.calcite.avatica.AvaticaStatement;
 import org.apache.calcite.avatica.ConnectionPropertiesImpl;
 import org.apache.calcite.avatica.ConnectionSpec;
 import org.apache.calcite.avatica.Meta;
 import org.apache.calcite.avatica.jdbc.JdbcMeta;
+import org.apache.calcite.avatica.remote.Service.ErrorResponse;
 import org.apache.calcite.avatica.server.AvaticaHandler;
 import org.apache.calcite.avatica.server.AvaticaProtobufHandler;
 import org.apache.calcite.avatica.server.HttpServer;
@@ -305,8 +307,8 @@ public class RemoteMetaTest {
       DriverManager.getConnection(url, "john", "doe");
       fail("expected exception");
     } catch (RuntimeException e) {
-      assertEquals("Remote driver error:"
-          + " java.sql.SQLInvalidAuthorizationSpecException: invalid authorization specification"
+      assertEquals("Remote driver error: "
+          + "java.sql.SQLInvalidAuthorizationSpecException: invalid authorization specification"
           + " - not found: john"
           + " -> invalid authorization specification - not found: john"
           + " -> invalid authorization specification - not found: john",
@@ -330,9 +332,9 @@ public class RemoteMetaTest {
       stmt2.executeQuery("select * from buffer");
       fail("expected exception");
     } catch (Exception e) {
-      assertEquals("Remote driver error: java.sql.SQLSyntaxErrorException: user lacks privilege"
-          + " or object not found: BUFFER -> user lacks privilege or object not found: BUFFER"
-          + " -> user lacks privilege or object not found: BUFFER", e.getCause().getMessage());
+      assertEquals("Error -1 (00000) : Error while executing SQL \"select * from buffer\": "
+          + "Remote driver error: user lacks privilege or object not found: BUFFER",
+          e.getMessage());
     }
   }
 
@@ -347,8 +349,33 @@ public class RemoteMetaTest {
       conn.createStatement();
       fail("expected exception");
     } catch (RuntimeException e) {
-      assertThat(e.getMessage(), containsString("Remote driver error:"
-          + " Connection not found: invalid id, closed, or expired"));
+      assertThat(e.getMessage(),
+          containsString("Connection not found: invalid id, closed, or expired"));
+    }
+  }
+
+  @Test public void testExceptionPropagation() throws Exception {
+    final String sql = "SELECT * from EMP LIMIT FOOBARBAZ";
+    ConnectionSpec.getDatabaseLock().lock();
+    try (final AvaticaConnection conn = (AvaticaConnection) DriverManager.getConnection(url);
+        final Statement stmt = conn.createStatement()) {
+      try {
+        // invalid SQL
+        stmt.execute(sql);
+        fail("Expected an AvaticaSqlException");
+      } catch (AvaticaSqlException e) {
+        assertEquals(ErrorResponse.UNKNOWN_ERROR_CODE, e.getErrorCode());
+        assertEquals(ErrorResponse.UNKNOWN_SQL_STATE, e.getSQLState());
+        assertTrue("Message should contain original SQL, was '" + e.getMessage() + "'",
+            e.getMessage().contains(sql));
+        assertEquals(1, e.getStackTraces().size());
+        final String stacktrace = e.getStackTraces().get(0);
+        final String substring = "unexpected token: FOOBARBAZ";
+        assertTrue("Message should contain '" + substring + "', was '" + e.getMessage() + ",",
+            stacktrace.contains(substring));
+      }
+    } finally {
+      ConnectionSpec.getDatabaseLock().unlock();
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/main/java/org/apache/calcite/avatica/AvaticaClientRuntimeException.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaClientRuntimeException.java b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaClientRuntimeException.java
new file mode 100644
index 0000000..6859763
--- /dev/null
+++ b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaClientRuntimeException.java
@@ -0,0 +1,86 @@
+/*
+ * 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.AvaticaRuntimeException;
+import org.apache.calcite.avatica.remote.Service.ErrorResponse;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * The client-side representation of {@link AvaticaRuntimeException}. This exception is not intended
+ * for consumption by clients, {@link AvaticaSqlException} serves that purpose. This exception only
+ * exists to pass the original error attributes to a higher level of execution without modifying
+ * existing exception-handling logic.
+ */
+public class AvaticaClientRuntimeException extends RuntimeException {
+
+  private static final long serialVersionUID = 1L;
+
+  private final int errorCode;
+  private final String sqlState;
+  private final AvaticaSeverity severity;
+  private final List<String> serverExceptions;
+
+  public AvaticaClientRuntimeException(String errorMessage, int errorCode, String sqlState,
+      AvaticaSeverity severity, List<String> serverExceptions) {
+    super(errorMessage);
+    this.errorCode = errorCode;
+    this.sqlState = sqlState;
+    this.severity = severity;
+    this.serverExceptions = serverExceptions;
+  }
+
+  public AvaticaClientRuntimeException(String message, Throwable cause) {
+    super(message, cause);
+    errorCode = ErrorResponse.UNKNOWN_ERROR_CODE;
+    sqlState = ErrorResponse.UNKNOWN_SQL_STATE;
+    severity = AvaticaSeverity.UNKNOWN;
+    serverExceptions = Collections.singletonList("");
+  }
+
+  public int getErrorCode() {
+    return errorCode;
+  }
+
+  public String getSqlState() {
+    return sqlState;
+  }
+
+  public AvaticaSeverity getSeverity() {
+    return severity;
+  }
+
+  public List<String> getServerExceptions() {
+    return serverExceptions;
+  }
+
+  @Override public String toString() {
+    StringBuilder sb = new StringBuilder(64);
+    sb.append(getClass().getSimpleName()).append(": ")
+    .append(getMessage()).append(". Error ").append(getErrorCode())
+    .append(" (").append(sqlState).append(") ").append(getSeverity()).append("\n\n");
+    for (String serverException : getServerExceptions()) {
+      sb.append(serverException).append("\n");
+    }
+    return sb.toString();
+  }
+
+}
+
+// End AvaticaClientRuntimeException.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/main/java/org/apache/calcite/avatica/AvaticaSeverity.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaSeverity.java b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaSeverity.java
new file mode 100644
index 0000000..675c8af
--- /dev/null
+++ b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaSeverity.java
@@ -0,0 +1,90 @@
+/*
+ * 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 java.util.Objects;
+
+/**
+ * An enumeration that denotes the severity of a given unexpected state.
+ */
+public enum AvaticaSeverity {
+  /**
+   * The severity of the outcome of some unexpected state is unknown.
+   */
+  UNKNOWN(0),
+
+  /**
+   * The system has been left in an unrecoverable state as a result of an operation.
+   */
+  FATAL(1),
+
+  /**
+   * The result of an action resulted in an error which the current operation cannot recover
+   * from. Clients can attempt to execute the operation again.
+   */
+  ERROR(2),
+
+  /**
+   * The operation completed successfully but a message was generated to warn the client about
+   * some unexpected state or action.
+   */
+  WARNING(3);
+
+  private final int value;
+
+  AvaticaSeverity(int value) {
+    this.value = value;
+  }
+
+  public int getValue() {
+    return value;
+  }
+
+  public Common.Severity toProto() {
+    switch (this) {
+    case UNKNOWN:
+      return Common.Severity.UNKNOWN_SEVERITY;
+    case FATAL:
+      return Common.Severity.FATAL_SEVERITY;
+    case ERROR:
+      return Common.Severity.ERROR_SEVERITY;
+    case WARNING:
+      return Common.Severity.WARNING_SEVERITY;
+    default:
+      throw new RuntimeException("Unhandled Severity level: " + this);
+    }
+  }
+
+  public static AvaticaSeverity fromProto(Common.Severity proto) {
+    switch (Objects.requireNonNull(proto)) {
+    case UNKNOWN_SEVERITY:
+      return AvaticaSeverity.UNKNOWN;
+    case FATAL_SEVERITY:
+      return AvaticaSeverity.FATAL;
+    case ERROR_SEVERITY:
+      return AvaticaSeverity.ERROR;
+    case WARNING_SEVERITY:
+      return AvaticaSeverity.WARNING;
+    default:
+      throw new RuntimeException("Unhandled protobuf Severity level: " + proto);
+    }
+  }
+}
+
+// End AvaticaSeverity.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/main/java/org/apache/calcite/avatica/AvaticaSqlException.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaSqlException.java b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaSqlException.java
new file mode 100644
index 0000000..9782581
--- /dev/null
+++ b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaSqlException.java
@@ -0,0 +1,59 @@
+/*
+ * 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 java.sql.SQLException;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * A client-facing {@link SQLException} which encapsulates errors from the remote Avatica server.
+ */
+public class AvaticaSqlException extends SQLException {
+
+  private static final long serialVersionUID = 1L;
+
+  private final String errorMessage;
+  private final List<String> stackTraces;
+
+  /**
+   * Construct the Exception with information from the server.
+   *
+   * @param errorMessage A human-readable error message.
+   * @param errorCode An integer corresponding to a known error.
+   * @param stackTraces Server-side stacktrace.
+   */
+  public AvaticaSqlException(String errorMessage, String sqlState, int errorCode,
+      List<String> stackTraces) {
+    super("Error " + errorCode + " (" + sqlState + ") : " + errorMessage, sqlState, errorCode);
+    this.errorMessage = errorMessage;
+    this.stackTraces = Objects.requireNonNull(stackTraces);
+  }
+
+  public String getErrorMessage() {
+    return errorMessage;
+  }
+
+  /**
+   * @return The stacktraces for exceptions thrown on the Avatica server.
+   */
+  public List<String> getStackTraces() {
+    return stackTraces;
+  }
+}
+
+// End AvaticaSqlException.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/main/java/org/apache/calcite/avatica/AvaticaStatement.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaStatement.java b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaStatement.java
index 1b338c3..6bcf8eb 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaStatement.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaStatement.java
@@ -133,8 +133,8 @@ public abstract class AvaticaStatement
       Meta.ExecuteResult x =
           connection.prepareAndExecuteInternal(this, sql, maxRowCount1);
     } catch (RuntimeException e) {
-      throw connection.helper.createException(
-          "error while executing SQL \"" + sql + "\": " + e.getMessage(), e);
+      throw connection.helper.createException("Error while executing SQL \"" + sql + "\": "
+          + e.getMessage(), e);
     }
   }
 
@@ -158,8 +158,8 @@ public abstract class AvaticaStatement
       }
       return openResultSet;
     } catch (RuntimeException e) {
-      throw connection.helper.createException(
-        "error while executing SQL \"" + sql + "\": " + e.getMessage(), e);
+      throw connection.helper.createException("Error while executing SQL \"" + sql + "\": "
+          + e.getMessage(), e);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/main/java/org/apache/calcite/avatica/Helper.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/Helper.java b/avatica/src/main/java/org/apache/calcite/avatica/Helper.java
index 184aef5..54be099 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/Helper.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/Helper.java
@@ -38,6 +38,17 @@ public class Helper {
   }
 
   public SQLException createException(String message, Exception e) {
+    return createException(message, null, e);
+  }
+
+  public SQLException createException(String message, String sql, Exception e) {
+    if (e instanceof AvaticaClientRuntimeException) {
+      // The AvaticaClientRuntimeException contains extra information about what/why
+      // the exception was thrown that we can pass back to the user.
+      AvaticaClientRuntimeException rte = (AvaticaClientRuntimeException) e;
+      return new AvaticaSqlException(message, rte.getSqlState(), rte.getErrorCode(),
+          rte.getServerExceptions());
+    }
     return new SQLException(message, e);
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/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
index a16ffa1..c5c8030 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/Meta.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/Meta.java
@@ -42,6 +42,7 @@ 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

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/main/java/org/apache/calcite/avatica/proto/Common.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/proto/Common.java b/avatica/src/main/java/org/apache/calcite/avatica/proto/Common.java
index c4ed1e7..f66f493 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/proto/Common.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/proto/Common.java
@@ -527,6 +527,121 @@ package org.apache.calcite.avatica.proto;
     // @@protoc_insertion_point(enum_scope:Rep)
   }
 
+  /**
+   * Protobuf enum {@code Severity}
+   *
+   * <pre>
+   * The severity of some unexpected outcome to an operation.
+   * Protobuf enum values must be unique across all other enums
+   * </pre>
+   */
+  public enum Severity
+      implements com.google.protobuf.ProtocolMessageEnum {
+    /**
+     * <code>UNKNOWN_SEVERITY = 0;</code>
+     */
+    UNKNOWN_SEVERITY(0, 0),
+    /**
+     * <code>FATAL_SEVERITY = 1;</code>
+     */
+    FATAL_SEVERITY(1, 1),
+    /**
+     * <code>ERROR_SEVERITY = 2;</code>
+     */
+    ERROR_SEVERITY(2, 2),
+    /**
+     * <code>WARNING_SEVERITY = 3;</code>
+     */
+    WARNING_SEVERITY(3, 3),
+    UNRECOGNIZED(-1, -1),
+    ;
+
+    /**
+     * <code>UNKNOWN_SEVERITY = 0;</code>
+     */
+    public static final int UNKNOWN_SEVERITY_VALUE = 0;
+    /**
+     * <code>FATAL_SEVERITY = 1;</code>
+     */
+    public static final int FATAL_SEVERITY_VALUE = 1;
+    /**
+     * <code>ERROR_SEVERITY = 2;</code>
+     */
+    public static final int ERROR_SEVERITY_VALUE = 2;
+    /**
+     * <code>WARNING_SEVERITY = 3;</code>
+     */
+    public static final int WARNING_SEVERITY_VALUE = 3;
+
+
+    public final int getNumber() {
+      if (index == -1) {
+        throw new java.lang.IllegalArgumentException(
+            "Can't get the number of an unknown enum value.");
+      }
+      return value;
+    }
+
+    public static Severity valueOf(int value) {
+      switch (value) {
+        case 0: return UNKNOWN_SEVERITY;
+        case 1: return FATAL_SEVERITY;
+        case 2: return ERROR_SEVERITY;
+        case 3: return WARNING_SEVERITY;
+        default: return null;
+      }
+    }
+
+    public static com.google.protobuf.Internal.EnumLiteMap<Severity>
+        internalGetValueMap() {
+      return internalValueMap;
+    }
+    private static com.google.protobuf.Internal.EnumLiteMap<Severity>
+        internalValueMap =
+          new com.google.protobuf.Internal.EnumLiteMap<Severity>() {
+            public Severity findValueByNumber(int number) {
+              return Severity.valueOf(number);
+            }
+          };
+
+    public final com.google.protobuf.Descriptors.EnumValueDescriptor
+        getValueDescriptor() {
+      return getDescriptor().getValues().get(index);
+    }
+    public final com.google.protobuf.Descriptors.EnumDescriptor
+        getDescriptorForType() {
+      return getDescriptor();
+    }
+    public static final com.google.protobuf.Descriptors.EnumDescriptor
+        getDescriptor() {
+      return org.apache.calcite.avatica.proto.Common.getDescriptor().getEnumTypes().get(2);
+    }
+
+    private static final Severity[] VALUES = values();
+
+    public static Severity valueOf(
+        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+      if (desc.getType() != getDescriptor()) {
+        throw new java.lang.IllegalArgumentException(
+          "EnumValueDescriptor is not for this type.");
+      }
+      if (desc.getIndex() == -1) {
+        return UNRECOGNIZED;
+      }
+      return VALUES[desc.getIndex()];
+    }
+
+    private final int index;
+    private final int value;
+
+    private Severity(int index, int value) {
+      this.index = index;
+      this.value = value;
+    }
+
+    // @@protoc_insertion_point(enum_scope:Severity)
+  }
+
   public interface ConnectionPropertiesOrBuilder extends
       // @@protoc_insertion_point(interface_extends:ConnectionProperties)
       com.google.protobuf.MessageOrBuilder {
@@ -12550,8 +12665,10 @@ package org.apache.calcite.avatica.proto;
       "ME\020\020\022\026\n\022JAVA_SQL_TIMESTAMP\020\021\022\021\n\rJAVA_SQL" +
       "_DATE\020\022\022\022\n\016JAVA_UTIL_DATE\020\023\022\017\n\013BYTE_STRI" +
       "NG\020\024\022\n\n\006STRING\020\025\022\n\n\006NUMBER\020\026\022\n\n\006OBJECT\020\027" +
-      "\022\010\n\004NULL\020\030B\"\n org.apache.calcite.avatica" +
-      ".protob\006proto3"
+      "\022\010\n\004NULL\020\030*^\n\010Severity\022\024\n\020UNKNOWN_SEVERI" +
+      "TY\020\000\022\022\n\016FATAL_SEVERITY\020\001\022\022\n\016ERROR_SEVERI",
+      "TY\020\002\022\024\n\020WARNING_SEVERITY\020\003B\"\n org.apache" +
+      ".calcite.avatica.protob\006proto3"
     };
     com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
         new com.google.protobuf.Descriptors.FileDescriptor.    InternalDescriptorAssigner() {

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/main/java/org/apache/calcite/avatica/proto/Responses.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/proto/Responses.java b/avatica/src/main/java/org/apache/calcite/avatica/proto/Responses.java
index 2fceb8a..e41078a 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/proto/Responses.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/proto/Responses.java
@@ -5944,17 +5944,100 @@ package org.apache.calcite.avatica.proto;
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>optional string message = 1;</code>
+     * <code>repeated string exceptions = 1;</code>
+     *
+     * <pre>
+     * exception stacktraces, many for linked exceptions.
+     * </pre>
+     */
+    com.google.protobuf.ProtocolStringList
+        getExceptionsList();
+    /**
+     * <code>repeated string exceptions = 1;</code>
+     *
+     * <pre>
+     * exception stacktraces, many for linked exceptions.
+     * </pre>
+     */
+    int getExceptionsCount();
+    /**
+     * <code>repeated string exceptions = 1;</code>
+     *
+     * <pre>
+     * exception stacktraces, many for linked exceptions.
+     * </pre>
+     */
+    java.lang.String getExceptions(int index);
+    /**
+     * <code>repeated string exceptions = 1;</code>
+     *
+     * <pre>
+     * exception stacktraces, many for linked exceptions.
+     * </pre>
+     */
+    com.google.protobuf.ByteString
+        getExceptionsBytes(int index);
+
+    /**
+     * <code>optional string error_message = 2;</code>
+     *
+     * <pre>
+     * human readable description
+     * </pre>
      */
-    java.lang.String getMessage();
+    java.lang.String getErrorMessage();
     /**
-     * <code>optional string message = 1;</code>
+     * <code>optional string error_message = 2;</code>
+     *
+     * <pre>
+     * human readable description
+     * </pre>
+     */
+    com.google.protobuf.ByteString
+        getErrorMessageBytes();
+
+    /**
+     * <code>optional .Severity severity = 3;</code>
+     */
+    int getSeverityValue();
+    /**
+     * <code>optional .Severity severity = 3;</code>
+     */
+    org.apache.calcite.avatica.proto.Common.Severity getSeverity();
+
+    /**
+     * <code>optional uint32 error_code = 4;</code>
+     *
+     * <pre>
+     * numeric identifier for error
+     * </pre>
+     */
+    int getErrorCode();
+
+    /**
+     * <code>optional string sql_state = 5;</code>
+     *
+     * <pre>
+     * five-character standard-defined value
+     * </pre>
+     */
+    java.lang.String getSqlState();
+    /**
+     * <code>optional string sql_state = 5;</code>
+     *
+     * <pre>
+     * five-character standard-defined value
+     * </pre>
      */
     com.google.protobuf.ByteString
-        getMessageBytes();
+        getSqlStateBytes();
   }
   /**
    * Protobuf type {@code ErrorResponse}
+   *
+   * <pre>
+   * Send contextual information about some error over the wire from the server.
+   * </pre>
    */
   public  static final class ErrorResponse extends
       com.google.protobuf.GeneratedMessage implements
@@ -5965,7 +6048,11 @@ package org.apache.calcite.avatica.proto;
       super(builder);
     }
     private ErrorResponse() {
-      message_ = "";
+      exceptions_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+      errorMessage_ = "";
+      severity_ = 0;
+      errorCode_ = 0;
+      sqlState_ = "";
     }
 
     @java.lang.Override
@@ -5995,8 +6082,34 @@ package org.apache.calcite.avatica.proto;
             }
             case 10: {
               com.google.protobuf.ByteString bs = input.readBytes();
+              if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
+                exceptions_ = new com.google.protobuf.LazyStringArrayList();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              exceptions_.add(bs);
+              break;
+            }
+            case 18: {
+              com.google.protobuf.ByteString bs = input.readBytes();
 
-              message_ = bs;
+              errorMessage_ = bs;
+              break;
+            }
+            case 24: {
+              int rawValue = input.readEnum();
+
+              severity_ = rawValue;
+              break;
+            }
+            case 32: {
+
+              errorCode_ = input.readUInt32();
+              break;
+            }
+            case 42: {
+              com.google.protobuf.ByteString bs = input.readBytes();
+
+              sqlState_ = bs;
               break;
             }
           }
@@ -6007,6 +6120,9 @@ package org.apache.calcite.avatica.proto;
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e.getMessage()).setUnfinishedMessage(this);
       } finally {
+        if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
+          exceptions_ = exceptions_.getUnmodifiableView();
+        }
         makeExtensionsImmutable();
       }
     }
@@ -6037,13 +6153,63 @@ package org.apache.calcite.avatica.proto;
       return PARSER;
     }
 
-    public static final int MESSAGE_FIELD_NUMBER = 1;
-    private java.lang.Object message_;
+    private int bitField0_;
+    public static final int EXCEPTIONS_FIELD_NUMBER = 1;
+    private com.google.protobuf.LazyStringList exceptions_;
     /**
-     * <code>optional string message = 1;</code>
+     * <code>repeated string exceptions = 1;</code>
+     *
+     * <pre>
+     * exception stacktraces, many for linked exceptions.
+     * </pre>
      */
-    public java.lang.String getMessage() {
-      java.lang.Object ref = message_;
+    public com.google.protobuf.ProtocolStringList
+        getExceptionsList() {
+      return exceptions_;
+    }
+    /**
+     * <code>repeated string exceptions = 1;</code>
+     *
+     * <pre>
+     * exception stacktraces, many for linked exceptions.
+     * </pre>
+     */
+    public int getExceptionsCount() {
+      return exceptions_.size();
+    }
+    /**
+     * <code>repeated string exceptions = 1;</code>
+     *
+     * <pre>
+     * exception stacktraces, many for linked exceptions.
+     * </pre>
+     */
+    public java.lang.String getExceptions(int index) {
+      return exceptions_.get(index);
+    }
+    /**
+     * <code>repeated string exceptions = 1;</code>
+     *
+     * <pre>
+     * exception stacktraces, many for linked exceptions.
+     * </pre>
+     */
+    public com.google.protobuf.ByteString
+        getExceptionsBytes(int index) {
+      return exceptions_.getByteString(index);
+    }
+
+    public static final int ERROR_MESSAGE_FIELD_NUMBER = 2;
+    private java.lang.Object errorMessage_;
+    /**
+     * <code>optional string error_message = 2;</code>
+     *
+     * <pre>
+     * human readable description
+     * </pre>
+     */
+    public java.lang.String getErrorMessage() {
+      java.lang.Object ref = errorMessage_;
       if (ref instanceof java.lang.String) {
         return (java.lang.String) ref;
       } else {
@@ -6051,22 +6217,99 @@ package org.apache.calcite.avatica.proto;
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
         if (bs.isValidUtf8()) {
-          message_ = s;
+          errorMessage_ = s;
         }
         return s;
       }
     }
     /**
-     * <code>optional string message = 1;</code>
+     * <code>optional string error_message = 2;</code>
+     *
+     * <pre>
+     * human readable description
+     * </pre>
      */
     public com.google.protobuf.ByteString
-        getMessageBytes() {
-      java.lang.Object ref = message_;
+        getErrorMessageBytes() {
+      java.lang.Object ref = errorMessage_;
       if (ref instanceof java.lang.String) {
         com.google.protobuf.ByteString b = 
             com.google.protobuf.ByteString.copyFromUtf8(
                 (java.lang.String) ref);
-        message_ = b;
+        errorMessage_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int SEVERITY_FIELD_NUMBER = 3;
+    private int severity_;
+    /**
+     * <code>optional .Severity severity = 3;</code>
+     */
+    public int getSeverityValue() {
+      return severity_;
+    }
+    /**
+     * <code>optional .Severity severity = 3;</code>
+     */
+    public org.apache.calcite.avatica.proto.Common.Severity getSeverity() {
+      org.apache.calcite.avatica.proto.Common.Severity result = org.apache.calcite.avatica.proto.Common.Severity.valueOf(severity_);
+      return result == null ? org.apache.calcite.avatica.proto.Common.Severity.UNRECOGNIZED : result;
+    }
+
+    public static final int ERROR_CODE_FIELD_NUMBER = 4;
+    private int errorCode_;
+    /**
+     * <code>optional uint32 error_code = 4;</code>
+     *
+     * <pre>
+     * numeric identifier for error
+     * </pre>
+     */
+    public int getErrorCode() {
+      return errorCode_;
+    }
+
+    public static final int SQL_STATE_FIELD_NUMBER = 5;
+    private java.lang.Object sqlState_;
+    /**
+     * <code>optional string sql_state = 5;</code>
+     *
+     * <pre>
+     * five-character standard-defined value
+     * </pre>
+     */
+    public java.lang.String getSqlState() {
+      java.lang.Object ref = sqlState_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        if (bs.isValidUtf8()) {
+          sqlState_ = s;
+        }
+        return s;
+      }
+    }
+    /**
+     * <code>optional string sql_state = 5;</code>
+     *
+     * <pre>
+     * five-character standard-defined value
+     * </pre>
+     */
+    public com.google.protobuf.ByteString
+        getSqlStateBytes() {
+      java.lang.Object ref = sqlState_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        sqlState_ = b;
         return b;
       } else {
         return (com.google.protobuf.ByteString) ref;
@@ -6086,8 +6329,20 @@ package org.apache.calcite.avatica.proto;
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
       getSerializedSize();
-      if (!getMessageBytes().isEmpty()) {
-        output.writeBytes(1, getMessageBytes());
+      for (int i = 0; i < exceptions_.size(); i++) {
+        output.writeBytes(1, exceptions_.getByteString(i));
+      }
+      if (!getErrorMessageBytes().isEmpty()) {
+        output.writeBytes(2, getErrorMessageBytes());
+      }
+      if (severity_ != org.apache.calcite.avatica.proto.Common.Severity.UNKNOWN_SEVERITY.getNumber()) {
+        output.writeEnum(3, severity_);
+      }
+      if (errorCode_ != 0) {
+        output.writeUInt32(4, errorCode_);
+      }
+      if (!getSqlStateBytes().isEmpty()) {
+        output.writeBytes(5, getSqlStateBytes());
       }
     }
 
@@ -6097,9 +6352,30 @@ package org.apache.calcite.avatica.proto;
       if (size != -1) return size;
 
       size = 0;
-      if (!getMessageBytes().isEmpty()) {
+      {
+        int dataSize = 0;
+        for (int i = 0; i < exceptions_.size(); i++) {
+          dataSize += com.google.protobuf.CodedOutputStream
+            .computeBytesSizeNoTag(exceptions_.getByteString(i));
+        }
+        size += dataSize;
+        size += 1 * getExceptionsList().size();
+      }
+      if (!getErrorMessageBytes().isEmpty()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(2, getErrorMessageBytes());
+      }
+      if (severity_ != org.apache.calcite.avatica.proto.Common.Severity.UNKNOWN_SEVERITY.getNumber()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeEnumSize(3, severity_);
+      }
+      if (errorCode_ != 0) {
         size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, getMessageBytes());
+          .computeUInt32Size(4, errorCode_);
+      }
+      if (!getSqlStateBytes().isEmpty()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(5, getSqlStateBytes());
       }
       memoizedSerializedSize = size;
       return size;
@@ -6174,6 +6450,10 @@ package org.apache.calcite.avatica.proto;
     }
     /**
      * Protobuf type {@code ErrorResponse}
+     *
+     * <pre>
+     * Send contextual information about some error over the wire from the server.
+     * </pre>
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -6207,7 +6487,15 @@ package org.apache.calcite.avatica.proto;
       }
       public Builder clear() {
         super.clear();
-        message_ = "";
+        exceptions_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+        bitField0_ = (bitField0_ & ~0x00000001);
+        errorMessage_ = "";
+
+        severity_ = 0;
+
+        errorCode_ = 0;
+
+        sqlState_ = "";
 
         return this;
       }
@@ -6231,7 +6519,18 @@ package org.apache.calcite.avatica.proto;
 
       public org.apache.calcite.avatica.proto.Responses.ErrorResponse buildPartial() {
         org.apache.calcite.avatica.proto.Responses.ErrorResponse result = new org.apache.calcite.avatica.proto.Responses.ErrorResponse(this);
-        result.message_ = message_;
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          exceptions_ = exceptions_.getUnmodifiableView();
+          bitField0_ = (bitField0_ & ~0x00000001);
+        }
+        result.exceptions_ = exceptions_;
+        result.errorMessage_ = errorMessage_;
+        result.severity_ = severity_;
+        result.errorCode_ = errorCode_;
+        result.sqlState_ = sqlState_;
+        result.bitField0_ = to_bitField0_;
         onBuilt();
         return result;
       }
@@ -6247,8 +6546,28 @@ package org.apache.calcite.avatica.proto;
 
       public Builder mergeFrom(org.apache.calcite.avatica.proto.Responses.ErrorResponse other) {
         if (other == org.apache.calcite.avatica.proto.Responses.ErrorResponse.getDefaultInstance()) return this;
-        if (!other.getMessage().isEmpty()) {
-          message_ = other.message_;
+        if (!other.exceptions_.isEmpty()) {
+          if (exceptions_.isEmpty()) {
+            exceptions_ = other.exceptions_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+          } else {
+            ensureExceptionsIsMutable();
+            exceptions_.addAll(other.exceptions_);
+          }
+          onChanged();
+        }
+        if (!other.getErrorMessage().isEmpty()) {
+          errorMessage_ = other.errorMessage_;
+          onChanged();
+        }
+        if (other.severity_ != 0) {
+          setSeverityValue(other.getSeverityValue());
+        }
+        if (other.getErrorCode() != 0) {
+          setErrorCode(other.getErrorCode());
+        }
+        if (!other.getSqlState().isEmpty()) {
+          sqlState_ = other.sqlState_;
           onChanged();
         }
         onChanged();
@@ -6276,19 +6595,325 @@ package org.apache.calcite.avatica.proto;
         }
         return this;
       }
+      private int bitField0_;
+
+      private com.google.protobuf.LazyStringList exceptions_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+      private void ensureExceptionsIsMutable() {
+        if (!((bitField0_ & 0x00000001) == 0x00000001)) {
+          exceptions_ = new com.google.protobuf.LazyStringArrayList(exceptions_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+      /**
+       * <code>repeated string exceptions = 1;</code>
+       *
+       * <pre>
+       * exception stacktraces, many for linked exceptions.
+       * </pre>
+       */
+      public com.google.protobuf.ProtocolStringList
+          getExceptionsList() {
+        return exceptions_.getUnmodifiableView();
+      }
+      /**
+       * <code>repeated string exceptions = 1;</code>
+       *
+       * <pre>
+       * exception stacktraces, many for linked exceptions.
+       * </pre>
+       */
+      public int getExceptionsCount() {
+        return exceptions_.size();
+      }
+      /**
+       * <code>repeated string exceptions = 1;</code>
+       *
+       * <pre>
+       * exception stacktraces, many for linked exceptions.
+       * </pre>
+       */
+      public java.lang.String getExceptions(int index) {
+        return exceptions_.get(index);
+      }
+      /**
+       * <code>repeated string exceptions = 1;</code>
+       *
+       * <pre>
+       * exception stacktraces, many for linked exceptions.
+       * </pre>
+       */
+      public com.google.protobuf.ByteString
+          getExceptionsBytes(int index) {
+        return exceptions_.getByteString(index);
+      }
+      /**
+       * <code>repeated string exceptions = 1;</code>
+       *
+       * <pre>
+       * exception stacktraces, many for linked exceptions.
+       * </pre>
+       */
+      public Builder setExceptions(
+          int index, java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  ensureExceptionsIsMutable();
+        exceptions_.set(index, value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated string exceptions = 1;</code>
+       *
+       * <pre>
+       * exception stacktraces, many for linked exceptions.
+       * </pre>
+       */
+      public Builder addExceptions(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  ensureExceptionsIsMutable();
+        exceptions_.add(value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated string exceptions = 1;</code>
+       *
+       * <pre>
+       * exception stacktraces, many for linked exceptions.
+       * </pre>
+       */
+      public Builder addAllExceptions(
+          java.lang.Iterable<java.lang.String> values) {
+        ensureExceptionsIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, exceptions_);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated string exceptions = 1;</code>
+       *
+       * <pre>
+       * exception stacktraces, many for linked exceptions.
+       * </pre>
+       */
+      public Builder clearExceptions() {
+        exceptions_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated string exceptions = 1;</code>
+       *
+       * <pre>
+       * exception stacktraces, many for linked exceptions.
+       * </pre>
+       */
+      public Builder addExceptionsBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  ensureExceptionsIsMutable();
+        exceptions_.add(value);
+        onChanged();
+        return this;
+      }
+
+      private java.lang.Object errorMessage_ = "";
+      /**
+       * <code>optional string error_message = 2;</code>
+       *
+       * <pre>
+       * human readable description
+       * </pre>
+       */
+      public java.lang.String getErrorMessage() {
+        java.lang.Object ref = errorMessage_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          if (bs.isValidUtf8()) {
+            errorMessage_ = s;
+          }
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>optional string error_message = 2;</code>
+       *
+       * <pre>
+       * human readable description
+       * </pre>
+       */
+      public com.google.protobuf.ByteString
+          getErrorMessageBytes() {
+        java.lang.Object ref = errorMessage_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          errorMessage_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>optional string error_message = 2;</code>
+       *
+       * <pre>
+       * human readable description
+       * </pre>
+       */
+      public Builder setErrorMessage(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        errorMessage_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string error_message = 2;</code>
+       *
+       * <pre>
+       * human readable description
+       * </pre>
+       */
+      public Builder clearErrorMessage() {
+        
+        errorMessage_ = getDefaultInstance().getErrorMessage();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string error_message = 2;</code>
+       *
+       * <pre>
+       * human readable description
+       * </pre>
+       */
+      public Builder setErrorMessageBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        errorMessage_ = value;
+        onChanged();
+        return this;
+      }
 
-      private java.lang.Object message_ = "";
+      private int severity_ = 0;
+      /**
+       * <code>optional .Severity severity = 3;</code>
+       */
+      public int getSeverityValue() {
+        return severity_;
+      }
       /**
-       * <code>optional string message = 1;</code>
+       * <code>optional .Severity severity = 3;</code>
        */
-      public java.lang.String getMessage() {
-        java.lang.Object ref = message_;
+      public Builder setSeverityValue(int value) {
+        severity_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional .Severity severity = 3;</code>
+       */
+      public org.apache.calcite.avatica.proto.Common.Severity getSeverity() {
+        org.apache.calcite.avatica.proto.Common.Severity result = org.apache.calcite.avatica.proto.Common.Severity.valueOf(severity_);
+        return result == null ? org.apache.calcite.avatica.proto.Common.Severity.UNRECOGNIZED : result;
+      }
+      /**
+       * <code>optional .Severity severity = 3;</code>
+       */
+      public Builder setSeverity(org.apache.calcite.avatica.proto.Common.Severity value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        
+        severity_ = value.getNumber();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional .Severity severity = 3;</code>
+       */
+      public Builder clearSeverity() {
+        
+        severity_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private int errorCode_ ;
+      /**
+       * <code>optional uint32 error_code = 4;</code>
+       *
+       * <pre>
+       * numeric identifier for error
+       * </pre>
+       */
+      public int getErrorCode() {
+        return errorCode_;
+      }
+      /**
+       * <code>optional uint32 error_code = 4;</code>
+       *
+       * <pre>
+       * numeric identifier for error
+       * </pre>
+       */
+      public Builder setErrorCode(int value) {
+        
+        errorCode_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional uint32 error_code = 4;</code>
+       *
+       * <pre>
+       * numeric identifier for error
+       * </pre>
+       */
+      public Builder clearErrorCode() {
+        
+        errorCode_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private java.lang.Object sqlState_ = "";
+      /**
+       * <code>optional string sql_state = 5;</code>
+       *
+       * <pre>
+       * five-character standard-defined value
+       * </pre>
+       */
+      public java.lang.String getSqlState() {
+        java.lang.Object ref = sqlState_;
         if (!(ref instanceof java.lang.String)) {
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
           if (bs.isValidUtf8()) {
-            message_ = s;
+            sqlState_ = s;
           }
           return s;
         } else {
@@ -6296,53 +6921,69 @@ package org.apache.calcite.avatica.proto;
         }
       }
       /**
-       * <code>optional string message = 1;</code>
+       * <code>optional string sql_state = 5;</code>
+       *
+       * <pre>
+       * five-character standard-defined value
+       * </pre>
        */
       public com.google.protobuf.ByteString
-          getMessageBytes() {
-        java.lang.Object ref = message_;
+          getSqlStateBytes() {
+        java.lang.Object ref = sqlState_;
         if (ref instanceof String) {
           com.google.protobuf.ByteString b = 
               com.google.protobuf.ByteString.copyFromUtf8(
                   (java.lang.String) ref);
-          message_ = b;
+          sqlState_ = b;
           return b;
         } else {
           return (com.google.protobuf.ByteString) ref;
         }
       }
       /**
-       * <code>optional string message = 1;</code>
+       * <code>optional string sql_state = 5;</code>
+       *
+       * <pre>
+       * five-character standard-defined value
+       * </pre>
        */
-      public Builder setMessage(
+      public Builder setSqlState(
           java.lang.String value) {
         if (value == null) {
     throw new NullPointerException();
   }
   
-        message_ = value;
+        sqlState_ = value;
         onChanged();
         return this;
       }
       /**
-       * <code>optional string message = 1;</code>
+       * <code>optional string sql_state = 5;</code>
+       *
+       * <pre>
+       * five-character standard-defined value
+       * </pre>
        */
-      public Builder clearMessage() {
+      public Builder clearSqlState() {
         
-        message_ = getDefaultInstance().getMessage();
+        sqlState_ = getDefaultInstance().getSqlState();
         onChanged();
         return this;
       }
       /**
-       * <code>optional string message = 1;</code>
+       * <code>optional string sql_state = 5;</code>
+       *
+       * <pre>
+       * five-character standard-defined value
+       * </pre>
        */
-      public Builder setMessageBytes(
+      public Builder setSqlStateBytes(
           com.google.protobuf.ByteString value) {
         if (value == null) {
     throw new NullPointerException();
   }
   
-        message_ = value;
+        sqlState_ = value;
         onChanged();
         return this;
       }
@@ -6462,9 +7103,11 @@ package org.apache.calcite.avatica.proto;
       "nt\022\036\n\003key\030\001 \001(\0132\021.DatabaseProperty\022\032\n\005va" +
       "lue\030\002 \001(\0132\013.TypedValue\"C\n\030DatabaseProper" +
       "tyResponse\022\'\n\005props\030\001 \003(\0132\030.DatabaseProp" +
-      "ertyElement\" \n\rErrorResponse\022\017\n\007message\030" +
-      "\001 \001(\tB\"\n org.apache.calcite.avatica.prot",
-      "ob\006proto3"
+      "ertyElement\"~\n\rErrorResponse\022\022\n\nexceptio" +
+      "ns\030\001 \003(\t\022\025\n\rerror_message\030\002 \001(\t\022\033\n\010sever",
+      "ity\030\003 \001(\0162\t.Severity\022\022\n\nerror_code\030\004 \001(\r" +
+      "\022\021\n\tsql_state\030\005 \001(\tB\"\n org.apache.calcit" +
+      "e.avatica.protob\006proto3"
     };
     com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
         new com.google.protobuf.Descriptors.FileDescriptor.    InternalDescriptorAssigner() {
@@ -6550,7 +7193,7 @@ package org.apache.calcite.avatica.proto;
     internal_static_ErrorResponse_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessage.FieldAccessorTable(
         internal_static_ErrorResponse_descriptor,
-        new java.lang.String[] { "Message", });
+        new java.lang.String[] { "Exceptions", "ErrorMessage", "Severity", "ErrorCode", "SqlState", });
     org.apache.calcite.avatica.proto.Common.getDescriptor();
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/main/java/org/apache/calcite/avatica/remote/AbstractHandler.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/AbstractHandler.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/AbstractHandler.java
new file mode 100644
index 0000000..9d3bf66
--- /dev/null
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/AbstractHandler.java
@@ -0,0 +1,142 @@
+/*
+ * 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.remote;
+
+import org.apache.calcite.avatica.AvaticaSeverity;
+import org.apache.calcite.avatica.remote.Service.ErrorResponse;
+import org.apache.calcite.avatica.remote.Service.Request;
+import org.apache.calcite.avatica.remote.Service.Response;
+
+import java.io.IOException;
+
+/**
+ * Abstract base class for {@link Handler}s to extend to inherit functionality common across
+ * serialization strategies.
+ *
+ * @param <T> The format Requests/Responses are serialized as.
+ */
+public abstract class AbstractHandler<T> implements Handler<T> {
+  private static final String NULL_EXCEPTION_MESSAGE = "(null exception message)";
+  protected final Service service;
+
+  public AbstractHandler(Service service) {
+    this.service = service;
+  }
+
+  abstract Request decode(T serializedRequest) throws IOException;
+
+  /**
+   * Serialize the given {@link Response} per the concrete {@link Handler} implementation.
+   *
+   * @param response The {@link Response} to serialize.
+   * @return A serialized representation of the {@link Response}.
+   * @throws IOException
+   */
+  abstract T encode(Response response) throws IOException;
+
+  /**
+   * Unwrap Avatica-specific context about a given exception.
+   *
+   * @param e A caught exception throw by Avatica implementation.
+   * @return An {@link ErrorResponse}.
+   */
+  ErrorResponse unwrapException(Exception e) {
+    // By default, we know nothing extra.
+    int errorCode = ErrorResponse.UNKNOWN_ERROR_CODE;
+    String sqlState = ErrorResponse.UNKNOWN_SQL_STATE;
+    AvaticaSeverity severity = AvaticaSeverity.UNKNOWN;
+    String errorMsg = null;
+
+    // Extract the contextual information if we have it. We may not.
+    if (e instanceof AvaticaRuntimeException) {
+      AvaticaRuntimeException rte = (AvaticaRuntimeException) e;
+      errorCode = rte.getErrorCode();
+      sqlState = rte.getSqlState();
+      severity = rte.getSeverity();
+      errorMsg = rte.getErrorMessage();
+    } else {
+      // Try to construct a meaningful error message when the server impl doesn't provide one.
+      errorMsg = getCausalChain(e);
+    }
+
+    return new ErrorResponse(e, errorMsg, errorCode, sqlState, severity);
+  }
+
+  /**
+   * Compute a response for the given request, handling errors generated by that computation.
+   *
+   * @param serializedRequest The caller's request.
+   * @return A {@link Response} with additional context about that response.
+   */
+  public HandlerResponse<T> apply(T serializedRequest) {
+    final Service.Request request;
+    try {
+      request = decode(serializedRequest);
+    } catch (IOException e) {
+      // TODO provide a canned ErrorResponse.
+      throw new RuntimeException(e);
+    }
+
+    try {
+      final Service.Response response = request.accept(service);
+      return new HandlerResponse<>(encode(response), HTTP_OK);
+    } catch (Exception e) {
+      ErrorResponse errorResp = unwrapException(e);
+
+      try {
+        return new HandlerResponse<>(encode(errorResp), HTTP_INTERNAL_SERVER_ERROR);
+      } catch (IOException e1) {
+        // TODO provide a canned ErrorResponse
+
+        // If we can't serialize error message to JSON, can't give a meaningful error to caller.
+        // Just try to not unnecessarily create more exceptions.
+        if (e instanceof RuntimeException) {
+          throw (RuntimeException) e;
+        }
+
+        throw new RuntimeException(e);
+      }
+    }
+  }
+
+  /**
+   * Constructs a message for the summary of an Exception.
+   *
+   * @param e The Exception to summarize.
+   * @return A summary message for the Exception.
+   */
+  private String getCausalChain(Exception e) {
+    StringBuilder sb = new StringBuilder(16);
+    Throwable curr = e;
+    // Could use Guava, but that would increase dependency set unnecessarily.
+    while (null != curr) {
+      if (sb.length() > 0) {
+        sb.append(" -> ");
+      }
+      String message = curr.getMessage();
+      sb.append(null == message ? NULL_EXCEPTION_MESSAGE : message);
+      curr = curr.getCause();
+    }
+    if (sb.length() == 0) {
+      // Catch the case where we have no error message.
+      return "Unknown error message";
+    }
+    return sb.toString();
+  }
+}
+
+// End AbstractHandler.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/main/java/org/apache/calcite/avatica/remote/AvaticaRuntimeException.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/AvaticaRuntimeException.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/AvaticaRuntimeException.java
new file mode 100644
index 0000000..2f9a1cd
--- /dev/null
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/AvaticaRuntimeException.java
@@ -0,0 +1,102 @@
+/*
+ * 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.remote;
+
+import org.apache.calcite.avatica.AvaticaSeverity;
+import org.apache.calcite.avatica.remote.Service.ErrorResponse;
+
+import java.util.Objects;
+
+/**
+ * A {@link RuntimeException} thrown by Avatica with additional contextual information about
+ * what happened to cause the Exception.
+ */
+public class AvaticaRuntimeException extends RuntimeException {
+  private static final long serialVersionUID = 1L;
+  private final String errorMessage;
+  private final int errorCode;
+  private final String sqlState;
+  private final AvaticaSeverity severity;
+
+  /**
+   * Constructs an {@code AvaticaRuntimeException} with no additional information.
+   *
+   * <p>It is strongly preferred that the caller invoke
+   * {@link #AvaticaRuntimeException(String, int, String, AvaticaSeverity)}
+   * with proper contextual information.
+   */
+  public AvaticaRuntimeException() {
+    this("No additional context on exception", ErrorResponse.UNKNOWN_ERROR_CODE,
+        ErrorResponse.UNKNOWN_SQL_STATE, AvaticaSeverity.UNKNOWN);
+  }
+
+  /**
+   * Constructs an {@code AvaticaRuntimeException} with the given
+   * contextual information surrounding the error.
+   *
+   * @param errorMessage A human-readable explanation about what happened
+   * @param errorCode Numeric identifier for error
+   * @param sqlState 5-character identifier for error
+   * @param severity Severity
+   */
+  public AvaticaRuntimeException(String errorMessage, int errorCode, String sqlState,
+      AvaticaSeverity severity) {
+    this.errorMessage = Objects.requireNonNull(errorMessage);
+    this.errorCode = errorCode;
+    this.sqlState = Objects.requireNonNull(sqlState);
+    this.severity = Objects.requireNonNull(severity);
+  }
+
+  /**
+   * Returns a human-readable error message.
+   */
+  public String getErrorMessage() {
+    return errorMessage;
+  }
+
+  /**
+   * Returns a numeric code for this error.
+   */
+  public int getErrorCode() {
+    return errorCode;
+  }
+
+  /**
+   * Returns the five-character identifier for this error.
+   */
+  public String getSqlState() {
+    return sqlState;
+  }
+
+  /**
+   * Returns the severity at which this exception is thrown.
+   */
+  public AvaticaSeverity getSeverity() {
+    return severity;
+  }
+
+  @Override public String toString() {
+    StringBuilder sb = new StringBuilder(64);
+    return sb.append("AvaticaRuntimeException: [")
+        .append("Messsage: '").append(errorMessage).append("', ")
+        .append("Error code: '").append(errorCode).append("', ")
+        .append("SQL State: '").append(sqlState).append("', ")
+        .append("Severity: '").append(severity).append("']").toString();
+  }
+}
+
+// End AvaticaRuntimeException.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/main/java/org/apache/calcite/avatica/remote/Driver.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/Driver.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/Driver.java
index ea5561d..0ab90b1 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/Driver.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/Driver.java
@@ -81,15 +81,11 @@ public class Driver extends UnregisteredDriver {
 
   @Override public Meta createMeta(AvaticaConnection connection) {
     final ConnectionConfig config = connection.config();
-    final Service service = createService(config);
+    final Service service = createService(connection, config);
     return new RemoteMeta(connection, service);
   }
 
-  private Service createService(ConnectionConfig config) {
-    // Exploit that none of the factory implementations currently rely
-    // on connection being there.
-    AvaticaConnection connection = null;
-
+  private Service createService(AvaticaConnection connection, ConnectionConfig config) {
     final Service.Factory metaFactory = config.factory();
     final Service service;
     if (metaFactory != null) {
@@ -120,8 +116,8 @@ public class Driver extends UnregisteredDriver {
     return service;
   }
 
-  @Override
-  public Connection connect(String url, Properties info) throws SQLException {
+  @Override public Connection connect(String url, Properties info)
+      throws SQLException {
     AvaticaConnection conn = (AvaticaConnection) super.connect(url, info);
     if (conn == null) {
       // It's not an url for our driver
@@ -130,7 +126,7 @@ public class Driver extends UnregisteredDriver {
 
     // Create the corresponding remote connection
     ConnectionConfig config = conn.config();
-    Service service = createService(config);
+    Service service = createService(conn, config);
 
     Map<String, String> infoAsString = new HashMap<>();
     for (Map.Entry<Object, Object> entry : info.entrySet()) {

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/main/java/org/apache/calcite/avatica/remote/Handler.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/Handler.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/Handler.java
index a3f564d..f0e8a93 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/Handler.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/Handler.java
@@ -16,13 +16,39 @@
  */
 package org.apache.calcite.avatica.remote;
 
+import java.util.Objects;
+
 /**
  * API for text request-response calls to an Avatica server.
  *
  * @param <T> The type this handler accepts and returns
  */
 public interface Handler<T> {
-  T apply(T request);
+  int HTTP_OK = 200;
+  int HTTP_INTERNAL_SERVER_ERROR = 500;
+
+  /**
+   * Struct that encapsulates the context of the result of a request to Avatica.
+   */
+  public class HandlerResponse<T> {
+    private final T response;
+    private final int statusCode;
+
+    public HandlerResponse(T response, int statusCode) {
+      this.response = Objects.requireNonNull(response);
+      this.statusCode = statusCode;
+    }
+
+    public T getResponse() {
+      return response;
+    }
+
+    public int getStatusCode() {
+      return statusCode;
+    }
+  }
+
+  HandlerResponse<T> apply(T request);
 }
 
 // End Handler.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/main/java/org/apache/calcite/avatica/remote/JsonHandler.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/JsonHandler.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/JsonHandler.java
index be1f5a7..5afc760 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/JsonHandler.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/JsonHandler.java
@@ -16,6 +16,9 @@
  */
 package org.apache.calcite.avatica.remote;
 
+import org.apache.calcite.avatica.remote.Service.Request;
+import org.apache.calcite.avatica.remote.Service.Response;
+
 import com.fasterxml.jackson.databind.ObjectMapper;
 
 import java.io.IOException;
@@ -28,27 +31,20 @@ import java.io.StringWriter;
  *
  * @see org.apache.calcite.avatica.remote.JsonService
  */
-public class JsonHandler implements Handler<String> {
-  private final Service service;
+public class JsonHandler extends AbstractHandler<String> {
 
   protected static final ObjectMapper MAPPER = JsonService.MAPPER;
 
   public JsonHandler(Service service) {
-    this.service = service;
+    super(service);
   }
 
-  public String apply(String jsonRequest) {
-    try {
-      Service.Request request = decode(jsonRequest, Service.Request.class);
-      final Service.Response response = request.accept(service);
-      return encode(response);
-    } catch (IOException e) {
-      throw handle(e);
-    }
+  public HandlerResponse<String> apply(String jsonRequest) {
+    return super.apply(jsonRequest);
   }
 
-  private <T> T decode(String request, Class<T> valueType) throws IOException {
-    return MAPPER.readValue(request, valueType);
+  @Override Request decode(String request) throws IOException {
+    return MAPPER.readValue(request, Service.Request.class);
   }
 
   /**
@@ -57,15 +53,11 @@ public class JsonHandler implements Handler<String> {
    * @param response The object to serialize.
    * @return A JSON string.
    */
-  public <T> String encode(T response) throws IOException {
+  @Override String encode(Response response) throws IOException {
     final StringWriter w = new StringWriter();
     MAPPER.writeValue(w, response);
     return w.toString();
   }
-
-  protected RuntimeException handle(IOException e) {
-    return new RuntimeException(e);
-  }
 }
 
 // End JsonHandler.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/main/java/org/apache/calcite/avatica/remote/JsonService.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/JsonService.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/JsonService.java
index 1bdb4a6..86d69f1 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/JsonService.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/JsonService.java
@@ -44,9 +44,16 @@ public abstract class JsonService extends AbstractService {
   public abstract String apply(String request);
 
   //@VisibleForTesting
-  protected static <T> T decode(String response, Class<T> valueType)
+  protected static <T> T decode(String response, Class<T> expectedType)
       throws IOException {
-    return MAPPER.readValue(response, valueType);
+    Response resp = MAPPER.readValue(response, Response.class);
+    if (resp instanceof ErrorResponse) {
+      throw ((ErrorResponse) resp).toException();
+    } else if (!expectedType.isAssignableFrom(resp.getClass())) {
+      throw new ClassCastException("Cannot cast " + resp.getClass() + " into " + expectedType);
+    }
+
+    return expectedType.cast(resp);
   }
 
   //@VisibleForTesting

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/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 34bdf97..1a5a554 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
@@ -110,21 +110,25 @@ public class LocalService implements Service {
   }
 
   public ResultSetResponse apply(CatalogsRequest request) {
-    final Meta.MetaResultSet resultSet =
-        meta.getCatalogs(new Meta.ConnectionHandle(request.connectionId));
+    final Meta.ConnectionHandle ch =
+        new Meta.ConnectionHandle(request.connectionId);
+    final Meta.MetaResultSet resultSet = meta.getCatalogs(ch);
     return toResponse(resultSet);
   }
 
   public ResultSetResponse apply(SchemasRequest request) {
+    final Meta.ConnectionHandle ch =
+        new Meta.ConnectionHandle(request.connectionId);
     final Meta.MetaResultSet resultSet =
-        meta.getSchemas(new Meta.ConnectionHandle(request.connectionId),
-            request.catalog, Meta.Pat.of(request.schemaPattern));
+        meta.getSchemas(ch, request.catalog, Meta.Pat.of(request.schemaPattern));
     return toResponse(resultSet);
   }
 
   public ResultSetResponse apply(TablesRequest request) {
+    final Meta.ConnectionHandle ch =
+        new Meta.ConnectionHandle(request.connectionId);
     final Meta.MetaResultSet resultSet =
-        meta.getTables(new Meta.ConnectionHandle(request.connectionId),
+        meta.getTables(ch,
             request.catalog,
             Meta.Pat.of(request.schemaPattern),
             Meta.Pat.of(request.tableNamePattern),
@@ -133,21 +137,24 @@ public class LocalService implements Service {
   }
 
   public ResultSetResponse apply(TableTypesRequest request) {
-    final Meta.MetaResultSet resultSet = meta.getTableTypes(
-        new Meta.ConnectionHandle(request.connectionId));
+    final Meta.ConnectionHandle ch =
+        new Meta.ConnectionHandle(request.connectionId);
+    final Meta.MetaResultSet resultSet = meta.getTableTypes(ch);
     return toResponse(resultSet);
   }
 
   public ResultSetResponse apply(TypeInfoRequest request) {
-    final Meta.MetaResultSet resultSet = meta.getTypeInfo(
-        new Meta.ConnectionHandle(request.connectionId));
+    final Meta.ConnectionHandle ch =
+        new Meta.ConnectionHandle(request.connectionId);
+    final Meta.MetaResultSet resultSet = meta.getTypeInfo(ch);
     return toResponse(resultSet);
   }
 
   public ResultSetResponse apply(ColumnsRequest request) {
+    final Meta.ConnectionHandle ch =
+        new Meta.ConnectionHandle(request.connectionId);
     final Meta.MetaResultSet resultSet =
-        meta.getColumns(
-            new Meta.ConnectionHandle(request.connectionId),
+        meta.getColumns(ch,
             request.catalog,
             Meta.Pat.of(request.schemaPattern),
             Meta.Pat.of(request.tableNamePattern),
@@ -212,37 +219,45 @@ public class LocalService implements Service {
   }
 
   public CreateStatementResponse apply(CreateStatementRequest request) {
-    final Meta.StatementHandle h =
-        meta.createStatement(new Meta.ConnectionHandle(request.connectionId));
+    final Meta.ConnectionHandle ch =
+        new Meta.ConnectionHandle(request.connectionId);
+    final Meta.StatementHandle h = meta.createStatement(ch);
     return new CreateStatementResponse(h.connectionId, h.id);
   }
 
   public CloseStatementResponse apply(CloseStatementRequest request) {
-    meta.closeStatement(
-        new Meta.StatementHandle(request.connectionId, request.statementId,
-            null));
+    final Meta.StatementHandle h = new Meta.StatementHandle(
+        request.connectionId, request.statementId, null);
+    meta.closeStatement(h);
     return new CloseStatementResponse();
   }
 
   public OpenConnectionResponse apply(OpenConnectionRequest request) {
-    meta.openConnection(new Meta.ConnectionHandle(request.connectionId), request.info);
+    final Meta.ConnectionHandle ch =
+        new Meta.ConnectionHandle(request.connectionId);
+    meta.openConnection(ch, request.info);
     return new OpenConnectionResponse();
   }
 
   public CloseConnectionResponse apply(CloseConnectionRequest request) {
-    meta.closeConnection(new Meta.ConnectionHandle(request.connectionId));
+    final Meta.ConnectionHandle ch =
+        new Meta.ConnectionHandle(request.connectionId);
+    meta.closeConnection(ch);
     return new CloseConnectionResponse();
   }
 
   public ConnectionSyncResponse apply(ConnectionSyncRequest request) {
+    final Meta.ConnectionHandle ch =
+        new Meta.ConnectionHandle(request.connectionId);
     final Meta.ConnectionProperties connProps =
-        meta.connectionSync(new Meta.ConnectionHandle(request.connectionId), request.connProps);
+        meta.connectionSync(ch, request.connProps);
     return new ConnectionSyncResponse(connProps);
   }
 
   public DatabasePropertyResponse apply(DatabasePropertyRequest request) {
-    return new DatabasePropertyResponse(meta.getDatabaseProperties(
-        new Meta.ConnectionHandle(request.connectionId)));
+    final Meta.ConnectionHandle ch =
+        new Meta.ConnectionHandle(request.connectionId);
+    return new DatabasePropertyResponse(meta.getDatabaseProperties(ch));
   }
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5be93fb4/avatica/src/main/java/org/apache/calcite/avatica/remote/MockJsonService.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/MockJsonService.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/MockJsonService.java
index 6d87122..2c2c7b2 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/MockJsonService.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/MockJsonService.java
@@ -18,9 +18,6 @@ package org.apache.calcite.avatica.remote;
 
 import org.apache.calcite.avatica.AvaticaConnection;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -33,62 +30,43 @@ import java.util.Map;
  */
 public class MockJsonService extends JsonService {
   private final Map<String, String> map;
-  private final ObjectMapper mapper = new ObjectMapper();
 
   public MockJsonService(Map<String, String> map) {
     this.map = map;
   }
 
   @Override public String apply(String request) {
-    String response = map.get(canonicalizeConnectionId(request));
+    String response = map.get(request);
     if (response == null) {
       throw new RuntimeException("No response for " + request);
     }
     return response;
   }
 
-  /**
-   * The connection id is always different, therefore when present in the request,
-   * set it to 0.
-   */
-  private String canonicalizeConnectionId(String request) {
-    ObjectNode jsonRequest;
-    try {
-      jsonRequest = (ObjectNode) mapper.readTree(request);
-    } catch (IOException e) {
-      throw new RuntimeException(e);
-    }
-    if (jsonRequest.get("connectionId") != null) {
-      jsonRequest.put("connectionId", "0");
-      return jsonRequest.toString();
-    } else {
-      return request;
-    }
-  }
-
   /** Factory that creates a {@code MockJsonService}. */
   public static class Factory implements Service.Factory {
     public Service create(AvaticaConnection connection) {
+      final String connectionId = connection.handle.id;
       final Map<String, String> map1 = new HashMap<>();
       try {
         map1.put(
-            "{\"request\":\"openConnection\",\"connectionId\":\"0\",\"info\":{}}",
+            "{\"request\":\"openConnection\",\"connectionId\":\"" + connectionId + "\",\"info\":{}}",
             "{\"response\":\"openConnection\"}");
         map1.put(
-            "{\"request\":\"closeConnection\",\"connectionId\":\"0\"}",
+            "{\"request\":\"closeConnection\",\"connectionId\":\"" + connectionId + "\"}",
             "{\"response\":\"closeConnection\"}");
         map1.put(
             "{\"request\":\"getSchemas\",\"catalog\":null,\"schemaPattern\":{\"s\":null}}",
             "{\"response\":\"resultSet\", updateCount: -1, firstFrame: {offset: 0, done: true, rows: []}}");
         map1.put(
-            JsonService.encode(new SchemasRequest("0", null, null)),
+            JsonService.encode(new SchemasRequest(connectionId, null, null)),
             "{\"response\":\"resultSet\", updateCount: -1, firstFrame: {offset: 0, done: true, rows: []}}");
         map1.put(
             JsonService.encode(
-                new TablesRequest("0", null, null, null, Arrays.<String>asList())),
+                new TablesRequest(connectionId, null, null, null, Arrays.<String>asList())),
             "{\"response\":\"resultSet\", updateCount: -1, firstFrame: {offset: 0, done: true, rows: []}}");
         map1.put(
-            "{\"request\":\"createStatement\",\"connectionId\":0}",
+            "{\"request\":\"createStatement\",\"connectionId\":\"" + connectionId + "\"}",
             "{\"response\":\"createStatement\",\"id\":0}");
         map1.put(
             "{\"request\":\"prepareAndExecute\",\"statementId\":0,"
@@ -111,7 +89,7 @@ public class MockJsonService extends JsonService {
                 + " \"cursorFactory\": {\"style\": \"ARRAY\"}\n"
                 + "}}");
         map1.put(
-            "{\"request\":\"getColumns\",\"catalog\":null,\"schemaPattern\":null,"
+            "{\"request\":\"getColumns\",\"connectionId\":\"" + connectionId + "\",\"catalog\":null,\"schemaPattern\":null,"
                 + "\"tableNamePattern\":\"my_table\",\"columnNamePattern\":null}",
             "{\"response\":\"resultSet\",\"connectionId\":\"00000000-0000-0000-0000-000000000000\",\"statementId\":-1,\"ownStatement\":true,"
                 + "\"signature\":{\"columns\":["


[07/11] incubator-calcite git commit: [CALCITE-908] Bump protobuf to 3.0.0-beta-1, fix deprecations and update docs (Josh Elser)

Posted by jh...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/86610552/avatica/src/main/java/org/apache/calcite/avatica/remote/ProtobufTranslationImpl.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/ProtobufTranslationImpl.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/ProtobufTranslationImpl.java
index a121ad3..31d522d 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/ProtobufTranslationImpl.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/ProtobufTranslationImpl.java
@@ -71,71 +71,73 @@ public class ProtobufTranslationImpl implements ProtobufTranslation {
   static {
     HashMap<String, RequestTranslator> reqParsers = new HashMap<>();
     reqParsers.put(CatalogsRequest.class.getName(),
-        new RequestTranslator(CatalogsRequest.PARSER, new Service.CatalogsRequest()));
+        new RequestTranslator(CatalogsRequest.parser(), new Service.CatalogsRequest()));
     reqParsers.put(OpenConnectionRequest.class.getName(),
-        new RequestTranslator(OpenConnectionRequest.PARSER, new Service.OpenConnectionRequest()));
+        new RequestTranslator(OpenConnectionRequest.parser(), new Service.OpenConnectionRequest()));
     reqParsers.put(CloseConnectionRequest.class.getName(),
-        new RequestTranslator(CloseConnectionRequest.PARSER, new Service.CloseConnectionRequest()));
+        new RequestTranslator(CloseConnectionRequest.parser(),
+          new Service.CloseConnectionRequest()));
     reqParsers.put(CloseStatementRequest.class.getName(),
-        new RequestTranslator(CloseStatementRequest.PARSER, new Service.CloseStatementRequest()));
+        new RequestTranslator(CloseStatementRequest.parser(), new Service.CloseStatementRequest()));
     reqParsers.put(ColumnsRequest.class.getName(),
-        new RequestTranslator(ColumnsRequest.PARSER, new Service.ColumnsRequest()));
+        new RequestTranslator(ColumnsRequest.parser(), new Service.ColumnsRequest()));
     reqParsers.put(ConnectionSyncRequest.class.getName(),
-        new RequestTranslator(ConnectionSyncRequest.PARSER, new Service.ConnectionSyncRequest()));
+        new RequestTranslator(ConnectionSyncRequest.parser(), new Service.ConnectionSyncRequest()));
     reqParsers.put(CreateStatementRequest.class.getName(),
-        new RequestTranslator(CreateStatementRequest.PARSER, new Service.CreateStatementRequest()));
+        new RequestTranslator(CreateStatementRequest.parser(),
+          new Service.CreateStatementRequest()));
     reqParsers.put(DatabasePropertyRequest.class.getName(),
-        new RequestTranslator(DatabasePropertyRequest.PARSER,
+        new RequestTranslator(DatabasePropertyRequest.parser(),
             new Service.DatabasePropertyRequest()));
     reqParsers.put(FetchRequest.class.getName(),
-        new RequestTranslator(FetchRequest.PARSER, new Service.FetchRequest()));
+        new RequestTranslator(FetchRequest.parser(), new Service.FetchRequest()));
     reqParsers.put(PrepareAndExecuteRequest.class.getName(),
-        new RequestTranslator(PrepareAndExecuteRequest.PARSER,
+        new RequestTranslator(PrepareAndExecuteRequest.parser(),
             new Service.PrepareAndExecuteRequest()));
     reqParsers.put(PrepareRequest.class.getName(),
-        new RequestTranslator(PrepareRequest.PARSER, new Service.PrepareRequest()));
+        new RequestTranslator(PrepareRequest.parser(), new Service.PrepareRequest()));
     reqParsers.put(SchemasRequest.class.getName(),
-        new RequestTranslator(SchemasRequest.PARSER, new Service.SchemasRequest()));
+        new RequestTranslator(SchemasRequest.parser(), new Service.SchemasRequest()));
     reqParsers.put(TablesRequest.class.getName(),
-        new RequestTranslator(TablesRequest.PARSER, new Service.TablesRequest()));
+        new RequestTranslator(TablesRequest.parser(), new Service.TablesRequest()));
     reqParsers.put(TableTypesRequest.class.getName(),
-        new RequestTranslator(TableTypesRequest.PARSER, new Service.TableTypesRequest()));
+        new RequestTranslator(TableTypesRequest.parser(), new Service.TableTypesRequest()));
     reqParsers.put(TypeInfoRequest.class.getName(),
-        new RequestTranslator(TypeInfoRequest.PARSER, new Service.TypeInfoRequest()));
+        new RequestTranslator(TypeInfoRequest.parser(), new Service.TypeInfoRequest()));
     reqParsers.put(ExecuteRequest.class.getName(),
-        new RequestTranslator(ExecuteRequest.PARSER, new Service.ExecuteRequest()));
+        new RequestTranslator(ExecuteRequest.parser(), new Service.ExecuteRequest()));
 
     REQUEST_PARSERS = Collections.unmodifiableMap(reqParsers);
 
     HashMap<String, ResponseTranslator> respParsers = new HashMap<>();
     respParsers.put(OpenConnectionResponse.class.getName(),
-        new ResponseTranslator(OpenConnectionResponse.PARSER,
+        new ResponseTranslator(OpenConnectionResponse.parser(),
             new Service.OpenConnectionResponse()));
     respParsers.put(CloseConnectionResponse.class.getName(),
-        new ResponseTranslator(CloseConnectionResponse.PARSER,
+        new ResponseTranslator(CloseConnectionResponse.parser(),
             new Service.CloseConnectionResponse()));
     respParsers.put(CloseStatementResponse.class.getName(),
-        new ResponseTranslator(CloseStatementResponse.PARSER,
+        new ResponseTranslator(CloseStatementResponse.parser(),
             new Service.CloseStatementResponse()));
     respParsers.put(ConnectionSyncResponse.class.getName(),
-        new ResponseTranslator(ConnectionSyncResponse.PARSER,
+        new ResponseTranslator(ConnectionSyncResponse.parser(),
             new Service.ConnectionSyncResponse()));
     respParsers.put(CreateStatementResponse.class.getName(),
-        new ResponseTranslator(CreateStatementResponse.PARSER,
+        new ResponseTranslator(CreateStatementResponse.parser(),
             new Service.CreateStatementResponse()));
     respParsers.put(DatabasePropertyResponse.class.getName(),
-        new ResponseTranslator(DatabasePropertyResponse.PARSER,
+        new ResponseTranslator(DatabasePropertyResponse.parser(),
             new Service.DatabasePropertyResponse()));
     respParsers.put(ExecuteResponse.class.getName(),
-        new ResponseTranslator(ExecuteResponse.PARSER, new Service.ExecuteResponse()));
+        new ResponseTranslator(ExecuteResponse.parser(), new Service.ExecuteResponse()));
     respParsers.put(FetchResponse.class.getName(),
-        new ResponseTranslator(FetchResponse.PARSER, new Service.FetchResponse()));
+        new ResponseTranslator(FetchResponse.parser(), new Service.FetchResponse()));
     respParsers.put(PrepareResponse.class.getName(),
-        new ResponseTranslator(PrepareResponse.PARSER, new Service.PrepareResponse()));
+        new ResponseTranslator(PrepareResponse.parser(), new Service.PrepareResponse()));
     respParsers.put(ResultSetResponse.class.getName(),
-        new ResponseTranslator(ResultSetResponse.PARSER, new Service.ResultSetResponse()));
+        new ResponseTranslator(ResultSetResponse.parser(), new Service.ResultSetResponse()));
     respParsers.put(ErrorResponse.class.getName(),
-        new ResponseTranslator(ErrorResponse.PARSER, new Service.ErrorResponse()));
+        new ResponseTranslator(ErrorResponse.parser(), new Service.ErrorResponse()));
 
     RESPONSE_PARSERS = Collections.unmodifiableMap(respParsers);
   }

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/86610552/avatica/src/test/java/org/apache/calcite/avatica/remote/ProtobufTranslationImplTest.java
----------------------------------------------------------------------
diff --git a/avatica/src/test/java/org/apache/calcite/avatica/remote/ProtobufTranslationImplTest.java b/avatica/src/test/java/org/apache/calcite/avatica/remote/ProtobufTranslationImplTest.java
index d385054..0db48ab 100644
--- a/avatica/src/test/java/org/apache/calcite/avatica/remote/ProtobufTranslationImplTest.java
+++ b/avatica/src/test/java/org/apache/calcite/avatica/remote/ProtobufTranslationImplTest.java
@@ -230,7 +230,7 @@ public class ProtobufTranslationImplTest<T> {
 
     // Stub out the metadata for a row
     List<ColumnMetaData> columns =
-        Arrays.<ColumnMetaData>asList(MetaImpl.columnMetaData("str", 0, String.class),
+        Arrays.asList(MetaImpl.columnMetaData("str", 0, String.class),
             MetaImpl.columnMetaData("count", 1, Integer.class));
     List<AvaticaParameter> params =
         Arrays.asList(
@@ -278,9 +278,10 @@ public class ProtobufTranslationImplTest<T> {
 
     StringWriter sw = new StringWriter();
     new Exception().printStackTrace(new PrintWriter(sw));
-    responses.add(new ErrorResponse(Collections.singletonList(sw.toString()), "Test Error Message",
-        ErrorResponse.UNKNOWN_ERROR_CODE, ErrorResponse.UNKNOWN_SQL_STATE,
-        AvaticaSeverity.WARNING));
+    responses.add(
+        new ErrorResponse(Collections.singletonList(sw.toString()), "Test Error Message",
+            ErrorResponse.UNKNOWN_ERROR_CODE, ErrorResponse.UNKNOWN_SQL_STATE,
+            AvaticaSeverity.WARNING));
 
     return responses;
   }

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/86610552/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index ae53317..b7d1c6a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -160,7 +160,7 @@ limitations under the License.
       <dependency>
         <groupId>com.google.protobuf</groupId>
         <artifactId>protobuf-java</artifactId>
-        <version>3.0.0-alpha-2</version>
+        <version>3.0.0-beta-1</version>
       </dependency>
       <dependency>
         <groupId>com.h2database</groupId>

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/86610552/site/_docs/howto.md
----------------------------------------------------------------------
diff --git a/site/_docs/howto.md b/site/_docs/howto.md
index d074fb9..af33cdd 100644
--- a/site/_docs/howto.md
+++ b/site/_docs/howto.md
@@ -397,8 +397,8 @@ need to be re-generated only every build, only when the schema changes.
 First, install Protobuf 3.0:
 
 {% highlight bash %}
-$ wget https://github.com/google/protobuf/releases/download/v3.0.0-alpha-2/protobuf-java-3.0.0-alpha-2.tar.gz
-$ tar xf protobuf-java-3.0.0-alpha-2.tar.gz && cd protobuf-3.0.0-alpha-2
+$ wget https://github.com/google/protobuf/releases/download/v3.0.0-beta-1/protobuf-java-3.0.0-beta-1.tar.gz
+$ tar xf protobuf-java-3.0.0-beta-1.tar.gz && cd protobuf-3.0.0-beta-1
 $ ./configure
 $ make
 $ sudo make install


[02/11] incubator-calcite git commit: [CALCITE-912] Add Avatica OpenConnectionRequest (Bruno Dumon)

Posted by jh...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/avatica/src/main/java/org/apache/calcite/avatica/proto/Responses.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/proto/Responses.java b/avatica/src/main/java/org/apache/calcite/avatica/proto/Responses.java
index bed750b..2fceb8a 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/proto/Responses.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/proto/Responses.java
@@ -3497,6 +3497,312 @@ package org.apache.calcite.avatica.proto;
 
   }
 
+  public interface OpenConnectionResponseOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:OpenConnectionResponse)
+      com.google.protobuf.MessageOrBuilder {
+  }
+  /**
+   * Protobuf type {@code OpenConnectionResponse}
+   *
+   * <pre>
+   * Response to OpenConnectionRequest {
+   * </pre>
+   */
+  public  static final class OpenConnectionResponse extends
+      com.google.protobuf.GeneratedMessage implements
+      // @@protoc_insertion_point(message_implements:OpenConnectionResponse)
+      OpenConnectionResponseOrBuilder {
+    // Use OpenConnectionResponse.newBuilder() to construct.
+    private OpenConnectionResponse(com.google.protobuf.GeneratedMessage.Builder builder) {
+      super(builder);
+    }
+    private OpenConnectionResponse() {
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return com.google.protobuf.UnknownFieldSet.getDefaultInstance();
+    }
+    private OpenConnectionResponse(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            default: {
+              if (!input.skipField(tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e.getMessage()).setUnfinishedMessage(this);
+      } finally {
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return org.apache.calcite.avatica.proto.Responses.internal_static_OpenConnectionResponse_descriptor;
+    }
+
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return org.apache.calcite.avatica.proto.Responses.internal_static_OpenConnectionResponse_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse.class, org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse.Builder.class);
+    }
+
+    public static final com.google.protobuf.Parser<OpenConnectionResponse> PARSER =
+        new com.google.protobuf.AbstractParser<OpenConnectionResponse>() {
+      public OpenConnectionResponse parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new OpenConnectionResponse(input, extensionRegistry);
+      }
+    };
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<OpenConnectionResponse> getParserForType() {
+      return PARSER;
+    }
+
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+    }
+
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      memoizedSerializedSize = size;
+      return size;
+    }
+
+    private static final long serialVersionUID = 0L;
+    public static org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+
+    public static Builder newBuilder() { return new Builder(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code OpenConnectionResponse}
+     *
+     * <pre>
+     * Response to OpenConnectionRequest {
+     * </pre>
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:OpenConnectionResponse)
+        org.apache.calcite.avatica.proto.Responses.OpenConnectionResponseOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return org.apache.calcite.avatica.proto.Responses.internal_static_OpenConnectionResponse_descriptor;
+      }
+
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return org.apache.calcite.avatica.proto.Responses.internal_static_OpenConnectionResponse_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse.class, org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse.Builder.class);
+      }
+
+      // Construct using org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+        }
+      }
+      public Builder clear() {
+        super.clear();
+        return this;
+      }
+
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return org.apache.calcite.avatica.proto.Responses.internal_static_OpenConnectionResponse_descriptor;
+      }
+
+      public org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse getDefaultInstanceForType() {
+        return org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse.getDefaultInstance();
+      }
+
+      public org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse build() {
+        org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      public org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse buildPartial() {
+        org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse result = new org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse(this);
+        onBuilt();
+        return result;
+      }
+
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse) {
+          return mergeFrom((org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse other) {
+        if (other == org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse.getDefaultInstance()) return this;
+        onChanged();
+        return this;
+      }
+
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse) e.getUnfinishedMessage();
+          throw e;
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return this;
+      }
+
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return this;
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:OpenConnectionResponse)
+    }
+
+    // @@protoc_insertion_point(class_scope:OpenConnectionResponse)
+    private static final org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse defaultInstance;static {
+      defaultInstance = new org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse();
+    }
+
+    public static org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse getDefaultInstance() {
+      return defaultInstance;
+    }
+
+    public org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+
+  }
+
   public interface CloseConnectionResponseOrBuilder extends
       // @@protoc_insertion_point(interface_extends:CloseConnectionResponse)
       com.google.protobuf.MessageOrBuilder {
@@ -5633,13 +5939,449 @@ package org.apache.calcite.avatica.proto;
 
   }
 
-  private static final com.google.protobuf.Descriptors.Descriptor
-    internal_static_ResultSetResponse_descriptor;
-  private static
-    com.google.protobuf.GeneratedMessage.FieldAccessorTable
-      internal_static_ResultSetResponse_fieldAccessorTable;
-  private static final com.google.protobuf.Descriptors.Descriptor
-    internal_static_ExecuteResponse_descriptor;
+  public interface ErrorResponseOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:ErrorResponse)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>optional string message = 1;</code>
+     */
+    java.lang.String getMessage();
+    /**
+     * <code>optional string message = 1;</code>
+     */
+    com.google.protobuf.ByteString
+        getMessageBytes();
+  }
+  /**
+   * Protobuf type {@code ErrorResponse}
+   */
+  public  static final class ErrorResponse extends
+      com.google.protobuf.GeneratedMessage implements
+      // @@protoc_insertion_point(message_implements:ErrorResponse)
+      ErrorResponseOrBuilder {
+    // Use ErrorResponse.newBuilder() to construct.
+    private ErrorResponse(com.google.protobuf.GeneratedMessage.Builder builder) {
+      super(builder);
+    }
+    private ErrorResponse() {
+      message_ = "";
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return com.google.protobuf.UnknownFieldSet.getDefaultInstance();
+    }
+    private ErrorResponse(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      int mutable_bitField0_ = 0;
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            default: {
+              if (!input.skipField(tag)) {
+                done = true;
+              }
+              break;
+            }
+            case 10: {
+              com.google.protobuf.ByteString bs = input.readBytes();
+
+              message_ = bs;
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e.getMessage()).setUnfinishedMessage(this);
+      } finally {
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return org.apache.calcite.avatica.proto.Responses.internal_static_ErrorResponse_descriptor;
+    }
+
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return org.apache.calcite.avatica.proto.Responses.internal_static_ErrorResponse_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              org.apache.calcite.avatica.proto.Responses.ErrorResponse.class, org.apache.calcite.avatica.proto.Responses.ErrorResponse.Builder.class);
+    }
+
+    public static final com.google.protobuf.Parser<ErrorResponse> PARSER =
+        new com.google.protobuf.AbstractParser<ErrorResponse>() {
+      public ErrorResponse parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new ErrorResponse(input, extensionRegistry);
+      }
+    };
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<ErrorResponse> getParserForType() {
+      return PARSER;
+    }
+
+    public static final int MESSAGE_FIELD_NUMBER = 1;
+    private java.lang.Object message_;
+    /**
+     * <code>optional string message = 1;</code>
+     */
+    public java.lang.String getMessage() {
+      java.lang.Object ref = message_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        if (bs.isValidUtf8()) {
+          message_ = s;
+        }
+        return s;
+      }
+    }
+    /**
+     * <code>optional string message = 1;</code>
+     */
+    public com.google.protobuf.ByteString
+        getMessageBytes() {
+      java.lang.Object ref = message_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        message_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (!getMessageBytes().isEmpty()) {
+        output.writeBytes(1, getMessageBytes());
+      }
+    }
+
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (!getMessageBytes().isEmpty()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(1, getMessageBytes());
+      }
+      memoizedSerializedSize = size;
+      return size;
+    }
+
+    private static final long serialVersionUID = 0L;
+    public static org.apache.calcite.avatica.proto.Responses.ErrorResponse parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.ErrorResponse parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.ErrorResponse parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.ErrorResponse parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.ErrorResponse parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.ErrorResponse parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.ErrorResponse parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.ErrorResponse parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.ErrorResponse parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.ErrorResponse parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+
+    public static Builder newBuilder() { return new Builder(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(org.apache.calcite.avatica.proto.Responses.ErrorResponse prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code ErrorResponse}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:ErrorResponse)
+        org.apache.calcite.avatica.proto.Responses.ErrorResponseOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return org.apache.calcite.avatica.proto.Responses.internal_static_ErrorResponse_descriptor;
+      }
+
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return org.apache.calcite.avatica.proto.Responses.internal_static_ErrorResponse_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                org.apache.calcite.avatica.proto.Responses.ErrorResponse.class, org.apache.calcite.avatica.proto.Responses.ErrorResponse.Builder.class);
+      }
+
+      // Construct using org.apache.calcite.avatica.proto.Responses.ErrorResponse.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+        }
+      }
+      public Builder clear() {
+        super.clear();
+        message_ = "";
+
+        return this;
+      }
+
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return org.apache.calcite.avatica.proto.Responses.internal_static_ErrorResponse_descriptor;
+      }
+
+      public org.apache.calcite.avatica.proto.Responses.ErrorResponse getDefaultInstanceForType() {
+        return org.apache.calcite.avatica.proto.Responses.ErrorResponse.getDefaultInstance();
+      }
+
+      public org.apache.calcite.avatica.proto.Responses.ErrorResponse build() {
+        org.apache.calcite.avatica.proto.Responses.ErrorResponse result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      public org.apache.calcite.avatica.proto.Responses.ErrorResponse buildPartial() {
+        org.apache.calcite.avatica.proto.Responses.ErrorResponse result = new org.apache.calcite.avatica.proto.Responses.ErrorResponse(this);
+        result.message_ = message_;
+        onBuilt();
+        return result;
+      }
+
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof org.apache.calcite.avatica.proto.Responses.ErrorResponse) {
+          return mergeFrom((org.apache.calcite.avatica.proto.Responses.ErrorResponse)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(org.apache.calcite.avatica.proto.Responses.ErrorResponse other) {
+        if (other == org.apache.calcite.avatica.proto.Responses.ErrorResponse.getDefaultInstance()) return this;
+        if (!other.getMessage().isEmpty()) {
+          message_ = other.message_;
+          onChanged();
+        }
+        onChanged();
+        return this;
+      }
+
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        org.apache.calcite.avatica.proto.Responses.ErrorResponse parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (org.apache.calcite.avatica.proto.Responses.ErrorResponse) e.getUnfinishedMessage();
+          throw e;
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+
+      private java.lang.Object message_ = "";
+      /**
+       * <code>optional string message = 1;</code>
+       */
+      public java.lang.String getMessage() {
+        java.lang.Object ref = message_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          if (bs.isValidUtf8()) {
+            message_ = s;
+          }
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>optional string message = 1;</code>
+       */
+      public com.google.protobuf.ByteString
+          getMessageBytes() {
+        java.lang.Object ref = message_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          message_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>optional string message = 1;</code>
+       */
+      public Builder setMessage(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        message_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string message = 1;</code>
+       */
+      public Builder clearMessage() {
+        
+        message_ = getDefaultInstance().getMessage();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string message = 1;</code>
+       */
+      public Builder setMessageBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        message_ = value;
+        onChanged();
+        return this;
+      }
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return this;
+      }
+
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return this;
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:ErrorResponse)
+    }
+
+    // @@protoc_insertion_point(class_scope:ErrorResponse)
+    private static final org.apache.calcite.avatica.proto.Responses.ErrorResponse defaultInstance;static {
+      defaultInstance = new org.apache.calcite.avatica.proto.Responses.ErrorResponse();
+    }
+
+    public static org.apache.calcite.avatica.proto.Responses.ErrorResponse getDefaultInstance() {
+      return defaultInstance;
+    }
+
+    public org.apache.calcite.avatica.proto.Responses.ErrorResponse getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+
+  }
+
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_ResultSetResponse_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_ResultSetResponse_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_ExecuteResponse_descriptor;
   private static
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_ExecuteResponse_fieldAccessorTable;
@@ -5664,6 +6406,11 @@ package org.apache.calcite.avatica.proto;
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_CloseStatementResponse_fieldAccessorTable;
   private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_OpenConnectionResponse_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_OpenConnectionResponse_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_CloseConnectionResponse_descriptor;
   private static
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
@@ -5683,6 +6430,11 @@ package org.apache.calcite.avatica.proto;
   private static
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_DatabasePropertyResponse_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_ErrorResponse_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_ErrorResponse_fieldAccessorTable;
 
   public static com.google.protobuf.Descriptors.FileDescriptor
       getDescriptor() {
@@ -5703,14 +6455,16 @@ package org.apache.calcite.avatica.proto;
       "etchResponse\022\025\n\005frame\030\001 \001(\0132\006.Frame\"F\n\027C" +
       "reateStatementResponse\022\025\n\rconnection_id\030",
       "\001 \001(\t\022\024\n\014statement_id\030\002 \001(\r\"\030\n\026CloseStat" +
-      "ementResponse\"\031\n\027CloseConnectionResponse" +
-      "\"C\n\026ConnectionSyncResponse\022)\n\nconn_props" +
-      "\030\001 \001(\0132\025.ConnectionProperties\"U\n\027Databas" +
-      "ePropertyElement\022\036\n\003key\030\001 \001(\0132\021.Database" +
-      "Property\022\032\n\005value\030\002 \001(\0132\013.TypedValue\"C\n\030" +
-      "DatabasePropertyResponse\022\'\n\005props\030\001 \003(\0132" +
-      "\030.DatabasePropertyElementB\"\n org.apache." +
-      "calcite.avatica.protob\006proto3"
+      "ementResponse\"\030\n\026OpenConnectionResponse\"" +
+      "\031\n\027CloseConnectionResponse\"C\n\026Connection" +
+      "SyncResponse\022)\n\nconn_props\030\001 \001(\0132\025.Conne" +
+      "ctionProperties\"U\n\027DatabasePropertyEleme" +
+      "nt\022\036\n\003key\030\001 \001(\0132\021.DatabaseProperty\022\032\n\005va" +
+      "lue\030\002 \001(\0132\013.TypedValue\"C\n\030DatabaseProper" +
+      "tyResponse\022\'\n\005props\030\001 \003(\0132\030.DatabaseProp" +
+      "ertyElement\" \n\rErrorResponse\022\017\n\007message\030" +
+      "\001 \001(\tB\"\n org.apache.calcite.avatica.prot",
+      "ob\006proto3"
     };
     com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
         new com.google.protobuf.Descriptors.FileDescriptor.    InternalDescriptorAssigner() {
@@ -5761,30 +6515,42 @@ package org.apache.calcite.avatica.proto;
       com.google.protobuf.GeneratedMessage.FieldAccessorTable(
         internal_static_CloseStatementResponse_descriptor,
         new java.lang.String[] { });
-    internal_static_CloseConnectionResponse_descriptor =
+    internal_static_OpenConnectionResponse_descriptor =
       getDescriptor().getMessageTypes().get(6);
+    internal_static_OpenConnectionResponse_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+        internal_static_OpenConnectionResponse_descriptor,
+        new java.lang.String[] { });
+    internal_static_CloseConnectionResponse_descriptor =
+      getDescriptor().getMessageTypes().get(7);
     internal_static_CloseConnectionResponse_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessage.FieldAccessorTable(
         internal_static_CloseConnectionResponse_descriptor,
         new java.lang.String[] { });
     internal_static_ConnectionSyncResponse_descriptor =
-      getDescriptor().getMessageTypes().get(7);
+      getDescriptor().getMessageTypes().get(8);
     internal_static_ConnectionSyncResponse_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessage.FieldAccessorTable(
         internal_static_ConnectionSyncResponse_descriptor,
         new java.lang.String[] { "ConnProps", });
     internal_static_DatabasePropertyElement_descriptor =
-      getDescriptor().getMessageTypes().get(8);
+      getDescriptor().getMessageTypes().get(9);
     internal_static_DatabasePropertyElement_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessage.FieldAccessorTable(
         internal_static_DatabasePropertyElement_descriptor,
         new java.lang.String[] { "Key", "Value", });
     internal_static_DatabasePropertyResponse_descriptor =
-      getDescriptor().getMessageTypes().get(9);
+      getDescriptor().getMessageTypes().get(10);
     internal_static_DatabasePropertyResponse_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessage.FieldAccessorTable(
         internal_static_DatabasePropertyResponse_descriptor,
         new java.lang.String[] { "Props", });
+    internal_static_ErrorResponse_descriptor =
+      getDescriptor().getMessageTypes().get(11);
+    internal_static_ErrorResponse_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+        internal_static_ErrorResponse_descriptor,
+        new java.lang.String[] { "Message", });
     org.apache.calcite.avatica.proto.Common.getDescriptor();
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/avatica/src/main/java/org/apache/calcite/avatica/remote/Driver.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/Driver.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/Driver.java
index 7d8c058..ea5561d 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/Driver.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/Driver.java
@@ -26,10 +26,15 @@ import org.apache.calcite.avatica.UnregisteredDriver;
 
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.sql.Connection;
+import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.Properties;
 
 /**
  * Avatica Remote JDBC driver.
@@ -76,6 +81,15 @@ public class Driver extends UnregisteredDriver {
 
   @Override public Meta createMeta(AvaticaConnection connection) {
     final ConnectionConfig config = connection.config();
+    final Service service = createService(config);
+    return new RemoteMeta(connection, service);
+  }
+
+  private Service createService(ConnectionConfig config) {
+    // Exploit that none of the factory implementations currently rely
+    // on connection being there.
+    AvaticaConnection connection = null;
+
     final Service.Factory metaFactory = config.factory();
     final Service service;
     if (metaFactory != null) {
@@ -103,7 +117,40 @@ public class Driver extends UnregisteredDriver {
     } else {
       service = new MockJsonService(Collections.<String, String>emptyMap());
     }
-    return new RemoteMeta(connection, service);
+    return service;
+  }
+
+  @Override
+  public Connection connect(String url, Properties info) throws SQLException {
+    AvaticaConnection conn = (AvaticaConnection) super.connect(url, info);
+    if (conn == null) {
+      // It's not an url for our driver
+      return null;
+    }
+
+    // Create the corresponding remote connection
+    ConnectionConfig config = conn.config();
+    Service service = createService(config);
+
+    Map<String, String> infoAsString = new HashMap<>();
+    for (Map.Entry<Object, Object> entry : info.entrySet()) {
+      // Determine if this is a property we want to forward to the server
+      boolean localProperty = false;
+      for (BuiltInConnectionProperty prop : BuiltInConnectionProperty.values()) {
+        if (prop.camelName().equals(entry.getKey())) {
+          localProperty = true;
+          break;
+        }
+      }
+
+      if (!localProperty) {
+        infoAsString.put(entry.getKey().toString(), entry.getValue().toString());
+      }
+    }
+
+    service.apply(new Service.OpenConnectionRequest(conn.id, infoAsString));
+
+    return conn;
   }
 
   private Serialization getSerialization(ConnectionConfig config) {

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/avatica/src/main/java/org/apache/calcite/avatica/remote/JsonHandler.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/JsonHandler.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/JsonHandler.java
index f59218f..be1f5a7 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/JsonHandler.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/JsonHandler.java
@@ -51,7 +51,13 @@ public class JsonHandler implements Handler<String> {
     return MAPPER.readValue(request, valueType);
   }
 
-  private <T> String encode(T response) throws IOException {
+  /**
+   * Serializes the provided object as JSON.
+   *
+   * @param response The object to serialize.
+   * @return A JSON string.
+   */
+  public <T> String encode(T response) throws IOException {
     final StringWriter w = new StringWriter();
     MAPPER.writeValue(w, response);
     return w.toString();

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/avatica/src/main/java/org/apache/calcite/avatica/remote/JsonService.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/JsonService.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/JsonService.java
index b56ed4a..1bdb4a6 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/JsonService.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/JsonService.java
@@ -156,6 +156,14 @@ public abstract class JsonService extends AbstractService {
     }
   }
 
+  public OpenConnectionResponse apply(OpenConnectionRequest request) {
+    try {
+      return decode(apply(encode(request)), OpenConnectionResponse.class);
+    } catch (IOException e) {
+      throw handle(e);
+    }
+  }
+
   public CloseConnectionResponse apply(CloseConnectionRequest request) {
     try {
       return decode(apply(encode(request)), CloseConnectionResponse.class);

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/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 12006ba..34bdf97 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
@@ -110,19 +110,22 @@ public class LocalService implements Service {
   }
 
   public ResultSetResponse apply(CatalogsRequest request) {
-    final Meta.MetaResultSet resultSet = meta.getCatalogs();
+    final Meta.MetaResultSet resultSet =
+        meta.getCatalogs(new Meta.ConnectionHandle(request.connectionId));
     return toResponse(resultSet);
   }
 
   public ResultSetResponse apply(SchemasRequest request) {
     final Meta.MetaResultSet resultSet =
-        meta.getSchemas(request.catalog, Meta.Pat.of(request.schemaPattern));
+        meta.getSchemas(new Meta.ConnectionHandle(request.connectionId),
+            request.catalog, Meta.Pat.of(request.schemaPattern));
     return toResponse(resultSet);
   }
 
   public ResultSetResponse apply(TablesRequest request) {
     final Meta.MetaResultSet resultSet =
-        meta.getTables(request.catalog,
+        meta.getTables(new Meta.ConnectionHandle(request.connectionId),
+            request.catalog,
             Meta.Pat.of(request.schemaPattern),
             Meta.Pat.of(request.tableNamePattern),
             request.typeList);
@@ -130,18 +133,22 @@ public class LocalService implements Service {
   }
 
   public ResultSetResponse apply(TableTypesRequest request) {
-    final Meta.MetaResultSet resultSet = meta.getTableTypes();
+    final Meta.MetaResultSet resultSet = meta.getTableTypes(
+        new Meta.ConnectionHandle(request.connectionId));
     return toResponse(resultSet);
   }
 
   public ResultSetResponse apply(TypeInfoRequest request) {
-    final Meta.MetaResultSet resultSet = meta.getTypeInfo();
+    final Meta.MetaResultSet resultSet = meta.getTypeInfo(
+        new Meta.ConnectionHandle(request.connectionId));
     return toResponse(resultSet);
   }
 
   public ResultSetResponse apply(ColumnsRequest request) {
     final Meta.MetaResultSet resultSet =
-        meta.getColumns(request.catalog,
+        meta.getColumns(
+            new Meta.ConnectionHandle(request.connectionId),
+            request.catalog,
             Meta.Pat.of(request.schemaPattern),
             Meta.Pat.of(request.tableNamePattern),
             Meta.Pat.of(request.columnNamePattern));
@@ -217,6 +224,11 @@ public class LocalService implements Service {
     return new CloseStatementResponse();
   }
 
+  public OpenConnectionResponse apply(OpenConnectionRequest request) {
+    meta.openConnection(new Meta.ConnectionHandle(request.connectionId), request.info);
+    return new OpenConnectionResponse();
+  }
+
   public CloseConnectionResponse apply(CloseConnectionRequest request) {
     meta.closeConnection(new Meta.ConnectionHandle(request.connectionId));
     return new CloseConnectionResponse();
@@ -229,7 +241,8 @@ public class LocalService implements Service {
   }
 
   public DatabasePropertyResponse apply(DatabasePropertyRequest request) {
-    return new DatabasePropertyResponse(meta.getDatabaseProperties());
+    return new DatabasePropertyResponse(meta.getDatabaseProperties(
+        new Meta.ConnectionHandle(request.connectionId)));
   }
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/avatica/src/main/java/org/apache/calcite/avatica/remote/MockJsonService.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/MockJsonService.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/MockJsonService.java
index 6e278a1..6d87122 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/MockJsonService.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/MockJsonService.java
@@ -18,6 +18,9 @@ package org.apache.calcite.avatica.remote;
 
 import org.apache.calcite.avatica.AvaticaConnection;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -30,16 +33,14 @@ import java.util.Map;
  */
 public class MockJsonService extends JsonService {
   private final Map<String, String> map;
+  private final ObjectMapper mapper = new ObjectMapper();
 
   public MockJsonService(Map<String, String> map) {
     this.map = map;
   }
 
   @Override public String apply(String request) {
-    String response = map.get(request);
-    if (response == null) {
-      response = handleCloseConnection(request);
-    }
+    String response = map.get(canonicalizeConnectionId(request));
     if (response == null) {
       throw new RuntimeException("No response for " + request);
     }
@@ -47,14 +48,22 @@ public class MockJsonService extends JsonService {
   }
 
   /**
-   * Special case for closeConnection because connection IDs are random.
-   * @return response if is a CloseConnectionRequest, null otherwise.
+   * The connection id is always different, therefore when present in the request,
+   * set it to 0.
    */
-  private static String handleCloseConnection(String request) {
-    if (request.contains("closeConnection")) {
-      return "{\"response\":\"closeConnection\"}";
+  private String canonicalizeConnectionId(String request) {
+    ObjectNode jsonRequest;
+    try {
+      jsonRequest = (ObjectNode) mapper.readTree(request);
+    } catch (IOException e) {
+      throw new RuntimeException(e);
+    }
+    if (jsonRequest.get("connectionId") != null) {
+      jsonRequest.put("connectionId", "0");
+      return jsonRequest.toString();
+    } else {
+      return request;
     }
-    return null;
   }
 
   /** Factory that creates a {@code MockJsonService}. */
@@ -63,14 +72,20 @@ public class MockJsonService extends JsonService {
       final Map<String, String> map1 = new HashMap<>();
       try {
         map1.put(
+            "{\"request\":\"openConnection\",\"connectionId\":\"0\",\"info\":{}}",
+            "{\"response\":\"openConnection\"}");
+        map1.put(
+            "{\"request\":\"closeConnection\",\"connectionId\":\"0\"}",
+            "{\"response\":\"closeConnection\"}");
+        map1.put(
             "{\"request\":\"getSchemas\",\"catalog\":null,\"schemaPattern\":{\"s\":null}}",
             "{\"response\":\"resultSet\", updateCount: -1, firstFrame: {offset: 0, done: true, rows: []}}");
         map1.put(
-            JsonService.encode(new SchemasRequest(null, null)),
+            JsonService.encode(new SchemasRequest("0", null, null)),
             "{\"response\":\"resultSet\", updateCount: -1, firstFrame: {offset: 0, done: true, rows: []}}");
         map1.put(
             JsonService.encode(
-                new TablesRequest(null, null, null, Arrays.<String>asList())),
+                new TablesRequest("0", null, null, null, Arrays.<String>asList())),
             "{\"response\":\"resultSet\", updateCount: -1, firstFrame: {offset: 0, done: true, rows: []}}");
         map1.put(
             "{\"request\":\"createStatement\",\"connectionId\":0}",

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/avatica/src/main/java/org/apache/calcite/avatica/remote/MockProtobufService.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/MockProtobufService.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/MockProtobufService.java
index d031527..fe357fd 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/MockProtobufService.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/MockProtobufService.java
@@ -40,13 +40,17 @@ public class MockProtobufService extends ProtobufService {
 
     // Add in mappings
 
+    mappings.put(
+        new OpenConnectionRequest("0", new HashMap<String, String>()),
+        new OpenConnectionResponse());
+
     // Get the schema, no.. schema..?
     mappings.put(
-        new SchemasRequest(null, null),
+        new SchemasRequest("0", null, null),
         new ResultSetResponse(null, 1, true, null, Meta.Frame.EMPTY, -1));
 
     // Get the tables, no tables exist
-    mappings.put(new TablesRequest(null, null, null, Collections.<String>emptyList()),
+    mappings.put(new TablesRequest("0", null, null, null, Collections.<String>emptyList()),
         new ResultSetResponse(null, 150, true, null, Meta.Frame.EMPTY, -1));
 
     // Create a statement, get back an id
@@ -109,6 +113,19 @@ public class MockProtobufService extends ProtobufService {
    * @throws RuntimeException if no mapping is found for the request
    */
   private Response dispatch(Request request) {
+    // Canonicalize connectionId's to 0
+    if (request instanceof OpenConnectionRequest) {
+      OpenConnectionRequest req = (OpenConnectionRequest) request;
+      request = new OpenConnectionRequest("0", req.info);
+    } else if (request instanceof TablesRequest) {
+      TablesRequest req = (TablesRequest) request;
+      request = new TablesRequest("0", req.catalog, req.schemaPattern,
+          req.tableNamePattern, req.typeList);
+    } else if (request instanceof SchemasRequest) {
+      SchemasRequest req = (SchemasRequest) request;
+      request = new SchemasRequest("0", req.catalog, req.schemaPattern);
+    }
+
     Response response = MAPPING.get(request);
 
     if (null == response) {

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/avatica/src/main/java/org/apache/calcite/avatica/remote/ProtobufService.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/ProtobufService.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/ProtobufService.java
index 2ab7fa0..e41e9f6 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/ProtobufService.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/ProtobufService.java
@@ -74,6 +74,11 @@ public abstract class ProtobufService extends AbstractService {
     return (CloseStatementResponse) _apply(request);
   }
 
+  @Override
+  public OpenConnectionResponse apply(OpenConnectionRequest request) {
+    return (OpenConnectionResponse) _apply(request);
+  }
+
   @Override public CloseConnectionResponse apply(CloseConnectionRequest request) {
     return (CloseConnectionResponse) _apply(request);
   }

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/avatica/src/main/java/org/apache/calcite/avatica/remote/ProtobufTranslationImpl.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/ProtobufTranslationImpl.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/ProtobufTranslationImpl.java
index bfe4aca..a121ad3 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/ProtobufTranslationImpl.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/ProtobufTranslationImpl.java
@@ -26,6 +26,7 @@ import org.apache.calcite.avatica.proto.Requests.CreateStatementRequest;
 import org.apache.calcite.avatica.proto.Requests.DatabasePropertyRequest;
 import org.apache.calcite.avatica.proto.Requests.ExecuteRequest;
 import org.apache.calcite.avatica.proto.Requests.FetchRequest;
+import org.apache.calcite.avatica.proto.Requests.OpenConnectionRequest;
 import org.apache.calcite.avatica.proto.Requests.PrepareAndExecuteRequest;
 import org.apache.calcite.avatica.proto.Requests.PrepareRequest;
 import org.apache.calcite.avatica.proto.Requests.SchemasRequest;
@@ -37,8 +38,10 @@ import org.apache.calcite.avatica.proto.Responses.CloseStatementResponse;
 import org.apache.calcite.avatica.proto.Responses.ConnectionSyncResponse;
 import org.apache.calcite.avatica.proto.Responses.CreateStatementResponse;
 import org.apache.calcite.avatica.proto.Responses.DatabasePropertyResponse;
+import org.apache.calcite.avatica.proto.Responses.ErrorResponse;
 import org.apache.calcite.avatica.proto.Responses.ExecuteResponse;
 import org.apache.calcite.avatica.proto.Responses.FetchResponse;
+import org.apache.calcite.avatica.proto.Responses.OpenConnectionResponse;
 import org.apache.calcite.avatica.proto.Responses.PrepareResponse;
 import org.apache.calcite.avatica.proto.Responses.ResultSetResponse;
 import org.apache.calcite.avatica.remote.Service.Request;
@@ -69,6 +72,8 @@ public class ProtobufTranslationImpl implements ProtobufTranslation {
     HashMap<String, RequestTranslator> reqParsers = new HashMap<>();
     reqParsers.put(CatalogsRequest.class.getName(),
         new RequestTranslator(CatalogsRequest.PARSER, new Service.CatalogsRequest()));
+    reqParsers.put(OpenConnectionRequest.class.getName(),
+        new RequestTranslator(OpenConnectionRequest.PARSER, new Service.OpenConnectionRequest()));
     reqParsers.put(CloseConnectionRequest.class.getName(),
         new RequestTranslator(CloseConnectionRequest.PARSER, new Service.CloseConnectionRequest()));
     reqParsers.put(CloseStatementRequest.class.getName(),
@@ -103,6 +108,9 @@ public class ProtobufTranslationImpl implements ProtobufTranslation {
     REQUEST_PARSERS = Collections.unmodifiableMap(reqParsers);
 
     HashMap<String, ResponseTranslator> respParsers = new HashMap<>();
+    respParsers.put(OpenConnectionResponse.class.getName(),
+        new ResponseTranslator(OpenConnectionResponse.PARSER,
+            new Service.OpenConnectionResponse()));
     respParsers.put(CloseConnectionResponse.class.getName(),
         new ResponseTranslator(CloseConnectionResponse.PARSER,
             new Service.CloseConnectionResponse()));
@@ -126,6 +134,8 @@ public class ProtobufTranslationImpl implements ProtobufTranslation {
         new ResponseTranslator(PrepareResponse.PARSER, new Service.PrepareResponse()));
     respParsers.put(ResultSetResponse.class.getName(),
         new ResponseTranslator(ResultSetResponse.PARSER, new Service.ResultSetResponse()));
+    respParsers.put(ErrorResponse.class.getName(),
+        new ResponseTranslator(ErrorResponse.PARSER, new Service.ErrorResponse()));
 
     RESPONSE_PARSERS = Collections.unmodifiableMap(respParsers);
   }

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/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 154d807..e82b7ef 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
@@ -64,12 +64,12 @@ class RemoteMeta extends MetaImpl {
         response.ownStatement, signature0, response.firstFrame);
   }
 
-  @Override public Map<DatabaseProperty, Object> getDatabaseProperties() {
+  @Override public Map<DatabaseProperty, Object> getDatabaseProperties(ConnectionHandle ch) {
     synchronized (this) {
       // Compute map on first use, and cache
       if (databaseProperties == null) {
         databaseProperties =
-            service.apply(new Service.DatabasePropertyRequest()).map;
+            service.apply(new Service.DatabasePropertyRequest(ch.id)).map;
       }
       return databaseProperties;
     }
@@ -88,6 +88,11 @@ class RemoteMeta extends MetaImpl {
         service.apply(new Service.CloseStatementRequest(h.connectionId, h.id));
   }
 
+  @Override public void openConnection(ConnectionHandle ch, Map<String, String> info) {
+    final Service.OpenConnectionResponse response =
+        service.apply(new Service.OpenConnectionRequest(ch.id, info));
+  }
+
   @Override public void closeConnection(ConnectionHandle ch) {
     final Service.CloseConnectionResponse response =
         service.apply(new Service.CloseConnectionRequest(ch.id));
@@ -117,44 +122,45 @@ class RemoteMeta extends MetaImpl {
     }
   }
 
-  @Override public MetaResultSet getCatalogs() {
+  @Override public MetaResultSet getCatalogs(ConnectionHandle ch) {
     final Service.ResultSetResponse response =
-        service.apply(new Service.CatalogsRequest());
+        service.apply(new Service.CatalogsRequest(ch.id));
     return toResultSet(MetaCatalog.class, response);
   }
 
-  @Override public MetaResultSet getSchemas(String catalog, Pat schemaPattern) {
+  @Override public MetaResultSet getSchemas(ConnectionHandle ch, String catalog,
+      Pat schemaPattern) {
     final Service.ResultSetResponse response =
-        service.apply(new Service.SchemasRequest(catalog, schemaPattern.s));
+        service.apply(new Service.SchemasRequest(ch.id, catalog, schemaPattern.s));
     return toResultSet(MetaSchema.class, response);
   }
 
-  @Override public MetaResultSet getTables(String catalog, Pat schemaPattern,
+  @Override public MetaResultSet getTables(ConnectionHandle ch, String catalog, Pat schemaPattern,
       Pat tableNamePattern, List<String> typeList) {
     final Service.ResultSetResponse response =
         service.apply(
-            new Service.TablesRequest(catalog, schemaPattern.s,
+            new Service.TablesRequest(ch.id, catalog, schemaPattern.s,
                 tableNamePattern.s, typeList));
     return toResultSet(MetaTable.class, response);
   }
 
-  @Override public MetaResultSet getTableTypes() {
+  @Override public MetaResultSet getTableTypes(ConnectionHandle ch) {
     final Service.ResultSetResponse response =
-        service.apply(new Service.TableTypesRequest());
+        service.apply(new Service.TableTypesRequest(ch.id));
     return toResultSet(MetaTableType.class, response);
   }
 
-  @Override public MetaResultSet getTypeInfo() {
+  @Override public MetaResultSet getTypeInfo(ConnectionHandle ch) {
     final Service.ResultSetResponse response =
-        service.apply(new Service.TypeInfoRequest());
+        service.apply(new Service.TypeInfoRequest(ch.id));
     return toResultSet(MetaTypeInfo.class, response);
   }
 
-  @Override public MetaResultSet getColumns(String catalog, Pat schemaPattern,
+  @Override public MetaResultSet getColumns(ConnectionHandle ch, String catalog, Pat schemaPattern,
       Pat tableNamePattern, Pat columnNamePattern) {
     final Service.ResultSetResponse response =
         service.apply(
-            new Service.ColumnsRequest(catalog, schemaPattern.s,
+            new Service.ColumnsRequest(ch.id, catalog, schemaPattern.s,
                 tableNamePattern.s, columnNamePattern.s));
     return toResultSet(MetaColumn.class, response);
   }

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteProtobufService.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteProtobufService.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteProtobufService.java
index cb1a468..8cf0f0d 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteProtobufService.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteProtobufService.java
@@ -52,7 +52,14 @@ public class RemoteProtobufService extends ProtobufService {
       }
       final int responseCode = connection.getResponseCode();
       if (responseCode != HttpURLConnection.HTTP_OK) {
-        throw new RuntimeException("response code " + responseCode);
+        InputStream errorStream = connection.getErrorStream();
+        if (errorStream != null) {
+          byte[] errorResponse = AvaticaUtils.readFullyToBytes(errorStream);
+          ErrorResponse response = (ErrorResponse) translation.parseResponse(errorResponse);
+          throw new RuntimeException("Remote driver error: " + response.message);
+        } else {
+          throw new RuntimeException("response code " + responseCode);
+        }
       }
       final InputStream inputStream = connection.getInputStream();
       // Read the (serialized protobuf) response off the wire and convert it back to a Response

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a63639b1/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteService.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteService.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteService.java
index a5896f2..298aa95 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteService.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteService.java
@@ -53,9 +53,16 @@ public class RemoteService extends JsonService {
           wr.close();
         }
       }
-      final int responseCode = connection.getResponseCode();
+      int responseCode = connection.getResponseCode();
       if (responseCode != HttpURLConnection.HTTP_OK) {
-        throw new RuntimeException("response code " + responseCode);
+        InputStream errorStream = connection.getErrorStream();
+        if (errorStream != null) {
+          String errorResponse = AvaticaUtils.readFully(errorStream);
+          ErrorResponse response = decode(errorResponse, ErrorResponse.class);
+          throw new RuntimeException("Remote driver error: " + response.message);
+        } else {
+          throw new RuntimeException("response code " + responseCode);
+        }
       }
       final InputStream inputStream = connection.getInputStream();
       return AvaticaUtils.readFully(inputStream);