setup
CREATE TYPE defaultdb.footyp AS ENUM('a');
CREATE SEQUENCE defaultdb.fooseq;
CREATE TABLE defaultdb.foo (
  k INT PRIMARY KEY,
  v1 defaultdb.footyp,
  v2 INT NOT NULL DEFAULT (nextval('defaultdb.fooseq')),
  UNIQUE INDEX (v2) STORING (v1)
);
CREATE VIEW defaultdb.fooview AS SELECT k, v1, v2 FROM defaultdb.foo;
CREATE FUNCTION f1() RETURNS INT LANGUAGE SQL AS $$ SELECT 1 $$;
ALTER TABLE foo ADD COLUMN udfcol INT;
ALTER TABLE foo ALTER COLUMN udfcol SET DEFAULT f1();
SET sql_safe_updates = false;
----

ops
ALTER TABLE defaultdb.foo DROP COLUMN v1 CASCADE;
----
StatementPhase stage 1 of 1 with 49 MutationType ops
  transitions:
    [[Column:{DescID: 107, ColumnID: 2}, ABSENT], PUBLIC] -> WRITE_ONLY
    [[ColumnName:{DescID: 107, Name: v1, ColumnID: 2}, ABSENT], PUBLIC] -> ABSENT
    [[SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, ABSENT], PUBLIC] -> VALIDATED
    [[Namespace:{DescID: 108, Name: fooview, ReferencedDescID: 100}, ABSENT], PUBLIC] -> ABSENT
    [[Owner:{DescID: 108}, ABSENT], PUBLIC] -> ABSENT
    [[UserPrivileges:{DescID: 108, Name: admin}, ABSENT], PUBLIC] -> ABSENT
    [[UserPrivileges:{DescID: 108, Name: root}, ABSENT], PUBLIC] -> ABSENT
    [[View:{DescID: 108}, ABSENT], PUBLIC] -> DROPPED
    [[SchemaChild:{DescID: 108, ReferencedDescID: 101}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: k, ColumnID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 1, TypeName: INT8}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 2}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: v1, ColumnID: 2}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ReferencedTypeIDs: [104 105], ColumnFamilyID: 0, ColumnID: 2, TypeName: public.footyp}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 3}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: v2, ColumnID: 3}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 3, TypeName: INT8}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 4294967295}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: crdb_internal_mvcc_timestamp, ColumnID: 4294967295}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967295, TypeName: DECIMAL}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 4294967294}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: tableoid, ColumnID: 4294967294}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967294, TypeName: OID}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 4294967293}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: crdb_internal_origin_id, ColumnID: 4294967293}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967293, TypeName: INT4}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 4294967292}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: crdb_internal_origin_timestamp, ColumnID: 4294967292}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967292, TypeName: DECIMAL}, ABSENT], PUBLIC] -> ABSENT
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], ABSENT] -> BACKFILL_ONLY
    [[IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexData:{DescID: 107, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT], ABSENT] -> DELETE_ONLY
    [[IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 4}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 4}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 4}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
  ops:
    *scop.MakePublicColumnWriteOnly
      ColumnID: 2
      TableID: 107
    *scop.SetColumnName
      ColumnID: 2
      Name: crdb_internal_column_2_name_placeholder
      TableID: 107
    *scop.MakePublicSecondaryIndexWriteOnly
      IndexID: 2
      TableID: 107
    *scop.MarkDescriptorAsDropped
      DescriptorID: 108
    *scop.RemoveBackReferenceInTypes
      BackReferencedDescriptorID: 108
      TypeIDs:
      - 104
    *scop.RemoveBackReferencesInRelations
      BackReferencedID: 108
      RelationIDs:
      - 107
    *scop.RemoveObjectParent
      ObjectID: 108
      ParentSchemaID: 101
    *scop.MakePublicColumnWriteOnly
      ColumnID: 1
      TableID: 108
    *scop.SetColumnName
      ColumnID: 1
      Name: crdb_internal_column_1_name_placeholder
      TableID: 108
    *scop.MakePublicColumnWriteOnly
      ColumnID: 2
      TableID: 108
    *scop.SetColumnName
      ColumnID: 2
      Name: crdb_internal_column_2_name_placeholder
      TableID: 108
    *scop.RemoveDroppedColumnType
      ColumnID: 2
      TableID: 108
    *scop.UpdateTableBackReferencesInTypes
      BackReferencedTableID: 108
      TypeIDs:
      - 104
      - 105
    *scop.MakePublicColumnWriteOnly
      ColumnID: 3
      TableID: 108
    *scop.SetColumnName
      ColumnID: 3
      Name: crdb_internal_column_3_name_placeholder
      TableID: 108
    *scop.MakePublicColumnWriteOnly
      ColumnID: 4294967295
      TableID: 108
    *scop.SetColumnName
      ColumnID: 4294967295
      Name: crdb_internal_column_4294967295_name_placeholder
      TableID: 108
    *scop.MakePublicColumnWriteOnly
      ColumnID: 4294967294
      TableID: 108
    *scop.SetColumnName
      ColumnID: 4294967294
      Name: crdb_internal_column_4294967294_name_placeholder
      TableID: 108
    *scop.MakePublicColumnWriteOnly
      ColumnID: 4294967293
      TableID: 108
    *scop.SetColumnName
      ColumnID: 4294967293
      Name: crdb_internal_column_4294967293_name_placeholder
      TableID: 108
    *scop.MakePublicColumnWriteOnly
      ColumnID: 4294967292
      TableID: 108
    *scop.SetColumnName
      ColumnID: 4294967292
      Name: crdb_internal_column_4294967292_name_placeholder
      TableID: 108
    *scop.MakeAbsentIndexBackfilling
      Index:
        ConstraintID: 3
        IndexID: 3
        IsUnique: true
        SourceIndexID: 1
        TableID: 107
        TemporaryIndexID: 4
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 3
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 3
      IndexID: 3
      Kind: 2
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 4
      IndexID: 3
      Kind: 2
      Ordinal: 1
      TableID: 107
    *scop.MakeAbsentTempIndexDeleteOnly
      Index:
        ConstraintID: 4
        IndexID: 4
        IsUnique: true
        SourceIndexID: 1
        TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 4
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 3
      IndexID: 4
      Kind: 2
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 4
      IndexID: 4
      Kind: 2
      Ordinal: 1
      TableID: 107
    *scop.DrainDescriptorName
      Namespace:
        DatabaseID: 100
        DescriptorID: 108
        Name: fooview
        SchemaID: 101
    *scop.NotImplementedForPublicObjects
      DescID: 108
      ElementType: scpb.Owner
    *scop.RemoveUserPrivileges
      DescriptorID: 108
      User: admin
    *scop.RemoveUserPrivileges
      DescriptorID: 108
      User: root
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 1
      TableID: 108
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 2
      TableID: 108
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 3
      TableID: 108
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 4294967295
      TableID: 108
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 4294967294
      TableID: 108
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 4294967293
      TableID: 108
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 4294967292
      TableID: 108
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 1
      TableID: 108
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 2
      TableID: 108
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 3
      TableID: 108
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 4294967295
      TableID: 108
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 4294967294
      TableID: 108
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 4294967293
      TableID: 108
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 4294967292
      TableID: 108
PreCommitPhase stage 1 of 2 with 1 MutationType op
  transitions:
    [[Column:{DescID: 107, ColumnID: 2}, ABSENT], WRITE_ONLY] -> PUBLIC
    [[ColumnName:{DescID: 107, Name: v1, ColumnID: 2}, ABSENT], ABSENT] -> PUBLIC
    [[SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, ABSENT], VALIDATED] -> PUBLIC
    [[Namespace:{DescID: 108, Name: fooview, ReferencedDescID: 100}, ABSENT], ABSENT] -> PUBLIC
    [[Owner:{DescID: 108}, ABSENT], ABSENT] -> PUBLIC
    [[UserPrivileges:{DescID: 108, Name: admin}, ABSENT], ABSENT] -> PUBLIC
    [[UserPrivileges:{DescID: 108, Name: root}, ABSENT], ABSENT] -> PUBLIC
    [[View:{DescID: 108}, ABSENT], DROPPED] -> PUBLIC
    [[SchemaChild:{DescID: 108, ReferencedDescID: 101}, ABSENT], ABSENT] -> PUBLIC
    [[Column:{DescID: 108, ColumnID: 1}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnName:{DescID: 108, Name: k, ColumnID: 1}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 1, TypeName: INT8}, ABSENT], ABSENT] -> PUBLIC
    [[Column:{DescID: 108, ColumnID: 2}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnName:{DescID: 108, Name: v1, ColumnID: 2}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnType:{DescID: 108, ReferencedTypeIDs: [104 105], ColumnFamilyID: 0, ColumnID: 2, TypeName: public.footyp}, ABSENT], ABSENT] -> PUBLIC
    [[Column:{DescID: 108, ColumnID: 3}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnName:{DescID: 108, Name: v2, ColumnID: 3}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 3, TypeName: INT8}, ABSENT], ABSENT] -> PUBLIC
    [[Column:{DescID: 108, ColumnID: 4294967295}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnName:{DescID: 108, Name: crdb_internal_mvcc_timestamp, ColumnID: 4294967295}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967295, TypeName: DECIMAL}, ABSENT], ABSENT] -> PUBLIC
    [[Column:{DescID: 108, ColumnID: 4294967294}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnName:{DescID: 108, Name: tableoid, ColumnID: 4294967294}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967294, TypeName: OID}, ABSENT], ABSENT] -> PUBLIC
    [[Column:{DescID: 108, ColumnID: 4294967293}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnName:{DescID: 108, Name: crdb_internal_origin_id, ColumnID: 4294967293}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967293, TypeName: INT4}, ABSENT], ABSENT] -> PUBLIC
    [[Column:{DescID: 108, ColumnID: 4294967292}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnName:{DescID: 108, Name: crdb_internal_origin_timestamp, ColumnID: 4294967292}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967292, TypeName: DECIMAL}, ABSENT], ABSENT] -> PUBLIC
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], BACKFILL_ONLY] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 3}, PUBLIC], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 3}, PUBLIC], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 3}, PUBLIC], PUBLIC] -> ABSENT
    [[IndexData:{DescID: 107, IndexID: 3}, PUBLIC], PUBLIC] -> ABSENT
    [[TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT], DELETE_ONLY] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 4}, TRANSIENT_ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 4}, TRANSIENT_ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 4}, TRANSIENT_ABSENT], PUBLIC] -> ABSENT
  ops:
    *scop.UndoAllInTxnImmediateMutationOpSideEffects
      {}
PreCommitPhase stage 2 of 2 with 18 MutationType ops
  transitions:
    [[Column:{DescID: 107, ColumnID: 2}, ABSENT], PUBLIC] -> WRITE_ONLY
    [[ColumnName:{DescID: 107, Name: v1, ColumnID: 2}, ABSENT], PUBLIC] -> ABSENT
    [[SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, ABSENT], PUBLIC] -> VALIDATED
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], ABSENT] -> BACKFILL_ONLY
    [[IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexData:{DescID: 107, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT], ABSENT] -> DELETE_ONLY
    [[IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 4}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 4}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 4}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
  ops:
    *scop.MakePublicColumnWriteOnly
      ColumnID: 2
      TableID: 107
    *scop.SetColumnName
      ColumnID: 2
      Name: crdb_internal_column_2_name_placeholder
      TableID: 107
    *scop.MakePublicSecondaryIndexWriteOnly
      IndexID: 2
      TableID: 107
    *scop.MakeAbsentIndexBackfilling
      Index:
        ConstraintID: 3
        IndexID: 3
        IsUnique: true
        SourceIndexID: 1
        TableID: 107
        TemporaryIndexID: 4
    *scop.MaybeAddSplitForIndex
      IndexID: 3
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 3
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 3
      IndexID: 3
      Kind: 2
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 4
      IndexID: 3
      Kind: 2
      Ordinal: 1
      TableID: 107
    *scop.MakeAbsentTempIndexDeleteOnly
      Index:
        ConstraintID: 4
        IndexID: 4
        IsUnique: true
        SourceIndexID: 1
        TableID: 107
    *scop.MaybeAddSplitForIndex
      IndexID: 4
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 4
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 3
      IndexID: 4
      Kind: 2
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 4
      IndexID: 4
      Kind: 2
      Ordinal: 1
      TableID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
      Initialize: true
    *scop.SetJobStateOnDescriptor
      DescriptorID: 105
      Initialize: true
    *scop.SetJobStateOnDescriptor
      DescriptorID: 107
      Initialize: true
    *scop.SetJobStateOnDescriptor
      DescriptorID: 108
      Initialize: true
    *scop.CreateSchemaChangerJob
      Authorization:
        AppName: $ internal-test
        UserName: root
      DescriptorIDs:
      - 104
      - 105
      - 107
      - 108
      JobID: 1
      RunningStatus: PostCommitPhase stage 1 of 7 with 1 MutationType op pending
      Statements:
      - statement: ALTER TABLE defaultdb.foo DROP COLUMN v1 CASCADE
        redactedstatement: ALTER TABLE ‹defaultdb›.public.‹foo› DROP COLUMN ‹v1› CASCADE
        statementtag: ALTER TABLE
PostCommitPhase stage 1 of 7 with 6 MutationType ops
  transitions:
    [[TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT], DELETE_ONLY] -> WRITE_ONLY
    [[IndexData:{DescID: 107, IndexID: 4}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
  ops:
    *scop.MakeDeleteOnlyIndexWriteOnly
      IndexID: 4
      TableID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 105
    *scop.SetJobStateOnDescriptor
      DescriptorID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 108
    *scop.UpdateSchemaChangerJob
      JobID: 1
PostCommitPhase stage 2 of 7 with 1 BackfillType op
  transitions:
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], BACKFILL_ONLY] -> BACKFILLED
  ops:
    *scop.BackfillIndex
      IndexID: 3
      SourceIndexID: 1
      TableID: 107
