setup
CREATE TABLE t (k INT NOT NULL, v STRING);
----

ops
ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (k);
----
StatementPhase stage 1 of 1 with 12 MutationType ops
  transitions:
    [[ColumnNotNull:{DescID: 104, ColumnID: 3, IndexID: 0}, ABSENT], PUBLIC] -> VALIDATED
    [[PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT], ABSENT] -> BACKFILL_ONLY
    [[IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 2}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 2}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 2}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexData:{DescID: 104, IndexID: 2}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT], ABSENT] -> DELETE_ONLY
    [[IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 3}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 3}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 3}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, PUBLIC], ABSENT] -> BACKFILL_ONLY
    [[IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 4}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 4}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexData:{DescID: 104, IndexID: 4}, PUBLIC], ABSENT] -> PUBLIC
  ops:
    *scop.MakePublicColumnNotNullValidated
      ColumnID: 3
      TableID: 104
    *scop.MakeAbsentIndexBackfilling
      Index:
        ConstraintID: 2
        IndexID: 2
        IsUnique: true
        SourceIndexID: 1
        TableID: 104
        TemporaryIndexID: 3
    *scop.AddColumnToIndex
      ColumnID: 3
      IndexID: 2
      Kind: 2
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 2
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 2
      IndexID: 2
      Kind: 2
      Ordinal: 1
      TableID: 104
    *scop.MakeAbsentTempIndexDeleteOnly
      Index:
        ConstraintID: 3
        IndexID: 3
        IsUnique: true
        SourceIndexID: 1
        TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 3
      IndexID: 3
      Kind: 2
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 3
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 2
      IndexID: 3
      Kind: 2
      Ordinal: 1
      TableID: 104
    *scop.MakeAbsentIndexBackfilling
      Index:
        ConstraintID: 4
        IndexID: 4
        IsUnique: true
        SourceIndexID: 2
        TableID: 104
        TemporaryIndexID: 5
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 4
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 2
      IndexID: 4
      Kind: 2
      TableID: 104
PreCommitPhase stage 1 of 2 with 1 MutationType op
  transitions:
    [[ColumnNotNull:{DescID: 104, ColumnID: 3, IndexID: 0}, ABSENT], VALIDATED] -> PUBLIC
    [[PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT], BACKFILL_ONLY] -> ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 2}, TRANSIENT_ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 2}, TRANSIENT_ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 2}, TRANSIENT_ABSENT], PUBLIC] -> ABSENT
    [[IndexData:{DescID: 104, IndexID: 2}, TRANSIENT_ABSENT], PUBLIC] -> ABSENT
    [[TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT], DELETE_ONLY] -> ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 3}, TRANSIENT_ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 3}, TRANSIENT_ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 3}, TRANSIENT_ABSENT], PUBLIC] -> ABSENT
    [[PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, PUBLIC], BACKFILL_ONLY] -> ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 4}, PUBLIC], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 4}, PUBLIC], PUBLIC] -> ABSENT
    [[IndexData:{DescID: 104, IndexID: 4}, PUBLIC], PUBLIC] -> ABSENT
  ops:
    *scop.UndoAllInTxnImmediateMutationOpSideEffects
      {}
PreCommitPhase stage 2 of 2 with 17 MutationType ops
  transitions:
    [[ColumnNotNull:{DescID: 104, ColumnID: 3, IndexID: 0}, ABSENT], PUBLIC] -> VALIDATED
    [[PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT], ABSENT] -> BACKFILL_ONLY
    [[IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 2}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 2}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 2}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexData:{DescID: 104, IndexID: 2}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT], ABSENT] -> DELETE_ONLY
    [[IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 3}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 3}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 3}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, PUBLIC], ABSENT] -> BACKFILL_ONLY
    [[IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 4}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 4}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexData:{DescID: 104, IndexID: 4}, PUBLIC], ABSENT] -> PUBLIC
  ops:
    *scop.MakePublicColumnNotNullValidated
      ColumnID: 3
      TableID: 104
    *scop.MakeAbsentIndexBackfilling
      Index:
        ConstraintID: 2
        IndexID: 2
        IsUnique: true
        SourceIndexID: 1
        TableID: 104
        TemporaryIndexID: 3
    *scop.MaybeAddSplitForIndex
      IndexID: 2
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 3
      IndexID: 2
      Kind: 2
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 2
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 2
      IndexID: 2
      Kind: 2
      Ordinal: 1
      TableID: 104
    *scop.MakeAbsentTempIndexDeleteOnly
      Index:
        ConstraintID: 3
        IndexID: 3
        IsUnique: true
        SourceIndexID: 1
        TableID: 104
    *scop.MaybeAddSplitForIndex
      IndexID: 3
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 3
      IndexID: 3
      Kind: 2
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 3
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 2
      IndexID: 3
      Kind: 2
      Ordinal: 1
      TableID: 104
    *scop.MakeAbsentIndexBackfilling
      Index:
        ConstraintID: 4
        IndexID: 4
        IsUnique: true
        SourceIndexID: 2
        TableID: 104
        TemporaryIndexID: 5
    *scop.MaybeAddSplitForIndex
      IndexID: 4
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 4
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 2
      IndexID: 4
      Kind: 2
      TableID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
      Initialize: true
    *scop.CreateSchemaChangerJob
      Authorization:
        AppName: $ internal-test
        UserName: root
      DescriptorIDs:
      - 104
      JobID: 1
      RunningStatus: PostCommitPhase stage 1 of 15 with 1 MutationType op pending
      Statements:
      - statement: ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (k)
        redactedstatement: ALTER TABLE ‹defaultdb›.public.‹t› ALTER PRIMARY KEY USING COLUMNS (‹k›)
        statementtag: ALTER TABLE
