[CALCITE-767] Create commit and rollback Avatica RPC endpoints

Includes cleanup to Service pojos and protobuf translation code.

Closes apache/calcite#177


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

Branch: refs/heads/master
Commit: 322b97300d460cf7c98b6002e4f0d5dab455f188
Parents: 82fd259
Author: Josh Elser <[email protected]>
Authored: Thu Dec 10 19:30:04 2015 -0500
Committer: Josh Elser <[email protected]>
Committed: Tue Dec 15 22:57:14 2015 -0500

----------------------------------------------------------------------
 .../apache/calcite/avatica/jdbc/JdbcMeta.java   |  18 +
 .../calcite/avatica/remote/RemoteMetaTest.java  |  87 ++
 .../calcite/avatica/AvaticaConnection.java      |   4 +-
 .../java/org/apache/calcite/avatica/Meta.java   |  16 +
 .../apache/calcite/avatica/proto/Requests.java  | 942 ++++++++++++++++++-
 .../apache/calcite/avatica/proto/Responses.java | 673 ++++++++++++-
 .../calcite/avatica/remote/JsonService.java     |  16 +
 .../calcite/avatica/remote/LocalService.java    |  14 +
 .../calcite/avatica/remote/ProtobufService.java |  27 +
 .../avatica/remote/ProtobufTranslationImpl.java |  12 +
 .../calcite/avatica/remote/RemoteMeta.java      |  20 +
 .../apache/calcite/avatica/remote/Service.java  | 473 ++++++----
 avatica/src/main/protobuf/requests.proto        |  11 +-
 avatica/src/main/protobuf/responses.proto       |  12 +-
 .../avatica/remote/ProtobufServiceTest.java     |  58 ++
 .../remote/ProtobufTranslationImplTest.java     |  10 +
 .../calcite/avatica/test/JsonHandlerTest.java   |   8 +
 .../apache/calcite/jdbc/CalciteMetaImpl.java    |   8 +
 site/_docs/avatica_json_reference.md            |  46 +
 19 files changed, 2257 insertions(+), 198 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/322b9730/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 6f1339f..9ff7cc9 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
@@ -832,6 +832,24 @@ public class JdbcMeta implements Meta {
     }
   }
 
+  @Override public void commit(ConnectionHandle ch) {
+    try {
+      final Connection conn = getConnection(ch.id);
+      conn.commit();
+    } catch (SQLException e) {
+      throw propagate(e);
+    }
+  }
+
+  @Override public void rollback(ConnectionHandle ch) {
+    try {
+      final Connection conn = getConnection(ch.id);
+      conn.rollback();
+    } catch (SQLException e) {
+      throw propagate(e);
+    }
+  }
+
   /** Configurable statement cache settings. */
   public enum StatementCacheSettings {
     /** JDBC connection property for setting connection cache concurrency 
level. */

http://git-wip-us.apache.org/repos/asf/calcite/blob/322b9730/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 fbc91e6..bb57692 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
@@ -506,6 +506,93 @@ public class RemoteMetaTest {
     }
   }
 
