setup
CREATE TABLE defaultdb.t1 (id INT PRIMARY KEY, name varchar(256), money int)
----

ops
CREATE INDEX id1 ON defaultdb.t1 (id, name) STORING (money)
----
StatementPhase stage 1 of 1 with 9 MutationType ops
  transitions:
    [[SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC], ABSENT] -> BACKFILL_ONLY
    [[IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 2}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 2}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 2}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexData:{DescID: 104, IndexID: 2}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexName:{DescID: 104, Name: id1, IndexID: 2}, PUBLIC], ABSENT] -> PUBLIC
    [[TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, SourceIndexID: 1}, TRANSIENT_ABSENT], ABSENT] -> DELETE_ONLY
    [[IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 3}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 3}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 3}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
  ops:
    *scop.MakeAbsentIndexBackfilling
      Index:
        IndexID: 2
        SourceIndexID: 1
        TableID: 104
        TemporaryIndexID: 3
      IsSecondaryIndex: true
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 2
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 2
      IndexID: 2
      Ordinal: 1
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 3
      IndexID: 2
      Kind: 2
      TableID: 104
    *scop.SetIndexName
      IndexID: 2
      Name: id1
      TableID: 104
    *scop.MakeAbsentTempIndexDeleteOnly
      Index:
        ConstraintID: 1
        IndexID: 3
        SourceIndexID: 1
        TableID: 104
      IsSecondaryIndex: true
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 3
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 2
      IndexID: 3
      Ordinal: 1
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 3
      IndexID: 3
      Kind: 2
      TableID: 104
PreCommitPhase stage 1 of 2 with 1 MutationType op
  transitions:
    [[SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC], BACKFILL_ONLY] -> ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 2}, PUBLIC], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 2}, PUBLIC], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 2}, PUBLIC], PUBLIC] -> ABSENT
    [[IndexData:{DescID: 104, IndexID: 2}, PUBLIC], PUBLIC] -> ABSENT
    [[IndexName:{DescID: 104, Name: id1, IndexID: 2}, PUBLIC], PUBLIC] -> ABSENT
    [[TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, SourceIndexID: 1}, TRANSIENT_ABSENT], DELETE_ONLY] -> ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 3}, TRANSIENT_ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 3}, TRANSIENT_ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 3}, TRANSIENT_ABSENT], PUBLIC] -> ABSENT
  ops:
    *scop.UndoAllInTxnImmediateMutationOpSideEffects
      {}
PreCommitPhase stage 2 of 2 with 13 MutationType ops
  transitions:
    [[SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC], ABSENT] -> BACKFILL_ONLY
    [[IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 2}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 2}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 2}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexData:{DescID: 104, IndexID: 2}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexName:{DescID: 104, Name: id1, IndexID: 2}, PUBLIC], ABSENT] -> PUBLIC
    [[TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, SourceIndexID: 1}, TRANSIENT_ABSENT], ABSENT] -> DELETE_ONLY
    [[IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 3}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 3}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 3}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
  ops:
    *scop.MakeAbsentIndexBackfilling
      Index:
        IndexID: 2
        SourceIndexID: 1
        TableID: 104
        TemporaryIndexID: 3
      IsSecondaryIndex: true
    *scop.MaybeAddSplitForIndex
      IndexID: 2
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 2
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 2
      IndexID: 2
      Ordinal: 1
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 3
      IndexID: 2
      Kind: 2
      TableID: 104
    *scop.SetIndexName
      IndexID: 2
      Name: id1
      TableID: 104
    *scop.MakeAbsentTempIndexDeleteOnly
      Index:
        ConstraintID: 1
        IndexID: 3
        SourceIndexID: 1
        TableID: 104
      IsSecondaryIndex: true
    *scop.MaybeAddSplitForIndex
      IndexID: 3
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 3
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 2
      IndexID: 3
      Ordinal: 1
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 3
      IndexID: 3
      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 7 with 1 MutationType op pending
      Statements:
      - statement: CREATE INDEX id1 ON defaultdb.t1 (id, name) STORING (money)
        redactedstatement: CREATE INDEX ‹id1› ON ‹defaultdb›.public.‹t1› (‹id›, ‹name›) STORING (‹money›)
        statementtag: CREATE INDEX