PostCommitPhase stage 1 of 15 with 3 MutationType ops
  transitions:
    [[TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT], DELETE_ONLY] -> WRITE_ONLY
    [[IndexData:{DescID: 104, IndexID: 3}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
  ops:
    *scop.MakeDeleteOnlyIndexWriteOnly
      IndexID: 3
      TableID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.UpdateSchemaChangerJob
      JobID: 1
PostCommitPhase stage 2 of 15 with 1 BackfillType op
  transitions:
    [[PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT], BACKFILL_ONLY] -> BACKFILLED
  ops:
    *scop.BackfillIndex
      IndexID: 2
      SourceIndexID: 1
      TableID: 104
PostCommitPhase stage 3 of 15 with 3 MutationType ops
  transitions:
    [[PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT], BACKFILLED] -> DELETE_ONLY
  ops:
    *scop.MakeBackfillingIndexDeleteOnly
      IndexID: 2
      TableID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.UpdateSchemaChangerJob
      JobID: 1
PostCommitPhase stage 4 of 15 with 3 MutationType ops
  transitions:
    [[PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT], DELETE_ONLY] -> MERGE_ONLY
  ops:
    *scop.MakeBackfilledIndexMerging
      IndexID: 2
      TableID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.UpdateSchemaChangerJob
      JobID: 1
PostCommitPhase stage 5 of 15 with 1 BackfillType op
  transitions:
    [[PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT], MERGE_ONLY] -> MERGED
  ops:
    *scop.MergeIndex
      BackfilledIndexID: 2
      TableID: 104
      TemporaryIndexID: 3
PostCommitPhase stage 6 of 15 with 4 MutationType ops
  transitions:
    [[PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT], MERGED] -> WRITE_ONLY
    [[TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT], WRITE_ONLY] -> TRANSIENT_DELETE_ONLY
  ops:
    *scop.MakeWriteOnlyIndexDeleteOnly
      IndexID: 3
      TableID: 104
    *scop.MakeMergedIndexWriteOnly
      IndexID: 2
      TableID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.UpdateSchemaChangerJob
      JobID: 1
PostCommitPhase stage 7 of 15 with 1 ValidationType op
  transitions:
    [[PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT], WRITE_ONLY] -> VALIDATED
  ops:
    *scop.ValidateIndex
      IndexID: 2
      TableID: 104
PostCommitPhase stage 8 of 15 with 10 MutationType ops
  transitions:
    [[PrimaryIndex:{DescID: 104, IndexID: 1, ConstraintID: 1}, ABSENT], PUBLIC] -> VALIDATED
    [[IndexName:{DescID: 104, Name: t_pkey, IndexID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT], VALIDATED] -> PUBLIC
    [[IndexName:{DescID: 104, Name: t_pkey, IndexID: 2}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[TemporaryIndex:{DescID: 104, IndexID: 5, ConstraintID: 5, SourceIndexID: 2}, TRANSIENT_ABSENT], ABSENT] -> DELETE_ONLY
    [[IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 5}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 5}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
  ops:
    *scop.MakePublicPrimaryIndexWriteOnly
      IndexID: 1
      TableID: 104
    *scop.SetIndexName
      IndexID: 1
      Name: crdb_internal_index_1_name_placeholder
      TableID: 104
    *scop.SetIndexName
      IndexID: 2
      Name: t_pkey
      TableID: 104
    *scop.MakeValidatedPrimaryIndexPublic
      IndexID: 2
      TableID: 104
    *scop.MakeAbsentTempIndexDeleteOnly
      Index:
        ConstraintID: 5
        IndexID: 5
        IsUnique: true
        SourceIndexID: 2
        TableID: 104
    *scop.MaybeAddSplitForIndex
      IndexID: 5
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 5
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 2
      IndexID: 5
      Kind: 2
      TableID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.UpdateSchemaChangerJob
      JobID: 1
PostCommitPhase stage 9 of 15 with 3 MutationType ops
  transitions:
    [[TemporaryIndex:{DescID: 104, IndexID: 5, ConstraintID: 5, SourceIndexID: 2}, TRANSIENT_ABSENT], DELETE_ONLY] -> WRITE_ONLY
    [[IndexData:{DescID: 104, IndexID: 5}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
  ops:
    *scop.MakeDeleteOnlyIndexWriteOnly
      IndexID: 5
      TableID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.UpdateSchemaChangerJob
      JobID: 1
PostCommitPhase stage 10 of 15 with 1 BackfillType op
  transitions:
    [[PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, PUBLIC], BACKFILL_ONLY] -> BACKFILLED
  ops:
    *scop.BackfillIndex
      IndexID: 4
      SourceIndexID: 2
      TableID: 104
PostCommitPhase stage 11 of 15 with 3 MutationType ops
  transitions:
    [[PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, PUBLIC], BACKFILLED] -> DELETE_ONLY
  ops:
    *scop.MakeBackfillingIndexDeleteOnly
      IndexID: 4
      TableID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.UpdateSchemaChangerJob
      JobID: 1
PostCommitPhase stage 12 of 15 with 3 MutationType ops
  transitions:
    [[PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, PUBLIC], DELETE_ONLY] -> MERGE_ONLY
  ops:
    *scop.MakeBackfilledIndexMerging
      IndexID: 4
      TableID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.UpdateSchemaChangerJob
      JobID: 1
PostCommitPhase stage 13 of 15 with 1 BackfillType op
  transitions:
    [[PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, PUBLIC], MERGE_ONLY] -> MERGED
  ops:
    *scop.MergeIndex
      BackfilledIndexID: 4
      TableID: 104
      TemporaryIndexID: 5
PostCommitPhase stage 14 of 15 with 4 MutationType ops
  transitions:
    [[PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, PUBLIC], MERGED] -> WRITE_ONLY
    [[TemporaryIndex:{DescID: 104, IndexID: 5, ConstraintID: 5, SourceIndexID: 2}, TRANSIENT_ABSENT], WRITE_ONLY] -> TRANSIENT_DELETE_ONLY
  ops:
    *scop.MakeWriteOnlyIndexDeleteOnly
      IndexID: 5
      TableID: 104
    *scop.MakeMergedIndexWriteOnly
      IndexID: 4
      TableID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.UpdateSchemaChangerJob
      JobID: 1
PostCommitPhase stage 15 of 15 with 1 ValidationType op
  transitions:
    [[PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, PUBLIC], WRITE_ONLY] -> VALIDATED
  ops:
    *scop.ValidateIndex
      IndexID: 4
      TableID: 104
PostCommitNonRevertiblePhase stage 1 of 4 with 16 MutationType ops
  transitions:
    [[Column:{DescID: 104, ColumnID: 3}, ABSENT], PUBLIC] -> WRITE_ONLY
    [[ColumnName:{DescID: 104, Name: rowid, ColumnID: 3}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnNotNull:{DescID: 104, ColumnID: 3, IndexID: 0}, ABSENT], VALIDATED] -> ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[PrimaryIndex:{DescID: 104, IndexID: 1, ConstraintID: 1}, ABSENT], VALIDATED] -> DELETE_ONLY
    [[TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT], TRANSIENT_DELETE_ONLY] -> TRANSIENT_ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 3}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 3}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 3}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
    [[TemporaryIndex:{DescID: 104, IndexID: 5, ConstraintID: 5, SourceIndexID: 2}, TRANSIENT_ABSENT], TRANSIENT_DELETE_ONLY] -> TRANSIENT_ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 5}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 5}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
  ops:
    *scop.RemoveColumnNotNull
      ColumnID: 3
      TableID: 104
    *scop.RemoveColumnFromIndex
      ColumnID: 1
      IndexID: 3
      TableID: 104
    *scop.RemoveColumnFromIndex
      ColumnID: 2
      IndexID: 3
      Kind: 2
      Ordinal: 1
      TableID: 104
    *scop.RemoveColumnFromIndex
      ColumnID: 1
      IndexID: 5
      TableID: 104
    *scop.RemoveColumnFromIndex
      ColumnID: 2
      IndexID: 5
      Kind: 2
      TableID: 104
    *scop.MakePublicColumnWriteOnly
      ColumnID: 3
      TableID: 104
    *scop.SetColumnName
      ColumnID: 3
      Name: crdb_internal_column_3_name_placeholder
      TableID: 104
    *scop.MakeWriteOnlyIndexDeleteOnly
      IndexID: 1
      TableID: 104
    *scop.RemoveColumnFromIndex
      ColumnID: 3
      IndexID: 3
      Kind: 2
      TableID: 104
    *scop.MakeIndexAbsent
      IndexID: 5
      TableID: 104
    *scop.RemoveColumnFromIndex
      ColumnID: 3
      IndexID: 1
      TableID: 104
    *scop.RemoveColumnFromIndex
      ColumnID: 1
      IndexID: 1
      Kind: 2
      TableID: 104
    *scop.RemoveColumnFromIndex
      ColumnID: 2
      IndexID: 1
      Kind: 2
      Ordinal: 1
      TableID: 104
    *scop.MakeIndexAbsent
      IndexID: 3
      TableID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.UpdateSchemaChangerJob
      IsNonCancelable: true
      JobID: 1