PostCommitPhase stage 3 of 7 with 6 MutationType ops
  transitions:
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], BACKFILLED] -> DELETE_ONLY
  ops:
    *scop.MakeBackfillingIndexDeleteOnly
      IndexID: 3
      TableID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 105
    *scop.SetJobStateOnDescriptor
      DescriptorID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 108
    *scop.UpdateSchemaChangerJob
      JobID: 1
PostCommitPhase stage 4 of 7 with 6 MutationType ops
  transitions:
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], DELETE_ONLY] -> MERGE_ONLY
  ops:
    *scop.MakeBackfilledIndexMerging
      IndexID: 3
      TableID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 105
    *scop.SetJobStateOnDescriptor
      DescriptorID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 108
    *scop.UpdateSchemaChangerJob
      JobID: 1
PostCommitPhase stage 5 of 7 with 1 BackfillType op
  transitions:
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], MERGE_ONLY] -> MERGED
  ops:
    *scop.MergeIndex
      BackfilledIndexID: 3
      TableID: 107
      TemporaryIndexID: 4
PostCommitPhase stage 6 of 7 with 7 MutationType ops
  transitions:
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], MERGED] -> WRITE_ONLY
    [[TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT], WRITE_ONLY] -> TRANSIENT_DELETE_ONLY
  ops:
    *scop.MakeWriteOnlyIndexDeleteOnly
      IndexID: 4
      TableID: 107
    *scop.MakeMergedIndexWriteOnly
      IndexID: 3
      TableID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 105
    *scop.SetJobStateOnDescriptor
      DescriptorID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 108
    *scop.UpdateSchemaChangerJob
      JobID: 1
PostCommitPhase stage 7 of 7 with 1 ValidationType op
  transitions:
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], WRITE_ONLY] -> VALIDATED
  ops:
    *scop.ValidateIndex
      IndexID: 3
      TableID: 107
PostCommitNonRevertiblePhase stage 1 of 3 with 57 MutationType ops
  transitions:
    [[Column:{DescID: 107, ColumnID: 2}, ABSENT], WRITE_ONLY] -> DELETE_ONLY
    [[PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT], PUBLIC] -> VALIDATED
    [[IndexName:{DescID: 107, Name: foo_pkey, IndexID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 2}, ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 2}, ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 2}, ABSENT], PUBLIC] -> ABSENT
    [[SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, ABSENT], VALIDATED] -> DELETE_ONLY
    [[IndexName:{DescID: 107, Name: foo_v2_key, IndexID: 2}, ABSENT], PUBLIC] -> ABSENT
    [[Namespace:{DescID: 108, Name: fooview, ReferencedDescID: 100}, ABSENT], PUBLIC] -> ABSENT
    [[Owner:{DescID: 108}, ABSENT], PUBLIC] -> ABSENT
    [[UserPrivileges:{DescID: 108, Name: admin}, ABSENT], PUBLIC] -> ABSENT
    [[UserPrivileges:{DescID: 108, Name: root}, ABSENT], PUBLIC] -> ABSENT
    [[View:{DescID: 108}, ABSENT], PUBLIC] -> DROPPED
    [[SchemaChild:{DescID: 108, ReferencedDescID: 101}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: k, ColumnID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 1, TypeName: INT8}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 2}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: v1, ColumnID: 2}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ReferencedTypeIDs: [104 105], ColumnFamilyID: 0, ColumnID: 2, TypeName: public.footyp}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 3}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: v2, ColumnID: 3}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 3, TypeName: INT8}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 4294967295}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: crdb_internal_mvcc_timestamp, ColumnID: 4294967295}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967295, TypeName: DECIMAL}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 4294967294}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: tableoid, ColumnID: 4294967294}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967294, TypeName: OID}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 4294967293}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: crdb_internal_origin_id, ColumnID: 4294967293}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967293, TypeName: INT4}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 4294967292}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: crdb_internal_origin_timestamp, ColumnID: 4294967292}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967292, TypeName: DECIMAL}, ABSENT], PUBLIC] -> ABSENT
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], VALIDATED] -> PUBLIC
    [[IndexName:{DescID: 107, Name: foo_pkey, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT], TRANSIENT_DELETE_ONLY] -> TRANSIENT_ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 4}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 4}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 4}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
  ops:
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 2
      TableID: 107
    *scop.MakePublicPrimaryIndexWriteOnly
      IndexID: 1
      TableID: 107
    *scop.SetIndexName
      IndexID: 1
      Name: crdb_internal_index_1_name_placeholder
      TableID: 107
    *scop.MarkDescriptorAsDropped
      DescriptorID: 108
    *scop.RemoveBackReferenceInTypes
      BackReferencedDescriptorID: 108
      TypeIDs:
      - 104
    *scop.RemoveBackReferencesInRelations
      BackReferencedID: 108
      RelationIDs:
      - 107
    *scop.RemoveObjectParent
      ObjectID: 108
      ParentSchemaID: 101
    *scop.MakePublicColumnWriteOnly
      ColumnID: 1
      TableID: 108
    *scop.SetColumnName
      ColumnID: 1
      Name: crdb_internal_column_1_name_placeholder
      TableID: 108
    *scop.MakePublicColumnWriteOnly
      ColumnID: 2
      TableID: 108
    *scop.SetColumnName
      ColumnID: 2
      Name: crdb_internal_column_2_name_placeholder
      TableID: 108
    *scop.RemoveDroppedColumnType
      ColumnID: 2
      TableID: 108
    *scop.UpdateTableBackReferencesInTypes
      BackReferencedTableID: 108
      TypeIDs:
      - 104
      - 105
    *scop.MakePublicColumnWriteOnly
      ColumnID: 3
      TableID: 108
    *scop.SetColumnName
      ColumnID: 3
      Name: crdb_internal_column_3_name_placeholder
      TableID: 108
    *scop.MakePublicColumnWriteOnly
      ColumnID: 4294967295
      TableID: 108
    *scop.SetColumnName
      ColumnID: 4294967295
      Name: crdb_internal_column_4294967295_name_placeholder
      TableID: 108
    *scop.MakePublicColumnWriteOnly
      ColumnID: 4294967294
      TableID: 108
    *scop.SetColumnName
      ColumnID: 4294967294
      Name: crdb_internal_column_4294967294_name_placeholder
      TableID: 108
    *scop.MakePublicColumnWriteOnly
      ColumnID: 4294967293
      TableID: 108
    *scop.SetColumnName
      ColumnID: 4294967293
      Name: crdb_internal_column_4294967293_name_placeholder
      TableID: 108
    *scop.MakePublicColumnWriteOnly
      ColumnID: 4294967292
      TableID: 108
    *scop.SetColumnName
      ColumnID: 4294967292
      Name: crdb_internal_column_4294967292_name_placeholder
      TableID: 108
    *scop.SetIndexName
      IndexID: 3
      Name: foo_pkey
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 1
      IndexID: 4
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 3
      IndexID: 4
      Kind: 2
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 4
      IndexID: 4
      Kind: 2
      Ordinal: 1
      TableID: 107
    *scop.MakeWriteOnlyIndexDeleteOnly
      IndexID: 2
      TableID: 107
    *scop.SetIndexName
      IndexID: 2
      Name: crdb_internal_index_2_name_placeholder
      TableID: 107
    *scop.DrainDescriptorName
      Namespace:
        DatabaseID: 100
        DescriptorID: 108
        Name: fooview
        SchemaID: 101
    *scop.NotImplementedForPublicObjects
      DescID: 108
      ElementType: scpb.Owner
    *scop.RemoveUserPrivileges
      DescriptorID: 108
      User: admin
    *scop.RemoveUserPrivileges
      DescriptorID: 108
      User: root
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 1
      TableID: 108
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 2
      TableID: 108
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 3
      TableID: 108
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 4294967295
      TableID: 108
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 4294967294
      TableID: 108
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 4294967293
      TableID: 108
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 4294967292
      TableID: 108
    *scop.MakeValidatedPrimaryIndexPublic
      IndexID: 3
      TableID: 107
    *scop.MakeIndexAbsent
      IndexID: 4
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 3
      IndexID: 2
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 1
      IndexID: 2
      Kind: 1
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 2
      IndexID: 2
      Kind: 2
      TableID: 107
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 1
      TableID: 108
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 2
      TableID: 108
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 3
      TableID: 108
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 4294967295
      TableID: 108
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 4294967294
      TableID: 108
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 4294967293
      TableID: 108
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 4294967292
      TableID: 108
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 105
    *scop.SetJobStateOnDescriptor
      DescriptorID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 108
    *scop.UpdateSchemaChangerJob
      IsNonCancelable: true
      JobID: 1
PostCommitNonRevertiblePhase stage 2 of 3 with 11 MutationType ops
  transitions:
    [[IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT], VALIDATED] -> DELETE_ONLY
    [[SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, ABSENT], DELETE_ONLY] -> ABSENT
    [[View:{DescID: 108}, ABSENT], DROPPED] -> ABSENT
  ops:
    *scop.MakeIndexAbsent
      IndexID: 2
      TableID: 107
    *scop.DeleteDescriptor
      DescriptorID: 108
    *scop.MakeWriteOnlyIndexDeleteOnly
      IndexID: 1
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 1
      IndexID: 1
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 2
      IndexID: 1
      Kind: 2
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 3
      IndexID: 1
      Kind: 2
      Ordinal: 1
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 4
      IndexID: 1
      Kind: 2
      Ordinal: 2
      TableID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 105
    *scop.SetJobStateOnDescriptor
      DescriptorID: 107
    *scop.UpdateSchemaChangerJob
      DescriptorIDsToRemove:
      - 108
      IsNonCancelable: true
      JobID: 1
PostCommitNonRevertiblePhase stage 3 of 3 with 11 MutationType ops
  transitions:
    [[Column:{DescID: 107, ColumnID: 2}, ABSENT], DELETE_ONLY] -> ABSENT
    [[ColumnType:{DescID: 107, ReferencedTypeIDs: [104 105], ColumnFamilyID: 0, ColumnID: 2, TypeName: public.footyp}, ABSENT], PUBLIC] -> ABSENT
    [[PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT], DELETE_ONLY] -> ABSENT
    [[IndexData:{DescID: 107, IndexID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[IndexData:{DescID: 107, IndexID: 2}, ABSENT], PUBLIC] -> ABSENT
    [[IndexData:{DescID: 107, IndexID: 4}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
  ops:
    *scop.RemoveDroppedColumnType
      ColumnID: 2
      TableID: 107
    *scop.UpdateTableBackReferencesInTypes
      BackReferencedTableID: 107
      TypeIDs:
      - 104
      - 105
    *scop.MakeIndexAbsent
      IndexID: 1
      TableID: 107
    *scop.CreateGCJobForIndex
      IndexID: 1
      StatementForDropJob:
        Statement: ALTER TABLE defaultdb.public.foo DROP COLUMN v1 CASCADE
      TableID: 107
    *scop.CreateGCJobForIndex
      IndexID: 2
      StatementForDropJob:
        Statement: ALTER TABLE defaultdb.public.foo DROP COLUMN v1 CASCADE
      TableID: 107
    *scop.CreateGCJobForIndex
      IndexID: 4
      StatementForDropJob:
        Statement: ALTER TABLE defaultdb.public.foo DROP COLUMN v1 CASCADE
      TableID: 107
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 2
      TableID: 107
    *scop.RemoveJobStateFromDescriptor
      DescriptorID: 104
      JobID: 1
    *scop.RemoveJobStateFromDescriptor
      DescriptorID: 105
      JobID: 1
    *scop.RemoveJobStateFromDescriptor
      DescriptorID: 107
      JobID: 1
    *scop.UpdateSchemaChangerJob
      DescriptorIDsToRemove:
      - 104
      - 105
      - 107
      IsNonCancelable: true
      JobID: 1

deps
ALTER TABLE defaultdb.foo DROP COLUMN v1 CASCADE;
----
- from: [Column:{DescID: 107, ColumnID: 2}, DELETE_ONLY]
  to:   [Column:{DescID: 107, ColumnID: 2}, ABSENT]
  kind: PreviousTransactionPrecedence
  rule: Column transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT
- from: [Column:{DescID: 107, ColumnID: 2}, PUBLIC]
  to:   [Column:{DescID: 107, ColumnID: 2}, WRITE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: Column transitions to ABSENT uphold 2-version invariant: PUBLIC->WRITE_ONLY
- from: [Column:{DescID: 107, ColumnID: 2}, WRITE_ONLY]
  to:   [Column:{DescID: 107, ColumnID: 2}, DELETE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: Column transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY
- from: [Column:{DescID: 107, ColumnID: 2}, WRITE_ONLY]
  to:   [ColumnName:{DescID: 107, Name: v1, ColumnID: 2}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 107, ColumnID: 2}, WRITE_ONLY]
  to:   [ColumnType:{DescID: 107, ReferencedTypeIDs: [104 105], ColumnFamilyID: 0, ColumnID: 2, TypeName: public.footyp}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 107, ColumnID: 2}, WRITE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 1}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 107, ColumnID: 2}, WRITE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 2}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 107, ColumnID: 2}, WRITE_ONLY]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC]
  kind: Precedence
  rule: New primary index should go public only after columns being dropped move to WRITE_ONLY