+  @Test public void testCommitRollback() throws Exception {
+    final String productTable = "commitrollback_products";
+    final String salesTable = "commitrollback_sales";
+    ConnectionSpec.getDatabaseLock().lock();
+    try (final Connection conn = DriverManager.getConnection(url);
+        final Statement stmt = conn.createStatement()) {
+      assertFalse(stmt.execute("DROP TABLE IF EXISTS " + productTable));
+      assertFalse(stmt.execute(
+          String.format("CREATE TABLE %s(id integer, stock integer)", 
productTable)));
+      assertFalse(stmt.execute("DROP TABLE IF EXISTS " + salesTable));
+      assertFalse(stmt.execute(
+          String.format("CREATE TABLE %s(id integer, units_sold integer)", 
salesTable)));
+
+      final int productId = 1;
+      // No products and no sales
+      assertFalse(stmt.execute(
+          String.format("INSERT INTO %s VALUES(%d, 0)", productTable, 
productId)));
+      assertFalse(stmt.execute(
+          String.format("INSERT INTO %s VALUES(%d, 0)", salesTable, 
productId)));
+
+      conn.setAutoCommit(false);
+      PreparedStatement productStmt = conn.prepareStatement(String.format(
+          "UPDATE %s SET stock = stock + ? WHERE id = ?", productTable));
+      PreparedStatement salesStmt = conn.prepareStatement(String.format(
+          "UPDATE %s SET units_sold = units_sold + ? WHERE id = ?", 
salesTable));
+
+      // No stock
+      assertEquals(0, getInventory(conn, productTable, productId));
+
+      // Set a stock of 10 for product 1
+      productStmt.setInt(1, 10);
+      productStmt.setInt(2, productId);
+      productStmt.executeUpdate();
+
+      conn.commit();
+      assertEquals(10, getInventory(conn, productTable, productId));
+
+      // Sold 5 items (5 in stock, 5 sold)
+      productStmt.setInt(1, -5);
+      productStmt.setInt(2, productId);
+      productStmt.executeUpdate();
+      salesStmt.setInt(1, 5);
+      salesStmt.setInt(2, productId);
+      salesStmt.executeUpdate();
+
+      conn.commit();
+      // We will definitely see the updated values
+      assertEquals(5, getInventory(conn, productTable, productId));
+      assertEquals(5, getSales(conn, salesTable, productId));
+
+      // Update some "bad" values
+      productStmt.setInt(1, -10);
+      productStmt.setInt(2, productId);
+      productStmt.executeUpdate();
+      salesStmt.setInt(1, 10);
+      salesStmt.setInt(2, productId);
+      salesStmt.executeUpdate();
+
+      // We just went negative, nonsense. Better rollback.
+      conn.rollback();
+
+      // Should still have 5 and 5
+      assertEquals(5, getInventory(conn, productTable, productId));
+      assertEquals(5, getSales(conn, salesTable, productId));
+    } finally {
+      ConnectionSpec.getDatabaseLock().unlock();
+    }
+  }
+
+  private int getInventory(Connection conn, String productTable, int 
productId) throws Exception {
+    try (Statement stmt = conn.createStatement()) {
+      ResultSet results = stmt.executeQuery(String.format(
+          "SELECT stock FROM %s WHERE id = %d", productTable, productId));
+      assertTrue(results.next());
+      return results.getInt(1);
+    }
+  }
+
+  private int getSales(Connection conn, String salesTable, int productId) 
throws Exception {
+    try (Statement stmt = conn.createStatement()) {
+      ResultSet results = stmt.executeQuery(String.format(
+          "SELECT units_sold FROM %s WHERE id = %d", salesTable, productId));
+      assertTrue(results.next());
+      return results.getInt(1);
+    }
+  }
+
   /** Factory that provides a {@link JdbcMeta}. */
   public static class FullyRemoteJdbcMetaFactory implements Meta.Factory {
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/322b9730/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 03f2aa1..1d35128 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaConnection.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaConnection.java
@@ -172,11 +172,11 @@ public abstract class AvaticaConnection implements 
Connection {
   }
 
   public void commit() throws SQLException {
-    throw helper.unsupported();
+    meta.commit(handle);
   }
 
   public void rollback() throws SQLException {
-    throw helper.unsupported();
+    meta.rollback(handle);
   }
 
   public void close() throws SQLException {

http://git-wip-us.apache.org/repos/asf/calcite/blob/322b9730/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 5ddacdb..a859608 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/Meta.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/Meta.java
@@ -289,6 +289,22 @@ public interface Meta {
   boolean syncResults(StatementHandle sh, QueryState state, long offset)
       throws NoSuchStatementException;
 
+  /**
+   * Makes all changes since the last commit/rollback permanent. Analogy to
+   * {@link Connection#commit()}.
+   *
+   * @param ch A reference to the real JDBC Connection.
+   */
+  void commit(ConnectionHandle ch);
+
+  /**
+   * Undoes all changes since the last commit/rollback. Analogy to
+   * {@link Connection#rollback()};
+   *
+   * @param ch A reference to the real JDBC Connection.
+   */
+  void rollback(ConnectionHandle ch);
+
   /** Sync client and server view of connection properties.
    *
    * <p>Note: this interface is considered "experimental" and may undergo 
further changes as this

http://git-wip-us.apache.org/repos/asf/calcite/blob/322b9730/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 e098322..6d34757 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
@@ -11121,6 +11121,920 @@ package org.apache.calcite.avatica.proto;
 
   }
 
+  public interface CommitRequestOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:CommitRequest)
+      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 CommitRequest}
+   *
+   * <pre>
+   * Request to invoke a commit on a Connection
+   * </pre>
+   */
+  public  static final class CommitRequest extends
+      com.google.protobuf.GeneratedMessage implements
+      // @@protoc_insertion_point(message_implements:CommitRequest)
+      CommitRequestOrBuilder {
+    // Use CommitRequest.newBuilder() to construct.
+    private CommitRequest(com.google.protobuf.GeneratedMessage.Builder<?> 
builder) {
+      super(builder);
+    }
+    private CommitRequest() {
+      connectionId_ = "";
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return com.google.protobuf.UnknownFieldSet.getDefaultInstance();
+    }
+    private CommitRequest(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+      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: {
+              String s = input.readStringRequireUtf8();
+
+              connectionId_ = s;
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw new RuntimeException(e.setUnfinishedMessage(this));
+      } catch (java.io.IOException e) {
+        throw new RuntimeException(
+            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_CommitRequest_descriptor;
+    }
+
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return 
org.apache.calcite.avatica.proto.Requests.internal_static_CommitRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              org.apache.calcite.avatica.proto.Requests.CommitRequest.class, 
org.apache.calcite.avatica.proto.Requests.CommitRequest.Builder.class);
+    }
+
+    public static final int CONNECTION_ID_FIELD_NUMBER = 1;
+    private volatile 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();
+        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 {
+      if (!getConnectionIdBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessage.writeString(output, 1, 
connectionId_);
+      }
+    }
+
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (!getConnectionIdBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(1, 
connectionId_);
+      }
+      memoizedSize = size;
+      return size;
+    }
+
+    private static final long serialVersionUID = 0L;
+    public static org.apache.calcite.avatica.proto.Requests.CommitRequest 
parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.calcite.avatica.proto.Requests.CommitRequest 
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.CommitRequest 
parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.calcite.avatica.proto.Requests.CommitRequest 
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.CommitRequest 
parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static org.apache.calcite.avatica.proto.Requests.CommitRequest 
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.CommitRequest 
parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input);
+    }
+    public static org.apache.calcite.avatica.proto.Requests.CommitRequest 
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.CommitRequest 
parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static org.apache.calcite.avatica.proto.Requests.CommitRequest 
parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder 
newBuilder(org.apache.calcite.avatica.proto.Requests.CommitRequest prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code CommitRequest}
+     *
+     * <pre>
+     * Request to invoke a commit on a Connection
+     * </pre>
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:CommitRequest)
+        org.apache.calcite.avatica.proto.Requests.CommitRequestOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return 
org.apache.calcite.avatica.proto.Requests.internal_static_CommitRequest_descriptor;
+      }
+
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return 
org.apache.calcite.avatica.proto.Requests.internal_static_CommitRequest_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                org.apache.calcite.avatica.proto.Requests.CommitRequest.class, 
org.apache.calcite.avatica.proto.Requests.CommitRequest.Builder.class);
+      }
+
+      // Construct using 
org.apache.calcite.avatica.proto.Requests.CommitRequest.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_CommitRequest_descriptor;
+      }
+
+      public org.apache.calcite.avatica.proto.Requests.CommitRequest 
getDefaultInstanceForType() {
+        return 
org.apache.calcite.avatica.proto.Requests.CommitRequest.getDefaultInstance();
+      }
+
+      public org.apache.calcite.avatica.proto.Requests.CommitRequest build() {
+        org.apache.calcite.avatica.proto.Requests.CommitRequest result = 
buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      public org.apache.calcite.avatica.proto.Requests.CommitRequest 
buildPartial() {
+        org.apache.calcite.avatica.proto.Requests.CommitRequest result = new 
org.apache.calcite.avatica.proto.Requests.CommitRequest(this);
+        result.connectionId_ = connectionId_;
+        onBuilt();
+        return result;
+      }
+
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof 
org.apache.calcite.avatica.proto.Requests.CommitRequest) {
+          return 
mergeFrom((org.apache.calcite.avatica.proto.Requests.CommitRequest)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder 
mergeFrom(org.apache.calcite.avatica.proto.Requests.CommitRequest other) {
+        if (other == 
org.apache.calcite.avatica.proto.Requests.CommitRequest.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.CommitRequest parsedMessage 
= null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = 
(org.apache.calcite.avatica.proto.Requests.CommitRequest) 
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();
+          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();
+  }
+  checkByteStringIsUtf8(value);
+        
+        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:CommitRequest)
+    }
+
+    // @@protoc_insertion_point(class_scope:CommitRequest)
+    private static final 
org.apache.calcite.avatica.proto.Requests.CommitRequest DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new 
org.apache.calcite.avatica.proto.Requests.CommitRequest();
+    }
+
+    public static org.apache.calcite.avatica.proto.Requests.CommitRequest 
getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<CommitRequest>
+        PARSER = new com.google.protobuf.AbstractParser<CommitRequest>() {
+      public CommitRequest parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new CommitRequest(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<CommitRequest> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<CommitRequest> getParserForType() {
+      return PARSER;
+    }
+
+    public org.apache.calcite.avatica.proto.Requests.CommitRequest 
getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface RollbackRequestOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:RollbackRequest)
+      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 RollbackRequest}
+   *
+   * <pre>
+   * Request to invoke rollback on a Connection
+   * </pre>
+   */
+  public  static final class RollbackRequest extends
+      com.google.protobuf.GeneratedMessage implements
+      // @@protoc_insertion_point(message_implements:RollbackRequest)
+      RollbackRequestOrBuilder {
+    // Use RollbackRequest.newBuilder() to construct.
+    private RollbackRequest(com.google.protobuf.GeneratedMessage.Builder<?> 
builder) {
+      super(builder);
+    }
+    private RollbackRequest() {
+      connectionId_ = "";
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return com.google.protobuf.UnknownFieldSet.getDefaultInstance();
+    }
+    private RollbackRequest(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+      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: {
+              String s = input.readStringRequireUtf8();
+
+              connectionId_ = s;
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw new RuntimeException(e.setUnfinishedMessage(this));
+      } catch (java.io.IOException e) {
+        throw new RuntimeException(
+            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_RollbackRequest_descriptor;
+    }
+
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return 
org.apache.calcite.avatica.proto.Requests.internal_static_RollbackRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              org.apache.calcite.avatica.proto.Requests.RollbackRequest.class, 
org.apache.calcite.avatica.proto.Requests.RollbackRequest.Builder.class);
+    }
+
+    public static final int CONNECTION_ID_FIELD_NUMBER = 1;
+    private volatile 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();
+        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 {
+      if (!getConnectionIdBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessage.writeString(output, 1, 
connectionId_);
+      }
+    }
+
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (!getConnectionIdBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessage.computeStringSize(1, 
connectionId_);
+      }
+      memoizedSize = size;
+      return size;
+    }
+
+    private static final long serialVersionUID = 0L;
+    public static org.apache.calcite.avatica.proto.Requests.RollbackRequest 
parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.calcite.avatica.proto.Requests.RollbackRequest 
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.RollbackRequest 
parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.calcite.avatica.proto.Requests.RollbackRequest 
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.RollbackRequest 
parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static org.apache.calcite.avatica.proto.Requests.RollbackRequest 
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.RollbackRequest 
parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input);
+    }
+    public static org.apache.calcite.avatica.proto.Requests.RollbackRequest 
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.RollbackRequest 
parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static org.apache.calcite.avatica.proto.Requests.RollbackRequest 
parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder 
newBuilder(org.apache.calcite.avatica.proto.Requests.RollbackRequest prototype) 
{
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code RollbackRequest}
+     *
+     * <pre>
+     * Request to invoke rollback on a Connection
+     * </pre>
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:RollbackRequest)
+        org.apache.calcite.avatica.proto.Requests.RollbackRequestOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return 
org.apache.calcite.avatica.proto.Requests.internal_static_RollbackRequest_descriptor;
+      }
+
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return 
org.apache.calcite.avatica.proto.Requests.internal_static_RollbackRequest_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                
org.apache.calcite.avatica.proto.Requests.RollbackRequest.class, 
org.apache.calcite.avatica.proto.Requests.RollbackRequest.Builder.class);
+      }
+
+      // Construct using 
org.apache.calcite.avatica.proto.Requests.RollbackRequest.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_RollbackRequest_descriptor;
+      }
+
+      public org.apache.calcite.avatica.proto.Requests.RollbackRequest 
getDefaultInstanceForType() {
+        return 
org.apache.calcite.avatica.proto.Requests.RollbackRequest.getDefaultInstance();
+      }
+
+      public org.apache.calcite.avatica.proto.Requests.RollbackRequest build() 
{
+        org.apache.calcite.avatica.proto.Requests.RollbackRequest result = 
buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      public org.apache.calcite.avatica.proto.Requests.RollbackRequest 
buildPartial() {
+        org.apache.calcite.avatica.proto.Requests.RollbackRequest result = new 
org.apache.calcite.avatica.proto.Requests.RollbackRequest(this);
+        result.connectionId_ = connectionId_;
+        onBuilt();
+        return result;
+      }
+
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof 
org.apache.calcite.avatica.proto.Requests.RollbackRequest) {
+          return 
mergeFrom((org.apache.calcite.avatica.proto.Requests.RollbackRequest)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder 
mergeFrom(org.apache.calcite.avatica.proto.Requests.RollbackRequest other) {
+        if (other == 
org.apache.calcite.avatica.proto.Requests.RollbackRequest.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.RollbackRequest 
parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = 
(org.apache.calcite.avatica.proto.Requests.RollbackRequest) 
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();
+          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();
+  }
+  checkByteStringIsUtf8(value);
+        
+        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:RollbackRequest)
+    }
+
+    // @@protoc_insertion_point(class_scope:RollbackRequest)
+    private static final 
org.apache.calcite.avatica.proto.Requests.RollbackRequest DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new 
org.apache.calcite.avatica.proto.Requests.RollbackRequest();
+    }
+
+    public static org.apache.calcite.avatica.proto.Requests.RollbackRequest 
getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<RollbackRequest>
+        PARSER = new com.google.protobuf.AbstractParser<RollbackRequest>() {
+      public RollbackRequest parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new RollbackRequest(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<RollbackRequest> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<RollbackRequest> getParserForType() {
+      return PARSER;
+    }
+
+    public org.apache.calcite.avatica.proto.Requests.RollbackRequest 
getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
   private static com.google.protobuf.Descriptors.Descriptor
     internal_static_CatalogsRequest_descriptor;
   private static
@@ -11211,6 +12125,16 @@ package org.apache.calcite.avatica.proto;
   private static
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_SyncResultsRequest_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_CommitRequest_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_CommitRequest_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_RollbackRequest_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_RollbackRequest_fieldAccessorTable;
 
   public static com.google.protobuf.Descriptors.FileDescriptor
       getDescriptor() {
@@ -11258,8 +12182,10 @@ package org.apache.calcite.avatica.proto;
       "\034\n\024has_parameter_values\030\004 \001(\010\"m\n\022SyncRes" +
       "ultsRequest\022\025\n\rconnection_id\030\001 \001(\t\022\024\n\014st" +
       "atement_id\030\002 \001(\r\022\032\n\005state\030\003 
\001(\0132\013.QueryS" +
-      "tate\022\016\n\006offset\030\004 \001(\004B\"\n org.apache.calci" +
-      "te.avatica.protob\006proto3"
+      "tate\022\016\n\006offset\030\004 
\001(\004\"&\n\rCommitRequest\022\025\n" +
+      "\rconnection_id\030\001 \001(\t\"(\n\017RollbackRequest\022",
+      "\025\n\rconnection_id\030\001 \001(\tB\"\n org.apache.cal" +
+      "cite.avatica.protob\006proto3"
     };
     com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner 
assigner =
         new com.google.protobuf.Descriptors.FileDescriptor.    
InternalDescriptorAssigner() {
@@ -11382,6 +12308,18 @@ package org.apache.calcite.avatica.proto;
       com.google.protobuf.GeneratedMessage.FieldAccessorTable(
         internal_static_SyncResultsRequest_descriptor,
         new java.lang.String[] { "ConnectionId", "StatementId", "State", 
"Offset", });
+    internal_static_CommitRequest_descriptor =
+      getDescriptor().getMessageTypes().get(17);
+    internal_static_CommitRequest_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+        internal_static_CommitRequest_descriptor,
+        new java.lang.String[] { "ConnectionId", });
+    internal_static_RollbackRequest_descriptor =
+      getDescriptor().getMessageTypes().get(18);
+    internal_static_RollbackRequest_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+        internal_static_RollbackRequest_descriptor,
+        new java.lang.String[] { "ConnectionId", });
     org.apache.calcite.avatica.proto.Common.getDescriptor();
   }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/322b9730/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 7df84b7..cd3d0cf 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
@@ -10961,6 +10961,652 @@ package org.apache.calcite.avatica.proto;
 
   }
 
+  public interface CommitResponseOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:CommitResponse)
+      com.google.protobuf.MessageOrBuilder {
+  }
+  /**
+   * Protobuf type {@code CommitResponse}
+   *
+   * <pre>
+   * Response to a commit request
+   * </pre>
+   */
+  public  static final class CommitResponse extends
+      com.google.protobuf.GeneratedMessage implements
+      // @@protoc_insertion_point(message_implements:CommitResponse)
+      CommitResponseOrBuilder {
+    // Use CommitResponse.newBuilder() to construct.
+    private CommitResponse(com.google.protobuf.GeneratedMessage.Builder<?> 
builder) {
+      super(builder);
+    }
+    private CommitResponse() {
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return com.google.protobuf.UnknownFieldSet.getDefaultInstance();
+    }
+    private CommitResponse(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+      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 new RuntimeException(e.setUnfinishedMessage(this));
+      } catch (java.io.IOException e) {
+        throw new RuntimeException(
+            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_CommitResponse_descriptor;
+    }
+
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return 
org.apache.calcite.avatica.proto.Responses.internal_static_CommitResponse_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              org.apache.calcite.avatica.proto.Responses.CommitResponse.class, 
org.apache.calcite.avatica.proto.Responses.CommitResponse.Builder.class);
+    }
+
+    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 {
+    }
+
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      memoizedSize = size;
+      return size;
+    }
+
+    private static final long serialVersionUID = 0L;
+    public static org.apache.calcite.avatica.proto.Responses.CommitResponse 
parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.CommitResponse 
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.CommitResponse 
parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.CommitResponse 
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.CommitResponse 
parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.CommitResponse 
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.CommitResponse 
parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.CommitResponse 
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.CommitResponse 
parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.CommitResponse 
parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder 
newBuilder(org.apache.calcite.avatica.proto.Responses.CommitResponse prototype) 
{
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code CommitResponse}
+     *
+     * <pre>
+     * Response to a commit request
+     * </pre>
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:CommitResponse)
+        org.apache.calcite.avatica.proto.Responses.CommitResponseOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return 
org.apache.calcite.avatica.proto.Responses.internal_static_CommitResponse_descriptor;
+      }
+
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return 
org.apache.calcite.avatica.proto.Responses.internal_static_CommitResponse_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                
org.apache.calcite.avatica.proto.Responses.CommitResponse.class, 
org.apache.calcite.avatica.proto.Responses.CommitResponse.Builder.class);
+      }
+
+      // Construct using 
org.apache.calcite.avatica.proto.Responses.CommitResponse.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_CommitResponse_descriptor;
+      }
+
+      public org.apache.calcite.avatica.proto.Responses.CommitResponse 
getDefaultInstanceForType() {
+        return 
org.apache.calcite.avatica.proto.Responses.CommitResponse.getDefaultInstance();
+      }
+
+      public org.apache.calcite.avatica.proto.Responses.CommitResponse build() 
{
+        org.apache.calcite.avatica.proto.Responses.CommitResponse result = 
buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      public org.apache.calcite.avatica.proto.Responses.CommitResponse 
buildPartial() {
+        org.apache.calcite.avatica.proto.Responses.CommitResponse result = new 
org.apache.calcite.avatica.proto.Responses.CommitResponse(this);
+        onBuilt();
+        return result;
+      }
+
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof 
org.apache.calcite.avatica.proto.Responses.CommitResponse) {
+          return 
mergeFrom((org.apache.calcite.avatica.proto.Responses.CommitResponse)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder 
mergeFrom(org.apache.calcite.avatica.proto.Responses.CommitResponse other) {
+        if (other == 
org.apache.calcite.avatica.proto.Responses.CommitResponse.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.CommitResponse 
parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = 
(org.apache.calcite.avatica.proto.Responses.CommitResponse) 
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:CommitResponse)
+    }
+
+    // @@protoc_insertion_point(class_scope:CommitResponse)
+    private static final 
org.apache.calcite.avatica.proto.Responses.CommitResponse DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new 
org.apache.calcite.avatica.proto.Responses.CommitResponse();
+    }
+
+    public static org.apache.calcite.avatica.proto.Responses.CommitResponse 
getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<CommitResponse>
+        PARSER = new com.google.protobuf.AbstractParser<CommitResponse>() {
+      public CommitResponse parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new CommitResponse(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<CommitResponse> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<CommitResponse> getParserForType() {
+      return PARSER;
+    }
+
+    public org.apache.calcite.avatica.proto.Responses.CommitResponse 
getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface RollbackResponseOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:RollbackResponse)
+      com.google.protobuf.MessageOrBuilder {
+  }
+  /**
+   * Protobuf type {@code RollbackResponse}
+   *
+   * <pre>
+   * Response to a rollback request
+   * </pre>
+   */
+  public  static final class RollbackResponse extends
+      com.google.protobuf.GeneratedMessage implements
+      // @@protoc_insertion_point(message_implements:RollbackResponse)
+      RollbackResponseOrBuilder {
+    // Use RollbackResponse.newBuilder() to construct.
+    private RollbackResponse(com.google.protobuf.GeneratedMessage.Builder<?> 
builder) {
+      super(builder);
+    }
+    private RollbackResponse() {
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return com.google.protobuf.UnknownFieldSet.getDefaultInstance();
+    }
+    private RollbackResponse(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+      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 new RuntimeException(e.setUnfinishedMessage(this));
+      } catch (java.io.IOException e) {
+        throw new RuntimeException(
+            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_RollbackResponse_descriptor;
+    }
+
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return 
org.apache.calcite.avatica.proto.Responses.internal_static_RollbackResponse_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              
org.apache.calcite.avatica.proto.Responses.RollbackResponse.class, 
org.apache.calcite.avatica.proto.Responses.RollbackResponse.Builder.class);
+    }
+
+    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 {
+    }
+
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      memoizedSize = size;
+      return size;
+    }
+
+    private static final long serialVersionUID = 0L;
+    public static org.apache.calcite.avatica.proto.Responses.RollbackResponse 
parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.RollbackResponse 
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.RollbackResponse 
parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.RollbackResponse 
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.RollbackResponse 
parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.RollbackResponse 
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.RollbackResponse 
parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.RollbackResponse 
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.RollbackResponse 
parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static org.apache.calcite.avatica.proto.Responses.RollbackResponse 
parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder 
newBuilder(org.apache.calcite.avatica.proto.Responses.RollbackResponse 
prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code RollbackResponse}
+     *
+     * <pre>
+     * Response to a rollback request
+     * </pre>
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:RollbackResponse)
+        org.apache.calcite.avatica.proto.Responses.RollbackResponseOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return 
org.apache.calcite.avatica.proto.Responses.internal_static_RollbackResponse_descriptor;
+      }
+
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return 
org.apache.calcite.avatica.proto.Responses.internal_static_RollbackResponse_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                
org.apache.calcite.avatica.proto.Responses.RollbackResponse.class, 
org.apache.calcite.avatica.proto.Responses.RollbackResponse.Builder.class);
+      }
+
+      // Construct using 
org.apache.calcite.avatica.proto.Responses.RollbackResponse.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_RollbackResponse_descriptor;
+      }
+
+      public org.apache.calcite.avatica.proto.Responses.RollbackResponse 
getDefaultInstanceForType() {
+        return 
org.apache.calcite.avatica.proto.Responses.RollbackResponse.getDefaultInstance();
+      }
+
+      public org.apache.calcite.avatica.proto.Responses.RollbackResponse 
build() {
+        org.apache.calcite.avatica.proto.Responses.RollbackResponse result = 
buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      public org.apache.calcite.avatica.proto.Responses.RollbackResponse 
buildPartial() {
+        org.apache.calcite.avatica.proto.Responses.RollbackResponse result = 
new org.apache.calcite.avatica.proto.Responses.RollbackResponse(this);
+        onBuilt();
+        return result;
+      }
+
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof 
org.apache.calcite.avatica.proto.Responses.RollbackResponse) {
+          return 
mergeFrom((org.apache.calcite.avatica.proto.Responses.RollbackResponse)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder 
mergeFrom(org.apache.calcite.avatica.proto.Responses.RollbackResponse other) {
+        if (other == 
org.apache.calcite.avatica.proto.Responses.RollbackResponse.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.RollbackResponse 
parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = 
(org.apache.calcite.avatica.proto.Responses.RollbackResponse) 
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:RollbackResponse)
+    }
+
+    // @@protoc_insertion_point(class_scope:RollbackResponse)
+    private static final 
org.apache.calcite.avatica.proto.Responses.RollbackResponse DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new 
org.apache.calcite.avatica.proto.Responses.RollbackResponse();
+    }
+
+    public static org.apache.calcite.avatica.proto.Responses.RollbackResponse 
getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<RollbackResponse>
+        PARSER = new com.google.protobuf.AbstractParser<RollbackResponse>() {
+      public RollbackResponse parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        try {
+          return new RollbackResponse(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<RollbackResponse> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<RollbackResponse> getParserForType() {
+      return PARSER;
+    }
+
+    public org.apache.calcite.avatica.proto.Responses.RollbackResponse 
getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
   private static com.google.protobuf.Descriptors.Descriptor
     internal_static_ResultSetResponse_descriptor;
   private static
@@ -11031,6 +11677,16 @@ package org.apache.calcite.avatica.proto;
   private static
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_RpcMetadata_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_CommitResponse_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_CommitResponse_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_RollbackResponse_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_RollbackResponse_fieldAccessorTable;
 
   public static com.google.protobuf.Descriptors.FileDescriptor
       getDescriptor() {
@@ -11077,8 +11733,9 @@ package org.apache.calcite.avatica.proto;
       "tsResponse\022\031\n\021missing_statement\030\001 \001(\010\022\024\n" +
       "\014more_results\030\002 \001(\010\022\036\n\010metadata\030\003 
\001(\0132\014." +
       "RpcMetadata\"%\n\013RpcMetadata\022\026\n\016server_add" +
-      "ress\030\001 \001(\tB\"\n org.apache.calcite.avatica" +
-      ".protob\006proto3"
+      "ress\030\001 \001(\t\"\020\n\016CommitResponse\"\022\n\020Rollback" +
+      "ResponseB\"\n org.apache.calcite.avatica.p" +
+      "rotob\006proto3"
     };
     com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner 
assigner =
         new com.google.protobuf.Descriptors.FileDescriptor.    
InternalDescriptorAssigner() {
@@ -11177,6 +11834,18 @@ package org.apache.calcite.avatica.proto;
       com.google.protobuf.GeneratedMessage.FieldAccessorTable(
         internal_static_RpcMetadata_descriptor,
         new java.lang.String[] { "ServerAddress", });
+    internal_static_CommitResponse_descriptor =
+      getDescriptor().getMessageTypes().get(14);
+    internal_static_CommitResponse_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+        internal_static_CommitResponse_descriptor,
+        new java.lang.String[] { });
+    internal_static_RollbackResponse_descriptor =
+      getDescriptor().getMessageTypes().get(15);
+    internal_static_RollbackResponse_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+        internal_static_RollbackResponse_descriptor,
+        new java.lang.String[] { });
     org.apache.calcite.avatica.proto.Common.getDescriptor();
   }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/322b9730/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 99cf79b..668b3be 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
@@ -206,6 +206,22 @@ public abstract class JsonService extends AbstractService {
       throw handle(e);
     }
   }
+
+  public CommitResponse apply(CommitRequest request) {
+    try {
+      return decode(apply(encode(request)), CommitResponse.class);
+    } catch (IOException e) {
+      throw handle(e);
+    }
+  }
+
+  public RollbackResponse apply(RollbackRequest request) {
+    try {
+      return decode(apply(encode(request)), RollbackResponse.class);
+    } catch (IOException e) {
+      throw handle(e);
+    }
+  }
 }
 
 // End JsonService.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/322b9730/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 c4a5893..e9c4367 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
@@ -300,6 +300,20 @@ public class LocalService implements Service {
 
     return response;
   }
+
+  public CommitResponse apply(CommitRequest request) {
+    meta.commit(new Meta.ConnectionHandle(request.connectionId));
+
+    // If commit() errors, let the ErrorResponse be sent back via an uncaught 
Exception.
+    return new CommitResponse();
+  }
+
+  public RollbackResponse apply(RollbackRequest request) {
+    meta.rollback(new Meta.ConnectionHandle(request.connectionId));
+
+    // If rollback() errors, let the ErrorResponse be sent back via an 
uncaught Exception.
+    return new RollbackResponse();
+  }
 }
 
 // End LocalService.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/322b9730/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 8a79fc5..741c34c 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