PostCommitNonRevertiblePhase stage 2 of 4 with 8 MutationType ops
  transitions:
    [[Column:{DescID: 104, ColumnID: 3}, ABSENT], WRITE_ONLY] -> DELETE_ONLY
    [[PrimaryIndex:{DescID: 104, IndexID: 1, ConstraintID: 1}, ABSENT], DELETE_ONLY] -> ABSENT
    [[PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_VALIDATED
    [[IndexName:{DescID: 104, Name: t_pkey, IndexID: 2}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
    [[PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, PUBLIC], VALIDATED] -> PUBLIC
    [[IndexName:{DescID: 104, Name: t_pkey, IndexID: 4}, PUBLIC], ABSENT] -> PUBLIC
  ops:
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 3
      TableID: 104
    *scop.MakeIndexAbsent
      IndexID: 1
      TableID: 104
    *scop.MakePublicPrimaryIndexWriteOnly
      IndexID: 2
      TableID: 104
    *scop.SetIndexName
      IndexID: 2
      Name: crdb_internal_index_2_name_placeholder
      TableID: 104
    *scop.SetIndexName
      IndexID: 4
      Name: t_pkey
      TableID: 104
    *scop.MakeValidatedPrimaryIndexPublic
      IndexID: 4
      TableID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.UpdateSchemaChangerJob
      IsNonCancelable: true
      JobID: 1
PostCommitNonRevertiblePhase stage 3 of 4 with 6 MutationType ops
  transitions:
    [[PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT], TRANSIENT_VALIDATED] -> TRANSIENT_DELETE_ONLY
    [[IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 2}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 2}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 2}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
  ops:
    *scop.MakeWriteOnlyIndexDeleteOnly
      IndexID: 2
      TableID: 104
    *scop.RemoveColumnFromIndex
      ColumnID: 3
      IndexID: 2
      Kind: 2
      TableID: 104
    *scop.RemoveColumnFromIndex
      ColumnID: 1
      IndexID: 2
      TableID: 104
    *scop.RemoveColumnFromIndex
      ColumnID: 2
      IndexID: 2
      Kind: 2
      Ordinal: 1
      TableID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.UpdateSchemaChangerJob
      IsNonCancelable: true
      JobID: 1
PostCommitNonRevertiblePhase stage 4 of 4 with 9 MutationType ops
  transitions:
    [[Column:{DescID: 104, ColumnID: 3}, ABSENT], DELETE_ONLY] -> ABSENT
    [[ColumnType:{DescID: 104, ColumnFamilyID: 0, ColumnID: 3, TypeName: INT8}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnDefaultExpression:{DescID: 104, ColumnID: 3, Expr: unique_rowid()}, ABSENT], PUBLIC] -> ABSENT
    [[IndexData:{DescID: 104, IndexID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT], TRANSIENT_DELETE_ONLY] -> TRANSIENT_ABSENT
    [[IndexData:{DescID: 104, IndexID: 2}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
    [[IndexData:{DescID: 104, IndexID: 3}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
    [[IndexData:{DescID: 104, IndexID: 5}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
  ops:
    *scop.RemoveColumnDefaultExpression
      ColumnID: 3
      TableID: 104
    *scop.CreateGCJobForIndex
      IndexID: 1
      StatementForDropJob:
        Statement: ALTER TABLE defaultdb.public.t ALTER PRIMARY KEY USING COLUMNS (k)
      TableID: 104
    *scop.MakeIndexAbsent
      IndexID: 2
      TableID: 104
    *scop.CreateGCJobForIndex
      IndexID: 2
      StatementForDropJob:
        Statement: ALTER TABLE defaultdb.public.t ALTER PRIMARY KEY USING COLUMNS (k)
      TableID: 104
    *scop.CreateGCJobForIndex
      IndexID: 3
      StatementForDropJob:
        Statement: ALTER TABLE defaultdb.public.t ALTER PRIMARY KEY USING COLUMNS (k)
      TableID: 104
    *scop.CreateGCJobForIndex
      IndexID: 5
      StatementForDropJob:
        Statement: ALTER TABLE defaultdb.public.t ALTER PRIMARY KEY USING COLUMNS (k)
      TableID: 104
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 3
      TableID: 104
    *scop.RemoveJobStateFromDescriptor
      DescriptorID: 104
      JobID: 1
    *scop.UpdateSchemaChangerJob
      DescriptorIDsToRemove:
      - 104
      IsNonCancelable: true
      JobID: 1

deps
ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (k);
----
- from: [Column:{DescID: 104, ColumnID: 3}, DELETE_ONLY]
  to:   [Column:{DescID: 104, ColumnID: 3}, ABSENT]
  kind: PreviousTransactionPrecedence
  rule: Column transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT
- from: [Column:{DescID: 104, ColumnID: 3}, PUBLIC]
  to:   [Column:{DescID: 104, ColumnID: 3}, WRITE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: Column transitions to ABSENT uphold 2-version invariant: PUBLIC->WRITE_ONLY
- from: [Column:{DescID: 104, ColumnID: 3}, WRITE_ONLY]
  to:   [Column:{DescID: 104, ColumnID: 3}, DELETE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: Column transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY
- from: [Column:{DescID: 104, ColumnID: 3}, WRITE_ONLY]
  to:   [ColumnDefaultExpression:{DescID: 104, ColumnID: 3, Expr: unique_rowid()}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 104, ColumnID: 3}, WRITE_ONLY]
  to:   [ColumnName:{DescID: 104, Name: rowid, ColumnID: 3}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 104, ColumnID: 3}, WRITE_ONLY]
  to:   [ColumnType:{DescID: 104, ColumnFamilyID: 0, ColumnID: 3, TypeName: INT8}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 104, ColumnID: 3}, WRITE_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 1}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 104, ColumnID: 3}, WRITE_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 2}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 104, ColumnID: 3}, WRITE_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 3}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 104, ColumnID: 3}, WRITE_ONLY]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, PUBLIC]
  kind: Precedence
  rule: New primary index should go public only after columns being dropped move to WRITE_ONLY
- from: [ColumnDefaultExpression:{DescID: 104, ColumnID: 3, Expr: unique_rowid()}, ABSENT]
  to:   [Column:{DescID: 104, ColumnID: 3}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnDefaultExpression:{DescID: 104, ColumnID: 3, Expr: unique_rowid()}, ABSENT]
  to:   [ColumnType:{DescID: 104, ColumnFamilyID: 0, ColumnID: 3, TypeName: INT8}, ABSENT]
  kind: SameStagePrecedence
  rule: column type dependents removed right before column type, except if part of a column type alteration 
- from: [ColumnName:{DescID: 104, Name: rowid, ColumnID: 3}, ABSENT]
  to:   [Column:{DescID: 104, ColumnID: 3}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnNotNull:{DescID: 104, ColumnID: 3, IndexID: 0}, ABSENT]
  to:   [Column:{DescID: 104, ColumnID: 3}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnNotNull:{DescID: 104, ColumnID: 3, IndexID: 0}, ABSENT]
  to:   [Column:{DescID: 104, ColumnID: 3}, WRITE_ONLY]
  kind: Precedence
  rule: column constraint removed right before column reaches write only
- from: [ColumnNotNull:{DescID: 104, ColumnID: 3, IndexID: 0}, PUBLIC]
  to:   [ColumnNotNull:{DescID: 104, ColumnID: 3, IndexID: 0}, VALIDATED]
  kind: PreviousTransactionPrecedence
  rule: ColumnNotNull transitions to ABSENT uphold 2-version invariant: PUBLIC->VALIDATED
- from: [ColumnNotNull:{DescID: 104, ColumnID: 3, IndexID: 0}, VALIDATED]
  to:   [ColumnNotNull:{DescID: 104, ColumnID: 3, IndexID: 0}, ABSENT]
  kind: PreviousTransactionPrecedence
  rule: ColumnNotNull transitions to ABSENT uphold 2-version invariant: VALIDATED->ABSENT
- from: [ColumnType:{DescID: 104, ColumnFamilyID: 0, ColumnID: 3, TypeName: INT8}, ABSENT]
  to:   [Column:{DescID: 104, ColumnID: 3}, ABSENT]
  kind: SameStagePrecedence
  rules: [dependents removed before column; column type removed right before column when not dropping relation]
- from: [IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 1}, ABSENT]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 1, ConstraintID: 1}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 2}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, BACKFILLED]
  kind: Precedence
  rule: index-column added to index before index is backfilled