- from: [Column:{DescID: 108, ColumnID: 1}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [Column:{DescID: 108, ColumnID: 1}, WRITE_ONLY]
  to:   [ColumnName:{DescID: 108, Name: k, ColumnID: 1}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 108, ColumnID: 1}, WRITE_ONLY]
  to:   [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 1, TypeName: INT8}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 108, ColumnID: 2}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [Column:{DescID: 108, ColumnID: 2}, WRITE_ONLY]
  to:   [ColumnName:{DescID: 108, Name: v1, ColumnID: 2}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 108, ColumnID: 2}, WRITE_ONLY]
  to:   [ColumnType:{DescID: 108, ReferencedTypeIDs: [104 105], ColumnFamilyID: 0, ColumnID: 2, TypeName: public.footyp}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 108, ColumnID: 3}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [Column:{DescID: 108, ColumnID: 3}, WRITE_ONLY]
  to:   [ColumnName:{DescID: 108, Name: v2, ColumnID: 3}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 108, ColumnID: 3}, WRITE_ONLY]
  to:   [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 3, TypeName: INT8}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 108, ColumnID: 4294967292}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [Column:{DescID: 108, ColumnID: 4294967292}, WRITE_ONLY]
  to:   [ColumnName:{DescID: 108, Name: crdb_internal_origin_timestamp, ColumnID: 4294967292}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 108, ColumnID: 4294967292}, WRITE_ONLY]
  to:   [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967292, TypeName: DECIMAL}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 108, ColumnID: 4294967293}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [Column:{DescID: 108, ColumnID: 4294967293}, WRITE_ONLY]
  to:   [ColumnName:{DescID: 108, Name: crdb_internal_origin_id, ColumnID: 4294967293}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 108, ColumnID: 4294967293}, WRITE_ONLY]
  to:   [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967293, TypeName: INT4}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 108, ColumnID: 4294967294}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [Column:{DescID: 108, ColumnID: 4294967294}, WRITE_ONLY]
  to:   [ColumnName:{DescID: 108, Name: tableoid, ColumnID: 4294967294}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 108, ColumnID: 4294967294}, WRITE_ONLY]
  to:   [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967294, TypeName: OID}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 108, ColumnID: 4294967295}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [Column:{DescID: 108, ColumnID: 4294967295}, WRITE_ONLY]
  to:   [ColumnName:{DescID: 108, Name: crdb_internal_mvcc_timestamp, ColumnID: 4294967295}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 108, ColumnID: 4294967295}, WRITE_ONLY]
  to:   [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967295, TypeName: DECIMAL}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [ColumnName:{DescID: 107, Name: v1, ColumnID: 2}, ABSENT]
  to:   [Column:{DescID: 107, ColumnID: 2}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnName:{DescID: 108, Name: crdb_internal_mvcc_timestamp, ColumnID: 4294967295}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 4294967295}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnName:{DescID: 108, Name: crdb_internal_mvcc_timestamp, ColumnID: 4294967295}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [ColumnName:{DescID: 108, Name: crdb_internal_origin_id, ColumnID: 4294967293}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 4294967293}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnName:{DescID: 108, Name: crdb_internal_origin_id, ColumnID: 4294967293}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [ColumnName:{DescID: 108, Name: crdb_internal_origin_timestamp, ColumnID: 4294967292}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 4294967292}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnName:{DescID: 108, Name: crdb_internal_origin_timestamp, ColumnID: 4294967292}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [ColumnName:{DescID: 108, Name: k, ColumnID: 1}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 1}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnName:{DescID: 108, Name: k, ColumnID: 1}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [ColumnName:{DescID: 108, Name: tableoid, ColumnID: 4294967294}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 4294967294}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnName:{DescID: 108, Name: tableoid, ColumnID: 4294967294}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [ColumnName:{DescID: 108, Name: v1, ColumnID: 2}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 2}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnName:{DescID: 108, Name: v1, ColumnID: 2}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [ColumnName:{DescID: 108, Name: v2, ColumnID: 3}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 3}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnName:{DescID: 108, Name: v2, ColumnID: 3}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [ColumnType:{DescID: 107, ReferencedTypeIDs: [104 105], ColumnFamilyID: 0, ColumnID: 2, TypeName: public.footyp}, ABSENT]
  to:   [Column:{DescID: 107, ColumnID: 2}, ABSENT]
  kind: SameStagePrecedence
  rules: [dependents removed before column; column type removed right before column when not dropping relation]
- from: [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 1, TypeName: INT8}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 1}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 1, TypeName: INT8}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 3, TypeName: INT8}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 3}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 3, TypeName: INT8}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967292, TypeName: DECIMAL}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 4294967292}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967292, TypeName: DECIMAL}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967293, TypeName: INT4}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 4294967293}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967293, TypeName: INT4}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967294, TypeName: OID}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 4294967294}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967294, TypeName: OID}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967295, TypeName: DECIMAL}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 4294967295}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967295, TypeName: DECIMAL}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [ColumnType:{DescID: 108, ReferencedTypeIDs: [104 105], ColumnFamilyID: 0, ColumnID: 2, TypeName: public.footyp}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 2}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnType:{DescID: 108, ReferencedTypeIDs: [104 105], ColumnFamilyID: 0, ColumnID: 2, TypeName: public.footyp}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 1}, ABSENT]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 2}, ABSENT]
  to:   [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 3}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILLED]
  kind: Precedence
  rule: index-column added to index before index is backfilled
- from: [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 3}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC]
  kind: Precedence
  rule: index dependents exist before index becomes public
- from: [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 4}, PUBLIC]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, WRITE_ONLY]
  kind: Precedence
  rule: index-column added to index before temp index receives writes
- from: [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 4}, TRANSIENT_ABSENT]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 1}, ABSENT]
  to:   [Column:{DescID: 107, ColumnID: 2}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 1}, ABSENT]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 2}, ABSENT]
  to:   [Column:{DescID: 107, ColumnID: 2}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 2}, ABSENT]
  to:   [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 1}, ABSENT]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 2}, ABSENT]
  to:   [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 3}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILLED]
  kind: Precedence
  rule: index-column added to index before index is backfilled
- from: [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 3}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC]
  kind: Precedence
  rule: index dependents exist before index becomes public
- from: [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 4}, PUBLIC]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, WRITE_ONLY]
  kind: Precedence
  rule: index-column added to index before temp index receives writes
- from: [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 4}, TRANSIENT_ABSENT]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 1}, ABSENT]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 3}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILLED]
  kind: Precedence
  rule: index-column added to index before index is backfilled
- from: [IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 3}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC]
  kind: Precedence
  rule: index dependents exist before index becomes public
- from: [IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 4}, PUBLIC]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, WRITE_ONLY]
  kind: Precedence
  rule: index-column added to index before temp index receives writes
- from: [IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 4}, TRANSIENT_ABSENT]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexData:{DescID: 107, IndexID: 1}, DROPPED]
  to:   [IndexData:{DescID: 107, IndexID: 2}, DROPPED]
  kind: SameStagePrecedence
  rule: schedule all GC jobs for a descriptor in the same stage
- from: [IndexData:{DescID: 107, IndexID: 1}, DROPPED]
  to:   [IndexData:{DescID: 107, IndexID: 4}, TRANSIENT_DROPPED]
  kind: SameStagePrecedence
  rule: schedule all GC jobs for a descriptor in the same stage
- from: [IndexData:{DescID: 107, IndexID: 2}, DROPPED]
  to:   [IndexData:{DescID: 107, IndexID: 4}, TRANSIENT_DROPPED]
  kind: SameStagePrecedence
  rule: schedule all GC jobs for a descriptor in the same stage
- from: [IndexName:{DescID: 107, Name: foo_pkey, IndexID: 1}, ABSENT]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexName:{DescID: 107, Name: foo_pkey, IndexID: 3}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC]
  kind: SameStagePrecedence
  rules: [index dependents exist before index becomes public; primary index named right before index becomes public]
- from: [IndexName:{DescID: 107, Name: foo_v2_key, IndexID: 2}, ABSENT]
  to:   [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [Namespace:{DescID: 108, Name: fooview, ReferencedDescID: 100}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [Owner:{DescID: 108}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT]
  to:   [Column:{DescID: 107, ColumnID: 2}, ABSENT]
  kind: Precedence
  rule: indexes containing column reach absent before column
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT]
  to:   [IndexData:{DescID: 107, IndexID: 1}, DROPPED]
  kind: Precedence
  rule: index removed before garbage collection
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 1}, ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 1}, ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 1}, ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 1}, ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, DELETE_ONLY]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, VALIDATED]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to ABSENT uphold 2-version invariant: PUBLIC->VALIDATED
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, VALIDATED]
  to:   [IndexName:{DescID: 107, Name: foo_pkey, IndexID: 1}, ABSENT]
  kind: Precedence
  rule: index no longer public before dependents, excluding columns
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, VALIDATED]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, WRITE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to ABSENT uphold 2-version invariant: VALIDATED->WRITE_ONLY
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, VALIDATED]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC]
  kind: SameStagePrecedence
  rule: primary index swap
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, ABSENT]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILL_ONLY]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: ABSENT->BACKFILL_ONLY
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILLED]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, DELETE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: BACKFILLED->DELETE_ONLY
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILL_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 3}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILL_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 3}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILL_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 3}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILL_ONLY]
  to:   [IndexData:{DescID: 107, IndexID: 3}, PUBLIC]
  kind: SameStagePrecedence
  rule: index data exists as soon as index accepts backfills
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILL_ONLY]
  to:   [IndexName:{DescID: 107, Name: foo_pkey, IndexID: 3}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILL_ONLY]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILLED]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: BACKFILL_ONLY->BACKFILLED
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, DELETE_ONLY]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, MERGE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: DELETE_ONLY->MERGE_ONLY
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, MERGED]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, WRITE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: MERGED->WRITE_ONLY
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, MERGED]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  kind: Precedence
  rule: index is MERGED before its temp index starts to disappear
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, MERGE_ONLY]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, MERGED]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: MERGE_ONLY->MERGED
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, VALIDATED]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: VALIDATED->PUBLIC
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, WRITE_ONLY]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, VALIDATED]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: WRITE_ONLY->VALIDATED
- from: [SchemaChild:{DescID: 108, ReferencedDescID: 101}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, ABSENT]
  to:   [Column:{DescID: 107, ColumnID: 2}, ABSENT]
  kind: Precedence
  rule: indexes containing column reach absent before column
- from: [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, ABSENT]
  to:   [IndexData:{DescID: 107, IndexID: 2}, DROPPED]
  kind: Precedence
  rule: index removed before garbage collection
- from: [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 2}, ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 2}, ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 2}, ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, DELETE_ONLY]
  to:   [IndexName:{DescID: 107, Name: foo_v2_key, IndexID: 2}, ABSENT]
  kind: Precedence
  rule: index no longer public before index name
- from: [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, DELETE_ONLY]
  to:   [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, ABSENT]
  kind: PreviousTransactionPrecedence
  rule: SecondaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT
- from: [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, PUBLIC]
  to:   [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, VALIDATED]
  kind: PreviousTransactionPrecedence
  rule: SecondaryIndex transitions to ABSENT uphold 2-version invariant: PUBLIC->VALIDATED
- from: [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, VALIDATED]
  to:   [IndexName:{DescID: 107, Name: foo_v2_key, IndexID: 2}, ABSENT]
  kind: Precedence
  rule: index no longer public before dependents, excluding columns
