From d37ad9b42892a369eca28e5b68fc6571544bd519 Mon Sep 17 00:00:00 2001 From: Rafael Chacon Date: Mon, 25 Sep 2017 16:51:39 -0700 Subject: [PATCH] Adds session option to cache query plans --- go/vt/proto/query/query.pb.go | 386 +++++++++--------- go/vt/vtgate/executor.go | 47 ++- go/vt/vtgate/executor_test.go | 71 +++- go/vt/vttablet/tabletserver/query_engine.go | 6 +- .../tabletserver/query_engine_test.go | 47 ++- .../tabletserver/query_executor_test.go | 2 +- go/vt/vttablet/tabletserver/tabletserver.go | 14 +- proto/query.proto | 4 + py/vtproto/query_pb2.py | 255 ++++++------ 9 files changed, 493 insertions(+), 339 deletions(-) diff --git a/go/vt/proto/query/query.pb.go b/go/vt/proto/query/query.pb.go index 54066968061..688ad945da5 100644 --- a/go/vt/proto/query/query.pb.go +++ b/go/vt/proto/query/query.pb.go @@ -763,6 +763,9 @@ type ExecuteOptions struct { // 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"` TransactionIsolation ExecuteOptions_TransactionIsolation `protobuf:"varint,9,opt,name=transaction_isolation,json=transactionIsolation,enum=query.ExecuteOptions_TransactionIsolation" json:"transaction_isolation,omitempty"` + // skip_query_plan_cache specifies if the query plan shoud be cached by vitess. + // By default all query plans are cached. + SkipQueryPlanCache bool `protobuf:"varint,10,opt,name=skip_query_plan_cache,json=skipQueryPlanCache" json:"skip_query_plan_cache,omitempty"` } func (m *ExecuteOptions) Reset() { *m = ExecuteOptions{} } @@ -819,6 +822,13 @@ func (m *ExecuteOptions) GetTransactionIsolation() ExecuteOptions_TransactionIso return ExecuteOptions_DEFAULT } +func (m *ExecuteOptions) GetSkipQueryPlanCache() bool { + if m != nil { + return m.SkipQueryPlanCache + } + return false +} + // Field describes a single column returned by a query type Field struct { // name of the field as returned by mysql C API @@ -2757,196 +2767,198 @@ func init() { func init() { proto.RegisterFile("query.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 3047 bytes of a gzipped FileDescriptorProto + // 3078 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, + 0xf9, 0x1b, 0x52, 0xf9, 0x03, 0x72, 0xcb, 0x21, 0xc9, 0x21, 0xa7, 0x54, 0x0e, 0xa9, 0x4a, 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, 0xaf, 0x15, 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, 0x7f, 0xc9, 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, 0x2a, 0x7e, 0x09, 0x96, 0x82, + 0x7d, 0x67, 0x68, 0x71, 0x3d, 0xd6, 0xd0, 0xb5, 0x07, 0x56, 0xd7, 0xee, 0xee, 0xd1, 0x0a, 0x70, + 0xb7, 0x31, 0x63, 0xf2, 0x54, 0x6b, 0xb9, 0xf6, 0xa0, 0xca, 0x38, 0xea, 0x2b, 0x50, 0x9a, 0xc4, + 0x11, 0x2f, 0x40, 0xd1, 0xbc, 0xdd, 0xd2, 0x2d, 0xcd, 0xd8, 0xb2, 0x0c, 0xad, 0xa1, 0xa3, 0x33, + 0xb8, 0x08, 0x79, 0x4e, 0x6a, 0x1a, 0xf5, 0xdb, 0x48, 0xc1, 0xb3, 0x90, 0xd6, 0xea, 0x75, 0x94, + 0x52, 0xaf, 0x40, 0x2e, 0x02, 0x04, 0xcf, 0x43, 0xa1, 0x63, 0xb4, 0x5b, 0x7a, 0xb5, 0xb6, 0x5d, + 0xd3, 0xb7, 0xd0, 0x19, 0x9c, 0x83, 0x4c, 0xb3, 0x6e, 0xb6, 0x90, 0x22, 0x5a, 0x5a, 0x0b, 0xa5, + 0xd8, 0x3f, 0xb7, 0x36, 0x35, 0x94, 0x56, 0x43, 0x58, 0x9c, 0xe6, 0x17, 0x2e, 0xc0, 0xec, 0x96, + 0xbe, 0xad, 0x75, 0xea, 0x26, 0x3a, 0x83, 0xcb, 0x30, 0x4f, 0xf4, 0x96, 0xae, 0x99, 0xda, 0x66, + 0x5d, 0xb7, 0x88, 0xae, 0x6d, 0x21, 0x05, 0x63, 0x28, 0xb1, 0x96, 0x55, 0x6d, 0x36, 0x1a, 0x35, + 0xd3, 0xd4, 0xb7, 0x50, 0x0a, 0x2f, 0x02, 0xe2, 0xb4, 0x8e, 0x31, 0xa6, 0xa6, 0x31, 0x82, 0xb9, + 0xb6, 0x4e, 0x6a, 0x5a, 0xbd, 0xf6, 0x06, 0x53, 0x80, 0x32, 0xaf, 0x65, 0x72, 0x0a, 0x4a, 0xa9, + 0xef, 0xa6, 0x20, 0xcb, 0x7d, 0xc5, 0x18, 0x32, 0x89, 0xba, 0xc7, 0xdb, 0x71, 0xb5, 0x48, 0x7d, + 0x48, 0xb5, 0xe0, 0x05, 0x55, 0xd6, 0x2d, 0xd1, 0xc1, 0xe7, 0x20, 0xef, 0xf9, 0xbb, 0x96, 0xe0, + 0x64, 0x44, 0x45, 0xf3, 0xfc, 0x5d, 0x5e, 0x86, 0x59, 0xb5, 0x63, 0x45, 0x79, 0xc7, 0x0e, 0x28, + 0xcf, 0xc0, 0x3c, 0x89, 0xfb, 0xf8, 0x71, 0x60, 0x72, 0x16, 0x1f, 0xc7, 0x0c, 0xe7, 0xcd, 0x7a, + 0xfe, 0xae, 0xc1, 0x86, 0xf2, 0x0c, 0x14, 0xbb, 0x9e, 0x3b, 0xea, 0x0f, 0x2c, 0x97, 0x0e, 0x76, + 0xc3, 0xbd, 0xca, 0xec, 0x8a, 0xb2, 0x5a, 0x24, 0x73, 0x82, 0x58, 0xe7, 0x34, 0x5c, 0x81, 0xd9, + 0xee, 0x9e, 0xed, 0x07, 0x54, 0x64, 0x5d, 0x91, 0x44, 0x5d, 0x6e, 0x95, 0x76, 0x9d, 0xbe, 0xed, + 0x06, 0x3c, 0xc3, 0x8a, 0x24, 0xee, 0x33, 0x27, 0xee, 0xb8, 0xf6, 0x6e, 0xc0, 0x33, 0xa3, 0x48, + 0x44, 0x47, 0xfd, 0x7f, 0x48, 0x13, 0xef, 0x90, 0xa9, 0x14, 0x06, 0x83, 0x8a, 0xb2, 0x92, 0x5e, + 0xc5, 0x24, 0xea, 0xb2, 0x05, 0x41, 0xd6, 0x44, 0x51, 0x2a, 0xa3, 0x2a, 0xf8, 0x26, 0xcc, 0x11, + 0x1a, 0x8c, 0xdc, 0x50, 0x7f, 0x2b, 0xf4, 0xed, 0x00, 0x6f, 0x40, 0x21, 0x59, 0x05, 0x94, 0x0f, + 0xaa, 0x02, 0x40, 0xc7, 0xd3, 0xbf, 0x02, 0xb3, 0x77, 0x7c, 0x1a, 0xec, 0x51, 0x5f, 0x56, 0x99, + 0xa8, 0xcb, 0x6a, 0x6c, 0x81, 0xa7, 0xad, 0xb0, 0xc1, 0x2a, 0xb3, 0xac, 0x0f, 0xca, 0x44, 0x65, + 0xe6, 0x41, 0x25, 0x92, 0xc7, 0xd0, 0x63, 0x53, 0xde, 0xb2, 0xef, 0xdc, 0xa1, 0xdd, 0x90, 0x8a, + 0x05, 0x28, 0x43, 0xe6, 0x18, 0x51, 0x93, 0x34, 0x16, 0x36, 0x67, 0x10, 0x50, 0x3f, 0xb4, 0x9c, + 0x1e, 0x0f, 0x68, 0x86, 0xe4, 0x04, 0xa1, 0xd6, 0xc3, 0x4f, 0x41, 0x86, 0x17, 0x8d, 0x0c, 0xb7, + 0x02, 0xd2, 0x0a, 0xf1, 0x0e, 0x09, 0xa7, 0xe3, 0x17, 0x60, 0x86, 0x72, 0x7f, 0x79, 0x50, 0xc7, + 0x65, 0x36, 0x09, 0x05, 0x91, 0x22, 0xea, 0xcf, 0xd3, 0x50, 0x68, 0x87, 0x3e, 0xb5, 0xfb, 0xdc, + 0x7f, 0xfc, 0x29, 0x80, 0x20, 0xb4, 0x43, 0xda, 0xa7, 0x83, 0x30, 0x72, 0xe4, 0x09, 0xa9, 0x20, + 0x21, 0xb7, 0xde, 0x8e, 0x84, 0x48, 0x42, 0xfe, 0x38, 0xc0, 0xa9, 0x07, 0x00, 0x78, 0xf9, 0xfd, + 0x14, 0xe4, 0x63, 0x6d, 0x58, 0x83, 0x5c, 0xd7, 0x0e, 0xe9, 0xae, 0xe7, 0x1f, 0xc9, 0x95, 0xf1, + 0xfc, 0x87, 0x59, 0x5f, 0xaf, 0x4a, 0x61, 0x12, 0xff, 0x0d, 0x3f, 0x09, 0x62, 0x6b, 0x21, 0x92, + 0x57, 0xac, 0xef, 0x79, 0x4e, 0xe1, 0xe9, 0xfb, 0x32, 0xe0, 0xa1, 0xef, 0xf4, 0x6d, 0xff, 0xc8, + 0xda, 0xa7, 0x47, 0x51, 0x49, 0x4f, 0x4f, 0x09, 0x19, 0x92, 0x72, 0xd7, 0xe9, 0x91, 0x2c, 0x42, + 0x57, 0x26, 0xff, 0x2b, 0x93, 0xee, 0x64, 0x20, 0x12, 0xff, 0xe4, 0xeb, 0x72, 0x10, 0xad, 0xc0, + 0x59, 0x9e, 0x9f, 0xac, 0xa9, 0x3e, 0x0f, 0xb9, 0x68, 0xf0, 0x38, 0x0f, 0x59, 0xdd, 0xf7, 0x3d, + 0x1f, 0x9d, 0xe1, 0xb5, 0xa8, 0x51, 0x17, 0xe5, 0x6c, 0x6b, 0x8b, 0x95, 0xb3, 0x5f, 0xa5, 0xe2, + 0x65, 0x90, 0xd0, 0x83, 0x11, 0x0d, 0x42, 0xfc, 0x59, 0x28, 0x53, 0x9e, 0x2b, 0xce, 0x5d, 0x6a, + 0x75, 0xf9, 0x9e, 0x89, 0x65, 0x8a, 0x48, 0xe8, 0xf9, 0x75, 0xb1, 0x9b, 0x8b, 0xf6, 0x52, 0x64, + 0x21, 0x96, 0x95, 0xa4, 0x1e, 0xd6, 0xa1, 0xec, 0xf4, 0xfb, 0xb4, 0xe7, 0xd8, 0x61, 0x52, 0x81, + 0x08, 0xd8, 0x52, 0xb4, 0xa5, 0x98, 0xd8, 0x92, 0x91, 0x85, 0xf8, 0x1f, 0xb1, 0x9a, 0xf3, 0x30, + 0x13, 0xf2, 0xad, 0xa2, 0x5c, 0x51, 0x8b, 0x51, 0x5d, 0xe2, 0x44, 0x22, 0x99, 0xf8, 0x79, 0x10, + 0xfb, 0x4e, 0x5e, 0x81, 0xc6, 0x09, 0x31, 0xde, 0x63, 0x10, 0xc1, 0xc7, 0xe7, 0xa1, 0x34, 0xb1, + 0x14, 0xf5, 0x38, 0x60, 0x69, 0x52, 0x4c, 0xae, 0x2b, 0x3d, 0xfc, 0xbf, 0x30, 0xeb, 0x89, 0x65, + 0x88, 0xd7, 0xa6, 0xf1, 0x88, 0x27, 0xd7, 0x28, 0x12, 0x49, 0xa9, 0x9f, 0x86, 0xf9, 0x18, 0xc1, + 0x60, 0xe8, 0x0d, 0x02, 0x8a, 0xd7, 0x60, 0xc6, 0xe7, 0x13, 0x42, 0xa2, 0x86, 0xa5, 0x8a, 0xc4, + 0x8c, 0x26, 0x52, 0x42, 0xed, 0xc1, 0xbc, 0xa0, 0xdc, 0x72, 0xc2, 0x3d, 0x1e, 0x28, 0x7c, 0x1e, + 0xb2, 0x94, 0x35, 0x8e, 0x61, 0x4e, 0x5a, 0x55, 0xce, 0x27, 0x82, 0x9b, 0xb0, 0x92, 0xba, 0xaf, + 0x95, 0xbf, 0xa5, 0xa0, 0x2c, 0x47, 0xb9, 0x69, 0x87, 0xdd, 0xbd, 0x53, 0x1a, 0xec, 0x17, 0x60, + 0x96, 0xd1, 0x9d, 0x78, 0x62, 0x4c, 0x09, 0x77, 0x24, 0xc1, 0x02, 0x6e, 0x07, 0x56, 0x22, 0xba, + 0x72, 0x2b, 0x54, 0xb4, 0x83, 0xc4, 0x42, 0x3c, 0x25, 0x2f, 0x66, 0xee, 0x93, 0x17, 0xb3, 0x0f, + 0x94, 0x17, 0x5b, 0xb0, 0x38, 0x89, 0xb8, 0x4c, 0x8e, 0x17, 0x61, 0x56, 0x04, 0x25, 0x2a, 0x81, + 0xd3, 0xe2, 0x16, 0x89, 0xa8, 0x3f, 0x4b, 0xc1, 0xa2, 0xac, 0x4e, 0x1f, 0x8f, 0x69, 0x9a, 0xc0, + 0x39, 0xfb, 0x40, 0x38, 0x57, 0x61, 0xe9, 0x18, 0x40, 0x0f, 0x31, 0x0b, 0xff, 0xaa, 0xc0, 0xdc, + 0x26, 0xdd, 0x75, 0x06, 0xa7, 0x14, 0xde, 0x04, 0x6a, 0x99, 0x07, 0x42, 0xed, 0x32, 0x14, 0xa5, + 0xbf, 0x12, 0xad, 0x93, 0xd3, 0x40, 0x99, 0x32, 0x0d, 0xd4, 0x3f, 0x29, 0x50, 0xac, 0x7a, 0xfd, + 0xbe, 0x13, 0x9e, 0x52, 0xa4, 0x4e, 0xfa, 0x99, 0x99, 0xe6, 0x27, 0x82, 0x52, 0xe4, 0xa6, 0x00, + 0x48, 0xfd, 0xb3, 0x02, 0xf3, 0xc4, 0x73, 0xdd, 0x1d, 0xbb, 0xbb, 0xff, 0x68, 0xfb, 0x8e, 0x01, + 0x8d, 0x1d, 0x95, 0xde, 0xff, 0x43, 0x81, 0x52, 0xcb, 0xa7, 0xec, 0xfb, 0xf5, 0x91, 0x76, 0x9e, + 0x7d, 0x20, 0xf5, 0x42, 0xb9, 0x39, 0xc8, 0x13, 0xde, 0x56, 0x17, 0x60, 0x3e, 0xf6, 0x5d, 0xe2, + 0xf1, 0x7b, 0x05, 0x96, 0x44, 0x82, 0x48, 0x4e, 0xef, 0x94, 0xc2, 0x12, 0xf9, 0x9b, 0x49, 0xf8, + 0x5b, 0x81, 0xc7, 0x8e, 0xfb, 0x26, 0xdd, 0x7e, 0x3b, 0x05, 0x67, 0xa3, 0xdc, 0x38, 0xe5, 0x8e, + 0xff, 0x1b, 0xf9, 0xb0, 0x0c, 0x95, 0x93, 0x20, 0x48, 0x84, 0xde, 0x49, 0x41, 0xa5, 0xea, 0x53, + 0x3b, 0xa4, 0x89, 0x4d, 0xc6, 0xa3, 0x93, 0x1b, 0xf8, 0x25, 0x98, 0x1b, 0xda, 0x7e, 0xe8, 0x74, + 0x9d, 0xa1, 0xcd, 0x3e, 0xe3, 0xb2, 0x7c, 0x0f, 0x73, 0x4c, 0xc1, 0x84, 0x88, 0x7a, 0x0e, 0x1e, + 0x9f, 0x82, 0x88, 0xc4, 0xeb, 0x9f, 0x0a, 0xe0, 0x76, 0x68, 0xfb, 0xe1, 0xc7, 0x60, 0x55, 0x99, + 0x9a, 0x4c, 0x4b, 0x50, 0x9e, 0xf0, 0x3f, 0x89, 0x0b, 0x0d, 0x3f, 0x16, 0x2b, 0xce, 0x07, 0xe2, + 0x92, 0xf4, 0x5f, 0xe2, 0xf2, 0x47, 0x05, 0x96, 0xab, 0x9e, 0x38, 0xbf, 0x7b, 0x24, 0x67, 0x98, + 0xfa, 0x24, 0x9c, 0x9b, 0xea, 0xa0, 0x04, 0xe0, 0x0f, 0x0a, 0x3c, 0x46, 0xa8, 0xdd, 0x7b, 0x34, + 0x9d, 0xbf, 0x01, 0x67, 0x4f, 0x38, 0x27, 0x77, 0xa8, 0x97, 0x21, 0xd7, 0xa7, 0xa1, 0xdd, 0xb3, + 0x43, 0x5b, 0xba, 0xb4, 0x1c, 0xe9, 0x1d, 0x4b, 0x37, 0xa4, 0x04, 0x89, 0x65, 0xd5, 0xf7, 0x53, + 0x50, 0xe6, 0x7b, 0xdd, 0x4f, 0xbe, 0xa0, 0xa6, 0x7f, 0x0b, 0xbc, 0xa3, 0xc0, 0xe2, 0x24, 0x40, + 0xf1, 0x37, 0xc1, 0x7f, 0xfa, 0x20, 0x62, 0x4a, 0x41, 0x48, 0x4f, 0xdb, 0x82, 0xfe, 0x26, 0x05, + 0x95, 0xe4, 0x90, 0x3e, 0x39, 0xb4, 0x98, 0x3c, 0xb4, 0xf8, 0xc8, 0xa7, 0x54, 0xef, 0x2a, 0xf0, + 0xf8, 0x14, 0x40, 0x3f, 0x5a, 0xa0, 0x13, 0x47, 0x17, 0xa9, 0xfb, 0x1e, 0x5d, 0x3c, 0x68, 0xa8, + 0x7f, 0xa7, 0xc0, 0x62, 0x83, 0x06, 0x81, 0xbd, 0x4b, 0xc5, 0x77, 0xfc, 0xe9, 0xad, 0x66, 0xfc, + 0x50, 0x38, 0x33, 0xbe, 0x59, 0x51, 0xab, 0xb0, 0x74, 0xcc, 0xb5, 0x87, 0x38, 0x9b, 0xf8, 0xbb, + 0x02, 0x0b, 0x52, 0x8b, 0x76, 0x6a, 0x37, 0x02, 0x53, 0xd0, 0xc1, 0x4f, 0x41, 0xda, 0xe9, 0x45, + 0x3b, 0xc8, 0xc9, 0xbb, 0x66, 0xc6, 0x50, 0xaf, 0x02, 0x4e, 0xfa, 0xfd, 0x10, 0xd0, 0xfd, 0x36, + 0x0d, 0x0b, 0xed, 0xa1, 0xeb, 0x84, 0x92, 0xf9, 0x68, 0x17, 0xfe, 0xff, 0x82, 0xb9, 0x80, 0x39, + 0x6b, 0x89, 0xdb, 0x32, 0x0e, 0x6c, 0x9e, 0x14, 0x38, 0xad, 0xca, 0x49, 0xf8, 0x69, 0x28, 0x44, + 0x22, 0xa3, 0x41, 0x28, 0x4f, 0x3a, 0x41, 0x4a, 0x8c, 0x06, 0x21, 0xbe, 0x04, 0x67, 0x07, 0xa3, + 0x3e, 0xbf, 0x39, 0xb6, 0x86, 0xd4, 0x8f, 0xee, 0x55, 0x6d, 0x3f, 0xba, 0xe1, 0x2d, 0x0f, 0x46, + 0x7d, 0xe2, 0x1d, 0x06, 0x2d, 0xea, 0x8b, 0x7b, 0x55, 0xdb, 0x0f, 0xf1, 0x55, 0xc8, 0xdb, 0xee, + 0xae, 0xe7, 0x3b, 0xe1, 0x5e, 0x5f, 0x5e, 0xed, 0xaa, 0xd1, 0xd5, 0xca, 0x71, 0xf8, 0xd7, 0xb5, + 0x48, 0x92, 0x8c, 0xff, 0xa4, 0xbe, 0x08, 0xf9, 0x98, 0x8e, 0x11, 0xcc, 0xe9, 0x37, 0x3a, 0x5a, + 0xdd, 0x6a, 0xb7, 0xea, 0x35, 0xb3, 0x2d, 0xae, 0x63, 0xb7, 0x3b, 0xf5, 0xba, 0xd5, 0xae, 0x6a, + 0x06, 0x52, 0x54, 0x02, 0xc0, 0x55, 0x72, 0xe5, 0x63, 0x80, 0x94, 0xfb, 0x00, 0x74, 0x0e, 0xf2, + 0xbe, 0x77, 0x28, 0x7d, 0x4f, 0x71, 0x77, 0x72, 0xbe, 0x77, 0xc8, 0x3d, 0x57, 0x35, 0xc0, 0xc9, + 0xb1, 0xca, 0x6c, 0x4b, 0x14, 0x6f, 0x65, 0xa2, 0x78, 0x8f, 0xed, 0xc7, 0xc5, 0x5b, 0x6c, 0xe5, + 0xd9, 0x3c, 0x7f, 0x95, 0xda, 0x6e, 0x18, 0xad, 0x57, 0xea, 0x2f, 0x52, 0x50, 0x24, 0x8c, 0xe2, + 0xf4, 0x69, 0x3b, 0xb4, 0xc3, 0x80, 0x45, 0x6a, 0x8f, 0x8b, 0x58, 0xe3, 0xb2, 0x9b, 0x27, 0x05, + 0x41, 0x13, 0x97, 0x00, 0x1b, 0xb0, 0x14, 0xd0, 0xae, 0x37, 0xe8, 0x05, 0xd6, 0x0e, 0xdd, 0x73, + 0x06, 0x3d, 0xab, 0x6f, 0x07, 0xa1, 0xbc, 0x29, 0x2c, 0x92, 0xb2, 0x64, 0x6e, 0x72, 0x5e, 0x83, + 0xb3, 0xf0, 0x05, 0x58, 0xdc, 0x71, 0x06, 0xae, 0xb7, 0x6b, 0x0d, 0x5d, 0xfb, 0x88, 0xfa, 0x81, + 0x74, 0x95, 0xa5, 0x57, 0x96, 0x60, 0xc1, 0x6b, 0x09, 0x96, 0x08, 0xf7, 0x1b, 0xb0, 0x36, 0xd5, + 0x8a, 0x75, 0xc7, 0x71, 0x43, 0xea, 0xd3, 0x9e, 0xe5, 0xd3, 0xa1, 0xeb, 0x74, 0xc5, 0xa5, 0xbd, + 0xd8, 0xbb, 0x3f, 0x37, 0xc5, 0xf4, 0xb6, 0x14, 0x27, 0x63, 0x69, 0x86, 0x76, 0x77, 0x38, 0xb2, + 0x46, 0x6c, 0x02, 0xf3, 0x55, 0x4c, 0x21, 0xb9, 0xee, 0x70, 0xd4, 0x61, 0x7d, 0x8c, 0x20, 0x7d, + 0x30, 0x14, 0x8b, 0x97, 0x42, 0x58, 0x93, 0xa1, 0xb4, 0x38, 0x89, 0x5e, 0xbc, 0x38, 0x45, 0xd3, + 0x44, 0xf9, 0xb0, 0x69, 0x52, 0x81, 0xd9, 0x80, 0xfa, 0x77, 0x9d, 0xc1, 0x6e, 0x74, 0x99, 0x2a, + 0xbb, 0xb8, 0x0d, 0xcf, 0xc9, 0x87, 0x43, 0xf4, 0xad, 0x90, 0xfa, 0x03, 0xdb, 0x75, 0x8f, 0x2c, + 0xf1, 0xdd, 0x3e, 0x08, 0x69, 0xcf, 0x1a, 0x3f, 0xe5, 0x11, 0x0b, 0xd4, 0x33, 0x42, 0x5a, 0x8f, + 0x85, 0x49, 0x2c, 0x6b, 0xc6, 0x8f, 0x7c, 0x5e, 0x81, 0x92, 0x2f, 0x63, 0x6a, 0x05, 0x2c, 0xa8, + 0x72, 0x7a, 0x2e, 0xc6, 0x37, 0xa2, 0x89, 0x80, 0x93, 0xa2, 0x3f, 0x11, 0xff, 0x2b, 0x30, 0x27, + 0x47, 0x64, 0xbb, 0x8e, 0x3d, 0xde, 0xa7, 0x1d, 0x7b, 0xcb, 0xa4, 0x31, 0x26, 0x91, 0xaf, 0x9e, + 0x78, 0x87, 0x7d, 0x16, 0x96, 0x3b, 0xc3, 0x9e, 0x1d, 0x9e, 0xee, 0xc5, 0x32, 0xf9, 0x18, 0x2a, + 0x33, 0xf9, 0x18, 0x6a, 0xf2, 0x71, 0x55, 0xf6, 0xd8, 0xe3, 0x2a, 0xf5, 0x2a, 0x2c, 0x4e, 0xfa, + 0x2f, 0xb3, 0x64, 0x15, 0xb2, 0xfc, 0xe2, 0xf7, 0xd8, 0xaa, 0x90, 0xb8, 0xd9, 0x25, 0x42, 0x40, + 0xfd, 0xa5, 0x02, 0xe5, 0x29, 0x5f, 0x0c, 0xf1, 0xe7, 0x88, 0x92, 0x38, 0xed, 0xf8, 0x1f, 0xc8, + 0xf2, 0x2b, 0x68, 0xf9, 0x36, 0xe2, 0xec, 0xc9, 0x0f, 0x0e, 0x7e, 0x5d, 0x4c, 0x84, 0x14, 0x9b, + 0xd7, 0x3c, 0x21, 0xba, 0xfc, 0xb8, 0x23, 0xda, 0xf0, 0x14, 0x18, 0x4d, 0x9c, 0x80, 0x9c, 0x3c, + 0x3f, 0xc9, 0xdc, 0xf7, 0xfc, 0x64, 0xed, 0xbb, 0x69, 0xc8, 0x37, 0x8e, 0xda, 0x07, 0xee, 0xb6, + 0x6b, 0xef, 0xf2, 0xfb, 0xdc, 0x46, 0xcb, 0xbc, 0x8d, 0xce, 0xe0, 0x05, 0x28, 0x1a, 0x4d, 0xd3, + 0x32, 0x58, 0x65, 0xdc, 0xae, 0x6b, 0xd7, 0x90, 0xc2, 0x4a, 0x67, 0x8b, 0xd4, 0xac, 0xeb, 0xfa, + 0x6d, 0x41, 0x49, 0xe1, 0x32, 0xcc, 0x77, 0x8c, 0xda, 0x8d, 0x8e, 0x3e, 0x26, 0x66, 0xf0, 0x12, + 0x2c, 0x34, 0x3a, 0x75, 0xb3, 0xd6, 0xaa, 0x27, 0xc8, 0x39, 0x56, 0x66, 0x37, 0xeb, 0xcd, 0x4d, + 0xd1, 0x45, 0x4c, 0x7f, 0xc7, 0x68, 0xd7, 0xae, 0x19, 0xfa, 0x96, 0x20, 0xad, 0x30, 0xd2, 0x1b, + 0x3a, 0x69, 0x6e, 0xd7, 0x22, 0x93, 0x57, 0x31, 0x82, 0xc2, 0x66, 0xcd, 0xd0, 0x88, 0xd4, 0x72, + 0x4f, 0xc1, 0x25, 0xc8, 0xeb, 0x46, 0xa7, 0x21, 0xfb, 0x29, 0x5c, 0x81, 0xb2, 0xd6, 0x31, 0x9b, + 0x56, 0xcd, 0xa8, 0x12, 0xbd, 0xa1, 0x1b, 0xa6, 0xe4, 0x64, 0x70, 0x19, 0x4a, 0x66, 0xad, 0xa1, + 0xb7, 0x4d, 0xad, 0xd1, 0x92, 0x44, 0x36, 0x8a, 0x5c, 0x5b, 0x8f, 0x64, 0x10, 0x5e, 0x86, 0x25, + 0xa3, 0x69, 0xc9, 0x37, 0x32, 0xd6, 0x4d, 0xad, 0xde, 0xd1, 0x25, 0x6f, 0x05, 0x9f, 0x05, 0xdc, + 0x34, 0xac, 0x4e, 0x6b, 0x4b, 0x33, 0x75, 0xcb, 0x68, 0xde, 0x92, 0x8c, 0xab, 0xb8, 0x04, 0xb9, + 0xf1, 0x08, 0xee, 0x31, 0x14, 0x8a, 0x2d, 0x8d, 0x98, 0x63, 0x67, 0xef, 0xdd, 0x63, 0x60, 0xc1, + 0x35, 0xd2, 0xec, 0xb4, 0xc6, 0x62, 0x0b, 0x50, 0x90, 0x60, 0x49, 0x52, 0x86, 0x91, 0x36, 0x6b, + 0x46, 0x35, 0x1e, 0xdf, 0xbd, 0xdc, 0x72, 0x0a, 0x29, 0x6b, 0xfb, 0x90, 0xe1, 0xe1, 0xc8, 0x41, + 0xc6, 0x68, 0x1a, 0x3a, 0x3a, 0x83, 0xe7, 0x01, 0x6a, 0xed, 0x9a, 0x61, 0xea, 0xd7, 0x88, 0x56, + 0x67, 0x6e, 0x73, 0x42, 0x04, 0x20, 0xf3, 0x76, 0x0e, 0x66, 0x6b, 0xed, 0xed, 0x7a, 0x53, 0x33, + 0xa5, 0x9b, 0xb5, 0xf6, 0x8d, 0x4e, 0xd3, 0x64, 0x4c, 0x84, 0x0b, 0x30, 0x53, 0x6b, 0x9b, 0xfa, + 0xeb, 0x26, 0xf3, 0x8b, 0xf3, 0x04, 0xaa, 0xe8, 0xde, 0xd5, 0xb5, 0xf7, 0xd2, 0x90, 0x31, 0x8f, + 0x86, 0x94, 0x05, 0x88, 0x47, 0xdb, 0xbc, 0xdd, 0x62, 0x26, 0xf3, 0x90, 0xa9, 0x19, 0xe6, 0x15, + 0xf4, 0xb9, 0x14, 0x06, 0xc8, 0x76, 0x78, 0xfb, 0xf3, 0x33, 0xac, 0x5d, 0x33, 0xcc, 0x97, 0x2e, + 0xa3, 0xb7, 0x53, 0x4c, 0x6d, 0x47, 0x74, 0xbe, 0x10, 0x31, 0x36, 0x2e, 0xa1, 0x2f, 0xc6, 0x8c, + 0x8d, 0x4b, 0xe8, 0x4b, 0x11, 0xe3, 0xe2, 0x06, 0xfa, 0x72, 0xcc, 0xb8, 0xb8, 0x81, 0xbe, 0x12, + 0x31, 0x2e, 0x5f, 0x42, 0x5f, 0x8d, 0x19, 0x97, 0x2f, 0xa1, 0xaf, 0xcd, 0x30, 0x5f, 0xb8, 0x27, + 0x17, 0x37, 0xd0, 0xd7, 0x73, 0x71, 0xef, 0xf2, 0x25, 0xf4, 0x8d, 0x1c, 0x8b, 0x7f, 0x1c, 0x55, + 0xf4, 0x4d, 0xc4, 0x86, 0xc9, 0x02, 0x84, 0xbe, 0xc5, 0x9b, 0x8c, 0x85, 0xbe, 0x8d, 0x98, 0x8f, + 0x8c, 0xca, 0xbb, 0xef, 0x70, 0xce, 0x6d, 0x5d, 0x23, 0xe8, 0x3b, 0x33, 0xe2, 0x49, 0x54, 0xb5, + 0xd6, 0xd0, 0xea, 0x08, 0xf3, 0x7f, 0x30, 0x54, 0xbe, 0x77, 0x81, 0x35, 0x59, 0x7a, 0xa2, 0xef, + 0xb7, 0x98, 0xc1, 0x9b, 0x1a, 0xa9, 0xbe, 0xaa, 0x11, 0xf4, 0x83, 0x0b, 0xcc, 0xe0, 0x4d, 0x8d, + 0x48, 0xbc, 0x7e, 0xd8, 0x62, 0x82, 0x9c, 0xf5, 0xee, 0x05, 0x36, 0x68, 0x49, 0xff, 0x51, 0x0b, + 0xe7, 0x20, 0xbd, 0x59, 0x33, 0xd1, 0x7b, 0xdc, 0x1a, 0x4b, 0x51, 0xf4, 0x63, 0xc4, 0x88, 0x6d, + 0xdd, 0x44, 0x3f, 0x61, 0xc4, 0xac, 0xd9, 0x69, 0xd5, 0x75, 0xf4, 0x04, 0x1b, 0xdc, 0x35, 0xbd, + 0xd9, 0xd0, 0x4d, 0x72, 0x1b, 0xfd, 0x94, 0x8b, 0xbf, 0xd6, 0x6e, 0x1a, 0xe8, 0x7d, 0x84, 0x4b, + 0x00, 0xfa, 0xeb, 0x2d, 0xa2, 0xb7, 0xdb, 0xb5, 0xa6, 0x81, 0x9e, 0x5e, 0xdb, 0x06, 0x74, 0xbc, + 0x1c, 0x30, 0x07, 0x3a, 0xc6, 0x75, 0xa3, 0x79, 0xcb, 0x40, 0x67, 0x58, 0xa7, 0x45, 0xf4, 0x96, + 0x46, 0x74, 0xa4, 0x60, 0x80, 0x19, 0xf1, 0x60, 0x0b, 0xa5, 0xf0, 0x1c, 0xe4, 0x48, 0xb3, 0x5e, + 0xdf, 0xd4, 0xaa, 0xd7, 0x51, 0x7a, 0x73, 0x01, 0xe6, 0x1d, 0x6f, 0xfd, 0xae, 0x13, 0xd2, 0x20, + 0x10, 0xaf, 0x65, 0x77, 0x66, 0xf8, 0xcf, 0xc5, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0x5d, 0xd9, + 0xf8, 0x4e, 0x67, 0x2b, 0x00, 0x00, } diff --git a/go/vt/vtgate/executor.go b/go/vt/vtgate/executor.go index dc970f96290..e120a0cdc07 100644 --- a/go/vt/vtgate/executor.go +++ b/go/vt/vtgate/executor.go @@ -188,7 +188,11 @@ func (e *Executor) handleExec(ctx context.Context, session *vtgatepb.Session, sq // V3 mode. query, comments := sqlparser.SplitTrailingComments(sql) vcursor := newVCursorImpl(ctx, session, target, comments, e) - plan, err := e.getPlan(vcursor, query, bindVars) + plan, err := e.getPlan(vcursor, + query, + bindVars, + skipQueryPlanCache(session), + ) if err != nil { return nil, err } @@ -287,6 +291,22 @@ func (e *Executor) handleSet(ctx context.Context, session *vtgatepb.Session, sql default: return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "unexpected value for client_found_rows: %d", val) } + case "skip_query_plan_cache": + val, ok := v.(int64) + if !ok { + return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "unexpected value type for skip_query_plan_cache: %T", v) + } + if session.Options == nil { + session.Options = &querypb.ExecuteOptions{} + } + switch val { + case 0: + session.Options.SkipQueryPlanCache = false + case 1: + session.Options.SkipQueryPlanCache = true + default: + return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "unexpected value for skip_query_plan_cache: %d", val) + } case "transaction_mode": val, ok := v.(string) if !ok { @@ -468,7 +488,12 @@ func (e *Executor) StreamExecute(ctx context.Context, session *vtgatepb.Session, } query, comments := sqlparser.SplitTrailingComments(sql) vcursor := newVCursorImpl(ctx, session, target, comments, e) - plan, err := e.getPlan(vcursor, query, bindVars) + plan, err := e.getPlan( + vcursor, + query, + bindVars, + skipQueryPlanCache(session), + ) if err != nil { return err } @@ -737,7 +762,7 @@ func (e *Executor) ParseTarget(targetString string) querypb.Target { // getPlan computes the plan for the given query. If one is in // the cache, it reuses it. -func (e *Executor) getPlan(vcursor *vcursorImpl, sql string, bindVars map[string]*querypb.BindVariable) (*engine.Plan, error) { +func (e *Executor) getPlan(vcursor *vcursorImpl, sql string, bindVars map[string]*querypb.BindVariable, skipQueryPlanCache bool) (*engine.Plan, error) { if e.VSchema() == nil { return nil, errors.New("vschema not initialized") } @@ -754,7 +779,9 @@ func (e *Executor) getPlan(vcursor *vcursorImpl, sql string, bindVars map[string if err != nil { return nil, err } - e.plans.Set(key, plan) + if !skipQueryPlanCache { + e.plans.Set(key, plan) + } return plan, nil } // Normalize and retry. @@ -775,10 +802,20 @@ func (e *Executor) getPlan(vcursor *vcursorImpl, sql string, bindVars map[string if err != nil { return nil, err } - e.plans.Set(normkey, plan) + if !skipQueryPlanCache { + e.plans.Set(normkey, plan) + } return plan, nil } +// skipQueryPlanCache extracts SkipQueryPlanCache from session +func skipQueryPlanCache(session *vtgatepb.Session) bool { + if session == nil || session.Options == nil { + return false + } + return session.Options.SkipQueryPlanCache +} + // ServeHTTP shows the current plans in the query cache. func (e *Executor) ServeHTTP(response http.ResponseWriter, request *http.Request) { if err := acl.CheckAccessHTTP(request, acl.DEBUGGING); err != nil { diff --git a/go/vt/vtgate/executor_test.go b/go/vt/vtgate/executor_test.go index ff03c1bfd59..e54d4ada9ca 100644 --- a/go/vt/vtgate/executor_test.go +++ b/go/vt/vtgate/executor_test.go @@ -281,6 +281,12 @@ func TestExecutorSet(t *testing.T) { }, { in: "set net_read_timeout = 600", out: &vtgatepb.Session{}, + }, { + in: "set skip_query_plan_cache = 1", + out: &vtgatepb.Session{Options: &querypb.ExecuteOptions{SkipQueryPlanCache: true}}, + }, { + in: "set skip_query_plan_cache = 0", + out: &vtgatepb.Session{Options: &querypb.ExecuteOptions{}}, }} for _, tcase := range testcases { session := &vtgatepb.Session{} @@ -727,11 +733,11 @@ func TestGetPlanUnnormalized(t *testing.T) { unshardedvc := newVCursorImpl(context.Background(), nil, querypb.Target{Keyspace: KsTestUnsharded}, "", r) query1 := "select * from music_user_map where id = 1" - plan1, err := r.getPlan(emptyvc, query1, map[string]*querypb.BindVariable{}) + plan1, err := r.getPlan(emptyvc, query1, map[string]*querypb.BindVariable{}, false) if err != nil { t.Error(err) } - plan2, err := r.getPlan(emptyvc, query1, map[string]*querypb.BindVariable{}) + plan2, err := r.getPlan(emptyvc, query1, map[string]*querypb.BindVariable{}, false) if err != nil { t.Error(err) } @@ -744,14 +750,14 @@ func TestGetPlanUnnormalized(t *testing.T) { if keys := r.plans.Keys(); !reflect.DeepEqual(keys, want) { t.Errorf("Plan keys: %s, want %s", keys, want) } - plan3, err := r.getPlan(unshardedvc, query1, map[string]*querypb.BindVariable{}) + plan3, err := r.getPlan(unshardedvc, query1, map[string]*querypb.BindVariable{}, false) if err != nil { t.Error(err) } if plan1 == plan3 { t.Errorf("getPlan(query1, ks): plans must not be equal: %p %p", plan1, plan3) } - plan4, err := r.getPlan(unshardedvc, query1, map[string]*querypb.BindVariable{}) + plan4, err := r.getPlan(unshardedvc, query1, map[string]*querypb.BindVariable{}, false) if err != nil { t.Error(err) } @@ -767,6 +773,47 @@ func TestGetPlanUnnormalized(t *testing.T) { } } +func TestGetPlanCacheUnnormalized(t *testing.T) { + r, _, _, _ := createExecutorEnv() + emptyvc := newVCursorImpl(context.Background(), nil, querypb.Target{}, "", r) + query1 := "select * from music_user_map where id = 1" + _, err := r.getPlan(emptyvc, query1, map[string]*querypb.BindVariable{}, true /* skipQueryPlanCache */) + if err != nil { + t.Error(err) + } + if r.plans.Size() != 0 { + t.Errorf("getPlan() expected cache to have size 0, but got: %b", r.plans.Size()) + } + _, err = r.getPlan(emptyvc, query1, map[string]*querypb.BindVariable{}, false /* skipQueryPlanCache */) + if err != nil { + t.Error(err) + } + if r.plans.Size() != 1 { + t.Errorf("getPlan() expected cache to have size 1, but got: %b", r.plans.Size()) + } +} + +func TestGetPlanCacheNormalized(t *testing.T) { + r, _, _, _ := createExecutorEnv() + r.normalize = true + emptyvc := newVCursorImpl(context.Background(), nil, querypb.Target{}, "", r) + query1 := "select * from music_user_map where id = 1" + _, err := r.getPlan(emptyvc, query1, map[string]*querypb.BindVariable{}, true /* skipQueryPlanCache */) + if err != nil { + t.Error(err) + } + if r.plans.Size() != 0 { + t.Errorf("getPlan() expected cache to have size 0, but got: %b", r.plans.Size()) + } + _, err = r.getPlan(emptyvc, query1, map[string]*querypb.BindVariable{}, false /* skipQueryPlanCache */) + if err != nil { + t.Error(err) + } + if r.plans.Size() != 1 { + t.Errorf("getPlan() expected cache to have size 1, but got: %b", r.plans.Size()) + } +} + func TestGetPlanNormalized(t *testing.T) { r, _, _, _ := createExecutorEnv() r.normalize = true @@ -776,11 +823,11 @@ func TestGetPlanNormalized(t *testing.T) { query1 := "select * from music_user_map where id = 1" query2 := "select * from music_user_map where id = 2" normalized := "select * from music_user_map where id = :vtg1" - plan1, err := r.getPlan(emptyvc, query1, map[string]*querypb.BindVariable{}) + plan1, err := r.getPlan(emptyvc, query1, map[string]*querypb.BindVariable{}, false) if err != nil { t.Error(err) } - plan2, err := r.getPlan(emptyvc, query1, map[string]*querypb.BindVariable{}) + plan2, err := r.getPlan(emptyvc, query1, map[string]*querypb.BindVariable{}, false) if err != nil { t.Error(err) } @@ -793,14 +840,14 @@ func TestGetPlanNormalized(t *testing.T) { if keys := r.plans.Keys(); !reflect.DeepEqual(keys, want) { t.Errorf("Plan keys: %s, want %s", keys, want) } - plan3, err := r.getPlan(emptyvc, query2, map[string]*querypb.BindVariable{}) + plan3, err := r.getPlan(emptyvc, query2, map[string]*querypb.BindVariable{}, false) if err != nil { t.Error(err) } if plan1 != plan3 { t.Errorf("getPlan(query2): plans must be equal: %p %p", plan1, plan3) } - plan4, err := r.getPlan(emptyvc, normalized, map[string]*querypb.BindVariable{}) + plan4, err := r.getPlan(emptyvc, normalized, map[string]*querypb.BindVariable{}, false) if err != nil { t.Error(err) } @@ -808,14 +855,14 @@ func TestGetPlanNormalized(t *testing.T) { t.Errorf("getPlan(normalized): plans must be equal: %p %p", plan1, plan4) } - plan3, err = r.getPlan(unshardedvc, query1, map[string]*querypb.BindVariable{}) + plan3, err = r.getPlan(unshardedvc, query1, map[string]*querypb.BindVariable{}, false) if err != nil { t.Error(err) } if plan1 == plan3 { t.Errorf("getPlan(query1, ks): plans must not be equal: %p %p", plan1, plan3) } - plan4, err = r.getPlan(unshardedvc, query1, map[string]*querypb.BindVariable{}) + plan4, err = r.getPlan(unshardedvc, query1, map[string]*querypb.BindVariable{}, false) if err != nil { t.Error(err) } @@ -831,12 +878,12 @@ func TestGetPlanNormalized(t *testing.T) { } // Errors - _, err = r.getPlan(emptyvc, "syntax", map[string]*querypb.BindVariable{}) + _, err = r.getPlan(emptyvc, "syntax", map[string]*querypb.BindVariable{}, false) wantErr := "syntax error at position 7 near 'syntax'" if err == nil || err.Error() != wantErr { t.Errorf("getPlan(syntax): %v, want %s", err, wantErr) } - _, err = r.getPlan(emptyvc, "create table a(id int)", map[string]*querypb.BindVariable{}) + _, err = r.getPlan(emptyvc, "create table a(id int)", map[string]*querypb.BindVariable{}, false) wantErr = "unsupported construct: ddl" if err == nil || err.Error() != wantErr { t.Errorf("getPlan(syntax): %v, want %s", err, wantErr) diff --git a/go/vt/vttablet/tabletserver/query_engine.go b/go/vt/vttablet/tabletserver/query_engine.go index 687dd0d83f7..2aace81c9bd 100644 --- a/go/vt/vttablet/tabletserver/query_engine.go +++ b/go/vt/vttablet/tabletserver/query_engine.go @@ -280,7 +280,7 @@ func (qe *QueryEngine) Close() { } // GetPlan returns the TabletPlan that for the query. Plans are cached in a cache.LRUCache. -func (qe *QueryEngine) GetPlan(ctx context.Context, logStats *tabletenv.LogStats, sql string) (*TabletPlan, error) { +func (qe *QueryEngine) GetPlan(ctx context.Context, logStats *tabletenv.LogStats, sql string, skipQueryPlanCache bool) (*TabletPlan, error) { span := trace.NewSpanFromContext(ctx) span.StartLocal("QueryEngine.GetPlan") defer span.Finish() @@ -326,7 +326,9 @@ func (qe *QueryEngine) GetPlan(ctx context.Context, logStats *tabletenv.LogStats } else if plan.PlanID == planbuilder.PlanDDL || plan.PlanID == planbuilder.PlanSet { return plan, nil } - qe.queries.Set(sql, plan) + if !skipQueryPlanCache { + qe.queries.Set(sql, plan) + } return plan, nil } diff --git a/go/vt/vttablet/tabletserver/query_engine_test.go b/go/vt/vttablet/tabletserver/query_engine_test.go index 0c628326093..20ef702c144 100644 --- a/go/vt/vttablet/tabletserver/query_engine_test.go +++ b/go/vt/vttablet/tabletserver/query_engine_test.go @@ -95,7 +95,7 @@ func TestGetPlanPanicDuetoEmptyQuery(t *testing.T) { ctx := context.Background() logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") - _, err := qe.GetPlan(ctx, logStats, "") + _, err := qe.GetPlan(ctx, logStats, "", false) want := "syntax error" if err == nil || !strings.Contains(err.Error(), want) { t.Errorf("qe.GetPlan: %v, want %s", err, want) @@ -131,7 +131,7 @@ func TestGetMessageStreamPlan(t *testing.T) { } } -func TestQueryCache(t *testing.T) { +func TestQueryPlanCache(t *testing.T) { db := fakesqldb.New(t) defer db.Close() for query, result := range schematest.Queries() { @@ -153,14 +153,14 @@ func TestQueryCache(t *testing.T) { ctx := context.Background() logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") qe.SetQueryCacheCap(1) - firstPlan, err := qe.GetPlan(ctx, logStats, firstQuery) + firstPlan, err := qe.GetPlan(ctx, logStats, firstQuery, false) if err != nil { t.Fatal(err) } if firstPlan == nil { t.Fatalf("plan should not be nil") } - secondPlan, err := qe.GetPlan(ctx, logStats, secondQuery) + secondPlan, err := qe.GetPlan(ctx, logStats, secondQuery, false) if err != nil { t.Fatal(err) } @@ -170,6 +170,43 @@ func TestQueryCache(t *testing.T) { expvar.Do(func(kv expvar.KeyValue) { _ = kv.Value.String() }) + if qe.queries.Size() == 0 { + t.Fatalf("query plan cache should not be 0") + } + qe.ClearQueryPlanCache() +} + +func TestNoQueryPlanCache(t *testing.T) { + db := fakesqldb.New(t) + defer db.Close() + for query, result := range schematest.Queries() { + db.AddQuery(query, result) + } + + firstQuery := "select * from test_table_01" + db.AddQuery("select * from test_table_01 where 1 != 1", &sqltypes.Result{}) + db.AddQuery("select * from test_table_02 where 1 != 1", &sqltypes.Result{}) + + qe := newTestQueryEngine(10, 10*time.Second, true) + testUtils := newTestUtils() + dbconfigs := testUtils.newDBConfigs(db) + qe.se.Open(db.ConnParams()) + qe.Open(dbconfigs) + defer qe.Close() + + ctx := context.Background() + logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") + qe.SetQueryCacheCap(1) + firstPlan, err := qe.GetPlan(ctx, logStats, firstQuery, true) + if err != nil { + t.Fatal(err) + } + if firstPlan == nil { + t.Fatalf("plan should not be nil") + } + if qe.queries.Size() != 0 { + t.Fatalf("query plan cache should be 0") + } qe.ClearQueryPlanCache() } @@ -190,7 +227,7 @@ func TestStatsURL(t *testing.T) { // warm up cache ctx := context.Background() logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") - qe.GetPlan(ctx, logStats, query) + qe.GetPlan(ctx, logStats, query, false) request, _ := http.NewRequest("GET", "/debug/tablet_plans", nil) response := httptest.NewRecorder() diff --git a/go/vt/vttablet/tabletserver/query_executor_test.go b/go/vt/vttablet/tabletserver/query_executor_test.go index 26f9b881e66..4788650ce4e 100644 --- a/go/vt/vttablet/tabletserver/query_executor_test.go +++ b/go/vt/vttablet/tabletserver/query_executor_test.go @@ -1861,7 +1861,7 @@ func newTransaction(tsv *TabletServer, options *querypb.ExecuteOptions) int64 { func newTestQueryExecutor(ctx context.Context, tsv *TabletServer, sql string, txID int64) *QueryExecutor { logStats := tabletenv.NewLogStats(ctx, "TestQueryExecutor") - plan, err := tsv.qe.GetPlan(ctx, logStats, sql) + plan, err := tsv.qe.GetPlan(ctx, logStats, sql, false) if err != nil { panic(err) } diff --git a/go/vt/vttablet/tabletserver/tabletserver.go b/go/vt/vttablet/tabletserver/tabletserver.go index 1ccf1f0e1c6..c58e2959c00 100644 --- a/go/vt/vttablet/tabletserver/tabletserver.go +++ b/go/vt/vttablet/tabletserver/tabletserver.go @@ -860,7 +860,7 @@ func (tsv *TabletServer) Execute(ctx context.Context, target *querypb.Target, sq bindVariables = make(map[string]*querypb.BindVariable) } query, comments := sqlparser.SplitTrailingComments(sql) - plan, err := tsv.qe.GetPlan(ctx, logStats, query) + plan, err := tsv.qe.GetPlan(ctx, logStats, query, skipQueryPlanCache(options)) if err != nil { return err } @@ -1059,7 +1059,7 @@ func (tsv *TabletServer) beginWaitForSameRangeTransactions(ctx context.Context, func (tsv *TabletServer) computeTxSerializerKey(ctx context.Context, logStats *tabletenv.LogStats, sql string, bindVariables map[string]*querypb.BindVariable) (string, string) { // Strip trailing comments so we don't pollute the query cache. sql, _ = sqlparser.SplitTrailingComments(sql) - plan, err := tsv.qe.GetPlan(ctx, logStats, sql) + plan, err := tsv.qe.GetPlan(ctx, logStats, sql, false /* skipQueryPlanCache */) if err != nil { logComputeRowSerializerKey.Errorf("failed to get plan for query: %v err: %v", sql, err) return "", "" @@ -1798,7 +1798,7 @@ func (tsv *TabletServer) endRequest(isTx bool) { // GetPlan is only used from vtexplain func (tsv *TabletServer) GetPlan(ctx context.Context, logStats *tabletenv.LogStats, sql string) (*TabletPlan, error) { - return tsv.qe.GetPlan(ctx, logStats, sql) + return tsv.qe.GetPlan(ctx, logStats, sql, false /* skipQueryPlanCache */) } func (tsv *TabletServer) registerDebugHealthHandler() { @@ -1960,3 +1960,11 @@ func withTimeout(ctx context.Context, timeout time.Duration, options *querypb.Ex } return context.WithTimeout(ctx, timeout) } + +// skipQueryPlanCache returns true if the query plan should be cached +func skipQueryPlanCache(options *querypb.ExecuteOptions) bool { + if options == nil { + return false + } + return options.SkipQueryPlanCache +} diff --git a/proto/query.proto b/proto/query.proto index 8eb02c81a9d..c828698245c 100644 --- a/proto/query.proto +++ b/proto/query.proto @@ -287,6 +287,10 @@ message ExecuteOptions { } TransactionIsolation transaction_isolation = 9; + + // skip_query_plan_cache specifies if the query plan shoud be cached by vitess. + // By default all query plans are cached. + bool skip_query_plan_cache = 10; } // Field describes a single column returned by a query diff --git a/py/vtproto/query_pb2.py b/py/vtproto/query_pb2.py index 04b08fe0e4b..19c7d6bcf1c 100644 --- a/py/vtproto/query_pb2.py +++ b/py/vtproto/query_pb2.py @@ -22,7 +22,7 @@ name='query.proto', package='query', syntax='proto3', - serialized_pb=_b('\n\x0bquery.proto\x12\x05query\x1a\x0etopodata.proto\x1a\x0bvtrpc.proto\"T\n\x06Target\x12\x10\n\x08keyspace\x18\x01 \x01(\t\x12\r\n\x05shard\x18\x02 \x01(\t\x12)\n\x0btablet_type\x18\x03 \x01(\x0e\x32\x14.topodata.TabletType\"2\n\x0eVTGateCallerID\x12\x10\n\x08username\x18\x01 \x01(\t\x12\x0e\n\x06groups\x18\x02 \x03(\t\"@\n\nEventToken\x12\x11\n\ttimestamp\x18\x01 \x01(\x03\x12\r\n\x05shard\x18\x02 \x01(\t\x12\x10\n\x08position\x18\x03 \x01(\t\"1\n\x05Value\x12\x19\n\x04type\x18\x01 \x01(\x0e\x32\x0b.query.Type\x12\r\n\x05value\x18\x02 \x01(\x0c\"V\n\x0c\x42indVariable\x12\x19\n\x04type\x18\x01 \x01(\x0e\x32\x0b.query.Type\x12\r\n\x05value\x18\x02 \x01(\x0c\x12\x1c\n\x06values\x18\x03 \x03(\x0b\x32\x0c.query.Value\"\xa2\x01\n\nBoundQuery\x12\x0b\n\x03sql\x18\x01 \x01(\t\x12<\n\x0e\x62ind_variables\x18\x02 \x03(\x0b\x32$.query.BoundQuery.BindVariablesEntry\x1aI\n\x12\x42indVariablesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\"\n\x05value\x18\x02 \x01(\x0b\x32\x13.query.BindVariable:\x02\x38\x01\"\xc1\x04\n\x0e\x45xecuteOptions\x12\x1b\n\x13include_event_token\x18\x02 \x01(\x08\x12.\n\x13\x63ompare_event_token\x18\x03 \x01(\x0b\x32\x11.query.EventToken\x12=\n\x0fincluded_fields\x18\x04 \x01(\x0e\x32$.query.ExecuteOptions.IncludedFields\x12\x19\n\x11\x63lient_found_rows\x18\x05 \x01(\x08\x12\x30\n\x08workload\x18\x06 \x01(\x0e\x32\x1e.query.ExecuteOptions.Workload\x12\x18\n\x10sql_select_limit\x18\x08 \x01(\x03\x12I\n\x15transaction_isolation\x18\t \x01(\x0e\x32*.query.ExecuteOptions.TransactionIsolation\";\n\x0eIncludedFields\x12\x11\n\rTYPE_AND_NAME\x10\x00\x12\r\n\tTYPE_ONLY\x10\x01\x12\x07\n\x03\x41LL\x10\x02\"8\n\x08Workload\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x08\n\x04OLTP\x10\x01\x12\x08\n\x04OLAP\x10\x02\x12\x07\n\x03\x44\x42\x41\x10\x03\"t\n\x14TransactionIsolation\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\x13\n\x0fREPEATABLE_READ\x10\x01\x12\x12\n\x0eREAD_COMMITTED\x10\x02\x12\x14\n\x10READ_UNCOMMITTED\x10\x03\x12\x10\n\x0cSERIALIZABLE\x10\x04J\x04\x08\x01\x10\x02\"\xbf\x01\n\x05\x46ield\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x19\n\x04type\x18\x02 \x01(\x0e\x32\x0b.query.Type\x12\r\n\x05table\x18\x03 \x01(\t\x12\x11\n\torg_table\x18\x04 \x01(\t\x12\x10\n\x08\x64\x61tabase\x18\x05 \x01(\t\x12\x10\n\x08org_name\x18\x06 \x01(\t\x12\x15\n\rcolumn_length\x18\x07 \x01(\r\x12\x0f\n\x07\x63harset\x18\x08 \x01(\r\x12\x10\n\x08\x64\x65\x63imals\x18\t \x01(\r\x12\r\n\x05\x66lags\x18\n \x01(\r\"&\n\x03Row\x12\x0f\n\x07lengths\x18\x01 \x03(\x12\x12\x0e\n\x06values\x18\x02 \x01(\x0c\"G\n\x0cResultExtras\x12&\n\x0b\x65vent_token\x18\x01 \x01(\x0b\x32\x11.query.EventToken\x12\x0f\n\x07\x66resher\x18\x02 \x01(\x08\"\x94\x01\n\x0bQueryResult\x12\x1c\n\x06\x66ields\x18\x01 \x03(\x0b\x32\x0c.query.Field\x12\x15\n\rrows_affected\x18\x02 \x01(\x04\x12\x11\n\tinsert_id\x18\x03 \x01(\x04\x12\x18\n\x04rows\x18\x04 \x03(\x0b\x32\n.query.Row\x12#\n\x06\x65xtras\x18\x05 \x01(\x0b\x32\x13.query.ResultExtras\"\xca\x02\n\x0bStreamEvent\x12\x30\n\nstatements\x18\x01 \x03(\x0b\x32\x1c.query.StreamEvent.Statement\x12&\n\x0b\x65vent_token\x18\x02 \x01(\x0b\x32\x11.query.EventToken\x1a\xe0\x01\n\tStatement\x12\x37\n\x08\x63\x61tegory\x18\x01 \x01(\x0e\x32%.query.StreamEvent.Statement.Category\x12\x12\n\ntable_name\x18\x02 \x01(\t\x12(\n\x12primary_key_fields\x18\x03 \x03(\x0b\x32\x0c.query.Field\x12&\n\x12primary_key_values\x18\x04 \x03(\x0b\x32\n.query.Row\x12\x0b\n\x03sql\x18\x05 \x01(\x0c\"\'\n\x08\x43\x61tegory\x12\t\n\x05\x45rror\x10\x00\x12\x07\n\x03\x44ML\x10\x01\x12\x07\n\x03\x44\x44L\x10\x02\"\xf3\x01\n\x0e\x45xecuteRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12 \n\x05query\x18\x04 \x01(\x0b\x32\x11.query.BoundQuery\x12\x16\n\x0etransaction_id\x18\x05 \x01(\x03\x12&\n\x07options\x18\x06 \x01(\x0b\x32\x15.query.ExecuteOptions\"5\n\x0f\x45xecuteResponse\x12\"\n\x06result\x18\x01 \x01(\x0b\x32\x12.query.QueryResult\"U\n\x0fResultWithError\x12\x1e\n\x05\x65rror\x18\x01 \x01(\x0b\x32\x0f.vtrpc.RPCError\x12\"\n\x06result\x18\x02 \x01(\x0b\x32\x12.query.QueryResult\"\x92\x02\n\x13\x45xecuteBatchRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\"\n\x07queries\x18\x04 \x03(\x0b\x32\x11.query.BoundQuery\x12\x16\n\x0e\x61s_transaction\x18\x05 \x01(\x08\x12\x16\n\x0etransaction_id\x18\x06 \x01(\x03\x12&\n\x07options\x18\x07 \x01(\x0b\x32\x15.query.ExecuteOptions\";\n\x14\x45xecuteBatchResponse\x12#\n\x07results\x18\x01 \x03(\x0b\x32\x12.query.QueryResult\"\xe1\x01\n\x14StreamExecuteRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12 \n\x05query\x18\x04 \x01(\x0b\x32\x11.query.BoundQuery\x12&\n\x07options\x18\x05 \x01(\x0b\x32\x15.query.ExecuteOptions\";\n\x15StreamExecuteResponse\x12\"\n\x06result\x18\x01 \x01(\x0b\x32\x12.query.QueryResult\"\xb7\x01\n\x0c\x42\x65ginRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12&\n\x07options\x18\x04 \x01(\x0b\x32\x15.query.ExecuteOptions\"\'\n\rBeginResponse\x12\x16\n\x0etransaction_id\x18\x01 \x01(\x03\"\xa8\x01\n\rCommitRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\x16\n\x0etransaction_id\x18\x04 \x01(\x03\"\x10\n\x0e\x43ommitResponse\"\xaa\x01\n\x0fRollbackRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\x16\n\x0etransaction_id\x18\x04 \x01(\x03\"\x12\n\x10RollbackResponse\"\xb7\x01\n\x0ePrepareRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\x16\n\x0etransaction_id\x18\x04 \x01(\x03\x12\x0c\n\x04\x64tid\x18\x05 \x01(\t\"\x11\n\x0fPrepareResponse\"\xa6\x01\n\x15\x43ommitPreparedRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\x0c\n\x04\x64tid\x18\x04 \x01(\t\"\x18\n\x16\x43ommitPreparedResponse\"\xc0\x01\n\x17RollbackPreparedRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\x16\n\x0etransaction_id\x18\x04 \x01(\x03\x12\x0c\n\x04\x64tid\x18\x05 \x01(\t\"\x1a\n\x18RollbackPreparedResponse\"\xce\x01\n\x18\x43reateTransactionRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\x0c\n\x04\x64tid\x18\x04 \x01(\t\x12#\n\x0cparticipants\x18\x05 \x03(\x0b\x32\r.query.Target\"\x1b\n\x19\x43reateTransactionResponse\"\xbb\x01\n\x12StartCommitRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\x16\n\x0etransaction_id\x18\x04 \x01(\x03\x12\x0c\n\x04\x64tid\x18\x05 \x01(\t\"\x15\n\x13StartCommitResponse\"\xbb\x01\n\x12SetRollbackRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\x16\n\x0etransaction_id\x18\x04 \x01(\x03\x12\x0c\n\x04\x64tid\x18\x05 \x01(\t\"\x15\n\x13SetRollbackResponse\"\xab\x01\n\x1a\x43oncludeTransactionRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\x0c\n\x04\x64tid\x18\x04 \x01(\t\"\x1d\n\x1b\x43oncludeTransactionResponse\"\xa7\x01\n\x16ReadTransactionRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\x0c\n\x04\x64tid\x18\x04 \x01(\t\"G\n\x17ReadTransactionResponse\x12,\n\x08metadata\x18\x01 \x01(\x0b\x32\x1a.query.TransactionMetadata\"\xe0\x01\n\x13\x42\x65ginExecuteRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12 \n\x05query\x18\x04 \x01(\x0b\x32\x11.query.BoundQuery\x12&\n\x07options\x18\x05 \x01(\x0b\x32\x15.query.ExecuteOptions\"r\n\x14\x42\x65ginExecuteResponse\x12\x1e\n\x05\x65rror\x18\x01 \x01(\x0b\x32\x0f.vtrpc.RPCError\x12\"\n\x06result\x18\x02 \x01(\x0b\x32\x12.query.QueryResult\x12\x16\n\x0etransaction_id\x18\x03 \x01(\x03\"\xff\x01\n\x18\x42\x65ginExecuteBatchRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\"\n\x07queries\x18\x04 \x03(\x0b\x32\x11.query.BoundQuery\x12\x16\n\x0e\x61s_transaction\x18\x05 \x01(\x08\x12&\n\x07options\x18\x06 \x01(\x0b\x32\x15.query.ExecuteOptions\"x\n\x19\x42\x65ginExecuteBatchResponse\x12\x1e\n\x05\x65rror\x18\x01 \x01(\x0b\x32\x0f.vtrpc.RPCError\x12#\n\x07results\x18\x02 \x03(\x0b\x32\x12.query.QueryResult\x12\x16\n\x0etransaction_id\x18\x03 \x01(\x03\"\xa5\x01\n\x14MessageStreamRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\x0c\n\x04name\x18\x04 \x01(\t\";\n\x15MessageStreamResponse\x12\"\n\x06result\x18\x01 \x01(\x0b\x32\x12.query.QueryResult\"\xbd\x01\n\x11MessageAckRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x19\n\x03ids\x18\x05 \x03(\x0b\x32\x0c.query.Value\"8\n\x12MessageAckResponse\x12\"\n\x06result\x18\x01 \x01(\x0b\x32\x12.query.QueryResult\"\xe7\x02\n\x11SplitQueryRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12 \n\x05query\x18\x04 \x01(\x0b\x32\x11.query.BoundQuery\x12\x14\n\x0csplit_column\x18\x05 \x03(\t\x12\x13\n\x0bsplit_count\x18\x06 \x01(\x03\x12\x1f\n\x17num_rows_per_query_part\x18\x08 \x01(\x03\x12\x35\n\talgorithm\x18\t \x01(\x0e\x32\".query.SplitQueryRequest.Algorithm\",\n\tAlgorithm\x12\x10\n\x0c\x45QUAL_SPLITS\x10\x00\x12\r\n\tFULL_SCAN\x10\x01\"A\n\nQuerySplit\x12 \n\x05query\x18\x01 \x01(\x0b\x32\x11.query.BoundQuery\x12\x11\n\trow_count\x18\x02 \x01(\x03\"8\n\x12SplitQueryResponse\x12\"\n\x07queries\x18\x01 \x03(\x0b\x32\x11.query.QuerySplit\"\x15\n\x13StreamHealthRequest\"\xb6\x01\n\rRealtimeStats\x12\x14\n\x0chealth_error\x18\x01 \x01(\t\x12\x1d\n\x15seconds_behind_master\x18\x02 \x01(\r\x12\x1c\n\x14\x62inlog_players_count\x18\x03 \x01(\x05\x12\x32\n*seconds_behind_master_filtered_replication\x18\x04 \x01(\x03\x12\x11\n\tcpu_usage\x18\x05 \x01(\x01\x12\x0b\n\x03qps\x18\x06 \x01(\x01\"\xd1\x01\n\x14StreamHealthResponse\x12\x1d\n\x06target\x18\x01 \x01(\x0b\x32\r.query.Target\x12\x0f\n\x07serving\x18\x02 \x01(\x08\x12.\n&tablet_externally_reparented_timestamp\x18\x03 \x01(\x03\x12,\n\x0erealtime_stats\x18\x04 \x01(\x0b\x32\x14.query.RealtimeStats\x12+\n\x0ctablet_alias\x18\x05 \x01(\x0b\x32\x15.topodata.TabletAlias\"\xbb\x01\n\x13UpdateStreamRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\x10\n\x08position\x18\x04 \x01(\t\x12\x11\n\ttimestamp\x18\x05 \x01(\x03\"9\n\x14UpdateStreamResponse\x12!\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x12.query.StreamEvent\"\x86\x01\n\x13TransactionMetadata\x12\x0c\n\x04\x64tid\x18\x01 \x01(\t\x12&\n\x05state\x18\x02 \x01(\x0e\x32\x17.query.TransactionState\x12\x14\n\x0ctime_created\x18\x03 \x01(\x03\x12#\n\x0cparticipants\x18\x04 \x03(\x0b\x32\r.query.Target*\x92\x03\n\tMySqlFlag\x12\t\n\x05\x45MPTY\x10\x00\x12\x11\n\rNOT_NULL_FLAG\x10\x01\x12\x10\n\x0cPRI_KEY_FLAG\x10\x02\x12\x13\n\x0fUNIQUE_KEY_FLAG\x10\x04\x12\x15\n\x11MULTIPLE_KEY_FLAG\x10\x08\x12\r\n\tBLOB_FLAG\x10\x10\x12\x11\n\rUNSIGNED_FLAG\x10 \x12\x11\n\rZEROFILL_FLAG\x10@\x12\x10\n\x0b\x42INARY_FLAG\x10\x80\x01\x12\x0e\n\tENUM_FLAG\x10\x80\x02\x12\x18\n\x13\x41UTO_INCREMENT_FLAG\x10\x80\x04\x12\x13\n\x0eTIMESTAMP_FLAG\x10\x80\x08\x12\r\n\x08SET_FLAG\x10\x80\x10\x12\x1a\n\x15NO_DEFAULT_VALUE_FLAG\x10\x80 \x12\x17\n\x12ON_UPDATE_NOW_FLAG\x10\x80@\x12\x0e\n\x08NUM_FLAG\x10\x80\x80\x02\x12\x13\n\rPART_KEY_FLAG\x10\x80\x80\x01\x12\x10\n\nGROUP_FLAG\x10\x80\x80\x02\x12\x11\n\x0bUNIQUE_FLAG\x10\x80\x80\x04\x12\x11\n\x0b\x42INCMP_FLAG\x10\x80\x80\x08\x1a\x02\x10\x01*k\n\x04\x46lag\x12\x08\n\x04NONE\x10\x00\x12\x0f\n\nISINTEGRAL\x10\x80\x02\x12\x0f\n\nISUNSIGNED\x10\x80\x04\x12\x0c\n\x07ISFLOAT\x10\x80\x08\x12\r\n\x08ISQUOTED\x10\x80\x10\x12\x0b\n\x06ISTEXT\x10\x80 \x12\r\n\x08ISBINARY\x10\x80@*\x99\x03\n\x04Type\x12\r\n\tNULL_TYPE\x10\x00\x12\t\n\x04INT8\x10\x81\x02\x12\n\n\x05UINT8\x10\x82\x06\x12\n\n\x05INT16\x10\x83\x02\x12\x0b\n\x06UINT16\x10\x84\x06\x12\n\n\x05INT24\x10\x85\x02\x12\x0b\n\x06UINT24\x10\x86\x06\x12\n\n\x05INT32\x10\x87\x02\x12\x0b\n\x06UINT32\x10\x88\x06\x12\n\n\x05INT64\x10\x89\x02\x12\x0b\n\x06UINT64\x10\x8a\x06\x12\x0c\n\x07\x46LOAT32\x10\x8b\x08\x12\x0c\n\x07\x46LOAT64\x10\x8c\x08\x12\x0e\n\tTIMESTAMP\x10\x8d\x10\x12\t\n\x04\x44\x41TE\x10\x8e\x10\x12\t\n\x04TIME\x10\x8f\x10\x12\r\n\x08\x44\x41TETIME\x10\x90\x10\x12\t\n\x04YEAR\x10\x91\x06\x12\x0b\n\x07\x44\x45\x43IMAL\x10\x12\x12\t\n\x04TEXT\x10\x93\x30\x12\t\n\x04\x42LOB\x10\x94P\x12\x0c\n\x07VARCHAR\x10\x95\x30\x12\x0e\n\tVARBINARY\x10\x96P\x12\t\n\x04\x43HAR\x10\x97\x30\x12\x0b\n\x06\x42INARY\x10\x98P\x12\x08\n\x03\x42IT\x10\x99\x10\x12\t\n\x04\x45NUM\x10\x9a\x10\x12\x08\n\x03SET\x10\x9b\x10\x12\t\n\x05TUPLE\x10\x1c\x12\r\n\x08GEOMETRY\x10\x9d\x10\x12\t\n\x04JSON\x10\x9e\x10\x12\x0e\n\nEXPRESSION\x10\x1f*F\n\x10TransactionState\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0b\n\x07PREPARE\x10\x01\x12\n\n\x06\x43OMMIT\x10\x02\x12\x0c\n\x08ROLLBACK\x10\x03\x42\x11\n\x0fio.vitess.protob\x06proto3') + serialized_pb=_b('\n\x0bquery.proto\x12\x05query\x1a\x0etopodata.proto\x1a\x0bvtrpc.proto\"T\n\x06Target\x12\x10\n\x08keyspace\x18\x01 \x01(\t\x12\r\n\x05shard\x18\x02 \x01(\t\x12)\n\x0btablet_type\x18\x03 \x01(\x0e\x32\x14.topodata.TabletType\"2\n\x0eVTGateCallerID\x12\x10\n\x08username\x18\x01 \x01(\t\x12\x0e\n\x06groups\x18\x02 \x03(\t\"@\n\nEventToken\x12\x11\n\ttimestamp\x18\x01 \x01(\x03\x12\r\n\x05shard\x18\x02 \x01(\t\x12\x10\n\x08position\x18\x03 \x01(\t\"1\n\x05Value\x12\x19\n\x04type\x18\x01 \x01(\x0e\x32\x0b.query.Type\x12\r\n\x05value\x18\x02 \x01(\x0c\"V\n\x0c\x42indVariable\x12\x19\n\x04type\x18\x01 \x01(\x0e\x32\x0b.query.Type\x12\r\n\x05value\x18\x02 \x01(\x0c\x12\x1c\n\x06values\x18\x03 \x03(\x0b\x32\x0c.query.Value\"\xa2\x01\n\nBoundQuery\x12\x0b\n\x03sql\x18\x01 \x01(\t\x12<\n\x0e\x62ind_variables\x18\x02 \x03(\x0b\x32$.query.BoundQuery.BindVariablesEntry\x1aI\n\x12\x42indVariablesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\"\n\x05value\x18\x02 \x01(\x0b\x32\x13.query.BindVariable:\x02\x38\x01\"\xe0\x04\n\x0e\x45xecuteOptions\x12\x1b\n\x13include_event_token\x18\x02 \x01(\x08\x12.\n\x13\x63ompare_event_token\x18\x03 \x01(\x0b\x32\x11.query.EventToken\x12=\n\x0fincluded_fields\x18\x04 \x01(\x0e\x32$.query.ExecuteOptions.IncludedFields\x12\x19\n\x11\x63lient_found_rows\x18\x05 \x01(\x08\x12\x30\n\x08workload\x18\x06 \x01(\x0e\x32\x1e.query.ExecuteOptions.Workload\x12\x18\n\x10sql_select_limit\x18\x08 \x01(\x03\x12I\n\x15transaction_isolation\x18\t \x01(\x0e\x32*.query.ExecuteOptions.TransactionIsolation\x12\x1d\n\x15skip_query_plan_cache\x18\n \x01(\x08\";\n\x0eIncludedFields\x12\x11\n\rTYPE_AND_NAME\x10\x00\x12\r\n\tTYPE_ONLY\x10\x01\x12\x07\n\x03\x41LL\x10\x02\"8\n\x08Workload\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x08\n\x04OLTP\x10\x01\x12\x08\n\x04OLAP\x10\x02\x12\x07\n\x03\x44\x42\x41\x10\x03\"t\n\x14TransactionIsolation\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\x13\n\x0fREPEATABLE_READ\x10\x01\x12\x12\n\x0eREAD_COMMITTED\x10\x02\x12\x14\n\x10READ_UNCOMMITTED\x10\x03\x12\x10\n\x0cSERIALIZABLE\x10\x04J\x04\x08\x01\x10\x02\"\xbf\x01\n\x05\x46ield\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x19\n\x04type\x18\x02 \x01(\x0e\x32\x0b.query.Type\x12\r\n\x05table\x18\x03 \x01(\t\x12\x11\n\torg_table\x18\x04 \x01(\t\x12\x10\n\x08\x64\x61tabase\x18\x05 \x01(\t\x12\x10\n\x08org_name\x18\x06 \x01(\t\x12\x15\n\rcolumn_length\x18\x07 \x01(\r\x12\x0f\n\x07\x63harset\x18\x08 \x01(\r\x12\x10\n\x08\x64\x65\x63imals\x18\t \x01(\r\x12\r\n\x05\x66lags\x18\n \x01(\r\"&\n\x03Row\x12\x0f\n\x07lengths\x18\x01 \x03(\x12\x12\x0e\n\x06values\x18\x02 \x01(\x0c\"G\n\x0cResultExtras\x12&\n\x0b\x65vent_token\x18\x01 \x01(\x0b\x32\x11.query.EventToken\x12\x0f\n\x07\x66resher\x18\x02 \x01(\x08\"\x94\x01\n\x0bQueryResult\x12\x1c\n\x06\x66ields\x18\x01 \x03(\x0b\x32\x0c.query.Field\x12\x15\n\rrows_affected\x18\x02 \x01(\x04\x12\x11\n\tinsert_id\x18\x03 \x01(\x04\x12\x18\n\x04rows\x18\x04 \x03(\x0b\x32\n.query.Row\x12#\n\x06\x65xtras\x18\x05 \x01(\x0b\x32\x13.query.ResultExtras\"\xca\x02\n\x0bStreamEvent\x12\x30\n\nstatements\x18\x01 \x03(\x0b\x32\x1c.query.StreamEvent.Statement\x12&\n\x0b\x65vent_token\x18\x02 \x01(\x0b\x32\x11.query.EventToken\x1a\xe0\x01\n\tStatement\x12\x37\n\x08\x63\x61tegory\x18\x01 \x01(\x0e\x32%.query.StreamEvent.Statement.Category\x12\x12\n\ntable_name\x18\x02 \x01(\t\x12(\n\x12primary_key_fields\x18\x03 \x03(\x0b\x32\x0c.query.Field\x12&\n\x12primary_key_values\x18\x04 \x03(\x0b\x32\n.query.Row\x12\x0b\n\x03sql\x18\x05 \x01(\x0c\"\'\n\x08\x43\x61tegory\x12\t\n\x05\x45rror\x10\x00\x12\x07\n\x03\x44ML\x10\x01\x12\x07\n\x03\x44\x44L\x10\x02\"\xf3\x01\n\x0e\x45xecuteRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12 \n\x05query\x18\x04 \x01(\x0b\x32\x11.query.BoundQuery\x12\x16\n\x0etransaction_id\x18\x05 \x01(\x03\x12&\n\x07options\x18\x06 \x01(\x0b\x32\x15.query.ExecuteOptions\"5\n\x0f\x45xecuteResponse\x12\"\n\x06result\x18\x01 \x01(\x0b\x32\x12.query.QueryResult\"U\n\x0fResultWithError\x12\x1e\n\x05\x65rror\x18\x01 \x01(\x0b\x32\x0f.vtrpc.RPCError\x12\"\n\x06result\x18\x02 \x01(\x0b\x32\x12.query.QueryResult\"\x92\x02\n\x13\x45xecuteBatchRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\"\n\x07queries\x18\x04 \x03(\x0b\x32\x11.query.BoundQuery\x12\x16\n\x0e\x61s_transaction\x18\x05 \x01(\x08\x12\x16\n\x0etransaction_id\x18\x06 \x01(\x03\x12&\n\x07options\x18\x07 \x01(\x0b\x32\x15.query.ExecuteOptions\";\n\x14\x45xecuteBatchResponse\x12#\n\x07results\x18\x01 \x03(\x0b\x32\x12.query.QueryResult\"\xe1\x01\n\x14StreamExecuteRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12 \n\x05query\x18\x04 \x01(\x0b\x32\x11.query.BoundQuery\x12&\n\x07options\x18\x05 \x01(\x0b\x32\x15.query.ExecuteOptions\";\n\x15StreamExecuteResponse\x12\"\n\x06result\x18\x01 \x01(\x0b\x32\x12.query.QueryResult\"\xb7\x01\n\x0c\x42\x65ginRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12&\n\x07options\x18\x04 \x01(\x0b\x32\x15.query.ExecuteOptions\"\'\n\rBeginResponse\x12\x16\n\x0etransaction_id\x18\x01 \x01(\x03\"\xa8\x01\n\rCommitRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\x16\n\x0etransaction_id\x18\x04 \x01(\x03\"\x10\n\x0e\x43ommitResponse\"\xaa\x01\n\x0fRollbackRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\x16\n\x0etransaction_id\x18\x04 \x01(\x03\"\x12\n\x10RollbackResponse\"\xb7\x01\n\x0ePrepareRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\x16\n\x0etransaction_id\x18\x04 \x01(\x03\x12\x0c\n\x04\x64tid\x18\x05 \x01(\t\"\x11\n\x0fPrepareResponse\"\xa6\x01\n\x15\x43ommitPreparedRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\x0c\n\x04\x64tid\x18\x04 \x01(\t\"\x18\n\x16\x43ommitPreparedResponse\"\xc0\x01\n\x17RollbackPreparedRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\x16\n\x0etransaction_id\x18\x04 \x01(\x03\x12\x0c\n\x04\x64tid\x18\x05 \x01(\t\"\x1a\n\x18RollbackPreparedResponse\"\xce\x01\n\x18\x43reateTransactionRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\x0c\n\x04\x64tid\x18\x04 \x01(\t\x12#\n\x0cparticipants\x18\x05 \x03(\x0b\x32\r.query.Target\"\x1b\n\x19\x43reateTransactionResponse\"\xbb\x01\n\x12StartCommitRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\x16\n\x0etransaction_id\x18\x04 \x01(\x03\x12\x0c\n\x04\x64tid\x18\x05 \x01(\t\"\x15\n\x13StartCommitResponse\"\xbb\x01\n\x12SetRollbackRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\x16\n\x0etransaction_id\x18\x04 \x01(\x03\x12\x0c\n\x04\x64tid\x18\x05 \x01(\t\"\x15\n\x13SetRollbackResponse\"\xab\x01\n\x1a\x43oncludeTransactionRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\x0c\n\x04\x64tid\x18\x04 \x01(\t\"\x1d\n\x1b\x43oncludeTransactionResponse\"\xa7\x01\n\x16ReadTransactionRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\x0c\n\x04\x64tid\x18\x04 \x01(\t\"G\n\x17ReadTransactionResponse\x12,\n\x08metadata\x18\x01 \x01(\x0b\x32\x1a.query.TransactionMetadata\"\xe0\x01\n\x13\x42\x65ginExecuteRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12 \n\x05query\x18\x04 \x01(\x0b\x32\x11.query.BoundQuery\x12&\n\x07options\x18\x05 \x01(\x0b\x32\x15.query.ExecuteOptions\"r\n\x14\x42\x65ginExecuteResponse\x12\x1e\n\x05\x65rror\x18\x01 \x01(\x0b\x32\x0f.vtrpc.RPCError\x12\"\n\x06result\x18\x02 \x01(\x0b\x32\x12.query.QueryResult\x12\x16\n\x0etransaction_id\x18\x03 \x01(\x03\"\xff\x01\n\x18\x42\x65ginExecuteBatchRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\"\n\x07queries\x18\x04 \x03(\x0b\x32\x11.query.BoundQuery\x12\x16\n\x0e\x61s_transaction\x18\x05 \x01(\x08\x12&\n\x07options\x18\x06 \x01(\x0b\x32\x15.query.ExecuteOptions\"x\n\x19\x42\x65ginExecuteBatchResponse\x12\x1e\n\x05\x65rror\x18\x01 \x01(\x0b\x32\x0f.vtrpc.RPCError\x12#\n\x07results\x18\x02 \x03(\x0b\x32\x12.query.QueryResult\x12\x16\n\x0etransaction_id\x18\x03 \x01(\x03\"\xa5\x01\n\x14MessageStreamRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\x0c\n\x04name\x18\x04 \x01(\t\";\n\x15MessageStreamResponse\x12\"\n\x06result\x18\x01 \x01(\x0b\x32\x12.query.QueryResult\"\xbd\x01\n\x11MessageAckRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x19\n\x03ids\x18\x05 \x03(\x0b\x32\x0c.query.Value\"8\n\x12MessageAckResponse\x12\"\n\x06result\x18\x01 \x01(\x0b\x32\x12.query.QueryResult\"\xe7\x02\n\x11SplitQueryRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12 \n\x05query\x18\x04 \x01(\x0b\x32\x11.query.BoundQuery\x12\x14\n\x0csplit_column\x18\x05 \x03(\t\x12\x13\n\x0bsplit_count\x18\x06 \x01(\x03\x12\x1f\n\x17num_rows_per_query_part\x18\x08 \x01(\x03\x12\x35\n\talgorithm\x18\t \x01(\x0e\x32\".query.SplitQueryRequest.Algorithm\",\n\tAlgorithm\x12\x10\n\x0c\x45QUAL_SPLITS\x10\x00\x12\r\n\tFULL_SCAN\x10\x01\"A\n\nQuerySplit\x12 \n\x05query\x18\x01 \x01(\x0b\x32\x11.query.BoundQuery\x12\x11\n\trow_count\x18\x02 \x01(\x03\"8\n\x12SplitQueryResponse\x12\"\n\x07queries\x18\x01 \x03(\x0b\x32\x11.query.QuerySplit\"\x15\n\x13StreamHealthRequest\"\xb6\x01\n\rRealtimeStats\x12\x14\n\x0chealth_error\x18\x01 \x01(\t\x12\x1d\n\x15seconds_behind_master\x18\x02 \x01(\r\x12\x1c\n\x14\x62inlog_players_count\x18\x03 \x01(\x05\x12\x32\n*seconds_behind_master_filtered_replication\x18\x04 \x01(\x03\x12\x11\n\tcpu_usage\x18\x05 \x01(\x01\x12\x0b\n\x03qps\x18\x06 \x01(\x01\"\xd1\x01\n\x14StreamHealthResponse\x12\x1d\n\x06target\x18\x01 \x01(\x0b\x32\r.query.Target\x12\x0f\n\x07serving\x18\x02 \x01(\x08\x12.\n&tablet_externally_reparented_timestamp\x18\x03 \x01(\x03\x12,\n\x0erealtime_stats\x18\x04 \x01(\x0b\x32\x14.query.RealtimeStats\x12+\n\x0ctablet_alias\x18\x05 \x01(\x0b\x32\x15.topodata.TabletAlias\"\xbb\x01\n\x13UpdateStreamRequest\x12,\n\x13\x65\x66\x66\x65\x63tive_caller_id\x18\x01 \x01(\x0b\x32\x0f.vtrpc.CallerID\x12\x32\n\x13immediate_caller_id\x18\x02 \x01(\x0b\x32\x15.query.VTGateCallerID\x12\x1d\n\x06target\x18\x03 \x01(\x0b\x32\r.query.Target\x12\x10\n\x08position\x18\x04 \x01(\t\x12\x11\n\ttimestamp\x18\x05 \x01(\x03\"9\n\x14UpdateStreamResponse\x12!\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x12.query.StreamEvent\"\x86\x01\n\x13TransactionMetadata\x12\x0c\n\x04\x64tid\x18\x01 \x01(\t\x12&\n\x05state\x18\x02 \x01(\x0e\x32\x17.query.TransactionState\x12\x14\n\x0ctime_created\x18\x03 \x01(\x03\x12#\n\x0cparticipants\x18\x04 \x03(\x0b\x32\r.query.Target*\x92\x03\n\tMySqlFlag\x12\t\n\x05\x45MPTY\x10\x00\x12\x11\n\rNOT_NULL_FLAG\x10\x01\x12\x10\n\x0cPRI_KEY_FLAG\x10\x02\x12\x13\n\x0fUNIQUE_KEY_FLAG\x10\x04\x12\x15\n\x11MULTIPLE_KEY_FLAG\x10\x08\x12\r\n\tBLOB_FLAG\x10\x10\x12\x11\n\rUNSIGNED_FLAG\x10 \x12\x11\n\rZEROFILL_FLAG\x10@\x12\x10\n\x0b\x42INARY_FLAG\x10\x80\x01\x12\x0e\n\tENUM_FLAG\x10\x80\x02\x12\x18\n\x13\x41UTO_INCREMENT_FLAG\x10\x80\x04\x12\x13\n\x0eTIMESTAMP_FLAG\x10\x80\x08\x12\r\n\x08SET_FLAG\x10\x80\x10\x12\x1a\n\x15NO_DEFAULT_VALUE_FLAG\x10\x80 \x12\x17\n\x12ON_UPDATE_NOW_FLAG\x10\x80@\x12\x0e\n\x08NUM_FLAG\x10\x80\x80\x02\x12\x13\n\rPART_KEY_FLAG\x10\x80\x80\x01\x12\x10\n\nGROUP_FLAG\x10\x80\x80\x02\x12\x11\n\x0bUNIQUE_FLAG\x10\x80\x80\x04\x12\x11\n\x0b\x42INCMP_FLAG\x10\x80\x80\x08\x1a\x02\x10\x01*k\n\x04\x46lag\x12\x08\n\x04NONE\x10\x00\x12\x0f\n\nISINTEGRAL\x10\x80\x02\x12\x0f\n\nISUNSIGNED\x10\x80\x04\x12\x0c\n\x07ISFLOAT\x10\x80\x08\x12\r\n\x08ISQUOTED\x10\x80\x10\x12\x0b\n\x06ISTEXT\x10\x80 \x12\r\n\x08ISBINARY\x10\x80@*\x99\x03\n\x04Type\x12\r\n\tNULL_TYPE\x10\x00\x12\t\n\x04INT8\x10\x81\x02\x12\n\n\x05UINT8\x10\x82\x06\x12\n\n\x05INT16\x10\x83\x02\x12\x0b\n\x06UINT16\x10\x84\x06\x12\n\n\x05INT24\x10\x85\x02\x12\x0b\n\x06UINT24\x10\x86\x06\x12\n\n\x05INT32\x10\x87\x02\x12\x0b\n\x06UINT32\x10\x88\x06\x12\n\n\x05INT64\x10\x89\x02\x12\x0b\n\x06UINT64\x10\x8a\x06\x12\x0c\n\x07\x46LOAT32\x10\x8b\x08\x12\x0c\n\x07\x46LOAT64\x10\x8c\x08\x12\x0e\n\tTIMESTAMP\x10\x8d\x10\x12\t\n\x04\x44\x41TE\x10\x8e\x10\x12\t\n\x04TIME\x10\x8f\x10\x12\r\n\x08\x44\x41TETIME\x10\x90\x10\x12\t\n\x04YEAR\x10\x91\x06\x12\x0b\n\x07\x44\x45\x43IMAL\x10\x12\x12\t\n\x04TEXT\x10\x93\x30\x12\t\n\x04\x42LOB\x10\x94P\x12\x0c\n\x07VARCHAR\x10\x95\x30\x12\x0e\n\tVARBINARY\x10\x96P\x12\t\n\x04\x43HAR\x10\x97\x30\x12\x0b\n\x06\x42INARY\x10\x98P\x12\x08\n\x03\x42IT\x10\x99\x10\x12\t\n\x04\x45NUM\x10\x9a\x10\x12\x08\n\x03SET\x10\x9b\x10\x12\t\n\x05TUPLE\x10\x1c\x12\r\n\x08GEOMETRY\x10\x9d\x10\x12\t\n\x04JSON\x10\x9e\x10\x12\x0e\n\nEXPRESSION\x10\x1f*F\n\x10TransactionState\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0b\n\x07PREPARE\x10\x01\x12\n\n\x06\x43OMMIT\x10\x02\x12\x0c\n\x08ROLLBACK\x10\x03\x42\x11\n\x0fio.vitess.protob\x06proto3') , dependencies=[topodata__pb2.DESCRIPTOR,vtrpc__pb2.DESCRIPTOR,]) _sym_db.RegisterFileDescriptor(DESCRIPTOR) @@ -116,8 +116,8 @@ ], containing_type=None, options=_descriptor._ParseOptions(descriptor_pb2.EnumOptions(), _b('\020\001')), - serialized_start=7785, - serialized_end=8187, + serialized_start=7816, + serialized_end=8218, ) _sym_db.RegisterEnumDescriptor(_MYSQLFLAG) @@ -159,8 +159,8 @@ ], containing_type=None, options=None, - serialized_start=8189, - serialized_end=8296, + serialized_start=8220, + serialized_end=8327, ) _sym_db.RegisterEnumDescriptor(_FLAG) @@ -302,8 +302,8 @@ ], containing_type=None, options=None, - serialized_start=8299, - serialized_end=8708, + serialized_start=8330, + serialized_end=8739, ) _sym_db.RegisterEnumDescriptor(_TYPE) @@ -333,8 +333,8 @@ ], containing_type=None, options=None, - serialized_start=8710, - serialized_end=8780, + serialized_start=8741, + serialized_end=8811, ) _sym_db.RegisterEnumDescriptor(_TRANSACTIONSTATE) @@ -425,8 +425,8 @@ ], containing_type=None, options=None, - serialized_start=896, - serialized_end=955, + serialized_start=927, + serialized_end=986, ) _sym_db.RegisterEnumDescriptor(_EXECUTEOPTIONS_INCLUDEDFIELDS) @@ -455,8 +455,8 @@ ], containing_type=None, options=None, - serialized_start=957, - serialized_end=1013, + serialized_start=988, + serialized_end=1044, ) _sym_db.RegisterEnumDescriptor(_EXECUTEOPTIONS_WORKLOAD) @@ -489,8 +489,8 @@ ], containing_type=None, options=None, - serialized_start=1015, - serialized_end=1131, + serialized_start=1046, + serialized_end=1162, ) _sym_db.RegisterEnumDescriptor(_EXECUTEOPTIONS_TRANSACTIONISOLATION) @@ -515,8 +515,8 @@ ], containing_type=None, options=None, - serialized_start=1889, - serialized_end=1928, + serialized_start=1920, + serialized_end=1959, ) _sym_db.RegisterEnumDescriptor(_STREAMEVENT_STATEMENT_CATEGORY) @@ -537,8 +537,8 @@ ], containing_type=None, options=None, - serialized_start=6807, - serialized_end=6851, + serialized_start=6838, + serialized_end=6882, ) _sym_db.RegisterEnumDescriptor(_SPLITQUERYREQUEST_ALGORITHM) @@ -885,6 +885,13 @@ message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='skip_query_plan_cache', full_name='query.ExecuteOptions.skip_query_plan_cache', index=7, + number=10, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -901,7 +908,7 @@ oneofs=[ ], serialized_start=560, - serialized_end=1137, + serialized_end=1168, ) @@ -994,8 +1001,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1140, - serialized_end=1331, + serialized_start=1171, + serialized_end=1362, ) @@ -1032,8 +1039,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1333, - serialized_end=1371, + serialized_start=1364, + serialized_end=1402, ) @@ -1070,8 +1077,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1373, - serialized_end=1444, + serialized_start=1404, + serialized_end=1475, ) @@ -1129,8 +1136,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1447, - serialized_end=1595, + serialized_start=1478, + serialized_end=1626, ) @@ -1189,8 +1196,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1704, - serialized_end=1928, + serialized_start=1735, + serialized_end=1959, ) _STREAMEVENT = _descriptor.Descriptor( @@ -1226,8 +1233,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1598, - serialized_end=1928, + serialized_start=1629, + serialized_end=1959, ) @@ -1292,8 +1299,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1931, - serialized_end=2174, + serialized_start=1962, + serialized_end=2205, ) @@ -1323,8 +1330,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2176, - serialized_end=2229, + serialized_start=2207, + serialized_end=2260, ) @@ -1361,8 +1368,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2231, - serialized_end=2316, + serialized_start=2262, + serialized_end=2347, ) @@ -1434,8 +1441,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2319, - serialized_end=2593, + serialized_start=2350, + serialized_end=2624, ) @@ -1465,8 +1472,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2595, - serialized_end=2654, + serialized_start=2626, + serialized_end=2685, ) @@ -1524,8 +1531,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2657, - serialized_end=2882, + serialized_start=2688, + serialized_end=2913, ) @@ -1555,8 +1562,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2884, - serialized_end=2943, + serialized_start=2915, + serialized_end=2974, ) @@ -1607,8 +1614,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2946, - serialized_end=3129, + serialized_start=2977, + serialized_end=3160, ) @@ -1638,8 +1645,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3131, - serialized_end=3170, + serialized_start=3162, + serialized_end=3201, ) @@ -1690,8 +1697,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3173, - serialized_end=3341, + serialized_start=3204, + serialized_end=3372, ) @@ -1714,8 +1721,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3343, - serialized_end=3359, + serialized_start=3374, + serialized_end=3390, ) @@ -1766,8 +1773,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3362, - serialized_end=3532, + serialized_start=3393, + serialized_end=3563, ) @@ -1790,8 +1797,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3534, - serialized_end=3552, + serialized_start=3565, + serialized_end=3583, ) @@ -1849,8 +1856,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3555, - serialized_end=3738, + serialized_start=3586, + serialized_end=3769, ) @@ -1873,8 +1880,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3740, - serialized_end=3757, + serialized_start=3771, + serialized_end=3788, ) @@ -1925,8 +1932,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3760, - serialized_end=3926, + serialized_start=3791, + serialized_end=3957, ) @@ -1949,8 +1956,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3928, - serialized_end=3952, + serialized_start=3959, + serialized_end=3983, ) @@ -2008,8 +2015,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3955, - serialized_end=4147, + serialized_start=3986, + serialized_end=4178, ) @@ -2032,8 +2039,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4149, - serialized_end=4175, + serialized_start=4180, + serialized_end=4206, ) @@ -2091,8 +2098,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4178, - serialized_end=4384, + serialized_start=4209, + serialized_end=4415, ) @@ -2115,8 +2122,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4386, - serialized_end=4413, + serialized_start=4417, + serialized_end=4444, ) @@ -2174,8 +2181,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4416, - serialized_end=4603, + serialized_start=4447, + serialized_end=4634, ) @@ -2198,8 +2205,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4605, - serialized_end=4626, + serialized_start=4636, + serialized_end=4657, ) @@ -2257,8 +2264,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4629, - serialized_end=4816, + serialized_start=4660, + serialized_end=4847, ) @@ -2281,8 +2288,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4818, - serialized_end=4839, + serialized_start=4849, + serialized_end=4870, ) @@ -2333,8 +2340,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4842, - serialized_end=5013, + serialized_start=4873, + serialized_end=5044, ) @@ -2357,8 +2364,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5015, - serialized_end=5044, + serialized_start=5046, + serialized_end=5075, ) @@ -2409,8 +2416,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5047, - serialized_end=5214, + serialized_start=5078, + serialized_end=5245, ) @@ -2440,8 +2447,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5216, - serialized_end=5287, + serialized_start=5247, + serialized_end=5318, ) @@ -2499,8 +2506,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5290, - serialized_end=5514, + serialized_start=5321, + serialized_end=5545, ) @@ -2544,8 +2551,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5516, - serialized_end=5630, + serialized_start=5547, + serialized_end=5661, ) @@ -2610,8 +2617,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5633, - serialized_end=5888, + serialized_start=5664, + serialized_end=5919, ) @@ -2655,8 +2662,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5890, - serialized_end=6010, + serialized_start=5921, + serialized_end=6041, ) @@ -2707,8 +2714,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6013, - serialized_end=6178, + serialized_start=6044, + serialized_end=6209, ) @@ -2738,8 +2745,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6180, - serialized_end=6239, + serialized_start=6211, + serialized_end=6270, ) @@ -2797,8 +2804,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6242, - serialized_end=6431, + serialized_start=6273, + serialized_end=6462, ) @@ -2828,8 +2835,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6433, - serialized_end=6489, + serialized_start=6464, + serialized_end=6520, ) @@ -2909,8 +2916,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6492, - serialized_end=6851, + serialized_start=6523, + serialized_end=6882, ) @@ -2947,8 +2954,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6853, - serialized_end=6918, + serialized_start=6884, + serialized_end=6949, ) @@ -2978,8 +2985,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6920, - serialized_end=6976, + serialized_start=6951, + serialized_end=7007, ) @@ -3002,8 +3009,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6978, - serialized_end=6999, + serialized_start=7009, + serialized_end=7030, ) @@ -3068,8 +3075,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=7002, - serialized_end=7184, + serialized_start=7033, + serialized_end=7215, ) @@ -3127,8 +3134,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=7187, - serialized_end=7396, + serialized_start=7218, + serialized_end=7427, ) @@ -3186,8 +3193,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=7399, - serialized_end=7586, + serialized_start=7430, + serialized_end=7617, ) @@ -3217,8 +3224,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=7588, - serialized_end=7645, + serialized_start=7619, + serialized_end=7676, ) @@ -3269,8 +3276,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=7648, - serialized_end=7782, + serialized_start=7679, + serialized_end=7813, ) _TARGET.fields_by_name['tablet_type'].enum_type = topodata__pb2._TABLETTYPE