- from: [IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 2}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, PUBLIC]
  kind: Precedence
  rule: index dependents exist before index becomes public
- from: [IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 2}, TRANSIENT_ABSENT]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 3}, PUBLIC]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, WRITE_ONLY]
  kind: Precedence
  rule: index-column added to index before temp index receives writes
- from: [IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 3}, TRANSIENT_ABSENT]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 4}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, BACKFILLED]
  kind: Precedence
  rule: index-column added to index before index is backfilled
- from: [IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 4}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, PUBLIC]
  kind: Precedence
  rule: index dependents exist before index becomes public
- from: [IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 5}, PUBLIC]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 5, ConstraintID: 5, SourceIndexID: 2}, WRITE_ONLY]
  kind: Precedence
  rule: index-column added to index before temp index receives writes
- from: [IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 5}, TRANSIENT_ABSENT]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 5, ConstraintID: 5, SourceIndexID: 2}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 1}, ABSENT]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 1, ConstraintID: 1}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 2}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, BACKFILLED]
  kind: Precedence
  rule: index-column added to index before index is backfilled
- from: [IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 2}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, PUBLIC]
  kind: Precedence
  rule: index dependents exist before index becomes public
- from: [IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 2}, TRANSIENT_ABSENT]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 3}, PUBLIC]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, WRITE_ONLY]
  kind: Precedence
  rule: index-column added to index before temp index receives writes