PostCommitPhase stage 1 of 7 with 3 MutationType ops
  transitions:
    [[TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, 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 7 with 1 BackfillType op
  transitions:
    [[SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC], BACKFILL_ONLY] -> BACKFILLED
  ops:
    *scop.BackfillIndex
      IndexID: 2
      SourceIndexID: 1
      TableID: 104
PostCommitPhase stage 3 of 7 with 3 MutationType ops
  transitions:
    [[SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC], BACKFILLED] -> DELETE_ONLY
  ops:
    *scop.MakeBackfillingIndexDeleteOnly
      IndexID: 2
      TableID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.UpdateSchemaChangerJob
      JobID: 1
PostCommitPhase stage 4 of 7 with 3 MutationType ops
  transitions:
    [[SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC], DELETE_ONLY] -> MERGE_ONLY
  ops:
    *scop.MakeBackfilledIndexMerging
      IndexID: 2
      TableID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.UpdateSchemaChangerJob
      JobID: 1
PostCommitPhase stage 5 of 7 with 1 BackfillType op
  transitions:
    [[SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC], MERGE_ONLY] -> MERGED
  ops:
    *scop.MergeIndex
      BackfilledIndexID: 2
      TableID: 104
      TemporaryIndexID: 3
PostCommitPhase stage 6 of 7 with 4 MutationType ops
  transitions:
    [[SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC], MERGED] -> WRITE_ONLY
    [[TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, 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 7 with 1 ValidationType op
  transitions:
    [[SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC], WRITE_ONLY] -> VALIDATED
  ops:
    *scop.ValidateIndex
      IndexID: 2
      TableID: 104
PostCommitNonRevertiblePhase stage 1 of 1 with 9 MutationType ops
  transitions:
    [[SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC], VALIDATED] -> PUBLIC
    [[TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, SourceIndexID: 1}, TRANSIENT_ABSENT], TRANSIENT_DELETE_ONLY] -> 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
    [[IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 3}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
    [[IndexData:{DescID: 104, IndexID: 3}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
  ops:
    *scop.MakeValidatedSecondaryIndexPublic
      IndexID: 2
      TableID: 104
    *scop.RefreshStats
      TableID: 104
    *scop.RemoveColumnFromIndex
      ColumnID: 1
      IndexID: 3
      TableID: 104
    *scop.RemoveColumnFromIndex
      ColumnID: 2
      IndexID: 3
      Ordinal: 1
      TableID: 104
    *scop.RemoveColumnFromIndex
      ColumnID: 3
      IndexID: 3
      Kind: 2
      TableID: 104
    *scop.MakeIndexAbsent
      IndexID: 3
      TableID: 104
    *scop.CreateGCJobForIndex
      IndexID: 3
      StatementForDropJob:
        Statement: CREATE INDEX id1 ON defaultdb.public.t1 (id, name) STORING (money)
      TableID: 104
    *scop.RemoveJobStateFromDescriptor
      DescriptorID: 104
      JobID: 1
    *scop.UpdateSchemaChangerJob
      DescriptorIDsToRemove:
      - 104
      IsNonCancelable: true
      JobID: 1

deps
CREATE INDEX id1 ON defaultdb.t1 (id, name) STORING (money)
----
- from: [IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 2}, PUBLIC]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, BACKFILLED]
  kind: Precedence
  rule: index-column added to index before index is backfilled
- from: [IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 2}, PUBLIC]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC]
  kind: Precedence
  rule: index dependents exist before index becomes public
- from: [IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 3}, PUBLIC]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, 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: 1, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 2}, PUBLIC]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, BACKFILLED]
  kind: Precedence
  rule: index-column added to index before index is backfilled
