// Code generated by protoc-gen-go. DO NOT EDIT.
// source: requests.proto

package message

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// Request for Meta#getCatalogs()
type CatalogsRequest struct {
	ConnectionId string `protobuf:"bytes,1,opt,name=connection_id,json=connectionId" json:"connection_id,omitempty"`
}

func (m *CatalogsRequest) Reset()                    { *m = CatalogsRequest{} }
func (m *CatalogsRequest) String() string            { return proto.CompactTextString(m) }
func (*CatalogsRequest) ProtoMessage()               {}
func (*CatalogsRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{0} }

func (m *CatalogsRequest) GetConnectionId() string {
	if m != nil {
		return m.ConnectionId
	}
	return ""
}

// Request for Meta#getDatabaseProperties()
type DatabasePropertyRequest struct {
	ConnectionId string `protobuf:"bytes,1,opt,name=connection_id,json=connectionId" json:"connection_id,omitempty"`
}

func (m *DatabasePropertyRequest) Reset()                    { *m = DatabasePropertyRequest{} }
func (m *DatabasePropertyRequest) String() string            { return proto.CompactTextString(m) }
func (*DatabasePropertyRequest) ProtoMessage()               {}
func (*DatabasePropertyRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{1} }

func (m *DatabasePropertyRequest) GetConnectionId() string {
	if m != nil {
		return m.ConnectionId
	}
	return ""
}

// Request for Meta#getSchemas(String, org.apache.calcite.avatica.Meta.Pat)}
type SchemasRequest struct {
	Catalog       string `protobuf:"bytes,1,opt,name=catalog" json:"catalog,omitempty"`
	SchemaPattern string `protobuf:"bytes,2,opt,name=schema_pattern,json=schemaPattern" json:"schema_pattern,omitempty"`
	ConnectionId  string `protobuf:"bytes,3,opt,name=connection_id,json=connectionId" json:"connection_id,omitempty"`
}

func (m *SchemasRequest) Reset()                    { *m = SchemasRequest{} }
func (m *SchemasRequest) String() string            { return proto.CompactTextString(m) }
func (*SchemasRequest) ProtoMessage()               {}
func (*SchemasRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{2} }

func (m *SchemasRequest) GetCatalog() string {
	if m != nil {
		return m.Catalog
	}
	return ""
}

func (m *SchemasRequest) GetSchemaPattern() string {
	if m != nil {
		return m.SchemaPattern
	}
	return ""
}

func (m *SchemasRequest) GetConnectionId() string {
	if m != nil {
		return m.ConnectionId
	}
	return ""
}

// Request for Request for Meta#getTables(String, org.apache.calcite.avatica.Meta.Pat,
//   org.apache.calcite.avatica.Meta.Pat, java.util.List)
type TablesRequest struct {
	Catalog          string   `protobuf:"bytes,1,opt,name=catalog" json:"catalog,omitempty"`
	SchemaPattern    string   `protobuf:"bytes,2,opt,name=schema_pattern,json=schemaPattern" json:"schema_pattern,omitempty"`
	TableNamePattern string   `protobuf:"bytes,3,opt,name=table_name_pattern,json=tableNamePattern" json:"table_name_pattern,omitempty"`
	TypeList         []string `protobuf:"bytes,4,rep,name=type_list,json=typeList" json:"type_list,omitempty"`
	HasTypeList      bool     `protobuf:"varint,6,opt,name=has_type_list,json=hasTypeList" json:"has_type_list,omitempty"`
	ConnectionId     string   `protobuf:"bytes,7,opt,name=connection_id,json=connectionId" json:"connection_id,omitempty"`
}

func (m *TablesRequest) Reset()                    { *m = TablesRequest{} }
func (m *TablesRequest) String() string            { return proto.CompactTextString(m) }
func (*TablesRequest) ProtoMessage()               {}
func (*TablesRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{3} }

func (m *TablesRequest) GetCatalog() string {
	if m != nil {
		return m.Catalog
	}
	return ""
}

func (m *TablesRequest) GetSchemaPattern() string {
	if m != nil {
		return m.SchemaPattern
	}
	return ""
}

func (m *TablesRequest) GetTableNamePattern() string {
	if m != nil {
		return m.TableNamePattern
	}
	return ""
}

func (m *TablesRequest) GetTypeList() []string {
	if m != nil {
		return m.TypeList
	}
	return nil
}

func (m *TablesRequest) GetHasTypeList() bool {
	if m != nil {
		return m.HasTypeList
	}
	return false
}

func (m *TablesRequest) GetConnectionId() string {
	if m != nil {
		return m.ConnectionId
	}
	return ""
}

// Request for Meta#getTableTypes()
type TableTypesRequest struct {
	ConnectionId string `protobuf:"bytes,1,opt,name=connection_id,json=connectionId" json:"connection_id,omitempty"`
}

func (m *TableTypesRequest) Reset()                    { *m = TableTypesRequest{} }
func (m *TableTypesRequest) String() string            { return proto.CompactTextString(m) }
func (*TableTypesRequest) ProtoMessage()               {}
func (*TableTypesRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{4} }

