From 22a3b4810b8bf543767f522531a4f5ba34cf9b80 Mon Sep 17 00:00:00 2001 From: Rebecca Taft Date: Sun, 27 Jan 2019 14:06:47 -0500 Subject: [PATCH] sql,stats: use the jobs framework for CREATE STATISTICS Prior to this commit, CREATE STATISTICS was a regular SQL statement and followed the standard logic of AST -> planNode -> DistSQL physical plan -> execution. This commit changes CREATE STATISTICS to use the jobs framework, and as a result the createStats planNode has been removed. There are several advantages to using the jobs framework: - Now CREATE STATISTICS jobs can easily be cancelled, paused and resumed from the Admin UI. - Nodes can adopt the job if the original gateway node fails. - We will be able to use the JobID to lock creation of automatic statistics, so that only one automatic statistics job can run at a time. Job adoption will ensure that a dead node never prevents progress by holding a lock on stats creation (implementation of locking will be saved for the next PR). Release note (sql change): CREATE STATISTICS now runs as a job instead of as a regular SQL statement. --- pkg/jobs/jobspb/jobs.pb.go | 1258 ++++++++++++++++++++---- pkg/jobs/jobspb/jobs.proto | 23 + pkg/jobs/jobspb/wrap.go | 31 + pkg/sql/create_stats.go | 259 +++-- pkg/sql/distsql_physical_planner.go | 5 - pkg/sql/distsql_plan_stats.go | 87 +- pkg/sql/distsql_running.go | 37 - pkg/sql/distsqlpb/processors.pb.go | 719 +++++++------- pkg/sql/distsqlpb/processors.proto | 3 + pkg/sql/distsqlrun/processors.go | 9 +- pkg/sql/distsqlrun/sampler.go | 42 +- pkg/sql/expand_plan.go | 2 - pkg/sql/opt_filters.go | 1 - pkg/sql/opt_limits.go | 1 - pkg/sql/opt_needed.go | 1 - pkg/sql/plan.go | 5 - pkg/sql/plan_physical_props.go | 1 - pkg/sql/stats/automatic_stats.go | 6 - pkg/sql/stats/create_stats_job_test.go | 324 ++++++ pkg/sql/walk.go | 1 - 20 files changed, 2138 insertions(+), 677 deletions(-) create mode 100644 pkg/sql/stats/create_stats_job_test.go diff --git a/pkg/jobs/jobspb/jobs.pb.go b/pkg/jobs/jobspb/jobs.pb.go index e8e03b72bfe9..08309fe1d8d7 100644 --- a/pkg/jobs/jobspb/jobs.pb.go +++ b/pkg/jobs/jobspb/jobs.pb.go @@ -12,6 +12,7 @@ import hlc "github.com/cockroachdb/cockroach/pkg/util/hlc" import github_com_cockroachdb_cockroach_pkg_roachpb "github.com/cockroachdb/cockroach/pkg/roachpb" import github_com_cockroachdb_cockroach_pkg_sql_sqlbase "github.com/cockroachdb/cockroach/pkg/sql/sqlbase" +import github_com_cockroachdb_cockroach_pkg_sql_sem_tree "github.com/cockroachdb/cockroach/pkg/sql/sem/tree" import github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" import encoding_binary "encoding/binary" @@ -55,7 +56,7 @@ func (x Status) String() string { return proto.EnumName(Status_name, int32(x)) } func (Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{0} + return fileDescriptor_jobs_8d45e63df6a07cbb, []int{0} } type Type int32 @@ -67,6 +68,7 @@ const ( TypeSchemaChange Type = 3 TypeImport Type = 4 TypeChangefeed Type = 5 + TypeCreateStats Type = 6 ) var Type_name = map[int32]string{ @@ -76,6 +78,7 @@ var Type_name = map[int32]string{ 3: "SCHEMA_CHANGE", 4: "IMPORT", 5: "CHANGEFEED", + 6: "CREATE_STATS", } var Type_value = map[string]int32{ "UNSPECIFIED": 0, @@ -84,10 +87,11 @@ var Type_value = map[string]int32{ "SCHEMA_CHANGE": 3, "IMPORT": 4, "CHANGEFEED": 5, + "CREATE_STATS": 6, } func (Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{1} + return fileDescriptor_jobs_8d45e63df6a07cbb, []int{1} } type Lease struct { @@ -103,7 +107,7 @@ func (m *Lease) Reset() { *m = Lease{} } func (m *Lease) String() string { return proto.CompactTextString(m) } func (*Lease) ProtoMessage() {} func (*Lease) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{0} + return fileDescriptor_jobs_8d45e63df6a07cbb, []int{0} } func (m *Lease) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -141,7 +145,7 @@ func (m *BackupDetails) Reset() { *m = BackupDetails{} } func (m *BackupDetails) String() string { return proto.CompactTextString(m) } func (*BackupDetails) ProtoMessage() {} func (*BackupDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{1} + return fileDescriptor_jobs_8d45e63df6a07cbb, []int{1} } func (m *BackupDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -175,7 +179,7 @@ func (m *BackupProgress) Reset() { *m = BackupProgress{} } func (m *BackupProgress) String() string { return proto.CompactTextString(m) } func (*BackupProgress) ProtoMessage() {} func (*BackupProgress) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{2} + return fileDescriptor_jobs_8d45e63df6a07cbb, []int{2} } func (m *BackupProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -214,7 +218,7 @@ func (m *RestoreDetails) Reset() { *m = RestoreDetails{} } func (m *RestoreDetails) String() string { return proto.CompactTextString(m) } func (*RestoreDetails) ProtoMessage() {} func (*RestoreDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{3} + return fileDescriptor_jobs_8d45e63df6a07cbb, []int{3} } func (m *RestoreDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -250,7 +254,7 @@ func (m *RestoreDetails_TableRewrite) Reset() { *m = RestoreDetails_Tabl func (m *RestoreDetails_TableRewrite) String() string { return proto.CompactTextString(m) } func (*RestoreDetails_TableRewrite) ProtoMessage() {} func (*RestoreDetails_TableRewrite) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{3, 0} + return fileDescriptor_jobs_8d45e63df6a07cbb, []int{3, 0} } func (m *RestoreDetails_TableRewrite) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -285,7 +289,7 @@ func (m *RestoreProgress) Reset() { *m = RestoreProgress{} } func (m *RestoreProgress) String() string { return proto.CompactTextString(m) } func (*RestoreProgress) ProtoMessage() {} func (*RestoreProgress) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{4} + return fileDescriptor_jobs_8d45e63df6a07cbb, []int{4} } func (m *RestoreProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -333,7 +337,7 @@ func (m *ImportDetails) Reset() { *m = ImportDetails{} } func (m *ImportDetails) String() string { return proto.CompactTextString(m) } func (*ImportDetails) ProtoMessage() {} func (*ImportDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{5} + return fileDescriptor_jobs_8d45e63df6a07cbb, []int{5} } func (m *ImportDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -370,7 +374,7 @@ func (m *ImportDetails_Table) Reset() { *m = ImportDetails_Table{} } func (m *ImportDetails_Table) String() string { return proto.CompactTextString(m) } func (*ImportDetails_Table) ProtoMessage() {} func (*ImportDetails_Table) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{5, 0} + return fileDescriptor_jobs_8d45e63df6a07cbb, []int{5, 0} } func (m *ImportDetails_Table) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -411,7 +415,7 @@ func (m *ImportProgress) Reset() { *m = ImportProgress{} } func (m *ImportProgress) String() string { return proto.CompactTextString(m) } func (*ImportProgress) ProtoMessage() {} func (*ImportProgress) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{6} + return fileDescriptor_jobs_8d45e63df6a07cbb, []int{6} } func (m *ImportProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -446,7 +450,7 @@ func (m *ResumeSpanList) Reset() { *m = ResumeSpanList{} } func (m *ResumeSpanList) String() string { return proto.CompactTextString(m) } func (*ResumeSpanList) ProtoMessage() {} func (*ResumeSpanList) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{7} + return fileDescriptor_jobs_8d45e63df6a07cbb, []int{7} } func (m *ResumeSpanList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -483,7 +487,7 @@ func (m *DroppedTableDetails) Reset() { *m = DroppedTableDetails{} } func (m *DroppedTableDetails) String() string { return proto.CompactTextString(m) } func (*DroppedTableDetails) ProtoMessage() {} func (*DroppedTableDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{8} + return fileDescriptor_jobs_8d45e63df6a07cbb, []int{8} } func (m *DroppedTableDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -527,7 +531,7 @@ func (m *SchemaChangeDetails) Reset() { *m = SchemaChangeDetails{} } func (m *SchemaChangeDetails) String() string { return proto.CompactTextString(m) } func (*SchemaChangeDetails) ProtoMessage() {} func (*SchemaChangeDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{9} + return fileDescriptor_jobs_8d45e63df6a07cbb, []int{9} } func (m *SchemaChangeDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -561,7 +565,7 @@ func (m *SchemaChangeProgress) Reset() { *m = SchemaChangeProgress{} } func (m *SchemaChangeProgress) String() string { return proto.CompactTextString(m) } func (*SchemaChangeProgress) ProtoMessage() {} func (*SchemaChangeProgress) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{10} + return fileDescriptor_jobs_8d45e63df6a07cbb, []int{10} } func (m *SchemaChangeProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -596,7 +600,7 @@ func (m *ChangefeedTarget) Reset() { *m = ChangefeedTarget{} } func (m *ChangefeedTarget) String() string { return proto.CompactTextString(m) } func (*ChangefeedTarget) ProtoMessage() {} func (*ChangefeedTarget) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{11} + return fileDescriptor_jobs_8d45e63df6a07cbb, []int{11} } func (m *ChangefeedTarget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -651,7 +655,7 @@ func (m *ChangefeedDetails) Reset() { *m = ChangefeedDetails{} } func (m *ChangefeedDetails) String() string { return proto.CompactTextString(m) } func (*ChangefeedDetails) ProtoMessage() {} func (*ChangefeedDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{12} + return fileDescriptor_jobs_8d45e63df6a07cbb, []int{12} } func (m *ChangefeedDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -687,7 +691,7 @@ func (m *ResolvedSpan) Reset() { *m = ResolvedSpan{} } func (m *ResolvedSpan) String() string { return proto.CompactTextString(m) } func (*ResolvedSpan) ProtoMessage() {} func (*ResolvedSpan) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{13} + return fileDescriptor_jobs_8d45e63df6a07cbb, []int{13} } func (m *ResolvedSpan) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -722,7 +726,7 @@ func (m *ChangefeedProgress) Reset() { *m = ChangefeedProgress{} } func (m *ChangefeedProgress) String() string { return proto.CompactTextString(m) } func (*ChangefeedProgress) ProtoMessage() {} func (*ChangefeedProgress) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{14} + return fileDescriptor_jobs_8d45e63df6a07cbb, []int{14} } func (m *ChangefeedProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -747,6 +751,114 @@ func (m *ChangefeedProgress) XXX_DiscardUnknown() { var xxx_messageInfo_ChangefeedProgress proto.InternalMessageInfo +type CreateStatsDetails struct { + Name github_com_cockroachdb_cockroach_pkg_sql_sem_tree.Name `protobuf:"bytes,1,opt,name=name,proto3,casttype=github.com/cockroachdb/cockroach/pkg/sql/sem/tree.Name" json:"name,omitempty"` + Table sqlbase.TableDescriptor `protobuf:"bytes,2,opt,name=table,proto3" json:"table"` + Columns []CreateStatsDetails_Columns `protobuf:"bytes,3,rep,name=columns,proto3" json:"columns"` + Statement string `protobuf:"bytes,4,opt,name=Statement,proto3" json:"Statement,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CreateStatsDetails) Reset() { *m = CreateStatsDetails{} } +func (m *CreateStatsDetails) String() string { return proto.CompactTextString(m) } +func (*CreateStatsDetails) ProtoMessage() {} +func (*CreateStatsDetails) Descriptor() ([]byte, []int) { + return fileDescriptor_jobs_8d45e63df6a07cbb, []int{15} +} +func (m *CreateStatsDetails) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CreateStatsDetails) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (dst *CreateStatsDetails) XXX_Merge(src proto.Message) { + xxx_messageInfo_CreateStatsDetails.Merge(dst, src) +} +func (m *CreateStatsDetails) XXX_Size() int { + return m.Size() +} +func (m *CreateStatsDetails) XXX_DiscardUnknown() { + xxx_messageInfo_CreateStatsDetails.DiscardUnknown(m) +} + +var xxx_messageInfo_CreateStatsDetails proto.InternalMessageInfo + +type CreateStatsDetails_Columns struct { + IDs []github_com_cockroachdb_cockroach_pkg_sql_sqlbase.ColumnID `protobuf:"varint,1,rep,packed,name=ids,proto3,casttype=github.com/cockroachdb/cockroach/pkg/sql/sqlbase.ColumnID" json:"ids,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CreateStatsDetails_Columns) Reset() { *m = CreateStatsDetails_Columns{} } +func (m *CreateStatsDetails_Columns) String() string { return proto.CompactTextString(m) } +func (*CreateStatsDetails_Columns) ProtoMessage() {} +func (*CreateStatsDetails_Columns) Descriptor() ([]byte, []int) { + return fileDescriptor_jobs_8d45e63df6a07cbb, []int{15, 0} +} +func (m *CreateStatsDetails_Columns) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CreateStatsDetails_Columns) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (dst *CreateStatsDetails_Columns) XXX_Merge(src proto.Message) { + xxx_messageInfo_CreateStatsDetails_Columns.Merge(dst, src) +} +func (m *CreateStatsDetails_Columns) XXX_Size() int { + return m.Size() +} +func (m *CreateStatsDetails_Columns) XXX_DiscardUnknown() { + xxx_messageInfo_CreateStatsDetails_Columns.DiscardUnknown(m) +} + +var xxx_messageInfo_CreateStatsDetails_Columns proto.InternalMessageInfo + +type CreateStatsProgress struct { + SamplerProgress []float32 `protobuf:"fixed32,1,rep,packed,name=sampler_progress,json=samplerProgress,proto3" json:"sampler_progress,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CreateStatsProgress) Reset() { *m = CreateStatsProgress{} } +func (m *CreateStatsProgress) String() string { return proto.CompactTextString(m) } +func (*CreateStatsProgress) ProtoMessage() {} +func (*CreateStatsProgress) Descriptor() ([]byte, []int) { + return fileDescriptor_jobs_8d45e63df6a07cbb, []int{16} +} +func (m *CreateStatsProgress) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CreateStatsProgress) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (dst *CreateStatsProgress) XXX_Merge(src proto.Message) { + xxx_messageInfo_CreateStatsProgress.Merge(dst, src) +} +func (m *CreateStatsProgress) XXX_Size() int { + return m.Size() +} +func (m *CreateStatsProgress) XXX_DiscardUnknown() { + xxx_messageInfo_CreateStatsProgress.DiscardUnknown(m) +} + +var xxx_messageInfo_CreateStatsProgress proto.InternalMessageInfo + type Payload struct { Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` Username string `protobuf:"bytes,2,opt,name=username,proto3" json:"username,omitempty"` @@ -765,6 +877,7 @@ type Payload struct { // *Payload_SchemaChange // *Payload_Import // *Payload_Changefeed + // *Payload_CreateStats Details isPayload_Details `protobuf_oneof:"details"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_sizecache int32 `json:"-"` @@ -774,7 +887,7 @@ func (m *Payload) Reset() { *m = Payload{} } func (m *Payload) String() string { return proto.CompactTextString(m) } func (*Payload) ProtoMessage() {} func (*Payload) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{15} + return fileDescriptor_jobs_8d45e63df6a07cbb, []int{17} } func (m *Payload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -820,12 +933,16 @@ type Payload_Import struct { type Payload_Changefeed struct { Changefeed *ChangefeedDetails `protobuf:"bytes,14,opt,name=changefeed,proto3,oneof"` } +type Payload_CreateStats struct { + CreateStats *CreateStatsDetails `protobuf:"bytes,15,opt,name=createStats,proto3,oneof"` +} func (*Payload_Backup) isPayload_Details() {} func (*Payload_Restore) isPayload_Details() {} func (*Payload_SchemaChange) isPayload_Details() {} func (*Payload_Import) isPayload_Details() {} func (*Payload_Changefeed) isPayload_Details() {} +func (*Payload_CreateStats) isPayload_Details() {} func (m *Payload) GetDetails() isPayload_Details { if m != nil { @@ -869,6 +986,13 @@ func (m *Payload) GetChangefeed() *ChangefeedDetails { return nil } +func (m *Payload) GetCreateStats() *CreateStatsDetails { + if x, ok := m.GetDetails().(*Payload_CreateStats); ok { + return x.CreateStats + } + return nil +} + // XXX_OneofFuncs is for the internal use of the proto package. func (*Payload) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { return _Payload_OneofMarshaler, _Payload_OneofUnmarshaler, _Payload_OneofSizer, []interface{}{ @@ -877,6 +1001,7 @@ func (*Payload) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error (*Payload_SchemaChange)(nil), (*Payload_Import)(nil), (*Payload_Changefeed)(nil), + (*Payload_CreateStats)(nil), } } @@ -909,6 +1034,11 @@ func _Payload_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { if err := b.EncodeMessage(x.Changefeed); err != nil { return err } + case *Payload_CreateStats: + _ = b.EncodeVarint(15<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.CreateStats); err != nil { + return err + } case nil: default: return fmt.Errorf("Payload.Details has unexpected type %T", x) @@ -959,6 +1089,14 @@ func _Payload_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer err := b.DecodeMessage(msg) m.Details = &Payload_Changefeed{msg} return true, err + case 15: // details.createStats + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(CreateStatsDetails) + err := b.DecodeMessage(msg) + m.Details = &Payload_CreateStats{msg} + return true, err default: return false, nil } @@ -993,6 +1131,11 @@ func _Payload_OneofSizer(msg proto.Message) (n int) { n += 1 // tag and wire n += proto.SizeVarint(uint64(s)) n += s + case *Payload_CreateStats: + s := proto.Size(x.CreateStats) + n += 1 // tag and wire + n += proto.SizeVarint(uint64(s)) + n += s case nil: default: panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) @@ -1013,6 +1156,7 @@ type Progress struct { // *Progress_SchemaChange // *Progress_Import // *Progress_Changefeed + // *Progress_CreateStats Details isProgress_Details `protobuf_oneof:"details"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1022,7 +1166,7 @@ func (m *Progress) Reset() { *m = Progress{} } func (m *Progress) String() string { return proto.CompactTextString(m) } func (*Progress) ProtoMessage() {} func (*Progress) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{16} + return fileDescriptor_jobs_8d45e63df6a07cbb, []int{18} } func (m *Progress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1079,6 +1223,9 @@ type Progress_Import struct { type Progress_Changefeed struct { Changefeed *ChangefeedProgress `protobuf:"bytes,14,opt,name=changefeed,proto3,oneof"` } +type Progress_CreateStats struct { + CreateStats *CreateStatsProgress `protobuf:"bytes,15,opt,name=createStats,proto3,oneof"` +} func (*Progress_FractionCompleted) isProgress_Progress() {} func (*Progress_HighWater) isProgress_Progress() {} @@ -1087,6 +1234,7 @@ func (*Progress_Restore) isProgress_Details() {} func (*Progress_SchemaChange) isProgress_Details() {} func (*Progress_Import) isProgress_Details() {} func (*Progress_Changefeed) isProgress_Details() {} +func (*Progress_CreateStats) isProgress_Details() {} func (m *Progress) GetProgress() isProgress_Progress { if m != nil { @@ -1150,6 +1298,13 @@ func (m *Progress) GetChangefeed() *ChangefeedProgress { return nil } +func (m *Progress) GetCreateStats() *CreateStatsProgress { + if x, ok := m.GetDetails().(*Progress_CreateStats); ok { + return x.CreateStats + } + return nil +} + // XXX_OneofFuncs is for the internal use of the proto package. func (*Progress) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { return _Progress_OneofMarshaler, _Progress_OneofUnmarshaler, _Progress_OneofSizer, []interface{}{ @@ -1160,6 +1315,7 @@ func (*Progress) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) erro (*Progress_SchemaChange)(nil), (*Progress_Import)(nil), (*Progress_Changefeed)(nil), + (*Progress_CreateStats)(nil), } } @@ -1206,6 +1362,11 @@ func _Progress_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { if err := b.EncodeMessage(x.Changefeed); err != nil { return err } + case *Progress_CreateStats: + _ = b.EncodeVarint(15<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.CreateStats); err != nil { + return err + } case nil: default: return fmt.Errorf("Progress.Details has unexpected type %T", x) @@ -1271,6 +1432,14 @@ func _Progress_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffe err := b.DecodeMessage(msg) m.Details = &Progress_Changefeed{msg} return true, err + case 15: // details.createStats + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(CreateStatsProgress) + err := b.DecodeMessage(msg) + m.Details = &Progress_CreateStats{msg} + return true, err default: return false, nil } @@ -1319,6 +1488,11 @@ func _Progress_OneofSizer(msg proto.Message) (n int) { n += 1 // tag and wire n += proto.SizeVarint(uint64(s)) n += s + case *Progress_CreateStats: + s := proto.Size(x.CreateStats) + n += 1 // tag and wire + n += proto.SizeVarint(uint64(s)) + n += s case nil: default: panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) @@ -1347,6 +1521,9 @@ func init() { proto.RegisterMapType((ChangefeedTargets)(nil), "cockroach.sql.jobs.jobspb.ChangefeedDetails.TargetsEntry") proto.RegisterType((*ResolvedSpan)(nil), "cockroach.sql.jobs.jobspb.ResolvedSpan") proto.RegisterType((*ChangefeedProgress)(nil), "cockroach.sql.jobs.jobspb.ChangefeedProgress") + proto.RegisterType((*CreateStatsDetails)(nil), "cockroach.sql.jobs.jobspb.CreateStatsDetails") + proto.RegisterType((*CreateStatsDetails_Columns)(nil), "cockroach.sql.jobs.jobspb.CreateStatsDetails.Columns") + proto.RegisterType((*CreateStatsProgress)(nil), "cockroach.sql.jobs.jobspb.CreateStatsProgress") proto.RegisterType((*Payload)(nil), "cockroach.sql.jobs.jobspb.Payload") proto.RegisterType((*Progress)(nil), "cockroach.sql.jobs.jobspb.Progress") proto.RegisterEnum("cockroach.sql.jobs.jobspb.Status", Status_name, Status_value) @@ -2115,6 +2292,119 @@ func (m *ChangefeedProgress) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *CreateStatsDetails) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CreateStatsDetails) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintJobs(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + } + dAtA[i] = 0x12 + i++ + i = encodeVarintJobs(dAtA, i, uint64(m.Table.Size())) + n14, err := m.Table.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n14 + if len(m.Columns) > 0 { + for _, msg := range m.Columns { + dAtA[i] = 0x1a + i++ + i = encodeVarintJobs(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.Statement) > 0 { + dAtA[i] = 0x22 + i++ + i = encodeVarintJobs(dAtA, i, uint64(len(m.Statement))) + i += copy(dAtA[i:], m.Statement) + } + return i, nil +} + +func (m *CreateStatsDetails_Columns) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CreateStatsDetails_Columns) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.IDs) > 0 { + dAtA16 := make([]byte, len(m.IDs)*10) + var j15 int + for _, num := range m.IDs { + for num >= 1<<7 { + dAtA16[j15] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j15++ + } + dAtA16[j15] = uint8(num) + j15++ + } + dAtA[i] = 0xa + i++ + i = encodeVarintJobs(dAtA, i, uint64(j15)) + i += copy(dAtA[i:], dAtA16[:j15]) + } + return i, nil +} + +func (m *CreateStatsProgress) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CreateStatsProgress) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.SamplerProgress) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintJobs(dAtA, i, uint64(len(m.SamplerProgress)*4)) + for _, num := range m.SamplerProgress { + f17 := math.Float32bits(float32(num)) + encoding_binary.LittleEndian.PutUint32(dAtA[i:], uint32(f17)) + i += 4 + } + } + return i, nil +} + func (m *Payload) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -2153,21 +2443,21 @@ func (m *Payload) MarshalTo(dAtA []byte) (int, error) { i = encodeVarintJobs(dAtA, i, uint64(m.FinishedMicros)) } if len(m.DescriptorIDs) > 0 { - dAtA15 := make([]byte, len(m.DescriptorIDs)*10) - var j14 int + dAtA19 := make([]byte, len(m.DescriptorIDs)*10) + var j18 int for _, num := range m.DescriptorIDs { for num >= 1<<7 { - dAtA15[j14] = uint8(uint64(num)&0x7f | 0x80) + dAtA19[j18] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j14++ + j18++ } - dAtA15[j14] = uint8(num) - j14++ + dAtA19[j18] = uint8(num) + j18++ } dAtA[i] = 0x32 i++ - i = encodeVarintJobs(dAtA, i, uint64(j14)) - i += copy(dAtA[i:], dAtA15[:j14]) + i = encodeVarintJobs(dAtA, i, uint64(j18)) + i += copy(dAtA[i:], dAtA19[:j18]) } if len(m.Error) > 0 { dAtA[i] = 0x42 @@ -2179,18 +2469,18 @@ func (m *Payload) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x4a i++ i = encodeVarintJobs(dAtA, i, uint64(m.Lease.Size())) - n16, err := m.Lease.MarshalTo(dAtA[i:]) + n20, err := m.Lease.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n16 + i += n20 } if m.Details != nil { - nn17, err := m.Details.MarshalTo(dAtA[i:]) + nn21, err := m.Details.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += nn17 + i += nn21 } return i, nil } @@ -2201,11 +2491,11 @@ func (m *Payload_Backup) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x52 i++ i = encodeVarintJobs(dAtA, i, uint64(m.Backup.Size())) - n18, err := m.Backup.MarshalTo(dAtA[i:]) + n22, err := m.Backup.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n18 + i += n22 } return i, nil } @@ -2215,11 +2505,11 @@ func (m *Payload_Restore) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x5a i++ i = encodeVarintJobs(dAtA, i, uint64(m.Restore.Size())) - n19, err := m.Restore.MarshalTo(dAtA[i:]) + n23, err := m.Restore.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n19 + i += n23 } return i, nil } @@ -2229,11 +2519,11 @@ func (m *Payload_SchemaChange) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x62 i++ i = encodeVarintJobs(dAtA, i, uint64(m.SchemaChange.Size())) - n20, err := m.SchemaChange.MarshalTo(dAtA[i:]) + n24, err := m.SchemaChange.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n20 + i += n24 } return i, nil } @@ -2243,11 +2533,11 @@ func (m *Payload_Import) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x6a i++ i = encodeVarintJobs(dAtA, i, uint64(m.Import.Size())) - n21, err := m.Import.MarshalTo(dAtA[i:]) + n25, err := m.Import.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n21 + i += n25 } return i, nil } @@ -2257,11 +2547,25 @@ func (m *Payload_Changefeed) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x72 i++ i = encodeVarintJobs(dAtA, i, uint64(m.Changefeed.Size())) - n22, err := m.Changefeed.MarshalTo(dAtA[i:]) + n26, err := m.Changefeed.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n22 + i += n26 + } + return i, nil +} +func (m *Payload_CreateStats) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.CreateStats != nil { + dAtA[i] = 0x7a + i++ + i = encodeVarintJobs(dAtA, i, uint64(m.CreateStats.Size())) + n27, err := m.CreateStats.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n27 } return i, nil } @@ -2281,11 +2585,11 @@ func (m *Progress) MarshalTo(dAtA []byte) (int, error) { var l int _ = l if m.Progress != nil { - nn23, err := m.Progress.MarshalTo(dAtA[i:]) + nn28, err := m.Progress.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += nn23 + i += nn28 } if m.ModifiedMicros != 0 { dAtA[i] = 0x10 @@ -2299,11 +2603,11 @@ func (m *Progress) MarshalTo(dAtA []byte) (int, error) { i += copy(dAtA[i:], m.RunningStatus) } if m.Details != nil { - nn24, err := m.Details.MarshalTo(dAtA[i:]) + nn29, err := m.Details.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += nn24 + i += nn29 } return i, nil } @@ -2322,11 +2626,11 @@ func (m *Progress_HighWater) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintJobs(dAtA, i, uint64(m.HighWater.Size())) - n25, err := m.HighWater.MarshalTo(dAtA[i:]) + n30, err := m.HighWater.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n25 + i += n30 } return i, nil } @@ -2336,11 +2640,11 @@ func (m *Progress_Backup) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x52 i++ i = encodeVarintJobs(dAtA, i, uint64(m.Backup.Size())) - n26, err := m.Backup.MarshalTo(dAtA[i:]) + n31, err := m.Backup.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n26 + i += n31 } return i, nil } @@ -2350,11 +2654,11 @@ func (m *Progress_Restore) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x5a i++ i = encodeVarintJobs(dAtA, i, uint64(m.Restore.Size())) - n27, err := m.Restore.MarshalTo(dAtA[i:]) + n32, err := m.Restore.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n27 + i += n32 } return i, nil } @@ -2364,11 +2668,11 @@ func (m *Progress_SchemaChange) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x62 i++ i = encodeVarintJobs(dAtA, i, uint64(m.SchemaChange.Size())) - n28, err := m.SchemaChange.MarshalTo(dAtA[i:]) + n33, err := m.SchemaChange.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n28 + i += n33 } return i, nil } @@ -2378,11 +2682,11 @@ func (m *Progress_Import) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x6a i++ i = encodeVarintJobs(dAtA, i, uint64(m.Import.Size())) - n29, err := m.Import.MarshalTo(dAtA[i:]) + n34, err := m.Import.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n29 + i += n34 } return i, nil } @@ -2392,11 +2696,25 @@ func (m *Progress_Changefeed) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x72 i++ i = encodeVarintJobs(dAtA, i, uint64(m.Changefeed.Size())) - n30, err := m.Changefeed.MarshalTo(dAtA[i:]) + n35, err := m.Changefeed.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n30 + i += n35 + } + return i, nil +} +func (m *Progress_CreateStats) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.CreateStats != nil { + dAtA[i] = 0x7a + i++ + i = encodeVarintJobs(dAtA, i, uint64(m.CreateStats.Size())) + n36, err := m.CreateStats.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n36 } return i, nil } @@ -2754,6 +3072,59 @@ func (m *ChangefeedProgress) Size() (n int) { return n } +func (m *CreateStatsDetails) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovJobs(uint64(l)) + } + l = m.Table.Size() + n += 1 + l + sovJobs(uint64(l)) + if len(m.Columns) > 0 { + for _, e := range m.Columns { + l = e.Size() + n += 1 + l + sovJobs(uint64(l)) + } + } + l = len(m.Statement) + if l > 0 { + n += 1 + l + sovJobs(uint64(l)) + } + return n +} + +func (m *CreateStatsDetails_Columns) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.IDs) > 0 { + l = 0 + for _, e := range m.IDs { + l += sovJobs(uint64(e)) + } + n += 1 + sovJobs(uint64(l)) + l + } + return n +} + +func (m *CreateStatsProgress) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.SamplerProgress) > 0 { + n += 1 + sovJobs(uint64(len(m.SamplerProgress)*4)) + len(m.SamplerProgress)*4 + } + return n +} + func (m *Payload) Size() (n int) { if m == nil { return 0 @@ -2855,6 +3226,18 @@ func (m *Payload_Changefeed) Size() (n int) { } return n } +func (m *Payload_CreateStats) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.CreateStats != nil { + l = m.CreateStats.Size() + n += 1 + l + sovJobs(uint64(l)) + } + return n +} func (m *Progress) Size() (n int) { if m == nil { return 0 @@ -2958,6 +3341,18 @@ func (m *Progress_Changefeed) Size() (n int) { } return n } +func (m *Progress_CreateStats) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.CreateStats != nil { + l = m.CreateStats.Size() + n += 1 + l + sovJobs(uint64(l)) + } + return n +} func sovJobs(x uint64) (n int) { for { @@ -5377,6 +5772,399 @@ func (m *ChangefeedProgress) Unmarshal(dAtA []byte) error { } return nil } +func (m *CreateStatsDetails) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowJobs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CreateStatsDetails: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CreateStatsDetails: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowJobs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthJobs + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = github_com_cockroachdb_cockroach_pkg_sql_sem_tree.Name(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Table", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowJobs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthJobs + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Table.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Columns", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowJobs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthJobs + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Columns = append(m.Columns, CreateStatsDetails_Columns{}) + if err := m.Columns[len(m.Columns)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Statement", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowJobs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthJobs + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Statement = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipJobs(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthJobs + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CreateStatsDetails_Columns) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowJobs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Columns: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Columns: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType == 0 { + var v github_com_cockroachdb_cockroach_pkg_sql_sqlbase.ColumnID + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowJobs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (github_com_cockroachdb_cockroach_pkg_sql_sqlbase.ColumnID(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.IDs = append(m.IDs, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowJobs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthJobs + } + postIndex := iNdEx + packedLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.IDs) == 0 { + m.IDs = make([]github_com_cockroachdb_cockroach_pkg_sql_sqlbase.ColumnID, 0, elementCount) + } + for iNdEx < postIndex { + var v github_com_cockroachdb_cockroach_pkg_sql_sqlbase.ColumnID + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowJobs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (github_com_cockroachdb_cockroach_pkg_sql_sqlbase.ColumnID(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.IDs = append(m.IDs, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field IDs", wireType) + } + default: + iNdEx = preIndex + skippy, err := skipJobs(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthJobs + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CreateStatsProgress) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowJobs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CreateStatsProgress: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CreateStatsProgress: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType == 5 { + var v uint32 + if (iNdEx + 4) > l { + return io.ErrUnexpectedEOF + } + v = uint32(encoding_binary.LittleEndian.Uint32(dAtA[iNdEx:])) + iNdEx += 4 + v2 := float32(math.Float32frombits(v)) + m.SamplerProgress = append(m.SamplerProgress, v2) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowJobs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthJobs + } + postIndex := iNdEx + packedLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + elementCount = packedLen / 4 + if elementCount != 0 && len(m.SamplerProgress) == 0 { + m.SamplerProgress = make([]float32, 0, elementCount) + } + for iNdEx < postIndex { + var v uint32 + if (iNdEx + 4) > l { + return io.ErrUnexpectedEOF + } + v = uint32(encoding_binary.LittleEndian.Uint32(dAtA[iNdEx:])) + iNdEx += 4 + v2 := float32(math.Float32frombits(v)) + m.SamplerProgress = append(m.SamplerProgress, v2) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field SamplerProgress", wireType) + } + default: + iNdEx = preIndex + skippy, err := skipJobs(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthJobs + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Payload) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -5797,6 +6585,38 @@ func (m *Payload) Unmarshal(dAtA []byte) error { } m.Details = &Payload_Changefeed{v} iNdEx = postIndex + case 15: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CreateStats", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowJobs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthJobs + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &CreateStatsDetails{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Details = &Payload_CreateStats{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipJobs(dAtA[iNdEx:]) @@ -6098,6 +6918,38 @@ func (m *Progress) Unmarshal(dAtA []byte) error { } m.Details = &Progress_Changefeed{v} iNdEx = postIndex + case 15: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CreateStats", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowJobs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthJobs + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &CreateStatsProgress{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Details = &Progress_CreateStats{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipJobs(dAtA[iNdEx:]) @@ -6224,142 +7076,154 @@ var ( ErrIntOverflowJobs = fmt.Errorf("proto: integer overflow") ) -func init() { proto.RegisterFile("jobs/jobspb/jobs.proto", fileDescriptor_jobs_7f594aaf3aa20aa4) } - -var fileDescriptor_jobs_7f594aaf3aa20aa4 = []byte{ - // 2144 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0x5f, 0x6f, 0xe3, 0x58, - 0x15, 0x8f, 0x13, 0x27, 0x71, 0x4e, 0xfe, 0xd4, 0xbd, 0xad, 0x66, 0xbd, 0xd1, 0x6c, 0x13, 0x02, - 0xec, 0x74, 0x66, 0xd8, 0x04, 0xba, 0xd2, 0x0e, 0x3b, 0x82, 0x15, 0xcd, 0x9f, 0x4e, 0x9d, 0xe9, - 0x24, 0x95, 0x93, 0xee, 0xc2, 0x22, 0x64, 0x9c, 0xf8, 0xb6, 0x31, 0x4d, 0x62, 0x8f, 0xaf, 0x33, - 0xc3, 0xac, 0x90, 0x90, 0x10, 0x0f, 0x68, 0x9e, 0xf8, 0x00, 0x8c, 0x84, 0x04, 0x48, 0xbc, 0x20, - 0xde, 0xf8, 0x0c, 0xf3, 0x82, 0x58, 0xde, 0x58, 0x81, 0x02, 0x84, 0x17, 0x3e, 0xc3, 0x3e, 0xa1, - 0x7b, 0xaf, 0xed, 0x38, 0x9d, 0xd2, 0x76, 0x2a, 0xed, 0x4b, 0x6b, 0x9f, 0x7b, 0xce, 0xcf, 0xf7, - 0x9c, 0xf3, 0x3b, 0xe7, 0x9e, 0x1b, 0xb8, 0xf1, 0x23, 0x7b, 0x40, 0x6a, 0xf4, 0x8f, 0x33, 0x60, - 0xff, 0xaa, 0x8e, 0x6b, 0x7b, 0x36, 0x7a, 0x73, 0x68, 0x0f, 0x4f, 0x5d, 0xdb, 0x18, 0x8e, 0xaa, - 0xe4, 0xf1, 0xb8, 0xca, 0x56, 0xb8, 0x56, 0x71, 0xf3, 0xc4, 0x3e, 0xb1, 0x99, 0x56, 0x8d, 0x3e, - 0x71, 0x83, 0x22, 0x62, 0xca, 0xce, 0xa0, 0x66, 0x1a, 0x9e, 0xe1, 0xcb, 0x94, 0x40, 0x66, 0xd9, - 0xef, 0x1c, 0xdb, 0xee, 0xc4, 0xf0, 0x7c, 0xf8, 0xe2, 0x4d, 0xf2, 0x78, 0x5c, 0x23, 0x8f, 0xc7, - 0x03, 0x83, 0xe0, 0x1a, 0xf1, 0xdc, 0xd9, 0xd0, 0x9b, 0xb9, 0xd8, 0x0c, 0xec, 0x66, 0x9e, 0x35, - 0xae, 0x8d, 0xc6, 0xc3, 0x9a, 0x67, 0x4d, 0x30, 0xf1, 0x8c, 0x89, 0xc3, 0x57, 0x2a, 0x3f, 0x85, - 0xe4, 0x01, 0x36, 0x08, 0x46, 0x1f, 0x43, 0x7a, 0x6a, 0x9b, 0x58, 0xb7, 0x4c, 0x45, 0x28, 0x0b, - 0xdb, 0xf9, 0xfa, 0xee, 0x62, 0x5e, 0x4a, 0x75, 0x6c, 0x13, 0xab, 0xcd, 0xcf, 0xe7, 0xa5, 0x77, - 0x4f, 0x2c, 0x6f, 0x34, 0x1b, 0x54, 0x87, 0xf6, 0xa4, 0x16, 0x7a, 0x62, 0x0e, 0x96, 0xcf, 0x35, - 0xe7, 0xf4, 0xa4, 0xe6, 0x6f, 0xaf, 0xca, 0xcd, 0xb4, 0x14, 0x45, 0x54, 0x4d, 0xb4, 0x09, 0x49, - 0xec, 0xd8, 0xc3, 0x91, 0x12, 0x2f, 0x0b, 0xdb, 0x09, 0x8d, 0xbf, 0xdc, 0x17, 0xff, 0xfb, 0xeb, - 0x92, 0x50, 0xf9, 0xbb, 0x00, 0xf9, 0xba, 0x31, 0x3c, 0x9d, 0x39, 0x4d, 0xec, 0x19, 0xd6, 0x98, - 0xa0, 0x3a, 0x00, 0xf1, 0x0c, 0xd7, 0xd3, 0xe9, 0x5e, 0xd9, 0x66, 0xb2, 0x3b, 0x6f, 0x55, 0x97, - 0xe1, 0xa3, 0xbe, 0x54, 0x47, 0xe3, 0x61, 0xb5, 0x1f, 0xf8, 0x52, 0x17, 0x5f, 0xce, 0x4b, 0x31, - 0x2d, 0xc3, 0xcc, 0xa8, 0x14, 0x7d, 0x00, 0x12, 0x9e, 0x9a, 0x1c, 0x21, 0x7e, 0x75, 0x84, 0x34, - 0x9e, 0x9a, 0xcc, 0xfe, 0x4d, 0x48, 0xcc, 0x5c, 0x4b, 0x49, 0x94, 0x85, 0xed, 0x4c, 0x3d, 0xbd, - 0x98, 0x97, 0x12, 0x47, 0x9a, 0xaa, 0x51, 0x19, 0xba, 0x0b, 0xeb, 0x03, 0xb6, 0x5f, 0xdd, 0xc4, - 0x64, 0xe8, 0x5a, 0x8e, 0x67, 0xbb, 0x8a, 0x58, 0x16, 0xb6, 0x73, 0x9a, 0x3c, 0xf0, 0x1d, 0x09, - 0xe4, 0x15, 0x19, 0x0a, 0xdc, 0xb9, 0x43, 0xd7, 0x3e, 0x71, 0x31, 0x21, 0x95, 0xcf, 0x92, 0x50, - 0xd0, 0x30, 0xf1, 0x6c, 0x17, 0x07, 0x0e, 0xff, 0x4a, 0x80, 0x82, 0x67, 0x0c, 0xc6, 0x58, 0x77, - 0xf1, 0x53, 0xd7, 0xf2, 0x30, 0x51, 0xe2, 0xe5, 0xc4, 0x76, 0x76, 0xe7, 0x5b, 0xd5, 0xff, 0x4b, - 0x9a, 0xea, 0x2a, 0x46, 0xb5, 0x4f, 0xed, 0x35, 0xdf, 0xbc, 0x35, 0xf5, 0xdc, 0x67, 0xf5, 0x7b, - 0x3f, 0xfb, 0xe7, 0x15, 0xd3, 0x16, 0xe1, 0x4e, 0x55, 0x6d, 0x6a, 0x79, 0x2f, 0x0a, 0x86, 0x6e, - 0x82, 0x38, 0x73, 0x2d, 0xa2, 0x24, 0xca, 0x89, 0xed, 0x4c, 0x5d, 0x5a, 0xcc, 0x4b, 0xe2, 0x91, - 0xa6, 0x12, 0x8d, 0x49, 0x57, 0x22, 0x2d, 0x5e, 0x23, 0xd2, 0x0f, 0x20, 0xcb, 0x7d, 0xa7, 0xd1, - 0x24, 0x4a, 0x92, 0x39, 0xfe, 0xf6, 0x19, 0xc7, 0x83, 0xcd, 0x31, 0x2f, 0x97, 0xe1, 0xd5, 0xc0, - 0x0b, 0x04, 0x04, 0xd5, 0x20, 0x6b, 0x3f, 0xc1, 0xae, 0x6b, 0x99, 0x58, 0x37, 0x07, 0x4a, 0x8a, - 0xa5, 0xae, 0xb0, 0x98, 0x97, 0xa0, 0xeb, 0x8b, 0x9b, 0x75, 0x0d, 0x02, 0x95, 0xe6, 0xa0, 0xf8, - 0x17, 0x01, 0x72, 0xd1, 0xb0, 0xa1, 0x1f, 0x80, 0xc4, 0xb7, 0x12, 0xd6, 0x40, 0x7d, 0x31, 0x2f, - 0xa5, 0x99, 0xce, 0x6b, 0x14, 0xc1, 0x99, 0x68, 0xa6, 0x19, 0xa6, 0x6a, 0xa2, 0x1f, 0x42, 0xc6, - 0x31, 0x5c, 0x3c, 0xf5, 0x28, 0x7e, 0x9c, 0xe1, 0x37, 0x16, 0xf3, 0x92, 0x74, 0xc8, 0x84, 0xd7, - 0xff, 0x80, 0xc4, 0x51, 0x55, 0xb3, 0xf8, 0x63, 0x40, 0xaf, 0xf2, 0x00, 0xc9, 0x90, 0x38, 0xc5, - 0xcf, 0xb8, 0x47, 0x1a, 0x7d, 0x44, 0x07, 0x90, 0x7c, 0x62, 0x8c, 0x67, 0x41, 0x69, 0xbc, 0x77, - 0x3d, 0x9a, 0x69, 0x1c, 0xe4, 0x7e, 0xfc, 0x9b, 0x42, 0x5b, 0x94, 0x04, 0x39, 0x5e, 0xf9, 0x3a, - 0xac, 0xf9, 0xfa, 0x01, 0xdd, 0xd1, 0x5b, 0x00, 0x23, 0xeb, 0x64, 0xa4, 0x3f, 0x35, 0x3c, 0xec, - 0xb2, 0x3d, 0xe4, 0xb4, 0x0c, 0x95, 0x7c, 0x44, 0x05, 0x95, 0x3f, 0x25, 0x21, 0xaf, 0x4e, 0x1c, - 0xdb, 0xf5, 0x82, 0x62, 0x38, 0x80, 0x14, 0x0b, 0x18, 0x51, 0x04, 0x46, 0x85, 0xea, 0x05, 0x9b, - 0x5b, 0xb1, 0xe4, 0x7b, 0xf3, 0xe9, 0xe5, 0x63, 0x84, 0xdc, 0x8d, 0x9f, 0xcb, 0xdd, 0x6f, 0x43, - 0x8a, 0x77, 0x51, 0x56, 0xe8, 0xd9, 0x9d, 0x52, 0xe4, 0x5b, 0x41, 0x2b, 0x53, 0xbb, 0x7b, 0xd6, - 0x18, 0xef, 0x31, 0xb5, 0x00, 0x9c, 0x1b, 0xa1, 0xb7, 0x41, 0x22, 0xc4, 0xd3, 0x89, 0xf5, 0x09, - 0xa7, 0x7e, 0xa2, 0x9e, 0xa5, 0x7c, 0xe9, 0xf5, 0xfa, 0x3d, 0xeb, 0x13, 0xac, 0xa5, 0x09, 0xf1, - 0xe8, 0x03, 0x2a, 0x82, 0xf4, 0xd4, 0x18, 0x8f, 0x59, 0x89, 0x24, 0x59, 0x07, 0x0c, 0xdf, 0x57, - 0x49, 0x91, 0xfa, 0x02, 0x48, 0x81, 0x4a, 0x90, 0xf5, 0xfb, 0x95, 0x63, 0x78, 0x23, 0x25, 0x4d, - 0xeb, 0x42, 0x03, 0x2e, 0x3a, 0x34, 0xbc, 0x11, 0x52, 0x20, 0x4d, 0x8c, 0x89, 0x43, 0x43, 0x2e, - 0x95, 0x13, 0xdb, 0x39, 0x2d, 0x78, 0x45, 0x5b, 0xc0, 0xea, 0x85, 0xbf, 0x2a, 0x19, 0xb6, 0xf5, - 0x88, 0x84, 0x05, 0xe0, 0xd4, 0x72, 0xf4, 0xe3, 0x53, 0xa2, 0x40, 0x59, 0xd8, 0x96, 0xfc, 0x00, - 0x9c, 0x5a, 0xce, 0xde, 0x43, 0xa2, 0xa5, 0xe9, 0xe2, 0xde, 0x29, 0x29, 0x7e, 0x2a, 0x40, 0x92, - 0x65, 0x07, 0xdd, 0x07, 0x91, 0xd6, 0xb9, 0xdf, 0xd5, 0xaf, 0x5a, 0xe6, 0xcc, 0x06, 0x21, 0x10, - 0xa7, 0xc6, 0x04, 0x2b, 0x88, 0x79, 0xc0, 0x9e, 0xd1, 0x1b, 0x90, 0x26, 0xf8, 0xb1, 0xfe, 0xc4, - 0x18, 0x2b, 0x1b, 0x6c, 0x7b, 0x29, 0x82, 0x1f, 0x7f, 0x68, 0x8c, 0xdb, 0xa2, 0x14, 0x97, 0x13, - 0x6d, 0x51, 0x4a, 0xc8, 0x62, 0x5b, 0x94, 0x44, 0x39, 0xd9, 0x16, 0xa5, 0xa4, 0x9c, 0x6a, 0x8b, - 0x52, 0x4a, 0x4e, 0xb7, 0x45, 0x29, 0x2d, 0x4b, 0x6d, 0x51, 0x92, 0xe4, 0x4c, 0x5b, 0x94, 0x32, - 0x32, 0xb4, 0x45, 0x09, 0xe4, 0x6c, 0x5b, 0x94, 0xb2, 0x72, 0xae, 0x2d, 0x4a, 0x39, 0x39, 0xdf, - 0x16, 0xa5, 0xbc, 0x5c, 0x68, 0x8b, 0x52, 0x41, 0x5e, 0x6b, 0x8b, 0xd2, 0x9a, 0x2c, 0xb7, 0x45, - 0x49, 0x96, 0xd7, 0xdb, 0xa2, 0xb4, 0x2e, 0xa3, 0xca, 0x9f, 0x05, 0x28, 0x70, 0xfa, 0x85, 0x54, - 0xbf, 0x0b, 0xeb, 0x2c, 0x2e, 0xd6, 0xf4, 0x44, 0x77, 0x7c, 0x21, 0x23, 0x71, 0x5c, 0x93, 0x83, - 0x85, 0x50, 0xf9, 0xcb, 0x90, 0x77, 0xb1, 0x61, 0x2e, 0x15, 0xe3, 0x4c, 0x31, 0x47, 0x85, 0xa1, - 0xd2, 0x57, 0xa1, 0xc0, 0x2a, 0x6d, 0xa9, 0x95, 0x60, 0x5a, 0x79, 0x26, 0x0d, 0xd5, 0xea, 0x90, - 0x27, 0x8e, 0x31, 0x5d, 0x6a, 0x89, 0xac, 0x72, 0xde, 0x38, 0x87, 0xcd, 0x3d, 0xc7, 0x98, 0xfa, - 0x2c, 0xce, 0x51, 0x9b, 0xf0, 0x58, 0xd2, 0xd8, 0xa9, 0x34, 0x9b, 0x60, 0xaa, 0x71, 0x60, 0x11, - 0x0f, 0x7d, 0x07, 0x72, 0x2e, 0x93, 0xe8, 0x54, 0x31, 0x28, 0xc7, 0x4b, 0x40, 0xb3, 0x6e, 0x08, - 0x42, 0x2a, 0x7f, 0x10, 0x60, 0xa3, 0xe9, 0xda, 0x8e, 0x83, 0x4d, 0x3f, 0xa3, 0xbc, 0xc4, 0x83, - 0x44, 0x0a, 0x91, 0x44, 0x3e, 0x80, 0xb8, 0xda, 0xf4, 0xbb, 0xe2, 0xbd, 0xeb, 0x92, 0x3e, 0xae, - 0x36, 0xd1, 0xfb, 0x90, 0x22, 0x9e, 0xe1, 0xcd, 0x08, 0xab, 0xe9, 0xc2, 0xce, 0x97, 0x2e, 0xe8, - 0x1f, 0x3d, 0xa6, 0xa8, 0xf9, 0x06, 0x95, 0xbf, 0xc6, 0x61, 0xa3, 0x37, 0x1c, 0xe1, 0x89, 0xd1, - 0x18, 0x19, 0xd3, 0x93, 0x70, 0xbf, 0xdf, 0x03, 0x39, 0x12, 0x09, 0x7d, 0x6c, 0x11, 0xcf, 0x3f, - 0xa0, 0x6f, 0x5f, 0xdc, 0x39, 0x23, 0xe1, 0xf4, 0xe3, 0x53, 0x70, 0x57, 0x83, 0xfc, 0x7d, 0x28, - 0x98, 0x3c, 0x42, 0xba, 0xdf, 0xf5, 0x12, 0x97, 0x76, 0xbd, 0x73, 0x42, 0xea, 0xa3, 0xe7, 0xcd, - 0xc8, 0x12, 0x41, 0x3f, 0x81, 0x8d, 0x00, 0x9c, 0xce, 0x90, 0x34, 0x4a, 0xb4, 0xcb, 0x88, 0x2c, - 0xc8, 0x07, 0x8b, 0x79, 0x69, 0xdd, 0x87, 0x6a, 0xfa, 0xab, 0xd7, 0x6f, 0x37, 0xeb, 0xe6, 0x19, - 0x24, 0xd3, 0x3f, 0x12, 0x6e, 0xc0, 0x66, 0x34, 0xa4, 0x21, 0xdf, 0xea, 0x20, 0x73, 0xc9, 0x31, - 0xa6, 0xfb, 0x75, 0x4f, 0xb0, 0x87, 0xaa, 0xb0, 0x41, 0x33, 0x81, 0x27, 0xb4, 0x1d, 0xd2, 0xee, - 0xa8, 0x47, 0x68, 0xb2, 0x1e, 0x2e, 0xd1, 0xb1, 0xa1, 0x63, 0x4c, 0x70, 0xe5, 0x8f, 0x22, 0xac, - 0x2f, 0x41, 0x82, 0x6c, 0xd1, 0xa6, 0x64, 0x4d, 0x4f, 0xf5, 0xe5, 0xfc, 0xc6, 0x9b, 0x92, 0x35, - 0x3d, 0xa5, 0x33, 0x5c, 0x9a, 0x2e, 0x1e, 0xb9, 0x16, 0x6a, 0x83, 0x68, 0x3b, 0x5e, 0x50, 0x2c, - 0x17, 0x9d, 0x81, 0xaf, 0x7c, 0xa3, 0xda, 0x75, 0x3c, 0x7e, 0xb8, 0x6a, 0x0c, 0x03, 0xfd, 0x4e, - 0x80, 0xb4, 0xc7, 0x9c, 0x20, 0x4a, 0x8a, 0xe1, 0xbd, 0xff, 0x5a, 0x78, 0x3c, 0x00, 0xfe, 0xdc, - 0x76, 0x48, 0x73, 0xf9, 0xf9, 0xbc, 0xb4, 0x7e, 0x36, 0x40, 0xe4, 0xba, 0x03, 0x5d, 0xb0, 0x37, - 0xd4, 0x86, 0xc2, 0x6a, 0x84, 0xd9, 0x71, 0x70, 0xc5, 0x91, 0x2d, 0xbf, 0x92, 0x81, 0xe2, 0x09, - 0x9d, 0x9e, 0x96, 0xdb, 0x3e, 0x67, 0xcc, 0xd8, 0x5d, 0x1d, 0x33, 0xee, 0x5e, 0x29, 0x24, 0x1c, - 0x33, 0x32, 0x5b, 0x14, 0xef, 0x41, 0x26, 0x8c, 0x77, 0xf4, 0x2b, 0x19, 0xfe, 0x95, 0xcd, 0xe8, - 0x57, 0x32, 0xaf, 0x0c, 0x25, 0xe1, 0x49, 0x90, 0x94, 0x53, 0x95, 0x9f, 0x0b, 0x90, 0xd3, 0x30, - 0xb1, 0xc7, 0x4f, 0xb0, 0x49, 0x6b, 0x10, 0x7d, 0x03, 0x44, 0x5a, 0xd3, 0xfe, 0x79, 0x74, 0x49, - 0x73, 0x63, 0xaa, 0x68, 0x17, 0x32, 0xe1, 0x25, 0xea, 0x75, 0xee, 0x16, 0x4b, 0xab, 0x8a, 0x03, - 0x68, 0xe9, 0x70, 0xd8, 0xc6, 0xfb, 0x40, 0xbb, 0x03, 0xdb, 0x9b, 0xdf, 0x72, 0x79, 0x93, 0xb9, - 0x75, 0x71, 0x93, 0x09, 0x9d, 0x09, 0xd2, 0xe4, 0x46, 0x64, 0xc4, 0x2f, 0xc3, 0x45, 0x12, 0xd2, - 0x87, 0xc6, 0xb3, 0xb1, 0x6d, 0x98, 0xa8, 0x0c, 0xd9, 0xe0, 0xe6, 0x62, 0xd9, 0x53, 0x3f, 0x94, - 0x51, 0x11, 0x1d, 0x58, 0x66, 0x04, 0xbb, 0xac, 0xfa, 0x78, 0x54, 0xc3, 0x77, 0x7a, 0x26, 0xb1, - 0x6b, 0x16, 0x36, 0xf5, 0x89, 0x35, 0x74, 0x6d, 0xde, 0x67, 0x13, 0x8c, 0x1d, 0x54, 0xfa, 0x88, - 0x09, 0xd1, 0x2d, 0x58, 0x3b, 0xb6, 0xa6, 0x16, 0x19, 0x2d, 0xf5, 0xd8, 0x88, 0xa4, 0x15, 0x02, - 0xb1, 0xaf, 0x68, 0x43, 0x61, 0x79, 0x8f, 0xd2, 0x2d, 0x93, 0x17, 0x50, 0xbe, 0xbe, 0xbf, 0x98, - 0x97, 0xf2, 0xcb, 0x19, 0x40, 0x6d, 0x92, 0xeb, 0xf6, 0xa6, 0xfc, 0x12, 0x5f, 0x35, 0x09, 0xbb, - 0x8c, 0xba, 0xae, 0xed, 0x2a, 0x12, 0xe7, 0x0b, 0x7b, 0x41, 0xef, 0x41, 0x72, 0x4c, 0xef, 0xc1, - 0x6c, 0xca, 0xc9, 0xee, 0x94, 0x2f, 0x88, 0x39, 0xbb, 0x2f, 0x6b, 0x5c, 0x1d, 0xd5, 0x21, 0xc5, - 0x47, 0x29, 0x36, 0x00, 0x65, 0x77, 0xb6, 0x2f, 0x30, 0x5c, 0xb9, 0xe6, 0xee, 0xc7, 0x34, 0xdf, - 0x12, 0xb5, 0x20, 0xed, 0xf2, 0xb1, 0x59, 0xc9, 0x32, 0x90, 0xdb, 0x57, 0x1e, 0xc8, 0xf7, 0x63, - 0x5a, 0x60, 0x8b, 0xfa, 0x90, 0x23, 0x91, 0x56, 0xab, 0xe4, 0x18, 0xd6, 0x45, 0x27, 0xc9, 0x39, - 0x87, 0xdd, 0x3e, 0x1d, 0x0c, 0x22, 0x62, 0xea, 0xa0, 0xc5, 0xe6, 0x1c, 0x25, 0x7f, 0xa9, 0x83, - 0x2b, 0xf3, 0x38, 0x75, 0x90, 0x5b, 0xa2, 0x0e, 0xc0, 0x30, 0xe4, 0xbb, 0x52, 0x60, 0x38, 0x5f, - 0x7b, 0x9d, 0x06, 0xb9, 0x1f, 0xd3, 0x22, 0x08, 0xf5, 0x0c, 0xa4, 0x4d, 0xbe, 0x10, 0x4e, 0x75, - 0x69, 0x59, 0xaa, 0xfc, 0x43, 0x04, 0x29, 0xac, 0xa6, 0x1a, 0xa0, 0x63, 0xd7, 0x18, 0x52, 0x3e, - 0xeb, 0x43, 0x9b, 0x8e, 0xab, 0x1e, 0xe6, 0xd7, 0xba, 0xf8, 0x7e, 0x4c, 0x5b, 0x0f, 0xd6, 0x1a, - 0xc1, 0x12, 0x65, 0xec, 0xc4, 0x36, 0xad, 0x63, 0x6b, 0xc9, 0x58, 0xfe, 0x73, 0x45, 0x21, 0x10, - 0xfb, 0x8c, 0xfd, 0x60, 0xe5, 0x4a, 0x93, 0xb8, 0x42, 0x07, 0xd8, 0x8f, 0x45, 0xee, 0x3c, 0xb4, - 0x82, 0xdc, 0xd9, 0x74, 0x4a, 0xc7, 0x44, 0x7f, 0x52, 0x11, 0x19, 0x13, 0xf3, 0xbe, 0x94, 0x4f, - 0x25, 0xa8, 0x71, 0x86, 0x59, 0xb7, 0x2f, 0x65, 0x56, 0xe0, 0xfb, 0xbe, 0x10, 0x52, 0x6b, 0xef, - 0x2c, 0xb5, 0xee, 0x5c, 0x4e, 0xad, 0x08, 0x4c, 0xc8, 0xad, 0xa3, 0x73, 0xb9, 0x55, 0xbb, 0x22, - 0xb7, 0x22, 0x88, 0xab, 0xe4, 0x6a, 0x9c, 0x21, 0xd7, 0xed, 0x4b, 0xc9, 0x15, 0xf5, 0xd1, 0x67, - 0x57, 0xf7, 0x1c, 0x76, 0xbd, 0x73, 0x25, 0x76, 0x45, 0xc0, 0xa2, 0xf4, 0x02, 0x90, 0x82, 0x51, - 0x3a, 0x42, 0xb5, 0x3b, 0xdf, 0x85, 0x94, 0x9f, 0x1a, 0x04, 0x85, 0xa6, 0xb6, 0xab, 0x76, 0xd4, - 0xce, 0x03, 0xbd, 0xb3, 0xfb, 0xa8, 0xd5, 0x93, 0x63, 0x48, 0x81, 0xcd, 0x8f, 0x76, 0xd5, 0xbe, - 0xbe, 0xd7, 0xd5, 0xf4, 0x07, 0x0d, 0x5d, 0xed, 0xf4, 0x5b, 0xda, 0x87, 0xbb, 0x07, 0xb2, 0x80, - 0x6e, 0x00, 0xd2, 0xba, 0x8d, 0x87, 0xbd, 0x66, 0x5d, 0x6f, 0x74, 0x1f, 0x1d, 0xee, 0x36, 0xfa, - 0x6a, 0xb7, 0x23, 0xc7, 0x91, 0x04, 0x62, 0xb3, 0xdb, 0x69, 0xc9, 0x70, 0xe7, 0x33, 0x01, 0xc4, - 0xfe, 0x33, 0x07, 0xa3, 0xaf, 0x40, 0xf6, 0xa8, 0xd3, 0x3b, 0x6c, 0x35, 0xd4, 0x3d, 0xb5, 0xd5, - 0x94, 0x63, 0xc5, 0x8d, 0xe7, 0x2f, 0xca, 0x6b, 0x74, 0xe9, 0x68, 0x4a, 0x1c, 0x3c, 0x64, 0x34, - 0x44, 0x45, 0x48, 0xd5, 0x77, 0x1b, 0x0f, 0x8f, 0x0e, 0x65, 0xa1, 0x58, 0x78, 0xfe, 0xa2, 0x0c, - 0x54, 0x81, 0x53, 0x00, 0xdd, 0x84, 0xb4, 0xd6, 0xea, 0xf5, 0xbb, 0x5a, 0x4b, 0x8e, 0x17, 0xd7, - 0x9e, 0xbf, 0x28, 0x67, 0xe9, 0xa2, 0x9f, 0x59, 0x74, 0x0b, 0xf2, 0xbd, 0xc6, 0x7e, 0xeb, 0xd1, - 0xae, 0xde, 0xd8, 0xdf, 0xed, 0x3c, 0x68, 0xc9, 0x89, 0xe2, 0xe6, 0xf3, 0x17, 0x65, 0x99, 0xea, - 0x44, 0x13, 0x46, 0x3f, 0xa1, 0x3e, 0x3a, 0xec, 0x6a, 0x7d, 0x59, 0x5c, 0x7e, 0x82, 0x67, 0x00, - 0x55, 0x00, 0xb8, 0xf5, 0x5e, 0xab, 0xd5, 0x94, 0x93, 0x45, 0xf4, 0xfc, 0x45, 0xb9, 0x40, 0xd7, - 0x97, 0x81, 0x2d, 0x4a, 0xbf, 0xf8, 0xcd, 0x56, 0xec, 0xf7, 0xbf, 0xdd, 0x8a, 0xd5, 0xcb, 0x2f, - 0xff, 0xbd, 0x15, 0x7b, 0xb9, 0xd8, 0x12, 0x3e, 0x5d, 0x6c, 0x09, 0x7f, 0x5b, 0x6c, 0x09, 0xff, - 0x5a, 0x6c, 0x09, 0xbf, 0xfc, 0xcf, 0x56, 0xec, 0xe3, 0x14, 0xcf, 0xc7, 0x20, 0xc5, 0x7e, 0x89, - 0x7c, 0xf7, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x14, 0xe5, 0x00, 0x44, 0x3a, 0x15, 0x00, 0x00, +func init() { proto.RegisterFile("jobs/jobspb/jobs.proto", fileDescriptor_jobs_8d45e63df6a07cbb) } + +var fileDescriptor_jobs_8d45e63df6a07cbb = []byte{ + // 2335 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0xdf, 0x6f, 0xe3, 0x58, + 0xf5, 0x8f, 0x13, 0x27, 0x71, 0x4e, 0x7e, 0xd4, 0xbd, 0xad, 0x76, 0xbd, 0xd1, 0x6c, 0x93, 0x6f, + 0xbe, 0xec, 0x6e, 0x67, 0x97, 0x4d, 0xa0, 0x2b, 0x66, 0x98, 0x11, 0xac, 0x36, 0xbf, 0x3a, 0x4d, + 0xa6, 0x93, 0x16, 0x27, 0x9d, 0x85, 0x45, 0xc8, 0x38, 0xf1, 0x6d, 0x63, 0x9a, 0xc4, 0x1e, 0x5f, + 0x67, 0x86, 0x59, 0x21, 0xb1, 0x42, 0x3c, 0xa0, 0x79, 0xe2, 0x0f, 0x60, 0x24, 0x24, 0x40, 0xe2, + 0x05, 0xc1, 0x0b, 0xfc, 0x0d, 0xf3, 0x82, 0x58, 0xde, 0x40, 0x48, 0x01, 0xc2, 0x0b, 0x7f, 0xc3, + 0x3c, 0xa1, 0x7b, 0xaf, 0xed, 0x38, 0x9d, 0xd2, 0xa6, 0x95, 0x78, 0x69, 0xe3, 0x73, 0xcf, 0xf9, + 0xf8, 0x9e, 0x73, 0x3e, 0xe7, 0xdc, 0x73, 0x0d, 0xaf, 0x7d, 0xcf, 0xea, 0x93, 0x0a, 0xfd, 0x63, + 0xf7, 0xd9, 0xbf, 0xb2, 0xed, 0x58, 0xae, 0x85, 0xde, 0x18, 0x58, 0x83, 0x53, 0xc7, 0xd2, 0x07, + 0xc3, 0x32, 0x79, 0x34, 0x2a, 0xb3, 0x15, 0xae, 0x95, 0xdf, 0x3c, 0xb1, 0x4e, 0x2c, 0xa6, 0x55, + 0xa1, 0xbf, 0xb8, 0x41, 0x1e, 0x31, 0x65, 0xbb, 0x5f, 0x31, 0x74, 0x57, 0xf7, 0x64, 0x8a, 0x2f, + 0x33, 0xad, 0xf7, 0x8f, 0x2d, 0x67, 0xac, 0xbb, 0x1e, 0x7c, 0xfe, 0x06, 0x79, 0x34, 0xaa, 0x90, + 0x47, 0xa3, 0xbe, 0x4e, 0x70, 0x85, 0xb8, 0xce, 0x74, 0xe0, 0x4e, 0x1d, 0x6c, 0xf8, 0x76, 0x53, + 0xd7, 0x1c, 0x55, 0x86, 0xa3, 0x41, 0xc5, 0x35, 0xc7, 0x98, 0xb8, 0xfa, 0xd8, 0xe6, 0x2b, 0xa5, + 0x1f, 0x42, 0x7c, 0x1f, 0xeb, 0x04, 0xa3, 0x4f, 0x20, 0x39, 0xb1, 0x0c, 0xac, 0x99, 0x86, 0x22, + 0x14, 0x85, 0xed, 0x6c, 0xad, 0x3a, 0x9f, 0x15, 0x12, 0x1d, 0xcb, 0xc0, 0xad, 0xc6, 0xcb, 0x59, + 0xe1, 0x83, 0x13, 0xd3, 0x1d, 0x4e, 0xfb, 0xe5, 0x81, 0x35, 0xae, 0x04, 0x9e, 0x18, 0xfd, 0xc5, + 0xef, 0x8a, 0x7d, 0x7a, 0x52, 0xf1, 0xb6, 0x57, 0xe6, 0x66, 0x6a, 0x82, 0x22, 0xb6, 0x0c, 0xb4, + 0x09, 0x71, 0x6c, 0x5b, 0x83, 0xa1, 0x12, 0x2d, 0x0a, 0xdb, 0x31, 0x95, 0x3f, 0xdc, 0x15, 0xff, + 0xfd, 0xf3, 0x82, 0x50, 0xfa, 0x9b, 0x00, 0xd9, 0x9a, 0x3e, 0x38, 0x9d, 0xda, 0x0d, 0xec, 0xea, + 0xe6, 0x88, 0xa0, 0x1a, 0x00, 0x71, 0x75, 0xc7, 0xd5, 0xe8, 0x5e, 0xd9, 0x66, 0xd2, 0x3b, 0x6f, + 0x96, 0x17, 0xe1, 0xa3, 0xbe, 0x94, 0x87, 0xa3, 0x41, 0xb9, 0xe7, 0xfb, 0x52, 0x13, 0x5f, 0xcc, + 0x0a, 0x11, 0x35, 0xc5, 0xcc, 0xa8, 0x14, 0x7d, 0x08, 0x12, 0x9e, 0x18, 0x1c, 0x21, 0xba, 0x3a, + 0x42, 0x12, 0x4f, 0x0c, 0x66, 0xff, 0x06, 0xc4, 0xa6, 0x8e, 0xa9, 0xc4, 0x8a, 0xc2, 0x76, 0xaa, + 0x96, 0x9c, 0xcf, 0x0a, 0xb1, 0x23, 0xb5, 0xa5, 0x52, 0x19, 0x7a, 0x0f, 0xd6, 0xfb, 0x6c, 0xbf, + 0x9a, 0x81, 0xc9, 0xc0, 0x31, 0x6d, 0xd7, 0x72, 0x14, 0xb1, 0x28, 0x6c, 0x67, 0x54, 0xb9, 0xef, + 0x39, 0xe2, 0xcb, 0x4b, 0x32, 0xe4, 0xb8, 0x73, 0x87, 0x8e, 0x75, 0xe2, 0x60, 0x42, 0x4a, 0x7f, + 0x8d, 0x43, 0x4e, 0xc5, 0xc4, 0xb5, 0x1c, 0xec, 0x3b, 0xfc, 0x33, 0x01, 0x72, 0xae, 0xde, 0x1f, + 0x61, 0xcd, 0xc1, 0x4f, 0x1c, 0xd3, 0xc5, 0x44, 0x89, 0x16, 0x63, 0xdb, 0xe9, 0x9d, 0xaf, 0x95, + 0xff, 0x2b, 0x69, 0xca, 0xcb, 0x18, 0xe5, 0x1e, 0xb5, 0x57, 0x3d, 0xf3, 0xe6, 0xc4, 0x75, 0x9e, + 0xd6, 0x6e, 0xff, 0xe8, 0xef, 0x2b, 0xa6, 0x2d, 0xc4, 0x9d, 0x72, 0xab, 0xa1, 0x66, 0xdd, 0x30, + 0x18, 0xba, 0x01, 0xe2, 0xd4, 0x31, 0x89, 0x12, 0x2b, 0xc6, 0xb6, 0x53, 0x35, 0x69, 0x3e, 0x2b, + 0x88, 0x47, 0x6a, 0x8b, 0xa8, 0x4c, 0xba, 0x14, 0x69, 0xf1, 0x1a, 0x91, 0xbe, 0x07, 0x69, 0xee, + 0x3b, 0x8d, 0x26, 0x51, 0xe2, 0xcc, 0xf1, 0xb7, 0xcf, 0x38, 0xee, 0x6f, 0x8e, 0x79, 0xb9, 0x08, + 0xaf, 0x0a, 0xae, 0x2f, 0x20, 0xa8, 0x02, 0x69, 0xeb, 0x31, 0x76, 0x1c, 0xd3, 0xc0, 0x9a, 0xd1, + 0x57, 0x12, 0x2c, 0x75, 0xb9, 0xf9, 0xac, 0x00, 0x07, 0x9e, 0xb8, 0x51, 0x53, 0xc1, 0x57, 0x69, + 0xf4, 0xf3, 0x7f, 0x12, 0x20, 0x13, 0x0e, 0x1b, 0xfa, 0x0e, 0x48, 0x7c, 0x2b, 0x41, 0x0d, 0xd4, + 0xe6, 0xb3, 0x42, 0x92, 0xe9, 0x5c, 0xa1, 0x08, 0xce, 0x44, 0x33, 0xc9, 0x30, 0x5b, 0x06, 0xfa, + 0x2e, 0xa4, 0x6c, 0xdd, 0xc1, 0x13, 0x97, 0xe2, 0x47, 0x19, 0x7e, 0x7d, 0x3e, 0x2b, 0x48, 0x87, + 0x4c, 0x78, 0xfd, 0x17, 0x48, 0x1c, 0xb5, 0x65, 0xe4, 0xbf, 0x0f, 0xe8, 0x55, 0x1e, 0x20, 0x19, + 0x62, 0xa7, 0xf8, 0x29, 0xf7, 0x48, 0xa5, 0x3f, 0xd1, 0x3e, 0xc4, 0x1f, 0xeb, 0xa3, 0xa9, 0x5f, + 0x1a, 0xb7, 0xae, 0x47, 0x33, 0x95, 0x83, 0xdc, 0x8d, 0x7e, 0x55, 0x68, 0x8b, 0x92, 0x20, 0x47, + 0x4b, 0x5f, 0x82, 0x35, 0x4f, 0xdf, 0xa7, 0x3b, 0x7a, 0x13, 0x60, 0x68, 0x9e, 0x0c, 0xb5, 0x27, + 0xba, 0x8b, 0x1d, 0xb6, 0x87, 0x8c, 0x9a, 0xa2, 0x92, 0x8f, 0xa9, 0xa0, 0xf4, 0x87, 0x38, 0x64, + 0x5b, 0x63, 0xdb, 0x72, 0x5c, 0xbf, 0x18, 0xf6, 0x21, 0xc1, 0x02, 0x46, 0x14, 0x81, 0x51, 0xa1, + 0x7c, 0xc1, 0xe6, 0x96, 0x2c, 0xf9, 0xde, 0x3c, 0x7a, 0x79, 0x18, 0x01, 0x77, 0xa3, 0xe7, 0x72, + 0xf7, 0xeb, 0x90, 0xe0, 0x5d, 0x94, 0x15, 0x7a, 0x7a, 0xa7, 0x10, 0x7a, 0x97, 0xdf, 0xca, 0x5a, + 0x07, 0xbb, 0xe6, 0x08, 0xef, 0x32, 0x35, 0x1f, 0x9c, 0x1b, 0xa1, 0xb7, 0x41, 0x22, 0xc4, 0xd5, + 0x88, 0xf9, 0x29, 0xa7, 0x7e, 0xac, 0x96, 0xa6, 0x7c, 0xe9, 0x76, 0x7b, 0x5d, 0xf3, 0x53, 0xac, + 0x26, 0x09, 0x71, 0xe9, 0x0f, 0x94, 0x07, 0xe9, 0x89, 0x3e, 0x1a, 0xb1, 0x12, 0x89, 0xb3, 0x0e, + 0x18, 0x3c, 0x2f, 0x93, 0x22, 0xf1, 0x3f, 0x20, 0x05, 0x2a, 0x40, 0xda, 0xeb, 0x57, 0xb6, 0xee, + 0x0e, 0x95, 0x24, 0xad, 0x0b, 0x15, 0xb8, 0xe8, 0x50, 0x77, 0x87, 0x48, 0x81, 0x24, 0xd1, 0xc7, + 0x36, 0x0d, 0xb9, 0x54, 0x8c, 0x6d, 0x67, 0x54, 0xff, 0x11, 0x6d, 0x01, 0xab, 0x17, 0xfe, 0xa8, + 0xa4, 0xd8, 0xd6, 0x43, 0x12, 0x16, 0x80, 0x53, 0xd3, 0xd6, 0x8e, 0x4f, 0x89, 0x02, 0x45, 0x61, + 0x5b, 0xf2, 0x02, 0x70, 0x6a, 0xda, 0xbb, 0xf7, 0x89, 0x9a, 0xa4, 0x8b, 0xbb, 0xa7, 0x24, 0xff, + 0xb9, 0x00, 0x71, 0x96, 0x1d, 0x74, 0x17, 0x44, 0x5a, 0xe7, 0x5e, 0x57, 0x5f, 0xb5, 0xcc, 0x99, + 0x0d, 0x42, 0x20, 0x4e, 0xf4, 0x31, 0x56, 0x10, 0xf3, 0x80, 0xfd, 0x46, 0xaf, 0x43, 0x92, 0xe0, + 0x47, 0xda, 0x63, 0x7d, 0xa4, 0x6c, 0xb0, 0xed, 0x25, 0x08, 0x7e, 0xf4, 0x50, 0x1f, 0xb5, 0x45, + 0x29, 0x2a, 0xc7, 0xda, 0xa2, 0x14, 0x93, 0xc5, 0xb6, 0x28, 0x89, 0x72, 0xbc, 0x2d, 0x4a, 0x71, + 0x39, 0xd1, 0x16, 0xa5, 0x84, 0x9c, 0x6c, 0x8b, 0x52, 0x52, 0x96, 0xda, 0xa2, 0x24, 0xc9, 0xa9, + 0xb6, 0x28, 0xa5, 0x64, 0x68, 0x8b, 0x12, 0xc8, 0xe9, 0xb6, 0x28, 0xa5, 0xe5, 0x4c, 0x5b, 0x94, + 0x32, 0x72, 0xb6, 0x2d, 0x4a, 0x59, 0x39, 0xd7, 0x16, 0xa5, 0x9c, 0xbc, 0xd6, 0x16, 0xa5, 0x35, + 0x59, 0x6e, 0x8b, 0x92, 0x2c, 0xaf, 0xb7, 0x45, 0x69, 0x5d, 0x46, 0xa5, 0x3f, 0x0a, 0x90, 0xe3, + 0xf4, 0x0b, 0xa8, 0xfe, 0x1e, 0xac, 0xb3, 0xb8, 0x98, 0x93, 0x13, 0xcd, 0xf6, 0x84, 0x8c, 0xc4, + 0x51, 0x55, 0xf6, 0x17, 0x02, 0xe5, 0xff, 0x87, 0xac, 0x83, 0x75, 0x63, 0xa1, 0x18, 0x65, 0x8a, + 0x19, 0x2a, 0x0c, 0x94, 0xde, 0x82, 0x1c, 0xab, 0xb4, 0x85, 0x56, 0x8c, 0x69, 0x65, 0x99, 0x34, + 0x50, 0xab, 0x41, 0x96, 0xd8, 0xfa, 0x64, 0xa1, 0x25, 0xb2, 0xca, 0x79, 0xfd, 0x1c, 0x36, 0x77, + 0x6d, 0x7d, 0xe2, 0xb1, 0x38, 0x43, 0x6d, 0x82, 0x63, 0x49, 0x65, 0xa7, 0xd2, 0x74, 0x8c, 0xa9, + 0xc6, 0xbe, 0x49, 0x5c, 0xf4, 0x11, 0x64, 0x1c, 0x26, 0xd1, 0xa8, 0xa2, 0x5f, 0x8e, 0x97, 0x80, + 0xa6, 0x9d, 0x00, 0x84, 0x94, 0x7e, 0x23, 0xc0, 0x46, 0xc3, 0xb1, 0x6c, 0x1b, 0x1b, 0x5e, 0x46, + 0x79, 0x89, 0xfb, 0x89, 0x14, 0x42, 0x89, 0xbc, 0x07, 0xd1, 0x56, 0xc3, 0xeb, 0x8a, 0xb7, 0xaf, + 0x4b, 0xfa, 0x68, 0xab, 0x81, 0xee, 0x40, 0x82, 0xb8, 0xba, 0x3b, 0x25, 0xac, 0xa6, 0x73, 0x3b, + 0xff, 0x77, 0x41, 0xff, 0xe8, 0x32, 0x45, 0xd5, 0x33, 0x28, 0xfd, 0x39, 0x0a, 0x1b, 0xdd, 0xc1, + 0x10, 0x8f, 0xf5, 0xfa, 0x50, 0x9f, 0x9c, 0x04, 0xfb, 0xfd, 0x16, 0xc8, 0xa1, 0x48, 0x68, 0x23, + 0x93, 0xb8, 0xde, 0x01, 0x7d, 0xf3, 0xe2, 0xce, 0x19, 0x0a, 0xa7, 0x17, 0x9f, 0x9c, 0xb3, 0x1c, + 0xe4, 0x6f, 0x43, 0xce, 0xe0, 0x11, 0xd2, 0xbc, 0xae, 0x17, 0xbb, 0xb4, 0xeb, 0x9d, 0x13, 0x52, + 0x0f, 0x3d, 0x6b, 0x84, 0x96, 0x08, 0xfa, 0x01, 0x6c, 0xf8, 0xe0, 0x74, 0x86, 0xa4, 0x51, 0xa2, + 0x5d, 0x46, 0x64, 0x41, 0xde, 0x9f, 0xcf, 0x0a, 0xeb, 0x1e, 0x54, 0xc3, 0x5b, 0xbd, 0x7e, 0xbb, + 0x59, 0x37, 0xce, 0x20, 0x19, 0xde, 0x91, 0xf0, 0x1a, 0x6c, 0x86, 0x43, 0x1a, 0xf0, 0xad, 0x06, + 0x32, 0x97, 0x1c, 0x63, 0xba, 0x5f, 0xe7, 0x04, 0xbb, 0xa8, 0x0c, 0x1b, 0x34, 0x13, 0x78, 0x4c, + 0xdb, 0x21, 0xed, 0x8e, 0x5a, 0x88, 0x26, 0xeb, 0xc1, 0x12, 0x1d, 0x1b, 0x3a, 0xfa, 0x18, 0x97, + 0x7e, 0x2b, 0xc2, 0xfa, 0x02, 0xc4, 0xcf, 0x16, 0x6d, 0x4a, 0xe6, 0xe4, 0x54, 0x5b, 0xcc, 0x6f, + 0xbc, 0x29, 0x99, 0x93, 0x53, 0x3a, 0xc3, 0x25, 0xe9, 0xe2, 0x91, 0x63, 0xa2, 0x36, 0x88, 0x96, + 0xed, 0xfa, 0xc5, 0x72, 0xd1, 0x19, 0xf8, 0xca, 0x3b, 0xca, 0x07, 0xb6, 0xcb, 0x0f, 0x57, 0x95, + 0x61, 0xa0, 0x5f, 0x09, 0x90, 0x74, 0x99, 0x13, 0x44, 0x49, 0x30, 0xbc, 0x3b, 0x57, 0xc2, 0xe3, + 0x01, 0xf0, 0xe6, 0xb6, 0x43, 0x9a, 0xcb, 0x97, 0xb3, 0xc2, 0xfa, 0xd9, 0x00, 0x91, 0xeb, 0x0e, + 0x74, 0xfe, 0xde, 0x50, 0x1b, 0x72, 0xcb, 0x11, 0x66, 0xc7, 0xc1, 0x8a, 0x23, 0x5b, 0x76, 0x29, + 0x03, 0xf9, 0x13, 0x3a, 0x3d, 0x2d, 0xb6, 0x7d, 0xce, 0x98, 0x51, 0x5d, 0x1e, 0x33, 0xde, 0x5b, + 0x29, 0x24, 0x1c, 0x33, 0x34, 0x5b, 0xe4, 0x6f, 0x43, 0x2a, 0x88, 0x77, 0xf8, 0x2d, 0x29, 0xfe, + 0x96, 0xcd, 0xf0, 0x5b, 0x52, 0xaf, 0x0c, 0x25, 0xc1, 0x49, 0x10, 0x97, 0x13, 0xa5, 0x1f, 0x0b, + 0x90, 0x51, 0x31, 0xb1, 0x46, 0x8f, 0xb1, 0x41, 0x6b, 0x10, 0x7d, 0x19, 0x44, 0x5a, 0xd3, 0xde, + 0x79, 0x74, 0x49, 0x73, 0x63, 0xaa, 0xa8, 0x0a, 0xa9, 0xe0, 0x12, 0x75, 0x95, 0xbb, 0xc5, 0xc2, + 0xaa, 0x64, 0x03, 0x5a, 0x38, 0x1c, 0xb4, 0xf1, 0x1e, 0xd0, 0xee, 0xc0, 0xf6, 0xe6, 0xb5, 0x5c, + 0xde, 0x64, 0xde, 0xb9, 0xb8, 0xc9, 0x04, 0xce, 0xf8, 0x69, 0x72, 0x42, 0x32, 0xe2, 0x95, 0xe1, + 0x67, 0x31, 0x40, 0x75, 0x07, 0xeb, 0x2e, 0xa6, 0x3d, 0x8f, 0xf8, 0xb5, 0xd2, 0x09, 0x77, 0xe2, + 0xda, 0xdd, 0x97, 0xb3, 0xc2, 0xad, 0xd5, 0xf9, 0x85, 0xc7, 0x15, 0xd7, 0xc1, 0xb8, 0x4c, 0x6b, + 0xd1, 0xeb, 0xe2, 0x35, 0x88, 0xb3, 0x36, 0xe6, 0xc5, 0x65, 0xc5, 0xf3, 0xdd, 0xdb, 0x38, 0x37, + 0x45, 0x47, 0x90, 0x1c, 0x58, 0xa3, 0xe9, 0x78, 0xe2, 0xf7, 0xc2, 0xaf, 0x5c, 0xc4, 0x9b, 0x57, + 0x7c, 0x2a, 0xd7, 0xb9, 0xb1, 0x7f, 0xcf, 0xf0, 0xb0, 0xd0, 0x0d, 0x48, 0x75, 0x7d, 0xfe, 0xb2, + 0x16, 0x98, 0x52, 0x17, 0x82, 0xbc, 0x0e, 0x49, 0xcf, 0x0e, 0x3d, 0x84, 0x98, 0x69, 0xf0, 0xe3, + 0x2e, 0x5b, 0x6b, 0xd0, 0xab, 0x5f, 0xab, 0x41, 0x5e, 0xce, 0x0a, 0x77, 0xae, 0x5c, 0x79, 0x1c, + 0xb1, 0xd5, 0x50, 0x29, 0x60, 0xe9, 0x23, 0xd8, 0x08, 0xed, 0x36, 0xc8, 0xfa, 0x4d, 0xe0, 0xc3, + 0x01, 0x76, 0xce, 0x0e, 0x0d, 0x6b, 0x9e, 0x3c, 0xe8, 0x99, 0xbf, 0x4f, 0x40, 0xf2, 0x50, 0x7f, + 0x3a, 0xb2, 0x74, 0x03, 0x15, 0x21, 0xed, 0x5f, 0x3f, 0x4d, 0x6b, 0xe2, 0xd5, 0x43, 0x58, 0x44, + 0xa7, 0xce, 0x29, 0xc1, 0x0e, 0xcb, 0x2f, 0x2f, 0x8d, 0xe0, 0x99, 0x0e, 0x16, 0xec, 0xae, 0x8c, + 0x0d, 0x6d, 0x6c, 0x0e, 0x1c, 0x8b, 0x1f, 0x96, 0x31, 0x56, 0xe2, 0x54, 0xfa, 0x80, 0x09, 0xd1, + 0x3b, 0xb0, 0x76, 0x6c, 0x4e, 0x4c, 0x32, 0x5c, 0xe8, 0xb1, 0x39, 0x57, 0xcd, 0xf9, 0x62, 0x4f, + 0xd1, 0x82, 0xdc, 0xe2, 0x32, 0xac, 0xd1, 0xf0, 0x25, 0x58, 0xf8, 0xf6, 0xe6, 0xb3, 0x42, 0x76, + 0x91, 0x68, 0x1e, 0xc8, 0xeb, 0xdd, 0x49, 0x17, 0xf8, 0x2d, 0x83, 0xb0, 0x2f, 0x0a, 0x8e, 0x63, + 0x39, 0x8a, 0xc4, 0x8b, 0x9e, 0x3d, 0xa0, 0x5b, 0x10, 0x1f, 0x61, 0x9d, 0xf0, 0x51, 0x35, 0xbd, + 0x53, 0xbc, 0x80, 0x38, 0xec, 0xa3, 0x87, 0xca, 0xd5, 0x51, 0x0d, 0x12, 0x7c, 0x1e, 0x66, 0x53, + 0x6c, 0x7a, 0x67, 0xfb, 0x02, 0xc3, 0xa5, 0x6f, 0x15, 0x7b, 0x11, 0xd5, 0xb3, 0x44, 0x4d, 0x48, + 0x3a, 0xfc, 0xee, 0xa3, 0xa4, 0x19, 0xc8, 0xcd, 0x95, 0x6f, 0x55, 0x7b, 0x11, 0xd5, 0xb7, 0x45, + 0x3d, 0xc8, 0x90, 0xd0, 0x79, 0xa9, 0x64, 0x18, 0xd6, 0x45, 0xe3, 0xc0, 0x39, 0x13, 0xcb, 0x1e, + 0x9d, 0xee, 0x42, 0x62, 0xea, 0xa0, 0xc9, 0x86, 0x55, 0x25, 0x7b, 0xa9, 0x83, 0x4b, 0x97, 0x2a, + 0xea, 0x20, 0xb7, 0x44, 0x1d, 0x80, 0x41, 0xd0, 0xb4, 0x94, 0x1c, 0xc3, 0xf9, 0xe2, 0x55, 0x4e, + 0xb9, 0xbd, 0x88, 0x1a, 0x42, 0x40, 0xdf, 0x80, 0xf4, 0x60, 0x51, 0x0f, 0xca, 0x1a, 0x03, 0x7c, + 0xff, 0x4a, 0xb5, 0xbe, 0x17, 0x51, 0xc3, 0x18, 0xb5, 0x14, 0x24, 0x0d, 0xbe, 0x12, 0x4c, 0xfb, + 0x49, 0x59, 0x2a, 0xfd, 0x2e, 0x0e, 0x52, 0x50, 0x6f, 0x15, 0x40, 0xc7, 0x8e, 0x3e, 0xa0, 0x25, + 0xa2, 0x0d, 0x2c, 0x5a, 0x60, 0x2e, 0xe6, 0xd7, 0xfd, 0xe8, 0x5e, 0x44, 0x5d, 0xf7, 0xd7, 0xea, + 0xfe, 0x12, 0x2d, 0x82, 0xb1, 0x65, 0x98, 0xc7, 0xe6, 0xa2, 0x08, 0xf8, 0x67, 0xac, 0x9c, 0x2f, + 0xf6, 0x8a, 0xe0, 0xc3, 0xa5, 0xab, 0x6e, 0x6c, 0x85, 0x93, 0x61, 0x2f, 0x12, 0xba, 0x0b, 0xd3, + 0xa2, 0x74, 0xa6, 0x93, 0x09, 0xbd, 0x3e, 0x78, 0x13, 0x2c, 0x6f, 0x53, 0x59, 0x4f, 0xca, 0xa7, + 0x55, 0x54, 0x3f, 0x43, 0xd6, 0x9b, 0x97, 0x92, 0xd5, 0xf7, 0x7d, 0x4f, 0x08, 0xd8, 0xba, 0x7b, + 0x96, 0xad, 0xef, 0x5e, 0xce, 0xd6, 0x10, 0x4c, 0x40, 0xd7, 0xa3, 0x73, 0xe9, 0x5a, 0x59, 0x91, + 0xae, 0x21, 0xc4, 0x65, 0xbe, 0xd6, 0xcf, 0xf0, 0xf5, 0xe6, 0xa5, 0x7c, 0x0d, 0xfb, 0xe8, 0x11, + 0xf6, 0xe0, 0x1c, 0xc2, 0xbe, 0xbf, 0x12, 0x61, 0x43, 0x60, 0x61, 0xc6, 0xaa, 0xe7, 0x31, 0xb6, + 0xbc, 0x1a, 0x63, 0x43, 0x90, 0x4b, 0x94, 0x05, 0x90, 0xfc, 0xb6, 0x1f, 0xa2, 0xef, 0xbb, 0xdf, + 0x84, 0x84, 0x97, 0x6e, 0x04, 0xb9, 0x86, 0x5a, 0x6d, 0x75, 0x5a, 0x9d, 0x7b, 0x5a, 0xa7, 0xfa, + 0xa0, 0xd9, 0x95, 0x23, 0x48, 0x81, 0xcd, 0x8f, 0xab, 0xad, 0x9e, 0xb6, 0x7b, 0xa0, 0x6a, 0xf7, + 0xea, 0x5a, 0xab, 0xd3, 0x6b, 0xaa, 0x0f, 0xab, 0xfb, 0xb2, 0x80, 0x5e, 0x03, 0xa4, 0x1e, 0xd4, + 0xef, 0x77, 0x1b, 0x35, 0xad, 0x7e, 0xf0, 0xe0, 0xb0, 0x5a, 0xef, 0xb5, 0x0e, 0x3a, 0x72, 0x14, + 0x49, 0x20, 0x36, 0x0e, 0x3a, 0x4d, 0x19, 0xde, 0xfd, 0x2c, 0x0a, 0x62, 0xef, 0xa9, 0x8d, 0xd1, + 0x17, 0x20, 0x7d, 0xd4, 0xe9, 0x1e, 0x36, 0xeb, 0xad, 0xdd, 0x56, 0xb3, 0x21, 0x47, 0xf2, 0x1b, + 0xcf, 0x9e, 0x17, 0xd7, 0xe8, 0xd2, 0xd1, 0x84, 0xd8, 0x78, 0xc0, 0xa8, 0x8d, 0xf2, 0x90, 0xa8, + 0x55, 0xeb, 0xf7, 0x8f, 0x0e, 0x65, 0x21, 0x9f, 0x7b, 0xf6, 0xbc, 0x08, 0x54, 0x81, 0xd3, 0x0a, + 0xdd, 0x80, 0xa4, 0xda, 0xec, 0xf6, 0x0e, 0xd4, 0xa6, 0x1c, 0xcd, 0xaf, 0x3d, 0x7b, 0x5e, 0x4c, + 0xd3, 0x45, 0x8f, 0x2d, 0xe8, 0x1d, 0xc8, 0x76, 0xeb, 0x7b, 0xcd, 0x07, 0x55, 0xad, 0xbe, 0x57, + 0xed, 0xdc, 0x6b, 0xca, 0xb1, 0xfc, 0xe6, 0xb3, 0xe7, 0x45, 0x99, 0xea, 0x84, 0x49, 0x40, 0x5f, + 0xd1, 0x7a, 0x70, 0x78, 0xa0, 0xf6, 0x64, 0x71, 0xf1, 0x0a, 0x9e, 0x55, 0x54, 0x02, 0xe0, 0xd6, + 0xbb, 0xcd, 0x66, 0x43, 0x8e, 0xe7, 0xd1, 0xb3, 0xe7, 0xc5, 0x1c, 0x5d, 0x5f, 0x24, 0x0b, 0xbd, + 0x05, 0x99, 0xba, 0xda, 0xac, 0xf6, 0x9a, 0x5a, 0xb7, 0x57, 0xed, 0x75, 0xe5, 0xc4, 0xc2, 0x93, + 0x50, 0x02, 0xf2, 0xd2, 0x4f, 0x7e, 0xb1, 0x15, 0xf9, 0xf5, 0x2f, 0xb7, 0x22, 0xb5, 0xe2, 0x8b, + 0x7f, 0x6e, 0x45, 0x5e, 0xcc, 0xb7, 0x84, 0xcf, 0xe7, 0x5b, 0xc2, 0x5f, 0xe6, 0x5b, 0xc2, 0x3f, + 0xe6, 0x5b, 0xc2, 0x4f, 0xff, 0xb5, 0x15, 0xf9, 0x24, 0xc1, 0x13, 0xd7, 0x4f, 0xb0, 0x8f, 0xe3, + 0x1f, 0xfc, 0x27, 0x00, 0x00, 0xff, 0xff, 0x2b, 0x6f, 0x3a, 0x9e, 0xcd, 0x17, 0x00, 0x00, } diff --git a/pkg/jobs/jobspb/jobs.proto b/pkg/jobs/jobspb/jobs.proto index abca56f4eb57..b514bc5f9f28 100644 --- a/pkg/jobs/jobspb/jobs.proto +++ b/pkg/jobs/jobspb/jobs.proto @@ -192,6 +192,26 @@ message ChangefeedProgress { repeated ResolvedSpan resolved_spans = 2 [(gogoproto.nullable) = false]; } +message CreateStatsDetails { + message Columns { + repeated uint32 ids = 1 [ + (gogoproto.customname) = "IDs", + (gogoproto.casttype) = "github.com/cockroachdb/cockroach/pkg/sql/sqlbase.ColumnID" + ]; + } + string name = 1 [ + (gogoproto.casttype) = "github.com/cockroachdb/cockroach/pkg/sql/sem/tree.Name" + ]; + sqlbase.TableDescriptor table = 2 [(gogoproto.nullable) = false]; + repeated Columns columns = 3 [(gogoproto.nullable) = false]; + string Statement = 4; +} + +message CreateStatsProgress { + repeated float sampler_progress = 1; +} + + message Payload { string description = 1; string username = 2; @@ -215,6 +235,7 @@ message Payload { SchemaChangeDetails schemaChange = 12; ImportDetails import = 13; ChangefeedDetails changefeed = 14; + CreateStatsDetails createStats = 15; } } @@ -232,6 +253,7 @@ message Progress { SchemaChangeProgress schemaChange = 12; ImportProgress import = 13; ChangefeedProgress changefeed = 14; + CreateStatsProgress createStats = 15; } } @@ -245,4 +267,5 @@ enum Type { SCHEMA_CHANGE = 3 [(gogoproto.enumvalue_customname) = "TypeSchemaChange"]; IMPORT = 4 [(gogoproto.enumvalue_customname) = "TypeImport"]; CHANGEFEED = 5 [(gogoproto.enumvalue_customname) = "TypeChangefeed"]; + CREATE_STATS = 6 [(gogoproto.enumvalue_customname) = "TypeCreateStats"]; } diff --git a/pkg/jobs/jobspb/wrap.go b/pkg/jobs/jobspb/wrap.go index a4f1f1334798..6c3448607c61 100644 --- a/pkg/jobs/jobspb/wrap.go +++ b/pkg/jobs/jobspb/wrap.go @@ -28,6 +28,7 @@ var _ Details = BackupDetails{} var _ Details = RestoreDetails{} var _ Details = SchemaChangeDetails{} var _ Details = ChangefeedDetails{} +var _ Details = CreateStatsDetails{} // ProgressDetails is a marker interface for job progress details proto structs. type ProgressDetails interface{} @@ -36,6 +37,7 @@ var _ ProgressDetails = BackupProgress{} var _ ProgressDetails = RestoreProgress{} var _ ProgressDetails = SchemaChangeProgress{} var _ ProgressDetails = ChangefeedProgress{} +var _ ProgressDetails = CreateStatsProgress{} // Type returns the payload's job type. func (p *Payload) Type() Type { @@ -55,6 +57,8 @@ func DetailsType(d isPayload_Details) Type { return TypeImport case *Payload_Changefeed: return TypeChangefeed + case *Payload_CreateStats: + return TypeCreateStats default: panic(fmt.Sprintf("Payload.Type called on a payload with an unknown details type: %T", d)) } @@ -79,6 +83,8 @@ func WrapProgressDetails(details ProgressDetails) interface { return &Progress_Import{Import: &d} case ChangefeedProgress: return &Progress_Changefeed{Changefeed: &d} + case CreateStatsProgress: + return &Progress_CreateStats{CreateStats: &d} default: panic(fmt.Sprintf("WrapProgressDetails: unknown details type %T", d)) } @@ -98,6 +104,8 @@ func (p *Payload) UnwrapDetails() Details { return *d.Import case *Payload_Changefeed: return *d.Changefeed + case *Payload_CreateStats: + return *d.CreateStats default: return nil } @@ -117,6 +125,8 @@ func (p *Progress) UnwrapDetails() ProgressDetails { return *d.Import case *Progress_Changefeed: return *d.Changefeed + case *Progress_CreateStats: + return *d.CreateStats default: return nil } @@ -149,6 +159,8 @@ func WrapPayloadDetails(details Details) interface { return &Payload_Import{Import: &d} case ChangefeedDetails: return &Payload_Changefeed{Changefeed: &d} + case CreateStatsDetails: + return &Payload_CreateStats{CreateStats: &d} default: panic(fmt.Sprintf("jobs.WrapPayloadDetails: unknown details type %T", d)) } @@ -195,5 +207,24 @@ func (d ImportProgress) Completed() float32 { return completed } +// Completed returns the total complete percent of processing this table. Since +// there are multiple distSQL processors running sampling, we assign slots to +// each one, and they are in charge of updating their portion of the progress. +func (d CreateStatsProgress) Completed() float32 { + sum := func(fs []float32) float32 { + var total float32 + for _, f := range fs { + total += f + } + return total + } + completed := sum(d.SamplerProgress) + // Float addition can round such that the sum is > 1. + if completed > 1 { + completed = 1 + } + return completed +} + // ChangefeedTargets is a set of id targets with metadata. type ChangefeedTargets map[sqlbase.ID]ChangefeedTarget diff --git a/pkg/sql/create_stats.go b/pkg/sql/create_stats.go index c00181ea6276..21ddada34a25 100644 --- a/pkg/sql/create_stats.go +++ b/pkg/sql/create_stats.go @@ -17,69 +17,96 @@ package sql import ( "context" - "github.com/cockroachdb/cockroach/pkg/sql/pgwire/pgerror" + "github.com/cockroachdb/cockroach/pkg/internal/client" + "github.com/cockroachdb/cockroach/pkg/jobs" + "github.com/cockroachdb/cockroach/pkg/jobs/jobspb" + "github.com/cockroachdb/cockroach/pkg/settings/cluster" "github.com/cockroachdb/cockroach/pkg/sql/privilege" "github.com/cockroachdb/cockroach/pkg/sql/sem/tree" "github.com/cockroachdb/cockroach/pkg/sql/sqlbase" "github.com/cockroachdb/cockroach/pkg/util" "github.com/pkg/errors" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) -type createStatsNode struct { - tree.CreateStats - tableDesc *sqlbase.ImmutableTableDescriptor - columns [][]sqlbase.ColumnID -} +// createStatsPlanHook implements PlanHookFn. +func createStatsPlanHook( + _ context.Context, stmt tree.Statement, ps PlanHookState, +) (fn PlanHookRowFn, header sqlbase.ResultColumns, subplans []planNode, err error) { + n, ok := stmt.(*tree.CreateStats) + if !ok { + return nil, nil, nil, nil + } -func (p *planner) CreateStatistics(ctx context.Context, n *tree.CreateStats) (planNode, error) { - var tableDesc *ImmutableTableDescriptor - var err error - switch t := n.Table.(type) { - case *tree.TableName: - // TODO(anyone): if CREATE STATISTICS is meant to be able to operate - // within a transaction, then the following should probably run with - // caching disabled, like other DDL statements. - tableDesc, err = ResolveExistingObject(ctx, p, t, true /*required*/, requireTableDesc) - if err != nil { - return nil, err + p := ps.(*planner) + fn = func(ctx context.Context, _ []PlanNode, resultsCh chan<- tree.Datums) error { + var tableDesc *ImmutableTableDescriptor + switch t := n.Table.(type) { + case *tree.TableName: + // TODO(anyone): if CREATE STATISTICS is meant to be able to operate + // within a transaction, then the following should probably run with + // caching disabled, like other DDL statements. + tableDesc, err = ResolveExistingObject(ctx, p, t, true /*required*/, requireTableDesc) + if err != nil { + return err + } + + case *tree.TableRef: + flags := ObjectLookupFlags{CommonLookupFlags: CommonLookupFlags{ + avoidCached: p.avoidCachedDescriptors, + }} + tableDesc, err = p.Tables().getTableVersionByID(ctx, p.txn, sqlbase.ID(t.TableID), flags) + if err != nil { + return err + } } - case *tree.TableRef: - flags := ObjectLookupFlags{CommonLookupFlags: CommonLookupFlags{ - avoidCached: p.avoidCachedDescriptors, - }} - tableDesc, err = p.Tables().getTableVersionByID(ctx, p.txn, sqlbase.ID(t.TableID), flags) - if err != nil { - return nil, err + if tableDesc.IsVirtualTable() { + return errors.Errorf("cannot create statistics on virtual tables") } - } - if tableDesc.IsVirtualTable() { - return nil, errors.Errorf("cannot create statistics on virtual tables") - } + if err := p.CheckPrivilege(ctx, tableDesc, privilege.SELECT); err != nil { + return err + } - if err := p.CheckPrivilege(ctx, tableDesc, privilege.SELECT); err != nil { - return nil, err - } + // Identify which columns we should create statistics for. + var createStatsColumns []jobspb.CreateStatsDetails_Columns + if len(n.ColumnNames) == 0 { + if createStatsColumns, err = createStatsDefaultColumns(tableDesc); err != nil { + return err + } + } else { + columns, err := tableDesc.FindActiveColumnsByNames(n.ColumnNames) + if err != nil { + return err + } - if len(n.ColumnNames) == 0 { - return createStatsDefaultColumns(n, tableDesc) - } + columnIDs := make([]sqlbase.ColumnID, len(columns)) + for i := range columns { + columnIDs[i] = columns[i].ID + } + createStatsColumns = []jobspb.CreateStatsDetails_Columns{{IDs: columnIDs}} + } - columns, err := tableDesc.FindActiveColumnsByNames(n.ColumnNames) - if err != nil { - return nil, err - } - columnIDs := make([]sqlbase.ColumnID, len(columns)) - for i := range columns { - columnIDs[i] = columns[i].ID + // Create a job to run statistics creation. + _, errCh, err := p.ExecCfg().JobRegistry.StartJob(ctx, resultsCh, jobs.Record{ + Description: tree.AsStringWithFlags(n, tree.FmtAlwaysQualifyTableNames), + Username: p.User(), + Details: jobspb.CreateStatsDetails{ + Name: n.Name, + Table: tableDesc.TableDescriptor, + Columns: createStatsColumns, + Statement: n.String(), + }, + Progress: jobspb.CreateStatsProgress{}, + }) + if err != nil { + return err + } + return <-errCh } - - return &createStatsNode{ - CreateStats: *n, - tableDesc: tableDesc, - columns: [][]sqlbase.ColumnID{columnIDs}, - }, nil + return fn, noColumns, nil, nil } // createStatsDefaultColumns creates column statistics on a default set of @@ -95,20 +122,16 @@ func (p *planner) CreateStatistics(ctx context.Context, n *tree.CreateStats) (pl // TODO(rytaft): This currently only generates one single-column stat per // index. Add code to collect multi-column stats once they are supported. func createStatsDefaultColumns( - n *tree.CreateStats, desc *ImmutableTableDescriptor, -) (planNode, error) { - pn := &createStatsNode{ - CreateStats: *n, - tableDesc: desc, - columns: make([][]sqlbase.ColumnID, 0, len(desc.Indexes)+1), - } + desc *ImmutableTableDescriptor, +) ([]jobspb.CreateStatsDetails_Columns, error) { + columns := make([]jobspb.CreateStatsDetails_Columns, 0, len(desc.Indexes)+1) var requestedCols util.FastIntSet // If the primary key is not the hidden rowid column, collect stats on it. pkCol := desc.PrimaryIndex.ColumnIDs[0] if !isHidden(desc, pkCol) { - pn.columns = append(pn.columns, []sqlbase.ColumnID{pkCol}) + columns = append(columns, jobspb.CreateStatsDetails_Columns{IDs: []sqlbase.ColumnID{pkCol}}) requestedCols.Add(int(pkCol)) } @@ -116,28 +139,32 @@ func createStatsDefaultColumns( for i := range desc.Indexes { idxCol := desc.Indexes[i].ColumnIDs[0] if !requestedCols.Contains(int(idxCol)) { - pn.columns = append(pn.columns, []sqlbase.ColumnID{idxCol}) + columns = append( + columns, jobspb.CreateStatsDetails_Columns{IDs: []sqlbase.ColumnID{idxCol}}, + ) requestedCols.Add(int(idxCol)) } } // If there are no non-hidden index columns, collect stats on the first // non-hidden column in the table. - if len(pn.columns) == 0 { + if len(columns) == 0 { for i := range desc.Columns { if !desc.Columns[i].IsHidden() { - pn.columns = append(pn.columns, []sqlbase.ColumnID{desc.Columns[i].ID}) + columns = append( + columns, jobspb.CreateStatsDetails_Columns{IDs: []sqlbase.ColumnID{desc.Columns[i].ID}}, + ) break } } } // If there are still no columns, return an error. - if len(pn.columns) == 0 { + if len(columns) == 0 { return nil, errors.New("CREATE STATISTICS called on a table with no visible columns") } - return pn, nil + return columns, nil } func isHidden(desc *ImmutableTableDescriptor, columnID sqlbase.ColumnID) bool { @@ -149,12 +176,112 @@ func isHidden(desc *ImmutableTableDescriptor, columnID sqlbase.ColumnID) bool { panic("column not found in table") } -func (*createStatsNode) startExec(runParams) error { - return pgerror.NewAssertionErrorf("createStatsNode cannot be executed locally") +type createStatsResumer struct { + evalCtx *extendedEvalContext +} + +var _ jobs.Resumer = &createStatsResumer{} + +// Resume is part of the jobs.Resumer interface. +func (r *createStatsResumer) Resume( + ctx context.Context, job *jobs.Job, phs interface{}, resultsCh chan<- tree.Datums, +) error { + // TODO(rytaft): If this job is for automatic stats creation, use the + // Job ID to lock automatic stats creation with a lock manager. If the + // lock succeeds, proceed to the next step (but first check the stats + // cache to make sure a new statistic was not just added for this table). + // If the lock fails, cancel this job and return an error. + + p := phs.(*planner) + r.evalCtx = p.ExtendedEvalContext() + + ci := sqlbase.ColTypeInfoFromColTypes([]sqlbase.ColumnType{}) + rows := sqlbase.NewRowContainer(r.evalCtx.Mon.MakeBoundAccount(), ci, 0) + defer func() { + if rows != nil { + rows.Close(ctx) + } + }() + + dsp := p.DistSQLPlanner() + err := r.evalCtx.ExecCfg.DB.Txn(ctx, func(ctx context.Context, txn *client.Txn) error { + if err := dsp.planAndRunCreateStats(ctx, r.evalCtx, txn, job, NewRowResultWriter(rows)); err != nil { + // Check if this was a context canceled error and restart if it was. + if s, ok := status.FromError(errors.Cause(err)); ok { + if s.Code() == codes.Canceled && s.Message() == context.Canceled.Error() { + return jobs.NewRetryJobError("node failure") + } + } + + // If the job was canceled, any of the distsql processors could have been + // the first to encounter the .Progress error. This error's string is sent + // through distsql back here, so we can't examine the err type in this case + // to see if it's a jobs.InvalidStatusError. Instead, attempt to update the + // job progress to coerce out the correct error type. If the update succeeds + // then return the original error, otherwise return this error instead so + // it can be cleaned up at a higher level. + if err := job.FractionProgressed(ctx, func(ctx context.Context, details jobspb.ProgressDetails) float32 { + d := details.(*jobspb.Progress_CreateStats).CreateStats + return d.Completed() + }); err != nil { + return err + } + return err + } + + return nil + }) + + return err +} + +// OnFailOrCancel is part of the jobs.Resumer interface. +func (r *createStatsResumer) OnFailOrCancel( + ctx context.Context, txn *client.Txn, job *jobs.Job, +) error { + return nil +} + +// OnSuccess is part of the jobs.Resumer interface. +func (r *createStatsResumer) OnSuccess(ctx context.Context, txn *client.Txn, job *jobs.Job) error { + details := job.Details().(jobspb.CreateStatsDetails) + // Record this statistics creation in the event log. + // TODO(rytaft): This creates a new transaction for the CREATE STATISTICS + // event. It must be different from the CREATE STATISTICS transaction, + // because that transaction must be read-only. In the future we may want + // to use the transaction that inserted the new stats into the + // system.table_statistics table, but that would require calling + // MakeEventLogger from the distsqlrun package. + return r.evalCtx.ExecCfg.DB.Txn(ctx, func(ctx context.Context, txn *client.Txn) error { + return MakeEventLogger(r.evalCtx.ExecCfg).InsertEventRecord( + ctx, + txn, + EventLogCreateStatistics, + int32(details.Table.ID), + int32(r.evalCtx.NodeID), + struct { + StatisticName string + Statement string + }{details.Name.String(), details.Statement}, + ) + }) +} + +// OnTerminal is part of the jobs.Resumer interface. +func (r *createStatsResumer) OnTerminal( + ctx context.Context, job *jobs.Job, status jobs.Status, resultsCh chan<- tree.Datums, +) { +} + +func createStatsResumeHook(typ jobspb.Type, settings *cluster.Settings) jobs.Resumer { + if typ != jobspb.TypeCreateStats { + return nil + } + + return &createStatsResumer{} } -func (*createStatsNode) Next(runParams) (bool, error) { - return false, pgerror.NewAssertionErrorf("createStatsNode cannot be executed locally") +func init() { + AddPlanHook(createStatsPlanHook) + jobs.AddResumeHook(createStatsResumeHook) } -func (*createStatsNode) Close(context.Context) {} -func (*createStatsNode) Values() tree.Datums { return nil } diff --git a/pkg/sql/distsql_physical_planner.go b/pkg/sql/distsql_physical_planner.go index bbbf7162206f..3f75bc5b4619 100644 --- a/pkg/sql/distsql_physical_planner.go +++ b/pkg/sql/distsql_physical_planner.go @@ -296,7 +296,6 @@ func (dsp *DistSQLPlanner) mustWrapNode(node planNode) bool { case *unionNode: case *valuesNode: case *virtualTableNode: - case *createStatsNode: case *projectSetNode: case *unaryNode: case *zeroNode: @@ -451,8 +450,6 @@ func (dsp *DistSQLPlanner) checkSupportForNode(node planNode) (distRecommendatio } } return canDistribute, nil - case *createStatsNode: - return shouldDistribute, nil case *insertNode, *updateNode, *deleteNode, *upsertNode: // This is a potential hot path. @@ -2355,8 +2352,6 @@ func (dsp *DistSQLPlanner) createPlanForNode( } else { plan, err = dsp.createPlanForValues(planCtx, n) } - case *createStatsNode: - plan, err = dsp.createPlanForCreateStats(planCtx, n) case *projectSetNode: plan, err = dsp.createPlanForProjectSet(planCtx, n) diff --git a/pkg/sql/distsql_plan_stats.go b/pkg/sql/distsql_plan_stats.go index c34e3547405a..561fa5d68a95 100644 --- a/pkg/sql/distsql_plan_stats.go +++ b/pkg/sql/distsql_plan_stats.go @@ -15,9 +15,18 @@ package sql import ( + "context" + + "github.com/cockroachdb/cockroach/pkg/internal/client" + "github.com/cockroachdb/cockroach/pkg/jobs" + "github.com/cockroachdb/cockroach/pkg/jobs/jobspb" "github.com/cockroachdb/cockroach/pkg/sql/distsqlpb" + "github.com/cockroachdb/cockroach/pkg/sql/distsqlplan" + "github.com/cockroachdb/cockroach/pkg/sql/sem/tree" "github.com/cockroachdb/cockroach/pkg/sql/sqlbase" "github.com/cockroachdb/cockroach/pkg/util" + "github.com/cockroachdb/cockroach/pkg/util/hlc" + "github.com/cockroachdb/cockroach/pkg/util/log/logtags" "github.com/pkg/errors" ) @@ -32,7 +41,10 @@ const histogramSamples = 10000 const histogramBuckets = 200 func (dsp *DistSQLPlanner) createStatsPlan( - planCtx *PlanningCtx, desc *sqlbase.ImmutableTableDescriptor, stats []requestedStat, + planCtx *PlanningCtx, + desc *sqlbase.ImmutableTableDescriptor, + stats []requestedStat, + job *jobs.Job, ) (PhysicalPlan, error) { if len(stats) == 0 { return PhysicalPlan{}, errors.New("no stats requested") @@ -131,13 +143,33 @@ func (dsp *DistSQLPlanner) createStatsPlan( // A BYTES column with the sketch data. outTypes = append(outTypes, sqlbase.ColumnType{SemanticType: sqlbase.ColumnType_BYTES}) - p.AddNoGroupingStage( - distsqlpb.ProcessorCoreUnion{Sampler: sampler}, + p.AddNoGroupingStageWithCoreFunc( + func(procIdx int, _ *distsqlplan.Processor) distsqlpb.ProcessorCoreUnion { + // TODO(rytaft): We could make the contribution estimate more precise by + // determining how many spans each processor is responsible for. + sampler.Progress = distsqlpb.JobProgress{ + JobID: *job.ID(), + Contribution: 1.0 / float32(len(p.ResultRouters)), + Slot: int32(procIdx), + } + return distsqlpb.ProcessorCoreUnion{Sampler: sampler} + }, distsqlpb.PostProcessSpec{}, outTypes, distsqlpb.Ordering{}, ) + // Prep the sampler progress tracking. + if err := job.FractionProgressed(planCtx.ctx, + func(ctx context.Context, progress jobspb.ProgressDetails) float32 { + prog := progress.(*jobspb.Progress_CreateStats).CreateStats + prog.SamplerProgress = make([]float32, len(p.ResultRouters)) + return prog.Completed() + }, + ); err != nil { + return PhysicalPlan{}, err + } + // Set up the final SampleAggregator stage. agg := &distsqlpb.SampleAggregatorSpec{ Sketches: sketchSpecs, @@ -161,17 +193,54 @@ func (dsp *DistSQLPlanner) createStatsPlan( } func (dsp *DistSQLPlanner) createPlanForCreateStats( - planCtx *PlanningCtx, n *createStatsNode, + planCtx *PlanningCtx, job *jobs.Job, ) (PhysicalPlan, error) { - stats := make([]requestedStat, len(n.columns)) + details := job.Details().(jobspb.CreateStatsDetails) + stats := make([]requestedStat, len(details.Columns)) for i := 0; i < len(stats); i++ { stats[i] = requestedStat{ - columns: n.columns[i], - histogram: len(n.columns[i]) == 1, + columns: details.Columns[i].IDs, + histogram: len(details.Columns[i].IDs) == 1, histogramMaxBuckets: histogramBuckets, - name: string(n.Name), + name: string(details.Name), } } - return dsp.createStatsPlan(planCtx, n.tableDesc, stats) + tableDesc := sqlbase.NewImmutableTableDescriptor(details.Table) + return dsp.createStatsPlan(planCtx, tableDesc, stats, job) +} + +func (dsp *DistSQLPlanner) planAndRunCreateStats( + ctx context.Context, + evalCtx *extendedEvalContext, + txn *client.Txn, + job *jobs.Job, + resultRows *RowResultWriter, +) error { + ctx = logtags.AddTag(ctx, "create-stats-distsql", nil) + planCtx := dsp.NewPlanningCtx(ctx, evalCtx, txn) + + physPlan, err := dsp.createPlanForCreateStats(planCtx, job) + if err != nil { + return err + } + + dsp.FinalizePlan(planCtx, &physPlan) + + recv := MakeDistSQLReceiver( + ctx, + resultRows, + tree.DDL, + evalCtx.ExecCfg.RangeDescriptorCache, + evalCtx.ExecCfg.LeaseHolderCache, + txn, + func(ts hlc.Timestamp) { + _ = evalCtx.ExecCfg.Clock.Update(ts) + }, + evalCtx.Tracing, + ) + defer recv.Release() + + dsp.Run(planCtx, txn, &physPlan, recv, evalCtx, nil /* finishedSetupFn */) + return resultRows.Err() } diff --git a/pkg/sql/distsql_running.go b/pkg/sql/distsql_running.go index a11601f97a7e..e2688b29f3c7 100644 --- a/pkg/sql/distsql_running.go +++ b/pkg/sql/distsql_running.go @@ -791,41 +791,4 @@ func (dsp *DistSQLPlanner) PlanAndRun( } dsp.FinalizePlan(planCtx, &physPlan) dsp.Run(planCtx, txn, &physPlan, recv, evalCtx, nil /* finishedSetupFn */) - if recv.resultWriter.Err() == nil { - if err := dsp.logEvents(ctx, evalCtx, plan); err != nil { - recv.SetError(err) - return - } - } -} - -// logEvents logs events in the system.eventlog table for successful completion -// of some types of operations. -func (dsp *DistSQLPlanner) logEvents( - ctx context.Context, evalCtx *extendedEvalContext, plan planNode, -) error { - switch n := plan.(type) { - case *createStatsNode: - // Record this statistics creation in the event log. - // TODO(rytaft): This creates a new transaction for the CREATE STATISTICS - // event. It must be different from the CREATE STATISTICS transaction, - // because that transaction must be read-only. In the future we may want - // to use the transaction that inserted the new stats into the - // system.table_statistics table, but that would require calling - // MakeEventLogger from the distsqlrun package. - return evalCtx.ExecCfg.DB.Txn(ctx, func(ctx context.Context, txn *client.Txn) error { - return MakeEventLogger(evalCtx.ExecCfg).InsertEventRecord( - ctx, - txn, - EventLogCreateStatistics, - int32(n.tableDesc.ID), - int32(evalCtx.NodeID), - struct { - StatisticName string - Statement string - }{n.Name.String(), n.String()}, - ) - }) - } - return nil } diff --git a/pkg/sql/distsqlpb/processors.pb.go b/pkg/sql/distsqlpb/processors.pb.go index 1ea140912eb8..243ed3c6c948 100644 --- a/pkg/sql/distsqlpb/processors.pb.go +++ b/pkg/sql/distsqlpb/processors.pb.go @@ -67,7 +67,7 @@ func (x *ScanVisibility) UnmarshalJSON(data []byte) error { return nil } func (ScanVisibility) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{0} + return fileDescriptor_processors_09f45ab44326c600, []int{0} } type SketchType int32 @@ -102,7 +102,7 @@ func (x *SketchType) UnmarshalJSON(data []byte) error { return nil } func (SketchType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{1} + return fileDescriptor_processors_09f45ab44326c600, []int{1} } // These mirror the aggregate functions supported by sql/parser. See @@ -198,7 +198,7 @@ func (x *AggregatorSpec_Func) UnmarshalJSON(data []byte) error { return nil } func (AggregatorSpec_Func) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{17, 0} + return fileDescriptor_processors_09f45ab44326c600, []int{17, 0} } type AggregatorSpec_Type int32 @@ -244,7 +244,7 @@ func (x *AggregatorSpec_Type) UnmarshalJSON(data []byte) error { return nil } func (AggregatorSpec_Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{17, 1} + return fileDescriptor_processors_09f45ab44326c600, []int{17, 1} } type BackfillerSpec_Type int32 @@ -283,7 +283,7 @@ func (x *BackfillerSpec_Type) UnmarshalJSON(data []byte) error { return nil } func (BackfillerSpec_Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{18, 0} + return fileDescriptor_processors_09f45ab44326c600, []int{18, 0} } type WindowerSpec_WindowFunc int32 @@ -347,7 +347,7 @@ func (x *WindowerSpec_WindowFunc) UnmarshalJSON(data []byte) error { return nil } func (WindowerSpec_WindowFunc) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{29, 0} + return fileDescriptor_processors_09f45ab44326c600, []int{29, 0} } // Mode indicates which mode of framing is used. @@ -391,7 +391,7 @@ func (x *WindowerSpec_Frame_Mode) UnmarshalJSON(data []byte) error { return nil } func (WindowerSpec_Frame_Mode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{29, 1, 0} + return fileDescriptor_processors_09f45ab44326c600, []int{29, 1, 0} } // BoundType indicates which type of boundary is used. @@ -438,7 +438,7 @@ func (x *WindowerSpec_Frame_BoundType) UnmarshalJSON(data []byte) error { return nil } func (WindowerSpec_Frame_BoundType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{29, 1, 1} + return fileDescriptor_processors_09f45ab44326c600, []int{29, 1, 1} } // Each processor has the following components: @@ -487,7 +487,7 @@ func (m *ProcessorSpec) Reset() { *m = ProcessorSpec{} } func (m *ProcessorSpec) String() string { return proto.CompactTextString(m) } func (*ProcessorSpec) ProtoMessage() {} func (*ProcessorSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{0} + return fileDescriptor_processors_09f45ab44326c600, []int{0} } func (m *ProcessorSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -548,7 +548,7 @@ func (m *PostProcessSpec) Reset() { *m = PostProcessSpec{} } func (m *PostProcessSpec) String() string { return proto.CompactTextString(m) } func (*PostProcessSpec) ProtoMessage() {} func (*PostProcessSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{1} + return fileDescriptor_processors_09f45ab44326c600, []int{1} } func (m *PostProcessSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -606,7 +606,7 @@ func (m *ProcessorCoreUnion) Reset() { *m = ProcessorCoreUnion{} } func (m *ProcessorCoreUnion) String() string { return proto.CompactTextString(m) } func (*ProcessorCoreUnion) ProtoMessage() {} func (*ProcessorCoreUnion) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{2} + return fileDescriptor_processors_09f45ab44326c600, []int{2} } func (m *ProcessorCoreUnion) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -643,7 +643,7 @@ func (m *NoopCoreSpec) Reset() { *m = NoopCoreSpec{} } func (m *NoopCoreSpec) String() string { return proto.CompactTextString(m) } func (*NoopCoreSpec) ProtoMessage() {} func (*NoopCoreSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{3} + return fileDescriptor_processors_09f45ab44326c600, []int{3} } func (m *NoopCoreSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -678,7 +678,7 @@ func (m *MetadataTestSenderSpec) Reset() { *m = MetadataTestSenderSpec{} func (m *MetadataTestSenderSpec) String() string { return proto.CompactTextString(m) } func (*MetadataTestSenderSpec) ProtoMessage() {} func (*MetadataTestSenderSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{4} + return fileDescriptor_processors_09f45ab44326c600, []int{4} } func (m *MetadataTestSenderSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -713,7 +713,7 @@ func (m *MetadataTestReceiverSpec) Reset() { *m = MetadataTestReceiverSp func (m *MetadataTestReceiverSpec) String() string { return proto.CompactTextString(m) } func (*MetadataTestReceiverSpec) ProtoMessage() {} func (*MetadataTestReceiverSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{5} + return fileDescriptor_processors_09f45ab44326c600, []int{5} } func (m *MetadataTestReceiverSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -757,7 +757,7 @@ func (m *ValuesCoreSpec) Reset() { *m = ValuesCoreSpec{} } func (m *ValuesCoreSpec) String() string { return proto.CompactTextString(m) } func (*ValuesCoreSpec) ProtoMessage() {} func (*ValuesCoreSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{6} + return fileDescriptor_processors_09f45ab44326c600, []int{6} } func (m *ValuesCoreSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -795,7 +795,7 @@ func (m *TableReaderSpan) Reset() { *m = TableReaderSpan{} } func (m *TableReaderSpan) String() string { return proto.CompactTextString(m) } func (*TableReaderSpan) ProtoMessage() {} func (*TableReaderSpan) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{7} + return fileDescriptor_processors_09f45ab44326c600, []int{7} } func (m *TableReaderSpan) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -865,7 +865,7 @@ func (m *TableReaderSpec) Reset() { *m = TableReaderSpec{} } func (m *TableReaderSpec) String() string { return proto.CompactTextString(m) } func (*TableReaderSpec) ProtoMessage() {} func (*TableReaderSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{8} + return fileDescriptor_processors_09f45ab44326c600, []int{8} } func (m *TableReaderSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -950,7 +950,7 @@ func (m *JoinReaderSpec) Reset() { *m = JoinReaderSpec{} } func (m *JoinReaderSpec) String() string { return proto.CompactTextString(m) } func (*JoinReaderSpec) ProtoMessage() {} func (*JoinReaderSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{9} + return fileDescriptor_processors_09f45ab44326c600, []int{9} } func (m *JoinReaderSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -996,7 +996,7 @@ func (m *SorterSpec) Reset() { *m = SorterSpec{} } func (m *SorterSpec) String() string { return proto.CompactTextString(m) } func (*SorterSpec) ProtoMessage() {} func (*SorterSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{10} + return fileDescriptor_processors_09f45ab44326c600, []int{10} } func (m *SorterSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1042,7 +1042,7 @@ func (m *DistinctSpec) Reset() { *m = DistinctSpec{} } func (m *DistinctSpec) String() string { return proto.CompactTextString(m) } func (*DistinctSpec) ProtoMessage() {} func (*DistinctSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{11} + return fileDescriptor_processors_09f45ab44326c600, []int{11} } func (m *DistinctSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1100,7 +1100,7 @@ func (m *ZigzagJoinerSpec) Reset() { *m = ZigzagJoinerSpec{} } func (m *ZigzagJoinerSpec) String() string { return proto.CompactTextString(m) } func (*ZigzagJoinerSpec) ProtoMessage() {} func (*ZigzagJoinerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{12} + return fileDescriptor_processors_09f45ab44326c600, []int{12} } func (m *ZigzagJoinerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1144,7 +1144,7 @@ func (m *LocalPlanNodeSpec) Reset() { *m = LocalPlanNodeSpec{} } func (m *LocalPlanNodeSpec) String() string { return proto.CompactTextString(m) } func (*LocalPlanNodeSpec) ProtoMessage() {} func (*LocalPlanNodeSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{13} + return fileDescriptor_processors_09f45ab44326c600, []int{13} } func (m *LocalPlanNodeSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1179,7 +1179,7 @@ func (m *Columns) Reset() { *m = Columns{} } func (m *Columns) String() string { return proto.CompactTextString(m) } func (*Columns) ProtoMessage() {} func (*Columns) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{14} + return fileDescriptor_processors_09f45ab44326c600, []int{14} } func (m *Columns) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1249,7 +1249,7 @@ func (m *MergeJoinerSpec) Reset() { *m = MergeJoinerSpec{} } func (m *MergeJoinerSpec) String() string { return proto.CompactTextString(m) } func (*MergeJoinerSpec) ProtoMessage() {} func (*MergeJoinerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{15} + return fileDescriptor_processors_09f45ab44326c600, []int{15} } func (m *MergeJoinerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1338,7 +1338,7 @@ func (m *HashJoinerSpec) Reset() { *m = HashJoinerSpec{} } func (m *HashJoinerSpec) String() string { return proto.CompactTextString(m) } func (*HashJoinerSpec) ProtoMessage() {} func (*HashJoinerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{16} + return fileDescriptor_processors_09f45ab44326c600, []int{16} } func (m *HashJoinerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1386,7 +1386,7 @@ func (m *AggregatorSpec) Reset() { *m = AggregatorSpec{} } func (m *AggregatorSpec) String() string { return proto.CompactTextString(m) } func (*AggregatorSpec) ProtoMessage() {} func (*AggregatorSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{17} + return fileDescriptor_processors_09f45ab44326c600, []int{17} } func (m *AggregatorSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1439,7 +1439,7 @@ func (m *AggregatorSpec_Aggregation) Reset() { *m = AggregatorSpec_Aggre func (m *AggregatorSpec_Aggregation) String() string { return proto.CompactTextString(m) } func (*AggregatorSpec_Aggregation) ProtoMessage() {} func (*AggregatorSpec_Aggregation) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{17, 0} + return fileDescriptor_processors_09f45ab44326c600, []int{17, 0} } func (m *AggregatorSpec_Aggregation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1499,7 +1499,7 @@ func (m *BackfillerSpec) Reset() { *m = BackfillerSpec{} } func (m *BackfillerSpec) String() string { return proto.CompactTextString(m) } func (*BackfillerSpec) ProtoMessage() {} func (*BackfillerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{18} + return fileDescriptor_processors_09f45ab44326c600, []int{18} } func (m *BackfillerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1539,7 +1539,7 @@ func (m *FlowSpec) Reset() { *m = FlowSpec{} } func (m *FlowSpec) String() string { return proto.CompactTextString(m) } func (*FlowSpec) ProtoMessage() {} func (*FlowSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{19} + return fileDescriptor_processors_09f45ab44326c600, []int{19} } func (m *FlowSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1581,7 +1581,7 @@ func (m *JobProgress) Reset() { *m = JobProgress{} } func (m *JobProgress) String() string { return proto.CompactTextString(m) } func (*JobProgress) ProtoMessage() {} func (*JobProgress) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{20} + return fileDescriptor_processors_09f45ab44326c600, []int{20} } func (m *JobProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1635,7 +1635,7 @@ func (m *ReadImportDataSpec) Reset() { *m = ReadImportDataSpec{} } func (m *ReadImportDataSpec) String() string { return proto.CompactTextString(m) } func (*ReadImportDataSpec) ProtoMessage() {} func (*ReadImportDataSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{21} + return fileDescriptor_processors_09f45ab44326c600, []int{21} } func (m *ReadImportDataSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1682,7 +1682,7 @@ func (m *SSTWriterSpec) Reset() { *m = SSTWriterSpec{} } func (m *SSTWriterSpec) String() string { return proto.CompactTextString(m) } func (*SSTWriterSpec) ProtoMessage() {} func (*SSTWriterSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{22} + return fileDescriptor_processors_09f45ab44326c600, []int{22} } func (m *SSTWriterSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1720,7 +1720,7 @@ func (m *SSTWriterSpec_SpanName) Reset() { *m = SSTWriterSpec_SpanName{} func (m *SSTWriterSpec_SpanName) String() string { return proto.CompactTextString(m) } func (*SSTWriterSpec_SpanName) ProtoMessage() {} func (*SSTWriterSpec_SpanName) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{22, 0} + return fileDescriptor_processors_09f45ab44326c600, []int{22, 0} } func (m *SSTWriterSpec_SpanName) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1764,7 +1764,7 @@ func (m *CSVWriterSpec) Reset() { *m = CSVWriterSpec{} } func (m *CSVWriterSpec) String() string { return proto.CompactTextString(m) } func (*CSVWriterSpec) ProtoMessage() {} func (*CSVWriterSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{23} + return fileDescriptor_processors_09f45ab44326c600, []int{23} } func (m *CSVWriterSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1811,7 +1811,7 @@ func (m *SketchSpec) Reset() { *m = SketchSpec{} } func (m *SketchSpec) String() string { return proto.CompactTextString(m) } func (*SketchSpec) ProtoMessage() {} func (*SketchSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{24} + return fileDescriptor_processors_09f45ab44326c600, []int{24} } func (m *SketchSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1868,17 +1868,19 @@ var xxx_messageInfo_SketchSpec proto.InternalMessageInfo // Rows have NULLs on either all the sampled row columns or on all the // sketch columns. type SamplerSpec struct { - Sketches []SketchSpec `protobuf:"bytes,1,rep,name=sketches" json:"sketches"` - SampleSize uint32 `protobuf:"varint,2,opt,name=sample_size,json=sampleSize" json:"sample_size"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_sizecache int32 `json:"-"` + Sketches []SketchSpec `protobuf:"bytes,1,rep,name=sketches" json:"sketches"` + SampleSize uint32 `protobuf:"varint,2,opt,name=sample_size,json=sampleSize" json:"sample_size"` + // Records progress of the CREATE STATISTICS job. + Progress JobProgress `protobuf:"bytes,9,opt,name=progress" json:"progress"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *SamplerSpec) Reset() { *m = SamplerSpec{} } func (m *SamplerSpec) String() string { return proto.CompactTextString(m) } func (*SamplerSpec) ProtoMessage() {} func (*SamplerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{25} + return fileDescriptor_processors_09f45ab44326c600, []int{25} } func (m *SamplerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1935,7 +1937,7 @@ func (m *SampleAggregatorSpec) Reset() { *m = SampleAggregatorSpec{} } func (m *SampleAggregatorSpec) String() string { return proto.CompactTextString(m) } func (*SampleAggregatorSpec) ProtoMessage() {} func (*SampleAggregatorSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{26} + return fileDescriptor_processors_09f45ab44326c600, []int{26} } func (m *SampleAggregatorSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2000,7 +2002,7 @@ func (m *InterleavedReaderJoinerSpec) Reset() { *m = InterleavedReaderJo func (m *InterleavedReaderJoinerSpec) String() string { return proto.CompactTextString(m) } func (*InterleavedReaderJoinerSpec) ProtoMessage() {} func (*InterleavedReaderJoinerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{27} + return fileDescriptor_processors_09f45ab44326c600, []int{27} } func (m *InterleavedReaderJoinerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2058,7 +2060,7 @@ func (m *InterleavedReaderJoinerSpec_Table) Reset() { *m = InterleavedRe func (m *InterleavedReaderJoinerSpec_Table) String() string { return proto.CompactTextString(m) } func (*InterleavedReaderJoinerSpec_Table) ProtoMessage() {} func (*InterleavedReaderJoinerSpec_Table) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{27, 0} + return fileDescriptor_processors_09f45ab44326c600, []int{27, 0} } func (m *InterleavedReaderJoinerSpec_Table) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2100,7 +2102,7 @@ func (m *ProjectSetSpec) Reset() { *m = ProjectSetSpec{} } func (m *ProjectSetSpec) String() string { return proto.CompactTextString(m) } func (*ProjectSetSpec) ProtoMessage() {} func (*ProjectSetSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{28} + return fileDescriptor_processors_09f45ab44326c600, []int{28} } func (m *ProjectSetSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2144,7 +2146,7 @@ func (m *WindowerSpec) Reset() { *m = WindowerSpec{} } func (m *WindowerSpec) String() string { return proto.CompactTextString(m) } func (*WindowerSpec) ProtoMessage() {} func (*WindowerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{29} + return fileDescriptor_processors_09f45ab44326c600, []int{29} } func (m *WindowerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2182,7 +2184,7 @@ func (m *WindowerSpec_Func) Reset() { *m = WindowerSpec_Func{} } func (m *WindowerSpec_Func) String() string { return proto.CompactTextString(m) } func (*WindowerSpec_Func) ProtoMessage() {} func (*WindowerSpec_Func) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{29, 0} + return fileDescriptor_processors_09f45ab44326c600, []int{29, 0} } func (m *WindowerSpec_Func) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2219,7 +2221,7 @@ func (m *WindowerSpec_Frame) Reset() { *m = WindowerSpec_Frame{} } func (m *WindowerSpec_Frame) String() string { return proto.CompactTextString(m) } func (*WindowerSpec_Frame) ProtoMessage() {} func (*WindowerSpec_Frame) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{29, 1} + return fileDescriptor_processors_09f45ab44326c600, []int{29, 1} } func (m *WindowerSpec_Frame) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2261,7 +2263,7 @@ func (m *WindowerSpec_Frame_Bound) Reset() { *m = WindowerSpec_Frame_Bou func (m *WindowerSpec_Frame_Bound) String() string { return proto.CompactTextString(m) } func (*WindowerSpec_Frame_Bound) ProtoMessage() {} func (*WindowerSpec_Frame_Bound) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{29, 1, 0} + return fileDescriptor_processors_09f45ab44326c600, []int{29, 1, 0} } func (m *WindowerSpec_Frame_Bound) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2299,7 +2301,7 @@ func (m *WindowerSpec_Frame_Bounds) Reset() { *m = WindowerSpec_Frame_Bo func (m *WindowerSpec_Frame_Bounds) String() string { return proto.CompactTextString(m) } func (*WindowerSpec_Frame_Bounds) ProtoMessage() {} func (*WindowerSpec_Frame_Bounds) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{29, 1, 1} + return fileDescriptor_processors_09f45ab44326c600, []int{29, 1, 1} } func (m *WindowerSpec_Frame_Bounds) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2349,7 +2351,7 @@ func (m *WindowerSpec_WindowFn) Reset() { *m = WindowerSpec_WindowFn{} } func (m *WindowerSpec_WindowFn) String() string { return proto.CompactTextString(m) } func (*WindowerSpec_WindowFn) ProtoMessage() {} func (*WindowerSpec_WindowFn) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{29, 2} + return fileDescriptor_processors_09f45ab44326c600, []int{29, 2} } func (m *WindowerSpec_WindowFn) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2388,7 +2390,7 @@ func (m *ChangeAggregatorSpec) Reset() { *m = ChangeAggregatorSpec{} } func (m *ChangeAggregatorSpec) String() string { return proto.CompactTextString(m) } func (*ChangeAggregatorSpec) ProtoMessage() {} func (*ChangeAggregatorSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{30} + return fileDescriptor_processors_09f45ab44326c600, []int{30} } func (m *ChangeAggregatorSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2424,7 +2426,7 @@ func (m *ChangeAggregatorSpec_Watch) Reset() { *m = ChangeAggregatorSpec func (m *ChangeAggregatorSpec_Watch) String() string { return proto.CompactTextString(m) } func (*ChangeAggregatorSpec_Watch) ProtoMessage() {} func (*ChangeAggregatorSpec_Watch) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{30, 0} + return fileDescriptor_processors_09f45ab44326c600, []int{30, 0} } func (m *ChangeAggregatorSpec_Watch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2469,7 +2471,7 @@ func (m *ChangeFrontierSpec) Reset() { *m = ChangeFrontierSpec{} } func (m *ChangeFrontierSpec) String() string { return proto.CompactTextString(m) } func (*ChangeFrontierSpec) ProtoMessage() {} func (*ChangeFrontierSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{31} + return fileDescriptor_processors_09f45ab44326c600, []int{31} } func (m *ChangeFrontierSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4124,6 +4126,14 @@ func (m *SamplerSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x10 i++ i = encodeVarintProcessors(dAtA, i, uint64(m.SampleSize)) + dAtA[i] = 0x4a + i++ + i = encodeVarintProcessors(dAtA, i, uint64(m.Progress.Size())) + n63, err := m.Progress.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n63 return i, nil } @@ -4211,11 +4221,11 @@ func (m *InterleavedReaderJoinerSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintProcessors(dAtA, i, uint64(m.OnExpr.Size())) - n63, err := m.OnExpr.MarshalTo(dAtA[i:]) + n64, err := m.OnExpr.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n63 + i += n64 dAtA[i] = 0x28 i++ i = encodeVarintProcessors(dAtA, i, uint64(m.Type)) @@ -4240,30 +4250,30 @@ func (m *InterleavedReaderJoinerSpec_Table) MarshalTo(dAtA []byte) (int, error) dAtA[i] = 0xa i++ i = encodeVarintProcessors(dAtA, i, uint64(m.Desc.Size())) - n64, err := m.Desc.MarshalTo(dAtA[i:]) + n65, err := m.Desc.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n64 + i += n65 dAtA[i] = 0x10 i++ i = encodeVarintProcessors(dAtA, i, uint64(m.IndexIdx)) dAtA[i] = 0x1a i++ i = encodeVarintProcessors(dAtA, i, uint64(m.Post.Size())) - n65, err := m.Post.MarshalTo(dAtA[i:]) + n66, err := m.Post.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n65 + i += n66 dAtA[i] = 0x22 i++ i = encodeVarintProcessors(dAtA, i, uint64(m.Ordering.Size())) - n66, err := m.Ordering.MarshalTo(dAtA[i:]) + n67, err := m.Ordering.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n66 + i += n67 if len(m.Spans) > 0 { for _, msg := range m.Spans { dAtA[i] = 0x2a @@ -4414,11 +4424,11 @@ func (m *WindowerSpec_Frame) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintProcessors(dAtA, i, uint64(m.Bounds.Size())) - n67, err := m.Bounds.MarshalTo(dAtA[i:]) + n68, err := m.Bounds.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n67 + i += n68 return i, nil } @@ -4452,11 +4462,11 @@ func (m *WindowerSpec_Frame_Bound) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintProcessors(dAtA, i, uint64(m.OffsetType.Size())) - n68, err := m.OffsetType.MarshalTo(dAtA[i:]) + n69, err := m.OffsetType.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n68 + i += n69 return i, nil } @@ -4478,20 +4488,20 @@ func (m *WindowerSpec_Frame_Bounds) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintProcessors(dAtA, i, uint64(m.Start.Size())) - n69, err := m.Start.MarshalTo(dAtA[i:]) + n70, err := m.Start.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n69 + i += n70 if m.End != nil { dAtA[i] = 0x12 i++ i = encodeVarintProcessors(dAtA, i, uint64(m.End.Size())) - n70, err := m.End.MarshalTo(dAtA[i:]) + n71, err := m.End.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n70 + i += n71 } return i, nil } @@ -4514,11 +4524,11 @@ func (m *WindowerSpec_WindowFn) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintProcessors(dAtA, i, uint64(m.Func.Size())) - n71, err := m.Func.MarshalTo(dAtA[i:]) + n72, err := m.Func.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n71 + i += n72 dAtA[i] = 0x10 i++ i = encodeVarintProcessors(dAtA, i, uint64(m.ArgIdxStart)) @@ -4528,20 +4538,20 @@ func (m *WindowerSpec_WindowFn) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintProcessors(dAtA, i, uint64(m.Ordering.Size())) - n72, err := m.Ordering.MarshalTo(dAtA[i:]) + n73, err := m.Ordering.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n72 + i += n73 if m.Frame != nil { dAtA[i] = 0x2a i++ i = encodeVarintProcessors(dAtA, i, uint64(m.Frame.Size())) - n73, err := m.Frame.MarshalTo(dAtA[i:]) + n74, err := m.Frame.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n73 + i += n74 } dAtA[i] = 0x30 i++ @@ -4579,11 +4589,11 @@ func (m *ChangeAggregatorSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintProcessors(dAtA, i, uint64(m.Feed.Size())) - n74, err := m.Feed.MarshalTo(dAtA[i:]) + n75, err := m.Feed.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n74 + i += n75 return i, nil } @@ -4605,19 +4615,19 @@ func (m *ChangeAggregatorSpec_Watch) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintProcessors(dAtA, i, uint64(m.InitialResolved.Size())) - n75, err := m.InitialResolved.MarshalTo(dAtA[i:]) + n76, err := m.InitialResolved.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n75 + i += n76 dAtA[i] = 0x12 i++ i = encodeVarintProcessors(dAtA, i, uint64(m.Span.Size())) - n76, err := m.Span.MarshalTo(dAtA[i:]) + n77, err := m.Span.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n76 + i += n77 return i, nil } @@ -4651,11 +4661,11 @@ func (m *ChangeFrontierSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintProcessors(dAtA, i, uint64(m.Feed.Size())) - n77, err := m.Feed.MarshalTo(dAtA[i:]) + n78, err := m.Feed.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n77 + i += n78 dAtA[i] = 0x18 i++ i = encodeVarintProcessors(dAtA, i, uint64(m.JobID)) @@ -5327,6 +5337,8 @@ func (m *SamplerSpec) Size() (n int) { } } n += 1 + sovProcessors(uint64(m.SampleSize)) + l = m.Progress.Size() + n += 1 + l + sovProcessors(uint64(l)) return n } @@ -11238,6 +11250,36 @@ func (m *SamplerSpec) Unmarshal(dAtA []byte) error { break } } + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Progress", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProcessors + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProcessors + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Progress.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipProcessors(dAtA[iNdEx:]) @@ -13257,262 +13299,263 @@ var ( ) func init() { - proto.RegisterFile("sql/distsqlpb/processors.proto", fileDescriptor_processors_70a1db6f0e60b948) + proto.RegisterFile("sql/distsqlpb/processors.proto", fileDescriptor_processors_09f45ab44326c600) } -var fileDescriptor_processors_70a1db6f0e60b948 = []byte{ - // 4047 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0x3d, 0x70, 0x1b, 0x59, - 0x72, 0x16, 0x80, 0xc1, 0x5f, 0xe3, 0x87, 0xb3, 0x4f, 0xd4, 0x0a, 0xcb, 0x5d, 0x8b, 0xd2, 0xec, +var fileDescriptor_processors_09f45ab44326c600 = []byte{ + // 4052 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0x3d, 0x70, 0x1b, 0x49, + 0x76, 0x16, 0x80, 0xc1, 0xdf, 0xc3, 0x0f, 0x67, 0x5b, 0xd4, 0x0a, 0xcb, 0x5d, 0x8b, 0xd2, 0xec, 0xde, 0xea, 0xe7, 0xf6, 0xc8, 0x93, 0x76, 0x7d, 0x77, 0xbb, 0x77, 0xe7, 0x35, 0x7e, 0xa9, 0xa1, - 0x40, 0x80, 0x37, 0x00, 0xa4, 0xdd, 0xab, 0x72, 0x4d, 0x0d, 0x30, 0x8f, 0xe0, 0x88, 0x83, 0x79, - 0xd0, 0xcc, 0x40, 0x24, 0xe5, 0xc0, 0x89, 0x9d, 0xd8, 0xc9, 0x95, 0xcb, 0x91, 0xcb, 0x81, 0x93, - 0x0b, 0x9d, 0x38, 0x70, 0xe2, 0xc4, 0x81, 0xcb, 0xde, 0xc0, 0xc1, 0x25, 0xae, 0xb2, 0x1d, 0xa8, - 0x7c, 0x74, 0x60, 0x97, 0x73, 0x57, 0xd9, 0x17, 0xb9, 0xde, 0xcf, 0x0c, 0x06, 0x20, 0x41, 0x90, - 0x94, 0xea, 0x2e, 0x21, 0x31, 0xfd, 0xba, 0xbf, 0xe9, 0xd7, 0xaf, 0x5f, 0xbf, 0xee, 0x7e, 0x03, - 0xb7, 0xbc, 0x17, 0xf6, 0xa6, 0x69, 0x79, 0xbe, 0xf7, 0xc2, 0x1e, 0xf7, 0x37, 0xc7, 0x2e, 0x19, - 0x60, 0xcf, 0x23, 0xae, 0xb7, 0x31, 0x76, 0x89, 0x4f, 0xd0, 0xcd, 0x01, 0x19, 0x1c, 0xb8, 0xc4, - 0x18, 0xec, 0x6f, 0x78, 0x2f, 0xec, 0x8d, 0x90, 0x73, 0xed, 0xdd, 0xe7, 0xa4, 0xef, 0x6d, 0xd2, - 0x3f, 0xe3, 0x3e, 0xfb, 0xc7, 0x05, 0xd6, 0x10, 0x63, 0x1e, 0xf7, 0x37, 0x4d, 0xc3, 0x37, 0x04, - 0xad, 0x14, 0xd0, 0x2c, 0xf2, 0x9d, 0x3d, 0xe2, 0x8e, 0x0c, 0x3f, 0xe0, 0xfe, 0x80, 0xbe, 0xde, - 0x7b, 0x61, 0xf7, 0x0d, 0x0f, 0x6f, 0x7a, 0xbe, 0x3b, 0x19, 0xf8, 0x13, 0x17, 0x9b, 0x62, 0xf4, - 0xfd, 0xe8, 0xe8, 0x73, 0x62, 0x39, 0xba, 0x7f, 0x3c, 0xc6, 0x01, 0xe8, 0xac, 0xe6, 0xd1, 0xd7, - 0x4d, 0x7c, 0xcb, 0xde, 0xdc, 0xb7, 0x07, 0x9b, 0xbe, 0x35, 0xc2, 0x9e, 0x6f, 0x8c, 0xc6, 0x62, - 0x64, 0x75, 0x48, 0x86, 0x84, 0xfd, 0xdc, 0xa4, 0xbf, 0x38, 0x55, 0xf9, 0x93, 0x04, 0x14, 0x76, - 0x83, 0x89, 0x77, 0xc6, 0x78, 0x80, 0x2a, 0x90, 0xb4, 0x9c, 0xf1, 0xc4, 0x2f, 0xc5, 0x6e, 0x27, - 0xee, 0xe5, 0x1e, 0x7d, 0xbc, 0xb1, 0xc0, 0x0a, 0x1b, 0x2a, 0xe5, 0xea, 0x1c, 0x3b, 0x03, 0x2a, - 0x56, 0x91, 0xbe, 0x79, 0xbd, 0x7e, 0x4d, 0xe3, 0xa2, 0xa8, 0x0e, 0xd2, 0x80, 0xb8, 0xb8, 0x14, - 0xbf, 0x1d, 0xbb, 0x97, 0x7b, 0xf4, 0xed, 0x85, 0x10, 0xe1, 0x9b, 0xab, 0xc4, 0xc5, 0x3d, 0xc7, - 0x22, 0x8e, 0xc0, 0x61, 0xe2, 0x68, 0x0b, 0x52, 0x64, 0xe2, 0x53, 0x5d, 0x12, 0x4c, 0x97, 0xfb, - 0x0b, 0x81, 0xda, 0x8c, 0x4d, 0x23, 0x13, 0x1f, 0xbb, 0x11, 0x75, 0x84, 0x38, 0xaa, 0x80, 0x34, - 0x26, 0x9e, 0x5f, 0x92, 0x98, 0x3e, 0xf7, 0x16, 0xeb, 0x43, 0x3c, 0x5f, 0xe8, 0x14, 0x41, 0x61, - 0xb2, 0xe8, 0x01, 0x64, 0x3c, 0xdf, 0x18, 0x62, 0xdd, 0x32, 0x4b, 0xc9, 0xdb, 0xb1, 0x7b, 0xc9, - 0xca, 0x0a, 0x1d, 0x3d, 0x79, 0xbd, 0x9e, 0xee, 0x50, 0xba, 0x5a, 0xd3, 0xd2, 0x8c, 0x41, 0x35, - 0xd1, 0xf7, 0x20, 0x1f, 0x7a, 0x13, 0xe5, 0x4f, 0x31, 0xfe, 0xeb, 0x82, 0x3f, 0x17, 0x4e, 0x5b, - 0xad, 0x69, 0xb9, 0x90, 0x51, 0x35, 0x95, 0xbf, 0x8a, 0xc3, 0xca, 0x9c, 0x0e, 0xa8, 0x0c, 0xa9, - 0x3d, 0xcb, 0xf6, 0xb1, 0x5b, 0x8a, 0x31, 0xed, 0x3f, 0x5c, 0xa8, 0x7d, 0xfd, 0x68, 0xec, 0x62, - 0xcf, 0x9b, 0x5a, 0x51, 0x08, 0xa2, 0x8f, 0x00, 0xc6, 0x2e, 0x79, 0x8e, 0x07, 0xbe, 0x45, 0x1c, - 0xb6, 0x28, 0x19, 0xc1, 0x11, 0xa1, 0xa3, 0xfb, 0x50, 0xe4, 0xe6, 0xd2, 0x07, 0xc4, 0x9e, 0x8c, - 0x1c, 0x8f, 0x59, 0xbd, 0x50, 0x89, 0xcb, 0x31, 0xad, 0xc0, 0x47, 0xaa, 0x7c, 0x00, 0x35, 0x21, - 0xef, 0x62, 0xc7, 0xc4, 0xae, 0x8e, 0x8f, 0xc6, 0xae, 0x57, 0x92, 0xd8, 0xf2, 0x5c, 0x42, 0xb3, - 0x1c, 0x17, 0xa7, 0x74, 0x0f, 0x7d, 0x00, 0x29, 0xb2, 0xb7, 0xe7, 0x61, 0x9f, 0xd9, 0x55, 0x0a, - 0xd7, 0x8e, 0xd1, 0xd0, 0x1a, 0x24, 0x6d, 0x6b, 0x64, 0xf9, 0xcc, 0x88, 0xc1, 0x20, 0x27, 0x29, - 0xff, 0x59, 0x04, 0x74, 0xda, 0x87, 0xd0, 0xe7, 0x20, 0x39, 0x84, 0x8c, 0x85, 0xc1, 0xbe, 0xb5, - 0x50, 0xad, 0x16, 0x21, 0x63, 0x2a, 0x45, 0xed, 0xac, 0x31, 0x11, 0xb4, 0x0d, 0x39, 0xdf, 0xe8, - 0xdb, 0x58, 0xc3, 0x86, 0x89, 0x5d, 0xe1, 0xc0, 0x8b, 0x1d, 0xa6, 0x3b, 0xe5, 0x65, 0x20, 0x51, - 0x61, 0xb4, 0x05, 0x40, 0x37, 0xae, 0x80, 0x4a, 0x30, 0xa8, 0xbb, 0x0b, 0xa1, 0xb6, 0x43, 0x56, - 0x86, 0x14, 0x11, 0x45, 0x3f, 0x84, 0x94, 0x47, 0x5c, 0xea, 0x02, 0xd2, 0x12, 0x17, 0xe8, 0x30, - 0x36, 0x06, 0x20, 0x44, 0xa8, 0x16, 0xc6, 0x70, 0xe8, 0xe2, 0xa1, 0xe1, 0x13, 0x97, 0x59, 0xf8, - 0x3c, 0x2d, 0xca, 0x21, 0x2b, 0xd7, 0x62, 0x2a, 0x8a, 0xca, 0x90, 0xa1, 0x7c, 0x96, 0x33, 0xf0, - 0x4b, 0xe9, 0x25, 0x96, 0xad, 0x09, 0x46, 0x06, 0x12, 0x8a, 0x51, 0xeb, 0x8e, 0xb0, 0x3b, 0xc4, - 0x74, 0xae, 0xd8, 0x2d, 0x65, 0x96, 0x58, 0x77, 0x67, 0xca, 0xcb, 0xad, 0x1b, 0x11, 0xa6, 0xf3, - 0xda, 0x37, 0xbc, 0x7d, 0x01, 0x95, 0x5d, 0x32, 0xaf, 0xc7, 0x21, 0x2b, 0x9f, 0xd7, 0x54, 0x14, - 0x7d, 0x09, 0xa9, 0x97, 0x86, 0x3d, 0xc1, 0x5e, 0x09, 0x96, 0x80, 0x3c, 0x65, 0x6c, 0xa1, 0xc7, - 0x08, 0x31, 0xaa, 0x49, 0xdf, 0x18, 0x1c, 0xec, 0x59, 0xb6, 0x8d, 0xdd, 0x52, 0x6e, 0x09, 0x48, - 0x25, 0x64, 0xe5, 0x9a, 0x4c, 0x45, 0xd1, 0x13, 0x00, 0x17, 0x1b, 0xa6, 0x3a, 0x1a, 0x13, 0xd7, - 0x2f, 0x15, 0x96, 0x04, 0x4f, 0x2d, 0x64, 0xad, 0x19, 0xbe, 0xc1, 0xc1, 0xa6, 0xe2, 0xa8, 0x06, - 0xd9, 0x4e, 0xa7, 0xfb, 0xcc, 0xb5, 0xa8, 0xdf, 0x14, 0x19, 0xd6, 0xe2, 0x58, 0x1e, 0x72, 0x32, - 0x98, 0xa9, 0x20, 0xfa, 0x1d, 0x48, 0x77, 0x8c, 0xd1, 0x98, 0x4e, 0x6c, 0x85, 0x61, 0x7c, 0xb4, - 0x18, 0x83, 0xf3, 0x31, 0x84, 0x40, 0x08, 0x7d, 0x0d, 0x32, 0xff, 0x39, 0x75, 0xac, 0x92, 0xcc, - 0x80, 0xbe, 0xb3, 0x04, 0x68, 0xce, 0x13, 0x4f, 0xc1, 0x20, 0x07, 0x6e, 0x5a, 0x8e, 0x8f, 0x5d, - 0x1b, 0x1b, 0x2f, 0xb1, 0xc9, 0xb7, 0x8a, 0xf0, 0x86, 0x77, 0xd8, 0x1b, 0x3e, 0x3b, 0xe7, 0xe8, - 0x3a, 0x53, 0x8e, 0xbd, 0x68, 0x11, 0x28, 0xd2, 0x01, 0x8d, 0xb0, 0x6f, 0xd0, 0xc3, 0xb6, 0x8b, - 0x3d, 0xbf, 0xc3, 0x22, 0x58, 0x09, 0xb1, 0x57, 0x6d, 0x9e, 0xe3, 0xc3, 0xf3, 0x22, 0xec, 0x2d, - 0x67, 0x40, 0x21, 0x0c, 0xab, 0x51, 0xaa, 0x86, 0x07, 0xd8, 0x7a, 0x89, 0xdd, 0xd2, 0x75, 0xf6, - 0x8a, 0x87, 0x17, 0x7a, 0x45, 0x20, 0xc4, 0x5e, 0x72, 0x26, 0x1c, 0x75, 0x8c, 0x6a, 0xe7, 0xa9, - 0x70, 0x8c, 0xd5, 0x25, 0x8e, 0x11, 0x72, 0x72, 0xc7, 0x08, 0x1f, 0xd1, 0x0e, 0xe4, 0x5f, 0x59, - 0xc3, 0x57, 0xc6, 0x50, 0x98, 0xfc, 0x06, 0x03, 0x5a, 0x7c, 0x42, 0xff, 0x34, 0xc2, 0xcc, 0xb0, - 0x66, 0xc4, 0xe9, 0x1e, 0x12, 0x47, 0x51, 0x07, 0xfb, 0xa5, 0x77, 0x97, 0xec, 0xa1, 0xdd, 0x90, - 0x95, 0xbb, 0xfd, 0x54, 0x94, 0x46, 0xa9, 0x43, 0xcb, 0x31, 0xc9, 0x21, 0x76, 0x4b, 0x37, 0x97, - 0x44, 0xa9, 0x67, 0x82, 0x91, 0x47, 0xa9, 0x40, 0x0c, 0xed, 0x42, 0xc1, 0x26, 0x03, 0xc3, 0xde, - 0xb5, 0x0d, 0xa7, 0x45, 0x4c, 0x5c, 0x2a, 0x31, 0x9c, 0x07, 0x0b, 0x71, 0x9a, 0x51, 0x6e, 0x06, - 0x36, 0x0b, 0x40, 0x77, 0xc1, 0x60, 0xdf, 0x70, 0x86, 0xd1, 0x5d, 0xf0, 0xde, 0x92, 0x5d, 0x50, - 0x9d, 0x13, 0xe0, 0xbb, 0x60, 0x1e, 0x06, 0x75, 0xa0, 0xc8, 0x69, 0x0d, 0x97, 0x38, 0xbe, 0x85, - 0xdd, 0xd2, 0xda, 0x92, 0xb8, 0x51, 0x9d, 0x61, 0x67, 0xb0, 0x73, 0x10, 0x5f, 0x48, 0xdf, 0xfc, - 0xe5, 0x7a, 0x6c, 0x5b, 0xca, 0xa4, 0xe4, 0xf4, 0xb6, 0x94, 0xc9, 0xcb, 0x05, 0xa5, 0x08, 0xf9, - 0xe8, 0x69, 0xa9, 0x7c, 0x06, 0xef, 0x9e, 0xed, 0xd9, 0x68, 0x0d, 0xe2, 0x96, 0xc9, 0x8e, 0xde, - 0x6c, 0x05, 0x44, 0xc6, 0x13, 0x57, 0x6b, 0x5a, 0xdc, 0x32, 0x95, 0xc7, 0x50, 0x5a, 0xe4, 0xac, - 0xe8, 0x13, 0x00, 0x8f, 0xe7, 0x14, 0x96, 0xe9, 0xb1, 0xe4, 0x33, 0x5b, 0x29, 0x9c, 0xbc, 0x5e, - 0xcf, 0x72, 0x6c, 0xb5, 0xe6, 0x69, 0x59, 0xce, 0xa0, 0x9a, 0x9e, 0xf2, 0xa7, 0x31, 0x28, 0xce, - 0x86, 0x63, 0x54, 0x81, 0x74, 0x90, 0xb8, 0xf0, 0xd4, 0x55, 0x59, 0x7c, 0x3c, 0x19, 0xfe, 0x64, - 0xa4, 0x3a, 0x7b, 0x44, 0xa4, 0x13, 0x81, 0x20, 0x7a, 0x1f, 0xb2, 0xae, 0x71, 0xa8, 0xf7, 0x8f, - 0x7d, 0xec, 0x95, 0xe2, 0xb7, 0x13, 0xf7, 0xf2, 0x5a, 0xc6, 0x35, 0x0e, 0x2b, 0xf4, 0x19, 0xad, - 0x43, 0xc6, 0x99, 0x8c, 0x74, 0x97, 0x1c, 0x7a, 0xec, 0x34, 0x0f, 0x92, 0x91, 0xb4, 0x33, 0x19, - 0x69, 0xe4, 0xd0, 0x53, 0x6a, 0xb0, 0x32, 0x93, 0x10, 0x18, 0x0e, 0x7a, 0x08, 0x92, 0x37, 0x36, - 0x1c, 0x91, 0x8a, 0xdc, 0x8c, 0x68, 0x24, 0xea, 0x82, 0x0d, 0xca, 0x16, 0x24, 0x9a, 0x94, 0x55, - 0xf9, 0xf3, 0xc4, 0x1c, 0x0c, 0x4f, 0xca, 0x59, 0x66, 0x21, 0x70, 0xe6, 0xf7, 0xab, 0xa8, 0x13, - 0x78, 0x3a, 0x52, 0xc3, 0xde, 0xc0, 0xb5, 0xc6, 0x3e, 0x71, 0x83, 0x64, 0x89, 0x89, 0xa2, 0x3b, - 0x90, 0xb5, 0x1c, 0x13, 0x1f, 0xe9, 0x96, 0x79, 0xc4, 0x12, 0x9b, 0x82, 0x18, 0xcf, 0x30, 0xb2, - 0x6a, 0x1e, 0xa1, 0x5b, 0x90, 0x76, 0xf1, 0x4b, 0xec, 0x7a, 0x98, 0x4d, 0x30, 0xc8, 0x12, 0x03, - 0x22, 0xaa, 0x41, 0x92, 0xaa, 0x18, 0x24, 0x7c, 0x17, 0xcc, 0x8b, 0xc2, 0xf9, 0x71, 0x61, 0xf4, - 0x21, 0x00, 0x4b, 0xdf, 0xf4, 0x7d, 0xcb, 0xe1, 0x39, 0x5f, 0x42, 0x30, 0x64, 0x19, 0xfd, 0xb1, - 0xe5, 0xf8, 0xd4, 0xd8, 0x96, 0xa7, 0x0f, 0xf6, 0xf1, 0xe0, 0x80, 0x65, 0x7e, 0xa1, 0x2e, 0x96, - 0x57, 0xa5, 0x44, 0xb4, 0x03, 0xf0, 0xd2, 0xf2, 0xac, 0xbe, 0x65, 0x5b, 0xfe, 0x31, 0x4b, 0x48, - 0x8a, 0xe7, 0x44, 0x8c, 0xce, 0xc0, 0x70, 0x9e, 0x86, 0xec, 0x41, 0xf6, 0x3b, 0x05, 0x40, 0xdf, - 0x82, 0xdc, 0xc8, 0x38, 0xd2, 0x5d, 0xec, 0x4d, 0x6c, 0xdf, 0x63, 0xa9, 0x49, 0xb0, 0xbe, 0x30, - 0x32, 0x8e, 0x34, 0x4e, 0x57, 0xfe, 0x31, 0x01, 0xc5, 0xd9, 0x4c, 0xed, 0xd7, 0xb5, 0x36, 0xf7, - 0xa1, 0x68, 0x13, 0x72, 0x30, 0x19, 0x9f, 0x95, 0x9e, 0xf3, 0x91, 0x20, 0x3d, 0xaf, 0x40, 0x9a, - 0x38, 0x2c, 0x35, 0x5f, 0x9a, 0x30, 0x9e, 0xae, 0x19, 0x88, 0x43, 0x69, 0xa8, 0x07, 0xef, 0x70, - 0x8d, 0x78, 0x0d, 0xc1, 0xd1, 0x92, 0x97, 0x45, 0x5b, 0x61, 0x18, 0x0d, 0x06, 0xc1, 0x60, 0x3f, - 0x07, 0x89, 0xd6, 0xb1, 0x6c, 0x49, 0x8b, 0x8f, 0xd6, 0x17, 0xd8, 0x8a, 0x5a, 0xb8, 0x7b, 0x3c, - 0xc6, 0xc1, 0xbe, 0xa0, 0x22, 0x6f, 0x79, 0xc1, 0x69, 0x04, 0x81, 0x69, 0xba, 0x8c, 0x76, 0x61, - 0x45, 0x54, 0x3f, 0xc4, 0x35, 0xb1, 0x6b, 0x39, 0x43, 0xb1, 0x9e, 0x77, 0x16, 0x17, 0x9d, 0x82, - 0x51, 0x80, 0x8b, 0xea, 0x29, 0xa0, 0xa2, 0x47, 0x80, 0x02, 0x28, 0x7d, 0x64, 0xf8, 0x83, 0x7d, - 0xdd, 0xc6, 0xce, 0xcc, 0xe2, 0xca, 0xc1, 0xf8, 0x0e, 0x1d, 0x6e, 0x62, 0x47, 0xe9, 0x43, 0x3e, - 0x9a, 0x3a, 0xa3, 0xbb, 0xb0, 0xc2, 0x78, 0xb0, 0xa9, 0x47, 0x63, 0x5b, 0x41, 0x2b, 0x0a, 0x72, - 0xb0, 0xe4, 0xf7, 0x41, 0x0e, 0xb2, 0xec, 0x90, 0x33, 0xce, 0x38, 0x57, 0x02, 0xba, 0x60, 0xa5, - 0x25, 0xbf, 0x3c, 0x7f, 0x1a, 0xa3, 0x1a, 0xa4, 0x98, 0x27, 0x7a, 0x0b, 0xca, 0xfe, 0xf3, 0xbd, - 0x58, 0xc8, 0xa2, 0x3a, 0x00, 0x7e, 0x31, 0xf3, 0xfe, 0xdc, 0xa3, 0xdb, 0x8b, 0x0f, 0x22, 0xce, - 0x17, 0xec, 0x7d, 0xfc, 0x22, 0x98, 0xcc, 0xfa, 0x74, 0x37, 0x44, 0xbd, 0x3c, 0xd8, 0x0b, 0x6f, - 0xc7, 0xc1, 0xb7, 0x21, 0xbf, 0x67, 0x1d, 0x61, 0x53, 0x17, 0xc9, 0x7f, 0x92, 0x69, 0x7b, 0xe1, - 0xe4, 0x3f, 0xc7, 0x84, 0x39, 0xf1, 0x0d, 0xbc, 0x5a, 0xb1, 0xe0, 0x9d, 0x53, 0xe9, 0x03, 0x52, - 0x20, 0xaf, 0x91, 0xc3, 0x0e, 0x99, 0xb8, 0x03, 0xac, 0x9a, 0x47, 0xcc, 0x13, 0x0b, 0xda, 0x0c, - 0x0d, 0x7d, 0x00, 0xd9, 0x16, 0x3d, 0xc4, 0xc6, 0x13, 0xdf, 0xe3, 0x5e, 0xa5, 0x4d, 0x09, 0x08, - 0x81, 0xd4, 0x32, 0x46, 0x3c, 0x8c, 0x67, 0x35, 0xf6, 0x5b, 0xb9, 0x0b, 0xe9, 0xc0, 0xc2, 0x1f, - 0xcc, 0x9e, 0x95, 0xdc, 0xbe, 0x01, 0x49, 0xf9, 0xd7, 0x38, 0xac, 0xcc, 0xd5, 0x5e, 0xa8, 0x09, - 0x05, 0x1b, 0xef, 0x5d, 0x7d, 0x77, 0xe4, 0xa9, 0x74, 0xb8, 0x37, 0x5a, 0x50, 0x74, 0xad, 0xe1, - 0x7e, 0x04, 0x2e, 0x7e, 0x39, 0xb8, 0x02, 0x13, 0x0f, 0xf1, 0x22, 0x0e, 0x91, 0xbc, 0xaa, 0x43, - 0xbc, 0x41, 0x68, 0xba, 0x0f, 0x05, 0x67, 0x62, 0xdb, 0x3a, 0x7e, 0x31, 0x31, 0xc2, 0xe8, 0x14, - 0x9c, 0x58, 0x79, 0x3a, 0x54, 0x17, 0x23, 0xca, 0xcf, 0x12, 0x50, 0x9c, 0x2d, 0x46, 0xd1, 0x03, - 0x58, 0x61, 0xa6, 0x8d, 0x6c, 0x9d, 0x58, 0x24, 0xb4, 0xe3, 0x3d, 0xbf, 0x1e, 0x6e, 0x8d, 0x4f, - 0x40, 0xe6, 0x86, 0x9b, 0xdb, 0x67, 0x9c, 0x99, 0x1b, 0x75, 0xca, 0xfd, 0x1b, 0x36, 0xcb, 0xb7, - 0xa1, 0xc8, 0x2a, 0xf6, 0x69, 0xf0, 0x8a, 0xda, 0xa5, 0xc0, 0xc7, 0x02, 0x5d, 0xbf, 0x80, 0x9b, - 0x73, 0x56, 0xd0, 0x0d, 0x17, 0xeb, 0x07, 0xf8, 0x98, 0x1d, 0xc6, 0x81, 0xd4, 0xf5, 0x19, 0x7b, - 0x94, 0x5d, 0xfc, 0x04, 0x1f, 0xa3, 0x1f, 0x41, 0x69, 0xde, 0x2a, 0xa1, 0x70, 0x36, 0x22, 0xbc, - 0x3a, 0x6b, 0x1f, 0x2e, 0xad, 0xfc, 0x77, 0x0a, 0x8a, 0xb3, 0x79, 0x36, 0xba, 0x03, 0x30, 0x74, - 0x09, 0x3f, 0x6b, 0xa3, 0x06, 0xce, 0x32, 0x6a, 0x95, 0xd8, 0x1e, 0xfa, 0x3d, 0xc8, 0x07, 0xcd, - 0x11, 0x8b, 0x88, 0xd3, 0x38, 0xf7, 0xe8, 0xd3, 0x0b, 0x76, 0x56, 0xc2, 0xc7, 0xa9, 0xc1, 0x67, - 0xe0, 0xd0, 0x77, 0xc5, 0xe9, 0x81, 0x4d, 0x3d, 0xa2, 0x89, 0x14, 0x6a, 0x22, 0x8b, 0xd1, 0xad, - 0x50, 0xa1, 0x86, 0x58, 0xa8, 0x24, 0x5b, 0xa8, 0x4f, 0x2e, 0xaa, 0xc8, 0xfc, 0xaa, 0xad, 0xfd, - 0x51, 0x1c, 0x72, 0x11, 0xed, 0x28, 0xee, 0xde, 0xc4, 0x19, 0xb0, 0x0d, 0x7f, 0x09, 0xdc, 0xc6, - 0xc4, 0x09, 0x1b, 0xa8, 0x54, 0x1e, 0xdd, 0x8e, 0xf4, 0x8f, 0xa2, 0x3d, 0xc8, 0x69, 0x7b, 0xe8, - 0x23, 0x28, 0x8a, 0x6c, 0x63, 0x40, 0x6c, 0x96, 0x0a, 0x49, 0x3c, 0xf0, 0x71, 0x6a, 0x95, 0xd8, - 0x34, 0xf0, 0xdd, 0x64, 0xb1, 0x8b, 0x0d, 0x27, 0xd9, 0x09, 0x97, 0x1a, 0xf0, 0x81, 0x2d, 0xc8, - 0x1a, 0xee, 0x70, 0x32, 0xc2, 0x8e, 0xef, 0x95, 0x52, 0x97, 0x6d, 0x49, 0x4e, 0x65, 0xb7, 0xa5, - 0x4c, 0x42, 0x96, 0x94, 0x9f, 0xc7, 0x41, 0xa2, 0x93, 0x40, 0x32, 0xe4, 0xcb, 0xad, 0xaf, 0xf5, - 0x56, 0xbb, 0xab, 0xb7, 0x7a, 0xcd, 0xa6, 0x7c, 0x0d, 0xa5, 0x21, 0x51, 0x7e, 0xba, 0x25, 0xc7, - 0x50, 0x1e, 0x32, 0x95, 0x76, 0xbb, 0xa9, 0x97, 0x5b, 0x35, 0x39, 0x8e, 0x72, 0x90, 0x66, 0x4f, - 0x6d, 0x4d, 0x4e, 0xa0, 0x22, 0x40, 0xb5, 0xdd, 0xaa, 0x96, 0xbb, 0x7a, 0x79, 0x6b, 0x4b, 0x96, - 0x50, 0x16, 0x92, 0xd5, 0x76, 0xaf, 0xd5, 0x95, 0x93, 0x54, 0x7c, 0xa7, 0xfc, 0x95, 0x9c, 0x66, - 0x3f, 0xd4, 0x96, 0x9c, 0x41, 0x00, 0xa9, 0x4e, 0xb7, 0x56, 0xab, 0x3f, 0x95, 0xb3, 0x94, 0xd8, - 0xe9, 0xed, 0xc8, 0x40, 0xe1, 0x3a, 0xbd, 0x1d, 0x5d, 0x6d, 0x75, 0xe5, 0x1c, 0x7d, 0xd3, 0xd3, - 0xb2, 0xa6, 0x96, 0x5b, 0xd5, 0xba, 0x9c, 0xa7, 0x43, 0x5f, 0xb5, 0x35, 0x86, 0x5c, 0xe0, 0x6f, - 0xea, 0xb5, 0xba, 0xba, 0xd6, 0x7e, 0xd6, 0x91, 0x8b, 0x4c, 0xee, 0x27, 0x5a, 0x4d, 0x6d, 0x34, - 0xe4, 0x15, 0x84, 0xa0, 0xd8, 0x50, 0x5b, 0xe5, 0xa6, 0x1e, 0x4a, 0xcb, 0x74, 0x42, 0x9c, 0x26, - 0xde, 0xf9, 0x0e, 0x2a, 0x40, 0xb6, 0xac, 0x69, 0xe5, 0xaf, 0x19, 0x22, 0xa2, 0x2f, 0xdb, 0xee, - 0xb4, 0x5b, 0xec, 0xe9, 0x3a, 0x1d, 0xa4, 0x4f, 0x15, 0xf6, 0xb8, 0x4a, 0x5f, 0xd7, 0xe9, 0x6a, - 0x6a, 0x6b, 0x8b, 0x3d, 0xdf, 0x50, 0x3e, 0x01, 0x89, 0xfa, 0x10, 0xca, 0x80, 0x54, 0xee, 0x75, - 0xdb, 0xf2, 0x35, 0x36, 0x9b, 0x6a, 0xb9, 0x59, 0xd6, 0xe4, 0x18, 0xe5, 0x6e, 0xb5, 0x5b, 0xba, - 0x78, 0x8e, 0x2b, 0xff, 0x9b, 0x80, 0xe2, 0x6c, 0x0b, 0x2c, 0x74, 0xdc, 0x65, 0x0e, 0x36, 0x2b, - 0x76, 0xca, 0x71, 0xa7, 0x89, 0x78, 0xfc, 0xea, 0x89, 0x78, 0x58, 0xe1, 0x24, 0xde, 0xa4, 0xc2, - 0x79, 0x08, 0x19, 0x73, 0xe2, 0xb2, 0xed, 0xc3, 0x5c, 0x38, 0x51, 0xb9, 0x41, 0x87, 0x7f, 0xf5, - 0x7a, 0xbd, 0xe0, 0x5b, 0x23, 0xbc, 0x51, 0x13, 0x83, 0x5a, 0xc8, 0x46, 0x8b, 0xa2, 0xc1, 0xfe, - 0xc4, 0x39, 0xd0, 0x3d, 0xeb, 0x15, 0x9e, 0x2d, 0x8a, 0x18, 0xbd, 0x63, 0xbd, 0xc2, 0xa8, 0x0d, - 0x79, 0xe2, 0xef, 0x63, 0x57, 0x17, 0xb9, 0x5a, 0xea, 0x0a, 0xb9, 0x5a, 0x8e, 0x21, 0x74, 0x79, - 0xc2, 0xf6, 0x25, 0x64, 0x5c, 0x6c, 0x98, 0x65, 0xaf, 0xbd, 0x27, 0x7a, 0xba, 0xbf, 0x15, 0x01, - 0x9b, 0xf8, 0x96, 0xbd, 0xb1, 0x6f, 0x0f, 0x36, 0xba, 0xc1, 0x5d, 0x52, 0xb0, 0x65, 0x03, 0x21, - 0xe5, 0x81, 0x58, 0xfc, 0x1c, 0xa4, 0x55, 0xe7, 0xa5, 0x61, 0x5b, 0x26, 0x5f, 0x7f, 0x1e, 0x61, - 0xe5, 0x18, 0x75, 0x7b, 0x95, 0xa6, 0x6d, 0x72, 0x5c, 0x39, 0x89, 0x41, 0xa6, 0x61, 0x93, 0x43, - 0xb6, 0xe8, 0x0f, 0x21, 0xbd, 0x67, 0x93, 0x43, 0x5d, 0xf4, 0x0a, 0xf2, 0x95, 0x12, 0x45, 0xfe, - 0xb7, 0xd7, 0xeb, 0x29, 0xca, 0xa2, 0xd6, 0x4e, 0xc2, 0x5f, 0x5a, 0x8a, 0x32, 0xaa, 0x26, 0x6a, - 0xb2, 0x1e, 0x91, 0xb8, 0xa3, 0x13, 0xd9, 0xe5, 0xc7, 0xcb, 0xef, 0x96, 0x22, 0x37, 0x39, 0x11, - 0x79, 0xd4, 0x83, 0xf4, 0xd0, 0xf0, 0xf1, 0xa1, 0x71, 0xcc, 0x92, 0xa4, 0x64, 0xe5, 0x87, 0x62, - 0x89, 0x3e, 0x1d, 0x5a, 0xfe, 0xfe, 0xa4, 0xbf, 0x31, 0x20, 0xa3, 0xcd, 0x10, 0xdc, 0xec, 0x4f, - 0x7f, 0x6f, 0x8e, 0x0f, 0x86, 0x9b, 0x41, 0xf9, 0x4e, 0x73, 0x36, 0xb5, 0xa6, 0x05, 0x58, 0xca, - 0x21, 0xe4, 0xb6, 0x49, 0x7f, 0xd7, 0x25, 0x43, 0x1a, 0x5e, 0xd0, 0x47, 0x90, 0x7a, 0x4e, 0xfa, - 0xc1, 0x2c, 0x13, 0x95, 0x82, 0xe8, 0x88, 0x24, 0xb7, 0x49, 0x5f, 0xad, 0x69, 0xc9, 0xe7, 0xa4, - 0xaf, 0x9a, 0xe8, 0x1e, 0xe4, 0x07, 0xc4, 0xf1, 0x5d, 0xab, 0x3f, 0x09, 0xaf, 0x68, 0xe2, 0xc1, - 0xb1, 0x10, 0x1d, 0x41, 0x25, 0x90, 0x3c, 0x9b, 0xf8, 0x42, 0xe5, 0xa0, 0x6d, 0x60, 0x13, 0x5f, - 0xf9, 0x67, 0x09, 0xd0, 0xe9, 0x96, 0x30, 0xad, 0x6b, 0x3d, 0xd6, 0x39, 0xe5, 0x8e, 0x15, 0x8f, - 0xc8, 0x01, 0x1f, 0x60, 0x9e, 0xd5, 0x80, 0xcc, 0x58, 0xe8, 0xcc, 0x4e, 0xfa, 0xf3, 0x1a, 0xbd, - 0x91, 0xf9, 0x05, 0xfe, 0x10, 0xc8, 0xa2, 0x06, 0x24, 0x26, 0xae, 0x55, 0x4a, 0xb3, 0xc5, 0xf9, - 0xec, 0x12, 0xbd, 0xeb, 0x8d, 0x9e, 0x6b, 0xd5, 0x1d, 0xdf, 0x3d, 0xd6, 0x28, 0x00, 0xfa, 0x31, - 0xa4, 0xf8, 0x6d, 0xa9, 0xb8, 0x24, 0x58, 0x3f, 0xa3, 0x73, 0xa2, 0xb6, 0x1b, 0x96, 0x8d, 0x1b, - 0x8c, 0x2d, 0xbc, 0xf1, 0x62, 0x4f, 0xa8, 0x17, 0x96, 0x33, 0x59, 0xa6, 0xc9, 0xf7, 0x2f, 0xa3, - 0x09, 0xdf, 0x1b, 0x4c, 0x19, 0x06, 0x1b, 0x0b, 0xeb, 0x9b, 0x2f, 0xe1, 0x3d, 0xef, 0xc0, 0x1a, - 0xeb, 0x23, 0xcb, 0xf3, 0x68, 0x59, 0xb7, 0x47, 0x5c, 0x6c, 0x0d, 0x1d, 0x9a, 0x67, 0xf0, 0xdb, - 0x83, 0xe0, 0x4c, 0x7b, 0x97, 0xb2, 0xed, 0x70, 0xae, 0x06, 0x67, 0x7a, 0x82, 0x8f, 0xbd, 0x35, - 0x03, 0x72, 0x11, 0x74, 0x24, 0x43, 0x82, 0xa6, 0x28, 0xac, 0x59, 0xa6, 0xd1, 0x9f, 0xe8, 0x47, - 0x90, 0x64, 0xf5, 0xc8, 0xe5, 0x62, 0x98, 0xc6, 0x85, 0xbe, 0x88, 0xff, 0x20, 0xb6, 0xf6, 0x3d, - 0xc8, 0x04, 0xa6, 0x8c, 0xe2, 0x27, 0x39, 0xfe, 0x6a, 0x14, 0x3f, 0x1b, 0x91, 0xdb, 0x96, 0x32, - 0x31, 0x39, 0xce, 0x8f, 0xbe, 0x6d, 0x29, 0x23, 0xc9, 0xc9, 0x6d, 0x29, 0x93, 0x94, 0x53, 0xca, - 0xdf, 0xc4, 0xa1, 0x30, 0x73, 0x3d, 0x80, 0x3e, 0x86, 0x9c, 0x89, 0xe9, 0x91, 0xcd, 0x03, 0x1c, - 0x6f, 0xf5, 0x89, 0xe0, 0x12, 0x19, 0x40, 0x0f, 0xa0, 0x70, 0x68, 0xd8, 0x36, 0x8d, 0x78, 0x2d, - 0xc3, 0x21, 0xbc, 0x69, 0x16, 0x44, 0xb5, 0xd9, 0x21, 0xf4, 0x64, 0xb6, 0xb3, 0xb4, 0x79, 0xb1, - 0x9b, 0x0a, 0xd6, 0x3c, 0xa3, 0xb5, 0xcd, 0x6c, 0xf8, 0x8d, 0x3a, 0x73, 0xf2, 0xea, 0xce, 0x4c, - 0x4d, 0x19, 0xbc, 0x80, 0x6e, 0x3c, 0x87, 0x16, 0x54, 0xd1, 0xd9, 0x32, 0x0a, 0x35, 0x32, 0x76, - 0x4c, 0x66, 0xd0, 0xbc, 0x46, 0x7f, 0x6e, 0x4b, 0x99, 0xb8, 0x9c, 0x50, 0xfe, 0x3e, 0x06, 0x85, - 0x99, 0xf6, 0xf9, 0x85, 0x0d, 0x77, 0x17, 0xf2, 0x14, 0x59, 0x1f, 0x1b, 0xbe, 0x8f, 0x5d, 0x1e, - 0x0e, 0x42, 0x46, 0x3a, 0xb2, 0xcb, 0x07, 0xd0, 0x8f, 0x21, 0x4d, 0xc6, 0x41, 0xfa, 0x39, 0x1f, - 0xbd, 0x83, 0x6d, 0x52, 0xed, 0x3c, 0x6d, 0x73, 0xa6, 0xa0, 0x85, 0x26, 0x64, 0xa6, 0x67, 0x0e, - 0x6b, 0x69, 0x4a, 0xa7, 0xce, 0x1c, 0xd6, 0xd4, 0xfc, 0xc3, 0x38, 0x40, 0xe7, 0x00, 0xfb, 0x83, - 0x7d, 0x36, 0x87, 0x6d, 0xc8, 0x79, 0xec, 0x49, 0x8f, 0x9c, 0xd9, 0xe7, 0x5c, 0x48, 0x32, 0xde, - 0xc8, 0x51, 0x0d, 0x5e, 0x48, 0x41, 0xa5, 0x69, 0x15, 0xca, 0x7b, 0x15, 0x61, 0x1f, 0xf6, 0x53, - 0x40, 0x43, 0xec, 0x60, 0xd7, 0xf0, 0xb1, 0xbe, 0x6f, 0x79, 0x3e, 0x19, 0xba, 0xc6, 0x68, 0xa6, - 0x27, 0xf9, 0x4e, 0x30, 0xfe, 0x38, 0x18, 0x46, 0x3f, 0x80, 0x1b, 0x21, 0xaf, 0x3e, 0x32, 0x8e, - 0xf4, 0xfe, 0x64, 0x70, 0x80, 0x7d, 0x3e, 0xb3, 0xa0, 0xe7, 0x72, 0x3d, 0x64, 0xd9, 0x31, 0x8e, - 0x2a, 0x9c, 0x01, 0xdd, 0x81, 0xac, 0xe7, 0x1b, 0xbe, 0xce, 0x56, 0x38, 0x19, 0xb1, 0x76, 0x86, - 0x92, 0x59, 0xf1, 0xfc, 0xfb, 0x90, 0x8b, 0x5c, 0x70, 0xa1, 0x3a, 0x64, 0xf8, 0x44, 0xc2, 0x8e, - 0xc9, 0x32, 0x1b, 0x44, 0x8e, 0xa1, 0x50, 0xf4, 0xac, 0xe8, 0x5c, 0x38, 0x1d, 0x9d, 0x95, 0xff, - 0x8a, 0xc3, 0xea, 0x59, 0xb7, 0x62, 0xbf, 0x5e, 0x35, 0xd0, 0x1f, 0x00, 0xe2, 0x4f, 0x41, 0x41, - 0x17, 0x69, 0xd0, 0xfc, 0xe4, 0xe4, 0xf5, 0xba, 0xb8, 0xa3, 0x13, 0x25, 0x9d, 0x5a, 0xf3, 0x7e, - 0xf5, 0x7a, 0xfd, 0xf3, 0x0b, 0x9d, 0xa6, 0x91, 0x8f, 0x5d, 0x36, 0x02, 0x69, 0x4d, 0xf6, 0x66, - 0xe0, 0x4c, 0x0f, 0x19, 0x90, 0x61, 0x91, 0x98, 0x9e, 0xa7, 0x7c, 0x51, 0x1b, 0xc1, 0x37, 0x18, - 0x2c, 0x22, 0xaa, 0xb5, 0x0b, 0x9f, 0xdf, 0xd1, 0x37, 0xd2, 0xf3, 0x9b, 0xe1, 0xaa, 0xa6, 0xf2, - 0x7f, 0x12, 0xbc, 0x7f, 0xce, 0xf5, 0x20, 0xfa, 0x6a, 0xae, 0x51, 0xf6, 0xc5, 0x55, 0x2e, 0x19, - 0x79, 0xfc, 0x9e, 0x6b, 0x9e, 0x45, 0x9a, 0xef, 0xf1, 0xb3, 0x9a, 0xef, 0xb3, 0x6d, 0xf3, 0xc4, - 0xd9, 0x6d, 0xf3, 0xb7, 0xd1, 0x19, 0xfb, 0x7c, 0xa6, 0x90, 0xbc, 0x4c, 0xc5, 0xbf, 0xf6, 0xb7, - 0x71, 0x48, 0xb2, 0xb9, 0xa1, 0xdf, 0x05, 0xc9, 0xc4, 0xde, 0xe0, 0x4a, 0x4d, 0x71, 0x26, 0x79, - 0x91, 0x9e, 0x78, 0xf0, 0x5d, 0x4f, 0xe2, 0x0d, 0xbe, 0xeb, 0xa9, 0x42, 0x26, 0x6c, 0x42, 0x49, - 0x97, 0x6b, 0x42, 0x85, 0x82, 0xd3, 0xb2, 0x21, 0xf9, 0x06, 0x65, 0x83, 0xf2, 0x8b, 0x18, 0x14, - 0x67, 0xaf, 0x36, 0xd1, 0x97, 0x90, 0xe4, 0x9f, 0xd8, 0xc4, 0x2e, 0x5b, 0xcf, 0x72, 0x39, 0xd4, - 0x85, 0x30, 0x52, 0x9a, 0x73, 0x9d, 0xd9, 0x3b, 0x0b, 0x16, 0x85, 0xef, 0xb7, 0xc8, 0xda, 0xca, - 0x21, 0x42, 0xd0, 0xac, 0xb9, 0x0b, 0xb2, 0x33, 0x19, 0xb1, 0x9e, 0x84, 0x3e, 0xc6, 0xae, 0x3e, - 0xc4, 0x0e, 0x8f, 0x03, 0x5a, 0xc1, 0x99, 0x8c, 0xaa, 0xc4, 0xf6, 0x76, 0xb1, 0xbb, 0x85, 0x1d, - 0xe5, 0xcf, 0xf2, 0x90, 0x8f, 0x5e, 0xb3, 0xa2, 0xdb, 0x90, 0x1b, 0x1b, 0xae, 0x6f, 0xb1, 0xc6, - 0xc7, 0xb1, 0xe8, 0x66, 0x47, 0x49, 0x48, 0x83, 0x2c, 0xbf, 0x8a, 0x6d, 0x84, 0x9a, 0x6e, 0x5c, - 0xe8, 0x0a, 0x57, 0x3c, 0x34, 0xc2, 0x8a, 0x3e, 0x84, 0x59, 0xfb, 0xeb, 0x98, 0xa8, 0xe5, 0x35, - 0x28, 0x04, 0x6d, 0x16, 0xdc, 0xb8, 0x62, 0x57, 0x43, 0x9b, 0x85, 0x40, 0xbb, 0x00, 0xe2, 0x4d, - 0x14, 0x30, 0xce, 0x00, 0xbf, 0x7b, 0x29, 0x8d, 0x29, 0x68, 0x04, 0x83, 0xdf, 0xbf, 0xae, 0xfd, - 0x32, 0x09, 0xc9, 0x86, 0x4b, 0x53, 0x8c, 0x6d, 0x90, 0x46, 0xc4, 0x0c, 0x4e, 0xdb, 0x0b, 0x62, - 0x33, 0xd1, 0x8d, 0x1d, 0x62, 0x86, 0x5b, 0x94, 0x62, 0xa0, 0x5d, 0x48, 0xf5, 0xc9, 0xc4, 0x31, - 0x3d, 0x91, 0x62, 0x3e, 0xba, 0x0c, 0x5a, 0x85, 0x49, 0x06, 0xf1, 0x82, 0xe3, 0xac, 0xfd, 0x4f, - 0x0c, 0x92, 0x6c, 0x00, 0x7d, 0x0d, 0x59, 0x46, 0xeb, 0x4e, 0x53, 0x83, 0xdf, 0xbe, 0x34, 0x7c, - 0xc4, 0xf1, 0xa6, 0x68, 0x34, 0xfa, 0x59, 0x8e, 0xaf, 0x8b, 0x0f, 0xc5, 0xa2, 0xe1, 0x20, 0x6b, - 0x39, 0x7e, 0x9b, 0x7f, 0x2b, 0x76, 0x07, 0xf2, 0x34, 0x0c, 0x99, 0x01, 0x5b, 0x82, 0xe5, 0x64, - 0x39, 0x46, 0x13, 0x2c, 0x2a, 0xe4, 0xf8, 0x20, 0xcf, 0x5f, 0xf8, 0x8e, 0xbf, 0xf8, 0x4d, 0x31, - 0x70, 0x61, 0xaa, 0xd2, 0xda, 0x5f, 0xc4, 0x20, 0xc5, 0x0d, 0x82, 0x76, 0x20, 0xe9, 0xf9, 0x86, - 0xeb, 0x8b, 0x70, 0xf7, 0xf0, 0xd2, 0x93, 0x0e, 0x03, 0x01, 0x45, 0x41, 0xd5, 0x69, 0x4a, 0x79, - 0x15, 0x30, 0x96, 0x85, 0x2a, 0x77, 0x41, 0xa2, 0x8b, 0x4f, 0x2b, 0x70, 0xad, 0xdc, 0xda, 0xaa, - 0xcb, 0xd7, 0x50, 0x06, 0x24, 0xd6, 0x23, 0x8a, 0xd1, 0x12, 0x7d, 0x4b, 0x6b, 0xf7, 0x76, 0x3b, - 0x72, 0x5c, 0x79, 0x05, 0xd9, 0xd0, 0xf0, 0xe8, 0x26, 0x5c, 0xef, 0xb5, 0x2a, 0xed, 0x5e, 0xab, - 0x56, 0xaf, 0xe9, 0xbb, 0x5a, 0xbd, 0x5a, 0xaf, 0xa9, 0xad, 0x2d, 0xf9, 0xda, 0xec, 0x40, 0xa3, - 0xdd, 0x6c, 0xb6, 0x9f, 0xd1, 0x81, 0x18, 0x5a, 0x05, 0xb9, 0xdd, 0x68, 0x74, 0xea, 0xdd, 0x08, - 0x7b, 0x3c, 0x42, 0x9d, 0xf2, 0x26, 0xd0, 0x0a, 0xe4, 0xaa, 0x3d, 0x4d, 0xab, 0xf3, 0x66, 0x95, - 0x2c, 0xad, 0xfd, 0x53, 0x1c, 0x32, 0xc1, 0xb6, 0x45, 0xb5, 0x48, 0xa7, 0xf1, 0xbc, 0xef, 0x2d, - 0x66, 0xe7, 0x3d, 0xdf, 0x67, 0xfc, 0x18, 0x72, 0x86, 0x3b, 0x54, 0xcd, 0xa3, 0x0e, 0x5b, 0x91, - 0xa8, 0xab, 0x44, 0x07, 0xd0, 0x6d, 0xc8, 0x18, 0xee, 0xb0, 0x4a, 0x26, 0xe2, 0x34, 0x0d, 0x8f, - 0x97, 0x80, 0xfa, 0x76, 0x8e, 0x86, 0x32, 0x24, 0xf7, 0xdc, 0x20, 0xaf, 0x3c, 0xef, 0xbb, 0x8c, - 0xd3, 0xab, 0xa9, 0x71, 0x49, 0x74, 0x0f, 0x66, 0x3a, 0xa0, 0xe2, 0x73, 0x52, 0xd1, 0x1e, 0x88, - 0x8e, 0x28, 0x3f, 0x8f, 0x01, 0x4c, 0x63, 0x0a, 0x2a, 0x02, 0x68, 0xed, 0x67, 0x7a, 0xab, 0xb7, - 0x53, 0xa9, 0x6b, 0x62, 0xfd, 0xcb, 0xad, 0x27, 0xbc, 0x2d, 0x57, 0xab, 0xb7, 0x3a, 0x75, 0x9d, - 0x3d, 0xc7, 0x91, 0x0c, 0xf9, 0xdd, 0xba, 0x56, 0x65, 0x0b, 0x43, 0x29, 0x09, 0x54, 0x80, 0x6c, - 0xb5, 0xb7, 0x53, 0xd7, 0x6b, 0x6a, 0xa7, 0xcb, 0xdb, 0x97, 0xad, 0xae, 0xda, 0xac, 0xf3, 0xf6, - 0x65, 0xb3, 0xbc, 0x25, 0xa7, 0x28, 0x5c, 0xb3, 0x5e, 0xae, 0xc9, 0x69, 0xba, 0xae, 0x0d, 0x55, - 0xeb, 0x74, 0xf5, 0xa7, 0xe5, 0x66, 0xaf, 0x2e, 0x67, 0x28, 0x7e, 0xb3, 0x1c, 0x3e, 0x67, 0x29, - 0x5a, 0xab, 0xfb, 0x58, 0x3c, 0x82, 0xf2, 0x77, 0x71, 0x58, 0x3d, 0xeb, 0x03, 0x17, 0xd4, 0x81, - 0xf4, 0xa1, 0x11, 0xcd, 0x67, 0x3f, 0xbd, 0xd4, 0x07, 0x32, 0x1b, 0xcf, 0xa8, 0x70, 0x90, 0x39, - 0x09, 0x24, 0xd6, 0xc1, 0xc6, 0x38, 0xd8, 0x4f, 0xf3, 0xb1, 0x9e, 0x7d, 0xc0, 0xcd, 0x3f, 0xe6, - 0x16, 0x98, 0x94, 0xb9, 0x86, 0x7d, 0xc3, 0xb2, 0xbd, 0xd0, 0xb3, 0x30, 0x36, 0xd7, 0xfe, 0x38, - 0x06, 0x49, 0xf6, 0x02, 0xd4, 0x02, 0xd9, 0x72, 0x2c, 0xdf, 0x32, 0x6c, 0xdd, 0xc5, 0x1e, 0xb1, - 0x5f, 0x62, 0x53, 0x78, 0xed, 0x85, 0xfa, 0x67, 0x2b, 0x42, 0x58, 0x13, 0xb2, 0xe1, 0x67, 0x22, - 0xf1, 0x8b, 0x7f, 0x26, 0xf2, 0x0f, 0x31, 0x40, 0xa7, 0x3f, 0xe5, 0x41, 0x15, 0x28, 0xf8, 0xae, - 0x31, 0x38, 0xc0, 0xa6, 0xce, 0x33, 0x12, 0x6e, 0xc6, 0x25, 0x90, 0x79, 0x21, 0xd3, 0x11, 0xf5, - 0xf3, 0x5b, 0xb1, 0x57, 0xa4, 0xf9, 0x95, 0x58, 0xdc, 0xfc, 0x7a, 0xf0, 0x7d, 0x28, 0xce, 0x5e, - 0xd6, 0xd3, 0xe0, 0xb4, 0xdb, 0xab, 0x34, 0xd5, 0xaa, 0x7c, 0x0d, 0xbd, 0x07, 0x37, 0xf8, 0x6f, - 0xbd, 0xdc, 0xaa, 0xb1, 0x1e, 0xbc, 0x18, 0x8a, 0x3d, 0x50, 0x82, 0xc2, 0x94, 0x05, 0xae, 0x55, - 0x90, 0x1f, 0x37, 0x9b, 0xfa, 0x6e, 0xb3, 0xd7, 0xe1, 0x7f, 0x9e, 0x3e, 0x94, 0xaf, 0x55, 0x3e, - 0xfc, 0xe6, 0x97, 0xb7, 0xae, 0x7d, 0x73, 0x72, 0x2b, 0xf6, 0x8b, 0x93, 0x5b, 0xb1, 0x7f, 0x39, - 0xb9, 0x15, 0xfb, 0xf7, 0x93, 0x5b, 0xb1, 0x9f, 0xfd, 0xc7, 0xad, 0x6b, 0x3f, 0xcd, 0x86, 0x9e, - 0xf4, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x16, 0x48, 0xed, 0x48, 0x09, 0x30, 0x00, 0x00, + 0x40, 0x80, 0x37, 0x00, 0xa4, 0xdd, 0xab, 0x72, 0x4d, 0x0d, 0x30, 0x4d, 0x70, 0xc4, 0xc1, 0x34, + 0x34, 0x33, 0x10, 0x49, 0x25, 0x4e, 0xec, 0xc4, 0x4e, 0xae, 0x5c, 0x8e, 0x5c, 0x0e, 0x9c, 0x5c, + 0xe8, 0xc4, 0x81, 0x13, 0x27, 0xae, 0xb2, 0xcb, 0xde, 0xc0, 0xc1, 0x25, 0xae, 0xb2, 0x1d, 0xa8, + 0x7c, 0x74, 0x60, 0x97, 0x73, 0x57, 0xd9, 0x17, 0xb9, 0xfa, 0x67, 0x06, 0x03, 0x90, 0x20, 0x48, + 0x4a, 0x75, 0x97, 0x90, 0x98, 0xd7, 0xef, 0x7d, 0xdd, 0xfd, 0xfa, 0xf5, 0xeb, 0xf7, 0x5e, 0x37, + 0xdc, 0xf2, 0x5e, 0xd8, 0x9b, 0xa6, 0xe5, 0xf9, 0xde, 0x0b, 0x7b, 0xdc, 0xdf, 0x1c, 0xbb, 0x64, + 0x80, 0x3d, 0x8f, 0xb8, 0xde, 0xc6, 0xd8, 0x25, 0x3e, 0x41, 0x37, 0x07, 0x64, 0x70, 0xe0, 0x12, + 0x63, 0xb0, 0xbf, 0xe1, 0xbd, 0xb0, 0x37, 0x42, 0xce, 0xb5, 0x77, 0x9f, 0x93, 0xbe, 0xb7, 0x49, + 0xff, 0x8c, 0xfb, 0xec, 0x1f, 0x17, 0x58, 0x43, 0x8c, 0x79, 0xdc, 0xdf, 0x34, 0x0d, 0xdf, 0x10, + 0xb4, 0x52, 0x40, 0xb3, 0xc8, 0x77, 0xf6, 0x88, 0x3b, 0x32, 0xfc, 0x80, 0xfb, 0x03, 0xda, 0xbd, + 0xf7, 0xc2, 0xee, 0x1b, 0x1e, 0xde, 0xf4, 0x7c, 0x77, 0x32, 0xf0, 0x27, 0x2e, 0x36, 0x45, 0xeb, + 0xfb, 0xd1, 0xd6, 0xe7, 0xc4, 0x72, 0x74, 0xff, 0x78, 0x8c, 0x03, 0xd0, 0xd9, 0x91, 0x47, 0xbb, + 0x9b, 0xf8, 0x96, 0xbd, 0xb9, 0x6f, 0x0f, 0x36, 0x7d, 0x6b, 0x84, 0x3d, 0xdf, 0x18, 0x8d, 0x45, + 0xcb, 0xea, 0x90, 0x0c, 0x09, 0xfb, 0xb9, 0x49, 0x7f, 0x71, 0xaa, 0xf2, 0xc7, 0x09, 0x28, 0xec, + 0x06, 0x13, 0xef, 0x8c, 0xf1, 0x00, 0x55, 0x20, 0x69, 0x39, 0xe3, 0x89, 0x5f, 0x8a, 0xdd, 0x4e, + 0xdc, 0xcb, 0x3d, 0xfa, 0x78, 0x63, 0x81, 0x16, 0x36, 0x54, 0xca, 0xd5, 0x39, 0x76, 0x06, 0x54, + 0xac, 0x22, 0x7d, 0xf3, 0x7a, 0xfd, 0x9a, 0xc6, 0x45, 0x51, 0x1d, 0xa4, 0x01, 0x71, 0x71, 0x29, + 0x7e, 0x3b, 0x76, 0x2f, 0xf7, 0xe8, 0xdb, 0x0b, 0x21, 0xc2, 0x9e, 0xab, 0xc4, 0xc5, 0x3d, 0xc7, + 0x22, 0x8e, 0xc0, 0x61, 0xe2, 0x68, 0x0b, 0x52, 0x64, 0xe2, 0xd3, 0xb1, 0x24, 0xd8, 0x58, 0xee, + 0x2f, 0x04, 0x6a, 0x33, 0x36, 0x8d, 0x4c, 0x7c, 0xec, 0x46, 0x86, 0x23, 0xc4, 0x51, 0x05, 0xa4, + 0x31, 0xf1, 0xfc, 0x92, 0xc4, 0xc6, 0x73, 0x6f, 0xf1, 0x78, 0x88, 0xe7, 0x8b, 0x31, 0x45, 0x50, + 0x98, 0x2c, 0x7a, 0x00, 0x19, 0xcf, 0x37, 0x86, 0x58, 0xb7, 0xcc, 0x52, 0xf2, 0x76, 0xec, 0x5e, + 0xb2, 0xb2, 0x42, 0x5b, 0x4f, 0x5e, 0xaf, 0xa7, 0x3b, 0x94, 0xae, 0xd6, 0xb4, 0x34, 0x63, 0x50, + 0x4d, 0xf4, 0x3d, 0xc8, 0x87, 0xd6, 0x44, 0xf9, 0x53, 0x8c, 0xff, 0xba, 0xe0, 0xcf, 0x85, 0xd3, + 0x56, 0x6b, 0x5a, 0x2e, 0x64, 0x54, 0x4d, 0xe5, 0x2f, 0xe3, 0xb0, 0x32, 0x37, 0x06, 0x54, 0x86, + 0xd4, 0x9e, 0x65, 0xfb, 0xd8, 0x2d, 0xc5, 0xd8, 0xe8, 0x3f, 0x5c, 0x38, 0xfa, 0xfa, 0xd1, 0xd8, + 0xc5, 0x9e, 0x37, 0xd5, 0xa2, 0x10, 0x44, 0x1f, 0x01, 0x8c, 0x5d, 0xf2, 0x1c, 0x0f, 0x7c, 0x8b, + 0x38, 0x6c, 0x51, 0x32, 0x82, 0x23, 0x42, 0x47, 0xf7, 0xa1, 0xc8, 0xd5, 0xa5, 0x0f, 0x88, 0x3d, + 0x19, 0x39, 0x1e, 0xd3, 0x7a, 0xa1, 0x12, 0x97, 0x63, 0x5a, 0x81, 0xb7, 0x54, 0x79, 0x03, 0x6a, + 0x42, 0xde, 0xc5, 0x8e, 0x89, 0x5d, 0x1d, 0x1f, 0x8d, 0x5d, 0xaf, 0x24, 0xb1, 0xe5, 0xb9, 0xc4, + 0xc8, 0x72, 0x5c, 0x9c, 0xd2, 0x3d, 0xf4, 0x01, 0xa4, 0xc8, 0xde, 0x9e, 0x87, 0x7d, 0xa6, 0x57, + 0x29, 0x5c, 0x3b, 0x46, 0x43, 0x6b, 0x90, 0xb4, 0xad, 0x91, 0xe5, 0x33, 0x25, 0x06, 0x8d, 0x9c, + 0xa4, 0xfc, 0x67, 0x11, 0xd0, 0x69, 0x1b, 0x42, 0x9f, 0x83, 0xe4, 0x10, 0x32, 0x16, 0x0a, 0xfb, + 0xd6, 0xc2, 0x61, 0xb5, 0x08, 0x19, 0x53, 0x29, 0xaa, 0x67, 0x8d, 0x89, 0xa0, 0x6d, 0xc8, 0xf9, + 0x46, 0xdf, 0xc6, 0x1a, 0x36, 0x4c, 0xec, 0x0a, 0x03, 0x5e, 0x6c, 0x30, 0xdd, 0x29, 0x2f, 0x03, + 0x89, 0x0a, 0xa3, 0x2d, 0x00, 0xba, 0x71, 0x05, 0x54, 0x82, 0x41, 0xdd, 0x5d, 0x08, 0xb5, 0x1d, + 0xb2, 0x32, 0xa4, 0x88, 0x28, 0xfa, 0x21, 0xa4, 0x3c, 0xe2, 0x52, 0x13, 0x90, 0x96, 0x98, 0x40, + 0x87, 0xb1, 0x31, 0x00, 0x21, 0x42, 0x47, 0x61, 0x0c, 0x87, 0x2e, 0x1e, 0x1a, 0x3e, 0x71, 0x99, + 0x86, 0xcf, 0x1b, 0x45, 0x39, 0x64, 0xe5, 0xa3, 0x98, 0x8a, 0xa2, 0x32, 0x64, 0x28, 0x9f, 0xe5, + 0x0c, 0xfc, 0x52, 0x7a, 0x89, 0x66, 0x6b, 0x82, 0x91, 0x81, 0x84, 0x62, 0x54, 0xbb, 0x23, 0xec, + 0x0e, 0x31, 0x9d, 0x2b, 0x76, 0x4b, 0x99, 0x25, 0xda, 0xdd, 0x99, 0xf2, 0x72, 0xed, 0x46, 0x84, + 0xe9, 0xbc, 0xf6, 0x0d, 0x6f, 0x5f, 0x40, 0x65, 0x97, 0xcc, 0xeb, 0x71, 0xc8, 0xca, 0xe7, 0x35, + 0x15, 0x45, 0x5f, 0x42, 0xea, 0xa5, 0x61, 0x4f, 0xb0, 0x57, 0x82, 0x25, 0x20, 0x4f, 0x19, 0x5b, + 0x68, 0x31, 0x42, 0x8c, 0x8e, 0xa4, 0x6f, 0x0c, 0x0e, 0xf6, 0x2c, 0xdb, 0xc6, 0x6e, 0x29, 0xb7, + 0x04, 0xa4, 0x12, 0xb2, 0xf2, 0x91, 0x4c, 0x45, 0xd1, 0x13, 0x00, 0x17, 0x1b, 0xa6, 0x3a, 0x1a, + 0x13, 0xd7, 0x2f, 0x15, 0x96, 0x38, 0x4f, 0x2d, 0x64, 0xad, 0x19, 0xbe, 0xc1, 0xc1, 0xa6, 0xe2, + 0xa8, 0x06, 0xd9, 0x4e, 0xa7, 0xfb, 0xcc, 0xb5, 0xa8, 0xdd, 0x14, 0x19, 0xd6, 0x62, 0x5f, 0x1e, + 0x72, 0x32, 0x98, 0xa9, 0x20, 0xfa, 0x1d, 0x48, 0x77, 0x8c, 0xd1, 0x98, 0x4e, 0x6c, 0x85, 0x61, + 0x7c, 0xb4, 0x18, 0x83, 0xf3, 0x31, 0x84, 0x40, 0x08, 0x7d, 0x0d, 0x32, 0xff, 0x39, 0x35, 0xac, + 0x92, 0xcc, 0x80, 0xbe, 0xb3, 0x04, 0x68, 0xce, 0x12, 0x4f, 0xc1, 0x20, 0x07, 0x6e, 0x5a, 0x8e, + 0x8f, 0x5d, 0x1b, 0x1b, 0x2f, 0xb1, 0xc9, 0xb7, 0x8a, 0xb0, 0x86, 0x77, 0x58, 0x0f, 0x9f, 0x9d, + 0x73, 0x74, 0x9d, 0x29, 0xc7, 0x3a, 0x5a, 0x04, 0x8a, 0x74, 0x40, 0x23, 0xec, 0x1b, 0xf4, 0xb0, + 0xed, 0x62, 0xcf, 0xef, 0x30, 0x0f, 0x56, 0x42, 0xac, 0xab, 0xcd, 0x73, 0x6c, 0x78, 0x5e, 0x84, + 0xf5, 0x72, 0x06, 0x14, 0xc2, 0xb0, 0x1a, 0xa5, 0x6a, 0x78, 0x80, 0xad, 0x97, 0xd8, 0x2d, 0x5d, + 0x67, 0x5d, 0x3c, 0xbc, 0x50, 0x17, 0x81, 0x10, 0xeb, 0xe4, 0x4c, 0x38, 0x6a, 0x18, 0xd5, 0xce, + 0x53, 0x61, 0x18, 0xab, 0x4b, 0x0c, 0x23, 0xe4, 0xe4, 0x86, 0x11, 0x7e, 0xa2, 0x1d, 0xc8, 0xbf, + 0xb2, 0x86, 0xaf, 0x8c, 0xa1, 0x50, 0xf9, 0x0d, 0x06, 0xb4, 0xf8, 0x84, 0xfe, 0x69, 0x84, 0x99, + 0x61, 0xcd, 0x88, 0xd3, 0x3d, 0x24, 0x8e, 0xa2, 0x0e, 0xf6, 0x4b, 0xef, 0x2e, 0xd9, 0x43, 0xbb, + 0x21, 0x2b, 0x37, 0xfb, 0xa9, 0x28, 0xf5, 0x52, 0x87, 0x96, 0x63, 0x92, 0x43, 0xec, 0x96, 0x6e, + 0x2e, 0xf1, 0x52, 0xcf, 0x04, 0x23, 0xf7, 0x52, 0x81, 0x18, 0xda, 0x85, 0x82, 0x4d, 0x06, 0x86, + 0xbd, 0x6b, 0x1b, 0x4e, 0x8b, 0x98, 0xb8, 0x54, 0x62, 0x38, 0x0f, 0x16, 0xe2, 0x34, 0xa3, 0xdc, + 0x0c, 0x6c, 0x16, 0x80, 0xee, 0x82, 0xc1, 0xbe, 0xe1, 0x0c, 0xa3, 0xbb, 0xe0, 0xbd, 0x25, 0xbb, + 0xa0, 0x3a, 0x27, 0xc0, 0x77, 0xc1, 0x3c, 0x0c, 0xea, 0x40, 0x91, 0xd3, 0x1a, 0x2e, 0x71, 0x7c, + 0x0b, 0xbb, 0xa5, 0xb5, 0x25, 0x7e, 0xa3, 0x3a, 0xc3, 0xce, 0x60, 0xe7, 0x20, 0xbe, 0x90, 0xbe, + 0xf9, 0x8b, 0xf5, 0xd8, 0xb6, 0x94, 0x49, 0xc9, 0xe9, 0x6d, 0x29, 0x93, 0x97, 0x0b, 0x4a, 0x11, + 0xf2, 0xd1, 0xd3, 0x52, 0xf9, 0x0c, 0xde, 0x3d, 0xdb, 0xb2, 0xd1, 0x1a, 0xc4, 0x2d, 0x93, 0x1d, + 0xbd, 0xd9, 0x0a, 0x88, 0x88, 0x27, 0xae, 0xd6, 0xb4, 0xb8, 0x65, 0x2a, 0x8f, 0xa1, 0xb4, 0xc8, + 0x58, 0xd1, 0x27, 0x00, 0x1e, 0x8f, 0x29, 0x2c, 0xd3, 0x63, 0xc1, 0x67, 0xb6, 0x52, 0x38, 0x79, + 0xbd, 0x9e, 0xe5, 0xd8, 0x6a, 0xcd, 0xd3, 0xb2, 0x9c, 0x41, 0x35, 0x3d, 0xe5, 0x4f, 0x62, 0x50, + 0x9c, 0x75, 0xc7, 0xa8, 0x02, 0xe9, 0x20, 0x70, 0xe1, 0xa1, 0xab, 0xb2, 0xf8, 0x78, 0x32, 0xfc, + 0xc9, 0x48, 0x75, 0xf6, 0x88, 0x08, 0x27, 0x02, 0x41, 0xf4, 0x3e, 0x64, 0x5d, 0xe3, 0x50, 0xef, + 0x1f, 0xfb, 0xd8, 0x2b, 0xc5, 0x6f, 0x27, 0xee, 0xe5, 0xb5, 0x8c, 0x6b, 0x1c, 0x56, 0xe8, 0x37, + 0x5a, 0x87, 0x8c, 0x33, 0x19, 0xe9, 0x2e, 0x39, 0xf4, 0xd8, 0x69, 0x1e, 0x04, 0x23, 0x69, 0x67, + 0x32, 0xd2, 0xc8, 0xa1, 0xa7, 0xd4, 0x60, 0x65, 0x26, 0x20, 0x30, 0x1c, 0xf4, 0x10, 0x24, 0x6f, + 0x6c, 0x38, 0x22, 0x14, 0xb9, 0x19, 0x19, 0x91, 0xc8, 0x0b, 0x36, 0x28, 0x5b, 0x10, 0x68, 0x52, + 0x56, 0xe5, 0xcf, 0x12, 0x73, 0x30, 0x3c, 0x28, 0x67, 0x91, 0x85, 0xc0, 0x99, 0xdf, 0xaf, 0x22, + 0x4f, 0xe0, 0xe1, 0x48, 0x0d, 0x7b, 0x03, 0xd7, 0x1a, 0xfb, 0xc4, 0x0d, 0x82, 0x25, 0x26, 0x8a, + 0xee, 0x40, 0xd6, 0x72, 0x4c, 0x7c, 0xa4, 0x5b, 0xe6, 0x11, 0x0b, 0x6c, 0x0a, 0xa2, 0x3d, 0xc3, + 0xc8, 0xaa, 0x79, 0x84, 0x6e, 0x41, 0xda, 0xc5, 0x2f, 0xb1, 0xeb, 0x61, 0x36, 0xc1, 0x20, 0x4a, + 0x0c, 0x88, 0xa8, 0x06, 0x49, 0x3a, 0xc4, 0x20, 0xe0, 0xbb, 0x60, 0x5c, 0x14, 0xce, 0x8f, 0x0b, + 0xa3, 0x0f, 0x01, 0x58, 0xf8, 0xa6, 0xef, 0x5b, 0x0e, 0x8f, 0xf9, 0x12, 0x82, 0x21, 0xcb, 0xe8, + 0x8f, 0x2d, 0xc7, 0xa7, 0xca, 0xb6, 0x3c, 0x7d, 0xb0, 0x8f, 0x07, 0x07, 0x2c, 0xf2, 0x0b, 0xc7, + 0x62, 0x79, 0x55, 0x4a, 0x44, 0x3b, 0x00, 0x2f, 0x2d, 0xcf, 0xea, 0x5b, 0xb6, 0xe5, 0x1f, 0xb3, + 0x80, 0xa4, 0x78, 0x8e, 0xc7, 0xe8, 0x0c, 0x0c, 0xe7, 0x69, 0xc8, 0x1e, 0x44, 0xbf, 0x53, 0x00, + 0xf4, 0x2d, 0xc8, 0x8d, 0x8c, 0x23, 0xdd, 0xc5, 0xde, 0xc4, 0xf6, 0x3d, 0x16, 0x9a, 0x04, 0xeb, + 0x0b, 0x23, 0xe3, 0x48, 0xe3, 0x74, 0xe5, 0x1f, 0x13, 0x50, 0x9c, 0x8d, 0xd4, 0x7e, 0x5d, 0x6b, + 0x73, 0x1f, 0x8a, 0x36, 0x21, 0x07, 0x93, 0xf1, 0x59, 0xe1, 0x39, 0x6f, 0x09, 0xc2, 0xf3, 0x0a, + 0xa4, 0x89, 0xc3, 0x42, 0xf3, 0xa5, 0x01, 0xe3, 0xe9, 0x9c, 0x81, 0x38, 0x94, 0x86, 0x7a, 0xf0, + 0x0e, 0x1f, 0x11, 0xcf, 0x21, 0x38, 0x5a, 0xf2, 0xb2, 0x68, 0x2b, 0x0c, 0xa3, 0xc1, 0x20, 0x18, + 0xec, 0xe7, 0x20, 0xd1, 0x3c, 0x96, 0x2d, 0x69, 0xf1, 0xd1, 0xfa, 0x02, 0x5d, 0x51, 0x0d, 0x77, + 0x8f, 0xc7, 0x38, 0xd8, 0x17, 0x54, 0xe4, 0x2d, 0x2f, 0x38, 0xf5, 0x20, 0x30, 0x0d, 0x97, 0xd1, + 0x2e, 0xac, 0x88, 0xec, 0x87, 0xb8, 0x26, 0x76, 0x2d, 0x67, 0x28, 0xd6, 0xf3, 0xce, 0xe2, 0xa4, + 0x53, 0x30, 0x0a, 0x70, 0x91, 0x3d, 0x05, 0x54, 0xf4, 0x08, 0x50, 0x00, 0xa5, 0x8f, 0x0c, 0x7f, + 0xb0, 0xaf, 0xdb, 0xd8, 0x99, 0x59, 0x5c, 0x39, 0x68, 0xdf, 0xa1, 0xcd, 0x4d, 0xec, 0x28, 0x7d, + 0xc8, 0x47, 0x43, 0x67, 0x74, 0x17, 0x56, 0x18, 0x0f, 0x36, 0xf5, 0xa8, 0x6f, 0x2b, 0x68, 0x45, + 0x41, 0x0e, 0x96, 0xfc, 0x3e, 0xc8, 0x41, 0x94, 0x1d, 0x72, 0xc6, 0x19, 0xe7, 0x4a, 0x40, 0x17, + 0xac, 0x34, 0xe5, 0x97, 0xe7, 0x4f, 0x63, 0x54, 0x83, 0x14, 0xb3, 0x44, 0x6f, 0x41, 0xda, 0x7f, + 0xbe, 0x15, 0x0b, 0x59, 0x54, 0x07, 0xc0, 0x2f, 0x66, 0xfa, 0xcf, 0x3d, 0xba, 0xbd, 0xf8, 0x20, + 0xe2, 0x7c, 0xc1, 0xde, 0xc7, 0x2f, 0x82, 0xc9, 0xac, 0x4f, 0x77, 0x43, 0xd4, 0xca, 0x83, 0xbd, + 0xf0, 0x76, 0x0c, 0x7c, 0x1b, 0xf2, 0x7b, 0xd6, 0x11, 0x36, 0x75, 0x11, 0xfc, 0x27, 0xd9, 0x68, + 0x2f, 0x1c, 0xfc, 0xe7, 0x98, 0x30, 0x27, 0xbe, 0x81, 0x55, 0x2b, 0x16, 0xbc, 0x73, 0x2a, 0x7c, + 0x40, 0x0a, 0xe4, 0x35, 0x72, 0xd8, 0x21, 0x13, 0x77, 0x80, 0x55, 0xf3, 0x88, 0x59, 0x62, 0x41, + 0x9b, 0xa1, 0xa1, 0x0f, 0x20, 0xdb, 0xa2, 0x87, 0xd8, 0x78, 0xe2, 0x7b, 0xdc, 0xaa, 0xb4, 0x29, + 0x01, 0x21, 0x90, 0x5a, 0xc6, 0x88, 0xbb, 0xf1, 0xac, 0xc6, 0x7e, 0x2b, 0x77, 0x21, 0x1d, 0x68, + 0xf8, 0x83, 0xd9, 0xb3, 0x92, 0xeb, 0x37, 0x20, 0x29, 0xff, 0x1a, 0x87, 0x95, 0xb9, 0xdc, 0x0b, + 0x35, 0xa1, 0x60, 0xe3, 0xbd, 0xab, 0xef, 0x8e, 0x3c, 0x95, 0x0e, 0xf7, 0x46, 0x0b, 0x8a, 0xae, + 0x35, 0xdc, 0x8f, 0xc0, 0xc5, 0x2f, 0x07, 0x57, 0x60, 0xe2, 0x21, 0x5e, 0xc4, 0x20, 0x92, 0x57, + 0x35, 0x88, 0x37, 0x70, 0x4d, 0xf7, 0xa1, 0xe0, 0x4c, 0x6c, 0x5b, 0xc7, 0x2f, 0x26, 0x46, 0xe8, + 0x9d, 0x82, 0x13, 0x2b, 0x4f, 0x9b, 0xea, 0xa2, 0x45, 0xf9, 0x59, 0x02, 0x8a, 0xb3, 0xc9, 0x28, + 0x7a, 0x00, 0x2b, 0x4c, 0xb5, 0x91, 0xad, 0x13, 0x8b, 0xb8, 0x76, 0xbc, 0xe7, 0xd7, 0xc3, 0xad, + 0xf1, 0x09, 0xc8, 0x5c, 0x71, 0x73, 0xfb, 0x8c, 0x33, 0x73, 0xa5, 0x4e, 0xb9, 0x7f, 0xc3, 0x6a, + 0xf9, 0x36, 0x14, 0x59, 0xc6, 0x3e, 0x75, 0x5e, 0x51, 0xbd, 0x14, 0x78, 0x5b, 0x30, 0xd6, 0x2f, + 0xe0, 0xe6, 0x9c, 0x16, 0x74, 0xc3, 0xc5, 0xfa, 0x01, 0x3e, 0x66, 0x87, 0x71, 0x20, 0x75, 0x7d, + 0x46, 0x1f, 0x65, 0x17, 0x3f, 0xc1, 0xc7, 0xe8, 0x47, 0x50, 0x9a, 0xd7, 0x4a, 0x28, 0x9c, 0x8d, + 0x08, 0xaf, 0xce, 0xea, 0x87, 0x4b, 0x2b, 0xff, 0x9d, 0x82, 0xe2, 0x6c, 0x9c, 0x8d, 0xee, 0x00, + 0x0c, 0x5d, 0xc2, 0xcf, 0xda, 0xa8, 0x82, 0xb3, 0x8c, 0x5a, 0x25, 0xb6, 0x87, 0x7e, 0x0f, 0xf2, + 0x41, 0x71, 0xc4, 0x22, 0xe2, 0x34, 0xce, 0x3d, 0xfa, 0xf4, 0x82, 0x95, 0x95, 0xf0, 0x73, 0xaa, + 0xf0, 0x19, 0x38, 0xf4, 0x5d, 0x71, 0x7a, 0x60, 0x53, 0x8f, 0x8c, 0x44, 0x0a, 0x47, 0x22, 0x8b, + 0xd6, 0xad, 0x70, 0x40, 0x0d, 0xb1, 0x50, 0x49, 0xb6, 0x50, 0x9f, 0x5c, 0x74, 0x20, 0xf3, 0xab, + 0xb6, 0xf6, 0x87, 0x71, 0xc8, 0x45, 0x46, 0x47, 0x71, 0xf7, 0x26, 0xce, 0x80, 0x6d, 0xf8, 0x4b, + 0xe0, 0x36, 0x26, 0x4e, 0x58, 0x40, 0xa5, 0xf2, 0xe8, 0x76, 0xa4, 0x7e, 0x14, 0xad, 0x41, 0x4e, + 0xcb, 0x43, 0x1f, 0x41, 0x51, 0x44, 0x1b, 0x03, 0x62, 0xb3, 0x50, 0x48, 0xe2, 0x8e, 0x8f, 0x53, + 0xab, 0xc4, 0xa6, 0x8e, 0xef, 0x26, 0xf3, 0x5d, 0xac, 0x39, 0xc9, 0x4e, 0xb8, 0xd4, 0x80, 0x37, + 0x6c, 0x41, 0xd6, 0x70, 0x87, 0x93, 0x11, 0x76, 0x7c, 0xaf, 0x94, 0xba, 0x6c, 0x49, 0x72, 0x2a, + 0xbb, 0x2d, 0x65, 0x12, 0xb2, 0xa4, 0xfc, 0x3c, 0x0e, 0x12, 0x9d, 0x04, 0x92, 0x21, 0x5f, 0x6e, + 0x7d, 0xad, 0xb7, 0xda, 0x5d, 0xbd, 0xd5, 0x6b, 0x36, 0xe5, 0x6b, 0x28, 0x0d, 0x89, 0xf2, 0xd3, + 0x2d, 0x39, 0x86, 0xf2, 0x90, 0xa9, 0xb4, 0xdb, 0x4d, 0xbd, 0xdc, 0xaa, 0xc9, 0x71, 0x94, 0x83, + 0x34, 0xfb, 0x6a, 0x6b, 0x72, 0x02, 0x15, 0x01, 0xaa, 0xed, 0x56, 0xb5, 0xdc, 0xd5, 0xcb, 0x5b, + 0x5b, 0xb2, 0x84, 0xb2, 0x90, 0xac, 0xb6, 0x7b, 0xad, 0xae, 0x9c, 0xa4, 0xe2, 0x3b, 0xe5, 0xaf, + 0xe4, 0x34, 0xfb, 0xa1, 0xb6, 0xe4, 0x0c, 0x02, 0x48, 0x75, 0xba, 0xb5, 0x5a, 0xfd, 0xa9, 0x9c, + 0xa5, 0xc4, 0x4e, 0x6f, 0x47, 0x06, 0x0a, 0xd7, 0xe9, 0xed, 0xe8, 0x6a, 0xab, 0x2b, 0xe7, 0x68, + 0x4f, 0x4f, 0xcb, 0x9a, 0x5a, 0x6e, 0x55, 0xeb, 0x72, 0x9e, 0x36, 0x7d, 0xd5, 0xd6, 0x18, 0x72, + 0x81, 0xf7, 0xd4, 0x6b, 0x75, 0x75, 0xad, 0xfd, 0xac, 0x23, 0x17, 0x99, 0xdc, 0x4f, 0xb4, 0x9a, + 0xda, 0x68, 0xc8, 0x2b, 0x08, 0x41, 0xb1, 0xa1, 0xb6, 0xca, 0x4d, 0x3d, 0x94, 0x96, 0xe9, 0x84, + 0x38, 0x4d, 0xf4, 0xf9, 0x0e, 0x2a, 0x40, 0xb6, 0xac, 0x69, 0xe5, 0xaf, 0x19, 0x22, 0xa2, 0x9d, + 0x6d, 0x77, 0xda, 0x2d, 0xf6, 0x75, 0x9d, 0x36, 0xd2, 0xaf, 0x0a, 0xfb, 0x5c, 0xa5, 0xdd, 0x75, + 0xba, 0x9a, 0xda, 0xda, 0x62, 0xdf, 0x37, 0x94, 0x4f, 0x40, 0xa2, 0x36, 0x84, 0x32, 0x20, 0x95, + 0x7b, 0xdd, 0xb6, 0x7c, 0x8d, 0xcd, 0xa6, 0x5a, 0x6e, 0x96, 0x35, 0x39, 0x46, 0xb9, 0x5b, 0xed, + 0x96, 0x2e, 0xbe, 0xe3, 0xca, 0xff, 0x26, 0xa0, 0x38, 0x5b, 0x02, 0x0b, 0x0d, 0x77, 0x99, 0x81, + 0xcd, 0x8a, 0x9d, 0x32, 0xdc, 0x69, 0x20, 0x1e, 0xbf, 0x7a, 0x20, 0x1e, 0x66, 0x38, 0x89, 0x37, + 0xc9, 0x70, 0x1e, 0x42, 0xc6, 0x9c, 0xb8, 0x6c, 0xfb, 0x30, 0x13, 0x4e, 0x54, 0x6e, 0xd0, 0xe6, + 0x5f, 0xbd, 0x5e, 0x2f, 0xf8, 0xd6, 0x08, 0x6f, 0xd4, 0x44, 0xa3, 0x16, 0xb2, 0xd1, 0xa4, 0x68, + 0xb0, 0x3f, 0x71, 0x0e, 0x74, 0xcf, 0x7a, 0x85, 0x67, 0x93, 0x22, 0x46, 0xef, 0x58, 0xaf, 0x30, + 0x6a, 0x43, 0x9e, 0xf8, 0xfb, 0xd8, 0xd5, 0x45, 0xac, 0x96, 0xba, 0x42, 0xac, 0x96, 0x63, 0x08, + 0x5d, 0x1e, 0xb0, 0x7d, 0x09, 0x19, 0x17, 0x1b, 0x66, 0xd9, 0x6b, 0xef, 0x89, 0x9a, 0xee, 0x6f, + 0x45, 0xc0, 0x26, 0xbe, 0x65, 0x6f, 0xec, 0xdb, 0x83, 0x8d, 0x6e, 0x70, 0x97, 0x14, 0x6c, 0xd9, + 0x40, 0x48, 0x79, 0x20, 0x16, 0x3f, 0x07, 0x69, 0xd5, 0x79, 0x69, 0xd8, 0x96, 0xc9, 0xd7, 0x9f, + 0x7b, 0x58, 0x39, 0x46, 0xcd, 0x5e, 0xa5, 0x61, 0x9b, 0x1c, 0x57, 0x4e, 0x62, 0x90, 0x69, 0xd8, + 0xe4, 0x90, 0x2d, 0xfa, 0x43, 0x48, 0xef, 0xd9, 0xe4, 0x50, 0x17, 0xb5, 0x82, 0x7c, 0xa5, 0x44, + 0x91, 0xff, 0xed, 0xf5, 0x7a, 0x8a, 0xb2, 0xa8, 0xb5, 0x93, 0xf0, 0x97, 0x96, 0xa2, 0x8c, 0xaa, + 0x89, 0x9a, 0xac, 0x46, 0x24, 0xee, 0xe8, 0x44, 0x74, 0xf9, 0xf1, 0xf2, 0xbb, 0xa5, 0xc8, 0x4d, + 0x4e, 0x44, 0x1e, 0xf5, 0x20, 0x3d, 0x34, 0x7c, 0x7c, 0x68, 0x1c, 0xb3, 0x20, 0x29, 0x59, 0xf9, + 0xa1, 0x58, 0xa2, 0x4f, 0x87, 0x96, 0xbf, 0x3f, 0xe9, 0x6f, 0x0c, 0xc8, 0x68, 0x33, 0x04, 0x37, + 0xfb, 0xd3, 0xdf, 0x9b, 0xe3, 0x83, 0xe1, 0x66, 0x90, 0xbe, 0xd3, 0x98, 0x4d, 0xad, 0x69, 0x01, + 0x96, 0x72, 0x08, 0xb9, 0x6d, 0xd2, 0xdf, 0x75, 0xc9, 0x90, 0xba, 0x17, 0xf4, 0x11, 0xa4, 0x9e, + 0x93, 0x7e, 0x30, 0xcb, 0x44, 0xa5, 0x20, 0x2a, 0x22, 0xc9, 0x6d, 0xd2, 0x57, 0x6b, 0x5a, 0xf2, + 0x39, 0xe9, 0xab, 0x26, 0xba, 0x07, 0xf9, 0x01, 0x71, 0x7c, 0xd7, 0xea, 0x4f, 0xc2, 0x2b, 0x9a, + 0x78, 0x70, 0x2c, 0x44, 0x5b, 0x50, 0x09, 0x24, 0xcf, 0x26, 0xbe, 0x18, 0x72, 0x50, 0x36, 0xb0, + 0x89, 0xaf, 0xfc, 0xb3, 0x04, 0xe8, 0x74, 0x49, 0x98, 0xe6, 0xb5, 0x1e, 0xab, 0x9c, 0x72, 0xc3, + 0x8a, 0x47, 0xe4, 0x80, 0x37, 0x30, 0xcb, 0x6a, 0x40, 0x66, 0x2c, 0xc6, 0xcc, 0x4e, 0xfa, 0xf3, + 0x0a, 0xbd, 0x91, 0xf9, 0x05, 0xf6, 0x10, 0xc8, 0xa2, 0x06, 0x24, 0x26, 0xae, 0x55, 0x4a, 0xb3, + 0xc5, 0xf9, 0xec, 0x12, 0xb5, 0xeb, 0x8d, 0x9e, 0x6b, 0xd5, 0x1d, 0xdf, 0x3d, 0xd6, 0x28, 0x00, + 0xfa, 0x31, 0xa4, 0xf8, 0x6d, 0xa9, 0xb8, 0x24, 0x58, 0x3f, 0xa3, 0x72, 0xa2, 0xb6, 0x1b, 0x96, + 0x8d, 0x1b, 0x8c, 0x2d, 0xbc, 0xf1, 0x62, 0x5f, 0xa8, 0x17, 0xa6, 0x33, 0x59, 0x36, 0x92, 0xef, + 0x5f, 0x66, 0x24, 0x7c, 0x6f, 0xb0, 0xc1, 0x30, 0xd8, 0x58, 0x98, 0xdf, 0x7c, 0x09, 0xef, 0x79, + 0x07, 0xd6, 0x58, 0x1f, 0x59, 0x9e, 0x47, 0xd3, 0xba, 0x3d, 0xe2, 0x62, 0x6b, 0xe8, 0xd0, 0x38, + 0x83, 0xdf, 0x1e, 0x04, 0x67, 0xda, 0xbb, 0x94, 0x6d, 0x87, 0x73, 0x35, 0x38, 0xd3, 0x13, 0x7c, + 0xec, 0xad, 0x19, 0x90, 0x8b, 0xa0, 0x23, 0x19, 0x12, 0x34, 0x44, 0x61, 0xc5, 0x32, 0x8d, 0xfe, + 0x44, 0x3f, 0x82, 0x24, 0xcb, 0x47, 0x2e, 0xe7, 0xc3, 0x34, 0x2e, 0xf4, 0x45, 0xfc, 0x07, 0xb1, + 0xb5, 0xef, 0x41, 0x26, 0x50, 0x65, 0x14, 0x3f, 0xc9, 0xf1, 0x57, 0xa3, 0xf8, 0xd9, 0x88, 0xdc, + 0xb6, 0x94, 0x89, 0xc9, 0x71, 0x7e, 0xf4, 0x6d, 0x4b, 0x19, 0x49, 0x4e, 0x6e, 0x4b, 0x99, 0xa4, + 0x9c, 0x52, 0xfe, 0x3a, 0x0e, 0x85, 0x99, 0xeb, 0x01, 0xf4, 0x31, 0xe4, 0x4c, 0x4c, 0x8f, 0x6c, + 0xee, 0xe0, 0x78, 0xa9, 0x4f, 0x38, 0x97, 0x48, 0x03, 0x7a, 0x00, 0x85, 0x43, 0xc3, 0xb6, 0xa9, + 0xc7, 0x6b, 0x19, 0x0e, 0xe1, 0x45, 0xb3, 0xc0, 0xab, 0xcd, 0x36, 0xa1, 0x27, 0xb3, 0x95, 0xa5, + 0xcd, 0x8b, 0xdd, 0x54, 0xb0, 0xe2, 0x19, 0xcd, 0x6d, 0x66, 0xdd, 0x6f, 0xd4, 0x98, 0x93, 0x57, + 0x37, 0x66, 0xaa, 0xca, 0xa0, 0x03, 0xba, 0xf1, 0x1c, 0x9a, 0x50, 0x45, 0x67, 0xcb, 0x28, 0x54, + 0xc9, 0xd8, 0x31, 0x99, 0x42, 0xf3, 0x1a, 0xfd, 0xb9, 0x2d, 0x65, 0xe2, 0x72, 0x42, 0xf9, 0xfb, + 0x18, 0x14, 0x66, 0xca, 0xe7, 0x17, 0x56, 0xdc, 0x5d, 0xc8, 0x53, 0x64, 0x7d, 0x6c, 0xf8, 0x3e, + 0x76, 0xb9, 0x3b, 0x08, 0x19, 0x69, 0xcb, 0x2e, 0x6f, 0x40, 0x3f, 0x86, 0x34, 0x19, 0x07, 0xe1, + 0xe7, 0xbc, 0xf7, 0x0e, 0xb6, 0x49, 0xb5, 0xf3, 0xb4, 0xcd, 0x99, 0x82, 0x12, 0x9a, 0x90, 0x99, + 0x9e, 0x39, 0xac, 0xa4, 0x29, 0x9d, 0x3a, 0x73, 0x58, 0x51, 0xf3, 0x0f, 0xe2, 0x00, 0x9d, 0x03, + 0xec, 0x0f, 0xf6, 0xd9, 0x1c, 0xb6, 0x21, 0xe7, 0xb1, 0x2f, 0x3d, 0x72, 0x66, 0x9f, 0x73, 0x21, + 0xc9, 0x78, 0x23, 0x47, 0x35, 0x78, 0x21, 0x05, 0x95, 0xa6, 0x59, 0x28, 0xaf, 0x55, 0x84, 0x75, + 0xd8, 0x4f, 0x01, 0x0d, 0xb1, 0x83, 0x5d, 0xc3, 0xc7, 0xfa, 0xbe, 0xe5, 0xf9, 0x64, 0xe8, 0x1a, + 0xa3, 0x99, 0x9a, 0xe4, 0x3b, 0x41, 0xfb, 0xe3, 0xa0, 0x19, 0xfd, 0x00, 0x6e, 0x84, 0xbc, 0xfa, + 0xc8, 0x38, 0xd2, 0xfb, 0x93, 0xc1, 0x01, 0xf6, 0xf9, 0xcc, 0x82, 0x9a, 0xcb, 0xf5, 0x90, 0x65, + 0xc7, 0x38, 0xaa, 0x70, 0x06, 0x74, 0x07, 0xb2, 0x9e, 0x6f, 0xf8, 0x3a, 0x5b, 0xe1, 0x64, 0x44, + 0xdb, 0x19, 0x4a, 0x66, 0xc9, 0xf3, 0xdf, 0xc5, 0x20, 0x17, 0xb9, 0xe1, 0x42, 0x75, 0xc8, 0xf0, + 0x99, 0x84, 0x25, 0x93, 0x65, 0x4a, 0x88, 0x9c, 0x43, 0xa1, 0xe8, 0x59, 0xee, 0xb9, 0xb0, 0xc4, + 0x3d, 0x67, 0xaf, 0x6e, 0xd1, 0xca, 0x7f, 0xc5, 0x61, 0xf5, 0xac, 0xeb, 0xb5, 0x5f, 0xf3, 0x74, + 0x7e, 0x1f, 0x10, 0xff, 0x0a, 0x32, 0xc3, 0x48, 0xa5, 0xe7, 0x27, 0x27, 0xaf, 0xd7, 0xc5, 0x65, + 0x9f, 0xc8, 0x0d, 0xd5, 0x9a, 0xf7, 0xab, 0xd7, 0xeb, 0x9f, 0x5f, 0xe8, 0x58, 0x8e, 0xbc, 0x9a, + 0xd9, 0x08, 0xa4, 0x35, 0xd9, 0x9b, 0x81, 0x33, 0x3d, 0x64, 0x40, 0x86, 0xb9, 0x74, 0x7a, 0x30, + 0x73, 0xeb, 0x68, 0x04, 0x8f, 0x39, 0x98, 0x6b, 0x55, 0x6b, 0x17, 0x0e, 0x04, 0xa2, 0x3d, 0xd2, + 0x40, 0x80, 0xe1, 0xaa, 0xa6, 0xf2, 0x7f, 0x12, 0xbc, 0x7f, 0xce, 0x3d, 0x23, 0xfa, 0x6a, 0xae, + 0xe2, 0xf6, 0xc5, 0x55, 0x6e, 0x2b, 0xf9, 0x41, 0x30, 0x57, 0x85, 0x8b, 0x54, 0xf1, 0xe3, 0x67, + 0x55, 0xf1, 0x67, 0xeb, 0xef, 0x89, 0xb3, 0xeb, 0xef, 0x6f, 0xa3, 0xc4, 0xf6, 0xf9, 0x4c, 0x46, + 0x7a, 0x99, 0xd2, 0xc1, 0xda, 0xdf, 0xc4, 0x21, 0xc9, 0xe6, 0x86, 0x7e, 0x17, 0x24, 0x13, 0x7b, + 0x83, 0x2b, 0x55, 0xd7, 0x99, 0xe4, 0x45, 0x8a, 0xeb, 0xc1, 0x03, 0xa1, 0xc4, 0x1b, 0x3c, 0x10, + 0xaa, 0x42, 0x26, 0xac, 0x66, 0x49, 0x97, 0xab, 0x66, 0x85, 0x82, 0xd3, 0xfc, 0x23, 0xf9, 0x06, + 0xf9, 0x87, 0xf2, 0x8b, 0x18, 0x14, 0x67, 0xef, 0x48, 0xd1, 0x97, 0x90, 0xe4, 0x6f, 0x75, 0x62, + 0x97, 0x4d, 0x8c, 0xb9, 0x1c, 0xea, 0x42, 0xe8, 0x72, 0xcd, 0xb9, 0x12, 0xef, 0x9d, 0x05, 0x8b, + 0xc2, 0xf7, 0x5b, 0x64, 0x6d, 0xe5, 0x10, 0x21, 0xa8, 0xfa, 0xdc, 0x05, 0xd9, 0x99, 0x8c, 0x58, + 0x71, 0x43, 0x1f, 0x63, 0x57, 0x1f, 0x62, 0x87, 0xfb, 0x01, 0xad, 0xe0, 0x4c, 0x46, 0x55, 0x62, + 0x7b, 0xbb, 0xd8, 0xdd, 0xc2, 0x8e, 0xf2, 0xa7, 0x79, 0xc8, 0x47, 0xef, 0x6b, 0xd1, 0x6d, 0xc8, + 0x8d, 0x0d, 0xd7, 0xb7, 0x58, 0x05, 0xe5, 0x58, 0x94, 0xc5, 0xa3, 0x24, 0xa4, 0x41, 0x96, 0xdf, + 0xe9, 0x36, 0xc2, 0x91, 0x6e, 0x5c, 0xe8, 0x2e, 0x58, 0x7c, 0x34, 0xc2, 0xd2, 0x40, 0x08, 0xb3, + 0xf6, 0x57, 0x31, 0x51, 0x14, 0xd0, 0xa0, 0x10, 0xd4, 0x6b, 0x70, 0xe3, 0x8a, 0xe5, 0x11, 0x6d, + 0x16, 0x02, 0xed, 0x02, 0x88, 0x9e, 0x28, 0x60, 0x9c, 0x01, 0x7e, 0xf7, 0x52, 0x23, 0xa6, 0xa0, + 0x11, 0x0c, 0x7e, 0x91, 0xbb, 0xf6, 0xcb, 0x24, 0x24, 0x1b, 0x2e, 0x8d, 0x55, 0xb6, 0x41, 0x1a, + 0x11, 0x33, 0x38, 0xb6, 0x2f, 0x88, 0xcd, 0x44, 0x37, 0x76, 0x88, 0x19, 0x6e, 0x51, 0x8a, 0x81, + 0x76, 0x21, 0xd5, 0x27, 0x13, 0xc7, 0xf4, 0x44, 0xac, 0xfa, 0xe8, 0x32, 0x68, 0x15, 0x26, 0x19, + 0xf8, 0x0b, 0x8e, 0xb3, 0xf6, 0x3f, 0x31, 0x48, 0xb2, 0x06, 0xf4, 0x35, 0x64, 0x19, 0xad, 0x3b, + 0x8d, 0x31, 0x7e, 0xfb, 0xd2, 0xf0, 0x11, 0xc3, 0x9b, 0xa2, 0x51, 0xef, 0x67, 0x39, 0xbe, 0x2e, + 0x5e, 0x9c, 0x45, 0xdd, 0x41, 0xd6, 0x72, 0xfc, 0x36, 0x7f, 0x74, 0x76, 0x07, 0xf2, 0xd4, 0x0d, + 0x99, 0x01, 0x5b, 0x82, 0x05, 0x77, 0x39, 0x46, 0x13, 0x2c, 0x2a, 0xe4, 0x78, 0x23, 0x0f, 0x84, + 0xf8, 0x8e, 0xbf, 0xf8, 0x95, 0x33, 0x70, 0x61, 0x3a, 0xa4, 0xb5, 0x3f, 0x8f, 0x41, 0x8a, 0x2b, + 0x04, 0xed, 0x40, 0xd2, 0xf3, 0x0d, 0xd7, 0x17, 0xee, 0xee, 0xe1, 0xa5, 0x27, 0x1d, 0x3a, 0x02, + 0x8a, 0x82, 0xaa, 0xd3, 0xd8, 0xf4, 0x2a, 0x60, 0x2c, 0x9c, 0x55, 0xee, 0x82, 0x44, 0x17, 0x9f, + 0xa6, 0xf2, 0x5a, 0xb9, 0xb5, 0x55, 0x97, 0xaf, 0xa1, 0x0c, 0x48, 0xac, 0xd8, 0x14, 0xa3, 0xb9, + 0xfe, 0x96, 0xd6, 0xee, 0xed, 0x76, 0xe4, 0xb8, 0xf2, 0x0a, 0xb2, 0xa1, 0xe2, 0xd1, 0x4d, 0xb8, + 0xde, 0x6b, 0x55, 0xda, 0xbd, 0x56, 0xad, 0x5e, 0xd3, 0x77, 0xb5, 0x7a, 0xb5, 0x5e, 0x53, 0x5b, + 0x5b, 0xf2, 0xb5, 0xd9, 0x86, 0x46, 0xbb, 0xd9, 0x6c, 0x3f, 0xa3, 0x0d, 0x31, 0xb4, 0x0a, 0x72, + 0xbb, 0xd1, 0xe8, 0xd4, 0xbb, 0x11, 0xf6, 0x78, 0x84, 0x3a, 0xe5, 0x4d, 0xa0, 0x15, 0xc8, 0x55, + 0x7b, 0x9a, 0x56, 0xe7, 0x55, 0x2f, 0x59, 0x5a, 0xfb, 0xa7, 0x38, 0x64, 0x82, 0x6d, 0x8b, 0x6a, + 0x91, 0x92, 0xe5, 0x79, 0x0f, 0x37, 0x66, 0xe7, 0x3d, 0x5f, 0xb0, 0xfc, 0x18, 0x72, 0x86, 0x3b, + 0x54, 0xcd, 0xa3, 0x0e, 0x5b, 0x91, 0xa8, 0xa9, 0x44, 0x1b, 0xd0, 0x6d, 0xc8, 0x18, 0xee, 0xb0, + 0x4a, 0x26, 0xe2, 0x34, 0x0d, 0x8f, 0x97, 0x80, 0xfa, 0x76, 0x8e, 0x86, 0x32, 0x24, 0xf7, 0xdc, + 0x20, 0x40, 0x3d, 0xef, 0x81, 0xc7, 0xe9, 0xd5, 0xd4, 0xb8, 0x24, 0xba, 0x07, 0x33, 0xa5, 0x54, + 0xf1, 0x2e, 0x55, 0xd4, 0x19, 0xa2, 0x2d, 0xca, 0xcf, 0x63, 0x00, 0x53, 0x9f, 0x82, 0x8a, 0x00, + 0x5a, 0xfb, 0x99, 0xde, 0xea, 0xed, 0x54, 0xea, 0x9a, 0x58, 0xff, 0x72, 0xeb, 0x09, 0xaf, 0xef, + 0xd5, 0xea, 0xad, 0x4e, 0x5d, 0x67, 0xdf, 0x71, 0x24, 0x43, 0x7e, 0xb7, 0xae, 0x55, 0xd9, 0xc2, + 0x50, 0x4a, 0x02, 0x15, 0x20, 0x5b, 0xed, 0xed, 0xd4, 0xf5, 0x9a, 0xda, 0xe9, 0xf2, 0x3a, 0x68, + 0xab, 0xab, 0x36, 0xeb, 0xbc, 0x0e, 0xda, 0x2c, 0x6f, 0xc9, 0x29, 0x0a, 0xd7, 0xac, 0x97, 0x6b, + 0x72, 0x9a, 0xae, 0x6b, 0x43, 0xd5, 0x3a, 0x5d, 0xfd, 0x69, 0xb9, 0xd9, 0xab, 0xcb, 0x19, 0x8a, + 0xdf, 0x2c, 0x87, 0xdf, 0x59, 0x8a, 0xd6, 0xea, 0x3e, 0x16, 0x9f, 0xa0, 0xfc, 0x6d, 0x1c, 0x56, + 0xcf, 0x7a, 0x29, 0x83, 0x3a, 0x90, 0x3e, 0x34, 0xa2, 0xf1, 0xec, 0xa7, 0x97, 0x7a, 0x69, 0xb3, + 0xf1, 0x8c, 0x0a, 0x07, 0x91, 0x93, 0x40, 0x62, 0xa5, 0x70, 0x8c, 0x83, 0xfd, 0x34, 0xef, 0xeb, + 0xd9, 0x4b, 0x70, 0xfe, 0x2a, 0x5c, 0x60, 0x52, 0xe6, 0x1a, 0xf6, 0x0d, 0xcb, 0xf6, 0x42, 0xcb, + 0xc2, 0xd8, 0x5c, 0xfb, 0xa3, 0x18, 0x24, 0x59, 0x07, 0xa8, 0x05, 0xb2, 0xe5, 0x58, 0xbe, 0x65, + 0xd8, 0xba, 0x8b, 0x3d, 0x62, 0xbf, 0xc4, 0xa6, 0xb0, 0xda, 0x0b, 0x15, 0xe2, 0x56, 0x84, 0xb0, + 0x26, 0x64, 0xc3, 0xf7, 0x26, 0xf1, 0x8b, 0xbf, 0x37, 0xf9, 0x87, 0x18, 0xa0, 0xd3, 0x6f, 0x82, + 0x50, 0x05, 0x0a, 0xbe, 0x6b, 0x0c, 0x0e, 0xb0, 0xa9, 0xf3, 0x88, 0x84, 0xab, 0x71, 0x09, 0x64, + 0x5e, 0xc8, 0x74, 0x44, 0x22, 0xfe, 0x56, 0xf4, 0x15, 0xa9, 0xa2, 0x25, 0x16, 0x57, 0xd1, 0x1e, + 0x7c, 0x1f, 0x8a, 0xb3, 0xb7, 0xfe, 0xd4, 0x39, 0xed, 0xf6, 0x2a, 0x4d, 0xb5, 0x2a, 0x5f, 0x43, + 0xef, 0xc1, 0x0d, 0xfe, 0x5b, 0x2f, 0xb7, 0x6a, 0xac, 0x98, 0x2f, 0x9a, 0x62, 0x0f, 0x94, 0x20, + 0xc3, 0x65, 0x8e, 0x6b, 0x15, 0xe4, 0xc7, 0xcd, 0xa6, 0xbe, 0xdb, 0xec, 0x75, 0xf8, 0x9f, 0xa7, + 0x0f, 0xe5, 0x6b, 0x95, 0x0f, 0xbf, 0xf9, 0xe5, 0xad, 0x6b, 0xdf, 0x9c, 0xdc, 0x8a, 0xfd, 0xe2, + 0xe4, 0x56, 0xec, 0x5f, 0x4e, 0x6e, 0xc5, 0xfe, 0xfd, 0xe4, 0x56, 0xec, 0x67, 0xff, 0x71, 0xeb, + 0xda, 0x4f, 0xb3, 0xa1, 0x25, 0xfd, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x94, 0x20, 0x47, 0x12, + 0x52, 0x30, 0x00, 0x00, } diff --git a/pkg/sql/distsqlpb/processors.proto b/pkg/sql/distsqlpb/processors.proto index 08bab49d14b0..55b66dfe9163 100644 --- a/pkg/sql/distsqlpb/processors.proto +++ b/pkg/sql/distsqlpb/processors.proto @@ -757,6 +757,9 @@ message SketchSpec { message SamplerSpec { repeated SketchSpec sketches = 1 [(gogoproto.nullable) = false]; optional uint32 sample_size = 2 [(gogoproto.nullable) = false]; + + // Records progress of the CREATE STATISTICS job. + optional JobProgress progress = 9 [(gogoproto.nullable) = false]; } // SampleAggregatorSpec is the specification of a processor that aggregates the diff --git a/pkg/sql/distsqlrun/processors.go b/pkg/sql/distsqlrun/processors.go index dd09fb3f2ccf..cc23353e9fe9 100644 --- a/pkg/sql/distsqlrun/processors.go +++ b/pkg/sql/distsqlrun/processors.go @@ -255,16 +255,15 @@ func emitHelper( } // Bypass EmitRow() and send directly to output.output. consumerStatus = output.output.Push(nil /* row */, meta) + if meta.Err != nil { + consumerStatus = ConsumerClosed + } } else { var err error consumerStatus, err = output.EmitRow(ctx, row) if err != nil { output.output.Push(nil /* row */, &ProducerMetadata{Err: err}) - for _, input := range inputs { - input.ConsumerClosed() - } - output.Close() - return false + consumerStatus = ConsumerClosed } } switch consumerStatus { diff --git a/pkg/sql/distsqlrun/sampler.go b/pkg/sql/distsqlrun/sampler.go index 155781da7919..40ac49ef8374 100644 --- a/pkg/sql/distsqlrun/sampler.go +++ b/pkg/sql/distsqlrun/sampler.go @@ -18,6 +18,8 @@ import ( "context" "github.com/axiomhq/hyperloglog" + "github.com/cockroachdb/cockroach/pkg/jobs" + "github.com/cockroachdb/cockroach/pkg/jobs/jobspb" "github.com/cockroachdb/cockroach/pkg/sql/distsqlpb" "github.com/cockroachdb/cockroach/pkg/sql/sem/tree" "github.com/cockroachdb/cockroach/pkg/sql/sqlbase" @@ -41,6 +43,7 @@ type sketchInfo struct { type samplerProcessor struct { ProcessorBase + spec *distsqlpb.SamplerSpec flowCtx *FlowCtx input RowSource sr stats.SampleReservoir @@ -58,6 +61,8 @@ var _ Processor = &samplerProcessor{} const samplerProcName = "sampler" +const samplerProgressInterval = 10000 + var supportedSketchTypes = map[distsqlpb.SketchType]struct{}{ // The code currently hardcodes the use of this single type of sketch // (which avoids the extra complexity until we actually have multiple types). @@ -82,6 +87,7 @@ func newSamplerProcessor( } s := &samplerProcessor{ + spec: spec, flowCtx: flowCtx, input: input, sketches: make([]sketchInfo, len(spec.Sketches)), @@ -155,10 +161,31 @@ func (s *samplerProcessor) Run(ctx context.Context) { } } -func (s *samplerProcessor) mainLoop(ctx context.Context) (earlyExit bool, _ error) { +func (s *samplerProcessor) mainLoop(ctx context.Context) (earlyExit bool, err error) { + var job *jobs.Job + job, err = s.flowCtx.JobRegistry.LoadJob(ctx, s.spec.Progress.JobID) + if err != nil { + return false, err + } + + progFn := func(pct float32) error { + return job.FractionProgressed(ctx, func(ctx context.Context, details jobspb.ProgressDetails) float32 { + d := details.(*jobspb.Progress_CreateStats).CreateStats + slotpct := pct * s.spec.Progress.Contribution + d.SamplerProgress[s.spec.Progress.Slot] = slotpct + return d.Completed() + }) + } + defer func() { + if err == nil { + err = progFn(1.0) + } + }() + rng, _ := randutil.NewPseudoRand() var da sqlbase.DatumAlloc var buf []byte + rowCount := 0 for { row, meta := s.input.Next() if meta != nil { @@ -172,6 +199,18 @@ func (s *samplerProcessor) mainLoop(ctx context.Context) (earlyExit bool, _ erro break } + rowCount++ + if rowCount%samplerProgressInterval == 0 { + // TODO(rytaft): We could have more intermediate measures of progress if + // we were to run this at the kv layer where we know how many spans have + // been processed out of the total. For now, report 0 progress until all + // rows have been processed. The purpose of this function call is to + // periodically check that the job has not been paused or canceled. + if err := progFn(0); err != nil { + return false, err + } + } + for i := range s.sketches { // TODO(radu): for multi-column sketches, we will need to do this for all // columns. @@ -184,7 +223,6 @@ func (s *samplerProcessor) mainLoop(ctx context.Context) (earlyExit bool, _ erro // We need to use a KEY encoding because equal values should have the same // encoding. // TODO(radu): a fast path for simple columns (like integer)? - var err error buf, err = row[col].Encode(&s.outTypes[col], &da, sqlbase.DatumEncoding_ASCENDING_KEY, buf[:0]) if err != nil { return false, err diff --git a/pkg/sql/expand_plan.go b/pkg/sql/expand_plan.go index 98128701edd2..4468193e9ea4 100644 --- a/pkg/sql/expand_plan.go +++ b/pkg/sql/expand_plan.go @@ -364,7 +364,6 @@ func doExpandPlan( case *CreateUserNode: case *createViewNode: case *createSequenceNode: - case *createStatsNode: case *dropDatabaseNode: case *dropIndexNode: case *dropTableNode: @@ -876,7 +875,6 @@ func (p *planner) simplifyOrderings(plan planNode, usefulOrdering sqlbase.Column case *CreateUserNode: case *createViewNode: case *createSequenceNode: - case *createStatsNode: case *dropDatabaseNode: case *dropIndexNode: case *dropTableNode: diff --git a/pkg/sql/opt_filters.go b/pkg/sql/opt_filters.go index e0d33e75450d..39e7fc836da5 100644 --- a/pkg/sql/opt_filters.go +++ b/pkg/sql/opt_filters.go @@ -379,7 +379,6 @@ func (p *planner) propagateFilters( case *CreateUserNode: case *createViewNode: case *createSequenceNode: - case *createStatsNode: case *dropDatabaseNode: case *dropIndexNode: case *dropTableNode: diff --git a/pkg/sql/opt_limits.go b/pkg/sql/opt_limits.go index ec8af3a9cb50..b57b795a59d1 100644 --- a/pkg/sql/opt_limits.go +++ b/pkg/sql/opt_limits.go @@ -224,7 +224,6 @@ func (p *planner) applyLimit(plan planNode, numRows int64, soft bool) { case *CreateUserNode: case *createViewNode: case *createSequenceNode: - case *createStatsNode: case *dropDatabaseNode: case *dropIndexNode: case *dropTableNode: diff --git a/pkg/sql/opt_needed.go b/pkg/sql/opt_needed.go index 33d830853953..6e57f4743511 100644 --- a/pkg/sql/opt_needed.go +++ b/pkg/sql/opt_needed.go @@ -272,7 +272,6 @@ func setNeededColumns(plan planNode, needed []bool) { case *CreateUserNode: case *createViewNode: case *createSequenceNode: - case *createStatsNode: case *dropDatabaseNode: case *dropIndexNode: case *dropTableNode: diff --git a/pkg/sql/plan.go b/pkg/sql/plan.go index 34f30915ad10..c1bd7d77d7f6 100644 --- a/pkg/sql/plan.go +++ b/pkg/sql/plan.go @@ -167,7 +167,6 @@ var _ planNode = &cancelSessionsNode{} var _ planNode = &createDatabaseNode{} var _ planNode = &createIndexNode{} var _ planNode = &createSequenceNode{} -var _ planNode = &createStatsNode{} var _ planNode = &createTableNode{} var _ planNode = &CreateUserNode{} var _ planNode = &createViewNode{} @@ -484,8 +483,6 @@ func startExec(params runParams, plan planNode) error { case *showTraceNode: // showTrace needs to override the params struct, and does so in its startExec() method. return false, nil - case *createStatsNode: - return false, errors.Errorf("statistics can only be created via DistSQL") } return true, nil }, @@ -642,8 +639,6 @@ func (p *planner) newPlan( return p.CreateView(ctx, n) case *tree.CreateSequence: return p.CreateSequence(ctx, n) - case *tree.CreateStats: - return p.CreateStatistics(ctx, n) case *tree.Deallocate: return p.Deallocate(ctx, n) case *tree.Delete: diff --git a/pkg/sql/plan_physical_props.go b/pkg/sql/plan_physical_props.go index 1c59c8e955a4..a4ab32c7b084 100644 --- a/pkg/sql/plan_physical_props.go +++ b/pkg/sql/plan_physical_props.go @@ -104,7 +104,6 @@ func planPhysicalProps(plan planNode) physicalProps { case *createDatabaseNode: case *createIndexNode: case *createSequenceNode: - case *createStatsNode: case *createTableNode: case *createViewNode: case *delayedNode: diff --git a/pkg/sql/stats/automatic_stats.go b/pkg/sql/stats/automatic_stats.go index 10d6d96d83af..70c8a163d82b 100644 --- a/pkg/sql/stats/automatic_stats.go +++ b/pkg/sql/stats/automatic_stats.go @@ -290,12 +290,6 @@ func (r *Refresher) maybeRefreshStats( return } - // TODO(rytaft): Add logic to create a Job ID for this refresh and use the - // Job ID to lock automatic stats creation for this table with a lock - // manager. If the lock succeeds, check the stats cache one more time to - // make sure a new statistic was not just added. If not, proceed to the next - // step. - if err := r.refreshStats(ctx, tableID, asOf); err != nil { pgerr, ok := errors.Cause(err).(*pgerror.Error) if ok && pgerr.Code == pgerror.CodeUndefinedTableError { diff --git a/pkg/sql/stats/create_stats_job_test.go b/pkg/sql/stats/create_stats_job_test.go new file mode 100644 index 000000000000..0d2cd2c5975c --- /dev/null +++ b/pkg/sql/stats/create_stats_job_test.go @@ -0,0 +1,324 @@ +// Copyright 2019 The Cockroach Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +// implied. See the License for the specific language governing +// permissions and limitations under the License. + +package stats_test + +import ( + "context" + "fmt" + "testing" + "time" + + "github.com/cockroachdb/cockroach/pkg/base" + "github.com/cockroachdb/cockroach/pkg/jobs" + "github.com/cockroachdb/cockroach/pkg/jobs/jobspb" + "github.com/cockroachdb/cockroach/pkg/roachpb" + "github.com/cockroachdb/cockroach/pkg/sql/sqlbase" + "github.com/cockroachdb/cockroach/pkg/storage" + "github.com/cockroachdb/cockroach/pkg/storage/storagebase" + "github.com/cockroachdb/cockroach/pkg/testutils" + "github.com/cockroachdb/cockroach/pkg/testutils/jobutils" + "github.com/cockroachdb/cockroach/pkg/testutils/sqlutils" + "github.com/cockroachdb/cockroach/pkg/testutils/testcluster" + "github.com/cockroachdb/cockroach/pkg/util/encoding" + "github.com/cockroachdb/cockroach/pkg/util/hlc" + "github.com/cockroachdb/cockroach/pkg/util/leaktest" + "github.com/cockroachdb/cockroach/pkg/util/protoutil" +) + +// TestCreateStatsControlJob tests that PAUSE JOB, RESUME JOB, and CANCEL JOB +// work as intended on create statistics jobs. +func TestCreateStatsControlJob(t *testing.T) { + defer leaktest.AfterTest(t)() + + defer func(oldInterval time.Duration) { + jobs.DefaultAdoptInterval = oldInterval + }(jobs.DefaultAdoptInterval) + jobs.DefaultAdoptInterval = 100 * time.Millisecond + + var allowRequest chan struct{} + + var serverArgs base.TestServerArgs + params := base.TestClusterArgs{ServerArgs: serverArgs} + params.ServerArgs.Knobs.Store = &storage.StoreTestingKnobs{ + TestingRequestFilter: createStatsRequestFilter(&allowRequest), + } + + ctx := context.Background() + tc := testcluster.StartTestCluster(t, 1, params) + defer tc.Stopper().Stop(ctx) + sqlDB := sqlutils.MakeSQLRunner(tc.Conns[0]) + sqlDB.Exec(t, `CREATE DATABASE d`) + sqlDB.Exec(t, `CREATE TABLE d.t (x INT)`) + sqlDB.Exec(t, `INSERT INTO d.t SELECT generate_series(1,20000)`) + + t.Run("cancel", func(t *testing.T) { + // Test that CREATE STATISTICS can be canceled. + query := fmt.Sprintf(`CREATE STATISTICS s1 FROM d.t`) + + if _, err := jobutils.RunJob( + t, sqlDB, &allowRequest, []string{"cancel"}, query, + ); !testutils.IsError(err, "job canceled") { + t.Fatalf("expected 'job canceled' error, but got %+v", err) + } + + // There should be no results here. + sqlDB.CheckQueryResults(t, + `SELECT statistics_name, column_names, row_count FROM [SHOW STATISTICS FOR TABLE d.t]`, + [][]string{}) + }) + + t.Run("pause", func(t *testing.T) { + // Test that CREATE STATISTICS can be paused and resumed. + query := fmt.Sprintf(`CREATE STATISTICS s2 FROM d.t`) + + jobID, err := jobutils.RunJob( + t, sqlDB, &allowRequest, []string{"PAUSE"}, query, + ) + if !testutils.IsError(err, "job paused") { + t.Fatalf("unexpected: %v", err) + } + + // There should be no results here. + sqlDB.CheckQueryResults(t, + `SELECT statistics_name, column_names, row_count FROM [SHOW STATISTICS FOR TABLE d.t]`, + [][]string{}) + + sqlDB.Exec(t, fmt.Sprintf(`RESUME JOB %d`, jobID)) + jobutils.WaitForJob(t, sqlDB, jobID) + + // Now the job should have succeeded in producing stats. + sqlDB.CheckQueryResults(t, + `SELECT statistics_name, column_names, row_count FROM [SHOW STATISTICS FOR TABLE d.t]`, + [][]string{ + {"s2", "{x}", "20000"}, + }) + }) +} + +// TestCreateStatsLivenessWithRestart tests that a node liveness transition +// during CREATE STATISTICS correctly resumes after the node executing the job +// becomes non-live (from the perspective of the jobs registry). +func TestCreateStatsLivenessWithRestart(t *testing.T) { + defer leaktest.AfterTest(t)() + + defer func(oldAdoptInterval, oldCancelInterval time.Duration) { + jobs.DefaultAdoptInterval = oldAdoptInterval + jobs.DefaultCancelInterval = oldCancelInterval + }(jobs.DefaultAdoptInterval, jobs.DefaultCancelInterval) + jobs.DefaultAdoptInterval = 100 * time.Millisecond + jobs.DefaultCancelInterval = 100 * time.Millisecond + + const nodes = 1 + nl := jobs.NewFakeNodeLiveness(nodes) + serverArgs := base.TestServerArgs{ + Knobs: base.TestingKnobs{ + RegistryLiveness: nl, + }, + } + + var allowRequest chan struct{} + params := base.TestClusterArgs{ServerArgs: serverArgs} + params.ServerArgs.Knobs.Store = &storage.StoreTestingKnobs{ + TestingRequestFilter: createStatsRequestFilter(&allowRequest), + } + + ctx := context.Background() + tc := testcluster.StartTestCluster(t, nodes, params) + defer tc.Stopper().Stop(ctx) + conn := tc.Conns[0] + sqlDB := sqlutils.MakeSQLRunner(conn) + + sqlDB.Exec(t, `CREATE DATABASE liveness`) + sqlDB.Exec(t, `CREATE TABLE liveness.t (i INT8 PRIMARY KEY)`) + sqlDB.Exec(t, `INSERT INTO liveness.t SELECT generate_series(1,20000)`) + + const query = `CREATE STATISTICS s1 FROM liveness.t` + + // Start a CREATE STATISTICS run and wait until it's done one scan. + allowRequest = make(chan struct{}) + errCh := make(chan error) + go func() { + _, err := conn.Exec(query) + errCh <- err + }() + select { + case allowRequest <- struct{}{}: + case err := <-errCh: + t.Fatal(err) + } + + // Fetch the new job ID and lease since we know it's running now. + var jobID int64 + originalLease := &jobspb.Progress{} + { + var expectedLeaseBytes []byte + sqlDB.QueryRow( + t, `SELECT id, progress FROM system.jobs ORDER BY created DESC LIMIT 1`, + ).Scan(&jobID, &expectedLeaseBytes) + if err := protoutil.Unmarshal(expectedLeaseBytes, originalLease); err != nil { + t.Fatal(err) + } + } + + // Make the node non-live and wait for cancellation. + nl.FakeSetExpiration(1, hlc.MinTimestamp) + // Wait for the registry cancel loop to run and cancel the job. + <-nl.SelfCalledCh + <-nl.SelfCalledCh + close(allowRequest) + err := <-errCh + if !testutils.IsError(err, "job .*: node liveness error") { + t.Fatalf("unexpected: %v", err) + } + + // Ensure that complete progress has not been recorded. + partialProgress := jobutils.GetJobProgress(t, sqlDB, jobID) + if partialProgress.Details.(*jobspb.Progress_CreateStats).CreateStats.Completed() == 1 { + t.Fatal("create stats should not have recorded progress") + } + + // Make the node live again. + nl.FakeSetExpiration(1, hlc.MaxTimestamp) + + // The registry should now adopt the job and resume it. + jobutils.WaitForJob(t, sqlDB, jobID) + + // Verify that the job lease was updated. + rescheduledProgress := jobutils.GetJobProgress(t, sqlDB, jobID) + if rescheduledProgress.ModifiedMicros <= originalLease.ModifiedMicros { + t.Fatalf("expecting rescheduled job to have a later modification time: %d vs %d", + rescheduledProgress.ModifiedMicros, originalLease.ModifiedMicros) + } + + // Verify that progress is now recorded. + if rescheduledProgress.Details.(*jobspb.Progress_CreateStats).CreateStats.Completed() != 1 { + t.Fatal("create stats should have recorded progress") + } + + // Now the job should have succeeded in producing stats. + sqlDB.CheckQueryResults(t, + `SELECT statistics_name, column_names, row_count FROM [SHOW STATISTICS FOR TABLE liveness.t]`, + [][]string{ + {"s1", "{i}", "20000"}, + }) +} + +// TestCreateStatsLivenessWithLeniency tests that a temporary node liveness +// transition during CREATE STATISTICS doesn't cancel the job, but allows the +// owning node to continue processing. +func TestCreateStatsLivenessWithLeniency(t *testing.T) { + defer leaktest.AfterTest(t)() + + defer func(oldAdoptInterval, oldCancelInterval time.Duration) { + jobs.DefaultAdoptInterval = oldAdoptInterval + jobs.DefaultCancelInterval = oldCancelInterval + }(jobs.DefaultAdoptInterval, jobs.DefaultCancelInterval) + jobs.DefaultAdoptInterval = 100 * time.Millisecond + jobs.DefaultCancelInterval = 100 * time.Millisecond + + const nodes = 1 + nl := jobs.NewFakeNodeLiveness(nodes) + serverArgs := base.TestServerArgs{ + Knobs: base.TestingKnobs{ + RegistryLiveness: nl, + }, + } + + var allowRequest chan struct{} + params := base.TestClusterArgs{ServerArgs: serverArgs} + params.ServerArgs.Knobs.Store = &storage.StoreTestingKnobs{ + TestingRequestFilter: createStatsRequestFilter(&allowRequest), + } + + ctx := context.Background() + tc := testcluster.StartTestCluster(t, nodes, params) + defer tc.Stopper().Stop(ctx) + conn := tc.Conns[0] + sqlDB := sqlutils.MakeSQLRunner(conn) + + // We want to know exactly how much leniency is configured. + sqlDB.Exec(t, `SET CLUSTER SETTING jobs.registry.leniency = '1m'`) + sqlDB.Exec(t, `CREATE DATABASE liveness`) + sqlDB.Exec(t, `CREATE TABLE liveness.t (i INT8 PRIMARY KEY)`) + sqlDB.Exec(t, `INSERT INTO liveness.t SELECT generate_series(1,20000)`) + + const query = `CREATE STATISTICS s1 FROM liveness.t` + + // Start a CREATE STATISTICS run and wait until it's done one scan. + allowRequest = make(chan struct{}) + errCh := make(chan error) + go func() { + _, err := conn.Exec(query) + errCh <- err + }() + select { + case allowRequest <- struct{}{}: + case err := <-errCh: + t.Fatal(err) + } + + // Fetch the new job ID and lease since we know it's running now. + var jobID int64 + originalLease := &jobspb.Payload{} + { + var expectedLeaseBytes []byte + sqlDB.QueryRow( + t, `SELECT id, payload FROM system.jobs ORDER BY created DESC LIMIT 1`, + ).Scan(&jobID, &expectedLeaseBytes) + if err := protoutil.Unmarshal(expectedLeaseBytes, originalLease); err != nil { + t.Fatal(err) + } + } + + // Make the node slightly tardy. + nl.FakeSetExpiration(1, hlc.Timestamp{ + WallTime: hlc.UnixNano() - (15 * time.Second).Nanoseconds(), + }) + + // Wait for the registry cancel loop to run and not cancel the job. + <-nl.SelfCalledCh + <-nl.SelfCalledCh + close(allowRequest) + + // Set the node to be fully live again. This prevents the registry + // from canceling all of the jobs if the test node is saturated + // and the create stats runs slowly. + nl.FakeSetExpiration(1, hlc.MaxTimestamp) + + // Verify that the client didn't see anything amiss. + if err := <-errCh; err != nil { + t.Fatalf("create stats job should have completed: %s", err) + } + + // The job should have completed normally. + jobutils.WaitForJob(t, sqlDB, jobID) +} + +// Create a blocking request filter for the actions related +// to CREATE STATISTICS, i.e. Scanning a user table. See discussion +// on jobutils.RunJob for where this might be useful. +func createStatsRequestFilter(allowProgressIota *chan struct{}) storagebase.ReplicaRequestFilter { + return func(ba roachpb.BatchRequest) *roachpb.Error { + if req, ok := ba.GetArg(roachpb.Scan); ok { + _, tableID, _ := encoding.DecodeUvarintAscending(req.(*roachpb.ScanRequest).Key) + // Ensure that the tableID is within the expected range for a table, + // but is not a system table. + if tableID > 0 && tableID < 100 && !sqlbase.IsReservedID(sqlbase.ID(tableID)) { + <-*allowProgressIota + } + } + return nil + } +} diff --git a/pkg/sql/walk.go b/pkg/sql/walk.go index 42edf78016cd..ec5e8b43a74b 100644 --- a/pkg/sql/walk.go +++ b/pkg/sql/walk.go @@ -698,7 +698,6 @@ var planNodeNames = map[reflect.Type]string{ reflect.TypeOf(&createDatabaseNode{}): "create database", reflect.TypeOf(&createIndexNode{}): "create index", reflect.TypeOf(&createSequenceNode{}): "create sequence", - reflect.TypeOf(&createStatsNode{}): "create statistics", reflect.TypeOf(&createTableNode{}): "create table", reflect.TypeOf(&CreateUserNode{}): "create user/role", reflect.TypeOf(&createViewNode{}): "create view",