@@ -103,6 +103,14 @@ public abstract class ProtobufService extends 
AbstractService {
     return (SyncResultsResponse) _apply(request);
   }
 
+  @Override public CommitResponse apply(CommitRequest request) {
+    return (CommitResponse) _apply(request);
+  }
+
+  @Override public RollbackResponse apply(RollbackRequest request) {
+    return (RollbackResponse) _apply(request);
+  }
+
   /**
    * Determines whether the given message has the field, denoted by the 
provided number, set.
    *
@@ -114,6 +122,25 @@ public abstract class ProtobufService extends 
AbstractService {
   public static boolean hasField(Message msg, Descriptor desc, int fieldNum) {
     return msg.hasField(desc.findFieldByNumber(fieldNum));
   }
+
+  /**
+   * Checks if the provided {@link Message} is an instance of the Class given 
by
+   * <code>expectedType</code>. Throws an IllegalArgumentException if the 
message is not of the
+   * expected type, otherwise, it returns the message cast as the expected 
type.
+   *
+   * @param msg A Protocol Buffer message.
+   * @param expectedType The expected type of the Protocol Buffer message.
+   * @return The msg cast to the concrete Message type.
+   * @throws IllegalArgumentException If the type of the message is not the 
expectedType.
+   */
+  public static <T extends Message> T castProtobufMessage(Message msg, 
Class<T> expectedType) {
+    if (!expectedType.isInstance(msg)) {
+      throw new IllegalArgumentException("Expected instance of " + 
expectedType.getName()
+          + ", but got " + msg.getClass().getName());
+    }
+
+    return expectedType.cast(msg);
+  }
 }
 
 // End ProtobufService.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/322b9730/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 85d3a2b..646d706 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