func (m *TableTypesRequest) GetConnectionId() string {
	if m != nil {
		return m.ConnectionId
	}
	return ""
}

// Request for Meta#getColumns(String, org.apache.calcite.avatica.Meta.Pat,
//   org.apache.calcite.avatica.Meta.Pat, org.apache.calcite.avatica.Meta.Pat).
type ColumnsRequest struct {
	Catalog           string `protobuf:"bytes,1,opt,name=catalog" json:"catalog,omitempty"`
	SchemaPattern     string `protobuf:"bytes,2,opt,name=schema_pattern,json=schemaPattern" json:"schema_pattern,omitempty"`
	TableNamePattern  string `protobuf:"bytes,3,opt,name=table_name_pattern,json=tableNamePattern" json:"table_name_pattern,omitempty"`
	ColumnNamePattern string `protobuf:"bytes,4,opt,name=column_name_pattern,json=columnNamePattern" json:"column_name_pattern,omitempty"`
	ConnectionId      string `protobuf:"bytes,5,opt,name=connection_id,json=connectionId" json:"connection_id,omitempty"`
}

func (m *ColumnsRequest) Reset()                    { *m = ColumnsRequest{} }
func (m *ColumnsRequest) String() string            { return proto.CompactTextString(m) }
func (*ColumnsRequest) ProtoMessage()               {}
func (*ColumnsRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{5} }

func (m *ColumnsRequest) GetCatalog() string {
	if m != nil {
		return m.Catalog
	}
	return ""
}

func (m *ColumnsRequest) GetSchemaPattern() string {
	if m != nil {
		return m.SchemaPattern
	}
	return ""
}

func (m *ColumnsRequest) GetTableNamePattern() string {
	if m != nil {
		return m.TableNamePattern
	}
	return ""
}

func (m *ColumnsRequest) GetColumnNamePattern() string {
	if m != nil {
		return m.ColumnNamePattern
	}
	return ""
}

func (m *ColumnsRequest) GetConnectionId() string {
	if m != nil {
		return m.ConnectionId
	}
	return ""
}

// Request for Meta#getTypeInfo()
type TypeInfoRequest struct {
	ConnectionId string `protobuf:"bytes,1,opt,name=connection_id,json=connectionId" json:"connection_id,omitempty"`
}

func (m *TypeInfoRequest) Reset()                    { *m = TypeInfoRequest{} }
func (m *TypeInfoRequest) String() string            { return proto.CompactTextString(m) }
func (*TypeInfoRequest) ProtoMessage()               {}
func (*TypeInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{6} }

func (m *TypeInfoRequest) GetConnectionId() string {
	if m != nil {
		return m.ConnectionId
	}
	return ""
}

// Request for Meta#prepareAndExecute(Meta.StatementHandle, String, long, Meta.PrepareCallback)
type PrepareAndExecuteRequest struct {
	ConnectionId      string `protobuf:"bytes,1,opt,name=connection_id,json=connectionId" json:"connection_id,omitempty"`
	Sql               string `protobuf:"bytes,2,opt,name=sql" json:"sql,omitempty"`
	MaxRowCount       uint64 `protobuf:"varint,3,opt,name=max_row_count,json=maxRowCount" json:"max_row_count,omitempty"`
	StatementId       uint32 `protobuf:"varint,4,opt,name=statement_id,json=statementId" json:"statement_id,omitempty"`
	MaxRowsTotal      int64  `protobuf:"varint,5,opt,name=max_rows_total,json=maxRowsTotal" json:"max_rows_total,omitempty"`
	FirstFrameMaxSize int32  `protobuf:"varint,6,opt,name=first_frame_max_size,json=firstFrameMaxSize" json:"first_frame_max_size,omitempty"`
}

func (m *PrepareAndExecuteRequest) Reset()                    { *m = PrepareAndExecuteRequest{} }
func (m *PrepareAndExecuteRequest) String() string            { return proto.CompactTextString(m) }
func (*PrepareAndExecuteRequest) ProtoMessage()               {}
func (*PrepareAndExecuteRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{7} }

func (m *PrepareAndExecuteRequest) GetConnectionId() string {
	if m != nil {
		return m.ConnectionId
	}
	return ""
}

func (m *PrepareAndExecuteRequest) GetSql() string {
	if m != nil {
		return m.Sql
	}
	return ""
}

func (m *PrepareAndExecuteRequest) GetMaxRowCount() uint64 {
	if m != nil {
		return m.MaxRowCount
	}
	return 0
}

func (m *PrepareAndExecuteRequest) GetStatementId() uint32 {
	if m != nil {
		return m.StatementId
	}
	return 0
}

func (m *PrepareAndExecuteRequest) GetMaxRowsTotal() int64 {
	if m != nil {
		return m.MaxRowsTotal
	}
	return 0
}