- from: [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, VALIDATED]
  to:   [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, WRITE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: SecondaryIndex transitions to ABSENT uphold 2-version invariant: VALIDATED->WRITE_ONLY
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, ABSENT]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, DELETE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: ABSENT->DELETE_ONLY
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 4}, PUBLIC]
  kind: Precedence
  rule: temp index existence precedes index dependents
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 4}, PUBLIC]
  kind: Precedence
  rule: temp index existence precedes index dependents
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 4}, PUBLIC]
  kind: Precedence
  rule: temp index existence precedes index dependents
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, DELETE_ONLY]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, WRITE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: DELETE_ONLY->WRITE_ONLY
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT]
  to:   [IndexData:{DescID: 107, IndexID: 4}, TRANSIENT_DROPPED]
  kind: Precedence
  rule: index removed before garbage collection
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 4}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 4}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 4}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, WRITE_ONLY]
  kind: Precedence
  rule: temp index disappeared before its master index reaches WRITE_ONLY
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: PreviousTransactionPrecedence
  rule: TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_DELETE_ONLY->TRANSIENT_ABSENT
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, WRITE_ONLY]
  to:   [IndexData:{DescID: 107, IndexID: 4}, PUBLIC]
  kind: SameStagePrecedence
  rule: temp index data exists as soon as temp index accepts writes
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, WRITE_ONLY]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILLED]
  kind: Precedence
  rule: temp index is WRITE_ONLY before backfill
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, WRITE_ONLY]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: WRITE_ONLY->TRANSIENT_DELETE_ONLY
- from: [UserPrivileges:{DescID: 108, Name: admin}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [UserPrivileges:{DescID: 108, Name: root}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [View:{DescID: 108}, DROPPED]
  to:   [Column:{DescID: 108, ColumnID: 1}, WRITE_ONLY]
  kind: Precedence
  rule: relation dropped before dependent column
- from: [View:{DescID: 108}, DROPPED]
  to:   [Column:{DescID: 108, ColumnID: 2}, WRITE_ONLY]
  kind: Precedence
  rule: relation dropped before dependent column
- from: [View:{DescID: 108}, DROPPED]
  to:   [Column:{DescID: 108, ColumnID: 3}, WRITE_ONLY]
  kind: Precedence
  rule: relation dropped before dependent column
- from: [View:{DescID: 108}, DROPPED]
  to:   [Column:{DescID: 108, ColumnID: 4294967292}, WRITE_ONLY]
  kind: Precedence
  rule: relation dropped before dependent column
- from: [View:{DescID: 108}, DROPPED]
  to:   [Column:{DescID: 108, ColumnID: 4294967293}, WRITE_ONLY]
  kind: Precedence
  rule: relation dropped before dependent column
- from: [View:{DescID: 108}, DROPPED]
  to:   [Column:{DescID: 108, ColumnID: 4294967294}, WRITE_ONLY]
  kind: Precedence
  rule: relation dropped before dependent column
- from: [View:{DescID: 108}, DROPPED]
  to:   [Column:{DescID: 108, ColumnID: 4294967295}, WRITE_ONLY]
  kind: Precedence
  rule: relation dropped before dependent column
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnName:{DescID: 108, Name: crdb_internal_mvcc_timestamp, ColumnID: 4294967295}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnName:{DescID: 108, Name: crdb_internal_origin_id, ColumnID: 4294967293}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnName:{DescID: 108, Name: crdb_internal_origin_timestamp, ColumnID: 4294967292}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnName:{DescID: 108, Name: k, ColumnID: 1}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnName:{DescID: 108, Name: tableoid, ColumnID: 4294967294}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnName:{DescID: 108, Name: v1, ColumnID: 2}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnName:{DescID: 108, Name: v2, ColumnID: 3}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 1, TypeName: INT8}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 3, TypeName: INT8}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967292, TypeName: DECIMAL}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967293, TypeName: INT4}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967294, TypeName: OID}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967295, TypeName: DECIMAL}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnType:{DescID: 108, ReferencedTypeIDs: [104 105], ColumnFamilyID: 0, ColumnID: 2, TypeName: public.footyp}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [Namespace:{DescID: 108, Name: fooview, ReferencedDescID: 100}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [Owner:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [SchemaChild:{DescID: 108, ReferencedDescID: 101}, ABSENT]
  kind: SameStagePrecedence
  rules: [descriptor dropped before dependent element removal; descriptor dropped right before removing back-reference in its parent descriptor]
- from: [View:{DescID: 108}, DROPPED]
  to:   [UserPrivileges:{DescID: 108, Name: admin}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [UserPrivileges:{DescID: 108, Name: root}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [View:{DescID: 108}, ABSENT]
  kind: PreviousTransactionPrecedence
  rule: descriptor dropped in transaction before removal

ops
ALTER TABLE defaultdb.foo DROP COLUMN v2 CASCADE;
----
StatementPhase stage 1 of 1 with 48 MutationType ops
  transitions:
    [[ColumnNotNull:{DescID: 107, ColumnID: 3, IndexID: 0}, ABSENT], PUBLIC] -> VALIDATED
    [[SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, ABSENT], PUBLIC] -> VALIDATED
    [[Namespace:{DescID: 108, Name: fooview, ReferencedDescID: 100}, ABSENT], PUBLIC] -> ABSENT
    [[Owner:{DescID: 108}, ABSENT], PUBLIC] -> ABSENT
    [[UserPrivileges:{DescID: 108, Name: admin}, ABSENT], PUBLIC] -> ABSENT
    [[UserPrivileges:{DescID: 108, Name: root}, ABSENT], PUBLIC] -> ABSENT
    [[View:{DescID: 108}, ABSENT], PUBLIC] -> DROPPED
    [[SchemaChild:{DescID: 108, ReferencedDescID: 101}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: k, ColumnID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 1, TypeName: INT8}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 2}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: v1, ColumnID: 2}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ReferencedTypeIDs: [104 105], ColumnFamilyID: 0, ColumnID: 2, TypeName: public.footyp}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 3}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: v2, ColumnID: 3}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 3, TypeName: INT8}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 4294967295}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: crdb_internal_mvcc_timestamp, ColumnID: 4294967295}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967295, TypeName: DECIMAL}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 4294967294}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: tableoid, ColumnID: 4294967294}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967294, TypeName: OID}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 4294967293}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: crdb_internal_origin_id, ColumnID: 4294967293}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967293, TypeName: INT4}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 4294967292}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: crdb_internal_origin_timestamp, ColumnID: 4294967292}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967292, TypeName: DECIMAL}, ABSENT], PUBLIC] -> ABSENT
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], ABSENT] -> BACKFILL_ONLY
    [[IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexData:{DescID: 107, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT], ABSENT] -> DELETE_ONLY
    [[IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 4}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 4}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 4}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
  ops:
    *scop.MakePublicColumnNotNullValidated
      ColumnID: 3
      TableID: 107
    *scop.MakePublicSecondaryIndexWriteOnly
      IndexID: 2
      TableID: 107
    *scop.MarkDescriptorAsDropped
      DescriptorID: 108
    *scop.RemoveBackReferenceInTypes
      BackReferencedDescriptorID: 108
      TypeIDs:
      - 104
    *scop.RemoveBackReferencesInRelations
      BackReferencedID: 108
      RelationIDs:
      - 107
    *scop.RemoveObjectParent
      ObjectID: 108
      ParentSchemaID: 101
    *scop.MakePublicColumnWriteOnly
      ColumnID: 1
      TableID: 108
    *scop.SetColumnName
      ColumnID: 1
      Name: crdb_internal_column_1_name_placeholder
      TableID: 108
    *scop.MakePublicColumnWriteOnly
      ColumnID: 2
      TableID: 108
    *scop.SetColumnName
      ColumnID: 2
      Name: crdb_internal_column_2_name_placeholder
      TableID: 108
    *scop.RemoveDroppedColumnType
      ColumnID: 2
      TableID: 108
    *scop.UpdateTableBackReferencesInTypes
      BackReferencedTableID: 108
      TypeIDs:
      - 104
      - 105
    *scop.MakePublicColumnWriteOnly
      ColumnID: 3
      TableID: 108
    *scop.SetColumnName
      ColumnID: 3
      Name: crdb_internal_column_3_name_placeholder
      TableID: 108
    *scop.MakePublicColumnWriteOnly
      ColumnID: 4294967295
      TableID: 108
    *scop.SetColumnName
      ColumnID: 4294967295
      Name: crdb_internal_column_4294967295_name_placeholder
      TableID: 108
    *scop.MakePublicColumnWriteOnly
      ColumnID: 4294967294
      TableID: 108
    *scop.SetColumnName
      ColumnID: 4294967294
      Name: crdb_internal_column_4294967294_name_placeholder
      TableID: 108
    *scop.MakePublicColumnWriteOnly
      ColumnID: 4294967293
      TableID: 108
    *scop.SetColumnName
      ColumnID: 4294967293
      Name: crdb_internal_column_4294967293_name_placeholder
      TableID: 108
    *scop.MakePublicColumnWriteOnly
      ColumnID: 4294967292
      TableID: 108
    *scop.SetColumnName
      ColumnID: 4294967292
      Name: crdb_internal_column_4294967292_name_placeholder
      TableID: 108
    *scop.MakeAbsentIndexBackfilling
      Index:
        ConstraintID: 3
        IndexID: 3
        IsUnique: true
        SourceIndexID: 1
        TableID: 107
        TemporaryIndexID: 4
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 3
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 2
      IndexID: 3
      Kind: 2
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 4
      IndexID: 3
      Kind: 2
      Ordinal: 1
      TableID: 107
    *scop.MakeAbsentTempIndexDeleteOnly
      Index:
        ConstraintID: 4
        IndexID: 4
        IsUnique: true
        SourceIndexID: 1
        TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 4
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 2
      IndexID: 4
      Kind: 2
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 4
      IndexID: 4
      Kind: 2
      Ordinal: 1
      TableID: 107
    *scop.DrainDescriptorName
      Namespace:
        DatabaseID: 100
        DescriptorID: 108
        Name: fooview
        SchemaID: 101
    *scop.NotImplementedForPublicObjects
      DescID: 108
      ElementType: scpb.Owner
    *scop.RemoveUserPrivileges
      DescriptorID: 108
      User: admin
    *scop.RemoveUserPrivileges
      DescriptorID: 108
      User: root
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 1
      TableID: 108
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 2
      TableID: 108
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 3
      TableID: 108
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 4294967295
      TableID: 108
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 4294967294
      TableID: 108
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 4294967293
      TableID: 108
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 4294967292
      TableID: 108
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 1
      TableID: 108
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 2
      TableID: 108
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 3
      TableID: 108
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 4294967295
      TableID: 108
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 4294967294
      TableID: 108
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 4294967293
      TableID: 108
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 4294967292
      TableID: 108
PreCommitPhase stage 1 of 2 with 1 MutationType op
  transitions:
    [[ColumnNotNull:{DescID: 107, ColumnID: 3, IndexID: 0}, ABSENT], VALIDATED] -> PUBLIC
    [[SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, ABSENT], VALIDATED] -> PUBLIC
    [[Namespace:{DescID: 108, Name: fooview, ReferencedDescID: 100}, ABSENT], ABSENT] -> PUBLIC
    [[Owner:{DescID: 108}, ABSENT], ABSENT] -> PUBLIC
    [[UserPrivileges:{DescID: 108, Name: admin}, ABSENT], ABSENT] -> PUBLIC
    [[UserPrivileges:{DescID: 108, Name: root}, ABSENT], ABSENT] -> PUBLIC
    [[View:{DescID: 108}, ABSENT], DROPPED] -> PUBLIC
    [[SchemaChild:{DescID: 108, ReferencedDescID: 101}, ABSENT], ABSENT] -> PUBLIC
    [[Column:{DescID: 108, ColumnID: 1}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnName:{DescID: 108, Name: k, ColumnID: 1}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 1, TypeName: INT8}, ABSENT], ABSENT] -> PUBLIC
    [[Column:{DescID: 108, ColumnID: 2}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnName:{DescID: 108, Name: v1, ColumnID: 2}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnType:{DescID: 108, ReferencedTypeIDs: [104 105], ColumnFamilyID: 0, ColumnID: 2, TypeName: public.footyp}, ABSENT], ABSENT] -> PUBLIC
    [[Column:{DescID: 108, ColumnID: 3}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnName:{DescID: 108, Name: v2, ColumnID: 3}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 3, TypeName: INT8}, ABSENT], ABSENT] -> PUBLIC
    [[Column:{DescID: 108, ColumnID: 4294967295}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnName:{DescID: 108, Name: crdb_internal_mvcc_timestamp, ColumnID: 4294967295}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967295, TypeName: DECIMAL}, ABSENT], ABSENT] -> PUBLIC
    [[Column:{DescID: 108, ColumnID: 4294967294}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnName:{DescID: 108, Name: tableoid, ColumnID: 4294967294}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967294, TypeName: OID}, ABSENT], ABSENT] -> PUBLIC
    [[Column:{DescID: 108, ColumnID: 4294967293}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnName:{DescID: 108, Name: crdb_internal_origin_id, ColumnID: 4294967293}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967293, TypeName: INT4}, ABSENT], ABSENT] -> PUBLIC
    [[Column:{DescID: 108, ColumnID: 4294967292}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnName:{DescID: 108, Name: crdb_internal_origin_timestamp, ColumnID: 4294967292}, ABSENT], ABSENT] -> PUBLIC
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967292, TypeName: DECIMAL}, ABSENT], ABSENT] -> PUBLIC
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], BACKFILL_ONLY] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 3}, PUBLIC], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 3}, PUBLIC], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 3}, PUBLIC], PUBLIC] -> ABSENT
    [[IndexData:{DescID: 107, IndexID: 3}, PUBLIC], PUBLIC] -> ABSENT
    [[TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT], DELETE_ONLY] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 4}, TRANSIENT_ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 4}, TRANSIENT_ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 4}, TRANSIENT_ABSENT], PUBLIC] -> ABSENT
  ops:
    *scop.UndoAllInTxnImmediateMutationOpSideEffects
      {}
PreCommitPhase stage 2 of 2 with 18 MutationType ops
  transitions:
    [[ColumnNotNull:{DescID: 107, ColumnID: 3, IndexID: 0}, ABSENT], PUBLIC] -> VALIDATED
    [[SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, ABSENT], PUBLIC] -> VALIDATED
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], ABSENT] -> BACKFILL_ONLY
    [[IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexData:{DescID: 107, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT], ABSENT] -> DELETE_ONLY
    [[IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 4}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 4}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 4}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
  ops:
    *scop.MakePublicColumnNotNullValidated
      ColumnID: 3
      TableID: 107
    *scop.MakePublicSecondaryIndexWriteOnly
      IndexID: 2
      TableID: 107
    *scop.MakeAbsentIndexBackfilling
      Index:
        ConstraintID: 3
        IndexID: 3
        IsUnique: true
        SourceIndexID: 1
        TableID: 107
        TemporaryIndexID: 4
    *scop.MaybeAddSplitForIndex
      IndexID: 3
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 3
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 2
      IndexID: 3
      Kind: 2
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 4
      IndexID: 3
      Kind: 2
      Ordinal: 1
      TableID: 107
    *scop.MakeAbsentTempIndexDeleteOnly
      Index:
        ConstraintID: 4
        IndexID: 4
        IsUnique: true
        SourceIndexID: 1
        TableID: 107
    *scop.MaybeAddSplitForIndex
      IndexID: 4
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 4
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 2
      IndexID: 4
      Kind: 2
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 4
      IndexID: 4
      Kind: 2
      Ordinal: 1
      TableID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
      Initialize: true
    *scop.SetJobStateOnDescriptor
      DescriptorID: 105
      Initialize: true
    *scop.SetJobStateOnDescriptor
      DescriptorID: 106
      Initialize: true
    *scop.SetJobStateOnDescriptor
      DescriptorID: 107
      Initialize: true
    *scop.SetJobStateOnDescriptor
      DescriptorID: 108
      Initialize: true
    *scop.CreateSchemaChangerJob
      Authorization:
        AppName: $ internal-test
        UserName: root
      DescriptorIDs:
      - 104
      - 105
      - 106
      - 107
      - 108
      JobID: 1
      RunningStatus: PostCommitPhase stage 1 of 7 with 1 MutationType op pending
      Statements:
      - statement: ALTER TABLE defaultdb.foo DROP COLUMN v2 CASCADE
        redactedstatement: ALTER TABLE ‹defaultdb›.public.‹foo› DROP COLUMN ‹v2› CASCADE
        statementtag: ALTER TABLE
