allow setting transaction isolation on vtgate session/executeoptions. enforce per-transaction before calling begin

This commit is contained in:
Bryan Beaudreault 2017-08-23 04:41:39 -04:00
Родитель 1ab54b9a3a
Коммит d59de09111
12 изменённых файлов: 746 добавлений и 248 удалений

Просмотреть файл

@ -460,6 +460,38 @@ func (x ExecuteOptions_Workload) String() string {
}
func (ExecuteOptions_Workload) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{6, 1} }
type ExecuteOptions_TransactionIsolation int32
const (
ExecuteOptions_DEFAULT ExecuteOptions_TransactionIsolation = 0
ExecuteOptions_REPEATABLE_READ ExecuteOptions_TransactionIsolation = 1
ExecuteOptions_READ_COMMITTED ExecuteOptions_TransactionIsolation = 2
ExecuteOptions_READ_UNCOMMITTED ExecuteOptions_TransactionIsolation = 3
ExecuteOptions_SERIALIZABLE ExecuteOptions_TransactionIsolation = 4
)
var ExecuteOptions_TransactionIsolation_name = map[int32]string{
0: "DEFAULT",
1: "REPEATABLE_READ",
2: "READ_COMMITTED",
3: "READ_UNCOMMITTED",
4: "SERIALIZABLE",
}
var ExecuteOptions_TransactionIsolation_value = map[string]int32{
"DEFAULT": 0,
"REPEATABLE_READ": 1,
"READ_COMMITTED": 2,
"READ_UNCOMMITTED": 3,
"SERIALIZABLE": 4,
}
func (x ExecuteOptions_TransactionIsolation) String() string {
return proto.EnumName(ExecuteOptions_TransactionIsolation_name, int32(x))
}
func (ExecuteOptions_TransactionIsolation) EnumDescriptor() ([]byte, []int) {
return fileDescriptor0, []int{6, 2}
}
// The category of one statement.
type StreamEvent_Statement_Category int32
@ -730,7 +762,8 @@ type ExecuteOptions struct {
Workload ExecuteOptions_Workload `protobuf:"varint,6,opt,name=workload,enum=query.ExecuteOptions_Workload" json:"workload,omitempty"`
// sql_select_limit sets an implicit limit on all select statements. Since
// vitess also sets a rowcount limit on queries, the smallest value wins.
SqlSelectLimit int64 `protobuf:"varint,8,opt,name=sql_select_limit,json=sqlSelectLimit" json:"sql_select_limit,omitempty"`
SqlSelectLimit int64 `protobuf:"varint,8,opt,name=sql_select_limit,json=sqlSelectLimit" json:"sql_select_limit,omitempty"`
TransactionIsolation ExecuteOptions_TransactionIsolation `protobuf:"varint,9,opt,name=transaction_isolation,json=transactionIsolation,enum=query.ExecuteOptions_TransactionIsolation" json:"transaction_isolation,omitempty"`
}
func (m *ExecuteOptions) Reset() { *m = ExecuteOptions{} }
@ -780,6 +813,13 @@ func (m *ExecuteOptions) GetSqlSelectLimit() int64 {
return 0
}
func (m *ExecuteOptions) GetTransactionIsolation() ExecuteOptions_TransactionIsolation {
if m != nil {
return m.TransactionIsolation
}
return ExecuteOptions_DEFAULT
}
// Field describes a single column returned by a query
type Field struct {
// name of the field as returned by mysql C API
@ -2710,6 +2750,7 @@ func init() {
proto.RegisterEnum("query.TransactionState", TransactionState_name, TransactionState_value)
proto.RegisterEnum("query.ExecuteOptions_IncludedFields", ExecuteOptions_IncludedFields_name, ExecuteOptions_IncludedFields_value)
proto.RegisterEnum("query.ExecuteOptions_Workload", ExecuteOptions_Workload_name, ExecuteOptions_Workload_value)
proto.RegisterEnum("query.ExecuteOptions_TransactionIsolation", ExecuteOptions_TransactionIsolation_name, ExecuteOptions_TransactionIsolation_value)
proto.RegisterEnum("query.StreamEvent_Statement_Category", StreamEvent_Statement_Category_name, StreamEvent_Statement_Category_value)
proto.RegisterEnum("query.SplitQueryRequest_Algorithm", SplitQueryRequest_Algorithm_name, SplitQueryRequest_Algorithm_value)
}
@ -2717,190 +2758,196 @@ func init() {
func init() { proto.RegisterFile("query.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{
// 2956 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xc9, 0x73, 0x1b, 0xc7,
0xb9, 0xd7, 0x60, 0x23, 0xf0, 0x81, 0x00, 0x9b, 0x0d, 0xd2, 0x82, 0x29, 0x2f, 0x7c, 0x63, 0xcb,
0xe6, 0x93, 0xfd, 0xf8, 0x64, 0x4a, 0x4f, 0x4f, 0x65, 0x67, 0xd1, 0x10, 0x1c, 0xca, 0xb0, 0xb0,
0xa9, 0x31, 0x90, 0x2c, 0x97, 0xab, 0xa6, 0x86, 0x40, 0x8b, 0x9c, 0xe2, 0x00, 0x03, 0xce, 0x0c,
0x48, 0xe3, 0xa6, 0xc4, 0xd9, 0x57, 0x67, 0x75, 0x9c, 0x54, 0x9c, 0x54, 0xe5, 0x9e, 0xbf, 0x21,
0x95, 0x3f, 0x20, 0xb7, 0x1c, 0x92, 0x1c, 0x52, 0x39, 0xa4, 0x72, 0x4b, 0xe5, 0x94, 0x43, 0x0e,
0xa9, 0x54, 0x2f, 0x33, 0x18, 0x90, 0xb0, 0x25, 0x2b, 0xb9, 0x50, 0xf6, 0x09, 0xf3, 0x2d, 0xe8,
0xaf, 0xbf, 0xdf, 0xb7, 0x74, 0x4f, 0xf7, 0x40, 0xfe, 0x60, 0x44, 0xbd, 0xf1, 0xfa, 0xd0, 0x73,
0x03, 0x17, 0xa7, 0x39, 0xb1, 0x52, 0x0c, 0xdc, 0xa1, 0xdb, 0xb3, 0x02, 0x4b, 0xb0, 0x57, 0xf2,
0x87, 0x81, 0x37, 0xec, 0x0a, 0x42, 0x3d, 0x80, 0x8c, 0x61, 0x79, 0xbb, 0x34, 0xc0, 0x2b, 0x90,
0xdd, 0xa7, 0x63, 0x7f, 0x68, 0x75, 0x69, 0x59, 0x59, 0x55, 0xd6, 0x72, 0x24, 0xa2, 0xf1, 0x12,
0xa4, 0xfd, 0x3d, 0xcb, 0xeb, 0x95, 0x13, 0x5c, 0x20, 0x08, 0xfc, 0x7f, 0x90, 0x0f, 0xac, 0x1d,
0x87, 0x06, 0x66, 0x30, 0x1e, 0xd2, 0x72, 0x72, 0x55, 0x59, 0x2b, 0x6e, 0x2c, 0xad, 0x47, 0xe6,
0x0c, 0x2e, 0x34, 0xc6, 0x43, 0x4a, 0x20, 0x88, 0x9e, 0xd5, 0x2d, 0x28, 0xde, 0x32, 0xae, 0x5b,
0x01, 0xad, 0x58, 0x8e, 0x43, 0xbd, 0xea, 0x16, 0x33, 0x3d, 0xf2, 0xa9, 0x37, 0xb0, 0xfa, 0x91,
0xe9, 0x90, 0xc6, 0x8f, 0x41, 0x66, 0xd7, 0x73, 0x47, 0x43, 0xbf, 0x9c, 0x58, 0x4d, 0xae, 0xe5,
0x88, 0xa4, 0xd4, 0x37, 0x01, 0xf4, 0x43, 0x3a, 0x08, 0x0c, 0x77, 0x9f, 0x0e, 0xf0, 0x13, 0x90,
0x0b, 0xec, 0x3e, 0xf5, 0x03, 0xab, 0x3f, 0xe4, 0x43, 0x24, 0xc9, 0x84, 0xf1, 0x01, 0xd3, 0x5f,
0x81, 0xec, 0xd0, 0xf5, 0xed, 0xc0, 0x76, 0x07, 0x7c, 0xee, 0x39, 0x12, 0xd1, 0xea, 0x67, 0x20,
0x7d, 0xcb, 0x72, 0x46, 0x14, 0x3f, 0x0d, 0x29, 0xee, 0x9c, 0xc2, 0x9d, 0xcb, 0xaf, 0x0b, 0x7c,
0xb9, 0x4f, 0x5c, 0xc0, 0xc6, 0x3e, 0x64, 0x9a, 0x7c, 0xec, 0x79, 0x22, 0x08, 0x75, 0x1f, 0xe6,
0x37, 0xed, 0x41, 0xef, 0x96, 0xe5, 0xd9, 0xcc, 0xf1, 0x87, 0x1c, 0x06, 0x3f, 0x0b, 0x19, 0xfe,
0xe0, 0x97, 0x93, 0xab, 0xc9, 0xb5, 0xfc, 0xc6, 0xbc, 0xfc, 0x23, 0x9f, 0x1b, 0x91, 0x32, 0xf5,
0xd7, 0x0a, 0xc0, 0xa6, 0x3b, 0x1a, 0xf4, 0x6e, 0x32, 0x21, 0x46, 0x90, 0xf4, 0x0f, 0x1c, 0x09,
0x24, 0x7b, 0xc4, 0x37, 0xa0, 0xb8, 0x63, 0x0f, 0x7a, 0xe6, 0xa1, 0x9c, 0x8e, 0xc0, 0x32, 0xbf,
0xf1, 0xac, 0x1c, 0x6e, 0xf2, 0xe7, 0xf5, 0xf8, 0xac, 0x7d, 0x7d, 0x10, 0x78, 0x63, 0x52, 0xd8,
0x89, 0xf3, 0x56, 0x3a, 0x80, 0x4f, 0x2a, 0x31, 0xa3, 0xfb, 0x74, 0x1c, 0x1a, 0xdd, 0xa7, 0x63,
0xfc, 0xdf, 0x71, 0x8f, 0xf2, 0x1b, 0xa5, 0xd0, 0x56, 0xec, 0xbf, 0xd2, 0xcd, 0x97, 0x13, 0x57,
0x15, 0xf5, 0x4f, 0x49, 0x28, 0xea, 0x6f, 0xd1, 0xee, 0x28, 0xa0, 0xcd, 0x21, 0x8b, 0x81, 0x8f,
0xd7, 0xa1, 0x64, 0x0f, 0xba, 0xce, 0xa8, 0x47, 0x4d, 0xca, 0x42, 0x6d, 0x06, 0x2c, 0xd6, 0x7c,
0xbc, 0x2c, 0x59, 0x94, 0xa2, 0x58, 0x12, 0x68, 0x50, 0xea, 0xba, 0xfd, 0xa1, 0xe5, 0x4d, 0xeb,
0x27, 0xb9, 0xfd, 0x45, 0x69, 0x7f, 0xa2, 0x4f, 0x16, 0xa5, 0x76, 0x6c, 0x88, 0x3a, 0x2c, 0xc8,
0x71, 0x7b, 0xe6, 0x5d, 0x9b, 0x3a, 0x3d, 0xbf, 0x9c, 0xe2, 0x21, 0x0b, 0xa1, 0x9a, 0x9e, 0xe2,
0x7a, 0x55, 0x2a, 0x6f, 0x73, 0x5d, 0x52, 0xb4, 0xa7, 0x68, 0x7c, 0x01, 0x16, 0xbb, 0x8e, 0xcd,
0xa6, 0x72, 0x97, 0x41, 0x6c, 0x7a, 0xee, 0x91, 0x5f, 0x4e, 0xf3, 0xf9, 0x2f, 0x08, 0xc1, 0x36,
0xe3, 0x13, 0xf7, 0xc8, 0xc7, 0x2f, 0x43, 0xf6, 0xc8, 0xf5, 0xf6, 0x1d, 0xd7, 0xea, 0x95, 0x33,
0xdc, 0xe6, 0x53, 0xb3, 0x6d, 0xde, 0x96, 0x5a, 0x24, 0xd2, 0xc7, 0x6b, 0x80, 0xfc, 0x03, 0xc7,
0xf4, 0xa9, 0x43, 0xbb, 0x81, 0xe9, 0xd8, 0x7d, 0x3b, 0x28, 0x67, 0x79, 0x15, 0x14, 0xfd, 0x03,
0xa7, 0xcd, 0xd9, 0x35, 0xc6, 0x55, 0x5f, 0x81, 0xe2, 0xf4, 0x9c, 0xf1, 0x22, 0x14, 0x8c, 0x3b,
0x2d, 0xdd, 0xd4, 0x1a, 0x5b, 0x66, 0x43, 0xab, 0xeb, 0xe8, 0x0c, 0x2e, 0x40, 0x8e, 0xb3, 0x9a,
0x8d, 0xda, 0x1d, 0xa4, 0xe0, 0x39, 0x48, 0x6a, 0xb5, 0x1a, 0x4a, 0xa8, 0x57, 0x21, 0x1b, 0x1a,
0xc7, 0x0b, 0x90, 0xef, 0x34, 0xda, 0x2d, 0xbd, 0x52, 0xdd, 0xae, 0xea, 0x5b, 0xe8, 0x0c, 0xce,
0x42, 0xaa, 0x59, 0x33, 0x5a, 0x48, 0x11, 0x4f, 0x5a, 0x0b, 0x25, 0xd8, 0x3f, 0xb7, 0x36, 0x35,
0x94, 0x7c, 0x2d, 0x95, 0x55, 0x50, 0x42, 0x7d, 0x37, 0x01, 0x69, 0x6e, 0x15, 0x63, 0x48, 0xc5,
0xaa, 0x9d, 0x3f, 0x47, 0x35, 0x92, 0xf8, 0x90, 0x1a, 0xe1, 0x6d, 0x44, 0x56, 0xab, 0x20, 0xf0,
0x39, 0xc8, 0xb9, 0xde, 0xae, 0x29, 0x24, 0x29, 0x51, 0xc7, 0xae, 0xb7, 0xcb, 0x9b, 0x0f, 0xab,
0x71, 0xd6, 0x8a, 0x76, 0x2c, 0x9f, 0x72, 0xdc, 0x73, 0x24, 0xa2, 0xf1, 0xe3, 0xc0, 0xf4, 0x4c,
0x3e, 0x8f, 0x0c, 0x97, 0xcd, 0xb9, 0xde, 0x6e, 0x83, 0x4d, 0xe5, 0x19, 0x28, 0x74, 0x5d, 0x67,
0xd4, 0x1f, 0x98, 0x0e, 0x1d, 0xec, 0x06, 0x7b, 0xe5, 0xb9, 0x55, 0x65, 0xad, 0x40, 0xe6, 0x05,
0xb3, 0xc6, 0x79, 0xb8, 0x0c, 0x73, 0xdd, 0x3d, 0xcb, 0xf3, 0xa9, 0xc0, 0xba, 0x40, 0x42, 0x92,
0x5b, 0xa5, 0x5d, 0xbb, 0x6f, 0x39, 0x7e, 0x39, 0xc7, 0x45, 0x11, 0xcd, 0x9c, 0xb8, 0xeb, 0x58,
0xbb, 0x7e, 0x19, 0xb8, 0x40, 0x10, 0xea, 0xff, 0x43, 0x92, 0xb8, 0x47, 0x6c, 0x48, 0x61, 0xd0,
0x2f, 0x2b, 0xab, 0xc9, 0x35, 0x4c, 0x42, 0x92, 0xb5, 0x41, 0xd9, 0x09, 0x44, 0x83, 0x08, 0x6b,
0xff, 0x4d, 0x98, 0x27, 0xd4, 0x1f, 0x39, 0x81, 0xfe, 0x56, 0xe0, 0x59, 0x3e, 0xde, 0x80, 0x7c,
0x3c, 0xf7, 0x95, 0x0f, 0xca, 0x7d, 0xa0, 0x93, 0xa4, 0x2f, 0xc3, 0xdc, 0x5d, 0x8f, 0xfa, 0x7b,
0xd4, 0x93, 0xb5, 0x15, 0x92, 0xac, 0xb3, 0xe4, 0x79, 0x5f, 0x10, 0x36, 0x58, 0x3f, 0x92, 0x55,
0xa1, 0x4c, 0xf5, 0x23, 0x1e, 0x54, 0x22, 0x65, 0x0c, 0x3d, 0x96, 0xe8, 0xa6, 0x75, 0xf7, 0x2e,
0xed, 0x06, 0x54, 0xb4, 0xdd, 0x14, 0x99, 0x67, 0x4c, 0x4d, 0xf2, 0x58, 0xd8, 0xec, 0x81, 0x4f,
0xbd, 0xc0, 0xb4, 0x7b, 0x3c, 0xa0, 0x29, 0x92, 0x15, 0x8c, 0x6a, 0x0f, 0x3f, 0x05, 0x29, 0x5e,
0x2a, 0x29, 0x6e, 0x05, 0xa4, 0x15, 0xe2, 0x1e, 0x11, 0xce, 0xc7, 0x2f, 0x40, 0x86, 0x72, 0x7f,
0x79, 0x50, 0x27, 0xcd, 0x25, 0x0e, 0x05, 0x91, 0x2a, 0xea, 0xcf, 0x93, 0x90, 0x6f, 0x07, 0x1e,
0xb5, 0xfa, 0xdc, 0x7f, 0xfc, 0x29, 0x00, 0x3f, 0xb0, 0x02, 0xda, 0xa7, 0x83, 0x20, 0x74, 0xe4,
0x09, 0x39, 0x40, 0x4c, 0x6f, 0xbd, 0x1d, 0x2a, 0x91, 0x98, 0xfe, 0x71, 0x80, 0x13, 0x0f, 0x00,
0xf0, 0xca, 0xfb, 0x09, 0xc8, 0x45, 0xa3, 0x61, 0x0d, 0xb2, 0x5d, 0x2b, 0xa0, 0xbb, 0xae, 0x37,
0x96, 0xeb, 0xc1, 0xf9, 0x0f, 0xb3, 0xbe, 0x5e, 0x91, 0xca, 0x24, 0xfa, 0x1b, 0x7e, 0x12, 0xc4,
0x82, 0x2a, 0x92, 0x57, 0xac, 0x6a, 0x39, 0xce, 0xe1, 0xe9, 0xfb, 0x32, 0xe0, 0xa1, 0x67, 0xf7,
0x2d, 0x6f, 0x6c, 0xee, 0xd3, 0x71, 0xd8, 0xc8, 0x92, 0x33, 0x42, 0x86, 0xa4, 0xde, 0x0d, 0x3a,
0x96, 0xed, 0xe0, 0xea, 0xf4, 0x7f, 0x65, 0xd2, 0x9d, 0x0c, 0x44, 0xec, 0x9f, 0x7c, 0x35, 0xf2,
0xc3, 0x75, 0x27, 0xcd, 0xf3, 0x93, 0x3d, 0xaa, 0xcf, 0x43, 0x36, 0x9c, 0x3c, 0xce, 0x41, 0x5a,
0xf7, 0x3c, 0xd7, 0x43, 0x67, 0x78, 0x57, 0xa8, 0xd7, 0x44, 0x63, 0xd9, 0xda, 0x62, 0x8d, 0xe5,
0x57, 0x89, 0xa8, 0xf9, 0x13, 0x7a, 0x30, 0xa2, 0x7e, 0x80, 0x3f, 0x0b, 0x25, 0xca, 0x73, 0xc5,
0x3e, 0xa4, 0x66, 0x97, 0xef, 0x14, 0x58, 0xa6, 0x88, 0x84, 0x5e, 0x58, 0x17, 0x7b, 0x98, 0x70,
0x07, 0x41, 0x16, 0x23, 0x5d, 0xc9, 0xea, 0x61, 0x1d, 0x4a, 0x76, 0xbf, 0x4f, 0x7b, 0xb6, 0x15,
0xc4, 0x07, 0x10, 0x01, 0x5b, 0x0e, 0x17, 0xd2, 0xa9, 0x8d, 0x08, 0x59, 0x8c, 0xfe, 0x11, 0x0d,
0x73, 0x1e, 0x32, 0x01, 0xdf, 0x20, 0xc9, 0x75, 0xa4, 0x10, 0xf6, 0x25, 0xce, 0x24, 0x52, 0x88,
0x9f, 0x07, 0xb1, 0xdb, 0xe2, 0x1d, 0x68, 0x92, 0x10, 0x93, 0x95, 0x95, 0x08, 0x39, 0x3e, 0x0f,
0xc5, 0xc0, 0xb3, 0x06, 0xbe, 0xd5, 0x65, 0xdd, 0x9c, 0xcd, 0x28, 0xcd, 0x1b, 0x75, 0x21, 0xc6,
0xad, 0xf6, 0xf0, 0xff, 0xc2, 0x9c, 0x2b, 0xfa, 0x3d, 0xef, 0x4d, 0x93, 0x19, 0x4f, 0x2f, 0x06,
0x24, 0xd4, 0x52, 0x3f, 0x0d, 0x0b, 0x11, 0x82, 0xfe, 0xd0, 0x1d, 0xf8, 0x14, 0x5f, 0x80, 0x8c,
0xc7, 0x0b, 0x42, 0xa2, 0x86, 0xe5, 0x10, 0xb1, 0x8a, 0x26, 0x52, 0x43, 0xed, 0xc1, 0x82, 0xe0,
0xdc, 0xb6, 0x83, 0x3d, 0x1e, 0x28, 0x7c, 0x1e, 0xd2, 0x94, 0x3d, 0x1c, 0xc3, 0x9c, 0xb4, 0x2a,
0x5c, 0x4e, 0x84, 0x34, 0x66, 0x25, 0x71, 0x5f, 0x2b, 0x7f, 0x4b, 0x40, 0x49, 0xce, 0x72, 0xd3,
0x0a, 0xba, 0x7b, 0xa7, 0x34, 0xd8, 0x2f, 0xc0, 0x1c, 0xe3, 0xdb, 0x51, 0x61, 0xcc, 0x08, 0x77,
0xa8, 0xc1, 0x02, 0x6e, 0xf9, 0x66, 0x2c, 0xba, 0x72, 0x03, 0x50, 0xb0, 0x7c, 0x63, 0xc2, 0x9c,
0x91, 0x17, 0x99, 0xfb, 0xe4, 0xc5, 0xdc, 0x03, 0xe5, 0xc5, 0x16, 0x2c, 0x4d, 0x23, 0x2e, 0x93,
0xe3, 0x45, 0x98, 0x13, 0x41, 0x09, 0x5b, 0xe0, 0xac, 0xb8, 0x85, 0x2a, 0xea, 0xcf, 0x12, 0xb0,
0x24, 0xbb, 0xd3, 0xc7, 0xa3, 0x4c, 0x63, 0x38, 0xa7, 0x1f, 0x08, 0xe7, 0x0a, 0x2c, 0x1f, 0x03,
0xe8, 0x21, 0xaa, 0xf0, 0xaf, 0x0a, 0xcc, 0x6f, 0xd2, 0x5d, 0x7b, 0x70, 0x4a, 0xe1, 0x8d, 0xa1,
0x96, 0x7a, 0x20, 0xd4, 0xae, 0x40, 0x41, 0xfa, 0x2b, 0xd1, 0x3a, 0x59, 0x06, 0xca, 0x8c, 0x32,
0x50, 0xff, 0xac, 0x40, 0xa1, 0xe2, 0xf6, 0xfb, 0x76, 0x70, 0x4a, 0x91, 0x3a, 0xe9, 0x67, 0x6a,
0x96, 0x9f, 0x08, 0x8a, 0xa1, 0x9b, 0x02, 0x20, 0xf5, 0x2f, 0x0a, 0x2c, 0x10, 0xd7, 0x71, 0x76,
0xac, 0xee, 0xfe, 0xa3, 0xed, 0x3b, 0x06, 0x34, 0x71, 0x54, 0x7a, 0xff, 0x0f, 0x05, 0x8a, 0x2d,
0x8f, 0xb2, 0xb7, 0xb6, 0x47, 0xda, 0x79, 0xf6, 0x82, 0xd4, 0x0b, 0xe4, 0xe6, 0x20, 0x47, 0xf8,
0xb3, 0xba, 0x08, 0x0b, 0x91, 0xef, 0x12, 0x8f, 0xdf, 0x2b, 0xb0, 0x2c, 0x12, 0x44, 0x4a, 0x7a,
0xa7, 0x14, 0x96, 0xd0, 0xdf, 0x54, 0xcc, 0xdf, 0x32, 0x3c, 0x76, 0xdc, 0x37, 0xe9, 0xf6, 0xdb,
0x09, 0x38, 0x1b, 0xe6, 0xc6, 0x29, 0x77, 0xfc, 0xdf, 0xc8, 0x87, 0x15, 0x28, 0x9f, 0x04, 0x41,
0x22, 0xf4, 0x4e, 0x02, 0xca, 0x15, 0x8f, 0x5a, 0x01, 0x8d, 0x6d, 0x32, 0x1e, 0x9d, 0xdc, 0xc0,
0x2f, 0xc1, 0xfc, 0xd0, 0xf2, 0x02, 0xbb, 0x6b, 0x0f, 0x2d, 0xf6, 0x1a, 0x97, 0xe6, 0x7b, 0x98,
0x63, 0x03, 0x4c, 0xa9, 0xa8, 0xe7, 0xe0, 0xf1, 0x19, 0x88, 0x48, 0xbc, 0xfe, 0xa9, 0x00, 0x6e,
0x07, 0x96, 0x17, 0x7c, 0x0c, 0x56, 0x95, 0x99, 0xc9, 0xb4, 0x0c, 0xa5, 0x29, 0xff, 0xe3, 0xb8,
0xd0, 0xe0, 0x63, 0xb1, 0xe2, 0x7c, 0x20, 0x2e, 0x71, 0xff, 0x25, 0x2e, 0x7f, 0x54, 0x60, 0xa5,
0xe2, 0x8a, 0x93, 0xb4, 0x47, 0xb2, 0xc2, 0xd4, 0x27, 0xe1, 0xdc, 0x4c, 0x07, 0x25, 0x00, 0x7f,
0x50, 0xe0, 0x31, 0x42, 0xad, 0xde, 0xa3, 0xe9, 0xfc, 0x4d, 0x38, 0x7b, 0xc2, 0x39, 0xb9, 0x43,
0xbd, 0x02, 0xd9, 0x3e, 0x0d, 0xac, 0x9e, 0x15, 0x58, 0xd2, 0xa5, 0x95, 0x70, 0xdc, 0x89, 0x76,
0x5d, 0x6a, 0x90, 0x48, 0x57, 0x7d, 0x3f, 0x01, 0x25, 0xbe, 0xd7, 0xfd, 0xe4, 0x0d, 0x6a, 0xf6,
0xbb, 0xc0, 0x3b, 0x0a, 0x2c, 0x4d, 0x03, 0x14, 0xbd, 0x13, 0xfc, 0xa7, 0x0f, 0x22, 0x66, 0x34,
0x84, 0xe4, 0xac, 0x2d, 0xe8, 0x6f, 0x12, 0x50, 0x8e, 0x4f, 0xe9, 0x93, 0x43, 0x8b, 0xe9, 0x43,
0x8b, 0x8f, 0x7c, 0x4a, 0xf5, 0xae, 0x02, 0x8f, 0xcf, 0x00, 0xf4, 0xa3, 0x05, 0x3a, 0x76, 0x74,
0x91, 0xb8, 0xef, 0xd1, 0xc5, 0x83, 0x86, 0xfa, 0x77, 0x0a, 0x2c, 0xd5, 0xa9, 0xef, 0x5b, 0xbb,
0x54, 0xbc, 0xc7, 0x9f, 0xde, 0x6e, 0xc6, 0x0f, 0x85, 0x53, 0x93, 0x9b, 0x15, 0xb5, 0x02, 0xcb,
0xc7, 0x5c, 0x7b, 0x88, 0xb3, 0x89, 0xbf, 0x2b, 0xb0, 0x28, 0x47, 0xd1, 0x4e, 0xed, 0x46, 0x60,
0x06, 0x3a, 0xf8, 0x29, 0x48, 0xda, 0xbd, 0x70, 0x07, 0x39, 0x7d, 0xc3, 0xca, 0x04, 0xea, 0x35,
0xc0, 0x71, 0xbf, 0x1f, 0x02, 0xba, 0xdf, 0x26, 0x61, 0xb1, 0x3d, 0x74, 0xec, 0x40, 0x0a, 0x1f,
0xed, 0xc6, 0xff, 0x5f, 0x30, 0xef, 0x33, 0x67, 0x4d, 0x71, 0x5b, 0xc6, 0x81, 0xcd, 0x91, 0x3c,
0xe7, 0x55, 0x38, 0x0b, 0x3f, 0x0d, 0xf9, 0x50, 0x65, 0x34, 0x08, 0xe4, 0x49, 0x27, 0x48, 0x8d,
0xd1, 0x20, 0xc0, 0x97, 0xe1, 0xec, 0x60, 0xd4, 0xe7, 0xf7, 0xa5, 0xe6, 0x90, 0x7a, 0x26, 0x1f,
0xd9, 0x64, 0xdb, 0x79, 0x79, 0xaf, 0x59, 0x1a, 0x8c, 0xfa, 0xc4, 0x3d, 0xf2, 0x5b, 0xd4, 0xe3,
0xc6, 0x5b, 0x96, 0x17, 0xe0, 0x6b, 0x90, 0xb3, 0x9c, 0x5d, 0xd7, 0xb3, 0x83, 0xbd, 0x3e, 0xbf,
0x78, 0x2b, 0x6e, 0xa8, 0xe1, 0xd5, 0xca, 0x71, 0xf8, 0xd7, 0xb5, 0x50, 0x93, 0x4c, 0xfe, 0xa4,
0xbe, 0x08, 0xb9, 0x88, 0x8f, 0x11, 0xcc, 0xeb, 0x37, 0x3b, 0x5a, 0xcd, 0x6c, 0xb7, 0x6a, 0x55,
0xa3, 0x2d, 0x2e, 0x46, 0xb7, 0x3b, 0xb5, 0x9a, 0xd9, 0xae, 0x68, 0x0d, 0xa4, 0xa8, 0x04, 0x80,
0x0f, 0xc9, 0x07, 0x9f, 0x00, 0xa4, 0xdc, 0x07, 0xa0, 0x73, 0x90, 0xf3, 0xdc, 0x23, 0xe9, 0x7b,
0x82, 0xbb, 0x93, 0xf5, 0xdc, 0x23, 0xee, 0xb9, 0xaa, 0x01, 0x8e, 0xcf, 0x55, 0x66, 0x5b, 0xac,
0x79, 0x2b, 0x53, 0xcd, 0x7b, 0x62, 0x3f, 0x6a, 0xde, 0x62, 0x2b, 0xcf, 0xea, 0xfc, 0x55, 0x6a,
0x39, 0x41, 0xb8, 0x5e, 0xa9, 0xbf, 0x48, 0x40, 0x81, 0x30, 0x8e, 0xdd, 0xa7, 0xed, 0xc0, 0x0a,
0x7c, 0x16, 0xa9, 0x3d, 0xae, 0x62, 0x4e, 0xda, 0x6e, 0x8e, 0xe4, 0x05, 0x4f, 0x5c, 0x02, 0x6c,
0xc0, 0xb2, 0x4f, 0xbb, 0xee, 0xa0, 0xe7, 0x9b, 0x3b, 0x74, 0xcf, 0x1e, 0xf4, 0xcc, 0xbe, 0xe5,
0x07, 0xf2, 0xa6, 0xb0, 0x40, 0x4a, 0x52, 0xb8, 0xc9, 0x65, 0x75, 0x2e, 0xc2, 0x17, 0x61, 0x69,
0xc7, 0x1e, 0x38, 0xee, 0xae, 0x39, 0x74, 0xac, 0x31, 0xf5, 0x7c, 0xe9, 0x2a, 0x4b, 0xaf, 0x34,
0xc1, 0x42, 0xd6, 0x12, 0x22, 0x11, 0xee, 0x37, 0xe0, 0xc2, 0x4c, 0x2b, 0xe6, 0x5d, 0xdb, 0x09,
0xa8, 0x47, 0x7b, 0xa6, 0x47, 0x87, 0x8e, 0xdd, 0xb5, 0xf8, 0x52, 0x24, 0xf6, 0xee, 0xcf, 0xcd,
0x30, 0xbd, 0x2d, 0xd5, 0xc9, 0x44, 0x9b, 0xa1, 0xdd, 0x1d, 0x8e, 0xcc, 0x11, 0x2b, 0x60, 0xbe,
0x8a, 0x29, 0x24, 0xdb, 0x1d, 0x8e, 0x3a, 0x8c, 0xc6, 0x08, 0x92, 0x07, 0x43, 0xb1, 0x78, 0x29,
0x84, 0x3d, 0x32, 0x94, 0x96, 0xa6, 0xd1, 0x8b, 0x16, 0xa7, 0xb0, 0x4c, 0x94, 0x0f, 0x2b, 0x93,
0x32, 0xcc, 0xf9, 0xd4, 0x3b, 0xb4, 0x07, 0xbb, 0xe1, 0x65, 0xaa, 0x24, 0x71, 0x1b, 0x9e, 0x93,
0x9f, 0xcb, 0xd0, 0xb7, 0x02, 0xea, 0x0d, 0x2c, 0xc7, 0x19, 0x9b, 0xe2, 0xbd, 0x7d, 0x10, 0xd0,
0x9e, 0x39, 0xf9, 0x80, 0x45, 0x2c, 0x50, 0xcf, 0x08, 0x6d, 0x3d, 0x52, 0x26, 0x91, 0xae, 0x11,
0x7d, 0xda, 0xf2, 0x0a, 0x14, 0x3d, 0x19, 0x53, 0xd3, 0x67, 0x41, 0x95, 0xe5, 0xb9, 0x14, 0xdd,
0x88, 0xc6, 0x02, 0x4e, 0x0a, 0xde, 0x54, 0xfc, 0xaf, 0xc2, 0xbc, 0x9c, 0x91, 0xe5, 0xd8, 0xd6,
0x64, 0x9f, 0x76, 0xec, 0x0b, 0x1e, 0x8d, 0x09, 0x89, 0xfc, 0xd6, 0x87, 0x13, 0xec, 0xb5, 0xb0,
0xd4, 0x19, 0xf6, 0xac, 0xe0, 0x74, 0x2f, 0x96, 0xf1, 0x4f, 0x80, 0x52, 0xd3, 0x9f, 0x00, 0x4d,
0x7f, 0x52, 0x94, 0x3e, 0xf6, 0x49, 0x91, 0x7a, 0x0d, 0x96, 0xa6, 0xfd, 0x97, 0x59, 0xb2, 0x06,
0x69, 0x7e, 0xf1, 0x7b, 0x6c, 0x55, 0x88, 0xdd, 0xec, 0x12, 0xa1, 0xa0, 0xfe, 0x52, 0x81, 0xd2,
0x8c, 0x37, 0x86, 0xe8, 0x75, 0x44, 0x89, 0x9d, 0x76, 0xfc, 0x0f, 0xa4, 0xf9, 0x15, 0xb4, 0xfc,
0x36, 0xe2, 0xec, 0xc9, 0x17, 0x0e, 0x7e, 0x5d, 0x4c, 0x84, 0x16, 0xab, 0x6b, 0x9e, 0x10, 0x5d,
0x7e, 0xdc, 0x11, 0x6e, 0x78, 0xf2, 0x8c, 0x27, 0x4e, 0x40, 0x4e, 0x9e, 0x9f, 0xa4, 0xee, 0x7b,
0x7e, 0x72, 0xe1, 0xbb, 0x49, 0xc8, 0xd5, 0xc7, 0xed, 0x03, 0x67, 0xdb, 0xb1, 0x76, 0xf9, 0x7d,
0x6e, 0xbd, 0x65, 0xdc, 0x41, 0x67, 0xf0, 0x22, 0x14, 0x1a, 0x4d, 0xc3, 0x6c, 0xb0, 0xce, 0xb8,
0x5d, 0xd3, 0xae, 0x23, 0x85, 0xb5, 0xce, 0x16, 0xa9, 0x9a, 0x37, 0xf4, 0x3b, 0x82, 0x93, 0xc0,
0x25, 0x58, 0xe8, 0x34, 0xaa, 0x37, 0x3b, 0xfa, 0x84, 0x99, 0xc2, 0xcb, 0xb0, 0x58, 0xef, 0xd4,
0x8c, 0x6a, 0xab, 0x16, 0x63, 0x67, 0x59, 0x9b, 0xdd, 0xac, 0x35, 0x37, 0x05, 0x89, 0xd8, 0xf8,
0x9d, 0x46, 0xbb, 0x7a, 0xbd, 0xa1, 0x6f, 0x09, 0xd6, 0x2a, 0x63, 0xbd, 0xa1, 0x93, 0xe6, 0x76,
0x35, 0x34, 0x79, 0x0d, 0x23, 0xc8, 0x6f, 0x56, 0x1b, 0x1a, 0x91, 0xa3, 0xdc, 0x53, 0x70, 0x11,
0x72, 0x7a, 0xa3, 0x53, 0x97, 0x74, 0x02, 0x97, 0xa1, 0xa4, 0x75, 0x8c, 0xa6, 0x59, 0x6d, 0x54,
0x88, 0x5e, 0xd7, 0x1b, 0x86, 0x94, 0xa4, 0x70, 0x09, 0x8a, 0x46, 0xb5, 0xae, 0xb7, 0x0d, 0xad,
0xde, 0x92, 0x4c, 0x36, 0x8b, 0x6c, 0x5b, 0x0f, 0x75, 0x10, 0x5e, 0x81, 0xe5, 0x46, 0xd3, 0xdc,
0xd2, 0xb7, 0xb5, 0x4e, 0xcd, 0x30, 0x6f, 0x69, 0xb5, 0x8e, 0x2e, 0x65, 0xab, 0xf8, 0x2c, 0xe0,
0x66, 0xc3, 0xec, 0xb4, 0xb6, 0x34, 0x43, 0x37, 0x1b, 0xcd, 0xdb, 0x52, 0x70, 0x0d, 0x17, 0x21,
0x3b, 0x99, 0xc1, 0x3d, 0x86, 0x42, 0xa1, 0xa5, 0x11, 0x63, 0xe2, 0xec, 0xbd, 0x7b, 0x0c, 0x2c,
0xb8, 0x4e, 0x9a, 0x9d, 0xd6, 0x44, 0x6d, 0x11, 0xf2, 0x12, 0x2c, 0xc9, 0x4a, 0x31, 0xd6, 0x66,
0xb5, 0x51, 0x89, 0xe6, 0x77, 0x2f, 0xbb, 0x92, 0x40, 0xca, 0x85, 0x7d, 0x48, 0xf1, 0x70, 0x64,
0x21, 0xd5, 0x68, 0x36, 0x74, 0x74, 0x06, 0x2f, 0x00, 0x54, 0xdb, 0xd5, 0x86, 0xa1, 0x5f, 0x27,
0x5a, 0x8d, 0xb9, 0xcd, 0x19, 0x21, 0x80, 0xcc, 0xdb, 0x79, 0x98, 0xab, 0xb6, 0xb7, 0x6b, 0x4d,
0xcd, 0x90, 0x6e, 0x56, 0xdb, 0x37, 0x3b, 0x4d, 0x83, 0x09, 0x11, 0xce, 0x43, 0xa6, 0xda, 0x36,
0xf4, 0xd7, 0x0d, 0xe6, 0x17, 0x97, 0x09, 0x54, 0xd1, 0xbd, 0x6b, 0x17, 0xde, 0x4b, 0x42, 0xca,
0x18, 0x0f, 0x29, 0x0b, 0x10, 0x8f, 0xb6, 0x71, 0xa7, 0xc5, 0x4c, 0xe6, 0x20, 0x55, 0x6d, 0x18,
0x57, 0xd1, 0xe7, 0x12, 0x18, 0x20, 0xdd, 0xe1, 0xcf, 0x9f, 0xcf, 0xb0, 0xe7, 0x6a, 0xc3, 0x78,
0xe9, 0x0a, 0x7a, 0x3b, 0xc1, 0x86, 0xed, 0x08, 0xe2, 0x0b, 0xa1, 0x60, 0xe3, 0x32, 0xfa, 0x62,
0x24, 0xd8, 0xb8, 0x8c, 0xbe, 0x14, 0x0a, 0x2e, 0x6d, 0xa0, 0x2f, 0x47, 0x82, 0x4b, 0x1b, 0xe8,
0x2b, 0xa1, 0xe0, 0xca, 0x65, 0xf4, 0xd5, 0x48, 0x70, 0xe5, 0x32, 0xfa, 0x5a, 0x86, 0xf9, 0xc2,
0x3d, 0xb9, 0xb4, 0x81, 0xbe, 0x9e, 0x8d, 0xa8, 0x2b, 0x97, 0xd1, 0x37, 0xb2, 0x2c, 0xfe, 0x51,
0x54, 0xd1, 0x37, 0x11, 0x9b, 0x26, 0x0b, 0x10, 0xfa, 0x16, 0x7f, 0x64, 0x22, 0xf4, 0x6d, 0xc4,
0x7c, 0x64, 0x5c, 0x4e, 0xbe, 0xc3, 0x25, 0x77, 0x74, 0x8d, 0xa0, 0xef, 0x64, 0x70, 0x1e, 0xe6,
0xb6, 0xf4, 0x4a, 0xb5, 0xae, 0xd5, 0x10, 0xe6, 0xff, 0x60, 0xa8, 0x7c, 0xef, 0x22, 0x7b, 0x64,
0xe9, 0x89, 0xbe, 0xdf, 0x62, 0x06, 0x6f, 0x69, 0xa4, 0xf2, 0xaa, 0x46, 0xd0, 0x0f, 0x2e, 0x32,
0x83, 0xb7, 0x34, 0x22, 0xf1, 0xfa, 0x61, 0x8b, 0x29, 0x72, 0xd1, 0xbb, 0x17, 0xd9, 0xa4, 0x25,
0xff, 0x47, 0x2d, 0x9c, 0x85, 0xe4, 0x66, 0xd5, 0x40, 0xef, 0x71, 0x6b, 0x2c, 0x45, 0xd1, 0x8f,
0x11, 0x63, 0xb6, 0x75, 0x03, 0xfd, 0x84, 0x31, 0xd3, 0x46, 0xa7, 0x55, 0xd3, 0xd1, 0x13, 0x6c,
0x72, 0xd7, 0xf5, 0x66, 0x5d, 0x37, 0xc8, 0x1d, 0xf4, 0x53, 0xae, 0xfe, 0x5a, 0xbb, 0xd9, 0x40,
0xef, 0x23, 0x5c, 0x04, 0xd0, 0x5f, 0x6f, 0x11, 0xbd, 0xdd, 0xae, 0x36, 0x1b, 0xe8, 0xe9, 0x0b,
0xdb, 0x80, 0x8e, 0xb7, 0x03, 0xe6, 0x40, 0xa7, 0x71, 0xa3, 0xd1, 0xbc, 0xdd, 0x40, 0x67, 0x18,
0xd1, 0x22, 0x7a, 0x4b, 0x23, 0x3a, 0x52, 0x30, 0x40, 0xa6, 0xd2, 0xac, 0xd7, 0xab, 0x06, 0x4a,
0xe0, 0x79, 0xc8, 0x92, 0x66, 0xad, 0xb6, 0xa9, 0x55, 0x6e, 0xa0, 0xe4, 0xe6, 0x22, 0x2c, 0xd8,
0xee, 0xfa, 0xa1, 0x1d, 0x50, 0xdf, 0x17, 0xdf, 0x88, 0xee, 0x64, 0xf8, 0xcf, 0xa5, 0x7f, 0x05,
0x00, 0x00, 0xff, 0xff, 0x70, 0x81, 0xa1, 0xf7, 0x5d, 0x2a, 0x00, 0x00,
// 3047 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xcb, 0x73, 0x1b, 0xc7,
0xd1, 0xd7, 0xe2, 0x41, 0x02, 0x0d, 0x02, 0x1c, 0x0e, 0x48, 0x0b, 0xa6, 0xfc, 0xe0, 0xb7, 0xb6,
0x6c, 0x7e, 0xb4, 0x3f, 0x7e, 0x32, 0xa5, 0x4f, 0x9f, 0xca, 0xce, 0x43, 0x4b, 0x70, 0x29, 0xc3,
0x02, 0x16, 0xd0, 0x60, 0x21, 0x59, 0x2e, 0x57, 0x6d, 0x2d, 0x81, 0x11, 0xb9, 0xc5, 0x05, 0x16,
0xdc, 0x5d, 0x88, 0xe6, 0x4d, 0x89, 0xf3, 0x7e, 0x3a, 0x4f, 0xc7, 0x49, 0xc5, 0x49, 0x55, 0xee,
0x39, 0xe7, 0x98, 0xca, 0x1f, 0x90, 0x5b, 0x0e, 0x49, 0x0e, 0x39, 0xa5, 0x72, 0x4b, 0xe5, 0x94,
0x43, 0x0e, 0xa9, 0xd4, 0x3c, 0x76, 0xb1, 0x20, 0x61, 0x4b, 0x56, 0x72, 0xa1, 0xec, 0x13, 0x66,
0xba, 0x1b, 0xdd, 0xd3, 0xbf, 0xee, 0xe9, 0x99, 0x9d, 0x19, 0x28, 0x1c, 0x8c, 0xa8, 0x7f, 0xb4,
0x3e, 0xf4, 0xbd, 0xd0, 0xc3, 0x59, 0xde, 0x59, 0x2e, 0x85, 0xde, 0xd0, 0xeb, 0xd9, 0xa1, 0x2d,
0xc8, 0xcb, 0x85, 0xbb, 0xa1, 0x3f, 0xec, 0x8a, 0x8e, 0x7a, 0x00, 0x33, 0xa6, 0xed, 0xef, 0xd2,
0x10, 0x2f, 0x43, 0x6e, 0x9f, 0x1e, 0x05, 0x43, 0xbb, 0x4b, 0x2b, 0xca, 0x8a, 0xb2, 0x9a, 0x27,
0x71, 0x1f, 0x2f, 0x42, 0x36, 0xd8, 0xb3, 0xfd, 0x5e, 0x25, 0xc5, 0x19, 0xa2, 0x83, 0xff, 0x0f,
0x0a, 0xa1, 0xbd, 0xe3, 0xd2, 0xd0, 0x0a, 0x8f, 0x86, 0xb4, 0x92, 0x5e, 0x51, 0x56, 0x4b, 0x1b,
0x8b, 0xeb, 0xb1, 0x39, 0x93, 0x33, 0xcd, 0xa3, 0x21, 0x25, 0x10, 0xc6, 0x6d, 0x75, 0x0b, 0x4a,
0x37, 0xcd, 0x6b, 0x76, 0x48, 0xab, 0xb6, 0xeb, 0x52, 0xbf, 0xb6, 0xc5, 0x4c, 0x8f, 0x02, 0xea,
0x0f, 0xec, 0x7e, 0x6c, 0x3a, 0xea, 0xe3, 0xc7, 0x60, 0x66, 0xd7, 0xf7, 0x46, 0xc3, 0xa0, 0x92,
0x5a, 0x49, 0xaf, 0xe6, 0x89, 0xec, 0xa9, 0x6f, 0x02, 0xe8, 0x77, 0xe9, 0x20, 0x34, 0xbd, 0x7d,
0x3a, 0xc0, 0x4f, 0x40, 0x3e, 0x74, 0xfa, 0x34, 0x08, 0xed, 0xfe, 0x90, 0xab, 0x48, 0x93, 0x31,
0xe1, 0x03, 0x86, 0xbf, 0x0c, 0xb9, 0xa1, 0x17, 0x38, 0xa1, 0xe3, 0x0d, 0xf8, 0xd8, 0xf3, 0x24,
0xee, 0xab, 0x9f, 0x81, 0xec, 0x4d, 0xdb, 0x1d, 0x51, 0xfc, 0x34, 0x64, 0xb8, 0x73, 0x0a, 0x77,
0xae, 0xb0, 0x2e, 0xf0, 0xe5, 0x3e, 0x71, 0x06, 0xd3, 0x7d, 0x97, 0x49, 0x72, 0xdd, 0x73, 0x44,
0x74, 0xd4, 0x7d, 0x98, 0xdb, 0x74, 0x06, 0xbd, 0x9b, 0xb6, 0xef, 0x30, 0xc7, 0x1f, 0x52, 0x0d,
0x7e, 0x16, 0x66, 0x78, 0x23, 0xa8, 0xa4, 0x57, 0xd2, 0xab, 0x85, 0x8d, 0x39, 0xf9, 0x47, 0x3e,
0x36, 0x22, 0x79, 0xea, 0x6f, 0x14, 0x80, 0x4d, 0x6f, 0x34, 0xe8, 0xdd, 0x60, 0x4c, 0x8c, 0x20,
0x1d, 0x1c, 0xb8, 0x12, 0x48, 0xd6, 0xc4, 0xd7, 0xa1, 0xb4, 0xe3, 0x0c, 0x7a, 0xd6, 0x5d, 0x39,
0x1c, 0x81, 0x65, 0x61, 0xe3, 0x59, 0xa9, 0x6e, 0xfc, 0xe7, 0xf5, 0xe4, 0xa8, 0x03, 0x7d, 0x10,
0xfa, 0x47, 0xa4, 0xb8, 0x93, 0xa4, 0x2d, 0x77, 0x00, 0x9f, 0x14, 0x62, 0x46, 0xf7, 0xe9, 0x51,
0x64, 0x74, 0x9f, 0x1e, 0xe1, 0xff, 0x4e, 0x7a, 0x54, 0xd8, 0x28, 0x47, 0xb6, 0x12, 0xff, 0x95,
0x6e, 0xbe, 0x9c, 0xba, 0xa2, 0xa8, 0xbf, 0xca, 0x42, 0x49, 0x7f, 0x8b, 0x76, 0x47, 0x21, 0x6d,
0x0e, 0x59, 0x0c, 0x02, 0xbc, 0x0e, 0x65, 0x67, 0xd0, 0x75, 0x47, 0x3d, 0x6a, 0x51, 0x16, 0x6a,
0x2b, 0x64, 0xb1, 0xe6, 0xfa, 0x72, 0x64, 0x41, 0xb2, 0x12, 0x49, 0xa0, 0x41, 0xb9, 0xeb, 0xf5,
0x87, 0xb6, 0x3f, 0x29, 0x9f, 0xe6, 0xf6, 0x17, 0xa4, 0xfd, 0xb1, 0x3c, 0x59, 0x90, 0xd2, 0x09,
0x15, 0x0d, 0x98, 0x97, 0x7a, 0x7b, 0xd6, 0x1d, 0x87, 0xba, 0xbd, 0xa0, 0x92, 0xe1, 0x21, 0x8b,
0xa0, 0x9a, 0x1c, 0xe2, 0x7a, 0x4d, 0x0a, 0x6f, 0x73, 0x59, 0x52, 0x72, 0x26, 0xfa, 0x78, 0x0d,
0x16, 0xba, 0xae, 0xc3, 0x86, 0x72, 0x87, 0x41, 0x6c, 0xf9, 0xde, 0x61, 0x50, 0xc9, 0xf2, 0xf1,
0xcf, 0x0b, 0xc6, 0x36, 0xa3, 0x13, 0xef, 0x30, 0xc0, 0x2f, 0x43, 0xee, 0xd0, 0xf3, 0xf7, 0x5d,
0xcf, 0xee, 0x55, 0x66, 0xb8, 0xcd, 0xa7, 0xa6, 0xdb, 0xbc, 0x25, 0xa5, 0x48, 0x2c, 0x8f, 0x57,
0x01, 0x05, 0x07, 0xae, 0x15, 0x50, 0x97, 0x76, 0x43, 0xcb, 0x75, 0xfa, 0x4e, 0x58, 0xc9, 0xf1,
0x59, 0x50, 0x0a, 0x0e, 0xdc, 0x36, 0x27, 0xd7, 0x19, 0x15, 0x5b, 0xb0, 0x14, 0xfa, 0xf6, 0x20,
0xb0, 0xbb, 0x4c, 0x99, 0xe5, 0x04, 0x9e, 0x6b, 0xf3, 0x19, 0x90, 0xe7, 0x26, 0xd7, 0xa6, 0x9b,
0x34, 0xc7, 0x7f, 0xa9, 0x45, 0xff, 0x20, 0x8b, 0xe1, 0x14, 0xaa, 0xfa, 0x0a, 0x94, 0x26, 0x41,
0xc1, 0x0b, 0x50, 0x34, 0x6f, 0xb7, 0x74, 0x4b, 0x33, 0xb6, 0x2c, 0x43, 0x6b, 0xe8, 0xe8, 0x0c,
0x2e, 0x42, 0x9e, 0x93, 0x9a, 0x46, 0xfd, 0x36, 0x52, 0xf0, 0x2c, 0xa4, 0xb5, 0x7a, 0x1d, 0xa5,
0xd4, 0x2b, 0x90, 0x8b, 0xbc, 0xc3, 0xf3, 0x50, 0xe8, 0x18, 0xed, 0x96, 0x5e, 0xad, 0x6d, 0xd7,
0xf4, 0x2d, 0x74, 0x06, 0xe7, 0x20, 0xd3, 0xac, 0x9b, 0x2d, 0xa4, 0x88, 0x96, 0xd6, 0x42, 0x29,
0xf6, 0xcf, 0xad, 0x4d, 0x0d, 0xa5, 0xd5, 0x10, 0x16, 0xa7, 0x0d, 0x12, 0x17, 0x60, 0x76, 0x4b,
0xdf, 0xd6, 0x3a, 0x75, 0x13, 0x9d, 0xc1, 0x65, 0x98, 0x27, 0x7a, 0x4b, 0xd7, 0x4c, 0x6d, 0xb3,
0xae, 0x5b, 0x44, 0xd7, 0xb6, 0x90, 0x82, 0x31, 0x94, 0x58, 0xcb, 0xaa, 0x36, 0x1b, 0x8d, 0x9a,
0x69, 0xea, 0x5b, 0x28, 0x85, 0x17, 0x01, 0x71, 0x5a, 0xc7, 0x18, 0x53, 0xd3, 0x18, 0xc1, 0x5c,
0x5b, 0x27, 0x35, 0xad, 0x5e, 0x7b, 0x83, 0x29, 0x40, 0x99, 0xd7, 0x32, 0x39, 0x05, 0xa5, 0xd4,
0x77, 0x53, 0x90, 0xe5, 0xbe, 0x62, 0x0c, 0x99, 0x44, 0x11, 0xe3, 0xed, 0x78, 0xea, 0xa7, 0x3e,
0x64, 0xea, 0xf3, 0xea, 0x28, 0x8b, 0x90, 0xe8, 0xe0, 0x73, 0x90, 0xf7, 0xfc, 0x5d, 0x4b, 0x70,
0x32, 0xa2, 0x3c, 0x79, 0xfe, 0x2e, 0xaf, 0xa9, 0xac, 0x74, 0xb1, 0x0a, 0xbb, 0x63, 0x07, 0x94,
0xa7, 0x53, 0x9e, 0xc4, 0x7d, 0xfc, 0x38, 0x30, 0x39, 0x8b, 0x8f, 0x63, 0x86, 0xf3, 0x66, 0x3d,
0x7f, 0xd7, 0x60, 0x43, 0x79, 0x06, 0x8a, 0x5d, 0xcf, 0x1d, 0xf5, 0x07, 0x96, 0x4b, 0x07, 0xbb,
0xe1, 0x5e, 0x65, 0x76, 0x45, 0x59, 0x2d, 0x92, 0x39, 0x41, 0xac, 0x73, 0x1a, 0xae, 0xc0, 0x6c,
0x77, 0xcf, 0xf6, 0x03, 0x2a, 0x52, 0xa8, 0x48, 0xa2, 0x2e, 0xb7, 0x4a, 0xbb, 0x4e, 0xdf, 0x76,
0x03, 0x9e, 0x2e, 0x45, 0x12, 0xf7, 0x99, 0x13, 0x77, 0x5c, 0x7b, 0x37, 0xa8, 0x00, 0x67, 0x88,
0x8e, 0xfa, 0xff, 0x90, 0x26, 0xde, 0x21, 0x53, 0x29, 0x0c, 0x06, 0x15, 0x65, 0x25, 0xbd, 0x8a,
0x49, 0xd4, 0x65, 0xd5, 0x5d, 0x16, 0x38, 0x51, 0xf7, 0xa2, 0x92, 0xf6, 0x26, 0xcc, 0x11, 0x1a,
0x8c, 0xdc, 0x50, 0x7f, 0x2b, 0xf4, 0xed, 0x00, 0x6f, 0x40, 0x21, 0x39, 0xa5, 0x95, 0x0f, 0x9a,
0xd2, 0x40, 0xc7, 0x73, 0xb9, 0x02, 0xb3, 0x77, 0x7c, 0x1a, 0xec, 0x51, 0x5f, 0x96, 0x8c, 0xa8,
0xcb, 0x0a, 0x66, 0x81, 0x97, 0x3b, 0x61, 0x83, 0x95, 0x59, 0x39, 0xd9, 0x95, 0x89, 0x32, 0xcb,
0x83, 0x4a, 0x24, 0x8f, 0xa1, 0xc7, 0xe6, 0xaf, 0x65, 0xdf, 0xb9, 0x43, 0xbb, 0x21, 0x15, 0xab,
0x49, 0x86, 0xcc, 0x31, 0xa2, 0x26, 0x69, 0x2c, 0x6c, 0xce, 0x20, 0xa0, 0x7e, 0x68, 0x39, 0x3d,
0x1e, 0xd0, 0x0c, 0xc9, 0x09, 0x42, 0xad, 0x87, 0x9f, 0x82, 0x0c, 0xaf, 0x00, 0x19, 0x6e, 0x05,
0xa4, 0x15, 0xe2, 0x1d, 0x12, 0x4e, 0xc7, 0x2f, 0xc0, 0x0c, 0xe5, 0xfe, 0xf2, 0xa0, 0x8e, 0x6b,
0x66, 0x12, 0x0a, 0x22, 0x45, 0xd4, 0x9f, 0xa7, 0xa1, 0xd0, 0x0e, 0x7d, 0x6a, 0xf7, 0xb9, 0xff,
0xf8, 0x53, 0x00, 0x41, 0x68, 0x87, 0xb4, 0x4f, 0x07, 0x61, 0xe4, 0xc8, 0x13, 0x52, 0x41, 0x42,
0x6e, 0xbd, 0x1d, 0x09, 0x91, 0x84, 0xfc, 0x71, 0x80, 0x53, 0x0f, 0x00, 0xf0, 0xf2, 0xfb, 0x29,
0xc8, 0xc7, 0xda, 0xb0, 0x06, 0xb9, 0xae, 0x1d, 0xd2, 0x5d, 0xcf, 0x3f, 0x92, 0xcb, 0xdc, 0xf9,
0x0f, 0xb3, 0xbe, 0x5e, 0x95, 0xc2, 0x24, 0xfe, 0x1b, 0x7e, 0x12, 0xc4, 0x3e, 0x41, 0x24, 0xaf,
0x58, 0xac, 0xf3, 0x9c, 0xc2, 0xd3, 0xf7, 0x65, 0xc0, 0x43, 0xdf, 0xe9, 0xdb, 0xfe, 0x91, 0xb5,
0x4f, 0x8f, 0xa2, 0xfa, 0x9c, 0x9e, 0x12, 0x32, 0x24, 0xe5, 0xae, 0xd3, 0x23, 0x59, 0x84, 0xae,
0x4c, 0xfe, 0x57, 0x26, 0xdd, 0xc9, 0x40, 0x24, 0xfe, 0xc9, 0x17, 0xd9, 0x20, 0x5a, 0x4e, 0xb3,
0x3c, 0x3f, 0x59, 0x53, 0x7d, 0x1e, 0x72, 0xd1, 0xe0, 0x71, 0x1e, 0xb2, 0xba, 0xef, 0x7b, 0x3e,
0x3a, 0xc3, 0x6b, 0x51, 0xa3, 0x2e, 0xca, 0xd9, 0xd6, 0x16, 0x2b, 0x67, 0xbf, 0x4e, 0xc5, 0x6b,
0x1a, 0xa1, 0x07, 0x23, 0x1a, 0x84, 0xf8, 0xb3, 0x50, 0xa6, 0x3c, 0x57, 0x9c, 0xbb, 0xd4, 0xea,
0xf2, 0x0d, 0x10, 0xcb, 0x14, 0x91, 0xd0, 0xf3, 0xeb, 0x62, 0x6b, 0x16, 0x6d, 0x8c, 0xc8, 0x42,
0x2c, 0x2b, 0x49, 0x3d, 0xac, 0x43, 0xd9, 0xe9, 0xf7, 0x69, 0xcf, 0xb1, 0xc3, 0xa4, 0x02, 0x11,
0xb0, 0xa5, 0x68, 0x7f, 0x30, 0xb1, 0xbf, 0x22, 0x0b, 0xf1, 0x3f, 0x62, 0x35, 0xe7, 0x61, 0x26,
0xe4, 0xfb, 0x3e, 0xb9, 0x3c, 0x16, 0xa3, 0xba, 0xc4, 0x89, 0x44, 0x32, 0xf1, 0xf3, 0x20, 0x36,
0x91, 0xbc, 0x02, 0x8d, 0x13, 0x62, 0xbc, 0x61, 0x20, 0x82, 0x8f, 0xcf, 0x43, 0x69, 0x62, 0x5d,
0xe9, 0x71, 0xc0, 0xd2, 0xa4, 0x98, 0x5c, 0x24, 0x7a, 0xf8, 0x7f, 0x61, 0xd6, 0x13, 0x6b, 0x0a,
0xaf, 0x4d, 0xe3, 0x11, 0x4f, 0x2e, 0x38, 0x24, 0x92, 0x52, 0x3f, 0x0d, 0xf3, 0x31, 0x82, 0xc1,
0xd0, 0x1b, 0x04, 0x14, 0xaf, 0xc1, 0x8c, 0xcf, 0x27, 0x84, 0x44, 0x0d, 0x4b, 0x15, 0x89, 0x19,
0x4d, 0xa4, 0x84, 0xda, 0x83, 0x79, 0x41, 0xb9, 0xe5, 0x84, 0x7b, 0x3c, 0x50, 0xf8, 0x3c, 0x64,
0x29, 0x6b, 0x1c, 0xc3, 0x9c, 0xb4, 0xaa, 0x9c, 0x4f, 0x04, 0x37, 0x61, 0x25, 0x75, 0x5f, 0x2b,
0x7f, 0x4b, 0x41, 0x59, 0x8e, 0x72, 0xd3, 0x0e, 0xbb, 0x7b, 0xa7, 0x34, 0xd8, 0x2f, 0xc0, 0x2c,
0xa3, 0x3b, 0xf1, 0xc4, 0x98, 0x12, 0xee, 0x48, 0x82, 0x05, 0xdc, 0x0e, 0xac, 0x44, 0x74, 0xe5,
0xbe, 0xa6, 0x68, 0x07, 0x89, 0x85, 0x78, 0x4a, 0x5e, 0xcc, 0xdc, 0x27, 0x2f, 0x66, 0x1f, 0x28,
0x2f, 0xb6, 0x60, 0x71, 0x12, 0x71, 0x99, 0x1c, 0x2f, 0xc2, 0xac, 0x08, 0x4a, 0x54, 0x02, 0xa7,
0xc5, 0x2d, 0x12, 0x51, 0x7f, 0x96, 0x82, 0x45, 0x59, 0x9d, 0x3e, 0x1e, 0xd3, 0x34, 0x81, 0x73,
0xf6, 0x81, 0x70, 0xae, 0xc2, 0xd2, 0x31, 0x80, 0x1e, 0x62, 0x16, 0xfe, 0x55, 0x81, 0xb9, 0x4d,
0xba, 0xeb, 0x0c, 0x4e, 0x29, 0xbc, 0x09, 0xd4, 0x32, 0x0f, 0x84, 0xda, 0x65, 0x28, 0x4a, 0x7f,
0x25, 0x5a, 0x27, 0xa7, 0x81, 0x32, 0x65, 0x1a, 0xa8, 0x7f, 0x56, 0xa0, 0x58, 0xf5, 0xfa, 0x7d,
0x27, 0x3c, 0xa5, 0x48, 0x9d, 0xf4, 0x33, 0x33, 0xcd, 0x4f, 0x04, 0xa5, 0xc8, 0x4d, 0x01, 0x90,
0xfa, 0x17, 0x05, 0xe6, 0x89, 0xe7, 0xba, 0x3b, 0x76, 0x77, 0xff, 0xd1, 0xf6, 0x1d, 0x03, 0x1a,
0x3b, 0x2a, 0xbd, 0xff, 0x87, 0x02, 0xa5, 0x96, 0x4f, 0xd9, 0xc7, 0xe8, 0x23, 0xed, 0x3c, 0xfb,
0x40, 0xea, 0x85, 0x72, 0x73, 0x90, 0x27, 0xbc, 0xad, 0x2e, 0xc0, 0x7c, 0xec, 0xbb, 0xc4, 0xe3,
0x0f, 0x0a, 0x2c, 0x89, 0x04, 0x91, 0x9c, 0xde, 0x29, 0x85, 0x25, 0xf2, 0x37, 0x93, 0xf0, 0xb7,
0x02, 0x8f, 0x1d, 0xf7, 0x4d, 0xba, 0xfd, 0x76, 0x0a, 0xce, 0x46, 0xb9, 0x71, 0xca, 0x1d, 0xff,
0x37, 0xf2, 0x61, 0x19, 0x2a, 0x27, 0x41, 0x90, 0x08, 0xbd, 0x93, 0x82, 0x4a, 0xd5, 0xa7, 0x76,
0x48, 0x13, 0x9b, 0x8c, 0x47, 0x27, 0x37, 0xf0, 0x4b, 0x30, 0x37, 0xb4, 0xfd, 0xd0, 0xe9, 0x3a,
0x43, 0x9b, 0x7d, 0xc6, 0x65, 0xf9, 0x1e, 0xe6, 0x98, 0x82, 0x09, 0x11, 0xf5, 0x1c, 0x3c, 0x3e,
0x05, 0x11, 0x89, 0xd7, 0x3f, 0x15, 0xc0, 0xed, 0xd0, 0xf6, 0xc3, 0x8f, 0xc1, 0xaa, 0x32, 0x35,
0x99, 0x96, 0xa0, 0x3c, 0xe1, 0x7f, 0x12, 0x17, 0x1a, 0x7e, 0x2c, 0x56, 0x9c, 0x0f, 0xc4, 0x25,
0xe9, 0xbf, 0xc4, 0xe5, 0x4f, 0x0a, 0x2c, 0x57, 0x3d, 0x71, 0x7e, 0xf7, 0x48, 0xce, 0x30, 0xf5,
0x49, 0x38, 0x37, 0xd5, 0x41, 0x09, 0xc0, 0x1f, 0x15, 0x78, 0x8c, 0x50, 0xbb, 0xf7, 0x68, 0x3a,
0x7f, 0x03, 0xce, 0x9e, 0x70, 0x4e, 0xee, 0x50, 0x2f, 0x43, 0xae, 0x4f, 0x43, 0xbb, 0x67, 0x87,
0xb6, 0x74, 0x69, 0x39, 0xd2, 0x3b, 0x96, 0x6e, 0x48, 0x09, 0x12, 0xcb, 0xaa, 0xef, 0xa7, 0xa0,
0xcc, 0xf7, 0xba, 0x9f, 0x7c, 0x41, 0x4d, 0xff, 0x16, 0x78, 0x47, 0x81, 0xc5, 0x49, 0x80, 0xe2,
0x6f, 0x82, 0xff, 0xf4, 0x41, 0xc4, 0x94, 0x82, 0x90, 0x9e, 0xb6, 0x05, 0xfd, 0x6d, 0x0a, 0x2a,
0xc9, 0x21, 0x7d, 0x72, 0x68, 0x31, 0x79, 0x68, 0xf1, 0x91, 0x4f, 0xa9, 0xde, 0x55, 0xe0, 0xf1,
0x29, 0x80, 0x7e, 0xb4, 0x40, 0x27, 0x8e, 0x2e, 0x52, 0xf7, 0x3d, 0xba, 0x78, 0xd0, 0x50, 0xff,
0x5e, 0x81, 0xc5, 0x06, 0x0d, 0x02, 0x7b, 0x97, 0x8a, 0xef, 0xf8, 0xd3, 0x5b, 0xcd, 0xf8, 0xa1,
0x70, 0x66, 0x7c, 0xb3, 0xa2, 0x56, 0x61, 0xe9, 0x98, 0x6b, 0x0f, 0x71, 0x36, 0xf1, 0x77, 0x05,
0x16, 0xa4, 0x16, 0xed, 0xd4, 0x6e, 0x04, 0xa6, 0xa0, 0x83, 0x9f, 0x82, 0xb4, 0xd3, 0x8b, 0x76,
0x90, 0x93, 0x17, 0xc7, 0x8c, 0xa1, 0x5e, 0x05, 0x9c, 0xf4, 0xfb, 0x21, 0xa0, 0xfb, 0x5d, 0x1a,
0x16, 0xda, 0x43, 0xd7, 0x09, 0x25, 0xf3, 0xd1, 0x2e, 0xfc, 0xff, 0x05, 0x73, 0x01, 0x73, 0xd6,
0x12, 0xb7, 0x65, 0x1c, 0xd8, 0x3c, 0x29, 0x70, 0x5a, 0x95, 0x93, 0xf0, 0xd3, 0x50, 0x88, 0x44,
0x46, 0x83, 0x50, 0x9e, 0x74, 0x82, 0x94, 0x18, 0x0d, 0x42, 0x7c, 0x09, 0xce, 0x0e, 0x46, 0x7d,
0x7e, 0x0d, 0x6c, 0x0d, 0xa9, 0x6f, 0x71, 0xcd, 0x16, 0xdb, 0xce, 0xcb, 0xeb, 0xda, 0xf2, 0x60,
0xd4, 0x27, 0xde, 0x61, 0xd0, 0xa2, 0x3e, 0x37, 0xde, 0xb2, 0xfd, 0x10, 0x5f, 0x85, 0xbc, 0xed,
0xee, 0x7a, 0xbe, 0x13, 0xee, 0xf5, 0xe5, 0x3d, 0xad, 0x1a, 0x5d, 0xad, 0x1c, 0x87, 0x7f, 0x5d,
0x8b, 0x24, 0xc9, 0xf8, 0x4f, 0xea, 0x8b, 0x90, 0x8f, 0xe9, 0x18, 0xc1, 0x9c, 0x7e, 0xa3, 0xa3,
0xd5, 0xad, 0x76, 0xab, 0x5e, 0x33, 0xdb, 0xe2, 0x3a, 0x76, 0xbb, 0x53, 0xaf, 0x5b, 0xed, 0xaa,
0x66, 0x20, 0x45, 0x25, 0x00, 0x5c, 0x25, 0x57, 0x3e, 0x06, 0x48, 0xb9, 0x0f, 0x40, 0xe7, 0x20,
0xef, 0x7b, 0x87, 0xd2, 0xf7, 0x14, 0x77, 0x27, 0xe7, 0x7b, 0x87, 0xdc, 0x73, 0x55, 0x03, 0x9c,
0x1c, 0xab, 0xcc, 0xb6, 0x44, 0xf1, 0x56, 0x26, 0x8a, 0xf7, 0xd8, 0x7e, 0x5c, 0xbc, 0xc5, 0x56,
0x9e, 0xcd, 0xf3, 0x57, 0xa9, 0xed, 0x86, 0xd1, 0x7a, 0xa5, 0xfe, 0x22, 0x05, 0x45, 0xc2, 0x28,
0x4e, 0x9f, 0xb6, 0x43, 0x3b, 0x0c, 0x58, 0xa4, 0xf6, 0xb8, 0x88, 0x35, 0x2e, 0xbb, 0x79, 0x52,
0x10, 0x34, 0x71, 0x09, 0xb0, 0x01, 0x4b, 0x01, 0xed, 0x7a, 0x83, 0x5e, 0x60, 0xed, 0xd0, 0x3d,
0x67, 0xd0, 0xb3, 0xfa, 0x76, 0x10, 0xca, 0x9b, 0xc2, 0x22, 0x29, 0x4b, 0xe6, 0x26, 0xe7, 0x35,
0x38, 0x0b, 0x5f, 0x80, 0xc5, 0x1d, 0x67, 0xe0, 0x7a, 0xbb, 0xd6, 0xd0, 0xb5, 0x8f, 0xa8, 0x1f,
0x48, 0x57, 0x59, 0x7a, 0x65, 0x09, 0x16, 0xbc, 0x96, 0x60, 0x89, 0x70, 0xbf, 0x01, 0x6b, 0x53,
0xad, 0x58, 0x77, 0x1c, 0x37, 0xa4, 0x3e, 0xed, 0x59, 0x3e, 0x1d, 0xba, 0x4e, 0x57, 0xdc, 0xc0,
0x8b, 0xbd, 0xfb, 0x73, 0x53, 0x4c, 0x6f, 0x4b, 0x71, 0x32, 0x96, 0x66, 0x68, 0x77, 0x87, 0x23,
0x6b, 0xc4, 0x26, 0x30, 0x5f, 0xc5, 0x14, 0x92, 0xeb, 0x0e, 0x47, 0x1d, 0xd6, 0xc7, 0x08, 0xd2,
0x07, 0x43, 0xb1, 0x78, 0x29, 0x84, 0x35, 0x19, 0x4a, 0x8b, 0x93, 0xe8, 0xc5, 0x8b, 0x53, 0x34,
0x4d, 0x94, 0x0f, 0x9b, 0x26, 0x15, 0x98, 0x0d, 0xa8, 0x7f, 0xd7, 0x19, 0xec, 0x46, 0x97, 0xa9,
0xb2, 0x8b, 0xdb, 0xf0, 0x9c, 0x7c, 0x05, 0x44, 0xdf, 0x0a, 0xa9, 0x3f, 0xb0, 0x5d, 0xf7, 0xc8,
0x12, 0xdf, 0xed, 0x83, 0x90, 0xf6, 0xac, 0xf1, 0xbb, 0x1c, 0xb1, 0x40, 0x3d, 0x23, 0xa4, 0xf5,
0x58, 0x98, 0xc4, 0xb2, 0x66, 0xfc, 0x62, 0xe7, 0x15, 0x28, 0xf9, 0x32, 0xa6, 0x56, 0xc0, 0x82,
0x2a, 0xa7, 0xe7, 0x62, 0x7c, 0x23, 0x9a, 0x08, 0x38, 0x29, 0xfa, 0x13, 0xf1, 0xbf, 0x02, 0x73,
0x72, 0x44, 0xb6, 0xeb, 0xd8, 0xe3, 0x7d, 0xda, 0xb1, 0x87, 0x49, 0x1a, 0x63, 0x12, 0xf9, 0x84,
0x89, 0x77, 0xd8, 0x67, 0x61, 0xb9, 0x33, 0xec, 0xd9, 0xe1, 0xe9, 0x5e, 0x2c, 0x93, 0x2f, 0x9b,
0x32, 0x93, 0x2f, 0x9b, 0x26, 0x5f, 0x4a, 0x65, 0x8f, 0xbd, 0x94, 0x52, 0xaf, 0xc2, 0xe2, 0xa4,
0xff, 0x32, 0x4b, 0x56, 0x21, 0xcb, 0x2f, 0x7e, 0x8f, 0xad, 0x0a, 0x89, 0x9b, 0x5d, 0x22, 0x04,
0xd4, 0x5f, 0x2a, 0x50, 0x9e, 0xf2, 0xc5, 0x10, 0x7f, 0x8e, 0x28, 0x89, 0xd3, 0x8e, 0xff, 0x81,
0x2c, 0xbf, 0x82, 0x96, 0x6f, 0x23, 0xce, 0x9e, 0xfc, 0xe0, 0xe0, 0xd7, 0xc5, 0x44, 0x48, 0xb1,
0x79, 0xcd, 0x13, 0xa2, 0xcb, 0x8f, 0x3b, 0xa2, 0x0d, 0x4f, 0x81, 0xd1, 0xc4, 0x09, 0xc8, 0xc9,
0xf3, 0x93, 0xcc, 0x7d, 0xcf, 0x4f, 0xd6, 0xbe, 0x9b, 0x86, 0x7c, 0xe3, 0xa8, 0x7d, 0xe0, 0x6e,
0xbb, 0xf6, 0x2e, 0xbf, 0xcf, 0x6d, 0xb4, 0xcc, 0xdb, 0xe8, 0x0c, 0x5e, 0x80, 0xa2, 0xd1, 0x34,
0x2d, 0x83, 0x55, 0xc6, 0xed, 0xba, 0x76, 0x0d, 0x29, 0xac, 0x74, 0xb6, 0x48, 0xcd, 0xba, 0xae,
0xdf, 0x16, 0x94, 0x14, 0x2e, 0xc3, 0x7c, 0xc7, 0xa8, 0xdd, 0xe8, 0xe8, 0x63, 0x62, 0x06, 0x2f,
0xc1, 0x42, 0xa3, 0x53, 0x37, 0x6b, 0xad, 0x7a, 0x82, 0x9c, 0x63, 0x65, 0x76, 0xb3, 0xde, 0xdc,
0x14, 0x5d, 0xc4, 0xf4, 0x77, 0x8c, 0x76, 0xed, 0x9a, 0xa1, 0x6f, 0x09, 0xd2, 0x0a, 0x23, 0xbd,
0xa1, 0x93, 0xe6, 0x76, 0x2d, 0x32, 0x79, 0x15, 0x23, 0x28, 0x6c, 0xd6, 0x0c, 0x8d, 0x48, 0x2d,
0xf7, 0x14, 0x5c, 0x82, 0xbc, 0x6e, 0x74, 0x1a, 0xb2, 0x9f, 0xc2, 0x15, 0x28, 0x6b, 0x1d, 0xb3,
0x69, 0xd5, 0x8c, 0x2a, 0xd1, 0x1b, 0xba, 0x61, 0x4a, 0x4e, 0x06, 0x97, 0xa1, 0x64, 0xd6, 0x1a,
0x7a, 0xdb, 0xd4, 0x1a, 0x2d, 0x49, 0x64, 0xa3, 0xc8, 0xb5, 0xf5, 0x48, 0x06, 0xe1, 0x65, 0x58,
0x32, 0x9a, 0x96, 0x7c, 0x23, 0x63, 0xdd, 0xd4, 0xea, 0x1d, 0x5d, 0xf2, 0x56, 0xf0, 0x59, 0xc0,
0x4d, 0xc3, 0xea, 0xb4, 0xb6, 0x34, 0x53, 0xb7, 0x8c, 0xe6, 0x2d, 0xc9, 0xb8, 0x8a, 0x4b, 0x90,
0x1b, 0x8f, 0xe0, 0x1e, 0x43, 0xa1, 0xd8, 0xd2, 0x88, 0x39, 0x76, 0xf6, 0xde, 0x3d, 0x06, 0x16,
0x5c, 0x23, 0xcd, 0x4e, 0x6b, 0x2c, 0xb6, 0x00, 0x05, 0x09, 0x96, 0x24, 0x65, 0x18, 0x69, 0xb3,
0x66, 0x54, 0xe3, 0xf1, 0xdd, 0xcb, 0x2d, 0xa7, 0x90, 0xb2, 0xb6, 0x0f, 0x19, 0x1e, 0x8e, 0x1c,
0x64, 0x8c, 0xa6, 0xa1, 0xa3, 0x33, 0x78, 0x1e, 0xa0, 0xd6, 0xae, 0x19, 0xa6, 0x7e, 0x8d, 0x68,
0x75, 0xe6, 0x36, 0x27, 0x44, 0x00, 0x32, 0x6f, 0xe7, 0x60, 0xb6, 0xd6, 0xde, 0xae, 0x37, 0x35,
0x53, 0xba, 0x59, 0x6b, 0xdf, 0xe8, 0x34, 0x4d, 0xc6, 0x44, 0xb8, 0x00, 0x33, 0xb5, 0xb6, 0xa9,
0xbf, 0x6e, 0x32, 0xbf, 0x38, 0x4f, 0xa0, 0x8a, 0xee, 0x5d, 0x5d, 0x7b, 0x2f, 0x0d, 0x19, 0xf3,
0x68, 0x48, 0x59, 0x80, 0x78, 0xb4, 0xcd, 0xdb, 0x2d, 0x66, 0x32, 0x0f, 0x99, 0x9a, 0x61, 0x5e,
0x41, 0x9f, 0x4b, 0x61, 0x80, 0x6c, 0x87, 0xb7, 0x3f, 0x3f, 0xc3, 0xda, 0x35, 0xc3, 0x7c, 0xe9,
0x32, 0x7a, 0x3b, 0xc5, 0xd4, 0x76, 0x44, 0xe7, 0x0b, 0x11, 0x63, 0xe3, 0x12, 0xfa, 0x62, 0xcc,
0xd8, 0xb8, 0x84, 0xbe, 0x14, 0x31, 0x2e, 0x6e, 0xa0, 0x2f, 0xc7, 0x8c, 0x8b, 0x1b, 0xe8, 0x2b,
0x11, 0xe3, 0xf2, 0x25, 0xf4, 0xd5, 0x98, 0x71, 0xf9, 0x12, 0xfa, 0xda, 0x0c, 0xf3, 0x85, 0x7b,
0x72, 0x71, 0x03, 0x7d, 0x3d, 0x17, 0xf7, 0x2e, 0x5f, 0x42, 0xdf, 0xc8, 0xb1, 0xf8, 0xc7, 0x51,
0x45, 0xdf, 0x44, 0x6c, 0x98, 0x2c, 0x40, 0xe8, 0x5b, 0xbc, 0xc9, 0x58, 0xe8, 0xdb, 0x88, 0xf9,
0xc8, 0xa8, 0xbc, 0xfb, 0x0e, 0xe7, 0xdc, 0xd6, 0x35, 0x82, 0xbe, 0x33, 0x23, 0x9e, 0x44, 0x55,
0x6b, 0x0d, 0xad, 0x8e, 0x30, 0xff, 0x07, 0x43, 0xe5, 0x7b, 0x17, 0x58, 0x93, 0xa5, 0x27, 0xfa,
0x7e, 0x8b, 0x19, 0xbc, 0xa9, 0x91, 0xea, 0xab, 0x1a, 0x41, 0x3f, 0xb8, 0xc0, 0x0c, 0xde, 0xd4,
0x88, 0xc4, 0xeb, 0x87, 0x2d, 0x26, 0xc8, 0x59, 0xef, 0x5e, 0x60, 0x83, 0x96, 0xf4, 0x1f, 0xb5,
0x70, 0x0e, 0xd2, 0x9b, 0x35, 0x13, 0xbd, 0xc7, 0xad, 0xb1, 0x14, 0x45, 0x3f, 0x46, 0x8c, 0xd8,
0xd6, 0x4d, 0xf4, 0x13, 0x46, 0xcc, 0x9a, 0x9d, 0x56, 0x5d, 0x47, 0x4f, 0xb0, 0xc1, 0x5d, 0xd3,
0x9b, 0x0d, 0xdd, 0x24, 0xb7, 0xd1, 0x4f, 0xb9, 0xf8, 0x6b, 0xed, 0xa6, 0x81, 0xde, 0x47, 0xb8,
0x04, 0xa0, 0xbf, 0xde, 0x22, 0x7a, 0xbb, 0x5d, 0x6b, 0x1a, 0xe8, 0xe9, 0xb5, 0x6d, 0x40, 0xc7,
0xcb, 0x01, 0x73, 0xa0, 0x63, 0x5c, 0x37, 0x9a, 0xb7, 0x0c, 0x74, 0x86, 0x75, 0x5a, 0x44, 0x6f,
0x69, 0x44, 0x47, 0x0a, 0x06, 0x98, 0x11, 0x0f, 0xb6, 0x50, 0x0a, 0xcf, 0x41, 0x8e, 0x34, 0xeb,
0xf5, 0x4d, 0xad, 0x7a, 0x1d, 0xa5, 0x37, 0x17, 0x60, 0xde, 0xf1, 0xd6, 0xef, 0x3a, 0x21, 0x0d,
0x02, 0xf1, 0xf4, 0x75, 0x67, 0x86, 0xff, 0x5c, 0xfc, 0x57, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb1,
0xdd, 0x2d, 0x9d, 0x34, 0x2b, 0x00, 0x00,
}

Просмотреть файл

@ -252,7 +252,7 @@ func (qre *QueryExecutor) execDmlAutoCommit() (reply *sqltypes.Result, err error
}
func (qre *QueryExecutor) execAsTransaction(f func(conn *TxConnection) (*sqltypes.Result, error)) (reply *sqltypes.Result, err error) {
conn, err := qre.tsv.te.txPool.LocalBegin(qre.ctx, qre.options.GetClientFoundRows())
conn, err := qre.tsv.te.txPool.LocalBegin(qre.ctx, qre.options.GetClientFoundRows(), qre.options.GetTransactionIsolation())
if err != nil {
return nil, err
}

Просмотреть файл

@ -79,7 +79,7 @@ func TestQueryExecutorPlanPassDmlRBR(t *testing.T) {
// RBR mode
tsv := newTestTabletServer(ctx, noFlags, db)
defer tsv.StopService()
txid := newTransaction(tsv)
txid := newTransaction(tsv, nil)
qre := newTestQueryExecutor(ctx, tsv, query, txid)
tsv.qe.binlogFormat = connpool.BinlogFormatRow
checkPlanID(t, planbuilder.PlanPassDML, qre.plan.PlanID)
@ -144,7 +144,7 @@ func TestQueryExecutorPlanPassDmlReplaceInto(t *testing.T) {
// RBR mode
tsv := newTestTabletServer(ctx, noFlags, db)
defer tsv.StopService()
txid := newTransaction(tsv)
txid := newTransaction(tsv, nil)
qre := newTestQueryExecutor(ctx, tsv, query, txid)
tsv.qe.binlogFormat = connpool.BinlogFormatRow
checkPlanID(t, planbuilder.PlanPassDML, qre.plan.PlanID)
@ -251,7 +251,7 @@ func TestQueryExecutorPlanInsertMessage(t *testing.T) {
t.Errorf("rows:\n%+v, want\n%+v", mr, wantqr)
}
txid := newTransaction(tsv)
txid := newTransaction(tsv, nil)
qre = newTestQueryExecutor(ctx, tsv, query, txid)
defer testCommitHelper(t, tsv, qre)
got, err = qre.Execute()
@ -357,7 +357,7 @@ func TestQueryExecutorPlanInsertSubQuery(t *testing.T) {
db.AddQuery(insertQuery, &sqltypes.Result{})
ctx := context.Background()
tsv := newTestTabletServer(ctx, noFlags, db)
txid := newTransaction(tsv)
txid := newTransaction(tsv, nil)
qre := newTestQueryExecutor(ctx, tsv, query, txid)
defer tsv.StopService()
@ -402,7 +402,7 @@ func TestQueryExecutorPlanInsertSubQueryRBR(t *testing.T) {
db.AddQuery(insertQuery, &sqltypes.Result{})
ctx := context.Background()
tsv := newTestTabletServer(ctx, noFlags, db)
txid := newTransaction(tsv)
txid := newTransaction(tsv, nil)
qre := newTestQueryExecutor(ctx, tsv, query, txid)
tsv.qe.binlogFormat = connpool.BinlogFormatRow
@ -431,7 +431,7 @@ func TestQueryExecutorPlanUpsertPk(t *testing.T) {
query := "insert into test_table(pk) values(1) on duplicate key update val=1"
ctx := context.Background()
tsv := newTestTabletServer(ctx, noFlags, db)
txid := newTransaction(tsv)
txid := newTransaction(tsv, nil)
qre := newTestQueryExecutor(ctx, tsv, query, txid)
defer tsv.StopService()
defer testCommitHelper(t, tsv, qre)
@ -450,7 +450,7 @@ func TestQueryExecutorPlanUpsertPk(t *testing.T) {
}
db.AddRejectedQuery("insert into test_table(pk) values (1) /* _stream test_table (pk ) (1 ); */", errRejected)
txid = newTransaction(tsv)
txid = newTransaction(tsv, nil)
qre = newTestQueryExecutor(ctx, tsv, query, txid)
defer testCommitHelper(t, tsv, qre)
_, err = qre.Execute()
@ -467,7 +467,7 @@ func TestQueryExecutorPlanUpsertPk(t *testing.T) {
mysql.NewSQLError(mysql.ERDupEntry, mysql.SSDupKey, "err"),
)
db.AddQuery("update test_table(pk) set val = 1 where pk in (1) /* _stream test_table (pk ) (1 ); */", &sqltypes.Result{})
txid = newTransaction(tsv)
txid = newTransaction(tsv, nil)
qre = newTestQueryExecutor(ctx, tsv, query, txid)
defer testCommitHelper(t, tsv, qre)
_, err = qre.Execute()
@ -488,7 +488,7 @@ func TestQueryExecutorPlanUpsertPk(t *testing.T) {
"update test_table set val = 1 where pk in (1) /* _stream test_table (pk ) (1 ); */",
&sqltypes.Result{RowsAffected: 1},
)
txid = newTransaction(tsv)
txid = newTransaction(tsv, nil)
qre = newTestQueryExecutor(ctx, tsv, query, txid)
defer testCommitHelper(t, tsv, qre)
got, err = qre.Execute()
@ -516,7 +516,7 @@ func TestQueryExecutorPlanUpsertPk(t *testing.T) {
"update test_table set pk = 2 where pk in (1) /* _stream test_table (pk ) (1 ) (2 ); */",
&sqltypes.Result{RowsAffected: 1},
)
txid = newTransaction(tsv)
txid = newTransaction(tsv, nil)
qre = newTestQueryExecutor(ctx, tsv, "insert into test_table(pk) values (1) on duplicate key update pk=2", txid)
defer testCommitHelper(t, tsv, qre)
got, err = qre.Execute()
@ -545,7 +545,7 @@ func TestQueryExecutorPlanUpsertPkSingleUnique(t *testing.T) {
want := &sqltypes.Result{}
ctx := context.Background()
tsv := newTestTabletServer(ctx, noFlags, db)
txid := newTransaction(tsv)
txid := newTransaction(tsv, nil)
qre := newTestQueryExecutor(ctx, tsv, query[0:strings.Index(query, " /*")], txid)
defer tsv.StopService()
defer testCommitHelper(t, tsv, qre)
@ -569,7 +569,7 @@ func TestQueryExecutorPlanUpsertPkSingleUnique(t *testing.T) {
want = &sqltypes.Result{}
ctx = context.Background()
tsv = newTestTabletServer(ctx, noFlags, db)
txid = newTransaction(tsv)
txid = newTransaction(tsv, nil)
qre = newTestQueryExecutor(ctx, tsv, query[0:strings.Index(query, " /*")], txid)
defer testCommitHelper(t, tsv, qre)
checkPlanID(t, planbuilder.PlanInsertPK, qre.plan.PlanID)
@ -592,7 +592,7 @@ func TestQueryExecutorPlanUpsertPkSingleUnique(t *testing.T) {
want = &sqltypes.Result{}
ctx = context.Background()
tsv = newTestTabletServer(ctx, noFlags, db)
txid = newTransaction(tsv)
txid = newTransaction(tsv, nil)
qre = newTestQueryExecutor(ctx, tsv, query[0:strings.Index(query, " /*")], txid)
defer testCommitHelper(t, tsv, qre)
checkPlanID(t, planbuilder.PlanInsertPK, qre.plan.PlanID)
@ -614,7 +614,7 @@ func TestQueryExecutorPlanUpsertPkSingleUnique(t *testing.T) {
want = &sqltypes.Result{}
ctx = context.Background()
tsv = newTestTabletServer(ctx, noFlags, db)
txid = newTransaction(tsv)
txid = newTransaction(tsv, nil)
qre = newTestQueryExecutor(ctx, tsv, query[0:strings.Index(query, " /*")], txid)
defer testCommitHelper(t, tsv, qre)
checkPlanID(t, planbuilder.PlanInsertPK, qre.plan.PlanID)
@ -641,7 +641,7 @@ func TestQueryExecutorPlanUpsertPkRBR(t *testing.T) {
want := &sqltypes.Result{}
ctx := context.Background()
tsv := newTestTabletServer(ctx, noFlags, db)
txid := newTransaction(tsv)
txid := newTransaction(tsv, nil)
qre := newTestQueryExecutor(ctx, tsv, query, txid)
tsv.qe.binlogFormat = connpool.BinlogFormatRow
defer tsv.StopService()
@ -726,7 +726,37 @@ func TestQueryExecutorPlanDmlPk(t *testing.T) {
db.AddQuery(query, want)
ctx := context.Background()
tsv := newTestTabletServer(ctx, noFlags, db)
txid := newTransaction(tsv)
txid := newTransaction(tsv, nil)
qre := newTestQueryExecutor(ctx, tsv, query, txid)
defer tsv.StopService()
defer testCommitHelper(t, tsv, qre)
checkPlanID(t, planbuilder.PlanDMLPK, qre.plan.PlanID)
got, err := qre.Execute()
if err != nil {
t.Fatalf("qre.Execute() = %v, want nil", err)
}
if !reflect.DeepEqual(got, want) {
t.Fatalf("got: %v, want: %v", got, want)
}
wantqueries := []string{"update test_table set name = 2 where pk in (1) /* _stream test_table (pk ) (1 ); */"}
gotqueries := fetchRecordedQueries(qre)
if !reflect.DeepEqual(gotqueries, wantqueries) {
t.Errorf("queries: %v, want %v", gotqueries, wantqueries)
}
}
func TestQueryExecutorPlanDmlPkTransactionIsolation(t *testing.T) {
db := setUpQueryExecutorTest(t)
defer db.Close()
query := "update test_table set name = 2 where pk in (1) /* _stream test_table (pk ) (1 ); */"
want := &sqltypes.Result{}
db.AddQuery(query, want)
ctx := context.Background()
tsv := newTestTabletServer(ctx, noFlags, db)
db.AddQuery("set transaction isolation level SERIALIZABLE", &sqltypes.Result{})
txid := newTransaction(tsv, &querypb.ExecuteOptions{
TransactionIsolation: querypb.ExecuteOptions_SERIALIZABLE,
})
qre := newTestQueryExecutor(ctx, tsv, query, txid)
defer tsv.StopService()
defer testCommitHelper(t, tsv, qre)
@ -755,7 +785,7 @@ func TestQueryExecutorPlanDmlPkRBR(t *testing.T) {
db.AddQuery(query, want)
ctx := context.Background()
tsv := newTestTabletServer(ctx, noFlags, db)
txid := newTransaction(tsv)
txid := newTransaction(tsv, nil)
qre := newTestQueryExecutor(ctx, tsv, query, txid)
tsv.qe.binlogFormat = connpool.BinlogFormatRow
defer tsv.StopService()
@ -794,7 +824,7 @@ func TestQueryExecutorPlanDmlMessage(t *testing.T) {
db.AddQuery("update msg set time_acked = 2, time_next = null where (time_scheduled = 12 and id = 1) /* _stream msg (time_scheduled id ) (12 1 ); */", want)
ctx := context.Background()
tsv := newTestTabletServer(ctx, noFlags, db)
txid := newTransaction(tsv)
txid := newTransaction(tsv, nil)
qre := newTestQueryExecutor(ctx, tsv, query, txid)
defer tsv.StopService()
defer testCommitHelper(t, tsv, qre)
@ -834,6 +864,32 @@ func TestQueryExecutorPlanDmlAutoCommit(t *testing.T) {
}
}
func TestQueryExecutorPlanDmlAutoCommitTransactionIsolation(t *testing.T) {
db := setUpQueryExecutorTest(t)
defer db.Close()
query := "update test_table set name = 2 where pk in (1) /* _stream test_table (pk ) (1 ); */"
want := &sqltypes.Result{}
db.AddQuery(query, want)
ctx := context.Background()
tsv := newTestTabletServer(ctx, noFlags, db)
qre := newTestQueryExecutor(ctx, tsv, query, 0)
qre.options = &querypb.ExecuteOptions{
TransactionIsolation: querypb.ExecuteOptions_READ_UNCOMMITTED,
}
db.AddQuery("set transaction isolation level READ UNCOMMITTED", &sqltypes.Result{})
defer tsv.StopService()
checkPlanID(t, planbuilder.PlanDMLPK, qre.plan.PlanID)
got, err := qre.Execute()
if err != nil {
t.Fatalf("qre.Execute() = %v, want nil", err)
}
if !reflect.DeepEqual(got, want) {
t.Fatalf("got: %v, want: %v", got, want)
}
}
func TestQueryExecutorPlanDmlSubQuery(t *testing.T) {
db := setUpQueryExecutorTest(t)
defer db.Close()
@ -854,7 +910,7 @@ func TestQueryExecutorPlanDmlSubQuery(t *testing.T) {
db.AddQuery(updateQuery, want)
ctx := context.Background()
tsv := newTestTabletServer(ctx, noFlags, db)
txid := newTransaction(tsv)
txid := newTransaction(tsv, nil)
qre := newTestQueryExecutor(ctx, tsv, query, txid)
defer tsv.StopService()
defer testCommitHelper(t, tsv, qre)
@ -895,7 +951,7 @@ func TestQueryExecutorPlanDmlSubQueryRBR(t *testing.T) {
db.AddQuery(updateQuery, want)
ctx := context.Background()
tsv := newTestTabletServer(ctx, noFlags, db)
txid := newTransaction(tsv)
txid := newTransaction(tsv, nil)
qre := newTestQueryExecutor(ctx, tsv, query, txid)
tsv.qe.binlogFormat = connpool.BinlogFormatRow
defer tsv.StopService()
@ -947,7 +1003,7 @@ func TestQueryExecutorPlanOtherWithinATransaction(t *testing.T) {
db.AddQuery(query, want)
ctx := context.Background()
tsv := newTestTabletServer(ctx, noFlags, db)
txid := newTransaction(tsv)
txid := newTransaction(tsv, nil)
qre := newTestQueryExecutor(ctx, tsv, query, txid)
defer tsv.StopService()
defer testCommitHelper(t, tsv, qre)
@ -984,7 +1040,7 @@ func TestQueryExecutorPlanPassSelectWithInATransaction(t *testing.T) {
})
ctx := context.Background()
tsv := newTestTabletServer(ctx, noFlags, db)
txid := newTransaction(tsv)
txid := newTransaction(tsv, nil)
qre := newTestQueryExecutor(ctx, tsv, query, txid)
defer tsv.StopService()
defer testCommitHelper(t, tsv, qre)
@ -1098,7 +1154,7 @@ func TestQueryExecutorPlanSet(t *testing.T) {
}
// Test inside transaction.
txid := newTransaction(tsv)
txid := newTransaction(tsv, nil)
qre = newTestQueryExecutor(ctx, tsv, setQuery, txid)
got, err = qre.Execute()
if err != nil {
@ -1793,8 +1849,8 @@ func newTestTabletServer(ctx context.Context, flags executorFlags, db *fakesqldb
return tsv
}
func newTransaction(tsv *TabletServer) int64 {
transactionID, err := tsv.Begin(context.Background(), &tsv.target, nil)
func newTransaction(tsv *TabletServer, options *querypb.ExecuteOptions) int64 {
transactionID, err := tsv.Begin(context.Background(), &tsv.target, options)
if err != nil {
panic(fmt.Errorf("failed to start a transaction: %v", err))
}

Просмотреть файл

@ -652,7 +652,7 @@ func (tsv *TabletServer) Begin(ctx context.Context, target *querypb.Target, opti
// TODO(erez): I think this should be RESOURCE_EXHAUSTED.
return vterrors.Errorf(vtrpcpb.Code_UNAVAILABLE, "Transaction throttled")
}
transactionID, err = tsv.te.txPool.Begin(ctx, options.GetClientFoundRows())
transactionID, err = tsv.te.txPool.Begin(ctx, options.GetClientFoundRows(), options.GetTransactionIsolation())
logStats.TransactionID = transactionID
return err
},

Просмотреть файл

@ -27,6 +27,7 @@ import (
"github.com/youtube/vitess/go/vt/concurrency"
"github.com/youtube/vitess/go/vt/dbconfigs"
"github.com/youtube/vitess/go/vt/dtids"
"github.com/youtube/vitess/go/vt/proto/query"
"github.com/youtube/vitess/go/vt/vtgate/vtgateconn"
"github.com/youtube/vitess/go/vt/vttablet/tabletserver/connpool"
"github.com/youtube/vitess/go/vt/vttablet/tabletserver/tabletenv"
@ -203,7 +204,7 @@ outer:
if txid > maxid {
maxid = txid
}
conn, err := te.txPool.LocalBegin(ctx, false)
conn, err := te.txPool.LocalBegin(ctx, false, query.ExecuteOptions_DEFAULT)
if err != nil {
allErr.RecordError(err)
continue

Просмотреть файл

@ -22,6 +22,7 @@ import (
"github.com/youtube/vitess/go/vt/vttablet/tabletserver/tabletenv"
"github.com/youtube/vitess/go/vt/proto/query"
"golang.org/x/net/context"
)
@ -47,7 +48,7 @@ func TestTxEngineClose(t *testing.T) {
// Normal close with timeout wait.
te.Open(dbconfigs)
c, err := te.txPool.LocalBegin(ctx, false)
c, err := te.txPool.LocalBegin(ctx, false, query.ExecuteOptions_DEFAULT)
if err != nil {
t.Fatal(err)
}
@ -60,7 +61,7 @@ func TestTxEngineClose(t *testing.T) {
// Immediate close.
te.Open(dbconfigs)
c, err = te.txPool.LocalBegin(ctx, false)
c, err = te.txPool.LocalBegin(ctx, false, query.ExecuteOptions_DEFAULT)
if err != nil {
t.Fatal(err)
}
@ -74,7 +75,7 @@ func TestTxEngineClose(t *testing.T) {
// Normal close with short grace period.
te.shutdownGracePeriod = 250 * time.Millisecond
te.Open(dbconfigs)
c, err = te.txPool.LocalBegin(ctx, false)
c, err = te.txPool.LocalBegin(ctx, false, query.ExecuteOptions_DEFAULT)
if err != nil {
t.Fatal(err)
}
@ -91,7 +92,7 @@ func TestTxEngineClose(t *testing.T) {
// Normal close with short grace period, but pool gets empty early.
te.shutdownGracePeriod = 250 * time.Millisecond
te.Open(dbconfigs)
c, err = te.txPool.LocalBegin(ctx, false)
c, err = te.txPool.LocalBegin(ctx, false, query.ExecuteOptions_DEFAULT)
if err != nil {
t.Fatal(err)
}
@ -115,7 +116,7 @@ func TestTxEngineClose(t *testing.T) {
// Immediate close, but connection is in use.
te.Open(dbconfigs)
c, err = te.txPool.LocalBegin(ctx, false)
c, err = te.txPool.LocalBegin(ctx, false, query.ExecuteOptions_DEFAULT)
if err != nil {
t.Fatal(err)
}

Просмотреть файл

@ -68,7 +68,7 @@ func (txe *TxExecutor) Prepare(transactionID int64, dtid string) error {
return vterrors.Errorf(vtrpcpb.Code_RESOURCE_EXHAUSTED, "prepare failed for transaction %d: %v", transactionID, err)
}
localConn, err := txe.te.txPool.LocalBegin(txe.ctx, false)
localConn, err := txe.te.txPool.LocalBegin(txe.ctx, false, querypb.ExecuteOptions_DEFAULT)
if err != nil {
return err
}
@ -130,7 +130,7 @@ func (txe *TxExecutor) CommitPrepared(dtid string) error {
func (txe *TxExecutor) markFailed(ctx context.Context, dtid string) {
tabletenv.InternalErrors.Add("TwopcCommit", 1)
txe.te.preparedPool.SetFailed(dtid)
conn, err := txe.te.txPool.LocalBegin(ctx, false)
conn, err := txe.te.txPool.LocalBegin(ctx, false, querypb.ExecuteOptions_DEFAULT)
if err != nil {
log.Errorf("markFailed: Begin failed for dtid %s: %v", dtid, err)
return
@ -170,7 +170,7 @@ func (txe *TxExecutor) RollbackPrepared(dtid string, originalID int64) error {
return vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "2pc is not enabled")
}
defer tabletenv.QueryStats.Record("ROLLBACK_PREPARED", time.Now())
conn, err := txe.te.txPool.LocalBegin(txe.ctx, false)
conn, err := txe.te.txPool.LocalBegin(txe.ctx, false, querypb.ExecuteOptions_DEFAULT)
if err != nil {
goto returnConn
}
@ -200,7 +200,7 @@ func (txe *TxExecutor) CreateTransaction(dtid string, participants []*querypb.Ta
return vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "2pc is not enabled")
}
defer tabletenv.QueryStats.Record("CREATE_TRANSACTION", time.Now())
conn, err := txe.te.txPool.LocalBegin(txe.ctx, false)
conn, err := txe.te.txPool.LocalBegin(txe.ctx, false, querypb.ExecuteOptions_DEFAULT)
if err != nil {
return err
}
@ -248,7 +248,7 @@ func (txe *TxExecutor) SetRollback(dtid string, transactionID int64) error {
txe.te.txPool.Rollback(txe.ctx, transactionID)
}
conn, err := txe.te.txPool.LocalBegin(txe.ctx, false)
conn, err := txe.te.txPool.LocalBegin(txe.ctx, false, querypb.ExecuteOptions_DEFAULT)
if err != nil {
return err
}
@ -275,7 +275,7 @@ func (txe *TxExecutor) ConcludeTransaction(dtid string) error {
}
defer tabletenv.QueryStats.Record("RESOLVE", time.Now())
conn, err := txe.te.txPool.LocalBegin(txe.ctx, false)
conn, err := txe.te.txPool.LocalBegin(txe.ctx, false, querypb.ExecuteOptions_DEFAULT)
if err != nil {
return err
}

Просмотреть файл

@ -41,7 +41,7 @@ func TestTxExecutorEmptyPrepare(t *testing.T) {
txe, tsv, db := newTestTxExecutor(t)
defer db.Close()
defer tsv.StopService()
txid := newTransaction(tsv)
txid := newTransaction(tsv, nil)
err := txe.Prepare(txid, "aa")
if err != nil {
t.Error(err)
@ -616,7 +616,7 @@ func newNoTwopcExecutor(t *testing.T) (txe *TxExecutor, tsv *TabletServer, db *f
// newTxForPrep creates a non-empty transaction.
func newTxForPrep(tsv *TabletServer) int64 {
txid := newTransaction(tsv)
txid := newTransaction(tsv, nil)
target := querypb.Target{TabletType: topodatapb.TabletType_MASTER}
_, err := tsv.Execute(context.Background(), &target, "update test_table set name = 2 where pk = 1", nil, txid, nil)
if err != nil {

Просмотреть файл

@ -164,7 +164,7 @@ func (axp *TxPool) WaitForEmpty() {
// Begin begins a transaction, and returns the associated transaction id.
// Subsequent statements can access the connection through the transaction id.
func (axp *TxPool) Begin(ctx context.Context, useFoundRows bool) (int64, error) {
func (axp *TxPool) Begin(ctx context.Context, useFoundRows bool, txIsolation querypb.ExecuteOptions_TransactionIsolation) (int64, error) {
var conn *connpool.DBConn
var err error
if useFoundRows {
@ -182,6 +182,20 @@ func (axp *TxPool) Begin(ctx context.Context, useFoundRows bool) (int64, error)
}
return 0, err
}
switch txIsolation {
case querypb.ExecuteOptions_DEFAULT:
break
case querypb.ExecuteOptions_REPEATABLE_READ, querypb.ExecuteOptions_READ_COMMITTED, querypb.ExecuteOptions_READ_UNCOMMITTED, querypb.ExecuteOptions_SERIALIZABLE:
query := fmt.Sprintf("set transaction isolation level %v", strings.Replace(txIsolation.String(), "_", " ", 1))
if _, err := conn.Exec(ctx, query, 1, false); err != nil {
conn.Recycle()
return 0, err
}
default:
return 0, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "unknown transaction isolation %v", txIsolation.String())
}
if _, err := conn.Exec(ctx, "begin", 1, false); err != nil {
conn.Recycle()
return 0, err
@ -231,8 +245,8 @@ func (axp *TxPool) Get(transactionID int64, reason string) (*TxConnection, error
// LocalBegin is equivalent to Begin->Get.
// It's used for executing transactions within a request. It's safe
// to always call LocalConclude at the end.
func (axp *TxPool) LocalBegin(ctx context.Context, useFoundRows bool) (*TxConnection, error) {
transactionID, err := axp.Begin(ctx, useFoundRows)
func (axp *TxPool) LocalBegin(ctx context.Context, useFoundRows bool, txIsolation querypb.ExecuteOptions_TransactionIsolation) (*TxConnection, error) {
transactionID, err := axp.Begin(ctx, useFoundRows, txIsolation)
if err != nil {
return nil, err
}

Просмотреть файл

@ -31,6 +31,7 @@ import (
"github.com/youtube/vitess/go/vt/vterrors"
"github.com/youtube/vitess/go/vt/vttablet/tabletserver/tabletenv"
"github.com/youtube/vitess/go/vt/proto/query"
vtrpcpb "github.com/youtube/vitess/go/vt/proto/vtrpc"
)
@ -46,7 +47,7 @@ func TestTxPoolExecuteRollback(t *testing.T) {
txPool.Open(db.ConnParams(), db.ConnParams(), db.ConnParams())
defer txPool.Close()
ctx := context.Background()
transactionID, err := txPool.Begin(ctx, false)
transactionID, err := txPool.Begin(ctx, false, query.ExecuteOptions_DEFAULT)
if err != nil {
t.Fatal(err)
}
@ -73,11 +74,11 @@ func TestTxPoolRollbackNonBusy(t *testing.T) {
txPool.Open(db.ConnParams(), db.ConnParams(), db.ConnParams())
defer txPool.Close()
ctx := context.Background()
txid1, err := txPool.Begin(ctx, false)
txid1, err := txPool.Begin(ctx, false, query.ExecuteOptions_DEFAULT)
if err != nil {
t.Fatal(err)
}
_, err = txPool.Begin(ctx, false)
_, err = txPool.Begin(ctx, false, query.ExecuteOptions_DEFAULT)
if err != nil {
t.Fatal(err)
}
@ -112,7 +113,7 @@ func TestTxPoolTransactionKiller(t *testing.T) {
defer txPool.Close()
ctx := context.Background()
killCount := tabletenv.KillStats.Counts()["Transactions"]
transactionID, err := txPool.Begin(ctx, false)
transactionID, err := txPool.Begin(ctx, false, query.ExecuteOptions_DEFAULT)
if err != nil {
t.Fatal(err)
}
@ -143,7 +144,7 @@ func TestTxPoolClientRowsFound(t *testing.T) {
// Start a 'normal' transaction. It should take a connection
// for the normal 'conns' pool.
id1, err := txPool.Begin(ctx, false)
id1, err := txPool.Begin(ctx, false, query.ExecuteOptions_DEFAULT)
if err != nil {
t.Fatal(err)
}
@ -156,7 +157,7 @@ func TestTxPoolClientRowsFound(t *testing.T) {
// Start a 'foundRows' transaction. It should take a connection
// from the foundRows pool.
id2, err := txPool.Begin(ctx, true)
id2, err := txPool.Begin(ctx, true, query.ExecuteOptions_DEFAULT)
if err != nil {
t.Fatal(err)
}
@ -188,6 +189,27 @@ func TestTxPoolClientRowsFound(t *testing.T) {
}
}
func TestTxPoolTransactionIsolation(t *testing.T) {
db := fakesqldb.New(t)
defer db.Close()
db.AddQuery("begin", &sqltypes.Result{})
txPool := newTxPool()
txPool.Open(db.ConnParams(), db.ConnParams(), db.ConnParams())
ctx := context.Background()
// Start a transaction with default. It should not change isolation.
_, err := txPool.Begin(ctx, false, query.ExecuteOptions_DEFAULT)
if err != nil {
t.Fatal(err)
}
db.AddQuery("set transaction isolation level READ COMMITTED", &sqltypes.Result{})
_, err = txPool.Begin(ctx, false, query.ExecuteOptions_READ_COMMITTED)
if err != nil {
t.Fatal(err)
}
}
// TestTxPoolBeginWithPoolConnectionError_TransientErrno2006 tests the case
// where we see a transient errno 2006 e.g. because MySQL killed the
// db connection. DBConn.Exec() is going to reconnect and retry automatically
@ -207,7 +229,7 @@ func TestTxPoolBeginWithPoolConnectionError_Errno2006_Transient(t *testing.T) {
}
ctx := context.Background()
txConn, err := txPool.LocalBegin(ctx, false)
txConn, err := txPool.LocalBegin(ctx, false, query.ExecuteOptions_DEFAULT)
if err != nil {
t.Fatalf("Begin should have succeeded after the retry in DBConn.Exec(): %v", err)
}
@ -238,7 +260,7 @@ func TestTxPoolBeginWithPoolConnectionError_Errno2006_Permanent(t *testing.T) {
// After that, vttablet will automatically try to reconnect and this fail.
// DBConn.Exec() will return the reconnect error as final error and not the
// initial connection error.
_, err = txPool.LocalBegin(context.Background(), false)
_, err = txPool.LocalBegin(context.Background(), false, query.ExecuteOptions_DEFAULT)
if err == nil || !strings.Contains(err.Error(), "(errno 2013)") {
t.Fatalf("Begin did not return the reconnect error: %v", err)
}
@ -264,7 +286,7 @@ func TestTxPoolBeginWithPoolConnectionError_Errno2013(t *testing.T) {
db.EnableShouldClose()
// 2013 is not retryable. DBConn.Exec() fails after the first attempt.
_, err = txPool.Begin(context.Background(), false)
_, err = txPool.Begin(context.Background(), false, query.ExecuteOptions_DEFAULT)
if err == nil || !strings.Contains(err.Error(), "(errno 2013)") {
t.Fatalf("Begin must return connection error with MySQL errno 2013: %v", err)
}
@ -287,7 +309,7 @@ func primeTxPoolWithConnection(t *testing.T) (*fakesqldb.DB, *TxPool, error) {
db.AddQuery("begin", &sqltypes.Result{})
db.AddQuery("rollback", &sqltypes.Result{})
ctx := context.Background()
txConn, err := txPool.LocalBegin(ctx, false)
txConn, err := txPool.LocalBegin(ctx, false, query.ExecuteOptions_DEFAULT)
if err != nil {
return nil, nil, err
}
@ -304,7 +326,7 @@ func TestTxPoolBeginWithError(t *testing.T) {
txPool.Open(db.ConnParams(), db.ConnParams(), db.ConnParams())
defer txPool.Close()
ctx := context.Background()
_, err := txPool.Begin(ctx, false)
_, err := txPool.Begin(ctx, false, query.ExecuteOptions_DEFAULT)
want := "error: rejected"
if err == nil || !strings.Contains(err.Error(), want) {
t.Errorf("Begin: %v, want %s", err, want)
@ -326,7 +348,7 @@ func TestTxPoolRollbackFail(t *testing.T) {
txPool.Open(db.ConnParams(), db.ConnParams(), db.ConnParams())
defer txPool.Close()
ctx := context.Background()
transactionID, err := txPool.Begin(ctx, false)
transactionID, err := txPool.Begin(ctx, false, query.ExecuteOptions_DEFAULT)
if err != nil {
t.Fatal(err)
}
@ -371,7 +393,7 @@ func TestTxPoolExecFailDueToConnFail_Errno2006(t *testing.T) {
ctx := context.Background()
// Start the transaction.
txConn, err := txPool.LocalBegin(ctx, false)
txConn, err := txPool.LocalBegin(ctx, false, query.ExecuteOptions_DEFAULT)
if err != nil {
t.Fatal(err)
}
@ -409,7 +431,7 @@ func TestTxPoolExecFailDueToConnFail_Errno2013(t *testing.T) {
ctx := context.Background()
// Start the transaction.
txConn, err := txPool.LocalBegin(ctx, false)
txConn, err := txPool.LocalBegin(ctx, false, query.ExecuteOptions_DEFAULT)
if err != nil {
t.Fatal(err)
}
@ -440,7 +462,7 @@ func TestTxPoolCloseKillsStrayTransactions(t *testing.T) {
txPool.Open(db.ConnParams(), db.ConnParams(), db.ConnParams())
// Start stray transaction.
_, err := txPool.Begin(context.Background(), false)
_, err := txPool.Begin(context.Background(), false, query.ExecuteOptions_DEFAULT)
if err != nil {
t.Fatal(err)
}

Просмотреть файл

@ -277,6 +277,16 @@ message ExecuteOptions {
// sql_select_limit sets an implicit limit on all select statements. Since
// vitess also sets a rowcount limit on queries, the smallest value wins.
int64 sql_select_limit = 8;
enum TransactionIsolation {
DEFAULT = 0;
REPEATABLE_READ = 1;
READ_COMMITTED = 2;
READ_UNCOMMITTED = 3;
SERIALIZABLE = 4;
}
TransactionIsolation transaction_isolation = 9;
}
// Field describes a single column returned by a query

Различия файлов скрыты, потому что одна или несколько строк слишком длинны