@@ -21,6 +21,7 @@ import 
org.apache.calcite.avatica.proto.Requests.CatalogsRequest;
 import org.apache.calcite.avatica.proto.Requests.CloseConnectionRequest;
 import org.apache.calcite.avatica.proto.Requests.CloseStatementRequest;
 import org.apache.calcite.avatica.proto.Requests.ColumnsRequest;
+import org.apache.calcite.avatica.proto.Requests.CommitRequest;
 import org.apache.calcite.avatica.proto.Requests.ConnectionSyncRequest;
 import org.apache.calcite.avatica.proto.Requests.CreateStatementRequest;
 import org.apache.calcite.avatica.proto.Requests.DatabasePropertyRequest;
@@ -29,6 +30,7 @@ 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.RollbackRequest;
 import org.apache.calcite.avatica.proto.Requests.SchemasRequest;
 import org.apache.calcite.avatica.proto.Requests.SyncResultsRequest;
 import org.apache.calcite.avatica.proto.Requests.TableTypesRequest;
@@ -36,6 +38,7 @@ import 
org.apache.calcite.avatica.proto.Requests.TablesRequest;
 import org.apache.calcite.avatica.proto.Requests.TypeInfoRequest;
 import org.apache.calcite.avatica.proto.Responses.CloseConnectionResponse;
 import org.apache.calcite.avatica.proto.Responses.CloseStatementResponse;