PostCommitPhase stage 1 of 7 with 7 MutationType ops
  transitions:
    [[TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT], DELETE_ONLY] -> WRITE_ONLY
    [[IndexData:{DescID: 107, IndexID: 4}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
  ops:
    *scop.MakeDeleteOnlyIndexWriteOnly
      IndexID: 4
      TableID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 105
    *scop.SetJobStateOnDescriptor
      DescriptorID: 106
    *scop.SetJobStateOnDescriptor
      DescriptorID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 108
    *scop.UpdateSchemaChangerJob
      JobID: 1
PostCommitPhase stage 2 of 7 with 1 BackfillType op
  transitions:
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], BACKFILL_ONLY] -> BACKFILLED
  ops:
    *scop.BackfillIndex
      IndexID: 3
      SourceIndexID: 1
      TableID: 107
PostCommitPhase stage 3 of 7 with 7 MutationType ops
  transitions:
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], BACKFILLED] -> DELETE_ONLY
  ops:
    *scop.MakeBackfillingIndexDeleteOnly
      IndexID: 3
      TableID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 105
    *scop.SetJobStateOnDescriptor
      DescriptorID: 106
    *scop.SetJobStateOnDescriptor
      DescriptorID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 108
    *scop.UpdateSchemaChangerJob
      JobID: 1
PostCommitPhase stage 4 of 7 with 7 MutationType ops
  transitions:
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], DELETE_ONLY] -> MERGE_ONLY
  ops:
    *scop.MakeBackfilledIndexMerging
      IndexID: 3
      TableID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 105
    *scop.SetJobStateOnDescriptor
      DescriptorID: 106
    *scop.SetJobStateOnDescriptor
      DescriptorID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 108
    *scop.UpdateSchemaChangerJob
      JobID: 1
PostCommitPhase stage 5 of 7 with 1 BackfillType op
  transitions:
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], MERGE_ONLY] -> MERGED
  ops:
    *scop.MergeIndex
      BackfilledIndexID: 3
      TableID: 107
      TemporaryIndexID: 4
PostCommitPhase stage 6 of 7 with 8 MutationType ops
  transitions:
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], MERGED] -> WRITE_ONLY
    [[TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT], WRITE_ONLY] -> TRANSIENT_DELETE_ONLY
  ops:
    *scop.MakeWriteOnlyIndexDeleteOnly
      IndexID: 4
      TableID: 107
    *scop.MakeMergedIndexWriteOnly
      IndexID: 3
      TableID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 105
    *scop.SetJobStateOnDescriptor
      DescriptorID: 106
    *scop.SetJobStateOnDescriptor
      DescriptorID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 108
    *scop.UpdateSchemaChangerJob
      JobID: 1
PostCommitPhase stage 7 of 7 with 1 ValidationType op
  transitions:
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], WRITE_ONLY] -> VALIDATED
  ops:
    *scop.ValidateIndex
      IndexID: 3
      TableID: 107
PostCommitNonRevertiblePhase stage 1 of 3 with 60 MutationType ops
  transitions:
    [[Column:{DescID: 107, ColumnID: 3}, ABSENT], PUBLIC] -> WRITE_ONLY
    [[ColumnName:{DescID: 107, Name: v2, ColumnID: 3}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnNotNull:{DescID: 107, ColumnID: 3, IndexID: 0}, ABSENT], VALIDATED] -> ABSENT
    [[PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT], PUBLIC] -> VALIDATED
    [[IndexName:{DescID: 107, Name: foo_pkey, IndexID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 2}, ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 2}, ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 2}, ABSENT], PUBLIC] -> ABSENT
    [[SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, ABSENT], VALIDATED] -> DELETE_ONLY
    [[IndexName:{DescID: 107, Name: foo_v2_key, IndexID: 2}, ABSENT], PUBLIC] -> ABSENT
    [[Namespace:{DescID: 108, Name: fooview, ReferencedDescID: 100}, ABSENT], PUBLIC] -> ABSENT
    [[Owner:{DescID: 108}, ABSENT], PUBLIC] -> ABSENT
    [[UserPrivileges:{DescID: 108, Name: admin}, ABSENT], PUBLIC] -> ABSENT
    [[UserPrivileges:{DescID: 108, Name: root}, ABSENT], PUBLIC] -> ABSENT
    [[View:{DescID: 108}, ABSENT], PUBLIC] -> DROPPED
    [[SchemaChild:{DescID: 108, ReferencedDescID: 101}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: k, ColumnID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 1, TypeName: INT8}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 2}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: v1, ColumnID: 2}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ReferencedTypeIDs: [104 105], ColumnFamilyID: 0, ColumnID: 2, TypeName: public.footyp}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 3}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: v2, ColumnID: 3}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 3, TypeName: INT8}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 4294967295}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: crdb_internal_mvcc_timestamp, ColumnID: 4294967295}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967295, TypeName: DECIMAL}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 4294967294}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: tableoid, ColumnID: 4294967294}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967294, TypeName: OID}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 4294967293}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: crdb_internal_origin_id, ColumnID: 4294967293}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967293, TypeName: INT4}, ABSENT], PUBLIC] -> ABSENT
    [[Column:{DescID: 108, ColumnID: 4294967292}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnName:{DescID: 108, Name: crdb_internal_origin_timestamp, ColumnID: 4294967292}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967292, TypeName: DECIMAL}, ABSENT], PUBLIC] -> ABSENT
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], VALIDATED] -> PUBLIC
    [[IndexName:{DescID: 107, Name: foo_pkey, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT], TRANSIENT_DELETE_ONLY] -> TRANSIENT_ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 4}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 4}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 4}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
  ops:
    *scop.RemoveColumnNotNull
      ColumnID: 3
      TableID: 107
    *scop.MakePublicPrimaryIndexWriteOnly
      IndexID: 1
      TableID: 107
    *scop.SetIndexName
      IndexID: 1
      Name: crdb_internal_index_1_name_placeholder
      TableID: 107
    *scop.MarkDescriptorAsDropped
      DescriptorID: 108
    *scop.RemoveBackReferenceInTypes
      BackReferencedDescriptorID: 108
      TypeIDs:
      - 104
    *scop.RemoveBackReferencesInRelations
      BackReferencedID: 108
      RelationIDs:
      - 107
    *scop.RemoveObjectParent
      ObjectID: 108
      ParentSchemaID: 101
    *scop.MakePublicColumnWriteOnly
      ColumnID: 1
      TableID: 108
    *scop.SetColumnName
      ColumnID: 1
      Name: crdb_internal_column_1_name_placeholder
      TableID: 108
    *scop.MakePublicColumnWriteOnly
      ColumnID: 2
      TableID: 108
    *scop.SetColumnName
      ColumnID: 2
      Name: crdb_internal_column_2_name_placeholder
      TableID: 108
    *scop.RemoveDroppedColumnType
      ColumnID: 2
      TableID: 108
    *scop.UpdateTableBackReferencesInTypes
      BackReferencedTableID: 108
      TypeIDs:
      - 104
      - 105
    *scop.MakePublicColumnWriteOnly
      ColumnID: 3
      TableID: 108
    *scop.SetColumnName
      ColumnID: 3
      Name: crdb_internal_column_3_name_placeholder
      TableID: 108
    *scop.MakePublicColumnWriteOnly
      ColumnID: 4294967295
      TableID: 108
    *scop.SetColumnName
      ColumnID: 4294967295
      Name: crdb_internal_column_4294967295_name_placeholder
      TableID: 108
    *scop.MakePublicColumnWriteOnly
      ColumnID: 4294967294
      TableID: 108
    *scop.SetColumnName
      ColumnID: 4294967294
      Name: crdb_internal_column_4294967294_name_placeholder
      TableID: 108
    *scop.MakePublicColumnWriteOnly
      ColumnID: 4294967293
      TableID: 108
    *scop.SetColumnName
      ColumnID: 4294967293
      Name: crdb_internal_column_4294967293_name_placeholder
      TableID: 108
    *scop.MakePublicColumnWriteOnly
      ColumnID: 4294967292
      TableID: 108
    *scop.SetColumnName
      ColumnID: 4294967292
      Name: crdb_internal_column_4294967292_name_placeholder
      TableID: 108
    *scop.SetIndexName
      IndexID: 3
      Name: foo_pkey
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 1
      IndexID: 4
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 2
      IndexID: 4
      Kind: 2
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 4
      IndexID: 4
      Kind: 2
      Ordinal: 1
      TableID: 107
    *scop.MakePublicColumnWriteOnly
      ColumnID: 3
      TableID: 107
    *scop.SetColumnName
      ColumnID: 3
      Name: crdb_internal_column_3_name_placeholder
      TableID: 107
    *scop.MakeWriteOnlyIndexDeleteOnly
      IndexID: 2
      TableID: 107
    *scop.SetIndexName
      IndexID: 2
      Name: crdb_internal_index_2_name_placeholder
      TableID: 107
    *scop.DrainDescriptorName
      Namespace:
        DatabaseID: 100
        DescriptorID: 108
        Name: fooview
        SchemaID: 101
    *scop.NotImplementedForPublicObjects
      DescID: 108
      ElementType: scpb.Owner
    *scop.RemoveUserPrivileges
      DescriptorID: 108
      User: admin
    *scop.RemoveUserPrivileges
      DescriptorID: 108
      User: root
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 1
      TableID: 108
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 2
      TableID: 108
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 3
      TableID: 108
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 4294967295
      TableID: 108
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 4294967294
      TableID: 108
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 4294967293
      TableID: 108
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 4294967292
      TableID: 108
    *scop.MakeValidatedPrimaryIndexPublic
      IndexID: 3
      TableID: 107
    *scop.MakeIndexAbsent
      IndexID: 4
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 3
      IndexID: 2
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 1
      IndexID: 2
      Kind: 1
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 2
      IndexID: 2
      Kind: 2
      TableID: 107
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 1
      TableID: 108
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 2
      TableID: 108
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 3
      TableID: 108
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 4294967295
      TableID: 108
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 4294967294
      TableID: 108
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 4294967293
      TableID: 108
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 4294967292
      TableID: 108
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 105
    *scop.SetJobStateOnDescriptor
      DescriptorID: 106
    *scop.SetJobStateOnDescriptor
      DescriptorID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 108
    *scop.UpdateSchemaChangerJob
      IsNonCancelable: true
      JobID: 1
PostCommitNonRevertiblePhase stage 2 of 3 with 13 MutationType ops
  transitions:
    [[Column:{DescID: 107, ColumnID: 3}, ABSENT], WRITE_ONLY] -> DELETE_ONLY
    [[IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT], VALIDATED] -> DELETE_ONLY
    [[SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, ABSENT], DELETE_ONLY] -> ABSENT
    [[View:{DescID: 108}, ABSENT], DROPPED] -> ABSENT
  ops:
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 3
      TableID: 107
    *scop.MakeIndexAbsent
      IndexID: 2
      TableID: 107
    *scop.DeleteDescriptor
      DescriptorID: 108
    *scop.MakeWriteOnlyIndexDeleteOnly
      IndexID: 1
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 1
      IndexID: 1
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 2
      IndexID: 1
      Kind: 2
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 3
      IndexID: 1
      Kind: 2
      Ordinal: 1
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 4
      IndexID: 1
      Kind: 2
      Ordinal: 2
      TableID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 104
    *scop.SetJobStateOnDescriptor
      DescriptorID: 105
    *scop.SetJobStateOnDescriptor
      DescriptorID: 106
    *scop.SetJobStateOnDescriptor
      DescriptorID: 107
    *scop.UpdateSchemaChangerJob
      DescriptorIDsToRemove:
      - 108
      IsNonCancelable: true
      JobID: 1