func (m *PrepareAndExecuteRequest) GetFirstFrameMaxSize() int32 {
	if m != nil {
		return m.FirstFrameMaxSize
	}
	return 0
}

// Request for Meta.prepare(Meta.ConnectionHandle, String, long)
type PrepareRequest struct {
	ConnectionId string `protobuf:"bytes,1,opt,name=connection_id,json=connectionId" json:"connection_id,omitempty"`
	Sql          string `protobuf:"bytes,2,opt,name=sql" json:"sql,omitempty"`
	MaxRowCount  uint64 `protobuf:"varint,3,opt,name=max_row_count,json=maxRowCount" json:"max_row_count,omitempty"`
	MaxRowsTotal int64  `protobuf:"varint,4,opt,name=max_rows_total,json=maxRowsTotal" json:"max_rows_total,omitempty"`
}

func (m *PrepareRequest) Reset()                    { *m = PrepareRequest{} }
func (m *PrepareRequest) String() string            { return proto.CompactTextString(m) }
func (*PrepareRequest) ProtoMessage()               {}
func (*PrepareRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{8} }

func (m *PrepareRequest) GetConnectionId() string {
	if m != nil {
		return m.ConnectionId
	}
	return ""
}

func (m *PrepareRequest) GetSql() string {
	if m != nil {
		return m.Sql
	}
	return ""
}

func (m *PrepareRequest) GetMaxRowCount() uint64 {
	if m != nil {
		return m.MaxRowCount
	}
	return 0
}

func (m *PrepareRequest) GetMaxRowsTotal() int64 {
	if m != nil {
		return m.MaxRowsTotal
	}
	return 0
}

// Request for Meta#fetch(Meta.StatementHandle, List, long, int)
type FetchRequest struct {
	ConnectionId     string `protobuf:"bytes,1,opt,name=connection_id,json=connectionId" json:"connection_id,omitempty"`
	StatementId      uint32 `protobuf:"varint,2,opt,name=statement_id,json=statementId" json:"statement_id,omitempty"`
	Offset           uint64 `protobuf:"varint,3,opt,name=offset" json:"offset,omitempty"`
	FetchMaxRowCount uint32 `protobuf:"varint,4,opt,name=fetch_max_row_count,json=fetchMaxRowCount" json:"fetch_max_row_count,omitempty"`
	FrameMaxSize     int32  `protobuf:"varint,5,opt,name=frame_max_size,json=frameMaxSize" json:"frame_max_size,omitempty"`
}

func (m *FetchRequest) Reset()                    { *m = FetchRequest{} }
func (m *FetchRequest) String() string            { return proto.CompactTextString(m) }
func (*FetchRequest) ProtoMessage()               {}
func (*FetchRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{9} }

func (m *FetchRequest) GetConnectionId() string {
	if m != nil {
		return m.ConnectionId
	}
	return ""
}

func (m *FetchRequest) GetStatementId() uint32 {
	if m != nil {
		return m.StatementId
	}
	return 0
}

func (m *FetchRequest) GetOffset() uint64 {
	if m != nil {
		return m.Offset
	}
	return 0
}

func (m *FetchRequest) GetFetchMaxRowCount() uint32 {
	if m != nil {
		return m.FetchMaxRowCount
	}
	return 0
}

func (m *FetchRequest) GetFrameMaxSize() int32 {
	if m != nil {
		return m.FrameMaxSize
	}
	return 0
}

// Request for Meta#createStatement(Meta.ConnectionHandle)
type CreateStatementRequest struct {
	ConnectionId string `protobuf:"bytes,1,opt,name=connection_id,json=connectionId" json:"connection_id,omitempty"`
}

func (m *CreateStatementRequest) Reset()                    { *m = CreateStatementRequest{} }
func (m *CreateStatementRequest) String() string            { return proto.CompactTextString(m) }
func (*CreateStatementRequest) ProtoMessage()               {}
func (*CreateStatementRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{10} }

func (m *CreateStatementRequest) GetConnectionId() string {
	if m != nil {
		return m.ConnectionId
	}
	return ""
}

// Request for Meta#closeStatement(Meta.StatementHandle)
type CloseStatementRequest struct {
	ConnectionId string `protobuf:"bytes,1,opt,name=connection_id,json=connectionId" json:"connection_id,omitempty"`
	StatementId  uint32 `protobuf:"varint,2,opt,name=statement_id,json=statementId" json:"statement_id,omitempty"`
}

func (m *CloseStatementRequest) Reset()                    { *m = CloseStatementRequest{} }
func (m *CloseStatementRequest) String() string            { return proto.CompactTextString(m) }
func (*CloseStatementRequest) ProtoMessage()               {}
func (*CloseStatementRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{11} }

func (m *CloseStatementRequest) GetConnectionId() string {
	if m != nil {
		return m.ConnectionId
	}
	return ""
}

func (m *CloseStatementRequest) GetStatementId() uint32 {
	if m != nil {
		return m.StatementId
	}
	return 0
}