+import org.apache.calcite.avatica.proto.Responses.CommitResponse;
 import org.apache.calcite.avatica.proto.Responses.ConnectionSyncResponse;
 import org.apache.calcite.avatica.proto.Responses.CreateStatementResponse;
 import org.apache.calcite.avatica.proto.Responses.DatabasePropertyResponse;
@@ -45,6 +48,7 @@ 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.proto.Responses.RollbackResponse;
 import org.apache.calcite.avatica.proto.Responses.RpcMetadata;
 import org.apache.calcite.avatica.proto.Responses.SyncResultsResponse;
 import org.apache.calcite.avatica.remote.Service.Request;
@@ -112,6 +116,10 @@ public class ProtobufTranslationImpl implements 
ProtobufTranslation {
         new RequestTranslator(ExecuteRequest.parser(), new 
Service.ExecuteRequest()));
     reqParsers.put(SyncResultsRequest.class.getName(),
         new RequestTranslator(SyncResultsRequest.parser(), new 
Service.SyncResultsRequest()));
+    reqParsers.put(CommitRequest.class.getName(),
+        new RequestTranslator(CommitRequest.parser(), new 
Service.CommitRequest()));
+    reqParsers.put(RollbackRequest.class.getName(),
+        new RequestTranslator(RollbackRequest.parser(), new 
Service.RollbackRequest()));
 
     REQUEST_PARSERS = Collections.unmodifiableMap(reqParsers);
 