PostCommitNonRevertiblePhase stage 3 of 3 with 12 MutationType ops
  transitions:
    [[Column:{DescID: 107, ColumnID: 3}, ABSENT], DELETE_ONLY] -> ABSENT
    [[ColumnType:{DescID: 107, ColumnFamilyID: 0, ColumnID: 3, TypeName: INT8}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnDefaultExpression:{DescID: 107, ColumnID: 3, ReferencedSequenceIDs: [106], Expr: nextval(106:::REGCLASS)}, ABSENT], PUBLIC] -> ABSENT
    [[PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT], DELETE_ONLY] -> ABSENT
    [[IndexData:{DescID: 107, IndexID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[IndexData:{DescID: 107, IndexID: 2}, ABSENT], PUBLIC] -> ABSENT
    [[IndexData:{DescID: 107, IndexID: 4}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
  ops:
    *scop.RemoveColumnDefaultExpression
      ColumnID: 3
      TableID: 107
    *scop.UpdateTableBackReferencesInSequences
      BackReferencedColumnID: 3
      BackReferencedTableID: 107
      SequenceIDs:
      - 106
    *scop.MakeIndexAbsent
      IndexID: 1
      TableID: 107
    *scop.CreateGCJobForIndex
      IndexID: 1
      StatementForDropJob:
        Statement: ALTER TABLE defaultdb.public.foo DROP COLUMN v2 CASCADE
      TableID: 107
    *scop.CreateGCJobForIndex
      IndexID: 2
      StatementForDropJob:
        Statement: ALTER TABLE defaultdb.public.foo DROP COLUMN v2 CASCADE
      TableID: 107
    *scop.CreateGCJobForIndex
      IndexID: 4
      StatementForDropJob:
        Statement: ALTER TABLE defaultdb.public.foo DROP COLUMN v2 CASCADE
      TableID: 107
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 3
      TableID: 107
    *scop.RemoveJobStateFromDescriptor
      DescriptorID: 104
      JobID: 1
    *scop.RemoveJobStateFromDescriptor
      DescriptorID: 105
      JobID: 1
    *scop.RemoveJobStateFromDescriptor
      DescriptorID: 106
      JobID: 1
    *scop.RemoveJobStateFromDescriptor
      DescriptorID: 107
      JobID: 1
    *scop.UpdateSchemaChangerJob
      DescriptorIDsToRemove:
      - 104
      - 105
      - 106
      - 107
      IsNonCancelable: true
      JobID: 1

deps
ALTER TABLE defaultdb.foo DROP COLUMN v2 CASCADE;
----
- from: [Column:{DescID: 107, ColumnID: 3}, DELETE_ONLY]
  to:   [Column:{DescID: 107, ColumnID: 3}, ABSENT]
  kind: PreviousTransactionPrecedence
  rule: Column transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT
- from: [Column:{DescID: 107, ColumnID: 3}, PUBLIC]
  to:   [Column:{DescID: 107, ColumnID: 3}, WRITE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: Column transitions to ABSENT uphold 2-version invariant: PUBLIC->WRITE_ONLY
- from: [Column:{DescID: 107, ColumnID: 3}, WRITE_ONLY]
  to:   [Column:{DescID: 107, ColumnID: 3}, DELETE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: Column transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY
- from: [Column:{DescID: 107, ColumnID: 3}, WRITE_ONLY]
  to:   [ColumnDefaultExpression:{DescID: 107, ColumnID: 3, ReferencedSequenceIDs: [106], Expr: nextval(106:::REGCLASS)}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 107, ColumnID: 3}, WRITE_ONLY]
  to:   [ColumnName:{DescID: 107, Name: v2, ColumnID: 3}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 107, ColumnID: 3}, WRITE_ONLY]
  to:   [ColumnType:{DescID: 107, ColumnFamilyID: 0, ColumnID: 3, TypeName: INT8}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 107, ColumnID: 3}, WRITE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 1}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 107, ColumnID: 3}, WRITE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 2}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 107, ColumnID: 3}, WRITE_ONLY]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC]
  kind: Precedence
  rule: New primary index should go public only after columns being dropped move to WRITE_ONLY
- from: [Column:{DescID: 108, ColumnID: 1}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [Column:{DescID: 108, ColumnID: 1}, WRITE_ONLY]
  to:   [ColumnName:{DescID: 108, Name: k, ColumnID: 1}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 108, ColumnID: 1}, WRITE_ONLY]
  to:   [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 1, TypeName: INT8}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 108, ColumnID: 2}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [Column:{DescID: 108, ColumnID: 2}, WRITE_ONLY]
  to:   [ColumnName:{DescID: 108, Name: v1, ColumnID: 2}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 108, ColumnID: 2}, WRITE_ONLY]
  to:   [ColumnType:{DescID: 108, ReferencedTypeIDs: [104 105], ColumnFamilyID: 0, ColumnID: 2, TypeName: public.footyp}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 108, ColumnID: 3}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [Column:{DescID: 108, ColumnID: 3}, WRITE_ONLY]
  to:   [ColumnName:{DescID: 108, Name: v2, ColumnID: 3}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 108, ColumnID: 3}, WRITE_ONLY]
  to:   [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 3, TypeName: INT8}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 108, ColumnID: 4294967292}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [Column:{DescID: 108, ColumnID: 4294967292}, WRITE_ONLY]
  to:   [ColumnName:{DescID: 108, Name: crdb_internal_origin_timestamp, ColumnID: 4294967292}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 108, ColumnID: 4294967292}, WRITE_ONLY]
  to:   [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967292, TypeName: DECIMAL}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 108, ColumnID: 4294967293}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [Column:{DescID: 108, ColumnID: 4294967293}, WRITE_ONLY]
  to:   [ColumnName:{DescID: 108, Name: crdb_internal_origin_id, ColumnID: 4294967293}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 108, ColumnID: 4294967293}, WRITE_ONLY]
  to:   [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967293, TypeName: INT4}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 108, ColumnID: 4294967294}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [Column:{DescID: 108, ColumnID: 4294967294}, WRITE_ONLY]
  to:   [ColumnName:{DescID: 108, Name: tableoid, ColumnID: 4294967294}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 108, ColumnID: 4294967294}, WRITE_ONLY]
  to:   [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967294, TypeName: OID}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 108, ColumnID: 4294967295}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [Column:{DescID: 108, ColumnID: 4294967295}, WRITE_ONLY]
  to:   [ColumnName:{DescID: 108, Name: crdb_internal_mvcc_timestamp, ColumnID: 4294967295}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 108, ColumnID: 4294967295}, WRITE_ONLY]
  to:   [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967295, TypeName: DECIMAL}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [ColumnDefaultExpression:{DescID: 107, ColumnID: 3, ReferencedSequenceIDs: [106], Expr: nextval(106:::REGCLASS)}, ABSENT]
  to:   [Column:{DescID: 107, ColumnID: 3}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnDefaultExpression:{DescID: 107, ColumnID: 3, ReferencedSequenceIDs: [106], Expr: nextval(106:::REGCLASS)}, ABSENT]
  to:   [ColumnType:{DescID: 107, 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: 107, Name: v2, ColumnID: 3}, ABSENT]
  to:   [Column:{DescID: 107, ColumnID: 3}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnName:{DescID: 108, Name: crdb_internal_mvcc_timestamp, ColumnID: 4294967295}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 4294967295}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnName:{DescID: 108, Name: crdb_internal_mvcc_timestamp, ColumnID: 4294967295}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [ColumnName:{DescID: 108, Name: crdb_internal_origin_id, ColumnID: 4294967293}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 4294967293}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnName:{DescID: 108, Name: crdb_internal_origin_id, ColumnID: 4294967293}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [ColumnName:{DescID: 108, Name: crdb_internal_origin_timestamp, ColumnID: 4294967292}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 4294967292}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnName:{DescID: 108, Name: crdb_internal_origin_timestamp, ColumnID: 4294967292}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [ColumnName:{DescID: 108, Name: k, ColumnID: 1}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 1}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnName:{DescID: 108, Name: k, ColumnID: 1}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [ColumnName:{DescID: 108, Name: tableoid, ColumnID: 4294967294}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 4294967294}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnName:{DescID: 108, Name: tableoid, ColumnID: 4294967294}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [ColumnName:{DescID: 108, Name: v1, ColumnID: 2}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 2}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnName:{DescID: 108, Name: v1, ColumnID: 2}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [ColumnName:{DescID: 108, Name: v2, ColumnID: 3}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 3}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnName:{DescID: 108, Name: v2, ColumnID: 3}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [ColumnNotNull:{DescID: 107, ColumnID: 3, IndexID: 0}, ABSENT]
  to:   [Column:{DescID: 107, ColumnID: 3}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnNotNull:{DescID: 107, ColumnID: 3, IndexID: 0}, ABSENT]
  to:   [Column:{DescID: 107, ColumnID: 3}, WRITE_ONLY]
  kind: Precedence
  rule: column constraint removed right before column reaches write only
- from: [ColumnNotNull:{DescID: 107, ColumnID: 3, IndexID: 0}, PUBLIC]
  to:   [ColumnNotNull:{DescID: 107, ColumnID: 3, IndexID: 0}, VALIDATED]
  kind: PreviousTransactionPrecedence
  rule: ColumnNotNull transitions to ABSENT uphold 2-version invariant: PUBLIC->VALIDATED
- from: [ColumnNotNull:{DescID: 107, ColumnID: 3, IndexID: 0}, VALIDATED]
  to:   [ColumnNotNull:{DescID: 107, ColumnID: 3, IndexID: 0}, ABSENT]
  kind: PreviousTransactionPrecedence
  rule: ColumnNotNull transitions to ABSENT uphold 2-version invariant: VALIDATED->ABSENT
- from: [ColumnType:{DescID: 107, ColumnFamilyID: 0, ColumnID: 3, TypeName: INT8}, ABSENT]
  to:   [Column:{DescID: 107, ColumnID: 3}, ABSENT]
  kind: SameStagePrecedence
  rules: [dependents removed before column; column type removed right before column when not dropping relation]
- from: [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 1, TypeName: INT8}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 1}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 1, TypeName: INT8}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 3, TypeName: INT8}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 3}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 3, TypeName: INT8}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967292, TypeName: DECIMAL}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 4294967292}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967292, TypeName: DECIMAL}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967293, TypeName: INT4}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 4294967293}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967293, TypeName: INT4}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967294, TypeName: OID}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 4294967294}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967294, TypeName: OID}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967295, TypeName: DECIMAL}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 4294967295}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967295, TypeName: DECIMAL}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [ColumnType:{DescID: 108, ReferencedTypeIDs: [104 105], ColumnFamilyID: 0, ColumnID: 2, TypeName: public.footyp}, ABSENT]
  to:   [Column:{DescID: 108, ColumnID: 2}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnType:{DescID: 108, ReferencedTypeIDs: [104 105], ColumnFamilyID: 0, ColumnID: 2, TypeName: public.footyp}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 1}, ABSENT]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 2}, ABSENT]
  to:   [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 3}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILLED]
  kind: Precedence
  rule: index-column added to index before index is backfilled
- from: [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 3}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC]
  kind: Precedence
  rule: index dependents exist before index becomes public
- from: [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 4}, PUBLIC]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, WRITE_ONLY]
  kind: Precedence
  rule: index-column added to index before temp index receives writes
- from: [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 4}, TRANSIENT_ABSENT]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 1}, ABSENT]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 2}, ABSENT]
  to:   [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 3}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILLED]
  kind: Precedence
  rule: index-column added to index before index is backfilled
- from: [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 3}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC]
  kind: Precedence
  rule: index dependents exist before index becomes public
- from: [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 4}, PUBLIC]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, WRITE_ONLY]
  kind: Precedence
  rule: index-column added to index before temp index receives writes
- from: [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 4}, TRANSIENT_ABSENT]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 1}, ABSENT]
  to:   [Column:{DescID: 107, ColumnID: 3}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 1}, ABSENT]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 2}, ABSENT]
  to:   [Column:{DescID: 107, ColumnID: 3}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 2}, ABSENT]
  to:   [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 1}, ABSENT]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 3}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILLED]
  kind: Precedence
  rule: index-column added to index before index is backfilled
- from: [IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 3}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC]
  kind: Precedence
  rule: index dependents exist before index becomes public
- from: [IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 4}, PUBLIC]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, WRITE_ONLY]
  kind: Precedence
  rule: index-column added to index before temp index receives writes
- from: [IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 4}, TRANSIENT_ABSENT]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexData:{DescID: 107, IndexID: 1}, DROPPED]
  to:   [IndexData:{DescID: 107, IndexID: 2}, DROPPED]
  kind: SameStagePrecedence
  rule: schedule all GC jobs for a descriptor in the same stage
- from: [IndexData:{DescID: 107, IndexID: 1}, DROPPED]
  to:   [IndexData:{DescID: 107, IndexID: 4}, TRANSIENT_DROPPED]
  kind: SameStagePrecedence
  rule: schedule all GC jobs for a descriptor in the same stage
- from: [IndexData:{DescID: 107, IndexID: 2}, DROPPED]
  to:   [IndexData:{DescID: 107, IndexID: 4}, TRANSIENT_DROPPED]
  kind: SameStagePrecedence
  rule: schedule all GC jobs for a descriptor in the same stage
- from: [IndexName:{DescID: 107, Name: foo_pkey, IndexID: 1}, ABSENT]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexName:{DescID: 107, Name: foo_pkey, IndexID: 3}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC]
  kind: SameStagePrecedence
  rules: [index dependents exist before index becomes public; primary index named right before index becomes public]
- from: [IndexName:{DescID: 107, Name: foo_v2_key, IndexID: 2}, ABSENT]
  to:   [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [Namespace:{DescID: 108, Name: fooview, ReferencedDescID: 100}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [Owner:{DescID: 108}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT]
  to:   [Column:{DescID: 107, ColumnID: 3}, ABSENT]
  kind: Precedence
  rule: indexes containing column reach absent before column
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT]
  to:   [IndexData:{DescID: 107, IndexID: 1}, DROPPED]
  kind: Precedence
  rule: index removed before garbage collection
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 1}, ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 1}, ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 1}, ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 1}, ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, DELETE_ONLY]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, VALIDATED]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to ABSENT uphold 2-version invariant: PUBLIC->VALIDATED
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, VALIDATED]
  to:   [IndexName:{DescID: 107, Name: foo_pkey, IndexID: 1}, ABSENT]
  kind: Precedence
  rule: index no longer public before dependents, excluding columns
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, VALIDATED]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, WRITE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to ABSENT uphold 2-version invariant: VALIDATED->WRITE_ONLY
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, VALIDATED]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC]
  kind: SameStagePrecedence
  rule: primary index swap
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, ABSENT]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILL_ONLY]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: ABSENT->BACKFILL_ONLY
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILLED]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, DELETE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: BACKFILLED->DELETE_ONLY
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILL_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 3}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILL_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 3}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILL_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 3}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILL_ONLY]
  to:   [IndexData:{DescID: 107, IndexID: 3}, PUBLIC]
  kind: SameStagePrecedence
  rule: index data exists as soon as index accepts backfills
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILL_ONLY]
  to:   [IndexName:{DescID: 107, Name: foo_pkey, IndexID: 3}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILL_ONLY]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILLED]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: BACKFILL_ONLY->BACKFILLED
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, DELETE_ONLY]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, MERGE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: DELETE_ONLY->MERGE_ONLY
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, MERGED]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, WRITE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: MERGED->WRITE_ONLY
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, MERGED]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  kind: Precedence
  rule: index is MERGED before its temp index starts to disappear
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, MERGE_ONLY]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, MERGED]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: MERGE_ONLY->MERGED
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, VALIDATED]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: VALIDATED->PUBLIC
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, WRITE_ONLY]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, VALIDATED]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: WRITE_ONLY->VALIDATED
- from: [SchemaChild:{DescID: 108, ReferencedDescID: 101}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, ABSENT]
  to:   [Column:{DescID: 107, ColumnID: 3}, ABSENT]
  kind: Precedence
  rule: indexes containing column reach absent before column