- from: [IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 3}, TRANSIENT_ABSENT]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 4}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, BACKFILLED]
  kind: Precedence
  rule: index-column added to index before index is backfilled
- from: [IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 4}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, PUBLIC]
  kind: Precedence
  rule: index dependents exist before index becomes public
- from: [IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 5}, PUBLIC]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 5, ConstraintID: 5, SourceIndexID: 2}, WRITE_ONLY]
  kind: Precedence
  rule: index-column added to index before temp index receives writes
- from: [IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 5}, TRANSIENT_ABSENT]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 5, ConstraintID: 5, SourceIndexID: 2}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 1}, ABSENT]
  to:   [Column:{DescID: 104, ColumnID: 3}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 1}, ABSENT]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 1, ConstraintID: 1}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 2}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, BACKFILLED]
  kind: Precedence
  rule: index-column added to index before index is backfilled
- from: [IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 2}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, PUBLIC]
  kind: Precedence
  rule: index dependents exist before index becomes public
- from: [IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 2}, TRANSIENT_ABSENT]
  to:   [Column:{DescID: 104, ColumnID: 3}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 2}, TRANSIENT_ABSENT]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 3}, PUBLIC]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, WRITE_ONLY]
  kind: Precedence
  rule: index-column added to index before temp index receives writes