- from: [IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 2}, PUBLIC]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC]
  kind: Precedence
  rule: index dependents exist before index becomes public
- from: [IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 3}, PUBLIC]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, 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: 1, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 2}, PUBLIC]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, BACKFILLED]
  kind: Precedence
  rule: index-column added to index before index is backfilled
- from: [IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 2}, PUBLIC]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC]
  kind: Precedence
  rule: index dependents exist before index becomes public
- from: [IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 3}, PUBLIC]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, 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:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexName:{DescID: 104, Name: id1, IndexID: 2}, PUBLIC]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC]
  kind: Precedence
  rule: index dependents exist before index becomes public
- from: [IndexName:{DescID: 104, Name: id1, IndexID: 2}, PUBLIC]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, VALIDATED]
  kind: Precedence
  rule: secondary index named before validation (without index swap)
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, ABSENT]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, BACKFILL_ONLY]
  kind: PreviousTransactionPrecedence
  rule: SecondaryIndex transitions to PUBLIC uphold 2-version invariant: ABSENT->BACKFILL_ONLY
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, BACKFILLED]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, DELETE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: SecondaryIndex transitions to PUBLIC uphold 2-version invariant: BACKFILLED->DELETE_ONLY
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, BACKFILL_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 2}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, BACKFILL_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 2}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, BACKFILL_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 2}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, BACKFILL_ONLY]
  to:   [IndexData:{DescID: 104, IndexID: 2}, PUBLIC]
  kind: SameStagePrecedence
  rule: index data exists as soon as index accepts backfills
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, BACKFILL_ONLY]
  to:   [IndexName:{DescID: 104, Name: id1, IndexID: 2}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, BACKFILL_ONLY]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, BACKFILLED]
  kind: PreviousTransactionPrecedence
  rule: SecondaryIndex transitions to PUBLIC uphold 2-version invariant: BACKFILL_ONLY->BACKFILLED
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, DELETE_ONLY]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, MERGE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: SecondaryIndex transitions to PUBLIC uphold 2-version invariant: DELETE_ONLY->MERGE_ONLY
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, MERGED]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, WRITE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: SecondaryIndex transitions to PUBLIC uphold 2-version invariant: MERGED->WRITE_ONLY
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, MERGED]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  kind: Precedence
  rule: index is MERGED before its temp index starts to disappear
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, MERGE_ONLY]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, MERGED]
  kind: PreviousTransactionPrecedence
  rule: SecondaryIndex transitions to PUBLIC uphold 2-version invariant: MERGE_ONLY->MERGED
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, VALIDATED]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC]
  kind: PreviousTransactionPrecedence
  rule: SecondaryIndex transitions to PUBLIC uphold 2-version invariant: VALIDATED->PUBLIC
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, WRITE_ONLY]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, VALIDATED]
  kind: PreviousTransactionPrecedence
  rule: SecondaryIndex transitions to PUBLIC uphold 2-version invariant: WRITE_ONLY->VALIDATED
- from: [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, SourceIndexID: 1}, ABSENT]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, 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: 1, 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: 1, 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: 1, 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: 1, SourceIndexID: 1}, DELETE_ONLY]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, 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: 1, 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: 1, 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: 1, 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: 1, 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: 1, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, WRITE_ONLY]
  kind: Precedence
  rule: temp index disappeared before its master index reaches WRITE_ONLY
- from: [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, 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: 1, 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: 1, SourceIndexID: 1}, WRITE_ONLY]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, BACKFILLED]
  kind: Precedence
  rule: temp index is WRITE_ONLY before backfill
- from: [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, SourceIndexID: 1}, WRITE_ONLY]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: WRITE_ONLY->TRANSIENT_DELETE_ONLY