- from: [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, ABSENT]
  to:   [IndexData:{DescID: 107, IndexID: 2}, DROPPED]
  kind: Precedence
  rule: index removed before garbage collection
- from: [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 2}, ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 2}, ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 2}, ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, DELETE_ONLY]
  to:   [IndexName:{DescID: 107, Name: foo_v2_key, IndexID: 2}, ABSENT]
  kind: Precedence
  rule: index no longer public before index name
- from: [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, DELETE_ONLY]
  to:   [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, ABSENT]
  kind: PreviousTransactionPrecedence
  rule: SecondaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT
- from: [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, PUBLIC]
  to:   [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, VALIDATED]
  kind: PreviousTransactionPrecedence
  rule: SecondaryIndex transitions to ABSENT uphold 2-version invariant: PUBLIC->VALIDATED
- from: [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, VALIDATED]
  to:   [Column:{DescID: 107, ColumnID: 3}, WRITE_ONLY]
  kind: Precedence
  rule: secondary indexes containing column as key reach write-only before column
- from: [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, VALIDATED]
  to:   [IndexName:{DescID: 107, Name: foo_v2_key, IndexID: 2}, ABSENT]
  kind: Precedence
  rule: index no longer public before dependents, excluding columns
- from: [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, VALIDATED]
  to:   [SecondaryIndex:{DescID: 107, IndexID: 2, ConstraintID: 1, RecreateSourceIndexID: 0}, WRITE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: SecondaryIndex transitions to ABSENT uphold 2-version invariant: VALIDATED->WRITE_ONLY
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, ABSENT]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, DELETE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: ABSENT->DELETE_ONLY
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 4}, PUBLIC]
  kind: Precedence
  rule: temp index existence precedes index dependents
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 4}, PUBLIC]
  kind: Precedence
  rule: temp index existence precedes index dependents
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 4}, PUBLIC]
  kind: Precedence
  rule: temp index existence precedes index dependents
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, DELETE_ONLY]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, WRITE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: DELETE_ONLY->WRITE_ONLY
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT]
  to:   [IndexData:{DescID: 107, IndexID: 4}, TRANSIENT_DROPPED]
  kind: Precedence
  rule: index removed before garbage collection
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 4}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 4}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 4}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, WRITE_ONLY]
  kind: Precedence
  rule: temp index disappeared before its master index reaches WRITE_ONLY
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: PreviousTransactionPrecedence
  rule: TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_DELETE_ONLY->TRANSIENT_ABSENT
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, WRITE_ONLY]
  to:   [IndexData:{DescID: 107, IndexID: 4}, PUBLIC]
  kind: SameStagePrecedence
  rule: temp index data exists as soon as temp index accepts writes
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, WRITE_ONLY]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILLED]
  kind: Precedence
  rule: temp index is WRITE_ONLY before backfill
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, WRITE_ONLY]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: WRITE_ONLY->TRANSIENT_DELETE_ONLY
- from: [UserPrivileges:{DescID: 108, Name: admin}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [UserPrivileges:{DescID: 108, Name: root}, ABSENT]
  to:   [View:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: non-data dependents removed before descriptor
- from: [View:{DescID: 108}, DROPPED]
  to:   [Column:{DescID: 108, ColumnID: 1}, WRITE_ONLY]
  kind: Precedence
  rule: relation dropped before dependent column
- from: [View:{DescID: 108}, DROPPED]
  to:   [Column:{DescID: 108, ColumnID: 2}, WRITE_ONLY]
  kind: Precedence
  rule: relation dropped before dependent column
- from: [View:{DescID: 108}, DROPPED]
  to:   [Column:{DescID: 108, ColumnID: 3}, WRITE_ONLY]
  kind: Precedence
  rule: relation dropped before dependent column
- from: [View:{DescID: 108}, DROPPED]
  to:   [Column:{DescID: 108, ColumnID: 4294967292}, WRITE_ONLY]
  kind: Precedence
  rule: relation dropped before dependent column
- from: [View:{DescID: 108}, DROPPED]
  to:   [Column:{DescID: 108, ColumnID: 4294967293}, WRITE_ONLY]
  kind: Precedence
  rule: relation dropped before dependent column
- from: [View:{DescID: 108}, DROPPED]
  to:   [Column:{DescID: 108, ColumnID: 4294967294}, WRITE_ONLY]
  kind: Precedence
  rule: relation dropped before dependent column
- from: [View:{DescID: 108}, DROPPED]
  to:   [Column:{DescID: 108, ColumnID: 4294967295}, WRITE_ONLY]
  kind: Precedence
  rule: relation dropped before dependent column
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnName:{DescID: 108, Name: crdb_internal_mvcc_timestamp, ColumnID: 4294967295}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnName:{DescID: 108, Name: crdb_internal_origin_id, ColumnID: 4294967293}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnName:{DescID: 108, Name: crdb_internal_origin_timestamp, ColumnID: 4294967292}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnName:{DescID: 108, Name: k, ColumnID: 1}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnName:{DescID: 108, Name: tableoid, ColumnID: 4294967294}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnName:{DescID: 108, Name: v1, ColumnID: 2}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnName:{DescID: 108, Name: v2, ColumnID: 3}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 1, TypeName: INT8}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 3, TypeName: INT8}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967292, TypeName: DECIMAL}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967293, TypeName: INT4}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967294, TypeName: OID}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967295, TypeName: DECIMAL}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [ColumnType:{DescID: 108, ReferencedTypeIDs: [104 105], ColumnFamilyID: 0, ColumnID: 2, TypeName: public.footyp}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [Namespace:{DescID: 108, Name: fooview, ReferencedDescID: 100}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [Owner:{DescID: 108}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [SchemaChild:{DescID: 108, ReferencedDescID: 101}, ABSENT]
  kind: SameStagePrecedence
  rules: [descriptor dropped before dependent element removal; descriptor dropped right before removing back-reference in its parent descriptor]
- from: [View:{DescID: 108}, DROPPED]
  to:   [UserPrivileges:{DescID: 108, Name: admin}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [UserPrivileges:{DescID: 108, Name: root}, ABSENT]
  kind: Precedence
  rule: descriptor dropped before dependent element removal
- from: [View:{DescID: 108}, DROPPED]
  to:   [View:{DescID: 108}, ABSENT]
  kind: PreviousTransactionPrecedence
  rule: descriptor dropped in transaction before removal

ops
ALTER TABLE defaultdb.foo DROP COLUMN udfcol;
----
StatementPhase stage 1 of 1 with 10 MutationType ops
  transitions:
    [[Column:{DescID: 107, ColumnID: 4}, ABSENT], PUBLIC] -> WRITE_ONLY
    [[ColumnName:{DescID: 107, Name: udfcol, ColumnID: 4}, ABSENT], PUBLIC] -> ABSENT
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], ABSENT] -> BACKFILL_ONLY
    [[IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexData:{DescID: 107, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT], ABSENT] -> DELETE_ONLY
    [[IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 4}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 4}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 4}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
  ops:
    *scop.MakePublicColumnWriteOnly
      ColumnID: 4
      TableID: 107
    *scop.SetColumnName
      ColumnID: 4
      Name: crdb_internal_column_4_name_placeholder
      TableID: 107
    *scop.MakeAbsentIndexBackfilling
      Index:
        ConstraintID: 3
        IndexID: 3
        IsUnique: true
        SourceIndexID: 1
        TableID: 107
        TemporaryIndexID: 4
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 3
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 2
      IndexID: 3
      Kind: 2
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 3
      IndexID: 3
      Kind: 2
      Ordinal: 1
      TableID: 107
    *scop.MakeAbsentTempIndexDeleteOnly
      Index:
        ConstraintID: 4
        IndexID: 4
        IsUnique: true
        SourceIndexID: 1
        TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 4
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 2
      IndexID: 4
      Kind: 2
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 3
      IndexID: 4
      Kind: 2
      Ordinal: 1
      TableID: 107
PreCommitPhase stage 1 of 2 with 1 MutationType op
  transitions:
    [[Column:{DescID: 107, ColumnID: 4}, ABSENT], WRITE_ONLY] -> PUBLIC
    [[ColumnName:{DescID: 107, Name: udfcol, ColumnID: 4}, ABSENT], ABSENT] -> PUBLIC
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], BACKFILL_ONLY] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 3}, PUBLIC], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 3}, PUBLIC], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 3}, PUBLIC], PUBLIC] -> ABSENT
    [[IndexData:{DescID: 107, IndexID: 3}, PUBLIC], PUBLIC] -> ABSENT
    [[TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT], DELETE_ONLY] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 4}, TRANSIENT_ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 4}, TRANSIENT_ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 4}, TRANSIENT_ABSENT], PUBLIC] -> ABSENT
  ops:
    *scop.UndoAllInTxnImmediateMutationOpSideEffects
      {}
PreCommitPhase stage 2 of 2 with 15 MutationType ops
  transitions:
    [[Column:{DescID: 107, ColumnID: 4}, ABSENT], PUBLIC] -> WRITE_ONLY
    [[ColumnName:{DescID: 107, Name: udfcol, ColumnID: 4}, ABSENT], PUBLIC] -> ABSENT
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], ABSENT] -> BACKFILL_ONLY
    [[IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[IndexData:{DescID: 107, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT], ABSENT] -> DELETE_ONLY
    [[IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 4}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 4}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
    [[IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 4}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
  ops:
    *scop.MakePublicColumnWriteOnly
      ColumnID: 4
      TableID: 107
    *scop.SetColumnName
      ColumnID: 4
      Name: crdb_internal_column_4_name_placeholder
      TableID: 107
    *scop.MakeAbsentIndexBackfilling
      Index:
        ConstraintID: 3
        IndexID: 3
        IsUnique: true
        SourceIndexID: 1
        TableID: 107
        TemporaryIndexID: 4
    *scop.MaybeAddSplitForIndex
      IndexID: 3
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 3
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 2
      IndexID: 3
      Kind: 2
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 3
      IndexID: 3
      Kind: 2
      Ordinal: 1
      TableID: 107
    *scop.MakeAbsentTempIndexDeleteOnly
      Index:
        ConstraintID: 4
        IndexID: 4
        IsUnique: true
        SourceIndexID: 1
        TableID: 107
    *scop.MaybeAddSplitForIndex
      IndexID: 4
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 1
      IndexID: 4
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 2
      IndexID: 4
      Kind: 2
      TableID: 107
    *scop.AddColumnToIndex
      ColumnID: 3
      IndexID: 4
      Kind: 2
      Ordinal: 1
      TableID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 107
      Initialize: true
    *scop.SetJobStateOnDescriptor
      DescriptorID: 109
      Initialize: true
    *scop.CreateSchemaChangerJob
      Authorization:
        AppName: $ internal-test
        UserName: root
      DescriptorIDs:
      - 107
      - 109
      JobID: 1
      RunningStatus: PostCommitPhase stage 1 of 7 with 1 MutationType op pending
      Statements:
      - statement: ALTER TABLE defaultdb.foo DROP COLUMN udfcol
        redactedstatement: ALTER TABLE ‹defaultdb›.public.‹foo› DROP COLUMN ‹udfcol›
        statementtag: ALTER TABLE
PostCommitPhase stage 1 of 7 with 4 MutationType ops
  transitions:
    [[TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT], DELETE_ONLY] -> WRITE_ONLY
    [[IndexData:{DescID: 107, IndexID: 4}, TRANSIENT_ABSENT], ABSENT] -> PUBLIC
  ops:
    *scop.MakeDeleteOnlyIndexWriteOnly
      IndexID: 4
      TableID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 109
    *scop.UpdateSchemaChangerJob
      JobID: 1
PostCommitPhase stage 2 of 7 with 1 BackfillType op
  transitions:
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], BACKFILL_ONLY] -> BACKFILLED
  ops:
    *scop.BackfillIndex
      IndexID: 3
      SourceIndexID: 1
      TableID: 107
PostCommitPhase stage 3 of 7 with 4 MutationType ops
  transitions:
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], BACKFILLED] -> DELETE_ONLY
  ops:
    *scop.MakeBackfillingIndexDeleteOnly
      IndexID: 3
      TableID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 109
    *scop.UpdateSchemaChangerJob
      JobID: 1
PostCommitPhase stage 4 of 7 with 4 MutationType ops
  transitions:
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], DELETE_ONLY] -> MERGE_ONLY
  ops:
    *scop.MakeBackfilledIndexMerging
      IndexID: 3
      TableID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 109
    *scop.UpdateSchemaChangerJob
      JobID: 1
PostCommitPhase stage 5 of 7 with 1 BackfillType op
  transitions:
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], MERGE_ONLY] -> MERGED
  ops:
    *scop.MergeIndex
      BackfilledIndexID: 3
      TableID: 107
      TemporaryIndexID: 4
PostCommitPhase stage 6 of 7 with 5 MutationType ops
  transitions:
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], MERGED] -> WRITE_ONLY
    [[TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT], WRITE_ONLY] -> TRANSIENT_DELETE_ONLY
  ops:
    *scop.MakeWriteOnlyIndexDeleteOnly
      IndexID: 4
      TableID: 107
    *scop.MakeMergedIndexWriteOnly
      IndexID: 3
      TableID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 109
    *scop.UpdateSchemaChangerJob
      JobID: 1
PostCommitPhase stage 7 of 7 with 1 ValidationType op
  transitions:
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], WRITE_ONLY] -> VALIDATED
  ops:
    *scop.ValidateIndex
      IndexID: 3
      TableID: 107
