diff --git a/docs/generated/sql/bnf/stmt_block.bnf b/docs/generated/sql/bnf/stmt_block.bnf index bb4bfeeeb398..9591a4f184b8 100644 --- a/docs/generated/sql/bnf/stmt_block.bnf +++ b/docs/generated/sql/bnf/stmt_block.bnf @@ -1035,7 +1035,7 @@ alter_type_stmt ::= 'ALTER' 'TYPE' type_name 'ADD' 'VALUE' 'SCONST' opt_add_val_placement | 'ALTER' 'TYPE' type_name 'ADD' 'VALUE' 'IF' 'NOT' 'EXISTS' 'SCONST' opt_add_val_placement | 'ALTER' 'TYPE' type_name 'RENAME' 'VALUE' 'SCONST' 'TO' 'SCONST' - | 'ALTER' 'TYPE' type_name 'RENAME' 'TO' type_name + | 'ALTER' 'TYPE' type_name 'RENAME' 'TO' name | 'ALTER' 'TYPE' type_name 'SET' 'SCHEMA' schema_name role_or_group_or_user ::= diff --git a/pkg/base/testing_knobs.go b/pkg/base/testing_knobs.go index a7f988b7af96..8ef57ce780bf 100644 --- a/pkg/base/testing_knobs.go +++ b/pkg/base/testing_knobs.go @@ -19,17 +19,18 @@ type ModuleTestingKnobs interface { // TestingKnobs contains facilities for controlling various parts of the // system for testing. type TestingKnobs struct { - Store ModuleTestingKnobs - KVClient ModuleTestingKnobs - SQLExecutor ModuleTestingKnobs - SQLLeaseManager ModuleTestingKnobs - SQLSchemaChanger ModuleTestingKnobs - GCJob ModuleTestingKnobs - PGWireTestingKnobs ModuleTestingKnobs - SQLMigrationManager ModuleTestingKnobs - DistSQL ModuleTestingKnobs - SQLEvalContext ModuleTestingKnobs - RegistryLiveness ModuleTestingKnobs - Server ModuleTestingKnobs - TenantTestingKnobs ModuleTestingKnobs + Store ModuleTestingKnobs + KVClient ModuleTestingKnobs + SQLExecutor ModuleTestingKnobs + SQLLeaseManager ModuleTestingKnobs + SQLSchemaChanger ModuleTestingKnobs + SQLTypeSchemaChanger ModuleTestingKnobs + GCJob ModuleTestingKnobs + PGWireTestingKnobs ModuleTestingKnobs + SQLMigrationManager ModuleTestingKnobs + DistSQL ModuleTestingKnobs + SQLEvalContext ModuleTestingKnobs + RegistryLiveness ModuleTestingKnobs + Server ModuleTestingKnobs + TenantTestingKnobs ModuleTestingKnobs } diff --git a/pkg/jobs/jobspb/jobs.pb.go b/pkg/jobs/jobspb/jobs.pb.go index 30684fc3b3a3..f662c8938ede 100644 --- a/pkg/jobs/jobspb/jobs.pb.go +++ b/pkg/jobs/jobspb/jobs.pb.go @@ -58,7 +58,7 @@ func (x Status) String() string { return proto.EnumName(Status_name, int32(x)) } func (Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_jobs_8ee676df0fc0b2c3, []int{0} + return fileDescriptor_jobs_516477c5bdf413a7, []int{0} } type Type int32 @@ -73,6 +73,9 @@ const ( TypeCreateStats Type = 6 TypeAutoCreateStats Type = 7 TypeSchemaChangeGC Type = 8 + // We can't name this TYPE_SCHEMA_CHANGE due to how proto generates actual + // names for this enum, which cause a conflict with the SCHEMA_CHANGE entry. + TypeTypeSchemaChange Type = 9 ) var Type_name = map[int32]string{ @@ -85,21 +88,23 @@ var Type_name = map[int32]string{ 6: "CREATE_STATS", 7: "AUTO_CREATE_STATS", 8: "SCHEMA_CHANGE_GC", + 9: "TYPEDESC_SCHEMA_CHANGE", } var Type_value = map[string]int32{ - "UNSPECIFIED": 0, - "BACKUP": 1, - "RESTORE": 2, - "SCHEMA_CHANGE": 3, - "IMPORT": 4, - "CHANGEFEED": 5, - "CREATE_STATS": 6, - "AUTO_CREATE_STATS": 7, - "SCHEMA_CHANGE_GC": 8, + "UNSPECIFIED": 0, + "BACKUP": 1, + "RESTORE": 2, + "SCHEMA_CHANGE": 3, + "IMPORT": 4, + "CHANGEFEED": 5, + "CREATE_STATS": 6, + "AUTO_CREATE_STATS": 7, + "SCHEMA_CHANGE_GC": 8, + "TYPEDESC_SCHEMA_CHANGE": 9, } func (Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_jobs_8ee676df0fc0b2c3, []int{1} + return fileDescriptor_jobs_516477c5bdf413a7, []int{1} } type SchemaChangeGCProgress_Status int32 @@ -129,7 +134,7 @@ func (x SchemaChangeGCProgress_Status) String() string { return proto.EnumName(SchemaChangeGCProgress_Status_name, int32(x)) } func (SchemaChangeGCProgress_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_jobs_8ee676df0fc0b2c3, []int{12, 0} + return fileDescriptor_jobs_516477c5bdf413a7, []int{14, 0} } type Lease struct { @@ -143,7 +148,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_8ee676df0fc0b2c3, []int{0} + return fileDescriptor_jobs_516477c5bdf413a7, []int{0} } func (m *Lease) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -193,7 +198,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_8ee676df0fc0b2c3, []int{1} + return fileDescriptor_jobs_516477c5bdf413a7, []int{1} } func (m *BackupDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -225,7 +230,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_8ee676df0fc0b2c3, []int{2} + return fileDescriptor_jobs_516477c5bdf413a7, []int{2} } func (m *BackupProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -272,7 +277,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_8ee676df0fc0b2c3, []int{3} + return fileDescriptor_jobs_516477c5bdf413a7, []int{3} } func (m *RestoreDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -309,7 +314,7 @@ func (m *RestoreDetails_DescriptorRewrite) Reset() { *m = RestoreDetails func (m *RestoreDetails_DescriptorRewrite) String() string { return proto.CompactTextString(m) } func (*RestoreDetails_DescriptorRewrite) ProtoMessage() {} func (*RestoreDetails_DescriptorRewrite) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8ee676df0fc0b2c3, []int{3, 0} + return fileDescriptor_jobs_516477c5bdf413a7, []int{3, 0} } func (m *RestoreDetails_DescriptorRewrite) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -342,7 +347,7 @@ func (m *RestoreDetails_BackupLocalityInfo) Reset() { *m = RestoreDetail func (m *RestoreDetails_BackupLocalityInfo) String() string { return proto.CompactTextString(m) } func (*RestoreDetails_BackupLocalityInfo) ProtoMessage() {} func (*RestoreDetails_BackupLocalityInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8ee676df0fc0b2c3, []int{3, 1} + return fileDescriptor_jobs_516477c5bdf413a7, []int{3, 1} } func (m *RestoreDetails_BackupLocalityInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -376,7 +381,7 @@ func (m *RestoreDetails_Tenant) Reset() { *m = RestoreDetails_Tenant{} } func (m *RestoreDetails_Tenant) String() string { return proto.CompactTextString(m) } func (*RestoreDetails_Tenant) ProtoMessage() {} func (*RestoreDetails_Tenant) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8ee676df0fc0b2c3, []int{3, 3} + return fileDescriptor_jobs_516477c5bdf413a7, []int{3, 3} } func (m *RestoreDetails_Tenant) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -409,7 +414,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_8ee676df0fc0b2c3, []int{4} + return fileDescriptor_jobs_516477c5bdf413a7, []int{4} } func (m *RestoreProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -460,7 +465,7 @@ type ImportDetails struct { // corresponding to this job. While the job ought to clean up the record // when it enters a terminal state, there may be cases where it cannot or // does not run the code to do so. To deal with this there is a background - // reconcilliation loop to ensure that protected timestamps are cleaned up. + // reconciliation loop to ensure that protected timestamps are cleaned up. ProtectedTimestampRecord *github_com_cockroachdb_cockroach_pkg_util_uuid.UUID `protobuf:"bytes,22,opt,name=protected_timestamp_record,json=protectedTimestampRecord,proto3,customtype=github.com/cockroachdb/cockroach/pkg/util/uuid.UUID" json:"protected_timestamp_record,omitempty"` } @@ -468,7 +473,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_8ee676df0fc0b2c3, []int{5} + return fileDescriptor_jobs_516477c5bdf413a7, []int{5} } func (m *ImportDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -505,7 +510,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_8ee676df0fc0b2c3, []int{5, 0} + return fileDescriptor_jobs_516477c5bdf413a7, []int{5, 0} } func (m *ImportDetails_Table) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -548,7 +553,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_8ee676df0fc0b2c3, []int{6} + return fileDescriptor_jobs_516477c5bdf413a7, []int{6} } func (m *ImportProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -573,6 +578,73 @@ func (m *ImportProgress) XXX_DiscardUnknown() { var xxx_messageInfo_ImportProgress proto.InternalMessageInfo +// TypeSchemaChangeDetails is the job detail information for a type schema change job. +type TypeSchemaChangeDetails struct { + TypeID github_com_cockroachdb_cockroach_pkg_sql_sqlbase.ID `protobuf:"varint,1,opt,name=type_id,json=typeId,proto3,casttype=github.com/cockroachdb/cockroach/pkg/sql/sqlbase.ID" json:"type_id,omitempty"` +} + +func (m *TypeSchemaChangeDetails) Reset() { *m = TypeSchemaChangeDetails{} } +func (m *TypeSchemaChangeDetails) String() string { return proto.CompactTextString(m) } +func (*TypeSchemaChangeDetails) ProtoMessage() {} +func (*TypeSchemaChangeDetails) Descriptor() ([]byte, []int) { + return fileDescriptor_jobs_516477c5bdf413a7, []int{7} +} +func (m *TypeSchemaChangeDetails) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TypeSchemaChangeDetails) 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 *TypeSchemaChangeDetails) XXX_Merge(src proto.Message) { + xxx_messageInfo_TypeSchemaChangeDetails.Merge(dst, src) +} +func (m *TypeSchemaChangeDetails) XXX_Size() int { + return m.Size() +} +func (m *TypeSchemaChangeDetails) XXX_DiscardUnknown() { + xxx_messageInfo_TypeSchemaChangeDetails.DiscardUnknown(m) +} + +var xxx_messageInfo_TypeSchemaChangeDetails proto.InternalMessageInfo + +// TypeSchemaChangeProgress is the persisted progress for a type schema change job. +type TypeSchemaChangeProgress struct { +} + +func (m *TypeSchemaChangeProgress) Reset() { *m = TypeSchemaChangeProgress{} } +func (m *TypeSchemaChangeProgress) String() string { return proto.CompactTextString(m) } +func (*TypeSchemaChangeProgress) ProtoMessage() {} +func (*TypeSchemaChangeProgress) Descriptor() ([]byte, []int) { + return fileDescriptor_jobs_516477c5bdf413a7, []int{8} +} +func (m *TypeSchemaChangeProgress) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TypeSchemaChangeProgress) 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 *TypeSchemaChangeProgress) XXX_Merge(src proto.Message) { + xxx_messageInfo_TypeSchemaChangeProgress.Merge(dst, src) +} +func (m *TypeSchemaChangeProgress) XXX_Size() int { + return m.Size() +} +func (m *TypeSchemaChangeProgress) XXX_DiscardUnknown() { + xxx_messageInfo_TypeSchemaChangeProgress.DiscardUnknown(m) +} + +var xxx_messageInfo_TypeSchemaChangeProgress proto.InternalMessageInfo + type ResumeSpanList struct { ResumeSpans []roachpb.Span `protobuf:"bytes,1,rep,name=resume_spans,json=resumeSpans,proto3" json:"resume_spans"` } @@ -581,7 +653,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_8ee676df0fc0b2c3, []int{7} + return fileDescriptor_jobs_516477c5bdf413a7, []int{9} } func (m *ResumeSpanList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -616,7 +688,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_8ee676df0fc0b2c3, []int{8} + return fileDescriptor_jobs_516477c5bdf413a7, []int{10} } func (m *DroppedTableDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -669,7 +741,7 @@ func (m *SchemaChangeGCDetails) Reset() { *m = SchemaChangeGCDetails{} } func (m *SchemaChangeGCDetails) String() string { return proto.CompactTextString(m) } func (*SchemaChangeGCDetails) ProtoMessage() {} func (*SchemaChangeGCDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8ee676df0fc0b2c3, []int{9} + return fileDescriptor_jobs_516477c5bdf413a7, []int{11} } func (m *SchemaChangeGCDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -703,7 +775,7 @@ func (m *SchemaChangeGCDetails_DroppedIndex) Reset() { *m = SchemaChange func (m *SchemaChangeGCDetails_DroppedIndex) String() string { return proto.CompactTextString(m) } func (*SchemaChangeGCDetails_DroppedIndex) ProtoMessage() {} func (*SchemaChangeGCDetails_DroppedIndex) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8ee676df0fc0b2c3, []int{9, 0} + return fileDescriptor_jobs_516477c5bdf413a7, []int{11, 0} } func (m *SchemaChangeGCDetails_DroppedIndex) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -737,7 +809,7 @@ func (m *SchemaChangeGCDetails_DroppedID) Reset() { *m = SchemaChangeGCD func (m *SchemaChangeGCDetails_DroppedID) String() string { return proto.CompactTextString(m) } func (*SchemaChangeGCDetails_DroppedID) ProtoMessage() {} func (*SchemaChangeGCDetails_DroppedID) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8ee676df0fc0b2c3, []int{9, 1} + return fileDescriptor_jobs_516477c5bdf413a7, []int{11, 1} } func (m *SchemaChangeGCDetails_DroppedID) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -786,7 +858,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_8ee676df0fc0b2c3, []int{10} + return fileDescriptor_jobs_516477c5bdf413a7, []int{12} } func (m *SchemaChangeDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -818,7 +890,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_8ee676df0fc0b2c3, []int{11} + return fileDescriptor_jobs_516477c5bdf413a7, []int{13} } func (m *SchemaChangeProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -854,7 +926,7 @@ func (m *SchemaChangeGCProgress) Reset() { *m = SchemaChangeGCProgress{} func (m *SchemaChangeGCProgress) String() string { return proto.CompactTextString(m) } func (*SchemaChangeGCProgress) ProtoMessage() {} func (*SchemaChangeGCProgress) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8ee676df0fc0b2c3, []int{12} + return fileDescriptor_jobs_516477c5bdf413a7, []int{14} } func (m *SchemaChangeGCProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -888,7 +960,7 @@ func (m *SchemaChangeGCProgress_IndexProgress) Reset() { *m = SchemaChan func (m *SchemaChangeGCProgress_IndexProgress) String() string { return proto.CompactTextString(m) } func (*SchemaChangeGCProgress_IndexProgress) ProtoMessage() {} func (*SchemaChangeGCProgress_IndexProgress) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8ee676df0fc0b2c3, []int{12, 0} + return fileDescriptor_jobs_516477c5bdf413a7, []int{14, 0} } func (m *SchemaChangeGCProgress_IndexProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -922,7 +994,7 @@ func (m *SchemaChangeGCProgress_TableProgress) Reset() { *m = SchemaChan func (m *SchemaChangeGCProgress_TableProgress) String() string { return proto.CompactTextString(m) } func (*SchemaChangeGCProgress_TableProgress) ProtoMessage() {} func (*SchemaChangeGCProgress_TableProgress) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8ee676df0fc0b2c3, []int{12, 1} + return fileDescriptor_jobs_516477c5bdf413a7, []int{14, 1} } func (m *SchemaChangeGCProgress_TableProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -955,7 +1027,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_8ee676df0fc0b2c3, []int{13} + return fileDescriptor_jobs_516477c5bdf413a7, []int{15} } func (m *ChangefeedTarget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1008,7 +1080,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_8ee676df0fc0b2c3, []int{14} + return fileDescriptor_jobs_516477c5bdf413a7, []int{16} } func (m *ChangefeedDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1043,7 +1115,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_8ee676df0fc0b2c3, []int{15} + return fileDescriptor_jobs_516477c5bdf413a7, []int{17} } func (m *ResolvedSpan) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1086,7 +1158,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_8ee676df0fc0b2c3, []int{16} + return fileDescriptor_jobs_516477c5bdf413a7, []int{18} } func (m *ChangefeedProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1130,7 +1202,7 @@ 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_8ee676df0fc0b2c3, []int{17} + return fileDescriptor_jobs_516477c5bdf413a7, []int{19} } func (m *CreateStatsDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1167,7 +1239,7 @@ func (m *CreateStatsDetails_ColStat) Reset() { *m = CreateStatsDetails_C func (m *CreateStatsDetails_ColStat) String() string { return proto.CompactTextString(m) } func (*CreateStatsDetails_ColStat) ProtoMessage() {} func (*CreateStatsDetails_ColStat) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8ee676df0fc0b2c3, []int{17, 0} + return fileDescriptor_jobs_516477c5bdf413a7, []int{19, 0} } func (m *CreateStatsDetails_ColStat) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1199,7 +1271,7 @@ 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_8ee676df0fc0b2c3, []int{18} + return fileDescriptor_jobs_516477c5bdf413a7, []int{20} } func (m *CreateStatsProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1258,6 +1330,7 @@ type Payload struct { // *Payload_Changefeed // *Payload_CreateStats // *Payload_SchemaChangeGC + // *Payload_TypeSchemaChange Details isPayload_Details `protobuf_oneof:"details"` } @@ -1265,7 +1338,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_8ee676df0fc0b2c3, []int{19} + return fileDescriptor_jobs_516477c5bdf413a7, []int{21} } func (m *Payload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1317,14 +1390,18 @@ type Payload_CreateStats struct { type Payload_SchemaChangeGC struct { SchemaChangeGC *SchemaChangeGCDetails `protobuf:"bytes,21,opt,name=schemaChangeGC,proto3,oneof"` } +type Payload_TypeSchemaChange struct { + TypeSchemaChange *TypeSchemaChangeDetails `protobuf:"bytes,22,opt,name=typeSchemaChange,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 (*Payload_SchemaChangeGC) isPayload_Details() {} +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 (*Payload_SchemaChangeGC) isPayload_Details() {} +func (*Payload_TypeSchemaChange) isPayload_Details() {} func (m *Payload) GetDetails() isPayload_Details { if m != nil { @@ -1382,6 +1459,13 @@ func (m *Payload) GetSchemaChangeGC() *SchemaChangeGCDetails { return nil } +func (m *Payload) GetTypeSchemaChange() *TypeSchemaChangeDetails { + if x, ok := m.GetDetails().(*Payload_TypeSchemaChange); ok { + return x.TypeSchemaChange + } + 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{}{ @@ -1392,6 +1476,7 @@ func (*Payload) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error (*Payload_Changefeed)(nil), (*Payload_CreateStats)(nil), (*Payload_SchemaChangeGC)(nil), + (*Payload_TypeSchemaChange)(nil), } } @@ -1434,6 +1519,11 @@ func _Payload_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { if err := b.EncodeMessage(x.SchemaChangeGC); err != nil { return err } + case *Payload_TypeSchemaChange: + _ = b.EncodeVarint(22<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.TypeSchemaChange); err != nil { + return err + } case nil: default: return fmt.Errorf("Payload.Details has unexpected type %T", x) @@ -1500,6 +1590,14 @@ func _Payload_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer err := b.DecodeMessage(msg) m.Details = &Payload_SchemaChangeGC{msg} return true, err + case 22: // details.typeSchemaChange + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(TypeSchemaChangeDetails) + err := b.DecodeMessage(msg) + m.Details = &Payload_TypeSchemaChange{msg} + return true, err default: return false, nil } @@ -1544,6 +1642,11 @@ func _Payload_OneofSizer(msg proto.Message) (n int) { n += 2 // tag and wire n += proto.SizeVarint(uint64(s)) n += s + case *Payload_TypeSchemaChange: + s := proto.Size(x.TypeSchemaChange) + n += 2 // tag and wire + n += proto.SizeVarint(uint64(s)) + n += s case nil: default: panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) @@ -1566,6 +1669,7 @@ type Progress struct { // *Progress_Changefeed // *Progress_CreateStats // *Progress_SchemaChangeGC + // *Progress_TypeSchemaChange Details isProgress_Details `protobuf_oneof:"details"` } @@ -1573,7 +1677,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_8ee676df0fc0b2c3, []int{20} + return fileDescriptor_jobs_516477c5bdf413a7, []int{22} } func (m *Progress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1636,6 +1740,9 @@ type Progress_CreateStats struct { type Progress_SchemaChangeGC struct { SchemaChangeGC *SchemaChangeGCProgress `protobuf:"bytes,16,opt,name=schemaChangeGC,proto3,oneof"` } +type Progress_TypeSchemaChange struct { + TypeSchemaChange *TypeSchemaChangeProgress `protobuf:"bytes,17,opt,name=typeSchemaChange,proto3,oneof"` +} func (*Progress_FractionCompleted) isProgress_Progress() {} func (*Progress_HighWater) isProgress_Progress() {} @@ -1646,6 +1753,7 @@ func (*Progress_Import) isProgress_Details() {} func (*Progress_Changefeed) isProgress_Details() {} func (*Progress_CreateStats) isProgress_Details() {} func (*Progress_SchemaChangeGC) isProgress_Details() {} +func (*Progress_TypeSchemaChange) isProgress_Details() {} func (m *Progress) GetProgress() isProgress_Progress { if m != nil { @@ -1723,6 +1831,13 @@ func (m *Progress) GetSchemaChangeGC() *SchemaChangeGCProgress { return nil } +func (m *Progress) GetTypeSchemaChange() *TypeSchemaChangeProgress { + if x, ok := m.GetDetails().(*Progress_TypeSchemaChange); ok { + return x.TypeSchemaChange + } + 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{}{ @@ -1735,6 +1850,7 @@ func (*Progress) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) erro (*Progress_Changefeed)(nil), (*Progress_CreateStats)(nil), (*Progress_SchemaChangeGC)(nil), + (*Progress_TypeSchemaChange)(nil), } } @@ -1791,6 +1907,11 @@ func _Progress_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { if err := b.EncodeMessage(x.SchemaChangeGC); err != nil { return err } + case *Progress_TypeSchemaChange: + _ = b.EncodeVarint(17<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.TypeSchemaChange); err != nil { + return err + } case nil: default: return fmt.Errorf("Progress.Details has unexpected type %T", x) @@ -1872,6 +1993,14 @@ func _Progress_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffe err := b.DecodeMessage(msg) m.Details = &Progress_SchemaChangeGC{msg} return true, err + case 17: // details.typeSchemaChange + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(TypeSchemaChangeProgress) + err := b.DecodeMessage(msg) + m.Details = &Progress_TypeSchemaChange{msg} + return true, err default: return false, nil } @@ -1930,6 +2059,11 @@ func _Progress_OneofSizer(msg proto.Message) (n int) { n += 2 // tag and wire n += proto.SizeVarint(uint64(s)) n += s + case *Progress_TypeSchemaChange: + s := proto.Size(x.TypeSchemaChange) + n += 2 // tag and wire + n += proto.SizeVarint(uint64(s)) + n += s case nil: default: panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) @@ -1949,7 +2083,7 @@ func (m *Job) Reset() { *m = Job{} } func (m *Job) String() string { return proto.CompactTextString(m) } func (*Job) ProtoMessage() {} func (*Job) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8ee676df0fc0b2c3, []int{21} + return fileDescriptor_jobs_516477c5bdf413a7, []int{23} } func (m *Job) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1989,6 +2123,8 @@ func init() { proto.RegisterType((*ImportDetails)(nil), "cockroach.sql.jobs.jobspb.ImportDetails") proto.RegisterType((*ImportDetails_Table)(nil), "cockroach.sql.jobs.jobspb.ImportDetails.Table") proto.RegisterType((*ImportProgress)(nil), "cockroach.sql.jobs.jobspb.ImportProgress") + proto.RegisterType((*TypeSchemaChangeDetails)(nil), "cockroach.sql.jobs.jobspb.TypeSchemaChangeDetails") + proto.RegisterType((*TypeSchemaChangeProgress)(nil), "cockroach.sql.jobs.jobspb.TypeSchemaChangeProgress") proto.RegisterType((*ResumeSpanList)(nil), "cockroach.sql.jobs.jobspb.ResumeSpanList") proto.RegisterType((*DroppedTableDetails)(nil), "cockroach.sql.jobs.jobspb.DroppedTableDetails") proto.RegisterType((*SchemaChangeGCDetails)(nil), "cockroach.sql.jobs.jobspb.SchemaChangeGCDetails") @@ -2756,6 +2892,47 @@ func (m *ImportProgress) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *TypeSchemaChangeDetails) 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 *TypeSchemaChangeDetails) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.TypeID != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintJobs(dAtA, i, uint64(m.TypeID)) + } + return i, nil +} + +func (m *TypeSchemaChangeProgress) 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 *TypeSchemaChangeProgress) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + return i, nil +} + func (m *ResumeSpanList) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -3676,6 +3853,22 @@ func (m *Payload_SchemaChangeGC) MarshalTo(dAtA []byte) (int, error) { } return i, nil } +func (m *Payload_TypeSchemaChange) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.TypeSchemaChange != nil { + dAtA[i] = 0xb2 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintJobs(dAtA, i, uint64(m.TypeSchemaChange.Size())) + n37, err := m.TypeSchemaChange.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n37 + } + return i, nil +} func (m *Progress) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -3692,11 +3885,11 @@ func (m *Progress) MarshalTo(dAtA []byte) (int, error) { var l int _ = l if m.Progress != nil { - nn37, err := m.Progress.MarshalTo(dAtA[i:]) + nn38, err := m.Progress.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += nn37 + i += nn38 } if m.ModifiedMicros != 0 { dAtA[i] = 0x10 @@ -3710,11 +3903,11 @@ func (m *Progress) MarshalTo(dAtA []byte) (int, error) { i += copy(dAtA[i:], m.RunningStatus) } if m.Details != nil { - nn38, err := m.Details.MarshalTo(dAtA[i:]) + nn39, err := m.Details.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += nn38 + i += nn39 } return i, nil } @@ -3733,11 +3926,11 @@ func (m *Progress_HighWater) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintJobs(dAtA, i, uint64(m.HighWater.Size())) - n39, err := m.HighWater.MarshalTo(dAtA[i:]) + n40, err := m.HighWater.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n39 + i += n40 } return i, nil } @@ -3747,11 +3940,11 @@ func (m *Progress_Backup) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x52 i++ i = encodeVarintJobs(dAtA, i, uint64(m.Backup.Size())) - n40, err := m.Backup.MarshalTo(dAtA[i:]) + n41, err := m.Backup.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n40 + i += n41 } return i, nil } @@ -3761,11 +3954,11 @@ func (m *Progress_Restore) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x5a i++ i = encodeVarintJobs(dAtA, i, uint64(m.Restore.Size())) - n41, err := m.Restore.MarshalTo(dAtA[i:]) + n42, err := m.Restore.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n41 + i += n42 } return i, nil } @@ -3775,11 +3968,11 @@ func (m *Progress_SchemaChange) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x62 i++ i = encodeVarintJobs(dAtA, i, uint64(m.SchemaChange.Size())) - n42, err := m.SchemaChange.MarshalTo(dAtA[i:]) + n43, err := m.SchemaChange.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n42 + i += n43 } return i, nil } @@ -3789,11 +3982,11 @@ func (m *Progress_Import) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x6a i++ i = encodeVarintJobs(dAtA, i, uint64(m.Import.Size())) - n43, err := m.Import.MarshalTo(dAtA[i:]) + n44, err := m.Import.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n43 + i += n44 } return i, nil } @@ -3803,11 +3996,11 @@ func (m *Progress_Changefeed) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x72 i++ i = encodeVarintJobs(dAtA, i, uint64(m.Changefeed.Size())) - n44, err := m.Changefeed.MarshalTo(dAtA[i:]) + n45, err := m.Changefeed.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n44 + i += n45 } return i, nil } @@ -3817,11 +4010,11 @@ func (m *Progress_CreateStats) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x7a i++ i = encodeVarintJobs(dAtA, i, uint64(m.CreateStats.Size())) - n45, err := m.CreateStats.MarshalTo(dAtA[i:]) + n46, err := m.CreateStats.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n45 + i += n46 } return i, nil } @@ -3833,11 +4026,27 @@ func (m *Progress_SchemaChangeGC) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintJobs(dAtA, i, uint64(m.SchemaChangeGC.Size())) - n46, err := m.SchemaChangeGC.MarshalTo(dAtA[i:]) + n47, err := m.SchemaChangeGC.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n46 + i += n47 + } + return i, nil +} +func (m *Progress_TypeSchemaChange) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.TypeSchemaChange != nil { + dAtA[i] = 0x8a + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintJobs(dAtA, i, uint64(m.TypeSchemaChange.Size())) + n48, err := m.TypeSchemaChange.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n48 } return i, nil } @@ -3865,21 +4074,21 @@ func (m *Job) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintJobs(dAtA, i, uint64(m.Progress.Size())) - n47, err := m.Progress.MarshalTo(dAtA[i:]) + n49, err := m.Progress.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n47 + i += n49 } if m.Payload != nil { dAtA[i] = 0x1a i++ i = encodeVarintJobs(dAtA, i, uint64(m.Payload.Size())) - n48, err := m.Payload.MarshalTo(dAtA[i:]) + n50, err := m.Payload.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n48 + i += n50 } return i, nil } @@ -4207,6 +4416,27 @@ func (m *ImportProgress) Size() (n int) { return n } +func (m *TypeSchemaChangeDetails) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.TypeID != 0 { + n += 1 + sovJobs(uint64(m.TypeID)) + } + return n +} + +func (m *TypeSchemaChangeProgress) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + func (m *ResumeSpanList) Size() (n int) { if m == nil { return 0 @@ -4681,6 +4911,18 @@ func (m *Payload_SchemaChangeGC) Size() (n int) { } return n } +func (m *Payload_TypeSchemaChange) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.TypeSchemaChange != nil { + l = m.TypeSchemaChange.Size() + n += 2 + l + sovJobs(uint64(l)) + } + return n +} func (m *Progress) Size() (n int) { if m == nil { return 0 @@ -4808,6 +5050,18 @@ func (m *Progress_SchemaChangeGC) Size() (n int) { } return n } +func (m *Progress_TypeSchemaChange) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.TypeSchemaChange != nil { + l = m.TypeSchemaChange.Size() + n += 2 + l + sovJobs(uint64(l)) + } + return n +} func (m *Job) Size() (n int) { if m == nil { return 0 @@ -7117,6 +7371,125 @@ func (m *ImportProgress) Unmarshal(dAtA []byte) error { } return nil } +func (m *TypeSchemaChangeDetails) 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: TypeSchemaChangeDetails: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TypeSchemaChangeDetails: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TypeID", wireType) + } + m.TypeID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowJobs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TypeID |= (github_com_cockroachdb_cockroach_pkg_sql_sqlbase.ID(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + 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 *TypeSchemaChangeProgress) 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: TypeSchemaChangeProgress: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TypeSchemaChangeProgress: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + 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 *ResumeSpanList) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -9890,6 +10263,38 @@ func (m *Payload) Unmarshal(dAtA []byte) error { } m.Details = &Payload_SchemaChangeGC{v} iNdEx = postIndex + case 22: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TypeSchemaChange", 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 := &TypeSchemaChangeDetails{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Details = &Payload_TypeSchemaChange{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipJobs(dAtA[iNdEx:]) @@ -10255,6 +10660,38 @@ func (m *Progress) Unmarshal(dAtA []byte) error { } m.Details = &Progress_SchemaChangeGC{v} iNdEx = postIndex + case 17: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TypeSchemaChange", 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 := &TypeSchemaChangeProgress{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Details = &Progress_TypeSchemaChange{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipJobs(dAtA[iNdEx:]) @@ -10516,230 +10953,236 @@ var ( ErrIntOverflowJobs = fmt.Errorf("proto: integer overflow") ) -func init() { proto.RegisterFile("jobs/jobspb/jobs.proto", fileDescriptor_jobs_8ee676df0fc0b2c3) } - -var fileDescriptor_jobs_8ee676df0fc0b2c3 = []byte{ - // 3546 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0xdb, 0x6f, 0x23, 0x59, - 0x5a, 0x4f, 0xd9, 0x15, 0xbb, 0xfc, 0xf9, 0x92, 0xca, 0x49, 0xba, 0xc7, 0x6b, 0x7a, 0x62, 0xe3, - 0x9d, 0xd9, 0xce, 0xcc, 0xec, 0x38, 0xb3, 0x3d, 0xb0, 0x73, 0xd9, 0x9d, 0x59, 0xe2, 0x4b, 0x12, - 0xbb, 0x3b, 0x97, 0x39, 0x49, 0x7a, 0x96, 0x59, 0x0d, 0x45, 0xc5, 0x75, 0x92, 0x14, 0xb1, 0xab, - 0xdc, 0x75, 0xca, 0xdd, 0x93, 0x15, 0x12, 0xb0, 0xbc, 0x8c, 0x5a, 0x20, 0x40, 0x82, 0x37, 0x5a, - 0x42, 0x02, 0x24, 0x24, 0x84, 0x96, 0x97, 0x15, 0xbc, 0xf0, 0x88, 0x34, 0x8f, 0xfb, 0xb8, 0xe2, - 0xc1, 0x80, 0x47, 0x48, 0x08, 0xc1, 0x3f, 0xd0, 0x4f, 0xe8, 0x5c, 0xaa, 0x5c, 0x76, 0x32, 0x8e, - 0x93, 0x19, 0x86, 0x97, 0x6e, 0xd7, 0x77, 0xbe, 0xf3, 0x3b, 0x75, 0xbe, 0xf3, 0x9d, 0xdf, 0x77, - 0xa9, 0xc0, 0xed, 0xdf, 0x72, 0x8f, 0xe8, 0x1a, 0xfb, 0xa7, 0x77, 0xc4, 0xff, 0xab, 0xf4, 0x3c, - 0xd7, 0x77, 0xd1, 0x37, 0xda, 0x6e, 0xfb, 0xcc, 0x73, 0xcd, 0xf6, 0x69, 0x85, 0x3e, 0xea, 0x54, - 0xf8, 0x88, 0xd0, 0x2a, 0xdc, 0x22, 0x9e, 0xe7, 0x7a, 0x4c, 0x5f, 0xfc, 0x10, 0x33, 0x0a, 0xcb, - 0x27, 0xee, 0x89, 0xcb, 0x7f, 0xae, 0xb1, 0x5f, 0x52, 0xba, 0xc8, 0x31, 0x7a, 0x47, 0x6b, 0x66, - 0xcf, 0x96, 0x22, 0x14, 0x88, 0x2c, 0xd3, 0x37, 0xa5, 0x2c, 0x1f, 0xc8, 0x6c, 0xf7, 0xf5, 0x63, - 0xd7, 0xeb, 0x9a, 0x7e, 0x00, 0x7b, 0x87, 0x3e, 0xea, 0xac, 0xd1, 0x47, 0x9d, 0x23, 0x93, 0x92, - 0x35, 0xea, 0x7b, 0xfd, 0xb6, 0xdf, 0xf7, 0x88, 0x15, 0xcc, 0xeb, 0xfb, 0x76, 0x67, 0xed, 0xb4, - 0xd3, 0x5e, 0xf3, 0xed, 0x2e, 0xa1, 0xbe, 0xd9, 0xed, 0x89, 0x91, 0xf2, 0xef, 0xc0, 0xfc, 0x03, - 0x62, 0x52, 0x82, 0x3e, 0x82, 0xa4, 0xe3, 0x5a, 0xc4, 0xb0, 0xad, 0xbc, 0x52, 0x52, 0x56, 0xb3, - 0xd5, 0xf5, 0xe1, 0xa0, 0x98, 0xd8, 0x71, 0x2d, 0xd2, 0xac, 0x3f, 0x1f, 0x14, 0xdf, 0x3c, 0xb1, - 0xfd, 0xd3, 0xfe, 0x51, 0xa5, 0xed, 0x76, 0xd7, 0xc2, 0x3d, 0x5b, 0x47, 0xa3, 0xdf, 0x6b, 0xbd, - 0xb3, 0x93, 0x35, 0xf9, 0x7a, 0x15, 0x31, 0x0d, 0x27, 0x18, 0x62, 0xd3, 0x42, 0xcb, 0x30, 0x4f, - 0x7a, 0x6e, 0xfb, 0x34, 0x1f, 0x2b, 0x29, 0xab, 0x71, 0x2c, 0x1e, 0xde, 0x55, 0xff, 0xf3, 0x2f, - 0x8a, 0x4a, 0xf9, 0x77, 0xe7, 0x21, 0x5b, 0x35, 0xdb, 0x67, 0xfd, 0x5e, 0x9d, 0xf8, 0xa6, 0xdd, - 0xa1, 0xa8, 0x0a, 0x40, 0x7d, 0xd3, 0xf3, 0x0d, 0xf6, 0xae, 0xfc, 0x65, 0xd2, 0xf7, 0x5e, 0xac, - 0x8c, 0x0c, 0xcd, 0xf6, 0x52, 0x39, 0xed, 0xb4, 0x2b, 0x07, 0xc1, 0x5e, 0xaa, 0xea, 0x67, 0x83, - 0xe2, 0x1c, 0x4e, 0xf1, 0x69, 0x4c, 0x8a, 0xde, 0x07, 0x8d, 0x38, 0x96, 0x40, 0x88, 0xcd, 0x8e, - 0x90, 0x24, 0x8e, 0xc5, 0xe7, 0x7f, 0x03, 0xe2, 0x7d, 0xcf, 0xce, 0xc7, 0x4b, 0xca, 0x6a, 0xaa, - 0x9a, 0x1c, 0x0e, 0x8a, 0xf1, 0x43, 0xdc, 0xc4, 0x4c, 0x86, 0xee, 0xc2, 0xc2, 0x11, 0x7f, 0x5f, - 0xa3, 0x6b, 0x3a, 0xf6, 0x31, 0xa1, 0x7e, 0x5e, 0x2d, 0x29, 0xab, 0x19, 0x9c, 0x13, 0xe2, 0x6d, - 0x29, 0x45, 0xbf, 0xaf, 0xc0, 0x52, 0xdf, 0xb3, 0xa9, 0x71, 0x74, 0x6e, 0x74, 0xdc, 0xb6, 0xd9, - 0xb1, 0xfd, 0x73, 0xe3, 0xec, 0x71, 0x7e, 0xbe, 0x14, 0x5f, 0x4d, 0xdf, 0x7b, 0xbf, 0xf2, 0x85, - 0xae, 0x53, 0x19, 0xb3, 0x47, 0xe5, 0xd0, 0xb3, 0x69, 0xf5, 0xfc, 0x81, 0x44, 0xb8, 0xff, 0xb8, - 0xe1, 0xf8, 0xde, 0x79, 0x75, 0x79, 0x38, 0x28, 0xea, 0x87, 0xb8, 0x19, 0x1d, 0x7a, 0x88, 0xf5, - 0xfe, 0x84, 0x32, 0xda, 0x02, 0x20, 0x4e, 0xdb, 0x3b, 0xef, 0xf9, 0xb6, 0xeb, 0xe4, 0x13, 0xdc, - 0x16, 0xab, 0x91, 0xb5, 0x83, 0x23, 0xdb, 0xb0, 0x3b, 0xa4, 0x11, 0x2a, 0xee, 0xf2, 0x7f, 0x29, - 0x8e, 0xcc, 0x45, 0x7f, 0xa2, 0x40, 0x81, 0x39, 0x0d, 0x69, 0xfb, 0x44, 0x98, 0x96, 0x9b, 0xce, - 0xf0, 0x48, 0xdb, 0xf5, 0xac, 0x7c, 0x92, 0x19, 0xa1, 0xba, 0xff, 0x2f, 0xb3, 0xfa, 0x0a, 0x77, - 0xc9, 0x7e, 0xdf, 0xb6, 0x2a, 0x87, 0x87, 0xcd, 0xfa, 0x70, 0x50, 0xcc, 0xef, 0x05, 0xe0, 0xe1, - 0xb1, 0x60, 0x0e, 0x8d, 0xf3, 0xbd, 0x2f, 0x18, 0x29, 0xd4, 0xe0, 0xd6, 0xa5, 0xe6, 0x41, 0x3a, - 0xc4, 0xcf, 0xc8, 0x39, 0xf7, 0x9e, 0x14, 0x66, 0x3f, 0x99, 0x13, 0x3e, 0x36, 0x3b, 0x7d, 0xe1, - 0x0f, 0x29, 0x2c, 0x1e, 0xde, 0x8d, 0xbd, 0xad, 0x94, 0x75, 0xc8, 0x09, 0x8b, 0xef, 0x79, 0xee, - 0x89, 0x47, 0x28, 0x2d, 0xff, 0x57, 0x06, 0x72, 0x98, 0x50, 0xdf, 0xf5, 0x48, 0xe0, 0x95, 0x7f, - 0xab, 0xc0, 0x92, 0x45, 0x68, 0xdb, 0xb3, 0x7b, 0xbe, 0xeb, 0x19, 0x1e, 0x79, 0xe2, 0xd9, 0x3e, - 0xa1, 0xf9, 0x18, 0x3f, 0xcd, 0xf5, 0x29, 0xa7, 0x39, 0x0e, 0x54, 0xa9, 0x87, 0x20, 0x58, 0x62, - 0x88, 0x03, 0x7d, 0xeb, 0x27, 0xff, 0x3a, 0xa3, 0xe5, 0x22, 0x57, 0xbd, 0xd2, 0xac, 0x63, 0x64, - 0x5d, 0x40, 0x44, 0x77, 0x40, 0x65, 0x9e, 0x90, 0x8f, 0x97, 0xe2, 0xab, 0xa9, 0xaa, 0x36, 0x1c, - 0x14, 0x55, 0xe6, 0x2b, 0x98, 0x4b, 0xc7, 0x6e, 0x87, 0x7a, 0x83, 0xdb, 0xb1, 0x09, 0x69, 0xdf, - 0x3c, 0xea, 0x10, 0x83, 0xad, 0x4c, 0xa5, 0x43, 0x7f, 0x6b, 0xc2, 0x04, 0xc1, 0x1b, 0x1e, 0x30, - 0xcd, 0xc8, 0xa6, 0xc1, 0x0f, 0x04, 0x14, 0xad, 0x41, 0xda, 0x7d, 0x4c, 0x3c, 0xcf, 0xb6, 0x88, - 0x61, 0x1d, 0x71, 0xef, 0x4c, 0x55, 0x73, 0xc3, 0x41, 0x11, 0x76, 0xa5, 0xb8, 0x5e, 0xc5, 0x10, - 0xa8, 0xd4, 0x8f, 0x90, 0x0f, 0xcb, 0xf2, 0xf2, 0x85, 0x37, 0xca, 0x76, 0x8e, 0xdd, 0x7c, 0x92, - 0xbf, 0xc2, 0xf7, 0x67, 0x3f, 0x05, 0x71, 0xe0, 0x81, 0xd7, 0x34, 0x9d, 0x63, 0x57, 0x6e, 0x12, - 0x1d, 0x5d, 0x18, 0x41, 0xaf, 0xc1, 0x62, 0xcf, 0x23, 0x3d, 0xd3, 0x23, 0x46, 0xdb, 0xed, 0xf6, - 0x3a, 0xc4, 0x27, 0x56, 0x5e, 0x2b, 0x29, 0xab, 0x1a, 0xd6, 0xe5, 0x40, 0x2d, 0x90, 0xa3, 0x97, - 0x21, 0x47, 0x7d, 0xd3, 0xa7, 0x86, 0xed, 0x50, 0xe2, 0x31, 0xcd, 0x14, 0xd7, 0xcc, 0x72, 0x69, - 0x53, 0x0a, 0xd1, 0x2b, 0xa0, 0x73, 0x43, 0x50, 0xa3, 0xd7, 0x3f, 0xea, 0xd8, 0xf4, 0x94, 0x58, - 0x79, 0xe0, 0x8a, 0x0b, 0x42, 0xbe, 0x17, 0x88, 0xd1, 0xf9, 0x98, 0xe7, 0xb5, 0x99, 0x39, 0xcc, - 0x13, 0x92, 0x4f, 0x97, 0x94, 0xd5, 0xf9, 0xea, 0xd6, 0xf3, 0x41, 0xb1, 0x3e, 0xbb, 0xdb, 0x90, - 0xee, 0x9a, 0xef, 0x11, 0x12, 0xf1, 0xc2, 0x9a, 0xc4, 0x8b, 0xfa, 0x51, 0x20, 0x9b, 0x60, 0x8f, - 0xcc, 0x97, 0x60, 0x8f, 0x3d, 0x48, 0xfa, 0xc4, 0x31, 0x1d, 0x9f, 0xe6, 0xb3, 0xfc, 0xb0, 0xde, - 0x98, 0xfd, 0xb0, 0x0e, 0xf8, 0xc4, 0xc0, 0x0b, 0x25, 0x4c, 0xe1, 0x3f, 0x14, 0x58, 0xbc, 0x70, - 0x99, 0xd0, 0x36, 0xc4, 0xc2, 0x10, 0xf6, 0xde, 0x70, 0x50, 0x8c, 0x5d, 0x23, 0x7c, 0x4d, 0x5c, - 0xac, 0x98, 0x6d, 0xa1, 0xdf, 0x84, 0x14, 0x3b, 0x5e, 0xc7, 0x67, 0x81, 0x31, 0xc6, 0x51, 0x6b, - 0xc3, 0x41, 0x51, 0xdb, 0xe3, 0xc2, 0x9b, 0x63, 0x6b, 0x02, 0xb5, 0x69, 0xa1, 0x22, 0xa4, 0x7d, - 0xd7, 0x20, 0x9f, 0xd8, 0xd4, 0xb7, 0x9d, 0x13, 0x1e, 0x72, 0x34, 0x0c, 0xbe, 0xdb, 0x90, 0x92, - 0xc2, 0x9f, 0xc7, 0x00, 0x5d, 0x74, 0x57, 0xf4, 0x8f, 0x0a, 0xdc, 0x09, 0xc2, 0x8b, 0xeb, 0xd9, - 0x27, 0xb6, 0x63, 0x76, 0xc6, 0xe2, 0x8c, 0xc2, 0xcd, 0xfc, 0xd1, 0x97, 0xb9, 0x13, 0x32, 0xf6, - 0xec, 0x4a, 0xf8, 0xc9, 0x18, 0x74, 0x87, 0xb1, 0xb6, 0x88, 0x41, 0x17, 0x54, 0x1e, 0xe2, 0x7c, - 0xff, 0x0b, 0x26, 0x17, 0xee, 0xc3, 0x8b, 0x53, 0x81, 0xaf, 0xc3, 0xde, 0x85, 0x9f, 0x28, 0xf0, - 0xc2, 0x17, 0x70, 0x6a, 0x14, 0x27, 0x2b, 0x70, 0x3e, 0x88, 0xe2, 0xa4, 0xef, 0x7d, 0xef, 0x4b, - 0xf0, 0x76, 0xf4, 0x25, 0x7e, 0x05, 0x12, 0xc2, 0x49, 0xd1, 0xed, 0xd0, 0xff, 0xd4, 0x6a, 0x42, - 0xf8, 0x1f, 0x77, 0x24, 0x04, 0x2a, 0x67, 0xaa, 0x18, 0xcf, 0x15, 0xf8, 0xef, 0x96, 0xaa, 0x29, - 0x7a, 0xac, 0xfc, 0x06, 0x2c, 0xc8, 0xa5, 0x82, 0xf8, 0x83, 0x5e, 0x04, 0x38, 0xb5, 0x4f, 0x4e, - 0x8d, 0x27, 0xa6, 0x4f, 0x3c, 0x0e, 0x96, 0xc1, 0x29, 0x26, 0xf9, 0x90, 0x09, 0xca, 0xbf, 0xa7, - 0x41, 0xb6, 0xd9, 0xed, 0xb9, 0x9e, 0x1f, 0x44, 0xa7, 0x07, 0x90, 0x10, 0xac, 0x21, 0x4f, 0xbd, - 0x32, 0x65, 0x5f, 0x63, 0x33, 0x05, 0x3d, 0xcb, 0xab, 0x25, 0x31, 0xc2, 0xe8, 0x11, 0xbb, 0x34, - 0x7a, 0xbc, 0x07, 0x09, 0x91, 0x7b, 0x72, 0x5f, 0x4d, 0xdf, 0x2b, 0x5e, 0xc2, 0x07, 0xcd, 0x5d, - 0xc6, 0x08, 0x1b, 0x5c, 0x2d, 0x00, 0x17, 0x93, 0xd0, 0xb7, 0x40, 0xa3, 0xd4, 0x37, 0xa8, 0xfd, - 0x63, 0x11, 0x7c, 0xe2, 0xd5, 0xf4, 0x70, 0x50, 0x4c, 0xee, 0xef, 0x1f, 0xec, 0xdb, 0x3f, 0x26, - 0x38, 0x49, 0xa9, 0xcf, 0x7e, 0xa0, 0x02, 0x68, 0x4f, 0xcc, 0x4e, 0x87, 0x07, 0xa9, 0x79, 0x9e, - 0x37, 0x86, 0xcf, 0xe3, 0xb7, 0x32, 0xf1, 0x7f, 0x74, 0x2b, 0x65, 0xa0, 0xe9, 0x99, 0xfe, 0x29, - 0x4f, 0x6e, 0x52, 0x18, 0x84, 0x68, 0xcf, 0xf4, 0x4f, 0x51, 0x1e, 0x92, 0xd4, 0x64, 0x9c, 0x4f, - 0xf3, 0x5a, 0x29, 0xbe, 0x9a, 0xc1, 0xc1, 0x23, 0x5a, 0x01, 0x1e, 0xb1, 0xc4, 0x23, 0x27, 0xff, - 0x38, 0x8e, 0x48, 0xb8, 0x01, 0xce, 0xec, 0x9e, 0x71, 0x7c, 0x46, 0x05, 0xe3, 0x4b, 0x03, 0x9c, - 0xd9, 0xbd, 0x8d, 0xfb, 0x14, 0x27, 0xd9, 0xe0, 0xc6, 0x19, 0x65, 0x89, 0xa6, 0xed, 0x9c, 0x10, - 0xea, 0x1b, 0x96, 0xed, 0x91, 0xb6, 0xdf, 0x39, 0xe7, 0x94, 0xaf, 0xe1, 0x9c, 0x10, 0xd7, 0xa5, - 0x94, 0x85, 0x92, 0xc9, 0xf0, 0xc4, 0xa9, 0x5a, 0xc3, 0x0b, 0x13, 0xd1, 0xe9, 0xd2, 0xa8, 0x93, - 0xbd, 0x3c, 0xea, 0x5c, 0x91, 0xee, 0xdd, 0xfe, 0xff, 0x48, 0xf7, 0x3e, 0x8d, 0xc1, 0x3c, 0x77, - 0x58, 0xf4, 0x2e, 0xa8, 0x2c, 0x5c, 0xc9, 0xf2, 0x60, 0xd6, 0xdc, 0x83, 0xcf, 0x61, 0x57, 0xd1, - 0x31, 0xbb, 0x24, 0x8f, 0xf8, 0xa1, 0xf2, 0xdf, 0xe8, 0x05, 0x48, 0x52, 0xf2, 0xc8, 0x78, 0x6c, - 0x76, 0xf2, 0x4b, 0xfc, 0xc4, 0x12, 0x94, 0x3c, 0x7a, 0x68, 0x76, 0xd0, 0x2d, 0x48, 0xd8, 0xd4, - 0x70, 0xc8, 0x93, 0xfc, 0x32, 0xb7, 0xd3, 0xbc, 0x4d, 0x77, 0xc8, 0x13, 0xce, 0xda, 0xa6, 0x77, - 0x42, 0x7c, 0xa3, 0xed, 0x76, 0x68, 0xfe, 0x16, 0xbb, 0x29, 0x2c, 0xb5, 0x61, 0xa2, 0x9a, 0xdb, - 0xa1, 0x2d, 0x55, 0x8b, 0xe9, 0xf1, 0x96, 0xaa, 0xc5, 0x75, 0xb5, 0xa5, 0x6a, 0xaa, 0x3e, 0xdf, - 0x52, 0xb5, 0x79, 0x3d, 0xd1, 0x52, 0xb5, 0x84, 0x9e, 0x6c, 0xa9, 0x5a, 0x52, 0xd7, 0x5a, 0xaa, - 0xa6, 0xe9, 0xa9, 0x96, 0xaa, 0xa5, 0x74, 0x68, 0xa9, 0x1a, 0xe8, 0xe9, 0x96, 0xaa, 0xa5, 0xf5, - 0x4c, 0x4b, 0xd5, 0x32, 0x7a, 0xb6, 0xa5, 0x6a, 0x59, 0x3d, 0xd7, 0x52, 0xb5, 0x9c, 0xbe, 0xd0, - 0x52, 0xb5, 0x05, 0x5d, 0x6f, 0xa9, 0x9a, 0xae, 0x2f, 0xb6, 0x54, 0x6d, 0x51, 0x47, 0xe5, 0xff, - 0x56, 0x20, 0x27, 0x6e, 0x72, 0xc8, 0x1a, 0xaf, 0xc1, 0x22, 0x77, 0x31, 0xdb, 0x39, 0x31, 0x7a, - 0x52, 0xc8, 0xf9, 0x20, 0x86, 0xf5, 0x60, 0x20, 0x54, 0xfe, 0x26, 0x64, 0x3d, 0x62, 0x5a, 0x23, - 0xc5, 0x18, 0x57, 0xcc, 0x30, 0x61, 0xa8, 0xf4, 0x32, 0xe4, 0x38, 0xd5, 0x8d, 0xb4, 0xe2, 0x5c, - 0x2b, 0xcb, 0xa5, 0xa1, 0x5a, 0x15, 0xb2, 0xb4, 0x67, 0x3a, 0x23, 0x2d, 0x95, 0x93, 0xd0, 0x0b, - 0x97, 0x10, 0xc3, 0x7e, 0xcf, 0x74, 0x24, 0x21, 0x64, 0xd8, 0x9c, 0x28, 0xe5, 0x79, 0x84, 0xf6, - 0xbb, 0xc4, 0xe8, 0xb9, 0x22, 0xa5, 0x8c, 0xe3, 0x94, 0x90, 0xec, 0xb9, 0xb4, 0x8c, 0x79, 0x42, - 0xde, 0xef, 0x12, 0x06, 0xf0, 0xc0, 0xa6, 0x3e, 0xfa, 0x35, 0xc8, 0xc8, 0x09, 0x0c, 0x27, 0x20, - 0xbe, 0x2b, 0xd6, 0x4c, 0x7b, 0x21, 0x08, 0x2d, 0xff, 0x9d, 0x02, 0x4b, 0x75, 0xcf, 0xed, 0xf5, - 0x88, 0x25, 0x1d, 0x45, 0x90, 0x69, 0xe0, 0x1f, 0x4a, 0xc4, 0x3f, 0x36, 0x21, 0xd6, 0xac, 0xcb, - 0x04, 0xe0, 0xad, 0x1b, 0x27, 0x14, 0xcd, 0x3a, 0x7a, 0x07, 0x12, 0x2c, 0x11, 0xec, 0x53, 0xce, - 0x9e, 0xb9, 0x7b, 0xbf, 0x3c, 0x85, 0xa9, 0xf7, 0xb9, 0x22, 0x96, 0x13, 0xca, 0xff, 0xa4, 0xc2, - 0xad, 0xfd, 0xf6, 0x29, 0xe9, 0x9a, 0xb5, 0x53, 0xd3, 0x39, 0x21, 0x9b, 0xb5, 0xe0, 0x8d, 0x3f, - 0x86, 0xa4, 0xed, 0x58, 0xe4, 0x93, 0x90, 0xff, 0xdf, 0x9b, 0x86, 0x7a, 0x19, 0x44, 0x45, 0x1a, - 0xa2, 0xc9, 0x60, 0x82, 0x4c, 0x4b, 0x62, 0xa2, 0x1f, 0x86, 0xd1, 0x45, 0x54, 0x3b, 0xef, 0xde, - 0x18, 0xbd, 0x3e, 0x11, 0x69, 0xc6, 0x88, 0x3c, 0xce, 0xa3, 0xc1, 0x57, 0x4b, 0xe4, 0x85, 0x3f, - 0x52, 0x20, 0x13, 0xdd, 0x1b, 0x3a, 0x02, 0x8d, 0xef, 0x2b, 0xe8, 0x74, 0xc4, 0xab, 0x9b, 0x8c, - 0x7e, 0xf9, 0x20, 0x5f, 0xf0, 0xed, 0xeb, 0x2f, 0x28, 0xe6, 0x4a, 0x83, 0x35, 0x2d, 0xf4, 0x4b, - 0x90, 0xb2, 0x3c, 0xb7, 0x37, 0xea, 0x3f, 0xc4, 0xb1, 0xc6, 0x04, 0x8c, 0xcf, 0x0a, 0x4f, 0x20, - 0x15, 0x9a, 0x23, 0x92, 0xae, 0xc6, 0xbf, 0x8a, 0x74, 0x75, 0xda, 0xc2, 0xe5, 0xff, 0x51, 0x61, - 0x29, 0x7a, 0x3c, 0x81, 0xf7, 0xfc, 0x3a, 0xe8, 0x91, 0x9b, 0x64, 0x74, 0x6c, 0xea, 0xcb, 0x83, - 0x7e, 0x65, 0x7a, 0x7a, 0x14, 0xb9, 0x8e, 0xf2, 0x5c, 0x73, 0xde, 0xf8, 0x25, 0xfd, 0x11, 0xe4, - 0x2c, 0xb1, 0x57, 0x43, 0x7a, 0x50, 0xfc, 0xca, 0xfc, 0xe4, 0x92, 0x2b, 0x29, 0xd1, 0xb3, 0x56, - 0x64, 0x88, 0xa2, 0xdf, 0x86, 0xa5, 0x00, 0xdc, 0x32, 0x7d, 0x93, 0xd9, 0x81, 0x1d, 0xaa, 0xca, - 0x2f, 0xe9, 0x83, 0xe1, 0xa0, 0xb8, 0x28, 0xa1, 0xea, 0x72, 0xf4, 0xe6, 0xb6, 0x5d, 0xb4, 0x26, - 0x90, 0x2c, 0xf4, 0x31, 0x68, 0xa2, 0x08, 0xb6, 0x2d, 0x9e, 0x9f, 0x64, 0xab, 0x55, 0xe6, 0x47, - 0xfc, 0xdd, 0x6e, 0xbe, 0x50, 0x92, 0x63, 0x36, 0x2d, 0xe4, 0x40, 0xba, 0xdb, 0xf7, 0x4d, 0x56, - 0x3b, 0x8d, 0x92, 0x9c, 0x6d, 0x56, 0x1a, 0x6f, 0x4b, 0x31, 0x5f, 0xe4, 0x7b, 0xd7, 0x5e, 0x64, - 0x34, 0x1d, 0x43, 0xb0, 0x42, 0xd3, 0x42, 0xf7, 0x21, 0x27, 0x12, 0x34, 0x83, 0x65, 0x2a, 0xac, - 0xda, 0x4b, 0xf2, 0x25, 0x5f, 0x7a, 0x3e, 0x28, 0x96, 0x2e, 0xf1, 0x1a, 0x91, 0xdb, 0x3d, 0x14, - 0xba, 0x38, 0x7b, 0x1c, 0x7d, 0x94, 0x89, 0xed, 0x6d, 0x58, 0x8e, 0x4e, 0x0c, 0xbb, 0x2b, 0x7f, - 0x30, 0x0f, 0xb7, 0xc7, 0x69, 0x22, 0x8c, 0x02, 0xc6, 0x24, 0x91, 0xfd, 0x60, 0x66, 0xaa, 0x09, - 0x30, 0xc4, 0x6d, 0x0c, 0x9e, 0x26, 0xa9, 0xec, 0xe3, 0x09, 0x2a, 0xbb, 0x01, 0x3e, 0x3f, 0xe1, - 0x09, 0x7c, 0x09, 0x5a, 0xf8, 0x67, 0x05, 0xb2, 0x63, 0xeb, 0x7f, 0x2d, 0x74, 0xb3, 0x17, 0xc6, - 0x94, 0x18, 0x8f, 0x29, 0x6f, 0x5f, 0x7f, 0x53, 0xe3, 0xa1, 0xa6, 0xf0, 0xf7, 0x0a, 0x64, 0xc7, - 0xf6, 0xf9, 0x55, 0x13, 0xd5, 0x57, 0xfe, 0xca, 0xe5, 0xb7, 0x20, 0x21, 0x24, 0x08, 0x41, 0xee, - 0xc3, 0xf5, 0xe6, 0x41, 0x73, 0x67, 0xd3, 0xd8, 0xd8, 0xc5, 0xc6, 0x66, 0x4d, 0x9f, 0x43, 0x19, - 0xd0, 0xea, 0x8d, 0x07, 0x0d, 0x26, 0xd4, 0x15, 0x94, 0x86, 0x24, 0x7f, 0x6a, 0xd4, 0xf5, 0x58, - 0xb9, 0x0a, 0xba, 0xc0, 0x3e, 0x26, 0x8c, 0x5a, 0x58, 0x06, 0x87, 0x2a, 0xb0, 0xc4, 0x60, 0x49, - 0x97, 0x85, 0x26, 0x46, 0xa6, 0x46, 0x24, 0x23, 0x58, 0x0c, 0x87, 0x18, 0xad, 0xee, 0x98, 0x5d, - 0x52, 0xfe, 0xa9, 0x0a, 0x8b, 0x23, 0x90, 0x80, 0x58, 0x59, 0xa6, 0x6f, 0x3b, 0x67, 0xc6, 0xa8, - 0x95, 0x2c, 0x32, 0x7d, 0xdb, 0x39, 0x3b, 0xc4, 0x4d, 0x9c, 0x64, 0x83, 0x87, 0x9e, 0x8d, 0x5a, - 0xa0, 0xba, 0x3d, 0x3f, 0x48, 0x9b, 0xbe, 0x3b, 0xc5, 0x14, 0x17, 0xd6, 0xa8, 0xec, 0xf6, 0x7c, - 0x51, 0xec, 0x62, 0x8e, 0x81, 0xfe, 0x5a, 0x81, 0xa4, 0x48, 0x43, 0x69, 0x3e, 0xc1, 0xf1, 0xde, - 0xb9, 0x16, 0x9e, 0x30, 0x80, 0xec, 0x49, 0xee, 0x31, 0xe7, 0x7e, 0x3e, 0x28, 0x2e, 0x4e, 0x1a, - 0x88, 0xde, 0xb4, 0x59, 0x19, 0xbc, 0x1b, 0x6a, 0x89, 0x36, 0xd9, 0xc8, 0xc2, 0x9c, 0x6f, 0x66, - 0xec, 0x44, 0x66, 0xc7, 0x4e, 0xa0, 0x70, 0x02, 0x99, 0xe8, 0x6b, 0x5f, 0x52, 0xf6, 0xaf, 0x8f, - 0x97, 0xfd, 0xaf, 0xcd, 0x64, 0x12, 0x81, 0x19, 0x2d, 0xf3, 0xdf, 0x82, 0x54, 0x68, 0xef, 0xeb, - 0x34, 0x29, 0x04, 0x21, 0x86, 0x35, 0xc1, 0xbc, 0x9e, 0x28, 0xff, 0x54, 0x81, 0x0c, 0x26, 0xd4, - 0xed, 0x3c, 0x26, 0x16, 0x0b, 0x97, 0xe8, 0x3b, 0xa0, 0xb2, 0xf0, 0x2b, 0x2b, 0x9a, 0x2b, 0xf2, - 0x58, 0xae, 0x8a, 0xd6, 0x21, 0x15, 0xd6, 0x65, 0xd7, 0xf9, 0xcc, 0x31, 0x9a, 0xc5, 0x0a, 0xc2, - 0x23, 0xb7, 0xef, 0x58, 0xa6, 0x77, 0x6e, 0x78, 0xc4, 0x6c, 0xb3, 0x82, 0x50, 0xb4, 0xa0, 0x16, - 0x02, 0x39, 0x16, 0xe2, 0xf2, 0xa7, 0x31, 0x40, 0x23, 0xe3, 0x84, 0xc4, 0x70, 0x00, 0x2c, 0xe8, - 0xf3, 0x7d, 0xc8, 0x4c, 0x5c, 0x30, 0xeb, 0xdd, 0xe9, 0xb9, 0x43, 0xb8, 0xf1, 0xe0, 0x48, 0xbd, - 0x88, 0x8c, 0xa2, 0x3f, 0x9b, 0x5e, 0x7d, 0xc6, 0x79, 0xf5, 0xf9, 0x21, 0x9b, 0xf9, 0xb5, 0x56, - 0xa0, 0x32, 0xb2, 0xfd, 0x83, 0x0a, 0xa8, 0xe6, 0x11, 0xd3, 0x27, 0x8c, 0x72, 0xe8, 0xb4, 0xc2, - 0xa1, 0x0a, 0xf3, 0x3c, 0x36, 0xc8, 0xf3, 0x99, 0xb1, 0x52, 0x95, 0x46, 0x11, 0x53, 0xd1, 0x6f, - 0x40, 0xa6, 0xed, 0x76, 0xfa, 0x5d, 0xc7, 0xe0, 0x3d, 0x64, 0x99, 0x43, 0xfd, 0xea, 0x34, 0x27, - 0xbe, 0xf0, 0x72, 0x95, 0x9a, 0xdb, 0x61, 0xcf, 0x41, 0x21, 0x24, 0x00, 0xb9, 0x06, 0xba, 0x03, - 0xa9, 0xf0, 0x42, 0xf1, 0xf4, 0x29, 0x85, 0x47, 0x02, 0x74, 0x0f, 0xe6, 0x4d, 0x6a, 0xb8, 0xc7, - 0x3c, 0xcb, 0xb9, 0xca, 0xc3, 0xb0, 0x6a, 0xd2, 0xdd, 0x63, 0xf4, 0x26, 0x64, 0x8f, 0x1f, 0x89, - 0x94, 0x4f, 0x30, 0xa7, 0x68, 0xed, 0x2f, 0x0c, 0x07, 0xc5, 0xf4, 0xc6, 0x07, 0x7c, 0xb3, 0x8c, - 0x37, 0x71, 0xfa, 0xf8, 0x51, 0xf8, 0x80, 0x5e, 0x85, 0xc5, 0xae, 0xf9, 0x89, 0x71, 0xec, 0x99, - 0x6d, 0x99, 0xf6, 0x74, 0x04, 0x2b, 0x28, 0x78, 0xa1, 0x6b, 0x7e, 0xb2, 0x21, 0xe5, 0x4d, 0xab, - 0x43, 0x0a, 0x3f, 0x53, 0x20, 0x29, 0x77, 0x84, 0x6c, 0x00, 0x69, 0x1e, 0xdb, 0x12, 0x79, 0x43, - 0xb6, 0xda, 0x1a, 0x0e, 0x8a, 0xa9, 0x1a, 0x97, 0x36, 0xeb, 0xf4, 0xf9, 0xa0, 0xf8, 0xce, 0xb5, - 0xd9, 0x2a, 0x98, 0x8d, 0x53, 0x02, 0xbd, 0x69, 0xf1, 0xaa, 0xf9, 0xd4, 0xa4, 0xc6, 0xa9, 0x4d, - 0x7d, 0xf7, 0xc4, 0x33, 0xbb, 0xfc, 0x54, 0x35, 0x9c, 0x39, 0x35, 0xe9, 0x56, 0x20, 0x43, 0x05, - 0x16, 0xf2, 0x1f, 0x8b, 0xde, 0xbf, 0xb8, 0x4b, 0xe1, 0x73, 0xf9, 0x16, 0x2c, 0x45, 0xce, 0x26, - 0x4c, 0x89, 0x7e, 0x96, 0x82, 0xe4, 0x9e, 0x79, 0xde, 0x71, 0x4d, 0x0b, 0x95, 0x20, 0x1d, 0x74, - 0xe2, 0x59, 0x1a, 0x26, 0x9c, 0x29, 0x2a, 0x62, 0x0b, 0xf4, 0x29, 0xf1, 0xb8, 0x61, 0x05, 0xd5, - 0x84, 0xcf, 0xf2, 0xf3, 0x03, 0x5b, 0xcb, 0xe8, 0xda, 0x6d, 0xcf, 0x15, 0x75, 0x66, 0x9c, 0x53, - 0x26, 0x93, 0x6e, 0x73, 0x21, 0xba, 0x0b, 0x0b, 0xc7, 0xb6, 0xc3, 0x3b, 0x3d, 0x81, 0x1e, 0x6f, - 0xc6, 0xe1, 0x5c, 0x20, 0x96, 0x8a, 0x2e, 0xe4, 0x22, 0x1f, 0x1f, 0x98, 0x81, 0x13, 0xdc, 0xc0, - 0x5b, 0xc3, 0x41, 0x31, 0x3b, 0x72, 0x58, 0x61, 0xe4, 0x1b, 0x85, 0x84, 0xec, 0x08, 0x9f, 0x99, - 0x78, 0x19, 0xe6, 0xf9, 0x07, 0x73, 0xfe, 0x81, 0x25, 0x85, 0xc5, 0x03, 0xfa, 0x2e, 0xcc, 0x77, - 0x88, 0x49, 0x45, 0x3f, 0x2d, 0x7d, 0xaf, 0x34, 0xc5, 0xf7, 0xf9, 0xf7, 0x6c, 0x2c, 0xd4, 0x51, - 0x15, 0x12, 0xa2, 0x69, 0xc7, 0x5b, 0x6d, 0xe3, 0x1f, 0x2f, 0xa6, 0x7e, 0x76, 0xdd, 0x9a, 0xc3, - 0x72, 0x26, 0x6a, 0x40, 0xd2, 0x13, 0x0d, 0x5a, 0xde, 0x80, 0xbb, 0xb2, 0x2c, 0x8a, 0x74, 0x8d, - 0xb7, 0xe6, 0x70, 0x30, 0x17, 0x1d, 0x40, 0x86, 0x46, 0x32, 0x19, 0xf9, 0x35, 0xa5, 0x32, 0x63, - 0xe2, 0x33, 0x02, 0x1c, 0x43, 0x61, 0x1b, 0xb4, 0x79, 0x1b, 0x88, 0xf7, 0xf1, 0xa6, 0x6f, 0x70, - 0xac, 0xf3, 0xcb, 0x36, 0x28, 0x66, 0xa2, 0x1d, 0x80, 0x76, 0x48, 0xec, 0xf9, 0x1c, 0xc7, 0xf9, - 0xf6, 0x75, 0xb2, 0x86, 0xad, 0x39, 0x1c, 0x41, 0x40, 0x1f, 0x40, 0xba, 0x3d, 0x72, 0xf2, 0xfc, - 0x02, 0x07, 0x7c, 0xfd, 0x5a, 0x74, 0xb5, 0xc5, 0x28, 0x6a, 0x24, 0x1d, 0xa7, 0x28, 0x7d, 0x92, - 0xa2, 0x1a, 0x90, 0x95, 0x15, 0xac, 0xf8, 0x5b, 0x8b, 0xfc, 0x22, 0x67, 0xc8, 0xa8, 0x97, 0x04, - 0x7f, 0x8d, 0x51, 0x69, 0x38, 0x6d, 0xd7, 0x22, 0x56, 0x83, 0x3d, 0x63, 0xd9, 0x42, 0xe2, 0x0f, - 0x14, 0x6d, 0x42, 0xae, 0xdd, 0x21, 0xa6, 0xd3, 0xef, 0x05, 0x38, 0x68, 0x46, 0x9c, 0xac, 0x9c, - 0x27, 0x81, 0x76, 0x00, 0x1d, 0xf3, 0xef, 0x31, 0xd1, 0xb7, 0xe2, 0x8d, 0xc5, 0x59, 0xc0, 0x74, - 0x3e, 0x17, 0x8f, 0xde, 0x0c, 0xbd, 0x04, 0x59, 0xc7, 0x75, 0xda, 0xa6, 0xd3, 0x26, 0x1d, 0x1e, - 0x4c, 0x44, 0x2f, 0x72, 0x5c, 0x88, 0x3e, 0x82, 0x1c, 0x1d, 0x4b, 0x95, 0xf3, 0xb7, 0xf8, 0x8a, - 0x6f, 0x5c, 0xb7, 0x5d, 0xb3, 0x35, 0x87, 0x27, 0x90, 0xaa, 0x29, 0x48, 0x5a, 0x62, 0x30, 0xec, - 0x63, 0x26, 0x75, 0xad, 0xfc, 0x87, 0x09, 0xd0, 0xc2, 0x4c, 0x60, 0x0d, 0x50, 0xc8, 0xdd, 0xa3, - 0xef, 0xa4, 0x8c, 0xbf, 0x62, 0x5b, 0x73, 0x78, 0x31, 0x18, 0x1b, 0x7d, 0x2a, 0xbd, 0x0b, 0x0b, - 0x5d, 0xd7, 0xb2, 0x8f, 0xed, 0x11, 0x09, 0x89, 0x9e, 0x45, 0x2e, 0x10, 0x4b, 0x12, 0x7a, 0x7f, - 0xec, 0x7b, 0x48, 0x7c, 0x86, 0x38, 0xb4, 0x35, 0x17, 0xf9, 0x60, 0xc2, 0x48, 0xd1, 0xeb, 0x3b, - 0x8e, 0xed, 0x9c, 0x18, 0xb2, 0xea, 0x10, 0x51, 0x2e, 0x2b, 0xa5, 0xb2, 0x70, 0xa8, 0x4d, 0x90, - 0xc5, 0x2b, 0x57, 0x92, 0x45, 0xb0, 0xf7, 0x2d, 0x25, 0x64, 0x8b, 0x8d, 0x49, 0xb6, 0x78, 0xf5, - 0x6a, 0xb6, 0x88, 0xc0, 0x84, 0x74, 0x71, 0x78, 0x29, 0x5d, 0xac, 0xcd, 0x78, 0x96, 0x11, 0xc4, - 0x71, 0xbe, 0xa8, 0x4d, 0xf0, 0xc5, 0x2b, 0x57, 0xf2, 0x45, 0x74, 0x8f, 0x92, 0x30, 0x76, 0x2f, - 0x21, 0x8c, 0xd7, 0x67, 0x22, 0x8c, 0x08, 0x58, 0x94, 0x31, 0xf0, 0x65, 0x8c, 0x51, 0x99, 0x8d, - 0x31, 0x22, 0x90, 0x63, 0x94, 0xf1, 0xa3, 0x0b, 0xd7, 0x41, 0xe7, 0xb0, 0xdf, 0xb9, 0x76, 0xa9, - 0xb9, 0xa5, 0x5c, 0xb8, 0x0f, 0x00, 0x5a, 0xd0, 0xed, 0x8e, 0xdc, 0x8d, 0xf2, 0x9f, 0x2a, 0x10, - 0x6f, 0xb9, 0x47, 0x28, 0x37, 0xaa, 0x96, 0x79, 0xb9, 0xfb, 0x83, 0x91, 0xba, 0x4c, 0x04, 0xbf, - 0x39, 0xe5, 0x2d, 0x82, 0x75, 0x71, 0x38, 0x09, 0x7d, 0x1f, 0x92, 0x3d, 0x91, 0x1f, 0x48, 0xf7, - 0x2f, 0x4f, 0x9b, 0x2f, 0x34, 0x71, 0x30, 0xe5, 0xd5, 0x1f, 0x46, 0x6b, 0xe3, 0x3a, 0x5e, 0x6f, - 0xee, 0xb0, 0xe2, 0x78, 0x67, 0x7d, 0xbb, 0xb1, 0xaf, 0xcf, 0xa1, 0x3c, 0x2c, 0xb3, 0x7a, 0x59, - 0x16, 0xcb, 0x46, 0x73, 0xe7, 0xa0, 0x81, 0x1f, 0xae, 0x3f, 0xd0, 0x15, 0x74, 0x1b, 0x10, 0xde, - 0xad, 0xdd, 0xdf, 0xaf, 0x57, 0x8d, 0xda, 0xee, 0xf6, 0xde, 0x7a, 0xed, 0xa0, 0xb9, 0xbb, 0xa3, - 0xc7, 0x90, 0x06, 0x6a, 0x7d, 0x77, 0xa7, 0xa1, 0xc3, 0xab, 0x83, 0x18, 0xa8, 0x07, 0xe7, 0x3d, - 0x82, 0x5e, 0x82, 0xf4, 0xe1, 0xce, 0xfe, 0x5e, 0xa3, 0xd6, 0xdc, 0x68, 0x36, 0xea, 0xfa, 0x5c, - 0x61, 0xe9, 0xe9, 0xb3, 0xd2, 0x02, 0x1b, 0x3a, 0x74, 0x68, 0x8f, 0xb4, 0xf9, 0x75, 0x46, 0x05, - 0x48, 0x54, 0xd7, 0x6b, 0xf7, 0x0f, 0xf7, 0x74, 0xa5, 0x90, 0x7b, 0xfa, 0xac, 0x04, 0x4c, 0x41, - 0x5c, 0x25, 0x74, 0x07, 0x92, 0xb8, 0xb1, 0x7f, 0xb0, 0x8b, 0x1b, 0x7a, 0xac, 0xb0, 0xf0, 0xf4, - 0x59, 0x29, 0xcd, 0x06, 0xe5, 0x0d, 0x41, 0x77, 0x21, 0xbb, 0x5f, 0xdb, 0x6a, 0x6c, 0xaf, 0x1b, - 0xb5, 0xad, 0xf5, 0x9d, 0xcd, 0x86, 0x1e, 0x2f, 0x2c, 0x3f, 0x7d, 0x56, 0xd2, 0x99, 0x4e, 0xf4, - 0xd4, 0xd8, 0x12, 0xcd, 0xed, 0xbd, 0x5d, 0x7c, 0xa0, 0xab, 0xa3, 0x25, 0x84, 0x27, 0xa3, 0x32, - 0x80, 0x98, 0xbd, 0xd1, 0x68, 0xd4, 0xf5, 0xf9, 0x02, 0x7a, 0xfa, 0xac, 0x94, 0x63, 0xe3, 0x23, - 0x07, 0x45, 0x2f, 0x43, 0xa6, 0x86, 0x1b, 0xeb, 0x07, 0x0d, 0x63, 0xff, 0x60, 0xfd, 0x60, 0x5f, - 0x4f, 0x8c, 0x76, 0x12, 0x71, 0x3a, 0x54, 0x81, 0xc5, 0xf5, 0xc3, 0x83, 0x5d, 0x63, 0x4c, 0x37, - 0x59, 0x78, 0xe1, 0xe9, 0xb3, 0xd2, 0x12, 0xd3, 0x5d, 0xef, 0xfb, 0x6e, 0x54, 0xff, 0xdb, 0xa0, - 0x8f, 0xbd, 0xbf, 0xb1, 0x59, 0xd3, 0xb5, 0xc2, 0xed, 0xa7, 0xcf, 0x4a, 0x68, 0x72, 0x0b, 0x9b, - 0xb5, 0x82, 0xf6, 0xe9, 0x5f, 0xae, 0xcc, 0xfd, 0xcd, 0x5f, 0xad, 0xcc, 0x55, 0x57, 0x3f, 0xfb, - 0xf7, 0x95, 0xb9, 0xcf, 0x86, 0x2b, 0xca, 0xcf, 0x87, 0x2b, 0xca, 0x2f, 0x86, 0x2b, 0xca, 0xbf, - 0x0d, 0x57, 0x94, 0x3f, 0xfe, 0x7c, 0x65, 0xee, 0xe7, 0x9f, 0xaf, 0xcc, 0xfd, 0xe2, 0xf3, 0x95, - 0xb9, 0x8f, 0x12, 0xe2, 0xd4, 0x8f, 0x12, 0xfc, 0x2f, 0xfa, 0xde, 0xfc, 0xdf, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xa7, 0x92, 0x8d, 0x81, 0xac, 0x28, 0x00, 0x00, +func init() { proto.RegisterFile("jobs/jobspb/jobs.proto", fileDescriptor_jobs_516477c5bdf413a7) } + +var fileDescriptor_jobs_516477c5bdf413a7 = []byte{ + // 3642 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0x4d, 0x6c, 0x23, 0x47, + 0x76, 0x56, 0x93, 0x2d, 0xb2, 0xf9, 0xf8, 0xa3, 0x56, 0x49, 0x33, 0xc3, 0x65, 0xc6, 0x22, 0xc3, + 0xb5, 0x77, 0x64, 0x7b, 0x4d, 0x79, 0xc7, 0x9b, 0xf5, 0xcf, 0xae, 0xbd, 0x11, 0x7f, 0x24, 0x91, + 0x33, 0xfa, 0x71, 0x49, 0x1a, 0xef, 0xce, 0xc2, 0xe9, 0x6d, 0xb1, 0x4b, 0x52, 0x47, 0x64, 0x37, + 0xa7, 0xab, 0x39, 0x63, 0x2d, 0x02, 0x24, 0xd9, 0x5c, 0x8c, 0x41, 0x80, 0x24, 0xc0, 0x06, 0xb9, + 0x64, 0x80, 0x00, 0x49, 0x80, 0x00, 0x41, 0xb0, 0xb9, 0x04, 0xc9, 0x25, 0xc7, 0x00, 0x3e, 0xee, + 0x71, 0x91, 0x03, 0x93, 0xc8, 0x08, 0x10, 0x04, 0x09, 0x90, 0xf3, 0x9c, 0x82, 0xfa, 0xe9, 0x66, + 0x93, 0xd2, 0x50, 0x94, 0xec, 0x38, 0x97, 0x19, 0xf6, 0xab, 0xaa, 0xaf, 0xaa, 0x5e, 0xbd, 0xf7, + 0xbd, 0xf7, 0xaa, 0x04, 0x37, 0x7f, 0xd3, 0x3d, 0xa0, 0x2b, 0xec, 0x9f, 0xde, 0x01, 0xff, 0xaf, + 0xd2, 0xf3, 0x5c, 0xdf, 0x45, 0x5f, 0x6b, 0xbb, 0xed, 0x13, 0xcf, 0x35, 0xdb, 0xc7, 0x15, 0xfa, + 0xa8, 0x53, 0xe1, 0x2d, 0xa2, 0x57, 0xe1, 0x06, 0xf1, 0x3c, 0xd7, 0x63, 0xfd, 0xc5, 0x0f, 0x31, + 0xa2, 0xb0, 0x78, 0xe4, 0x1e, 0xb9, 0xfc, 0xe7, 0x0a, 0xfb, 0x25, 0xa5, 0xf3, 0x1c, 0xa3, 0x77, + 0xb0, 0x62, 0xf6, 0x6c, 0x29, 0x42, 0x81, 0xc8, 0x32, 0x7d, 0x53, 0xca, 0xf2, 0x81, 0xcc, 0x76, + 0xdf, 0x38, 0x74, 0xbd, 0xae, 0xe9, 0x07, 0xb0, 0xb7, 0xe9, 0xa3, 0xce, 0x0a, 0x7d, 0xd4, 0x39, + 0x30, 0x29, 0x59, 0xa1, 0xbe, 0xd7, 0x6f, 0xfb, 0x7d, 0x8f, 0x58, 0xc1, 0xb8, 0xbe, 0x6f, 0x77, + 0x56, 0x8e, 0x3b, 0xed, 0x15, 0xdf, 0xee, 0x12, 0xea, 0x9b, 0xdd, 0x9e, 0x68, 0x29, 0xff, 0x36, + 0xcc, 0xde, 0x27, 0x26, 0x25, 0xe8, 0x21, 0x24, 0x1d, 0xd7, 0x22, 0x86, 0x6d, 0xe5, 0x95, 0x92, + 0xb2, 0x9c, 0xad, 0xae, 0x9e, 0x0d, 0x8a, 0x89, 0x2d, 0xd7, 0x22, 0xcd, 0xfa, 0xf3, 0x41, 0xf1, + 0xad, 0x23, 0xdb, 0x3f, 0xee, 0x1f, 0x54, 0xda, 0x6e, 0x77, 0x25, 0xdc, 0xb3, 0x75, 0x30, 0xfc, + 0xbd, 0xd2, 0x3b, 0x39, 0x5a, 0x91, 0xcb, 0xab, 0x88, 0x61, 0x38, 0xc1, 0x10, 0x9b, 0x16, 0x5a, + 0x84, 0x59, 0xd2, 0x73, 0xdb, 0xc7, 0xf9, 0x58, 0x49, 0x59, 0x8e, 0x63, 0xf1, 0xf1, 0x9e, 0xfa, + 0x1f, 0x7f, 0x56, 0x54, 0xca, 0xbf, 0x33, 0x0b, 0xd9, 0xaa, 0xd9, 0x3e, 0xe9, 0xf7, 0xea, 0xc4, + 0x37, 0xed, 0x0e, 0x45, 0x55, 0x00, 0xea, 0x9b, 0x9e, 0x6f, 0xb0, 0xb5, 0xf2, 0xc5, 0xa4, 0xef, + 0xbe, 0x54, 0x19, 0x2a, 0x9a, 0xed, 0xa5, 0x72, 0xdc, 0x69, 0x57, 0xf6, 0x82, 0xbd, 0x54, 0xd5, + 0xcf, 0x06, 0xc5, 0x19, 0x9c, 0xe2, 0xc3, 0x98, 0x14, 0x7d, 0x00, 0x1a, 0x71, 0x2c, 0x81, 0x10, + 0x9b, 0x1e, 0x21, 0x49, 0x1c, 0x8b, 0x8f, 0xff, 0x1a, 0xc4, 0xfb, 0x9e, 0x9d, 0x8f, 0x97, 0x94, + 0xe5, 0x54, 0x35, 0x79, 0x36, 0x28, 0xc6, 0xf7, 0x71, 0x13, 0x33, 0x19, 0xba, 0x03, 0x73, 0x07, + 0x7c, 0xbd, 0x46, 0xd7, 0x74, 0xec, 0x43, 0x42, 0xfd, 0xbc, 0x5a, 0x52, 0x96, 0x33, 0x38, 0x27, + 0xc4, 0x9b, 0x52, 0x8a, 0x7e, 0x4f, 0x81, 0x85, 0xbe, 0x67, 0x53, 0xe3, 0xe0, 0xd4, 0xe8, 0xb8, + 0x6d, 0xb3, 0x63, 0xfb, 0xa7, 0xc6, 0xc9, 0xe3, 0xfc, 0x6c, 0x29, 0xbe, 0x9c, 0xbe, 0xfb, 0x41, + 0xe5, 0x85, 0xa6, 0x53, 0x19, 0xd1, 0x47, 0x65, 0xdf, 0xb3, 0x69, 0xf5, 0xf4, 0xbe, 0x44, 0xb8, + 0xf7, 0xb8, 0xe1, 0xf8, 0xde, 0x69, 0x75, 0xf1, 0x6c, 0x50, 0xd4, 0xf7, 0x71, 0x33, 0xda, 0xf4, + 0x00, 0xeb, 0xfd, 0xb1, 0xce, 0x68, 0x03, 0x80, 0x38, 0x6d, 0xef, 0xb4, 0xe7, 0xdb, 0xae, 0x93, + 0x4f, 0x70, 0x5d, 0x2c, 0x47, 0xe6, 0x0e, 0x8e, 0x6c, 0xcd, 0xee, 0x90, 0x46, 0xd8, 0x71, 0x9b, + 0xff, 0x4b, 0x71, 0x64, 0x2c, 0xfa, 0x23, 0x05, 0x0a, 0xcc, 0x68, 0x48, 0xdb, 0x27, 0x42, 0xb5, + 0x5c, 0x75, 0x86, 0x47, 0xda, 0xae, 0x67, 0xe5, 0x93, 0x4c, 0x09, 0xd5, 0xdd, 0x7f, 0x9e, 0xd6, + 0x56, 0xb8, 0x49, 0xf6, 0xfb, 0xb6, 0x55, 0xd9, 0xdf, 0x6f, 0xd6, 0xcf, 0x06, 0xc5, 0xfc, 0x4e, + 0x00, 0x1e, 0x1e, 0x0b, 0xe6, 0xd0, 0x38, 0xdf, 0x7b, 0x41, 0x4b, 0xa1, 0x06, 0x37, 0x2e, 0x54, + 0x0f, 0xd2, 0x21, 0x7e, 0x42, 0x4e, 0xb9, 0xf5, 0xa4, 0x30, 0xfb, 0xc9, 0x8c, 0xf0, 0xb1, 0xd9, + 0xe9, 0x0b, 0x7b, 0x48, 0x61, 0xf1, 0xf1, 0x5e, 0xec, 0x1d, 0xa5, 0xac, 0x43, 0x4e, 0x68, 0x7c, + 0xc7, 0x73, 0x8f, 0x3c, 0x42, 0x69, 0xf9, 0x3f, 0x33, 0x90, 0xc3, 0x84, 0xfa, 0xae, 0x47, 0x02, + 0xab, 0xfc, 0x6b, 0x05, 0x16, 0x2c, 0x42, 0xdb, 0x9e, 0xdd, 0xf3, 0x5d, 0xcf, 0xf0, 0xc8, 0x13, + 0xcf, 0xf6, 0x09, 0xcd, 0xc7, 0xf8, 0x69, 0xae, 0x4e, 0x38, 0xcd, 0x51, 0xa0, 0x4a, 0x3d, 0x04, + 0xc1, 0x12, 0x43, 0x1c, 0xe8, 0xdb, 0x3f, 0xfd, 0x97, 0x29, 0x35, 0x17, 0x71, 0xf5, 0x4a, 0xb3, + 0x8e, 0x91, 0x75, 0x0e, 0x11, 0xdd, 0x06, 0x95, 0x59, 0x42, 0x3e, 0x5e, 0x8a, 0x2f, 0xa7, 0xaa, + 0xda, 0xd9, 0xa0, 0xa8, 0x32, 0x5b, 0xc1, 0x5c, 0x3a, 0xe2, 0x1d, 0xea, 0x35, 0xbc, 0x63, 0x1d, + 0xd2, 0xbe, 0x79, 0xd0, 0x21, 0x06, 0x9b, 0x99, 0x4a, 0x83, 0xfe, 0xc6, 0x98, 0x0a, 0x82, 0x15, + 0xee, 0xb1, 0x9e, 0x91, 0x4d, 0x83, 0x1f, 0x08, 0x28, 0x5a, 0x81, 0xb4, 0xfb, 0x98, 0x78, 0x9e, + 0x6d, 0x11, 0xc3, 0x3a, 0xe0, 0xd6, 0x99, 0xaa, 0xe6, 0xce, 0x06, 0x45, 0xd8, 0x96, 0xe2, 0x7a, + 0x15, 0x43, 0xd0, 0xa5, 0x7e, 0x80, 0x7c, 0x58, 0x94, 0xce, 0x17, 0x7a, 0x94, 0xed, 0x1c, 0xba, + 0xf9, 0x24, 0x5f, 0xc2, 0xf7, 0xa6, 0x3f, 0x05, 0x71, 0xe0, 0x81, 0xd5, 0x34, 0x9d, 0x43, 0x57, + 0x6e, 0x12, 0x1d, 0x9c, 0x6b, 0x41, 0xaf, 0xc3, 0x7c, 0xcf, 0x23, 0x3d, 0xd3, 0x23, 0x46, 0xdb, + 0xed, 0xf6, 0x3a, 0xc4, 0x27, 0x56, 0x5e, 0x2b, 0x29, 0xcb, 0x1a, 0xd6, 0x65, 0x43, 0x2d, 0x90, + 0xa3, 0x57, 0x20, 0x47, 0x7d, 0xd3, 0xa7, 0x86, 0xed, 0x50, 0xe2, 0xb1, 0x9e, 0x29, 0xde, 0x33, + 0xcb, 0xa5, 0x4d, 0x29, 0x44, 0xaf, 0x82, 0xce, 0x15, 0x41, 0x8d, 0x5e, 0xff, 0xa0, 0x63, 0xd3, + 0x63, 0x62, 0xe5, 0x81, 0x77, 0x9c, 0x13, 0xf2, 0x9d, 0x40, 0x8c, 0x4e, 0x47, 0x2c, 0xaf, 0xcd, + 0xd4, 0x61, 0x1e, 0x91, 0x7c, 0xba, 0xa4, 0x2c, 0xcf, 0x56, 0x37, 0x9e, 0x0f, 0x8a, 0xf5, 0xe9, + 0xcd, 0x86, 0x74, 0x57, 0x7c, 0x8f, 0x90, 0x88, 0x15, 0xd6, 0x24, 0x5e, 0xd4, 0x8e, 0x02, 0xd9, + 0x18, 0x7b, 0x64, 0xbe, 0x00, 0x7b, 0xec, 0x40, 0xd2, 0x27, 0x8e, 0xe9, 0xf8, 0x34, 0x9f, 0xe5, + 0x87, 0xf5, 0xe6, 0xf4, 0x87, 0xb5, 0xc7, 0x07, 0x06, 0x56, 0x28, 0x61, 0x0a, 0xff, 0xae, 0xc0, + 0xfc, 0x39, 0x67, 0x42, 0x9b, 0x10, 0x0b, 0x43, 0xd8, 0xfb, 0x67, 0x83, 0x62, 0xec, 0x0a, 0xe1, + 0x6b, 0xcc, 0xb1, 0x62, 0xb6, 0x85, 0x7e, 0x0c, 0x29, 0x76, 0xbc, 0x8e, 0xcf, 0x02, 0x63, 0x8c, + 0xa3, 0xd6, 0xce, 0x06, 0x45, 0x6d, 0x87, 0x0b, 0xaf, 0x8f, 0xad, 0x09, 0xd4, 0xa6, 0x85, 0x8a, + 0x90, 0xf6, 0x5d, 0x83, 0x7c, 0x62, 0x53, 0xdf, 0x76, 0x8e, 0x78, 0xc8, 0xd1, 0x30, 0xf8, 0x6e, + 0x43, 0x4a, 0x0a, 0x7f, 0x1a, 0x03, 0x74, 0xde, 0x5c, 0xd1, 0x3f, 0x28, 0x70, 0x3b, 0x08, 0x2f, + 0xae, 0x67, 0x1f, 0xd9, 0x8e, 0xd9, 0x19, 0x89, 0x33, 0x0a, 0x57, 0xf3, 0xc3, 0x2f, 0xe2, 0x13, + 0x32, 0xf6, 0x6c, 0x4b, 0xf8, 0xf1, 0x18, 0x74, 0x9b, 0xb1, 0xb6, 0x88, 0x41, 0xe7, 0xba, 0x3c, + 0xc0, 0xf9, 0xfe, 0x0b, 0x06, 0x17, 0xee, 0xc1, 0x4b, 0x13, 0x81, 0xaf, 0xc2, 0xde, 0x85, 0x9f, + 0x2a, 0x70, 0xeb, 0x05, 0x9c, 0x1a, 0xc5, 0xc9, 0x0a, 0x9c, 0x0f, 0xa3, 0x38, 0xe9, 0xbb, 0xdf, + 0xfd, 0x02, 0xbc, 0x1d, 0x5d, 0xc4, 0xb7, 0x21, 0x21, 0x8c, 0x14, 0xdd, 0x0c, 0xed, 0x4f, 0xad, + 0x26, 0x84, 0xfd, 0x71, 0x43, 0x42, 0xa0, 0x72, 0xa6, 0x8a, 0xf1, 0x5c, 0x81, 0xff, 0x6e, 0xa9, + 0x9a, 0xa2, 0xc7, 0xca, 0x6f, 0xc2, 0x9c, 0x9c, 0x2a, 0x88, 0x3f, 0xe8, 0x25, 0x80, 0x63, 0xfb, + 0xe8, 0xd8, 0x78, 0x62, 0xfa, 0xc4, 0xe3, 0x60, 0x19, 0x9c, 0x62, 0x92, 0x8f, 0x98, 0xa0, 0xfc, + 0xbb, 0x1a, 0x64, 0x9b, 0xdd, 0x9e, 0xeb, 0xf9, 0x41, 0x74, 0xba, 0x0f, 0x09, 0xc1, 0x1a, 0xf2, + 0xd4, 0x2b, 0x13, 0xf6, 0x35, 0x32, 0x52, 0xd0, 0xb3, 0x74, 0x2d, 0x89, 0x11, 0x46, 0x8f, 0xd8, + 0x85, 0xd1, 0xe3, 0x7d, 0x48, 0x88, 0xdc, 0x93, 0xdb, 0x6a, 0xfa, 0x6e, 0xf1, 0x02, 0x3e, 0x68, + 0x6e, 0x33, 0x46, 0x58, 0xe3, 0xdd, 0x02, 0x70, 0x31, 0x08, 0x7d, 0x03, 0x34, 0x4a, 0x7d, 0x83, + 0xda, 0x3f, 0x11, 0xc1, 0x27, 0x5e, 0x4d, 0x9f, 0x0d, 0x8a, 0xc9, 0xdd, 0xdd, 0xbd, 0x5d, 0xfb, + 0x27, 0x04, 0x27, 0x29, 0xf5, 0xd9, 0x0f, 0x54, 0x00, 0xed, 0x89, 0xd9, 0xe9, 0xf0, 0x20, 0x35, + 0xcb, 0xf3, 0xc6, 0xf0, 0x7b, 0xd4, 0x2b, 0x13, 0xff, 0x47, 0x5e, 0x29, 0x03, 0x4d, 0xcf, 0xf4, + 0x8f, 0x79, 0x72, 0x93, 0xc2, 0x20, 0x44, 0x3b, 0xa6, 0x7f, 0x8c, 0xf2, 0x90, 0xa4, 0x26, 0xe3, + 0x7c, 0x9a, 0xd7, 0x4a, 0xf1, 0xe5, 0x0c, 0x0e, 0x3e, 0xd1, 0x12, 0xf0, 0x88, 0x25, 0x3e, 0x39, + 0xf9, 0xc7, 0x71, 0x44, 0xc2, 0x15, 0x70, 0x62, 0xf7, 0x8c, 0xc3, 0x13, 0x2a, 0x18, 0x5f, 0x2a, + 0xe0, 0xc4, 0xee, 0xad, 0xdd, 0xa3, 0x38, 0xc9, 0x1a, 0xd7, 0x4e, 0x28, 0x4b, 0x34, 0x6d, 0xe7, + 0x88, 0x50, 0xdf, 0xb0, 0x6c, 0x8f, 0xb4, 0xfd, 0xce, 0x29, 0xa7, 0x7c, 0x0d, 0xe7, 0x84, 0xb8, + 0x2e, 0xa5, 0x2c, 0x94, 0x8c, 0x87, 0x27, 0x4e, 0xd5, 0x1a, 0x9e, 0x1b, 0x8b, 0x4e, 0x17, 0x46, + 0x9d, 0xec, 0xc5, 0x51, 0xe7, 0x92, 0x74, 0xef, 0xe6, 0xff, 0x47, 0xba, 0xf7, 0x69, 0x0c, 0x66, + 0xb9, 0xc1, 0xa2, 0xf7, 0x40, 0x65, 0xe1, 0x4a, 0x96, 0x07, 0xd3, 0xe6, 0x1e, 0x7c, 0x0c, 0x73, + 0x45, 0xc7, 0xec, 0x92, 0x3c, 0xe2, 0x87, 0xca, 0x7f, 0xa3, 0x5b, 0x90, 0xa4, 0xe4, 0x91, 0xf1, + 0xd8, 0xec, 0xe4, 0x17, 0xf8, 0x89, 0x25, 0x28, 0x79, 0xf4, 0xc0, 0xec, 0xa0, 0x1b, 0x90, 0xb0, + 0xa9, 0xe1, 0x90, 0x27, 0xf9, 0x45, 0xae, 0xa7, 0x59, 0x9b, 0x6e, 0x91, 0x27, 0x9c, 0xb5, 0x4d, + 0xef, 0x88, 0xf8, 0x46, 0xdb, 0xed, 0xd0, 0xfc, 0x0d, 0xe6, 0x29, 0x2c, 0xb5, 0x61, 0xa2, 0x9a, + 0xdb, 0xa1, 0x2d, 0x55, 0x8b, 0xe9, 0xf1, 0x96, 0xaa, 0xc5, 0x75, 0xb5, 0xa5, 0x6a, 0xaa, 0x3e, + 0xdb, 0x52, 0xb5, 0x59, 0x3d, 0xd1, 0x52, 0xb5, 0x84, 0x9e, 0x6c, 0xa9, 0x5a, 0x52, 0xd7, 0x5a, + 0xaa, 0xa6, 0xe9, 0xa9, 0x96, 0xaa, 0xa5, 0x74, 0x68, 0xa9, 0x1a, 0xe8, 0xe9, 0x96, 0xaa, 0xa5, + 0xf5, 0x4c, 0x4b, 0xd5, 0x32, 0x7a, 0xb6, 0xa5, 0x6a, 0x59, 0x3d, 0xd7, 0x52, 0xb5, 0x9c, 0x3e, + 0xd7, 0x52, 0xb5, 0x39, 0x5d, 0x6f, 0xa9, 0x9a, 0xae, 0xcf, 0xb7, 0x54, 0x6d, 0x5e, 0x47, 0xe5, + 0xff, 0x52, 0x20, 0x27, 0x3c, 0x39, 0x64, 0x8d, 0xd7, 0x61, 0x9e, 0x9b, 0x98, 0xed, 0x1c, 0x19, + 0x3d, 0x29, 0xe4, 0x7c, 0x10, 0xc3, 0x7a, 0xd0, 0x10, 0x76, 0xfe, 0x3a, 0x64, 0x3d, 0x62, 0x5a, + 0xc3, 0x8e, 0x31, 0xde, 0x31, 0xc3, 0x84, 0x61, 0xa7, 0x57, 0x20, 0xc7, 0xa9, 0x6e, 0xd8, 0x2b, + 0xce, 0x7b, 0x65, 0xb9, 0x34, 0xec, 0x56, 0x85, 0x2c, 0xed, 0x99, 0xce, 0xb0, 0x97, 0xca, 0x49, + 0xe8, 0xd6, 0x05, 0xc4, 0xb0, 0xdb, 0x33, 0x1d, 0x49, 0x08, 0x19, 0x36, 0x26, 0x4a, 0x79, 0x1e, + 0xa1, 0xfd, 0x2e, 0x31, 0x7a, 0xae, 0x48, 0x29, 0xe3, 0x38, 0x25, 0x24, 0x3b, 0x2e, 0x2d, 0xf7, + 0xe1, 0xd6, 0xde, 0x69, 0x8f, 0xec, 0xb6, 0x8f, 0x49, 0xd7, 0xac, 0x1d, 0x9b, 0xce, 0x51, 0x98, + 0x99, 0x3f, 0x84, 0xa4, 0x7f, 0xda, 0x1b, 0xaf, 0x5c, 0x59, 0xef, 0xeb, 0x13, 0x41, 0x82, 0x21, + 0x36, 0xad, 0x72, 0x01, 0xf2, 0xe3, 0xd3, 0x86, 0x45, 0x02, 0xe6, 0x35, 0x42, 0xbf, 0x4b, 0xd8, + 0x9e, 0xee, 0xdb, 0xd4, 0x47, 0xbf, 0x0e, 0x19, 0xb9, 0x07, 0xb6, 0xb5, 0x80, 0x8b, 0x2f, 0x51, + 0x43, 0xda, 0x0b, 0x41, 0x68, 0xf9, 0x6f, 0x14, 0x58, 0xa8, 0x7b, 0x6e, 0xaf, 0x47, 0x2c, 0x69, + 0xbb, 0x62, 0x8f, 0x81, 0xc9, 0x2a, 0x11, 0x93, 0x5d, 0x87, 0x58, 0xb3, 0x2e, 0x73, 0x92, 0xb7, + 0xaf, 0x9d, 0xe3, 0x34, 0xeb, 0xe8, 0x5d, 0x48, 0xb0, 0xdc, 0xb4, 0x4f, 0x39, 0xa1, 0xe7, 0xee, + 0xfe, 0xea, 0x84, 0xe0, 0xb1, 0xcb, 0x3b, 0x62, 0x39, 0xa0, 0xfc, 0x8f, 0x2a, 0xdc, 0x88, 0x2a, + 0x67, 0xbd, 0x16, 0xac, 0xf8, 0x63, 0x48, 0xda, 0x8e, 0x45, 0x3e, 0x09, 0x43, 0xd2, 0xfb, 0x93, + 0x50, 0x2f, 0x82, 0xa8, 0x48, 0x45, 0x34, 0x19, 0x4c, 0x90, 0xfc, 0x49, 0x4c, 0xf4, 0x83, 0x30, + 0xe0, 0x89, 0x02, 0xec, 0xbd, 0x6b, 0xa3, 0xd7, 0xc7, 0x82, 0xdf, 0x48, 0x6c, 0x89, 0xf3, 0x00, + 0xf5, 0xe5, 0xc6, 0x96, 0xc2, 0x1f, 0x28, 0x90, 0x89, 0xee, 0x0d, 0x1d, 0x80, 0xc6, 0xf7, 0x15, + 0x98, 0x70, 0xbc, 0xba, 0xce, 0x22, 0x02, 0x6f, 0xe4, 0x13, 0xbe, 0x73, 0xf5, 0x09, 0xc5, 0x58, + 0xa9, 0xb0, 0xa6, 0x85, 0x7e, 0x05, 0x52, 0x96, 0xe7, 0xf6, 0x86, 0x57, 0x22, 0x71, 0xac, 0x31, + 0x01, 0xa3, 0xd8, 0xc2, 0x13, 0x48, 0x85, 0xea, 0x88, 0x64, 0xd0, 0xf1, 0x2f, 0x23, 0x83, 0x9e, + 0x34, 0x71, 0xf9, 0xbf, 0x55, 0x58, 0xb8, 0xc8, 0xa7, 0x7f, 0x08, 0x7a, 0xc4, 0x93, 0x8c, 0x8e, + 0x4d, 0x7d, 0x79, 0xd0, 0xaf, 0x4e, 0xce, 0xd8, 0x22, 0xee, 0x28, 0xcf, 0x35, 0xe7, 0x8d, 0x3a, + 0xe9, 0x8f, 0x20, 0x67, 0x89, 0xbd, 0x1a, 0xd2, 0x82, 0xe2, 0x97, 0xa6, 0x4c, 0x17, 0xb8, 0xa4, + 0x44, 0xcf, 0x5a, 0x91, 0x26, 0x8a, 0x7e, 0x0b, 0x16, 0x02, 0x70, 0xcb, 0xf4, 0x4d, 0xa6, 0x07, + 0x76, 0xa8, 0x2a, 0x77, 0xd2, 0xfb, 0x67, 0x83, 0xe2, 0xbc, 0x84, 0xaa, 0xcb, 0xd6, 0xeb, 0xeb, + 0x76, 0xde, 0x1a, 0x43, 0xb2, 0xd0, 0xc7, 0xa0, 0x89, 0xba, 0xdc, 0xb6, 0x78, 0xca, 0x94, 0xad, + 0x56, 0x99, 0x1d, 0xf1, 0xb5, 0x5d, 0x7f, 0xa2, 0x24, 0xc7, 0x6c, 0x5a, 0xc8, 0x81, 0x74, 0xb7, + 0xef, 0x9b, 0xac, 0x9c, 0x1b, 0xe6, 0x5d, 0x9b, 0xac, 0x5a, 0xdf, 0x94, 0x62, 0x3e, 0xc9, 0x77, + 0xaf, 0x3c, 0xc9, 0x70, 0x38, 0x86, 0x60, 0x86, 0xa6, 0x85, 0xee, 0x41, 0x4e, 0xe4, 0x8c, 0x06, + 0x4b, 0x9e, 0x58, 0x01, 0x9a, 0xe4, 0x53, 0xbe, 0xfc, 0x7c, 0x50, 0x2c, 0x5d, 0x60, 0x35, 0x22, + 0xdd, 0x7c, 0x20, 0xfa, 0xe2, 0xec, 0x61, 0xf4, 0x53, 0xe6, 0xda, 0x37, 0x61, 0xf1, 0x42, 0x2e, + 0xff, 0xfd, 0x59, 0xb8, 0x39, 0x4a, 0x13, 0x61, 0x60, 0x32, 0xc6, 0x89, 0xec, 0xfb, 0x53, 0x53, + 0x4d, 0x80, 0x21, 0xbc, 0x31, 0xf8, 0x1a, 0xa7, 0xb2, 0x8f, 0xc7, 0xa8, 0xec, 0x1a, 0xf8, 0xfc, + 0x84, 0xc7, 0xf0, 0x25, 0x68, 0xe1, 0x9f, 0x14, 0xc8, 0x8e, 0xcc, 0xff, 0x95, 0xd0, 0xcd, 0x4e, + 0x18, 0x53, 0x62, 0x3c, 0xa6, 0xbc, 0x73, 0xf5, 0x4d, 0x8d, 0x86, 0x9a, 0xc2, 0xdf, 0x2a, 0x90, + 0x1d, 0xd9, 0xe7, 0x97, 0x4d, 0x54, 0x5f, 0xfa, 0x92, 0xcb, 0x6f, 0x43, 0x42, 0x48, 0x10, 0x82, + 0xdc, 0x47, 0xab, 0xcd, 0xbd, 0xe6, 0xd6, 0xba, 0xb1, 0xb6, 0x8d, 0x8d, 0xf5, 0x9a, 0x3e, 0x83, + 0x32, 0xa0, 0xd5, 0x1b, 0xf7, 0x1b, 0x4c, 0xa8, 0x2b, 0x28, 0x0d, 0x49, 0xfe, 0xd5, 0xa8, 0xeb, + 0xb1, 0x72, 0x15, 0x74, 0x81, 0x7d, 0x48, 0x18, 0xb5, 0xb0, 0xa4, 0x12, 0x55, 0x60, 0x81, 0xc1, + 0x92, 0x2e, 0x0b, 0x4d, 0x8c, 0x4c, 0x8d, 0x48, 0x46, 0x30, 0x1f, 0x36, 0x31, 0x5a, 0xdd, 0x32, + 0xbb, 0xa4, 0xfc, 0x73, 0x15, 0xe6, 0x87, 0x20, 0x01, 0xb1, 0xb2, 0xe2, 0xc3, 0x76, 0x4e, 0x8c, + 0xe1, 0xed, 0xb6, 0x28, 0x3e, 0x6c, 0xe7, 0x64, 0x1f, 0x37, 0x71, 0x92, 0x35, 0xee, 0x7b, 0x36, + 0x6a, 0x81, 0xea, 0xf6, 0xfc, 0x20, 0x93, 0xfb, 0xce, 0x04, 0x55, 0x9c, 0x9b, 0xa3, 0xb2, 0xdd, + 0xf3, 0x45, 0xfd, 0x8d, 0x39, 0x06, 0xfa, 0x4b, 0x05, 0x92, 0x22, 0x33, 0xa6, 0xf9, 0x04, 0xc7, + 0x7b, 0xf7, 0x4a, 0x78, 0x42, 0x01, 0xf2, 0x9a, 0x74, 0x87, 0x19, 0xf7, 0xf3, 0x41, 0x71, 0x7e, + 0x5c, 0x41, 0xf4, 0xba, 0xf7, 0xa7, 0xc1, 0xda, 0x50, 0x4b, 0xdc, 0xdc, 0x0d, 0x35, 0xcc, 0xf9, + 0x66, 0xca, 0xcb, 0xd1, 0xec, 0xc8, 0x09, 0x14, 0x8e, 0x20, 0x13, 0x5d, 0xf6, 0x05, 0x37, 0x11, + 0xab, 0xa3, 0x37, 0x11, 0xaf, 0x4f, 0xa5, 0x12, 0x81, 0x19, 0xbd, 0x79, 0x78, 0x1b, 0x52, 0xa1, + 0xbe, 0xaf, 0x72, 0x6f, 0x22, 0x08, 0x31, 0x2c, 0x53, 0x66, 0xf5, 0x44, 0xf9, 0xe7, 0x0a, 0x64, + 0x30, 0xa1, 0x6e, 0xe7, 0x31, 0xb1, 0x58, 0xb8, 0x44, 0xdf, 0x02, 0x95, 0x85, 0x5f, 0x59, 0x64, + 0x5d, 0x92, 0xc7, 0xf2, 0xae, 0x68, 0x15, 0x52, 0x61, 0xa9, 0x78, 0x95, 0x97, 0x97, 0xe1, 0x28, + 0x56, 0xa3, 0x1e, 0xb8, 0x7d, 0xc7, 0x32, 0xbd, 0x53, 0xc3, 0x23, 0x66, 0x9b, 0xd5, 0xa8, 0xe2, + 0x56, 0x6c, 0x2e, 0x90, 0x63, 0x21, 0x2e, 0x7f, 0x1a, 0x03, 0x34, 0x54, 0x4e, 0x48, 0x0c, 0x7b, + 0xc0, 0x82, 0x3e, 0xdf, 0x87, 0xcc, 0xc4, 0x05, 0xb3, 0xde, 0x99, 0x9c, 0x3b, 0x84, 0x1b, 0x0f, + 0x8e, 0xd4, 0x8b, 0xc8, 0x28, 0xfa, 0xe3, 0xc9, 0x05, 0x71, 0x9c, 0x17, 0xc4, 0x1f, 0xb1, 0x91, + 0x5f, 0x69, 0x51, 0x2c, 0x23, 0xdb, 0xdf, 0xab, 0x80, 0x6a, 0x1e, 0x31, 0x7d, 0xc2, 0x28, 0x87, + 0x4e, 0x2a, 0x1c, 0xaa, 0x30, 0xcb, 0x63, 0x83, 0x3c, 0x9f, 0x29, 0x8b, 0x67, 0xa9, 0x14, 0x31, + 0x14, 0xfd, 0x06, 0x64, 0xda, 0x6e, 0xa7, 0xdf, 0x75, 0x0c, 0x7e, 0xad, 0x2d, 0x73, 0xa8, 0x5f, + 0x9b, 0x64, 0xc4, 0xe7, 0x16, 0x57, 0xa9, 0xb9, 0x1d, 0xf6, 0x1d, 0x14, 0x42, 0x02, 0x90, 0xf7, + 0x40, 0xb7, 0x21, 0x15, 0x3a, 0x14, 0x4f, 0x9f, 0x52, 0x78, 0x28, 0x40, 0x77, 0x61, 0xd6, 0xa4, + 0x86, 0x7b, 0xc8, 0xb3, 0x9c, 0xcb, 0x2c, 0x0c, 0xab, 0x26, 0xdd, 0x3e, 0x44, 0x6f, 0x41, 0xf6, + 0xf0, 0x91, 0x48, 0xf9, 0x04, 0x73, 0x8a, 0xd7, 0x86, 0xb9, 0xb3, 0x41, 0x31, 0xbd, 0xf6, 0x21, + 0xdf, 0x2c, 0xe3, 0x4d, 0x9c, 0x3e, 0x7c, 0x14, 0x7e, 0xa0, 0xd7, 0x60, 0xbe, 0x6b, 0x7e, 0x62, + 0x1c, 0x7a, 0x66, 0x5b, 0xa6, 0x3d, 0x1d, 0xc1, 0x0a, 0x0a, 0x9e, 0xeb, 0x9a, 0x9f, 0xac, 0x49, + 0x79, 0xd3, 0xea, 0x90, 0xc2, 0xdf, 0x29, 0x90, 0x94, 0x3b, 0x42, 0x36, 0x80, 0x54, 0x8f, 0x6d, + 0x89, 0xbc, 0x21, 0x5b, 0x6d, 0x9d, 0x0d, 0x8a, 0xa9, 0x1a, 0x97, 0x36, 0xeb, 0xf4, 0xf9, 0xa0, + 0xf8, 0xee, 0x95, 0xd9, 0x2a, 0x18, 0x8d, 0x53, 0x02, 0xbd, 0x69, 0xf1, 0x42, 0xfe, 0xd8, 0xa4, + 0xc6, 0xb1, 0x4d, 0x7d, 0xf7, 0xc8, 0x33, 0xbb, 0xfc, 0x54, 0x35, 0x9c, 0x39, 0x36, 0xe9, 0x46, + 0x20, 0x43, 0x05, 0x16, 0xf2, 0x1f, 0x8b, 0xe7, 0x08, 0xe1, 0x4b, 0xe1, 0x77, 0xf9, 0x06, 0x2c, + 0x44, 0xce, 0x26, 0x4c, 0x89, 0xfe, 0x04, 0x20, 0xb9, 0x63, 0x9e, 0x76, 0x5c, 0xd3, 0x42, 0x25, + 0x48, 0x07, 0x8f, 0x03, 0x2c, 0x0d, 0x13, 0xc6, 0x14, 0x15, 0xb1, 0x09, 0xfa, 0x94, 0x78, 0x5c, + 0xb1, 0x82, 0x6a, 0xc2, 0x6f, 0xf9, 0x22, 0xc2, 0xe6, 0x32, 0xba, 0x76, 0xdb, 0x73, 0x45, 0x9d, + 0x19, 0xe7, 0x94, 0xc9, 0xa4, 0x9b, 0x5c, 0x88, 0xee, 0xc0, 0xdc, 0xa1, 0xed, 0xf0, 0xcb, 0xa7, + 0xa0, 0x1f, 0xbf, 0x1f, 0xc4, 0xb9, 0x40, 0x2c, 0x3b, 0xba, 0x90, 0x8b, 0xbc, 0x87, 0x30, 0x05, + 0x27, 0xb8, 0x82, 0x37, 0xce, 0x06, 0xc5, 0xec, 0xd0, 0x60, 0x85, 0x92, 0xaf, 0x15, 0x12, 0xb2, + 0x43, 0x7c, 0xa6, 0xe2, 0x45, 0x98, 0xe5, 0x6f, 0xf8, 0xfc, 0xcd, 0x27, 0x85, 0xc5, 0x07, 0xfa, + 0x0e, 0xcc, 0x76, 0x88, 0x49, 0xc5, 0x15, 0x5f, 0xfa, 0x6e, 0x69, 0x82, 0xed, 0xf3, 0x27, 0x76, + 0x2c, 0xba, 0xa3, 0x2a, 0x24, 0xc4, 0x3d, 0x22, 0xbf, 0xfd, 0x1b, 0x7d, 0x4f, 0x99, 0xf8, 0x12, + 0xbc, 0x31, 0x83, 0xe5, 0x48, 0xd4, 0x80, 0xa4, 0x27, 0xee, 0x8c, 0xf9, 0x9d, 0xe0, 0xa5, 0x65, + 0x51, 0xe4, 0x22, 0x7b, 0x63, 0x06, 0x07, 0x63, 0xd1, 0x1e, 0x64, 0x68, 0x24, 0x93, 0x91, 0x0f, + 0x3c, 0x95, 0x29, 0x13, 0x9f, 0x21, 0xe0, 0x08, 0x0a, 0xdb, 0xa0, 0xcd, 0x6f, 0xa6, 0xf8, 0xd5, + 0xe2, 0xe4, 0x0d, 0x8e, 0x5c, 0x46, 0xb3, 0x0d, 0x8a, 0x91, 0x68, 0x0b, 0xa0, 0x1d, 0x12, 0x7b, + 0x3e, 0xc7, 0x71, 0xbe, 0x79, 0x95, 0xac, 0x61, 0x63, 0x06, 0x47, 0x10, 0xd0, 0x87, 0x90, 0x6e, + 0x0f, 0x8d, 0x3c, 0x3f, 0xc7, 0x01, 0xdf, 0xb8, 0x12, 0x5d, 0x6d, 0x30, 0x8a, 0x1a, 0x4a, 0x47, + 0x29, 0x4a, 0x1f, 0xa7, 0xa8, 0x06, 0x64, 0x65, 0x05, 0x2b, 0xfe, 0xfc, 0x23, 0x3f, 0xcf, 0x19, + 0x32, 0x6a, 0x25, 0xc1, 0x1f, 0x88, 0x54, 0x1a, 0x4e, 0xdb, 0xb5, 0x88, 0xd5, 0x60, 0xdf, 0x58, + 0x5e, 0x21, 0xf1, 0x0f, 0x8a, 0xd6, 0x21, 0xd7, 0xee, 0x10, 0xd3, 0xe9, 0xf7, 0x02, 0x1c, 0x34, + 0x25, 0x4e, 0x56, 0x8e, 0x93, 0x40, 0x5b, 0x80, 0x0e, 0xf9, 0x13, 0x51, 0x74, 0x55, 0xfc, 0xae, + 0x73, 0x1a, 0x30, 0x9d, 0x8f, 0xc5, 0xc3, 0x95, 0xa1, 0x97, 0x21, 0xeb, 0xb8, 0x4e, 0xdb, 0x74, + 0xda, 0xa4, 0xc3, 0x83, 0x89, 0xb8, 0x1e, 0x1d, 0x15, 0xa2, 0x87, 0x90, 0xa3, 0x23, 0xa9, 0x72, + 0xfe, 0x06, 0x9f, 0xf1, 0xcd, 0xab, 0x5e, 0xd7, 0x6c, 0xcc, 0xe0, 0x31, 0x24, 0xf4, 0x63, 0xd0, + 0xfd, 0xb1, 0xbb, 0x39, 0x7e, 0x2b, 0x9d, 0xbe, 0x7b, 0x77, 0x02, 0xfa, 0x0b, 0x6e, 0x11, 0x37, + 0x66, 0xf0, 0x39, 0xb4, 0x6a, 0x0a, 0x92, 0x96, 0x68, 0x0e, 0x2f, 0x6f, 0x93, 0xba, 0x56, 0xfe, + 0x9f, 0x04, 0x68, 0x61, 0xae, 0xb1, 0x02, 0x28, 0x8c, 0x0e, 0xc3, 0xc7, 0x61, 0xc6, 0x90, 0xb1, + 0x8d, 0x19, 0x3c, 0x1f, 0xb4, 0x0d, 0xdf, 0x87, 0xef, 0xc0, 0x5c, 0xd7, 0xb5, 0xec, 0x43, 0x7b, + 0x48, 0x73, 0xe2, 0x56, 0x24, 0x17, 0x88, 0x25, 0xcd, 0x7d, 0x30, 0xf2, 0x08, 0x14, 0x9f, 0x22, + 0xd2, 0x6d, 0xcc, 0x44, 0x5e, 0x89, 0x18, 0xed, 0x7a, 0x7d, 0xc7, 0xb1, 0x9d, 0x23, 0x43, 0xd6, + 0x35, 0x22, 0x8e, 0x66, 0xa5, 0x54, 0x96, 0x26, 0xb5, 0x31, 0x3a, 0x7a, 0xf5, 0x52, 0x3a, 0x0a, + 0xf6, 0xbe, 0xa1, 0x84, 0x7c, 0xb4, 0x36, 0xce, 0x47, 0xaf, 0x5d, 0xce, 0x47, 0x11, 0x98, 0x90, + 0x90, 0xf6, 0x2f, 0x24, 0xa4, 0x95, 0x29, 0xad, 0x25, 0x82, 0x38, 0xca, 0x48, 0xb5, 0x31, 0x46, + 0x7a, 0xf5, 0x52, 0x46, 0x8a, 0xee, 0x51, 0x52, 0xd2, 0xf6, 0x05, 0x94, 0xf4, 0xc6, 0x54, 0x94, + 0x14, 0x01, 0x8b, 0x72, 0x12, 0xbe, 0x88, 0x93, 0x2a, 0xd3, 0x71, 0x52, 0x04, 0x72, 0x84, 0x94, + 0x7e, 0x74, 0xce, 0xe1, 0x74, 0x0e, 0xfb, 0xad, 0x2b, 0x17, 0xb3, 0x1b, 0xca, 0x39, 0x8f, 0x33, + 0x2f, 0xf0, 0xb8, 0x79, 0x0e, 0xff, 0xd6, 0x15, 0x3c, 0x2e, 0x32, 0xc1, 0x79, 0x97, 0x03, 0xd0, + 0x82, 0x57, 0x84, 0x88, 0xfb, 0x95, 0x7f, 0xa6, 0x40, 0xbc, 0xe5, 0x1e, 0xa0, 0xdc, 0xb0, 0xe4, + 0xe7, 0x35, 0xfb, 0xf7, 0x87, 0xdd, 0x65, 0x36, 0xfb, 0xf5, 0x09, 0x2b, 0x09, 0x66, 0xc6, 0xe1, + 0x20, 0xf4, 0x3d, 0x48, 0xf6, 0x44, 0x92, 0x23, 0x3d, 0xac, 0x3c, 0x69, 0xbc, 0xe8, 0x89, 0x83, + 0x21, 0xaf, 0xfd, 0x20, 0x5a, 0xe0, 0xd7, 0xf1, 0x6a, 0x73, 0x8b, 0x55, 0xf8, 0x5b, 0xab, 0x9b, + 0x8d, 0x5d, 0x7d, 0x06, 0xe5, 0x61, 0x91, 0x15, 0xfd, 0xb2, 0xe2, 0x37, 0x9a, 0x5b, 0x7b, 0x0d, + 0xfc, 0x60, 0xf5, 0xbe, 0xae, 0xa0, 0x9b, 0x80, 0xf0, 0x76, 0xed, 0xde, 0x6e, 0xbd, 0x6a, 0xd4, + 0xb6, 0x37, 0x77, 0x56, 0x6b, 0x7b, 0xcd, 0xed, 0x2d, 0x3d, 0x86, 0x34, 0x50, 0xeb, 0xdb, 0x5b, + 0x0d, 0x1d, 0x5e, 0xfb, 0x59, 0x1c, 0x54, 0xa6, 0x38, 0xf4, 0x32, 0xa4, 0xf7, 0xb7, 0x76, 0x77, + 0x1a, 0xb5, 0xe6, 0x5a, 0xb3, 0x51, 0xd7, 0x67, 0x0a, 0x0b, 0x4f, 0x9f, 0x95, 0xe6, 0x58, 0xd3, + 0xbe, 0x43, 0x7b, 0xa4, 0xcd, 0x19, 0x03, 0x15, 0x20, 0x51, 0x5d, 0xad, 0xdd, 0xdb, 0xdf, 0xd1, + 0x95, 0x42, 0xee, 0xe9, 0xb3, 0x12, 0xb0, 0x0e, 0xc2, 0x5b, 0xd1, 0x6d, 0x48, 0xe2, 0xc6, 0xee, + 0xde, 0x36, 0x6e, 0xe8, 0xb1, 0xc2, 0xdc, 0xd3, 0x67, 0xa5, 0x34, 0x6b, 0x94, 0x4e, 0x88, 0xee, + 0x40, 0x76, 0xb7, 0xb6, 0xd1, 0xd8, 0x5c, 0x35, 0x6a, 0x1b, 0xab, 0x5b, 0xeb, 0x0d, 0x3d, 0x5e, + 0x58, 0x7c, 0xfa, 0xac, 0xa4, 0x8f, 0x9f, 0x1a, 0x9b, 0xa2, 0xb9, 0xb9, 0xb3, 0x8d, 0xf7, 0x74, + 0x75, 0x38, 0x85, 0x70, 0x16, 0x54, 0x06, 0x10, 0xa3, 0xd7, 0x1a, 0x8d, 0xba, 0x3e, 0x5b, 0x40, + 0x4f, 0x9f, 0x95, 0x72, 0xac, 0x7d, 0xe8, 0x03, 0xe8, 0x15, 0xc8, 0xd4, 0x70, 0x63, 0x75, 0xaf, + 0x61, 0xec, 0xee, 0xad, 0xee, 0xed, 0xea, 0x89, 0xe1, 0x4e, 0x22, 0x76, 0x8d, 0x2a, 0x30, 0xbf, + 0xba, 0xbf, 0xb7, 0x6d, 0x8c, 0xf4, 0x4d, 0x16, 0x6e, 0x3d, 0x7d, 0x56, 0x5a, 0x60, 0x7d, 0x57, + 0xfb, 0xbe, 0x1b, 0xed, 0xff, 0x4d, 0xd0, 0x47, 0xd6, 0x6f, 0xac, 0xd7, 0x74, 0xad, 0x70, 0xf3, + 0xe9, 0xb3, 0x12, 0x1a, 0xdf, 0xc2, 0x7a, 0x0d, 0x7d, 0x1b, 0x6e, 0xee, 0xfd, 0x70, 0xa7, 0x51, + 0x6f, 0xec, 0xd6, 0x8c, 0xd1, 0x6d, 0xa7, 0x0a, 0xf9, 0xa7, 0xcf, 0x4a, 0x8b, 0x6c, 0xcc, 0xf8, + 0xb8, 0x82, 0xf6, 0xe9, 0x9f, 0x2f, 0xcd, 0xfc, 0xd5, 0x5f, 0x2c, 0xcd, 0x54, 0x97, 0x3f, 0xfb, + 0xb7, 0xa5, 0x99, 0xcf, 0xce, 0x96, 0x94, 0x5f, 0x9c, 0x2d, 0x29, 0xbf, 0x3c, 0x5b, 0x52, 0xfe, + 0xf5, 0x6c, 0x49, 0xf9, 0xc3, 0xcf, 0x97, 0x66, 0x7e, 0xf1, 0xf9, 0xd2, 0xcc, 0x2f, 0x3f, 0x5f, + 0x9a, 0x79, 0x98, 0x10, 0xb6, 0x72, 0x90, 0xe0, 0x7f, 0x5f, 0xf9, 0xd6, 0xff, 0x06, 0x00, 0x00, + 0xff, 0xff, 0xdd, 0x8f, 0x23, 0xf5, 0x3a, 0x2a, 0x00, 0x00, } diff --git a/pkg/jobs/jobspb/jobs.proto b/pkg/jobs/jobspb/jobs.proto index cb442308db2d..276f5527dd06 100644 --- a/pkg/jobs/jobspb/jobs.proto +++ b/pkg/jobs/jobspb/jobs.proto @@ -151,7 +151,7 @@ message ImportDetails { // corresponding to this job. While the job ought to clean up the record // when it enters a terminal state, there may be cases where it cannot or // does not run the code to do so. To deal with this there is a background - // reconcilliation loop to ensure that protected timestamps are cleaned up. + // reconciliation loop to ensure that protected timestamps are cleaned up. bytes protected_timestamp_record = 22 [ (gogoproto.customname) = "ProtectedTimestampRecord", (gogoproto.customtype) = "github.com/cockroachdb/cockroach/pkg/util/uuid.UUID" @@ -173,6 +173,16 @@ message ImportProgress { repeated int64 resume_pos = 5; // Only set by direct import. } +// TypeSchemaChangeDetails is the job detail information for a type schema change job. +message TypeSchemaChangeDetails { + uint32 type_id = 1 [(gogoproto.customname) = "TypeID", (gogoproto.casttype) = "github.com/cockroachdb/cockroach/pkg/sql/sqlbase.ID"]; +} + +// TypeSchemaChangeProgress is the persisted progress for a type schema change job. +message TypeSchemaChangeProgress { + +} + message ResumeSpanList { repeated roachpb.Span resume_spans = 1 [(gogoproto.nullable) = false]; } @@ -420,6 +430,7 @@ message Payload { ChangefeedDetails changefeed = 14; CreateStatsDetails createStats = 15; SchemaChangeGCDetails schemaChangeGC = 21; + TypeSchemaChangeDetails typeSchemaChange = 22; } } @@ -439,6 +450,7 @@ message Progress { ChangefeedProgress changefeed = 14; CreateStatsProgress createStats = 15; SchemaChangeGCProgress schemaChangeGC = 16; + TypeSchemaChangeProgress typeSchemaChange = 17; } } @@ -455,6 +467,9 @@ enum Type { CREATE_STATS = 6 [(gogoproto.enumvalue_customname) = "TypeCreateStats"]; AUTO_CREATE_STATS = 7 [(gogoproto.enumvalue_customname) = "TypeAutoCreateStats"]; SCHEMA_CHANGE_GC = 8 [(gogoproto.enumvalue_customname) = "TypeSchemaChangeGC"]; + // We can't name this TYPE_SCHEMA_CHANGE due to how proto generates actual + // names for this enum, which cause a conflict with the SCHEMA_CHANGE entry. + TYPEDESC_SCHEMA_CHANGE = 9 [(gogoproto.enumvalue_customname) = "TypeTypeSchemaChange"]; } message Job { diff --git a/pkg/jobs/jobspb/wrap.go b/pkg/jobs/jobspb/wrap.go index 4703b4e58fa2..6b3e7fd98598 100644 --- a/pkg/jobs/jobspb/wrap.go +++ b/pkg/jobs/jobspb/wrap.go @@ -64,6 +64,8 @@ func DetailsType(d isPayload_Details) Type { return TypeCreateStats case *Payload_SchemaChangeGC: return TypeSchemaChangeGC + case *Payload_TypeSchemaChange: + return TypeTypeSchemaChange default: panic(fmt.Sprintf("Payload.Type called on a payload with an unknown details type: %T", d)) } @@ -92,6 +94,8 @@ func WrapProgressDetails(details ProgressDetails) interface { return &Progress_CreateStats{CreateStats: &d} case SchemaChangeGCProgress: return &Progress_SchemaChangeGC{SchemaChangeGC: &d} + case TypeSchemaChangeProgress: + return &Progress_TypeSchemaChange{TypeSchemaChange: &d} default: panic(fmt.Sprintf("WrapProgressDetails: unknown details type %T", d)) } @@ -115,6 +119,8 @@ func (p *Payload) UnwrapDetails() Details { return *d.CreateStats case *Payload_SchemaChangeGC: return *d.SchemaChangeGC + case *Payload_TypeSchemaChange: + return *d.TypeSchemaChange default: return nil } @@ -138,6 +144,8 @@ func (p *Progress) UnwrapDetails() ProgressDetails { return *d.CreateStats case *Progress_SchemaChangeGC: return *d.SchemaChangeGC + case *Progress_TypeSchemaChange: + return *d.TypeSchemaChange default: return nil } @@ -174,6 +182,8 @@ func WrapPayloadDetails(details Details) interface { return &Payload_CreateStats{CreateStats: &d} case SchemaChangeGCDetails: return &Payload_SchemaChangeGC{SchemaChangeGC: &d} + case TypeSchemaChangeDetails: + return &Payload_TypeSchemaChange{TypeSchemaChange: &d} default: panic(fmt.Sprintf("jobs.WrapPayloadDetails: unknown details type %T", d)) } diff --git a/pkg/server/server_sql.go b/pkg/server/server_sql.go index 5c2c467cd820..901275dac972 100644 --- a/pkg/server/server_sql.go +++ b/pkg/server/server_sql.go @@ -474,6 +474,11 @@ func newSQLServer(ctx context.Context, cfg sqlServerArgs) (*sqlServer, error) { } else { execCfg.SchemaChangerTestingKnobs = new(sql.SchemaChangerTestingKnobs) } + if sqlTypeSchemaChangerTestingKnobs := cfg.TestingKnobs.SQLTypeSchemaChanger; sqlTypeSchemaChangerTestingKnobs != nil { + execCfg.TypeSchemaChangerTestingKnobs = sqlTypeSchemaChangerTestingKnobs.(*sql.TypeSchemaChangerTestingKnobs) + } else { + execCfg.TypeSchemaChangerTestingKnobs = new(sql.TypeSchemaChangerTestingKnobs) + } if gcJobTestingKnobs := cfg.TestingKnobs.GCJob; gcJobTestingKnobs != nil { execCfg.GCJobTestingKnobs = gcJobTestingKnobs.(*sql.GCJobTestingKnobs) } else { diff --git a/pkg/sql/alter_type.go b/pkg/sql/alter_type.go index 1469416102bd..3729fb2bede0 100644 --- a/pkg/sql/alter_type.go +++ b/pkg/sql/alter_type.go @@ -13,35 +13,148 @@ package sql import ( "context" + "github.com/cockroachdb/cockroach/pkg/sql/catalog/catalogkv" + "github.com/cockroachdb/cockroach/pkg/sql/pgwire/pgcode" + "github.com/cockroachdb/cockroach/pkg/sql/pgwire/pgerror" "github.com/cockroachdb/cockroach/pkg/sql/sem/tree" + "github.com/cockroachdb/cockroach/pkg/sql/sqlbase" "github.com/cockroachdb/cockroach/pkg/util/errorutil/unimplemented" "github.com/cockroachdb/errors" ) type alterTypeNode struct { - n *tree.AlterType + n *tree.AlterType + desc *sqlbase.MutableTypeDescriptor } // alterTypeNode implements planNode. We set n here to satisfy the linter. var _ planNode = &alterTypeNode{n: nil} func (p *planner) AlterType(ctx context.Context, n *tree.AlterType) (planNode, error) { - return &alterTypeNode{n: n}, nil + // Resolve the type. + desc, err := p.ResolveMutableTypeDescriptor(ctx, n.Type, true /* required */) + if err != nil { + return nil, err + } + // The implicit array types are not modifiable. + if desc.Kind == sqlbase.TypeDescriptor_ALIAS { + return nil, pgerror.Newf( + pgcode.WrongObjectType, + "%q is an implicit array type and cannot be modified", + tree.AsStringWithFQNames(n.Type, &p.semaCtx.Annotations), + ) + } + // TODO (rohany): Check permissions here once we track them. + return &alterTypeNode{ + n: n, + desc: desc, + }, nil } func (n *alterTypeNode) startExec(params runParams) error { + var err error switch t := n.n.Cmd.(type) { case *tree.AlterTypeAddValue: - return unimplemented.NewWithIssue(48670, "ALTER TYPE ADD VALUE unsupported") + err = unimplemented.NewWithIssue(48670, "ALTER TYPE ADD VALUE unsupported") case *tree.AlterTypeRenameValue: - return unimplemented.NewWithIssue(48697, "ALTER TYPE RENAME VALUE unsupported") + err = unimplemented.NewWithIssue(48697, "ALTER TYPE RENAME VALUE unsupported") case *tree.AlterTypeRename: - return unimplemented.NewWithIssue(48671, "ALTER TYPE RENAME unsupported") + err = params.p.renameType(params, n, t.NewName) case *tree.AlterTypeSetSchema: - return unimplemented.NewWithIssue(48672, "ALTER TYPE SET SCHEMA unsupported") + err = unimplemented.NewWithIssue(48672, "ALTER TYPE SET SCHEMA unsupported") default: - return errors.AssertionFailedf("unknown alter type cmd %s", t) + err = errors.AssertionFailedf("unknown alter type cmd %s", t) + } + if err != nil { + return err + } + return n.desc.Validate(params.ctx, params.p.txn, params.ExecCfg().Codec) +} + +func (p *planner) renameType(params runParams, n *alterTypeNode, newName string) error { + // See if there is a name collision with the new name. + exists, id, err := sqlbase.LookupObjectID( + params.ctx, + p.txn, + p.ExecCfg().Codec, + n.desc.ParentID, + n.desc.ParentSchemaID, + newName, + ) + if err == nil && exists { + // Try and see what kind of object we collided with. + desc, err := catalogkv.GetDescriptorByID(params.ctx, p.txn, p.ExecCfg().Codec, id) + if err != nil { + return sqlbase.WrapErrorWhileConstructingObjectAlreadyExistsErr(err) + } + return sqlbase.MakeObjectAlreadyExistsError(desc.DescriptorProto(), newName) + } else if err != nil { + return err + } + + // Rename the base descriptor. + if err := p.performRenameTypeDesc( + params.ctx, + n.desc, + newName, + tree.AsStringWithFQNames(n.n, params.Ann()), + ); err != nil { + return err + } + + // Now rename the array type. + newArrayName, err := findFreeArrayTypeName( + params.ctx, + p.txn, + p.ExecCfg().Codec, + n.desc.ParentID, + n.desc.ParentSchemaID, + newName, + ) + if err != nil { + return err + } + // TODO (rohany): This should use a method on the desc collection instead. + arrayDesc, err := sqlbase.GetTypeDescFromID(params.ctx, p.txn, p.ExecCfg().Codec, n.desc.ArrayTypeID) + if err != nil { + return err + } + if err := p.performRenameTypeDesc( + params.ctx, + sqlbase.NewMutableExistingTypeDescriptor(*arrayDesc.TypeDesc()), + newArrayName, + tree.AsStringWithFQNames(n.n, params.Ann()), + ); err != nil { + return err + } + return nil +} + +func (p *planner) performRenameTypeDesc( + ctx context.Context, desc *sqlbase.MutableTypeDescriptor, newName string, jobDesc string, +) error { + // Record the rename details in the descriptor for draining. + desc.DrainingNames = append(desc.DrainingNames, sqlbase.NameInfo{ + ParentID: desc.ParentID, + ParentSchemaID: desc.ParentSchemaID, + Name: desc.Name, + }) + // Set the descriptor up with the new name. + desc.Name = newName + if err := p.writeTypeChange(ctx, desc, jobDesc); err != nil { + return err } + // Construct the new namespace key. + b := p.txn.NewBatch() + key := sqlbase.MakeObjectNameKey( + ctx, + p.ExecCfg().Settings, + desc.ParentID, + desc.ParentSchemaID, + newName, + ).Key(p.ExecCfg().Codec) + b.CPut(key, desc.ID, nil /* expected */) + return p.txn.Run(ctx, b) } func (n *alterTypeNode) Next(params runParams) (bool, error) { return false, nil } diff --git a/pkg/sql/backfill.go b/pkg/sql/backfill.go index cbe8cd454cd6..b11827c4e548 100644 --- a/pkg/sql/backfill.go +++ b/pkg/sql/backfill.go @@ -383,11 +383,11 @@ func (sc *SchemaChanger) dropConstraints( if err != nil { return nil, err } - if err := sc.waitToUpdateLeases(ctx, sc.tableID); err != nil { + if err := waitToUpdateLeases(ctx, sc.leaseMgr, sc.tableID); err != nil { return nil, err } for id := range fksByBackrefTable { - if err := sc.waitToUpdateLeases(ctx, id); err != nil { + if err := waitToUpdateLeases(ctx, sc.leaseMgr, id); err != nil { return nil, err } } @@ -490,11 +490,11 @@ func (sc *SchemaChanger) addConstraints( if _, err := sc.leaseMgr.PublishMultiple(ctx, tableIDsToUpdate, update, nil); err != nil { return err } - if err := sc.waitToUpdateLeases(ctx, sc.tableID); err != nil { + if err := waitToUpdateLeases(ctx, sc.leaseMgr, sc.tableID); err != nil { return err } for id := range fksByBackrefTable { - if err := sc.waitToUpdateLeases(ctx, id); err != nil { + if err := waitToUpdateLeases(ctx, sc.leaseMgr, id); err != nil { return err } } diff --git a/pkg/sql/catalog/catalog.go b/pkg/sql/catalog/catalog.go index a45f626cb9f3..ba8d4774272b 100644 --- a/pkg/sql/catalog/catalog.go +++ b/pkg/sql/catalog/catalog.go @@ -29,6 +29,8 @@ type MutableDescriptor interface { // descriptor should increment the version on the mutable copy from the // outset. MaybeIncrementVersion() + // SetDrainingNames sets the draining names for the descriptor. + SetDrainingNames([]sqlbase.NameInfo) // Immutable returns an immutable copy of this descriptor. Immutable() Descriptor } diff --git a/pkg/sql/catalog/resolver/resolver.go b/pkg/sql/catalog/resolver/resolver.go index 60a8ef2ecc13..c9f39e6d6ab0 100644 --- a/pkg/sql/catalog/resolver/resolver.go +++ b/pkg/sql/catalog/resolver/resolver.go @@ -123,6 +123,25 @@ func ResolveMutableExistingTableObject( return desc.(*sqlbase.MutableTableDescriptor), nil } +// ResolveMutableType resolves a type descriptor for mutable access. It +// returns the resolved descriptor, as well as the fully qualified resolved +// object name. +func ResolveMutableType( + ctx context.Context, sc SchemaResolver, un *tree.UnresolvedObjectName, required bool, +) (*tree.TypeName, *sqlbase.MutableTypeDescriptor, error) { + lookupFlags := tree.ObjectLookupFlags{ + CommonLookupFlags: tree.CommonLookupFlags{Required: required}, + RequireMutable: true, + DesiredObjectKind: tree.TypeObject, + } + desc, prefix, err := ResolveExistingObject(ctx, sc, un, lookupFlags) + if err != nil || desc == nil { + return nil, nil, err + } + tn := tree.MakeTypeNameFromPrefix(prefix, tree.Name(un.Object())) + return &tn, desc.(*sqlbase.MutableTypeDescriptor), nil +} + // ResolveExistingObject resolves an object with the given flags. func ResolveExistingObject( ctx context.Context, diff --git a/pkg/sql/create_type.go b/pkg/sql/create_type.go index c582aa9cca65..a523572bad6c 100644 --- a/pkg/sql/create_type.go +++ b/pkg/sql/create_type.go @@ -16,6 +16,7 @@ import ( "github.com/cockroachdb/cockroach/pkg/clusterversion" "github.com/cockroachdb/cockroach/pkg/keys" + "github.com/cockroachdb/cockroach/pkg/kv" "github.com/cockroachdb/cockroach/pkg/sql/catalog/catalogkv" "github.com/cockroachdb/cockroach/pkg/sql/enum" "github.com/cockroachdb/cockroach/pkg/sql/pgwire/pgcode" @@ -101,6 +102,37 @@ func getCreateTypeParams( return typeKey, id, nil } +// Postgres starts off trying to create the type as _. It then +// continues adding "_" to the front of the name until it doesn't find +// a collision. findFreeArrayTypeName performs this logic to find a free name +// for the array type based off of a type with the input name. +func findFreeArrayTypeName( + ctx context.Context, txn *kv.Txn, codec keys.SQLCodec, parentID, schemaID sqlbase.ID, name string, +) (string, error) { + arrayName := "_" + name + for { + // See if there is a collision with the current name. + exists, _, err := sqlbase.LookupObjectID( + ctx, + txn, + codec, + parentID, + schemaID, + arrayName, + ) + if err != nil { + return "", err + } + // If we found an empty spot, then break out. + if !exists { + break + } + // Otherwise, append another "_" to the front of the name. + arrayName = "_" + arrayName + } + return arrayName, nil +} + // createArrayType performs the implicit array type creation logic of Postgres. // When a type is created in Postgres, Postgres will implicitly create an array // type of that user defined type. This array type tracks changes to the @@ -114,38 +146,19 @@ func (p *planner) createArrayType( typDesc *sqlbase.MutableTypeDescriptor, db *sqlbase.ImmutableDatabaseDescriptor, ) (sqlbase.ID, error) { - // Postgres starts off trying to create the type as _. It then - // continues adding "_" to the front of the name until it doesn't find - // a collision. schemaID := sqlbase.ID(keys.PublicSchemaID) - arrayTypeName := "_" + typ.Type() - var arrayTypeKey sqlbase.DescriptorKey - for { - // See if there is a collision with the current name. - exists, _, err := sqlbase.LookupObjectID( - params.ctx, - params.p.txn, - params.ExecCfg().Codec, - db.GetID(), - schemaID, - arrayTypeName, - ) - if err != nil { - return 0, err - } - // If we found an empty spot, then create the namespace key for this entry. - if !exists { - arrayTypeKey = sqlbase.MakePublicTableNameKey( - params.ctx, - params.ExecCfg().Settings, - db.GetID(), - arrayTypeName, - ) - break - } - // Otherwise, append another "_" to the front of the name. - arrayTypeName = "_" + arrayTypeName + arrayTypeName, err := findFreeArrayTypeName( + params.ctx, + params.p.txn, + params.ExecCfg().Codec, + db.ID, + schemaID, + typ.Type(), + ) + if err != nil { + return 0, err } + arrayTypeKey := sqlbase.MakeObjectNameKey(params.ctx, params.ExecCfg().Settings, db.ID, schemaID, arrayTypeName) // Generate the stable ID for the array type. id, err := catalogkv.GenerateUniqueDescID(params.ctx, params.ExecCfg().DB, params.ExecCfg().Codec) diff --git a/pkg/sql/exec_util.go b/pkg/sql/exec_util.go index b7a38d60d84c..c2dfa6290a25 100644 --- a/pkg/sql/exec_util.go +++ b/pkg/sql/exec_util.go @@ -651,13 +651,14 @@ type ExecutorConfig struct { InternalExecutor *InternalExecutor QueryCache *querycache.C - TestingKnobs ExecutorTestingKnobs - PGWireTestingKnobs *PGWireTestingKnobs - SchemaChangerTestingKnobs *SchemaChangerTestingKnobs - GCJobTestingKnobs *GCJobTestingKnobs - DistSQLRunTestingKnobs *execinfra.TestingKnobs - EvalContextTestingKnobs tree.EvalContextTestingKnobs - TenantTestingKnobs *TenantTestingKnobs + TestingKnobs ExecutorTestingKnobs + PGWireTestingKnobs *PGWireTestingKnobs + SchemaChangerTestingKnobs *SchemaChangerTestingKnobs + TypeSchemaChangerTestingKnobs *TypeSchemaChangerTestingKnobs + GCJobTestingKnobs *GCJobTestingKnobs + DistSQLRunTestingKnobs *execinfra.TestingKnobs + EvalContextTestingKnobs tree.EvalContextTestingKnobs + TenantTestingKnobs *TenantTestingKnobs // HistogramWindowInterval is (server.Config).HistogramWindowInterval. HistogramWindowInterval time.Duration diff --git a/pkg/sql/logictest/testdata/logic_test/alter_type b/pkg/sql/logictest/testdata/logic_test/alter_type new file mode 100644 index 000000000000..82380371797d --- /dev/null +++ b/pkg/sql/logictest/testdata/logic_test/alter_type @@ -0,0 +1,82 @@ +statement ok +SET experimental_enable_enums=true; + +# Some tests for RENAME TYPE. +statement ok +CREATE TYPE greeting AS ENUM ('hi', 'hello'); +ALTER TYPE greeting RENAME TO newname + +# After renaming, we should be able to resolve the type with the new name. +query T +SELECT 'hi'::newname +---- +hi + +# The array type should be renamed as well. +query T +SELECT ARRAY['hi']::_newname +---- +{hi} + +# Test that we can use the new name within a transaction. +statement ok +BEGIN; +ALTER TYPE newname RENAME TO renameagain + +query T +SELECT 'hi'::renameagain +---- +hi + +# newname is draining, so it should not be available for use. +statement error pq: type \"newname\" already exists +ALTER TYPE renameagain RENAME TO newname + +statement ok +ROLLBACK + +# We should be able to rename a type multiple types in a transaction. +statement ok +BEGIN; +ALTER TYPE newname RENAME TO new_name + +query T +SELECT 'hi'::new_name +---- +hi + +statement ok +ALTER TYPE new_name RENAME TO new__name + +query T +SELECT 'hi'::new__name +---- +hi + +statement ok +COMMIT + +# newname should be available for use after draining. +statement ok +ALTER TYPE new__name RENAME TO newname + +# We shouldn't be able to rename into a conflicting type. +statement ok +CREATE TABLE conflict (x INT) + +statement error pq: relation \"conflict\" already exists +ALTER TYPE newname RENAME TO conflict + +# Renames should try and move around the array type to find a valid name. +# This creates types _why and __why. +statement ok +CREATE TYPE _why AS ENUM ('pg', 'array', 'types', 'are', 'silly') + +# This should rename the array type to ___why. +statement ok +ALTER TYPE newname RENAME TO why + +query T +SELECT ARRAY['hi']::___why +---- +{hi} diff --git a/pkg/sql/logictest/testdata/logic_test/enums b/pkg/sql/logictest/testdata/logic_test/enums index 4bb2e58b5352..2c70e4c0a67d 100644 --- a/pkg/sql/logictest/testdata/logic_test/enums +++ b/pkg/sql/logictest/testdata/logic_test/enums @@ -151,9 +151,6 @@ ALTER TYPE greeting ADD VALUE 'hola' AFTER 'hello' statement error pq: unimplemented: ALTER TYPE RENAME VALUE unsupported ALTER TYPE greeting RENAME VALUE 'hello' TO 'helloooooo' -statement error pq: unimplemented: ALTER TYPE RENAME unsupported -ALTER TYPE greeting RENAME TO greetings - statement error pq: unimplemented: ALTER TYPE SET SCHEMA unsupported ALTER TYPE greeting SET SCHEMA newschema diff --git a/pkg/sql/parser/sql.y b/pkg/sql/parser/sql.y index bbdacc6daaa4..96f740649441 100644 --- a/pkg/sql/parser/sql.y +++ b/pkg/sql/parser/sql.y @@ -1941,12 +1941,12 @@ alter_type_stmt: }, } } -| ALTER TYPE type_name RENAME TO type_name +| ALTER TYPE type_name RENAME TO name { $$.val = &tree.AlterType{ Type: $3.unresolvedObjectName(), Cmd: &tree.AlterTypeRename{ - NewName: $6.unresolvedObjectName(), + NewName: $6, }, } } diff --git a/pkg/sql/resolver.go b/pkg/sql/resolver.go index 18a0c9ff2395..db50069e1b46 100644 --- a/pkg/sql/resolver.go +++ b/pkg/sql/resolver.go @@ -672,6 +672,18 @@ func getTableAsTableName( return tableName, nil } +// ResolveMutableTypeDescriptor resolves a type descriptor for mutable access. +func (p *planner) ResolveMutableTypeDescriptor( + ctx context.Context, name *tree.UnresolvedObjectName, required bool, +) (*sqlbase.MutableTypeDescriptor, error) { + tn, desc, err := resolver.ResolveMutableType(ctx, p, name, required) + if err != nil { + return nil, err + } + name.SetAnnotation(&p.semaCtx.Annotations, tn) + return desc, nil +} + // The versions below are part of the work for #34240. // TODO(radu): clean these up when everything is switched over. diff --git a/pkg/sql/schema_changer.go b/pkg/sql/schema_changer.go index 7bf63990d5da..a6646dd84c0f 100644 --- a/pkg/sql/schema_changer.go +++ b/pkg/sql/schema_changer.go @@ -20,6 +20,7 @@ import ( "github.com/cockroachdb/cockroach/pkg/base" "github.com/cockroachdb/cockroach/pkg/jobs" "github.com/cockroachdb/cockroach/pkg/jobs/jobspb" + "github.com/cockroachdb/cockroach/pkg/keys" "github.com/cockroachdb/cockroach/pkg/kv" "github.com/cockroachdb/cockroach/pkg/kv/kvclient/kvcoord" "github.com/cockroachdb/cockroach/pkg/roachpb" @@ -314,7 +315,7 @@ func (sc *SchemaChanger) maybeMakeAddTablePublic( fks := table.AllActiveAndInactiveForeignKeys() for _, fk := range fks { - if err := sc.waitToUpdateLeases(ctx, fk.ReferencedTableID); err != nil { + if err := waitToUpdateLeases(ctx, sc.leaseMgr, fk.ReferencedTableID); err != nil { return err } } @@ -339,25 +340,28 @@ func (sc *SchemaChanger) maybeMakeAddTablePublic( return nil } -// Drain old names from the cluster. -func (sc *SchemaChanger) drainNames(ctx context.Context) error { - log.Info(ctx, "draining previous table names") - +func drainNamesForDescriptor( + ctx context.Context, + descID sqlbase.ID, + leaseMgr *lease.Manager, + codec keys.SQLCodec, + beforeDrainNames func(), +) error { + log.Info(ctx, "draining previous names") // Publish a new version with all the names drained after everyone // has seen the version with the new name. All the draining names // can be reused henceforth. var namesToReclaim []sqlbase.NameInfo - _, err := sc.leaseMgr.Publish( + _, err := leaseMgr.Publish( ctx, - sc.tableID, + descID, func(desc catalog.MutableDescriptor) error { - tbl := desc.(*MutableTableDescriptor) - if sc.testingKnobs.OldNamesDrainedNotification != nil { - sc.testingKnobs.OldNamesDrainedNotification() + if beforeDrainNames != nil { + beforeDrainNames() } // Free up the old name(s) for reuse. - namesToReclaim = tbl.DrainingNames - tbl.DrainingNames = nil + namesToReclaim = desc.GetDrainingNames() + desc.SetDrainingNames(nil) return nil }, // Reclaim all the old names. @@ -365,7 +369,7 @@ func (sc *SchemaChanger) drainNames(ctx context.Context) error { b := txn.NewBatch() for _, drain := range namesToReclaim { err := sqlbase.RemoveObjectNamespaceEntry( - ctx, txn, sc.execCfg.Codec, drain.ParentID, drain.ParentSchemaID, drain.Name, false, /* KVTrace */ + ctx, txn, codec, drain.ParentID, drain.ParentSchemaID, drain.Name, false, /* KVTrace */ ) if err != nil { return err @@ -447,7 +451,13 @@ func (sc *SchemaChanger) exec(ctx context.Context) error { ) if tableDesc.HasDrainingNames() { - if err := sc.drainNames(ctx); err != nil { + if err := drainNamesForDescriptor( + ctx, + sc.tableID, + sc.leaseMgr, + sc.execCfg.Codec, + sc.testingKnobs.OldNamesDrainedNotification, + ); err != nil { return err } } @@ -485,7 +495,7 @@ func (sc *SchemaChanger) exec(ctx context.Context) error { // returns, so that the new schema is live everywhere. This is not needed for // correctness but is done to make the UI experience/tests predictable. waitToUpdateLeases := func(refreshStats bool) error { - if err := sc.waitToUpdateLeases(ctx, sc.tableID); err != nil { + if err := waitToUpdateLeases(ctx, sc.leaseMgr, sc.tableID); err != nil { if errors.Is(err, sqlbase.ErrDescriptorNotFound) { return err } @@ -563,7 +573,7 @@ func (sc *SchemaChanger) handlePermanentSchemaChangeError( // returns, so that the new schema is live everywhere. This is not needed for // correctness but is done to make the UI experience/tests predictable. waitToUpdateLeases := func(refreshStats bool) error { - if err := sc.waitToUpdateLeases(ctx, sc.tableID); err != nil { + if err := waitToUpdateLeases(ctx, sc.leaseMgr, sc.tableID); err != nil { if errors.Is(err, sqlbase.ErrDescriptorNotFound) { return err } @@ -721,12 +731,12 @@ func (sc *SchemaChanger) RunStateMachineBeforeBackfill(ctx context.Context) erro log.Info(ctx, "finished stepping through state machine") // wait for the state change to propagate to all leases. - return sc.waitToUpdateLeases(ctx, sc.tableID) + return waitToUpdateLeases(ctx, sc.leaseMgr, sc.tableID) } // Wait until the entire cluster has been updated to the latest version -// of the table descriptor. -func (sc *SchemaChanger) waitToUpdateLeases(ctx context.Context, tableID sqlbase.ID) error { +// of the descriptor. +func waitToUpdateLeases(ctx context.Context, leaseMgr *lease.Manager, descID sqlbase.ID) error { // Aggressively retry because there might be a user waiting for the // schema change to complete. retryOpts := retry.Options{ @@ -735,7 +745,7 @@ func (sc *SchemaChanger) waitToUpdateLeases(ctx context.Context, tableID sqlbase Multiplier: 2, } log.Infof(ctx, "waiting for a single version...") - version, err := sc.leaseMgr.WaitForOneVersion(ctx, tableID, retryOpts) + version, err := leaseMgr.WaitForOneVersion(ctx, descID, retryOpts) log.Infof(ctx, "waiting for a single version... done (at v %d)", version) return err } @@ -1283,11 +1293,11 @@ func (sc *SchemaChanger) maybeReverseMutations(ctx context.Context, causingError return err } - if err := sc.waitToUpdateLeases(ctx, sc.tableID); err != nil { + if err := waitToUpdateLeases(ctx, sc.leaseMgr, sc.tableID); err != nil { return err } for id := range fksByBackrefTable { - if err := sc.waitToUpdateLeases(ctx, id); err != nil { + if err := waitToUpdateLeases(ctx, sc.leaseMgr, id); err != nil { return err } } diff --git a/pkg/sql/sem/tree/alter_type.go b/pkg/sql/sem/tree/alter_type.go index e15da0f7993b..6245c755dc08 100644 --- a/pkg/sql/sem/tree/alter_type.go +++ b/pkg/sql/sem/tree/alter_type.go @@ -88,13 +88,13 @@ func (node *AlterTypeRenameValue) Format(ctx *FmtCtx) { // AlterTypeRename represents an ALTER TYPE RENAME command. type AlterTypeRename struct { - NewName *UnresolvedObjectName + NewName string } // Format implements the NodeFormatter interface. func (node *AlterTypeRename) Format(ctx *FmtCtx) { ctx.WriteString(" RENAME TO ") - ctx.FormatNode(node.NewName) + ctx.WriteString(node.NewName) } // AlterTypeSetSchema represents an ALTER TYPE SET SCHEMA command. diff --git a/pkg/sql/sqlbase/database_desc.go b/pkg/sql/sqlbase/database_desc.go index 22bd140dc317..517dc99d06c5 100644 --- a/pkg/sql/sqlbase/database_desc.go +++ b/pkg/sql/sqlbase/database_desc.go @@ -106,6 +106,11 @@ func (desc *DatabaseDescriptor) TypeDesc() *TypeDescriptor { return nil } +// SetDrainingNames implements the MutableDescriptor interface. +func (desc *MutableDatabaseDescriptor) SetDrainingNames(names []NameInfo) { + desc.DrainingNames = names +} + // GetParentID implements the BaseDescriptorInterface interface. func (desc *ImmutableDatabaseDescriptor) GetParentID() ID { return keys.RootNamespaceID diff --git a/pkg/sql/sqlbase/schema_desc.go b/pkg/sql/sqlbase/schema_desc.go index 6033d489bcb6..d316ee3c97e9 100644 --- a/pkg/sql/sqlbase/schema_desc.go +++ b/pkg/sql/sqlbase/schema_desc.go @@ -80,6 +80,11 @@ func NewMutableCreatedSchemaDescriptor(desc SchemaDescriptor) *MutableSchemaDesc } } +// SetDrainingNames implements the MutableDescriptor interface. +func (desc *MutableSchemaDescriptor) SetDrainingNames(names []NameInfo) { + desc.DrainingNames = names +} + // GetParentSchemaID implements the BaseDescriptorInterface interface. func (desc *ImmutableSchemaDescriptor) GetParentSchemaID() ID { return keys.RootNamespaceID diff --git a/pkg/sql/sqlbase/table_desc.go b/pkg/sql/sqlbase/table_desc.go index 142e74f699e1..e9702b669ed6 100644 --- a/pkg/sql/sqlbase/table_desc.go +++ b/pkg/sql/sqlbase/table_desc.go @@ -36,3 +36,8 @@ func (desc *MutableTableDescriptor) Immutable() DescriptorInterface { // copy, so we don't have to do it here? return NewImmutableTableDescriptor(*protoutil.Clone(desc.TableDesc()).(*TableDescriptor)) } + +// SetDrainingNames implements the MutableDescriptor interface. +func (desc *MutableTableDescriptor) SetDrainingNames(names []NameInfo) { + desc.DrainingNames = names +} diff --git a/pkg/sql/sqlbase/testutils.go b/pkg/sql/sqlbase/testutils.go index 0d1ce6226404..1039e7a9a3ba 100644 --- a/pkg/sql/sqlbase/testutils.go +++ b/pkg/sql/sqlbase/testutils.go @@ -33,6 +33,7 @@ import ( "github.com/cockroachdb/cockroach/pkg/sql/types" "github.com/cockroachdb/cockroach/pkg/util/bitarray" "github.com/cockroachdb/cockroach/pkg/util/duration" + "github.com/cockroachdb/cockroach/pkg/util/hlc" "github.com/cockroachdb/cockroach/pkg/util/ipaddr" "github.com/cockroachdb/cockroach/pkg/util/json" "github.com/cockroachdb/cockroach/pkg/util/log" @@ -56,19 +57,10 @@ func TestingGetMutableExistingTableDescriptor( return NewMutableExistingTableDescriptor(*TestingGetTableDescriptor(kvDB, codec, database, table)) } -// TestingGetTableDescriptor retrieves a table descriptor directly from the KV -// layer. -// -// TODO(ajwerner): Move this to catalogkv and/or question the very existence of -// this function. Consider renaming to TestingGetTableDescriptorByName or -// removing it altogether. -func TestingGetTableDescriptor( - kvDB *kv.DB, codec keys.SQLCodec, database string, table string, -) *TableDescriptor { - // log.VEventf(context.TODO(), 2, "TestingGetTableDescriptor %q %q", database, table) - // testutil, so we pass settings as nil for both database and table name keys. +func testingGetDescriptor( + ctx context.Context, kvDB *kv.DB, codec keys.SQLCodec, database string, object string, +) (hlc.Timestamp, *Descriptor) { dKey := NewDatabaseKey(database) - ctx := context.TODO() gr, err := kvDB.Get(ctx, dKey.Key(codec)) if err != nil { panic(err) @@ -78,13 +70,13 @@ func TestingGetTableDescriptor( } dbDescID := ID(gr.ValueInt()) - tKey := NewPublicTableKey(dbDescID, table) + tKey := NewPublicTableKey(dbDescID, object) gr, err = kvDB.Get(ctx, tKey.Key(codec)) if err != nil { panic(err) } if !gr.Exists() { - panic("table missing") + panic("object missing") } descKey := MakeDescMetadataKey(codec, ID(gr.ValueInt())) @@ -93,11 +85,35 @@ func TestingGetTableDescriptor( if err != nil || desc.Equal(Descriptor{}) { log.Fatalf(ctx, "proto with id %d missing. err: %v", gr.ValueInt(), err) } + return ts, desc +} + +// TestingGetTypeDescriptor retrieves a type descriptor directly from the kv layer. +// +// This function should be moved wherever TestingGetTableDescriptor is moved. +func TestingGetTypeDescriptor( + kvDB *kv.DB, codec keys.SQLCodec, database string, object string, +) *TypeDescriptor { + _, desc := testingGetDescriptor(context.TODO(), kvDB, codec, database, object) + return desc.GetType() +} + +// TestingGetTableDescriptor retrieves a table descriptor directly from the KV +// layer. +// +// TODO(ajwerner): Move this to catalogkv and/or question the very existence of +// this function. Consider renaming to TestingGetTableDescriptorByName or +// removing it altogether. +func TestingGetTableDescriptor( + kvDB *kv.DB, codec keys.SQLCodec, database string, table string, +) *TableDescriptor { + ctx := context.TODO() + ts, desc := testingGetDescriptor(ctx, kvDB, codec, database, table) tableDesc := desc.Table(ts) if tableDesc == nil { return nil } - err = tableDesc.MaybeFillInDescriptor(ctx, kvDB, codec) + err := tableDesc.MaybeFillInDescriptor(ctx, kvDB, codec) if err != nil { log.Fatalf(ctx, "failure to fill in descriptor. err: %v", err) } diff --git a/pkg/sql/sqlbase/type_desc.go b/pkg/sql/sqlbase/type_desc.go index 9ecd3694ad8a..0b10fa8c4a6d 100644 --- a/pkg/sql/sqlbase/type_desc.go +++ b/pkg/sql/sqlbase/type_desc.go @@ -156,6 +156,11 @@ func (desc *TypeDescriptor) DescriptorProto() *Descriptor { } } +// SetDrainingNames implements the MutableDescriptor interface. +func (desc *MutableTypeDescriptor) SetDrainingNames(names []NameInfo) { + desc.DrainingNames = names +} + // GetAuditMode implements the DescriptorProto interface. func (desc *TypeDescriptor) GetAuditMode() TableDescriptor_AuditMode { return TableDescriptor_DISABLED diff --git a/pkg/sql/type_change.go b/pkg/sql/type_change.go new file mode 100644 index 000000000000..22e379afaf4e --- /dev/null +++ b/pkg/sql/type_change.go @@ -0,0 +1,244 @@ +// Copyright 2020 The Cockroach Authors. +// +// Use of this software is governed by the Business Source License +// included in the file licenses/BSL.txt. +// +// As of the Change Date specified in that file, in accordance with +// the Business Source License, use of this software will be governed +// by the Apache License, Version 2.0, included in the file +// licenses/APL.txt. + +package sql + +import ( + "context" + "time" + + "github.com/cockroachdb/cockroach/pkg/jobs" + "github.com/cockroachdb/cockroach/pkg/jobs/jobspb" + "github.com/cockroachdb/cockroach/pkg/kv" + "github.com/cockroachdb/cockroach/pkg/settings/cluster" + "github.com/cockroachdb/cockroach/pkg/sql/catalog/catalogkv" + "github.com/cockroachdb/cockroach/pkg/sql/sem/tree" + "github.com/cockroachdb/cockroach/pkg/sql/sqlbase" + "github.com/cockroachdb/cockroach/pkg/util/log" + "github.com/cockroachdb/cockroach/pkg/util/retry" + "github.com/cockroachdb/errors" + "github.com/cockroachdb/logtags" +) + +// writeTypeChange should be called on a mutated type descriptor to ensure that +// the descriptor gets written to a batch, as well as ensuring that a job is +// created to perform the schema change on the type. +func (p *planner) writeTypeChange( + ctx context.Context, typeDesc *sqlbase.MutableTypeDescriptor, jobDesc string, +) error { + // Check if there is an active job for this type, otherwise create one. + job, jobExists := p.extendedEvalCtx.SchemaChangeJobCache[typeDesc.ID] + if jobExists { + // Update it. + if err := job.WithTxn(p.txn).SetDescription(ctx, + func(ctx context.Context, description string) (string, error) { + return description + "; " + jobDesc, nil + }, + ); err != nil { + return err + } + log.Infof(ctx, "job %d: updated with type change for type %d", *job.ID(), typeDesc.ID) + } else { + // Or, create a new job. + jobRecord := jobs.Record{ + Description: jobDesc, + Username: p.User(), + DescriptorIDs: sqlbase.IDs{typeDesc.ID}, + Details: jobspb.TypeSchemaChangeDetails{ + TypeID: typeDesc.ID, + }, + Progress: jobspb.TypeSchemaChangeProgress{}, + // Type change jobs are not cancellable. + NonCancelable: true, + } + newJob, err := p.extendedEvalCtx.QueueJob(jobRecord) + if err != nil { + return err + } + p.extendedEvalCtx.SchemaChangeJobCache[typeDesc.ID] = newJob + log.Infof(ctx, "queued new type change job %d for type %d", *newJob.ID(), typeDesc.ID) + } + + // TODO (rohany): Once the desc.Collection has a hook to register a modified + // type, call into that hook here. + + // Maybe increment the type's version. + typeDesc.MaybeIncrementVersion() + + // Write the type out to a batch. + b := p.txn.NewBatch() + if err := catalogkv.WriteDescToBatch( + ctx, + p.extendedEvalCtx.Tracing.KVTracingEnabled(), + p.ExecCfg().Settings, + b, + p.ExecCfg().Codec, + typeDesc.ID, + typeDesc, + ); err != nil { + return err + } + return p.txn.Run(ctx, b) +} + +// typeSchemaChanger is the struct that actually runs the type schema change. +type typeSchemaChanger struct { + typeID sqlbase.ID + execCfg *ExecutorConfig +} + +// TypeSchemaChangerTestingKnobs contains testing knobs for the typeSchemaChanger. +type TypeSchemaChangerTestingKnobs struct { + // RunBeforeExec runs at the start of the typeSchemaChanger. + RunBeforeExec func() error +} + +// ModuleTestingKnobs implements the ModuleTestingKnobs interface. +func (TypeSchemaChangerTestingKnobs) ModuleTestingKnobs() {} + +func (t *typeSchemaChanger) getTypeDescFromStore( + ctx context.Context, +) (*sqlbase.ImmutableTypeDescriptor, error) { + var typeDesc *sqlbase.ImmutableTypeDescriptor + if err := t.execCfg.DB.Txn(ctx, func(ctx context.Context, txn *kv.Txn) error { + var err error + typeDesc, err = sqlbase.GetTypeDescFromID(ctx, txn, t.execCfg.Codec, t.typeID) + if err != nil { + return err + } + return nil + }); err != nil { + return nil, err + } + return typeDesc, nil +} + +// exec is the entry point for the type schema change process. +func (t *typeSchemaChanger) exec(ctx context.Context) error { + if t.execCfg.TypeSchemaChangerTestingKnobs.RunBeforeExec != nil { + if err := t.execCfg.TypeSchemaChangerTestingKnobs.RunBeforeExec(); err != nil { + return err + } + } + + ctx = logtags.AddTags(ctx, t.logTags()) + leaseMgr := t.execCfg.LeaseManager + codec := t.execCfg.Codec + + typeDesc, err := t.getTypeDescFromStore(ctx) + if err != nil { + return err + } + + // If there are any names to drain, then do so. + if len(typeDesc.DrainingNames) > 0 { + if err := drainNamesForDescriptor( + ctx, + t.typeID, + leaseMgr, + codec, + nil, /* beforeDrainNames */ + ); err != nil { + return err + } + } + + // Finally, make sure all of the leases are updated. + if err := waitToUpdateLeases(ctx, leaseMgr, t.typeID); err != nil { + if errors.Is(err, sqlbase.ErrDescriptorNotFound) { + return nil + } + return err + } + + return nil +} + +func (t *typeSchemaChanger) logTags() *logtags.Buffer { + buf := &logtags.Buffer{} + buf.Add("typeChangeExec", nil) + buf.Add("type", t.typeID) + return buf +} + +// typeChangeResumer is the anchor struct for the type change job. +type typeChangeResumer struct { + job *jobs.Job +} + +// Resume implements the jobs.Resumer interface. +func (t *typeChangeResumer) Resume( + ctx context.Context, phs interface{}, _ chan<- tree.Datums, +) error { + tc := &typeSchemaChanger{ + typeID: t.job.Details().(jobspb.TypeSchemaChangeDetails).TypeID, + execCfg: phs.(*planner).execCfg, + } + // Set up the type changer to be retried. + opts := retry.Options{ + InitialBackoff: 100 * time.Millisecond, + MaxBackoff: 20 * time.Second, + Multiplier: 1.5, + } + for r := retry.StartWithCtx(ctx, opts); r.Next(); { + tcErr := tc.exec(ctx) + switch { + case tcErr == nil: + return nil + case errors.Is(tcErr, sqlbase.ErrDescriptorNotFound): + // If the descriptor for the ID can't be found, we assume that another + // job executed already and dropped the type. + log.Infof( + ctx, + "descriptor %d not found for type change job; assuming it was dropped, and exiting", + tc.typeID, + ) + return nil + case !isPermanentSchemaChangeError(tcErr): + // If this isn't a permanent error, then retry. + log.Infof(ctx, "retrying type schema change due to retriable error %v", tcErr) + default: + return tcErr + } + } + return nil +} + +// OnFailOrCancel implements the jobs.Resumer interface. +func (t *typeChangeResumer) OnFailOrCancel(ctx context.Context, phs interface{}) error { + // If the job failed, just try again to clean up any draining names. + tc := &typeSchemaChanger{ + typeID: t.job.Details().(jobspb.TypeSchemaChangeDetails).TypeID, + execCfg: phs.(*planner).ExecCfg(), + } + typeDesc, err := tc.getTypeDescFromStore(ctx) + if err != nil { + return err + } + if len(typeDesc.DrainingNames) > 0 { + if err := drainNamesForDescriptor( + ctx, + tc.typeID, + tc.execCfg.LeaseManager, + tc.execCfg.Codec, + nil, /* beforeDrainNames */ + ); err != nil { + return err + } + } + return nil +} + +func init() { + createResumerFn := func(job *jobs.Job, settings *cluster.Settings) jobs.Resumer { + return &typeChangeResumer{job: job} + } + jobs.RegisterConstructor(jobspb.TypeTypeSchemaChange, createResumerFn) +} diff --git a/pkg/sql/type_change_test.go b/pkg/sql/type_change_test.go new file mode 100644 index 000000000000..f810f75ce86a --- /dev/null +++ b/pkg/sql/type_change_test.go @@ -0,0 +1,160 @@ +// Copyright 2020 The Cockroach Authors. +// +// Use of this software is governed by the Business Source License +// included in the file licenses/BSL.txt. +// +// As of the Change Date specified in that file, in accordance with +// the Business Source License, use of this software will be governed +// by the Apache License, Version 2.0, included in the file +// licenses/APL.txt. + +package sql_test + +import ( + "context" + "testing" + + "github.com/cockroachdb/cockroach/pkg/keys" + "github.com/cockroachdb/cockroach/pkg/sql" + "github.com/cockroachdb/cockroach/pkg/sql/sqlbase" + "github.com/cockroachdb/cockroach/pkg/sql/tests" + "github.com/cockroachdb/cockroach/pkg/testutils" + "github.com/cockroachdb/cockroach/pkg/testutils/serverutils" + "github.com/cockroachdb/cockroach/pkg/util/leaktest" + "github.com/cockroachdb/cockroach/pkg/util/log" + "github.com/cockroachdb/cockroach/pkg/util/syncutil" + "github.com/cockroachdb/errors" +) + +// TestDrainingNamesAreCleanedTypeChangeOnFailure ensures that draining names +// are cleaned up if the type schema change job runs into a failure in Resume(). +func TestDrainingNamesAreCleanedOnTypeChangeFailure(t *testing.T) { + defer leaktest.AfterTest(t)() + defer log.Scope(t).Close(t) + + // Decrease the adopt loop interval so that retries happen quickly. + defer setTestJobsAdoptInterval()() + + ctx := context.Background() + params, _ := tests.CreateTestServerParams() + params.Knobs.SQLTypeSchemaChanger = &sql.TypeSchemaChangerTestingKnobs{ + RunBeforeExec: func() error { + return errors.New("boom") + }, + } + + s, sqlDB, _ := serverutils.StartServer(t, params) + defer s.Stopper().Stop(ctx) + + // Create a type. + if _, err := sqlDB.Exec(` +SET experimental_enable_enums = true; +CREATE DATABASE d; +CREATE TYPE d.t AS ENUM() +`); err != nil { + t.Fatal(err) + } + + // Try a rename. This should fail with "boom". + _, err := sqlDB.Exec(`ALTER TYPE d.t RENAME TO t2`) + if err == nil { + t.Fatal("expected error, found nil") + } + if !testutils.IsError(err, "boom") { + t.Fatalf("expected boom, found %v", err) + } + + // The failure hook should kick in and drain the names. + testutils.SucceedsSoon(t, func() error { + _, err := sqlDB.Exec(`CREATE TYPE d.t AS ENUM ('drained')`) + return err + }) +} + +// TestTypeSchemaChangeHandlesDeletedDescriptor ensures that the type schema +// change process is resilient to deleted descriptors. +func TestTypeSchemaChangeHandlesDeletedDescriptor(t *testing.T) { + defer leaktest.AfterTest(t)() + defer log.Scope(t).Close(t) + + ctx := context.Background() + var delTypeDesc func() + params, _ := tests.CreateTestServerParams() + params.Knobs.SQLTypeSchemaChanger = &sql.TypeSchemaChangerTestingKnobs{ + RunBeforeExec: func() error { + delTypeDesc() + return nil + }, + } + + s, sqlDB, kvDB := serverutils.StartServer(t, params) + defer s.Stopper().Stop(ctx) + + // Create a type. + if _, err := sqlDB.Exec(` +SET experimental_enable_enums = true; +CREATE DATABASE d; +CREATE TYPE d.t AS ENUM(); +`); err != nil { + t.Fatal(err) + } + + // Set up delTypeDesc to delete t. + desc := sqlbase.TestingGetTypeDescriptor(kvDB, keys.SystemSQLCodec, "d", "t") + delTypeDesc = func() { + // Delete the descriptor. + if err := kvDB.Del(ctx, sqlbase.MakeDescMetadataKey(keys.SystemSQLCodec, desc.ID)); err != nil { + t.Error(err) + } + } + + // A job running on this descriptor shouldn't fail horribly. + if _, err := sqlDB.Exec(`ALTER TYPE d.t RENAME TO t2`); err != nil { + t.Fatal(err) + } +} + +// TestTypeSchemaChangeRetriesTransparently tests that a type schema change +// that runs into a non permanent error will retry transparently. +func TestTypeSchemaChangeRetriesTransparently(t *testing.T) { + defer leaktest.AfterTest(t)() + defer log.Scope(t).Close(t) + + // Decrease the adopt loop interval so that retries happen quickly. + defer setTestJobsAdoptInterval()() + + ctx := context.Background() + // Protects errorReturned. + var mu syncutil.Mutex + errorReturned := false + params, _ := tests.CreateTestServerParams() + params.Knobs.SQLTypeSchemaChanger = &sql.TypeSchemaChangerTestingKnobs{ + RunBeforeExec: func() error { + mu.Lock() + defer mu.Unlock() + // Return a retryable error on the first call. + if errorReturned { + return nil + } + errorReturned = true + return context.DeadlineExceeded + }, + } + + s, sqlDB, _ := serverutils.StartServer(t, params) + defer s.Stopper().Stop(ctx) + + // Create a type. + if _, err := sqlDB.Exec(` +SET experimental_enable_enums = true; +CREATE DATABASE d; +CREATE TYPE d.t AS ENUM(); +`); err != nil { + t.Fatal(err) + } + + // The retry should happen within the job and succeed. + if _, err := sqlDB.Exec(`ALTER TYPE d.t RENAME TO t2`); err != nil { + t.Fatal(err) + } +}