ops
CREATE INVERTED INDEX CONCURRENTLY id1 ON defaultdb.t1 (id, name gin_trgm_ops)
----
StatementPhase stage 1 of 1 with 7 MutationType ops
  transitions:
    [[SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC], ABSENT] -> BACKFILL_ONLY
    [[IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 2}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 2}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexData:{DescID: 104, IndexID: 2}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexName:{DescID: 104, Name: id1, IndexID: 2}, PUBLIC], ABSENT] -> PUBLIC
    [[TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, SourceIndexID: 1}, TRANSIENT_ABSENT], ABSENT] -> DELETE_ONLY
    [[IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 3}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 3}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
  ops:
    *scop.MakeAbsentIndexBackfilling
      Index:
        IndexID: 2
        IsConcurrently: true
        IsInverted: true
        SourceIndexID: 1
        TableID: 104
        TemporaryIndexID: 3
      IsSecondaryIndex: true
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 2
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 2
      IndexID: 2
      InvertedKind: 1
      Ordinal: 1
      TableID: 104
    *scop.SetIndexName
      IndexID: 2
      Name: id1
      TableID: 104
    *scop.MakeAbsentTempIndexDeleteOnly
      Index:
        ConstraintID: 1
        IndexID: 3
        IsConcurrently: true
        IsInverted: true
        SourceIndexID: 1
        TableID: 104
      IsSecondaryIndex: true
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 3
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 2
      IndexID: 3
      InvertedKind: 1
      Ordinal: 1
      TableID: 104
PreCommitPhase stage 1 of 2 with 1 MutationType op
  transitions:
    [[SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC], BACKFILL_ONLY] -> ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 2}, PUBLIC], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 2}, PUBLIC], PUBLIC] -> ABSENT
    [[IndexData:{DescID: 104, IndexID: 2}, PUBLIC], PUBLIC] -> ABSENT
    [[IndexName:{DescID: 104, Name: id1, IndexID: 2}, PUBLIC], PUBLIC] -> ABSENT
    [[TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, SourceIndexID: 1}, TRANSIENT_ABSENT], DELETE_ONLY] -> ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 3}, TRANSIENT_ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 3}, TRANSIENT_ABSENT], PUBLIC] -> ABSENT
  ops:
    *scop.UndoAllInTxnImmediateMutationOpSideEffects
      {}
PreCommitPhase stage 2 of 2 with 11 MutationType ops
  transitions:
    [[SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC], ABSENT] -> BACKFILL_ONLY
    [[IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 2}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 2}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexData:{DescID: 104, IndexID: 2}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexName:{DescID: 104, Name: id1, IndexID: 2}, PUBLIC], ABSENT] -> PUBLIC
    [[TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, SourceIndexID: 1}, TRANSIENT_ABSENT], ABSENT] -> DELETE_ONLY
    [[IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 3}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 3}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
  ops:
    *scop.MakeAbsentIndexBackfilling
      Index:
        IndexID: 2
        IsConcurrently: true
        IsInverted: true
        SourceIndexID: 1
        TableID: 104
        TemporaryIndexID: 3
      IsSecondaryIndex: true
    *scop.MaybeAddSplitForIndex
      IndexID: 2
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 2
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 2
      IndexID: 2
      InvertedKind: 1
      Ordinal: 1
      TableID: 104
    *scop.SetIndexName
      IndexID: 2
      Name: id1
      TableID: 104
    *scop.MakeAbsentTempIndexDeleteOnly
      Index:
        ConstraintID: 1
        IndexID: 3
        IsConcurrently: true
        IsInverted: true
        SourceIndexID: 1
        TableID: 104
      IsSecondaryIndex: true
    *scop.MaybeAddSplitForIndex
      IndexID: 3
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 3
      TableID: 104
    *scop.AddColumnToIndex
      ColumnID: 2
      IndexID: 3
      InvertedKind: 1
      Ordinal: 1
      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 7 with 1 MutationType op pending
      Statements:
      - statement: CREATE INVERTED INDEX CONCURRENTLY id1 ON defaultdb.t1 (id, name gin_trgm_ops)
        redactedstatement: CREATE INVERTED INDEX CONCURRENTLY ‹id1› ON ‹defaultdb›.public.‹t1› (‹id›, ‹name› gin_trgm_ops)
        statementtag: CREATE INDEX