- from: [IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 3}, TRANSIENT_ABSENT]
  to:   [Column:{DescID: 104, ColumnID: 3}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 3}, TRANSIENT_ABSENT]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexData:{DescID: 104, IndexID: 1}, DROPPED]
  to:   [IndexData:{DescID: 104, IndexID: 2}, TRANSIENT_DROPPED]
  kind: SameStagePrecedence
  rule: schedule all GC jobs for a descriptor in the same stage
- from: [IndexData:{DescID: 104, IndexID: 1}, DROPPED]
  to:   [IndexData:{DescID: 104, IndexID: 3}, TRANSIENT_DROPPED]
  kind: SameStagePrecedence
  rule: schedule all GC jobs for a descriptor in the same stage
- from: [IndexData:{DescID: 104, IndexID: 1}, DROPPED]
  to:   [IndexData:{DescID: 104, IndexID: 5}, TRANSIENT_DROPPED]
  kind: SameStagePrecedence
  rule: schedule all GC jobs for a descriptor in the same stage
- from: [IndexData:{DescID: 104, IndexID: 2}, TRANSIENT_DROPPED]
  to:   [IndexData:{DescID: 104, IndexID: 3}, TRANSIENT_DROPPED]
  kind: SameStagePrecedence
  rule: schedule all GC jobs for a descriptor in the same stage
- from: [IndexData:{DescID: 104, IndexID: 2}, TRANSIENT_DROPPED]
  to:   [IndexData:{DescID: 104, IndexID: 5}, TRANSIENT_DROPPED]
  kind: SameStagePrecedence
  rule: schedule all GC jobs for a descriptor in the same stage
- from: [IndexData:{DescID: 104, IndexID: 3}, TRANSIENT_DROPPED]
  to:   [IndexData:{DescID: 104, IndexID: 5}, TRANSIENT_DROPPED]
  kind: SameStagePrecedence
  rule: schedule all GC jobs for a descriptor in the same stage
- from: [IndexName:{DescID: 104, Name: t_pkey, IndexID: 1}, ABSENT]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 1, ConstraintID: 1}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexName:{DescID: 104, Name: t_pkey, IndexID: 2}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, PUBLIC]
  kind: SameStagePrecedence
  rules: [index dependents exist before index becomes public; primary index named right before index becomes public]
- from: [IndexName:{DescID: 104, Name: t_pkey, IndexID: 2}, TRANSIENT_ABSENT]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexName:{DescID: 104, Name: t_pkey, IndexID: 4}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, PUBLIC]
  kind: SameStagePrecedence
  rules: [index dependents exist before index becomes public; primary index named right before index becomes public]
- from: [PrimaryIndex:{DescID: 104, IndexID: 1, ConstraintID: 1}, ABSENT]
  to:   [Column:{DescID: 104, ColumnID: 3}, ABSENT]
  kind: Precedence
  rule: indexes containing column reach absent before column
- from: [PrimaryIndex:{DescID: 104, IndexID: 1, ConstraintID: 1}, ABSENT]
  to:   [IndexData:{DescID: 104, IndexID: 1}, DROPPED]
  kind: Precedence
  rule: index removed before garbage collection
- from: [PrimaryIndex:{DescID: 104, IndexID: 1, ConstraintID: 1}, ABSENT]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, PUBLIC]
  kind: Precedence
  rule: old index absent before new index public when swapping with transient
- from: [PrimaryIndex:{DescID: 104, IndexID: 1, ConstraintID: 1}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 1}, ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [PrimaryIndex:{DescID: 104, IndexID: 1, ConstraintID: 1}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 1}, ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [PrimaryIndex:{DescID: 104, IndexID: 1, ConstraintID: 1}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 1}, ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [PrimaryIndex:{DescID: 104, IndexID: 1, ConstraintID: 1}, DELETE_ONLY]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 1, ConstraintID: 1}, ABSENT]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT
- from: [PrimaryIndex:{DescID: 104, IndexID: 1, ConstraintID: 1}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 1, ConstraintID: 1}, VALIDATED]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to ABSENT uphold 2-version invariant: PUBLIC->VALIDATED
- from: [PrimaryIndex:{DescID: 104, IndexID: 1, ConstraintID: 1}, VALIDATED]
  to:   [IndexName:{DescID: 104, Name: t_pkey, IndexID: 1}, ABSENT]
  kind: Precedence
  rule: index no longer public before dependents, excluding columns