PostCommitNonRevertiblePhase stage 1 of 3 with 12 MutationType ops
  transitions:
    [[Column:{DescID: 107, ColumnID: 4}, ABSENT], WRITE_ONLY] -> DELETE_ONLY
    [[PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT], PUBLIC] -> VALIDATED
    [[IndexName:{DescID: 107, Name: foo_pkey, IndexID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC], VALIDATED] -> PUBLIC
    [[IndexName:{DescID: 107, Name: foo_pkey, IndexID: 3}, PUBLIC], ABSENT] -> PUBLIC
    [[TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT], TRANSIENT_DELETE_ONLY] -> TRANSIENT_ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 4}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 4}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 4}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
  ops:
    *scop.MakeWriteOnlyColumnDeleteOnly
      ColumnID: 4
      TableID: 107
    *scop.MakePublicPrimaryIndexWriteOnly
      IndexID: 1
      TableID: 107
    *scop.SetIndexName
      IndexID: 1
      Name: crdb_internal_index_1_name_placeholder
      TableID: 107
    *scop.SetIndexName
      IndexID: 3
      Name: foo_pkey
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 1
      IndexID: 4
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 2
      IndexID: 4
      Kind: 2
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 3
      IndexID: 4
      Kind: 2
      Ordinal: 1
      TableID: 107
    *scop.MakeValidatedPrimaryIndexPublic
      IndexID: 3
      TableID: 107
    *scop.MakeIndexAbsent
      IndexID: 4
      TableID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 109
    *scop.UpdateSchemaChangerJob
      IsNonCancelable: true
      JobID: 1
PostCommitNonRevertiblePhase stage 2 of 3 with 8 MutationType ops
  transitions:
    [[IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT], VALIDATED] -> DELETE_ONLY
  ops:
    *scop.MakeWriteOnlyIndexDeleteOnly
      IndexID: 1
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 1
      IndexID: 1
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 2
      IndexID: 1
      Kind: 2
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 3
      IndexID: 1
      Kind: 2
      Ordinal: 1
      TableID: 107
    *scop.RemoveColumnFromIndex
      ColumnID: 4
      IndexID: 1
      Kind: 2
      Ordinal: 2
      TableID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 107
    *scop.SetJobStateOnDescriptor
      DescriptorID: 109
    *scop.UpdateSchemaChangerJob
      IsNonCancelable: true
      JobID: 1
PostCommitNonRevertiblePhase stage 3 of 3 with 9 MutationType ops
  transitions:
    [[Column:{DescID: 107, ColumnID: 4}, ABSENT], DELETE_ONLY] -> ABSENT
    [[ColumnType:{DescID: 107, ColumnFamilyID: 0, ColumnID: 4, TypeName: INT8}, ABSENT], PUBLIC] -> ABSENT
    [[ColumnDefaultExpression:{DescID: 107, ColumnID: 4, Expr: [FUNCTION 100109](), ReferencedFunctionIDs: [109]}, ABSENT], PUBLIC] -> ABSENT
    [[PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT], DELETE_ONLY] -> ABSENT
    [[IndexData:{DescID: 107, IndexID: 1}, ABSENT], PUBLIC] -> ABSENT
    [[IndexData:{DescID: 107, IndexID: 4}, TRANSIENT_ABSENT], PUBLIC] -> TRANSIENT_ABSENT
  ops:
    *scop.RemoveColumnDefaultExpression
      ColumnID: 4
      TableID: 107
    *scop.RemoveTableColumnBackReferencesInFunctions
      BackReferencedColumnID: 4
      BackReferencedTableID: 107
      FunctionIDs:
      - 109
    *scop.MakeIndexAbsent
      IndexID: 1
      TableID: 107
    *scop.CreateGCJobForIndex
      IndexID: 1
      StatementForDropJob:
        Statement: ALTER TABLE defaultdb.public.foo DROP COLUMN udfcol
      TableID: 107
    *scop.CreateGCJobForIndex
      IndexID: 4
      StatementForDropJob:
        Statement: ALTER TABLE defaultdb.public.foo DROP COLUMN udfcol
      TableID: 107
    *scop.MakeDeleteOnlyColumnAbsent
      ColumnID: 4
      TableID: 107
    *scop.RemoveJobStateFromDescriptor
      DescriptorID: 107
      JobID: 1
    *scop.RemoveJobStateFromDescriptor
      DescriptorID: 109
      JobID: 1
    *scop.UpdateSchemaChangerJob
      DescriptorIDsToRemove:
      - 107
      - 109
      IsNonCancelable: true
      JobID: 1

deps
ALTER TABLE defaultdb.foo DROP COLUMN udfcol;
----
- from: [Column:{DescID: 107, ColumnID: 4}, DELETE_ONLY]
  to:   [Column:{DescID: 107, ColumnID: 4}, ABSENT]
  kind: PreviousTransactionPrecedence
  rule: Column transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT
- from: [Column:{DescID: 107, ColumnID: 4}, PUBLIC]
  to:   [Column:{DescID: 107, ColumnID: 4}, WRITE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: Column transitions to ABSENT uphold 2-version invariant: PUBLIC->WRITE_ONLY
- from: [Column:{DescID: 107, ColumnID: 4}, WRITE_ONLY]
  to:   [Column:{DescID: 107, ColumnID: 4}, DELETE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: Column transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY
- from: [Column:{DescID: 107, ColumnID: 4}, WRITE_ONLY]
  to:   [ColumnDefaultExpression:{DescID: 107, ColumnID: 4, Expr: [FUNCTION 100109](), ReferencedFunctionIDs: [109]}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 107, ColumnID: 4}, WRITE_ONLY]
  to:   [ColumnName:{DescID: 107, Name: udfcol, ColumnID: 4}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 107, ColumnID: 4}, WRITE_ONLY]
  to:   [ColumnType:{DescID: 107, ColumnFamilyID: 0, ColumnID: 4, TypeName: INT8}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 107, ColumnID: 4}, WRITE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 1}, ABSENT]
  kind: Precedence
  rule: column no longer public before dependents
- from: [Column:{DescID: 107, ColumnID: 4}, WRITE_ONLY]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC]
  kind: Precedence
  rule: New primary index should go public only after columns being dropped move to WRITE_ONLY
- from: [ColumnDefaultExpression:{DescID: 107, ColumnID: 4, Expr: [FUNCTION 100109](), ReferencedFunctionIDs: [109]}, ABSENT]
  to:   [Column:{DescID: 107, ColumnID: 4}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnDefaultExpression:{DescID: 107, ColumnID: 4, Expr: [FUNCTION 100109](), ReferencedFunctionIDs: [109]}, ABSENT]
  to:   [ColumnType:{DescID: 107, ColumnFamilyID: 0, ColumnID: 4, 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: 107, Name: udfcol, ColumnID: 4}, ABSENT]
  to:   [Column:{DescID: 107, ColumnID: 4}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [ColumnType:{DescID: 107, ColumnFamilyID: 0, ColumnID: 4, TypeName: INT8}, ABSENT]
  to:   [Column:{DescID: 107, ColumnID: 4}, ABSENT]
  kind: SameStagePrecedence
  rules: [dependents removed before column; column type removed right before column when not dropping relation]
- from: [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 1}, ABSENT]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 3}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILLED]
  kind: Precedence
  rule: index-column added to index before index is backfilled
- from: [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 3}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC]
  kind: Precedence
  rule: index dependents exist before index becomes public
- from: [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 4}, PUBLIC]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, WRITE_ONLY]
  kind: Precedence
  rule: index-column added to index before temp index receives writes
- from: [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 4}, TRANSIENT_ABSENT]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 1}, ABSENT]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 3}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILLED]
  kind: Precedence
  rule: index-column added to index before index is backfilled
- from: [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 3}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC]
  kind: Precedence
  rule: index dependents exist before index becomes public
- from: [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 4}, PUBLIC]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, WRITE_ONLY]
  kind: Precedence
  rule: index-column added to index before temp index receives writes
- from: [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 4}, TRANSIENT_ABSENT]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 1}, ABSENT]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 3}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILLED]
  kind: Precedence
  rule: index-column added to index before index is backfilled
- from: [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 3}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC]
  kind: Precedence
  rule: index dependents exist before index becomes public
- from: [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 4}, PUBLIC]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, WRITE_ONLY]
  kind: Precedence
  rule: index-column added to index before temp index receives writes
- from: [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 4}, TRANSIENT_ABSENT]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 1}, ABSENT]
  to:   [Column:{DescID: 107, ColumnID: 4}, ABSENT]
  kind: Precedence
  rule: dependents removed before column
- from: [IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 1}, ABSENT]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexData:{DescID: 107, IndexID: 1}, DROPPED]
  to:   [IndexData:{DescID: 107, IndexID: 4}, TRANSIENT_DROPPED]
  kind: SameStagePrecedence
  rule: schedule all GC jobs for a descriptor in the same stage
- from: [IndexName:{DescID: 107, Name: foo_pkey, IndexID: 1}, ABSENT]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT]
  kind: Precedence
  rule: dependents removed before index
- from: [IndexName:{DescID: 107, Name: foo_pkey, IndexID: 3}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC]
  kind: SameStagePrecedence
  rules: [index dependents exist before index becomes public; primary index named right before index becomes public]
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT]
  to:   [Column:{DescID: 107, ColumnID: 4}, ABSENT]
  kind: Precedence
  rule: indexes containing column reach absent before column
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT]
  to:   [IndexData:{DescID: 107, IndexID: 1}, DROPPED]
  kind: Precedence
  rule: index removed before garbage collection
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 1}, ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 1}, ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 1}, ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 4, IndexID: 1}, ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, DELETE_ONLY]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, ABSENT]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, PUBLIC]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, VALIDATED]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to ABSENT uphold 2-version invariant: PUBLIC->VALIDATED
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, VALIDATED]
  to:   [IndexName:{DescID: 107, Name: foo_pkey, IndexID: 1}, ABSENT]
  kind: Precedence
  rule: index no longer public before dependents, excluding columns
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, VALIDATED]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, WRITE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to ABSENT uphold 2-version invariant: VALIDATED->WRITE_ONLY
- from: [PrimaryIndex:{DescID: 107, IndexID: 1, ConstraintID: 2}, VALIDATED]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC]
  kind: SameStagePrecedence
  rule: primary index swap
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, ABSENT]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILL_ONLY]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: ABSENT->BACKFILL_ONLY
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILLED]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, DELETE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: BACKFILLED->DELETE_ONLY
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILL_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 3}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILL_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 3}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILL_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 3}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILL_ONLY]
  to:   [IndexData:{DescID: 107, IndexID: 3}, PUBLIC]
  kind: SameStagePrecedence
  rule: index data exists as soon as index accepts backfills
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILL_ONLY]
  to:   [IndexName:{DescID: 107, Name: foo_pkey, IndexID: 3}, PUBLIC]
  kind: Precedence
  rule: index existence precedes index dependents
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILL_ONLY]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILLED]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: BACKFILL_ONLY->BACKFILLED
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, DELETE_ONLY]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, MERGE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: DELETE_ONLY->MERGE_ONLY
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, MERGED]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, WRITE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: MERGED->WRITE_ONLY
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, MERGED]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  kind: Precedence
  rule: index is MERGED before its temp index starts to disappear
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, MERGE_ONLY]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, MERGED]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: MERGE_ONLY->MERGED
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, VALIDATED]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, PUBLIC]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: VALIDATED->PUBLIC
- from: [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, WRITE_ONLY]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, VALIDATED]
  kind: PreviousTransactionPrecedence
  rule: PrimaryIndex transitions to PUBLIC uphold 2-version invariant: WRITE_ONLY->VALIDATED
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, ABSENT]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, DELETE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: ABSENT->DELETE_ONLY
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 4}, PUBLIC]
  kind: Precedence
  rule: temp index existence precedes index dependents
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 4}, PUBLIC]
  kind: Precedence
  rule: temp index existence precedes index dependents
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 4}, PUBLIC]
  kind: Precedence
  rule: temp index existence precedes index dependents
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, DELETE_ONLY]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, WRITE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: DELETE_ONLY->WRITE_ONLY
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT]
  to:   [IndexData:{DescID: 107, IndexID: 4}, TRANSIENT_DROPPED]
  kind: Precedence
  rule: index removed before garbage collection
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 1, IndexID: 4}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 2, IndexID: 4}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [IndexColumn:{DescID: 107, ColumnID: 3, IndexID: 4}, TRANSIENT_ABSENT]
  kind: Precedence
  rule: index drop mutation visible before cleaning up index columns
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, WRITE_ONLY]
  kind: Precedence
  rule: temp index disappeared before its master index reaches WRITE_ONLY
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_ABSENT]
  kind: PreviousTransactionPrecedence
  rule: TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_DELETE_ONLY->TRANSIENT_ABSENT
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, WRITE_ONLY]
  to:   [IndexData:{DescID: 107, IndexID: 4}, PUBLIC]
  kind: SameStagePrecedence
  rule: temp index data exists as soon as temp index accepts writes
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, WRITE_ONLY]
  to:   [PrimaryIndex:{DescID: 107, IndexID: 3, ConstraintID: 3, TemporaryIndexID: 4, SourceIndexID: 1}, BACKFILLED]
  kind: Precedence
  rule: temp index is WRITE_ONLY before backfill
- from: [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, WRITE_ONLY]
  to:   [TemporaryIndex:{DescID: 107, IndexID: 4, ConstraintID: 4, SourceIndexID: 1}, TRANSIENT_DELETE_ONLY]
  kind: PreviousTransactionPrecedence
  rule: TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: WRITE_ONLY->TRANSIENT_DELETE_ONLY