@@ -148,6 +156,10 @@ public class ProtobufTranslationImpl implements 
ProtobufTranslation {
         new ResponseTranslator(SyncResultsResponse.parser(), new 
Service.SyncResultsResponse()));
     respParsers.put(RpcMetadata.class.getName(),
         new ResponseTranslator(RpcMetadata.parser(), new 
RpcMetadataResponse()));
+    respParsers.put(CommitResponse.class.getName(),
+        new ResponseTranslator(CommitResponse.parser(), new 
Service.CommitResponse()));
+    respParsers.put(RollbackResponse.class.getName(),
+        new ResponseTranslator(RollbackResponse.parser(), new 
Service.RollbackResponse()));
 
     RESPONSE_PARSERS = Collections.unmodifiableMap(respParsers);
   }

http://git-wip-us.apache.org/repos/asf/calcite/blob/322b9730/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 e741ffb..463985a 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
@@ -370,6 +370,26 @@ class RemoteMeta extends MetaImpl {
       throw e;
     }
   }
+
+  @Override public void commit(final ConnectionHandle ch) {
+    connection.invokeWithRetries(new CallableWithoutException<Void>() {
+      public Void call() {
+        final Service.CommitResponse response =
+            service.apply(new Service.CommitRequest(ch.id));
+        return null;
+      }
+    });
+  }
+
+  @Override public void rollback(final ConnectionHandle ch) {
+    connection.invokeWithRetries(new CallableWithoutException<Void>() {
+      public Void call() {
+        final Service.RollbackResponse response =
+            service.apply(new Service.RollbackRequest(ch.id));
+        return null;
+      }
+    });
+  }
 }
 
 // End RemoteMeta.java

Reply via email to