PostCommitPhase stage 1 of 7 with 3 MutationType ops
  transitions:
    [[TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, 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 7 with 1 BackfillType op
  transitions:
    [[SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC], BACKFILL_ONLY] -> BACKFILLED
  ops:
    *scop.BackfillIndex
      IndexID: 2
      SourceIndexID: 1
      TableID: 104
PostCommitPhase stage 3 of 7 with 3 MutationType ops
  transitions:
    [[SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC], BACKFILLED] -> DELETE_ONLY
  ops:
    *scop.MakeBackfillingIndexDeleteOnly
      IndexID: 2
      TableID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.UpdateSchemaChangerJob
      JobID: 1
PostCommitPhase stage 4 of 7 with 3 MutationType ops
  transitions:
    [[SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC], DELETE_ONLY] -> MERGE_ONLY
  ops:
    *scop.MakeBackfilledIndexMerging
      IndexID: 2
      TableID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.UpdateSchemaChangerJob
      JobID: 1
PostCommitPhase stage 5 of 7 with 1 BackfillType op
  transitions:
    [[SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC], MERGE_ONLY] -> MERGED
  ops:
    *scop.MergeIndex
      BackfilledIndexID: 2
      TableID: 104
      TemporaryIndexID: 3
PostCommitPhase stage 6 of 7 with 4 MutationType ops
  transitions:
    [[SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC], MERGED] -> WRITE_ONLY
    [[TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, 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 7 with 1 ValidationType op
  transitions:
    [[SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC], WRITE_ONLY] -> VALIDATED
  ops:
    *scop.ValidateIndex
      IndexID: 2
      TableID: 104
PostCommitNonRevertiblePhase stage 1 of 1 with 8 MutationType ops
  transitions:
    [[SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC], VALIDATED] -> PUBLIC
    [[TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, SourceIndexID: 1}, TRANSIENT_ABSENT], TRANSIENT_DELETE_ONLY] -> 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
    [[IndexData:{DescID: 104, IndexID: 3}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
  ops:
    *scop.MakeValidatedSecondaryIndexPublic
      IndexID: 2
      TableID: 104
    *scop.RefreshStats
      TableID: 104
    *scop.RemoveColumnFromIndex
      ColumnID: 1
      IndexID: 3
      TableID: 104
    *scop.RemoveColumnFromIndex
      ColumnID: 2
      IndexID: 3
      Ordinal: 1
      TableID: 104
    *scop.MakeIndexAbsent
      IndexID: 3
      TableID: 104
    *scop.CreateGCJobForIndex
      IndexID: 3
      StatementForDropJob:
        Statement: CREATE INVERTED INDEX CONCURRENTLY id1 ON defaultdb.public.t1 (id, name gin_trgm_ops)
      TableID: 104
    *scop.RemoveJobStateFromDescriptor
      DescriptorID: 104
      JobID: 1
    *scop.UpdateSchemaChangerJob
      DescriptorIDsToRemove:
      - 104
      IsNonCancelable: true
      JobID: 1

deps
CREATE INDEX id1 ON defaultdb.t1 (id, name) STORING (money)
----
- from: [IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 2}, PUBLIC]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, BACKFILLED]
  kind: Precedence
  rule: index-column added to index before index is backfilled
- from: [IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 2}, PUBLIC]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC]
  kind: Precedence
  rule: index dependents exist before index becomes public
- from: [IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 3}, PUBLIC]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, 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: 1, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 2}, PUBLIC]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, BACKFILLED]
  kind: Precedence
  rule: index-column added to index before index is backfilled
- from: [IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 2}, PUBLIC]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC]
  kind: Precedence
  rule: index dependents exist before index becomes public
- from: [IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 3}, PUBLIC]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, 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: 1, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 2}, PUBLIC]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, BACKFILLED]
  kind: Precedence
  rule: index-column added to index before index is backfilled