- from: [PrimaryIndex:{DescID: 104, IndexID: 1, ConstraintID: 1}, VALIDATED]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 1, ConstraintID: 1}, WRITE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to ABSENT uphold 2-version invariant: VALIDATED->WRITE_ONLY
- from: [PrimaryIndex:{DescID: 104, IndexID: 1, ConstraintID: 1}, VALIDATED]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, PUBLIC]
  kind: SameStagePrecedence
  rule: primary index swap
- from: [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, ABSENT]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, BACKFILL_ONLY]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: ABSENT->BACKFILL_ONLY
- from: [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, BACKFILLED]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, DELETE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: BACKFILLED->DELETE_ONLY
- from: [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, BACKFILL_ONLY]
  to:   [Column:{DescID: 104, ColumnID: 3}, WRITE_ONLY]
  kind: Precedence
  rule: all adding indexes reached BACKFILL_ONLY before any of their columns disappear
- from: [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, BACKFILL_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 2}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, BACKFILL_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 2}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, BACKFILL_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 2}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, BACKFILL_ONLY]
  to:   [IndexData:{DescID: 104, IndexID: 2}, PUBLIC]
  kind: SameStagePrecedence
  rule: index data exists as soon as index accepts backfills
- from: [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, BACKFILL_ONLY]
  to:   [IndexName:{DescID: 104, Name: t_pkey, IndexID: 2}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, BACKFILL_ONLY]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, BACKFILLED]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: BACKFILL_ONLY->BACKFILLED
- from: [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, DELETE_ONLY]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, MERGE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: DELETE_ONLY->MERGE_ONLY
- from: [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, MERGED]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, WRITE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: MERGED->WRITE_ONLY
- from: [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, MERGED]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  kind: Precedence
  rule: index is MERGED before its temp index starts to disappear
- from: [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, MERGE_ONLY]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, MERGED]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: MERGE_ONLY->MERGED
- from: [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_VALIDATED]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: PUBLIC->TRANSIENT_VALIDATED
- from: [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, PUBLIC]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 5, ConstraintID: 5, SourceIndexID: 2}, DELETE_ONLY]
  kind: Precedence
  rule: primary index with new columns should exist before temp indexes
- from: [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT]
  to:   [Column:{DescID: 104, ColumnID: 3}, ABSENT]
  kind: Precedence
  rule: indexes containing column reach absent before column
- from: [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT]
  to:   [IndexData:{DescID: 104, IndexID: 2}, TRANSIENT_DROPPED]
  kind: Precedence
  rule: index removed before garbage collection
- from: [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 2}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 2}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 2}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_DELETE_ONLY->TRANSIENT_ABSENT
- from: [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_VALIDATED]
  to:   [IndexName:{DescID: 104, Name: t_pkey, IndexID: 2}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: index no longer public before dependents, excluding columns
- from: [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_VALIDATED]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_WRITE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_VALIDATED->TRANSIENT_WRITE_ONLY
- from: [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, TRANSIENT_VALIDATED]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, PUBLIC]
  kind: SameStagePrecedence
  rule: primary index swap
- from: [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, VALIDATED]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, PUBLIC]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: VALIDATED->PUBLIC
- from: [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, WRITE_ONLY]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, VALIDATED]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: WRITE_ONLY->VALIDATED
- from: [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, ABSENT]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, BACKFILL_ONLY]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: ABSENT->BACKFILL_ONLY
- from: [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, BACKFILLED]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, DELETE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: BACKFILLED->DELETE_ONLY
- from: [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, BACKFILL_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 4}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, BACKFILL_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 4}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, BACKFILL_ONLY]
  to:   [IndexData:{DescID: 104, IndexID: 4}, PUBLIC]
  kind: SameStagePrecedence
  rule: index data exists as soon as index accepts backfills
- from: [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, BACKFILL_ONLY]
  to:   [IndexName:{DescID: 104, Name: t_pkey, IndexID: 4}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, BACKFILL_ONLY]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, BACKFILLED]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: BACKFILL_ONLY->BACKFILLED
- from: [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, DELETE_ONLY]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, MERGE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: DELETE_ONLY->MERGE_ONLY
- from: [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, MERGED]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, WRITE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: MERGED->WRITE_ONLY
- from: [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, MERGED]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 5, ConstraintID: 5, SourceIndexID: 2}, TRANSIENT_DELETE_ONLY]
  kind: Precedence
  rule: index is MERGED before its temp index starts to disappear