// Request for Meta#openConnection(Meta.ConnectionHandle, Map<String, String>)
type OpenConnectionRequest struct {
	ConnectionId string            `protobuf:"bytes,1,opt,name=connection_id,json=connectionId" json:"connection_id,omitempty"`
	Info         map[string]string `protobuf:"bytes,2,rep,name=info" json:"info,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
}

func (m *OpenConnectionRequest) Reset()                    { *m = OpenConnectionRequest{} }
func (m *OpenConnectionRequest) String() string            { return proto.CompactTextString(m) }
func (*OpenConnectionRequest) ProtoMessage()               {}
func (*OpenConnectionRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{12} }

func (m *OpenConnectionRequest) GetConnectionId() string {
	if m != nil {
		return m.ConnectionId
	}
	return ""
}

func (m *OpenConnectionRequest) GetInfo() map[string]string {
	if m != nil {
		return m.Info
	}
	return nil
}

// Request for Meta#closeConnection(Meta.ConnectionHandle)
type CloseConnectionRequest struct {
	ConnectionId string `protobuf:"bytes,1,opt,name=connection_id,json=connectionId" json:"connection_id,omitempty"`
}

func (m *CloseConnectionRequest) Reset()                    { *m = CloseConnectionRequest{} }
func (m *CloseConnectionRequest) String() string            { return proto.CompactTextString(m) }
func (*CloseConnectionRequest) ProtoMessage()               {}
func (*CloseConnectionRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{13} }

func (m *CloseConnectionRequest) GetConnectionId() string {
	if m != nil {
		return m.ConnectionId
	}
	return ""
}

type ConnectionSyncRequest struct {
	ConnectionId string                `protobuf:"bytes,1,opt,name=connection_id,json=connectionId" json:"connection_id,omitempty"`
	ConnProps    *ConnectionProperties `protobuf:"bytes,2,opt,name=conn_props,json=connProps" json:"conn_props,omitempty"`
}

func (m *ConnectionSyncRequest) Reset()                    { *m = ConnectionSyncRequest{} }
func (m *ConnectionSyncRequest) String() string            { return proto.CompactTextString(m) }
func (*ConnectionSyncRequest) ProtoMessage()               {}
func (*ConnectionSyncRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{14} }

func (m *ConnectionSyncRequest) GetConnectionId() string {
	if m != nil {
		return m.ConnectionId
	}
	return ""
}

func (m *ConnectionSyncRequest) GetConnProps() *ConnectionProperties {
	if m != nil {
		return m.ConnProps
	}
	return nil
}

// Request for Meta#execute(Meta.ConnectionHandle, list, long)
type ExecuteRequest struct {
	StatementHandle             *StatementHandle `protobuf:"bytes,1,opt,name=statementHandle" json:"statementHandle,omitempty"`
	ParameterValues             []*TypedValue    `protobuf:"bytes,2,rep,name=parameter_values,json=parameterValues" json:"parameter_values,omitempty"`
	DeprecatedFirstFrameMaxSize uint64           `protobuf:"varint,3,opt,name=deprecated_first_frame_max_size,json=deprecatedFirstFrameMaxSize" json:"deprecated_first_frame_max_size,omitempty"`
	HasParameterValues          bool             `protobuf:"varint,4,opt,name=has_parameter_values,json=hasParameterValues" json:"has_parameter_values,omitempty"`
	FirstFrameMaxSize           int32            `protobuf:"varint,5,opt,name=first_frame_max_size,json=firstFrameMaxSize" json:"first_frame_max_size,omitempty"`
}

func (m *ExecuteRequest) Reset()                    { *m = ExecuteRequest{} }
func (m *ExecuteRequest) String() string            { return proto.CompactTextString(m) }
func (*ExecuteRequest) ProtoMessage()               {}
func (*ExecuteRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{15} }

func (m *ExecuteRequest) GetStatementHandle() *StatementHandle {
	if m != nil {
		return m.StatementHandle
	}
	return nil
}

func (m *ExecuteRequest) GetParameterValues() []*TypedValue {
	if m != nil {
		return m.ParameterValues
	}
	return nil
}

func (m *ExecuteRequest) GetDeprecatedFirstFrameMaxSize() uint64 {
	if m != nil {
		return m.DeprecatedFirstFrameMaxSize
	}
	return 0
}

func (m *ExecuteRequest) GetHasParameterValues() bool {
	if m != nil {
		return m.HasParameterValues
	}
	return false
}

func (m *ExecuteRequest) GetFirstFrameMaxSize() int32 {
	if m != nil {
		return m.FirstFrameMaxSize
	}
	return 0
}

type SyncResultsRequest struct {
	ConnectionId string      `protobuf:"bytes,1,opt,name=connection_id,json=connectionId" json:"connection_id,omitempty"`
	StatementId  uint32      `protobuf:"varint,2,opt,name=statement_id,json=statementId" json:"statement_id,omitempty"`
	State        *QueryState `protobuf:"bytes,3,opt,name=state" json:"state,omitempty"`
	Offset       uint64      `protobuf:"varint,4,opt,name=offset" json:"offset,omitempty"`
}

func (m *SyncResultsRequest) Reset()                    { *m = SyncResultsRequest{} }
func (m *SyncResultsRequest) String() string            { return proto.CompactTextString(m) }
func (*SyncResultsRequest) ProtoMessage()               {}
func (*SyncResultsRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{16} }

func (m *SyncResultsRequest) GetConnectionId() string {
	if m != nil {
		return m.ConnectionId
	}
	return ""
}

func (m *SyncResultsRequest) GetStatementId() uint32 {
	if m != nil {
		return m.StatementId
	}
	return 0
}

func (m *SyncResultsRequest) GetState() *QueryState {
	if m != nil {
		return m.State
	}
	return nil
}

func (m *SyncResultsRequest) GetOffset() uint64 {
	if m != nil {
		return m.Offset
	}
	return 0
}

// Request to invoke a commit on a Connection
type CommitRequest struct {
	ConnectionId string `protobuf:"bytes,1,opt,name=connection_id,json=connectionId" json:"connection_id,omitempty"`
}

func (m *CommitRequest) Reset()                    { *m = CommitRequest{} }
func (m *CommitRequest) String() string            { return proto.CompactTextString(m) }
func (*CommitRequest) ProtoMessage()               {}
func (*CommitRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{17} }

func (m *CommitRequest) GetConnectionId() string {
	if m != nil {
		return m.ConnectionId
	}
	return ""
}

// Request to invoke rollback on a Connection
type RollbackRequest struct {
	ConnectionId string `protobuf:"bytes,1,opt,name=connection_id,json=connectionId" json:"connection_id,omitempty"`
}

func (m *RollbackRequest) Reset()                    { *m = RollbackRequest{} }
func (m *RollbackRequest) String() string            { return proto.CompactTextString(m) }
func (*RollbackRequest) ProtoMessage()               {}
func (*RollbackRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{18} }

func (m *RollbackRequest) GetConnectionId() string {
	if m != nil {
		return m.ConnectionId
	}
	return ""
}

// Request to prepare and execute a collection of sql statements.
type PrepareAndExecuteBatchRequest struct {
	ConnectionId string   `protobuf:"bytes,1,opt,name=connection_id,json=connectionId" json:"connection_id,omitempty"`
	StatementId  uint32   `protobuf:"varint,2,opt,name=statement_id,json=statementId" json:"statement_id,omitempty"`
	SqlCommands  []string `protobuf:"bytes,3,rep,name=sql_commands,json=sqlCommands" json:"sql_commands,omitempty"`
}

func (m *PrepareAndExecuteBatchRequest) Reset()                    { *m = PrepareAndExecuteBatchRequest{} }
func (m *PrepareAndExecuteBatchRequest) String() string            { return proto.CompactTextString(m) }
func (*PrepareAndExecuteBatchRequest) ProtoMessage()               {}
func (*PrepareAndExecuteBatchRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{19} }

func (m *PrepareAndExecuteBatchRequest) GetConnectionId() string {
	if m != nil {
		return m.ConnectionId
	}
	return ""
}

func (m *PrepareAndExecuteBatchRequest) GetStatementId() uint32 {
	if m != nil {
		return m.StatementId
	}
	return 0
}

func (m *PrepareAndExecuteBatchRequest) GetSqlCommands() []string {
	if m != nil {
		return m.SqlCommands
	}
	return nil
}

// Each command is a list of TypedValues
type UpdateBatch struct {
	ParameterValues []*TypedValue `protobuf:"bytes,1,rep,name=parameter_values,json=parameterValues" json:"parameter_values,omitempty"`
}

func (m *UpdateBatch) Reset()                    { *m = UpdateBatch{} }
func (m *UpdateBatch) String() string            { return proto.CompactTextString(m) }
func (*UpdateBatch) ProtoMessage()               {}
func (*UpdateBatch) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{20} }

func (m *UpdateBatch) GetParameterValues() []*TypedValue {
	if m != nil {
		return m.ParameterValues
	}
	return nil
}

type ExecuteBatchRequest struct {
	ConnectionId string         `protobuf:"bytes,1,opt,name=connection_id,json=connectionId" json:"connection_id,omitempty"`
	StatementId  uint32         `protobuf:"varint,2,opt,name=statement_id,json=statementId" json:"statement_id,omitempty"`
	Updates      []*UpdateBatch `protobuf:"bytes,3,rep,name=updates" json:"updates,omitempty"`
}

func (m *ExecuteBatchRequest) Reset()                    { *m = ExecuteBatchRequest{} }
func (m *ExecuteBatchRequest) String() string            { return proto.CompactTextString(m) }
func (*ExecuteBatchRequest) ProtoMessage()               {}
func (*ExecuteBatchRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{21} }

func (m *ExecuteBatchRequest) GetConnectionId() string {
	if m != nil {
		return m.ConnectionId
	}
	return ""
}

func (m *ExecuteBatchRequest) GetStatementId() uint32 {
	if m != nil {
		return m.StatementId
	}
	return 0
}

func (m *ExecuteBatchRequest) GetUpdates() []*UpdateBatch {
	if m != nil {
		return m.Updates
	}
	return nil
}

func init() {
	proto.RegisterType((*CatalogsRequest)(nil), "CatalogsRequest")
	proto.RegisterType((*DatabasePropertyRequest)(nil), "DatabasePropertyRequest")
	proto.RegisterType((*SchemasRequest)(nil), "SchemasRequest")
	proto.RegisterType((*TablesRequest)(nil), "TablesRequest")
	proto.RegisterType((*TableTypesRequest)(nil), "TableTypesRequest")
	proto.RegisterType((*ColumnsRequest)(nil), "ColumnsRequest")
	proto.RegisterType((*TypeInfoRequest)(nil), "TypeInfoRequest")
	proto.RegisterType((*PrepareAndExecuteRequest)(nil), "PrepareAndExecuteRequest")
	proto.RegisterType((*PrepareRequest)(nil), "PrepareRequest")
	proto.RegisterType((*FetchRequest)(nil), "FetchRequest")
	proto.RegisterType((*CreateStatementRequest)(nil), "CreateStatementRequest")
	proto.RegisterType((*CloseStatementRequest)(nil), "CloseStatementRequest")
	proto.RegisterType((*OpenConnectionRequest)(nil), "OpenConnectionRequest")
	proto.RegisterType((*CloseConnectionRequest)(nil), "CloseConnectionRequest")
	proto.RegisterType((*ConnectionSyncRequest)(nil), "ConnectionSyncRequest")
	proto.RegisterType((*ExecuteRequest)(nil), "ExecuteRequest")
	proto.RegisterType((*SyncResultsRequest)(nil), "SyncResultsRequest")
	proto.RegisterType((*CommitRequest)(nil), "CommitRequest")
	proto.RegisterType((*RollbackRequest)(nil), "RollbackRequest")
	proto.RegisterType((*PrepareAndExecuteBatchRequest)(nil), "PrepareAndExecuteBatchRequest")
	proto.RegisterType((*UpdateBatch)(nil), "UpdateBatch")
	proto.RegisterType((*ExecuteBatchRequest)(nil), "ExecuteBatchRequest")
}

func init() { proto.RegisterFile("requests.proto", fileDescriptor1) }

var fileDescriptor1 = []byte{
	// 904 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x56, 0xdd, 0x6e, 0x1b, 0x45,
	0x14, 0xd6, 0xfa, 0x27, 0xa9, 0xcf, 0xfa, 0x2f, 0x9b, 0xa4, 0x58, 0xad, 0x10, 0xee, 0xf2, 0xa3,
	0x5c, 0xc0, 0x82, 0x42, 0x15, 0xaa, 0x4a, 0x20, 0x51, 0x37, 0x11, 0x91, 0x28, 0x84, 0x75, 0xe0,
	0x76, 0x75, 0xb2, 0x7b, 0x5c, 0xaf, 0xba, 0x3b, 0xb3, 0x99, 0x19, 0xa7, 0x71, 0xef, 0xb9, 0xe1,
	0x8e, 0x2b, 0x1e, 0x02, 0xf1, 0x14, 0xbc, 0x02, 0x8f, 0xc0, 0x3d, 0xaf, 0x80, 0x66, 0x76, 0xfd,
	0x13, 0xdb, 0x15, 0x6c, 0xd5, 0xc2, 0x95, 0x7d, 0xce, 0x7c, 0xe7, 0xe7, 0xfb, 0x66, 0xe6, 0xcc,
	0x42, 0x5b, 0xd0, 0xe5, 0x84, 0xa4, 0x92, 0x5e, 0x26, 0xb8, 0xe2, 0x77, 0x9a, 0x21, 0x4f, 0x53,
	0xce, 0x72, 0xcb, 0x3d, 0x82, 0xce, 0x00, 0x15, 0x26, 0xfc, 0xa9, 0xf4, 0x73, 0x9c, 0xf3, 0x2e,
	0xb4, 0x42, 0xce, 0x18, 0x85, 0x2a, 0xe6, 0x2c, 0x88, 0xa3, 0x9e, 0xd5, 0xb7, 0x0e, 0x1a, 0x7e,
	0x73, 0xe1, 0x3c, 0x8d, 0xdc, 0x2f, 0xe0, 0xad, 0xc7, 0xa8, 0xf0, 0x02, 0x25, 0x9d, 0x09, 0x9e,
	0x91, 0x50, 0xd3, 0x52, 0xf1, 0x57, 0xd0, 0x1e, 0x86, 0x63, 0x4a, 0x71, 0x5e, 0xb6, 0x07, 0xdb,
	0x61, 0xde, 0x49, 0x11, 0x30, 0x33, 0x9d, 0xf7, 0xa1, 0x2d, 0x0d, 0x36, 0xc8, 0x50, 0x29, 0x12,
	0xac, 0x57, 0x31, 0x80, 0x56, 0xee, 0x3d, 0xcb, 0x9d, 0xeb, 0x75, 0xab, 0x1b, 0xea, 0xfe, 0x69,
	0x41, 0xeb, 0x1c, 0x2f, 0x12, 0x7a, 0x7d, 0x75, 0x3f, 0x04, 0x47, 0xe9, 0x8c, 0x01, 0xc3, 0x94,
	0xe6, 0xd0, 0xbc, 0x78, 0xd7, 0xac, 0x7c, 0x83, 0x29, 0xcd, 0xd0, 0x77, 0xa1, 0xa1, 0xa6, 0x19,
	0x05, 0x49, 0x2c, 0x55, 0xaf, 0xd6, 0xaf, 0x1e, 0x34, 0xfc, 0x5b, 0xda, 0xf1, 0x75, 0x2c, 0x95,
	0xe3, 0x42, 0x6b, 0x8c, 0x32, 0x58, 0x00, 0xb6, 0xfa, 0xd6, 0xc1, 0x2d, 0xdf, 0x1e, 0xa3, 0x3c,
	0x9f, 0x61, 0xd6, 0x68, 0x6e, 0x6f, 0xa0, 0xf9, 0x00, 0x76, 0x0c, 0x4b, 0x1d, 0x55, 0x6e, 0x63,
	0xff, 0xb0, 0xa0, 0x3d, 0xe0, 0xc9, 0x24, 0x65, 0xff, 0x97, 0x42, 0x1e, 0xec, 0x86, 0xa6, 0x81,
	0x9b, 0xf0, 0x9a, 0x81, 0xef, 0xe4, 0x4b, 0xcb, 0xf8, 0x35, 0x5a, 0xf5, 0x0d, 0xb4, 0x8e, 0xa0,
	0xa3, 0xb5, 0x38, 0x65, 0x23, 0x5e, 0x4a, 0x8e, 0xbf, 0x2c, 0xe8, 0x9d, 0x09, 0xca, 0x50, 0xd0,
	0x97, 0x2c, 0x3a, 0xbe, 0xa6, 0x70, 0xa2, 0xa8, 0x4c, 0x06, 0xa7, 0x0b, 0x55, 0x79, 0x99, 0x14,
	0xc2, 0xe8, 0xbf, 0x7a, 0x97, 0x53, 0xbc, 0x0e, 0x04, 0x7f, 0x1e, 0x84, 0x7c, 0xc2, 0x94, 0x51,
	0xa2, 0xe6, 0xdb, 0x29, 0x5e, 0xfb, 0xfc, 0xf9, 0x40, 0xbb, 0x9c, 0x7b, 0xd0, 0x94, 0x0a, 0x15,
	0xa5, 0xc4, 0x94, 0xce, 0xac, 0xd9, 0xb7, 0x7c, 0x7b, 0xee, 0x3b, 0x8d, 0x9c, 0xf7, 0xa0, 0x5d,
	0xa4, 0x91, 0x81, 0xe2, 0x0a, 0x13, 0x43, 0xbc, 0xea, 0x37, 0xf3, 0x3c, 0xf2, 0x5c, 0xfb, 0x9c,
	0x8f, 0x61, 0x6f, 0x14, 0x0b, 0xa9, 0x82, 0x91, 0xd0, 0x6a, 0xea, 0x08, 0x19, 0xbf, 0x20, 0x73,
	0xb2, 0xea, 0xfe, 0x8e, 0x59, 0x3b, 0xd1, 0x4b, 0x4f, 0xf0, 0x7a, 0x18, 0xbf, 0x20, 0xf7, 0x67,
	0x0b, 0xda, 0x05, 0xe3, 0xff, 0x80, 0xe7, 0x3a, 0x89, 0xda, 0x3a, 0x09, 0xf7, 0x77, 0x0b, 0x9a,
	0x27, 0xa4, 0xc2, 0x71, 0xa9, 0x8e, 0x56, 0x35, 0xac, 0xac, 0x6b, 0x78, 0x1b, 0xb6, 0xf8, 0x68,
	0x24, 0x69, 0xd6, 0x5b, 0x61, 0x39, 0x1f, 0xc1, 0xee, 0x48, 0xd7, 0x0b, 0x6e, 0x12, 0xc8, 0x77,
	0xa1, 0x6b, 0x96, 0x9e, 0xdc, 0x64, 0xb1, 0x22, 0x6f, 0xdd, 0xc8, 0xdb, 0x1c, 0x2d, 0x2b, 0xfb,
	0x39, 0xdc, 0x1e, 0x08, 0x42, 0x45, 0xc3, 0x59, 0x07, 0xa5, 0x8e, 0x62, 0x00, 0xfb, 0x83, 0x84,
	0xcb, 0x57, 0x8b, 0xfe, 0x17, 0x62, 0xb8, 0xbf, 0x5a, 0xb0, 0xff, 0x6d, 0x46, 0x6c, 0x30, 0x8f,
	0x2b, 0x55, 0xe1, 0x3e, 0xd4, 0x62, 0x36, 0xe2, 0xbd, 0x4a, 0xbf, 0x7a, 0x60, 0x1f, 0xf6, 0xbd,
	0x8d, 0xa9, 0x3c, 0x7d, 0x03, 0x8f, 0x99, 0x12, 0x53, 0xdf, 0xa0, 0xef, 0x7c, 0x06, 0x8d, 0xb9,
	0x4b, 0x9f, 0xa1, 0x67, 0x34, 0x2d, 0xb2, 0xeb, 0xbf, 0xce, 0x1e, 0xd4, 0xaf, 0x30, 0x99, 0x50,
	0x71, 0xae, 0x72, 0xe3, 0x61, 0xe5, 0x81, 0x65, 0xd4, 0xd4, 0x72, 0xbc, 0x5a, 0xb7, 0xae, 0x80,
	0xfd, 0x45, 0xe4, 0x70, 0xca, 0xc2, 0x92, 0x5c, 0x41, 0xdb, 0x41, 0x26, 0x78, 0x26, 0x4d, 0x6f,
	0xf6, 0xe1, 0xbe, 0xb7, 0x48, 0x58, 0xbc, 0x89, 0x31, 0x49, 0xbf, 0xa1, 0x81, 0xda, 0x96, 0xee,
	0x6f, 0x15, 0x68, 0xaf, 0x8c, 0x90, 0x87, 0xd0, 0x99, 0x6f, 0xc1, 0x57, 0xc8, 0xa2, 0x84, 0x4c,
	0x3d, 0xfb, 0xb0, 0xeb, 0x0d, 0x6f, 0xfa, 0xfd, 0x55, 0xa0, 0x73, 0x04, 0xdd, 0x0c, 0xf5, 0x01,
	0x53, 0x24, 0x02, 0x23, 0x8c, 0x2c, 0xc4, 0xb7, 0x3d, 0x3d, 0xec, 0xa2, 0x1f, 0xb4, 0xcf, 0xef,
	0xcc, 0x41, 0xc6, 0x96, 0xce, 0x63, 0x78, 0x27, 0xa2, 0x4c, 0x50, 0x88, 0x8a, 0xa2, 0x60, 0xe3,
	0x74, 0xc8, 0x6f, 0xc3, 0xdd, 0x05, 0xec, 0x64, 0x75, 0x4e, 0x38, 0x9f, 0xc0, 0x9e, 0x7e, 0xab,
	0xd6, 0x3a, 0xa8, 0x99, 0x27, 0xcb, 0x19, 0xa3, 0x3c, 0x5b, 0xa9, 0xfb, 0xb2, 0x51, 0x54, 0x7f,
	0xd9, 0x28, 0xfa, 0xc5, 0x02, 0x27, 0xdf, 0x1a, 0x39, 0x49, 0x94, 0x7c, 0xdd, 0x97, 0xff, 0x1e,
	0xd4, 0x8d, 0x69, 0xd8, 0x6a, 0xd1, 0xbe, 0x9b, 0x90, 0x98, 0x1a, 0xd9, 0xfd, 0x7c, 0x65, 0x69,
	0x3e, 0xd4, 0x96, 0xe7, 0x83, 0x7b, 0x1f, 0x5a, 0x03, 0x9e, 0xa6, 0x71, 0xb9, 0x1b, 0x7c, 0x04,
	0x1d, 0x9f, 0x27, 0xc9, 0x05, 0x86, 0xcf, 0x4a, 0xc5, 0xfd, 0x64, 0xc1, 0xdb, 0x6b, 0x8f, 0xd0,
	0x23, 0x7c, 0x03, 0xf3, 0x50, 0x43, 0x2e, 0x93, 0x40, 0x7f, 0x22, 0x22, 0x8b, 0x64, 0xaf, 0x6a,
	0x3e, 0x50, 0x6c, 0x79, 0x99, 0x0c, 0x0a, 0x97, 0x7b, 0x0c, 0xf6, 0xf7, 0x59, 0x84, 0x45, 0x03,
	0x1b, 0x0f, 0xa1, 0xf5, 0xcf, 0x87, 0xd0, 0xfd, 0xd1, 0x82, 0xdd, 0x37, 0xc9, 0xe4, 0x03, 0xd8,
	0x9e, 0x98, 0x36, 0x73, 0x12, 0xf6, 0x61, 0xd3, 0x5b, 0x6a, 0xdb, 0x9f, 0x2d, 0x3e, 0x72, 0xa1,
	0xcf, 0xc5, 0x53, 0x0f, 0x33, 0x0c, 0xc7, 0xe4, 0x85, 0x98, 0x84, 0xb1, 0x22, 0x0f, 0xaf, 0x50,
	0xc5, 0x21, 0xe6, 0x1f, 0xc9, 0x17, 0x5b, 0xe6, 0xe7, 0xd3, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff,
	0x42, 0xfb, 0xc6, 0x20, 0x4b, 0x0b, 0x00, 0x00,
}