- from: [IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 2}, PUBLIC]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC]
  kind: Precedence
  rule: index dependents exist before index becomes public
- from: [IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 3}, PUBLIC]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, 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:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexName:{DescID: 104, Name: id1, IndexID: 2}, PUBLIC]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC]
  kind: Precedence
  rule: index dependents exist before index becomes public
- from: [IndexName:{DescID: 104, Name: id1, IndexID: 2}, PUBLIC]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, VALIDATED]
  kind: Precedence
  rule: secondary index named before validation (without index swap)
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, ABSENT]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, BACKFILL_ONLY]
  kind: PreviousTransactionPrecedence
  rule: SecondaryIndex transitions to PUBLIC uphold 2-version invariant: ABSENT->BACKFILL_ONLY
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, BACKFILLED]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, DELETE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: SecondaryIndex transitions to PUBLIC uphold 2-version invariant: BACKFILLED->DELETE_ONLY
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, BACKFILL_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 1, IndexID: 2}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, BACKFILL_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 2, IndexID: 2}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, BACKFILL_ONLY]
  to:   [IndexColumn:{DescID: 104, ColumnID: 3, IndexID: 2}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, BACKFILL_ONLY]
  to:   [IndexData:{DescID: 104, IndexID: 2}, PUBLIC]
  kind: SameStagePrecedence
  rule: index data exists as soon as index accepts backfills
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, BACKFILL_ONLY]
  to:   [IndexName:{DescID: 104, Name: id1, IndexID: 2}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, BACKFILL_ONLY]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, BACKFILLED]
  kind: PreviousTransactionPrecedence
  rule: SecondaryIndex transitions to PUBLIC uphold 2-version invariant: BACKFILL_ONLY->BACKFILLED
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, DELETE_ONLY]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, MERGE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: SecondaryIndex transitions to PUBLIC uphold 2-version invariant: DELETE_ONLY->MERGE_ONLY
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, MERGED]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, WRITE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: SecondaryIndex transitions to PUBLIC uphold 2-version invariant: MERGED->WRITE_ONLY
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, MERGED]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  kind: Precedence
  rule: index is MERGED before its temp index starts to disappear
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, MERGE_ONLY]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, MERGED]
  kind: PreviousTransactionPrecedence
  rule: SecondaryIndex transitions to PUBLIC uphold 2-version invariant: MERGE_ONLY->MERGED
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, VALIDATED]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, PUBLIC]
  kind: PreviousTransactionPrecedence
  rule: SecondaryIndex transitions to PUBLIC uphold 2-version invariant: VALIDATED->PUBLIC
- from: [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, WRITE_ONLY]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, VALIDATED]
  kind: PreviousTransactionPrecedence
  rule: SecondaryIndex transitions to PUBLIC uphold 2-version invariant: WRITE_ONLY->VALIDATED
- from: [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, SourceIndexID: 1}, ABSENT]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, 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: 1, 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: 1, 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: 1, 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: 1, SourceIndexID: 1}, DELETE_ONLY]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, 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: 1, 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: 1, 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: 1, 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: 1, 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: 1, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, WRITE_ONLY]
  kind: Precedence
  rule: temp index disappeared before its master index reaches WRITE_ONLY
- from: [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, 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: 1, 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: 1, SourceIndexID: 1}, WRITE_ONLY]
  to:   [SecondaryIndex:{DescID: 104, IndexID: 2, ConstraintID: 0, TemporaryIndexID: 3, SourceIndexID: 1, RecreateSourceIndexID: 0}, BACKFILLED]
  kind: Precedence
  rule: temp index is WRITE_ONLY before backfill
- from: [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, SourceIndexID: 1}, WRITE_ONLY]
  to:   [TemporaryIndex:{DescID: 104, IndexID: 3, ConstraintID: 1, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: WRITE_ONLY->TRANSIENT_DELETE_ONLY