- from: [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, MERGE_ONLY]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, MERGED]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: MERGE_ONLY->MERGED
- from: [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, VALIDATED]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, PUBLIC]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: VALIDATED->PUBLIC
- from: [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, WRITE_ONLY]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, VALIDATED]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: WRITE_ONLY->VALIDATED
- from: [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, ABSENT]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, DELETE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: ABSENT->DELETE_ONLY
- from: [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 3}, PUBLIC]
  kind: Precedence
  rule: temp index existence precedes index dependents
- from: [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 3}, PUBLIC]
  kind: Precedence
  rule: temp index existence precedes index dependents
- from: [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 3}, PUBLIC]
  kind: Precedence
  rule: temp index existence precedes index dependents
- from: [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, DELETE_ONLY]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, WRITE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: DELETE_ONLY->WRITE_ONLY
- from: [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT]
  to:   [IndexData:{DescID: 104, IndexID: 3}, TRANSIENT_DROPPED]
  kind: Precedence
  rule: index removed before garbage collection
- from: [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 3}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 3}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 3}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, WRITE_ONLY]
  kind: Precedence
  rule: temp index disappeared before its master index reaches WRITE_ONLY
- from: [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: PreviousTransactionPrecedence
  rule: TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_DELETE_ONLY->TRANSIENT_ABSENT
- from: [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, WRITE_ONLY]
  to:   [IndexData:{DescID: 104, IndexID: 3}, PUBLIC]
  kind: SameStagePrecedence
  rule: temp index data exists as soon as temp index accepts writes
- from: [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, WRITE_ONLY]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1}, BACKFILLED]
  kind: Precedence
  rule: temp index is WRITE_ONLY before backfill
- from: [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, WRITE_ONLY]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 3, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: WRITE_ONLY->TRANSIENT_DELETE_ONLY
- from: [TemporaryIndex:{DescID: 104, IndexID: 5, ConstraintID: 5, SourceIndexID: 2}, ABSENT]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 5, ConstraintID: 5, SourceIndexID: 2}, DELETE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: ABSENT->DELETE_ONLY
- from: [TemporaryIndex:{DescID: 104, IndexID: 5, ConstraintID: 5, SourceIndexID: 2}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 5}, PUBLIC]
  kind: Precedence
  rule: temp index existence precedes index dependents
- from: [TemporaryIndex:{DescID: 104, IndexID: 5, ConstraintID: 5, SourceIndexID: 2}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 5}, PUBLIC]
  kind: Precedence
  rule: temp index existence precedes index dependents
- from: [TemporaryIndex:{DescID: 104, IndexID: 5, ConstraintID: 5, SourceIndexID: 2}, DELETE_ONLY]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 5, ConstraintID: 5, SourceIndexID: 2}, WRITE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: DELETE_ONLY->WRITE_ONLY
- from: [TemporaryIndex:{DescID: 104, IndexID: 5, ConstraintID: 5, SourceIndexID: 2}, TRANSIENT_ABSENT]
  to:   [IndexData:{DescID: 104, IndexID: 5}, TRANSIENT_DROPPED]
  kind: Precedence
  rule: index removed before garbage collection
- from: [TemporaryIndex:{DescID: 104, IndexID: 5, ConstraintID: 5, SourceIndexID: 2}, TRANSIENT_DELETE_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 5}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [TemporaryIndex:{DescID: 104, IndexID: 5, ConstraintID: 5, SourceIndexID: 2}, TRANSIENT_DELETE_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 5}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [TemporaryIndex:{DescID: 104, IndexID: 5, ConstraintID: 5, SourceIndexID: 2}, TRANSIENT_DELETE_ONLY]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, WRITE_ONLY]
  kind: Precedence
  rule: temp index disappeared before its master index reaches WRITE_ONLY
- from: [TemporaryIndex:{DescID: 104, IndexID: 5, ConstraintID: 5, SourceIndexID: 2}, TRANSIENT_DELETE_ONLY]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 5, ConstraintID: 5, SourceIndexID: 2}, TRANSIENT_ABSENT]
  kind: PreviousTransactionPrecedence
  rule: TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_DELETE_ONLY->TRANSIENT_ABSENT
- from: [TemporaryIndex:{DescID: 104, IndexID: 5, ConstraintID: 5, SourceIndexID: 2}, WRITE_ONLY]
  to:   [IndexData:{DescID: 104, IndexID: 5}, PUBLIC]
  kind: SameStagePrecedence
  rule: temp index data exists as soon as temp index accepts writes
- from: [TemporaryIndex:{DescID: 104, IndexID: 5, ConstraintID: 5, SourceIndexID: 2}, WRITE_ONLY]
  to:   [PrimaryIndex:{DescID: 104, IndexID: 4, ConstraintID: 4, TemporaryIndexID: 5, SourceIndexID: 2}, BACKFILLED]
  kind: Precedence
  rule: temp index is WRITE_ONLY before backfill
- from: [TemporaryIndex:{DescID: 104, IndexID: 5, ConstraintID: 5, SourceIndexID: 2}, WRITE_ONLY]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 5, ConstraintID: 5, SourceIndexID: 2}, TRANSIENT_DELETE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: WRITE_ONLY->TRANSIENT_DELETE_ONLY
