deprules
----
- name: 'CheckConstraint transitions to ABSENT uphold 2-version invariant: PUBLIC->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = PUBLIC
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to ABSENT uphold 2-version invariant: TRANSIENT_ABSENT->ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $next-Node[CurrentStatus] = ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to ABSENT uphold 2-version invariant: TRANSIENT_VALIDATED->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to ABSENT uphold 2-version invariant: TRANSIENT_WRITE_ONLY->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to ABSENT uphold 2-version invariant: VALIDATED->ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - nodeNotExistsWithStatusIn_TRANSIENT_VALIDATED_WRITE_ONLY_TRANSIENT_WRITE_ONLY($prev-Target)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to PUBLIC uphold 2-version invariant: ABSENT->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = ABSENT
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to PUBLIC uphold 2-version invariant: VALIDATED->PUBLIC'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = PUBLIC
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to PUBLIC uphold 2-version invariant: WRITE_ONLY->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to TRANSIENT_ABSENT uphold 2-version invariant: ABSENT->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = ABSENT
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to TRANSIENT_ABSENT uphold 2-version invariant: PUBLIC->TRANSIENT_VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = PUBLIC
    - $next-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_VALIDATED->TRANSIENT_ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $next-Node[CurrentStatus] = TRANSIENT_ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - nodeNotExistsWithStatusIn_TRANSIENT_WRITE_ONLY($prev-Target)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_WRITE_ONLY->TRANSIENT_VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - $next-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to TRANSIENT_ABSENT uphold 2-version invariant: VALIDATED->PUBLIC'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = PUBLIC
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to TRANSIENT_ABSENT uphold 2-version invariant: WRITE_ONLY->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'Column transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.Column'
    - $next[Type] = '*scpb.Column'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = DELETE_ONLY
    - $next-Node[CurrentStatus] = ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'Column transitions to ABSENT uphold 2-version invariant: PUBLIC->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.Column'
    - $next[Type] = '*scpb.Column'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = PUBLIC
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'Column transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.Column'
    - $next[Type] = '*scpb.Column'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'Column transitions to PUBLIC uphold 2-version invariant: ABSENT->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.Column'
    - $next[Type] = '*scpb.Column'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = ABSENT
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'Column transitions to PUBLIC uphold 2-version invariant: DELETE_ONLY->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.Column'
    - $next[Type] = '*scpb.Column'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = DELETE_ONLY
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'Column transitions to PUBLIC uphold 2-version invariant: WRITE_ONLY->PUBLIC'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.Column'
    - $next[Type] = '*scpb.Column'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = PUBLIC
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'ColumnNotNull transitions to ABSENT uphold 2-version invariant: PUBLIC->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.ColumnNotNull'
    - $next[Type] = '*scpb.ColumnNotNull'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = PUBLIC
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'ColumnNotNull transitions to ABSENT uphold 2-version invariant: VALIDATED->ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.ColumnNotNull'
    - $next[Type] = '*scpb.ColumnNotNull'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - nodeNotExistsWithStatusIn_WRITE_ONLY($prev-Target)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'ColumnNotNull transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.ColumnNotNull'
    - $next[Type] = '*scpb.ColumnNotNull'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'ColumnNotNull transitions to PUBLIC uphold 2-version invariant: ABSENT->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.ColumnNotNull'
    - $next[Type] = '*scpb.ColumnNotNull'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = ABSENT
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'ColumnNotNull transitions to PUBLIC uphold 2-version invariant: VALIDATED->PUBLIC'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.ColumnNotNull'
    - $next[Type] = '*scpb.ColumnNotNull'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = PUBLIC
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'ColumnNotNull transitions to PUBLIC uphold 2-version invariant: WRITE_ONLY->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.ColumnNotNull'
    - $next[Type] = '*scpb.ColumnNotNull'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: Computed column expression is dropped before the column it depends on
  from: column-expr-Node
  kind: Precedence
  to: column-Node
  query:
    - $column-expr[Type] = '*scpb.ColumnComputeExpression'
    - $column[Type] = '*scpb.Column'
    - joinOnDescID($column-expr, $column, $table-id)
    - computedColumnTypeReferencesColumn(*scpb.ColumnComputeExpression, *scpb.Column)($column-expr, $column)
    - toAbsent($column-expr-Target, $column-Target)
    - $column-expr-Node[CurrentStatus] = ABSENT
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($column-expr, $column-expr-Target, $column-expr-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: Computed column expression is dropped before the column it depends on
  from: column-expr-Node
  kind: Precedence
  to: column-Node
  query:
    - $column-expr[Type] = '*scpb.ColumnComputeExpression'
    - $column[Type] = '*scpb.Column'
    - joinOnDescID($column-expr, $column, $table-id)
    - computedColumnTypeReferencesColumn(*scpb.ColumnComputeExpression, *scpb.Column)($column-expr, $column)
    - transient($column-expr-Target, $column-Target)
    - $column-expr-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $column-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - joinTargetNode($column-expr, $column-expr-Target, $column-expr-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: Computed column expression is dropped before the column it depends on
  from: column-expr-Node
  kind: Precedence
  to: column-Node
  query:
    - $column-expr[Type] = '*scpb.ColumnComputeExpression'
    - $column[Type] = '*scpb.Column'
    - joinOnDescID($column-expr, $column, $table-id)
    - computedColumnTypeReferencesColumn(*scpb.ColumnComputeExpression, *scpb.Column)($column-expr, $column)
    - $column-expr-Target[TargetStatus] = TRANSIENT_ABSENT
    - $column-expr-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $column-Target[TargetStatus] = ABSENT
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($column-expr, $column-expr-Target, $column-expr-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: Computed column expression is dropped before the column it depends on
  from: column-expr-Node
  kind: Precedence
  to: column-Node
  query:
    - $column-expr[Type] = '*scpb.ColumnComputeExpression'
    - $column[Type] = '*scpb.Column'
    - joinOnDescID($column-expr, $column, $table-id)
    - computedColumnTypeReferencesColumn(*scpb.ColumnComputeExpression, *scpb.Column)($column-expr, $column)
    - $column-expr-Target[TargetStatus] = ABSENT
    - $column-expr-Node[CurrentStatus] = ABSENT
    - $column-Target[TargetStatus] = TRANSIENT_ABSENT
    - $column-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - joinTargetNode($column-expr, $column-expr-Target, $column-expr-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: Constraint should be hidden before name
  from: constraint-name-Node
  kind: Precedence
  to: constraint-Node
  query:
    - $constraint-name[Type] = '*scpb.ConstraintWithoutIndexName'
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.CheckConstraintUnvalidated', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraint', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - joinOnConstraintID($constraint-name, $constraint, $table-id, $constraint-id)
    - toAbsent($constraint-name-Target, $constraint-Target)
    - $constraint-name-Node[CurrentStatus] = ABSENT
    - $constraint-Node[CurrentStatus] = ABSENT
    - joinTargetNode($constraint-name, $constraint-name-Target, $constraint-name-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: Constraint should be hidden before name
  from: constraint-name-Node
  kind: Precedence
  to: constraint-Node
  query:
    - $constraint-name[Type] = '*scpb.ConstraintWithoutIndexName'
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.CheckConstraintUnvalidated', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraint', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - joinOnConstraintID($constraint-name, $constraint, $table-id, $constraint-id)
    - transient($constraint-name-Target, $constraint-Target)
    - $constraint-name-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $constraint-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($constraint-name, $constraint-name-Target, $constraint-name-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: Constraint should be hidden before name
  from: constraint-name-Node
  kind: Precedence
  to: constraint-Node
  query:
    - $constraint-name[Type] = '*scpb.ConstraintWithoutIndexName'
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.CheckConstraintUnvalidated', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraint', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - joinOnConstraintID($constraint-name, $constraint, $table-id, $constraint-id)
    - $constraint-name-Target[TargetStatus] = TRANSIENT_ABSENT
    - $constraint-name-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $constraint-Target[TargetStatus] = ABSENT
    - $constraint-Node[CurrentStatus] = ABSENT
    - joinTargetNode($constraint-name, $constraint-name-Target, $constraint-name-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: Constraint should be hidden before name
  from: constraint-name-Node
  kind: Precedence
  to: constraint-Node
  query:
    - $constraint-name[Type] = '*scpb.ConstraintWithoutIndexName'
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.CheckConstraintUnvalidated', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraint', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - joinOnConstraintID($constraint-name, $constraint, $table-id, $constraint-id)
    - $constraint-name-Target[TargetStatus] = ABSENT
    - $constraint-name-Node[CurrentStatus] = ABSENT
    - $constraint-Target[TargetStatus] = TRANSIENT_ABSENT
    - $constraint-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($constraint-name, $constraint-name-Target, $constraint-name-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: Constraint should be hidden before name
  from: constraint-Node
  kind: Precedence
  to: constraint-name-Node
  query:
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.CheckConstraintUnvalidated', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraint', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - $constraint-name[Type] = '*scpb.ConstraintWithoutIndexName'
    - joinOnConstraintID($constraint, $constraint-name, $table-id, $constraint-id)
    - toAbsent($constraint-Target, $constraint-name-Target)
    - $constraint-Node[CurrentStatus] = VALIDATED
    - $constraint-name-Node[CurrentStatus] = ABSENT
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
    - joinTargetNode($constraint-name, $constraint-name-Target, $constraint-name-Node)
- name: Constraint should be hidden before name
  from: constraint-Node
  kind: Precedence
  to: constraint-name-Node
  query:
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.CheckConstraintUnvalidated', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraint', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - $constraint-name[Type] = '*scpb.ConstraintWithoutIndexName'
    - joinOnConstraintID($constraint, $constraint-name, $table-id, $constraint-id)
    - transient($constraint-Target, $constraint-name-Target)
    - $constraint-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $constraint-name-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
    - joinTargetNode($constraint-name, $constraint-name-Target, $constraint-name-Node)
- name: Constraint should be hidden before name
  from: constraint-Node
  kind: Precedence
  to: constraint-name-Node
  query:
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.CheckConstraintUnvalidated', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraint', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - $constraint-name[Type] = '*scpb.ConstraintWithoutIndexName'
    - joinOnConstraintID($constraint, $constraint-name, $table-id, $constraint-id)
    - $constraint-Target[TargetStatus] = TRANSIENT_ABSENT
    - $constraint-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $constraint-name-Target[TargetStatus] = ABSENT
    - $constraint-name-Node[CurrentStatus] = ABSENT
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
    - joinTargetNode($constraint-name, $constraint-name-Target, $constraint-name-Node)
- name: Constraint should be hidden before name
  from: constraint-Node
  kind: Precedence
  to: constraint-name-Node
  query:
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.CheckConstraintUnvalidated', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraint', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - $constraint-name[Type] = '*scpb.ConstraintWithoutIndexName'
    - joinOnConstraintID($constraint, $constraint-name, $table-id, $constraint-id)
    - $constraint-Target[TargetStatus] = ABSENT
    - $constraint-Node[CurrentStatus] = VALIDATED
    - $constraint-name-Target[TargetStatus] = TRANSIENT_ABSENT
    - $constraint-name-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
    - joinTargetNode($constraint-name, $constraint-name-Target, $constraint-name-Node)
- name: DEFAULT or ON UPDATE existence precedes writes to column
  from: expr-Node
  kind: Precedence
  to: column-Node
  query:
    - $expr[Type] IN ['*scpb.ColumnDefaultExpression', '*scpb.ColumnOnUpdateExpression']
    - $column[Type] = '*scpb.Column'
    - joinOnColumnID($expr, $column, $table-id, $col-id)
    - ToPublicOrTransient($expr-Target, $column-Target)
    - $expr-Node[CurrentStatus] = PUBLIC
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($expr, $expr-Target, $expr-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: 'ForeignKeyConstraint transitions to ABSENT uphold 2-version invariant: PUBLIC->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.ForeignKeyConstraint'
    - $next[Type] = '*scpb.ForeignKeyConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = PUBLIC
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'ForeignKeyConstraint transitions to ABSENT uphold 2-version invariant: VALIDATED->ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.ForeignKeyConstraint'
    - $next[Type] = '*scpb.ForeignKeyConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - nodeNotExistsWithStatusIn_WRITE_ONLY($prev-Target)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'ForeignKeyConstraint transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.ForeignKeyConstraint'
    - $next[Type] = '*scpb.ForeignKeyConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'ForeignKeyConstraint transitions to PUBLIC uphold 2-version invariant: ABSENT->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.ForeignKeyConstraint'
    - $next[Type] = '*scpb.ForeignKeyConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = ABSENT
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'ForeignKeyConstraint transitions to PUBLIC uphold 2-version invariant: VALIDATED->PUBLIC'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.ForeignKeyConstraint'
    - $next[Type] = '*scpb.ForeignKeyConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = PUBLIC
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'ForeignKeyConstraint transitions to PUBLIC uphold 2-version invariant: WRITE_ONLY->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.ForeignKeyConstraint'
    - $next[Type] = '*scpb.ForeignKeyConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: New primary index should go public only after columns being dropped move to WRITE_ONLY
  from: column-Node
  kind: Precedence
  to: new-primary-index-Node
  query:
    - $column[Type] = '*scpb.Column'
    - $new-primary-index[Type] = '*scpb.PrimaryIndex'
    - ColumnInSourcePrimaryIndex($index-column, $new-primary-index, $table-id, $column-id, $index-id)
    - joinOnColumnID($index-column, $column, $table-id, $column-id)
    - $column-Target[TargetStatus] = ABSENT
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - $new-primary-index-Target[TargetStatus] = PUBLIC
    - $new-primary-index-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($column, $column-Target, $column-Node)
    - joinTargetNode($new-primary-index, $new-primary-index-Target, $new-primary-index-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: BACKFILLED->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = BACKFILLED
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: BACKFILL_ONLY->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = BACKFILL_ONLY
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = DELETE_ONLY
    - $next-Node[CurrentStatus] = ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - nodeNotExistsWithStatusIn_TRANSIENT_DELETE_ONLY_BACKFILLED_TRANSIENT_BACKFILLED_BACKFILL_ONLY_TRANSIENT_BACKFILL_ONLY($prev-Target)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: MERGED->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = MERGED
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: MERGE_ONLY->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = MERGE_ONLY
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: PUBLIC->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = PUBLIC
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: TRANSIENT_ABSENT->ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $next-Node[CurrentStatus] = ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: TRANSIENT_BACKFILLED->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_BACKFILLED
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: TRANSIENT_BACKFILL_ONLY->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_BACKFILL_ONLY
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: TRANSIENT_DELETE_ONLY->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: TRANSIENT_MERGED->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_MERGED
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: TRANSIENT_MERGE_ONLY->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_MERGE_ONLY
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: TRANSIENT_VALIDATED->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: TRANSIENT_WRITE_ONLY->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: VALIDATED->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - nodeNotExistsWithStatusIn_TRANSIENT_VALIDATED($prev-Target)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - nodeNotExistsWithStatusIn_VALIDATED_TRANSIENT_WRITE_ONLY_MERGE_ONLY_TRANSIENT_MERGE_ONLY_MERGED_TRANSIENT_MERGED($prev-Target)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to PUBLIC uphold 2-version invariant: ABSENT->BACKFILL_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = ABSENT
    - $next-Node[CurrentStatus] = BACKFILL_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to PUBLIC uphold 2-version invariant: BACKFILLED->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = BACKFILLED
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to PUBLIC uphold 2-version invariant: BACKFILL_ONLY->BACKFILLED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = BACKFILL_ONLY
    - $next-Node[CurrentStatus] = BACKFILLED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to PUBLIC uphold 2-version invariant: DELETE_ONLY->MERGE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = DELETE_ONLY
    - $next-Node[CurrentStatus] = MERGE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to PUBLIC uphold 2-version invariant: MERGED->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = MERGED
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to PUBLIC uphold 2-version invariant: MERGE_ONLY->MERGED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = MERGE_ONLY
    - $next-Node[CurrentStatus] = MERGED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to PUBLIC uphold 2-version invariant: VALIDATED->PUBLIC'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = PUBLIC
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to PUBLIC uphold 2-version invariant: WRITE_ONLY->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: ABSENT->BACKFILL_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = ABSENT
    - $next-Node[CurrentStatus] = BACKFILL_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: BACKFILLED->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = BACKFILLED
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: BACKFILL_ONLY->BACKFILLED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = BACKFILL_ONLY
    - $next-Node[CurrentStatus] = BACKFILLED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: DELETE_ONLY->MERGE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = DELETE_ONLY
    - $next-Node[CurrentStatus] = MERGE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: MERGED->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = MERGED
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: MERGE_ONLY->MERGED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = MERGE_ONLY
    - $next-Node[CurrentStatus] = MERGED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: PUBLIC->TRANSIENT_VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = PUBLIC
    - $next-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_BACKFILLED->TRANSIENT_DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_BACKFILLED
    - $next-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_BACKFILL_ONLY->TRANSIENT_DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_BACKFILL_ONLY
    - $next-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_DELETE_ONLY->TRANSIENT_ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - $next-Node[CurrentStatus] = TRANSIENT_ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - nodeNotExistsWithStatusIn_TRANSIENT_BACKFILLED_TRANSIENT_BACKFILL_ONLY($prev-Target)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_MERGED->TRANSIENT_WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_MERGED
    - $next-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_MERGE_ONLY->TRANSIENT_WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_MERGE_ONLY
    - $next-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_VALIDATED->TRANSIENT_WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $next-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_WRITE_ONLY->TRANSIENT_DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - $next-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - nodeNotExistsWithStatusIn_TRANSIENT_VALIDATED_TRANSIENT_MERGE_ONLY_TRANSIENT_MERGED($prev-Target)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: VALIDATED->PUBLIC'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = PUBLIC
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: WRITE_ONLY->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to ABSENT uphold 2-version invariant: BACKFILLED->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = BACKFILLED
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to ABSENT uphold 2-version invariant: BACKFILL_ONLY->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = BACKFILL_ONLY
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = DELETE_ONLY
    - $next-Node[CurrentStatus] = ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - nodeNotExistsWithStatusIn_BACKFILLED_BACKFILL_ONLY($prev-Target)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to ABSENT uphold 2-version invariant: MERGED->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = MERGED
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to ABSENT uphold 2-version invariant: MERGE_ONLY->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = MERGE_ONLY
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to ABSENT uphold 2-version invariant: PUBLIC->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = PUBLIC
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to ABSENT uphold 2-version invariant: VALIDATED->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - nodeNotExistsWithStatusIn_VALIDATED_MERGE_ONLY_MERGED($prev-Target)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to PUBLIC uphold 2-version invariant: ABSENT->BACKFILL_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = ABSENT
    - $next-Node[CurrentStatus] = BACKFILL_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to PUBLIC uphold 2-version invariant: BACKFILLED->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = BACKFILLED
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to PUBLIC uphold 2-version invariant: BACKFILL_ONLY->BACKFILLED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = BACKFILL_ONLY
    - $next-Node[CurrentStatus] = BACKFILLED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to PUBLIC uphold 2-version invariant: DELETE_ONLY->MERGE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = DELETE_ONLY
    - $next-Node[CurrentStatus] = MERGE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to PUBLIC uphold 2-version invariant: MERGED->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = MERGED
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to PUBLIC uphold 2-version invariant: MERGE_ONLY->MERGED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = MERGE_ONLY
    - $next-Node[CurrentStatus] = MERGED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to PUBLIC uphold 2-version invariant: VALIDATED->PUBLIC'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = PUBLIC
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to PUBLIC uphold 2-version invariant: WRITE_ONLY->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'TemporaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.TemporaryIndex'
    - $next[Type] = '*scpb.TemporaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = DELETE_ONLY
    - $next-Node[CurrentStatus] = ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - nodeNotExistsWithStatusIn_TRANSIENT_DELETE_ONLY($prev-Target)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'TemporaryIndex transitions to ABSENT uphold 2-version invariant: TRANSIENT_ABSENT->ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.TemporaryIndex'
    - $next[Type] = '*scpb.TemporaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $next-Node[CurrentStatus] = ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'TemporaryIndex transitions to ABSENT uphold 2-version invariant: TRANSIENT_DELETE_ONLY->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.TemporaryIndex'
    - $next[Type] = '*scpb.TemporaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'TemporaryIndex transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.TemporaryIndex'
    - $next[Type] = '*scpb.TemporaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: ABSENT->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.TemporaryIndex'
    - $next[Type] = '*scpb.TemporaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = ABSENT
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: DELETE_ONLY->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.TemporaryIndex'
    - $next[Type] = '*scpb.TemporaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = DELETE_ONLY
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_DELETE_ONLY->TRANSIENT_ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.TemporaryIndex'
    - $next[Type] = '*scpb.TemporaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - $next-Node[CurrentStatus] = TRANSIENT_ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: WRITE_ONLY->TRANSIENT_DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.TemporaryIndex'
    - $next[Type] = '*scpb.TemporaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'UniqueWithoutIndexConstraint transitions to ABSENT uphold 2-version invariant: PUBLIC->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.UniqueWithoutIndexConstraint'
    - $next[Type] = '*scpb.UniqueWithoutIndexConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = PUBLIC
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'UniqueWithoutIndexConstraint transitions to ABSENT uphold 2-version invariant: VALIDATED->ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.UniqueWithoutIndexConstraint'
    - $next[Type] = '*scpb.UniqueWithoutIndexConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - nodeNotExistsWithStatusIn_WRITE_ONLY($prev-Target)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'UniqueWithoutIndexConstraint transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.UniqueWithoutIndexConstraint'
    - $next[Type] = '*scpb.UniqueWithoutIndexConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'UniqueWithoutIndexConstraint transitions to PUBLIC uphold 2-version invariant: ABSENT->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.UniqueWithoutIndexConstraint'
    - $next[Type] = '*scpb.UniqueWithoutIndexConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = ABSENT
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'UniqueWithoutIndexConstraint transitions to PUBLIC uphold 2-version invariant: VALIDATED->PUBLIC'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.UniqueWithoutIndexConstraint'
    - $next[Type] = '*scpb.UniqueWithoutIndexConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = PUBLIC
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'UniqueWithoutIndexConstraint transitions to PUBLIC uphold 2-version invariant: WRITE_ONLY->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.UniqueWithoutIndexConstraint'
    - $next[Type] = '*scpb.UniqueWithoutIndexConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: all adding indexes reached BACKFILL_ONLY before any of their columns disappear
  from: index-Node
  kind: Precedence
  to: column-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex']
    - $column[Type] = '*scpb.Column'
    - ColumnInIndex($index-column, $index, $table-id, $column-id, $index-id)
    - joinOnColumnID($index-column, $column, $table-id, $column-id)
    - $index-Target[TargetStatus] IN [PUBLIC, TRANSIENT_ABSENT]
    - $index-Node[CurrentStatus] = BACKFILL_ONLY
    - $column-Target[TargetStatus] = ABSENT
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: back-reference in parent descriptor is removed before parent descriptor is dropped
  from: back-reference-in-parent-descriptor-Node
  kind: Precedence
  to: parent-descriptor-Node
  query:
    - $back-reference-in-parent-descriptor[Type] IN ['*scpb.SchemaChild', '*scpb.SchemaParent']
    - $parent-descriptor[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.Database', '*scpb.EnumType', '*scpb.Function', '*scpb.Schema', '*scpb.Sequence', '*scpb.Table', '*scpb.View']
    - joinReferencedDescID($back-reference-in-parent-descriptor, $parent-descriptor, $desc-id)
    - toAbsent($back-reference-in-parent-descriptor-Target, $parent-descriptor-Target)
    - $back-reference-in-parent-descriptor-Node[CurrentStatus] = ABSENT
    - $parent-descriptor-Node[CurrentStatus] = DROPPED
    - joinTargetNode($back-reference-in-parent-descriptor, $back-reference-in-parent-descriptor-Target, $back-reference-in-parent-descriptor-Node)
    - joinTargetNode($parent-descriptor, $parent-descriptor-Target, $parent-descriptor-Node)
- name: column constraint removed right before column reaches write only
  from: column-constraint-Node
  kind: Precedence
  to: column-Node
  query:
    - $column-constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - $column[Type] = '*scpb.Column'
    - joinOnColumnID($column-constraint, $column, $table-id, $col-id)
    - toAbsent($column-constraint-Target, $column-Target)
    - $column-constraint-Node[CurrentStatus] = ABSENT
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($column-constraint, $column-constraint-Target, $column-constraint-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: column constraint removed right before column reaches write only
  from: column-constraint-Node
  kind: Precedence
  to: column-Node
  query:
    - $column-constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - $column[Type] = '*scpb.Column'
    - joinOnColumnID($column-constraint, $column, $table-id, $col-id)
    - transient($column-constraint-Target, $column-Target)
    - $column-constraint-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $column-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - joinTargetNode($column-constraint, $column-constraint-Target, $column-constraint-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: column constraint removed right before column reaches write only
  from: column-constraint-Node
  kind: Precedence
  to: column-Node
  query:
    - $column-constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - $column[Type] = '*scpb.Column'
    - joinOnColumnID($column-constraint, $column, $table-id, $col-id)
    - $column-constraint-Target[TargetStatus] = TRANSIENT_ABSENT
    - $column-constraint-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $column-Target[TargetStatus] = ABSENT
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($column-constraint, $column-constraint-Target, $column-constraint-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: column constraint removed right before column reaches write only
  from: column-constraint-Node
  kind: Precedence
  to: column-Node
  query:
    - $column-constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - $column[Type] = '*scpb.Column'
    - joinOnColumnID($column-constraint, $column, $table-id, $col-id)
    - $column-constraint-Target[TargetStatus] = ABSENT
    - $column-constraint-Node[CurrentStatus] = ABSENT
    - $column-Target[TargetStatus] = TRANSIENT_ABSENT
    - $column-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - joinTargetNode($column-constraint, $column-constraint-Target, $column-constraint-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: column dependents exist before column becomes public
  from: dependent-Node
  kind: Precedence
  to: column-Node
  query:
    - $dependent[Type] IN ['*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnName', '*scpb.ColumnNotNull', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.IndexColumn', '*scpb.SequenceOwner']
    - $column[Type] = '*scpb.Column'
    - joinOnColumnID($dependent, $column, $table-id, $col-id)
    - ToPublicOrTransient($dependent-Target, $column-Target)
    - $dependent-Node[CurrentStatus] = PUBLIC
    - $column-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: column existence precedes column dependents
  from: column-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $column[Type] = '*scpb.Column'
    - $dependent[Type] IN ['*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnName', '*scpb.ColumnNotNull', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.IndexColumn', '*scpb.SequenceOwner']
    - joinOnColumnID($column, $dependent, $table-id, $col-id)
    - ToPublicOrTransient($column-Target, $dependent-Target)
    - $column-Node[CurrentStatus] = DELETE_ONLY
    - $dependent-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($column, $column-Target, $column-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: column existence precedes index existence
  from: column-Node
  kind: Precedence
  to: index-Node
  query:
    - $column[Type] = '*scpb.Column'
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex']
    - joinOnColumnID($column, $index-column, $table-id, $column-id)
    - ColumnInIndex($index-column, $index, $table-id, $column-id, $index-id)
    - ToPublicOrTransient($column-Target, $index-Target)
    - $column-Node[CurrentStatus] = DELETE_ONLY
    - $index-Node[CurrentStatus] = BACKFILL_ONLY
    - joinTargetNode($column, $column-Target, $column-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: column existence precedes temp index existence
  from: column-Node
  kind: Precedence
  to: index-Node
  query:
    - $column[Type] = '*scpb.Column'
    - $index[Type] = '*scpb.TemporaryIndex'
    - joinOnColumnID($index-column, $column, $table-id, $column-id)
    - ColumnInIndex($index-column, $index, $table-id, $column-id, $index-id)
    - ToPublicOrTransient($column-Target, $index-Target)
    - $column-Node[CurrentStatus] = DELETE_ONLY
    - $index-Node[CurrentStatus] = DELETE_ONLY
    - joinTargetNode($column, $column-Target, $column-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: column is WRITE_ONLY before temporary index is WRITE_ONLY
  from: column-Node
  kind: Precedence
  to: index-Node
  query:
    - $column[Type] = '*scpb.Column'
    - $index[Type] = '*scpb.TemporaryIndex'
    - joinOnColumnID($index-column, $column, $table-id, $column-id)
    - ColumnInIndex($index-column, $index, $table-id, $column-id, $index-id)
    - ToPublicOrTransient($column-Target, $index-Target)
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - $index-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($column, $column-Target, $column-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: column name and type set right after column existence
  from: column-Node
  kind: SameStagePrecedence
  to: column-name-or-type-Node
  query:
    - $column[Type] = '*scpb.Column'
    - $column-name-or-type[Type] IN ['*scpb.ColumnName', '*scpb.ColumnType']
    - ToPublicOrTransient($column-Target, $column-name-or-type-Target)
    - $column-Node[CurrentStatus] = DELETE_ONLY
    - $column-name-or-type-Node[CurrentStatus] = PUBLIC
    - joinOnColumnID($column, $column-name-or-type, $table-id, $col-id)
    - joinTargetNode($column, $column-Target, $column-Node)
    - joinTargetNode($column-name-or-type, $column-name-or-type-Target, $column-name-or-type-Node)
- name: column no longer public before dependents
  from: column-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $column[Type] = '*scpb.Column'
    - $dependent[Type] IN ['*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnName', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.IndexColumn', '*scpb.SequenceOwner']
    - joinOnColumnID($column, $dependent, $table-id, $col-id)
    - toAbsent($column-Target, $dependent-Target)
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - $dependent-Node[CurrentStatus] = ABSENT
    - joinTargetNode($column, $column-Target, $column-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: column no longer public before dependents
  from: column-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $column[Type] = '*scpb.Column'
    - $dependent[Type] IN ['*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnName', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.IndexColumn', '*scpb.SequenceOwner']
    - joinOnColumnID($column, $dependent, $table-id, $col-id)
    - transient($column-Target, $dependent-Target)
    - $column-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - $dependent-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($column, $column-Target, $column-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: column no longer public before dependents
  from: column-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $column[Type] = '*scpb.Column'
    - $dependent[Type] IN ['*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnName', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.IndexColumn', '*scpb.SequenceOwner']
    - joinOnColumnID($column, $dependent, $table-id, $col-id)
    - $column-Target[TargetStatus] = TRANSIENT_ABSENT
    - $column-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - $dependent-Target[TargetStatus] = ABSENT
    - $dependent-Node[CurrentStatus] = ABSENT
    - joinTargetNode($column, $column-Target, $column-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: column no longer public before dependents
  from: column-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $column[Type] = '*scpb.Column'
    - $dependent[Type] IN ['*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnName', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.IndexColumn', '*scpb.SequenceOwner']
    - joinOnColumnID($column, $dependent, $table-id, $col-id)
    - $column-Target[TargetStatus] = ABSENT
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - $dependent-Target[TargetStatus] = TRANSIENT_ABSENT
    - $dependent-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($column, $column-Target, $column-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: column public before non-index-backed constraint (including hash-sharded) is created
  from: column-Node
  kind: Precedence
  to: constraint-Node
  query:
    - $column[Type] = '*scpb.Column'
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.CheckConstraintUnvalidated', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraint', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - $column[ColumnID] = $columnID
    - $constraint[ReferencedColumnIDs] CONTAINS $columnID
    - joinOnDescID($column, $constraint, $table-id)
    - ToPublicOrTransient($column-Target, $constraint-Target)
    - $column-Node[CurrentStatus] = PUBLIC
    - $constraint-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($column, $column-Target, $column-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: column type dependents removed right before column type
  from: dependent-Node
  kind: SameStagePrecedence
  to: column-type-Node
  query:
    - $dependent[Type] IN ['*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnOnUpdateExpression', '*scpb.SequenceOwner']
    - $column-type[Type] = '*scpb.ColumnType'
    - joinOnColumnID($dependent, $column-type, $table-id, $col-id)
    - toAbsent($dependent-Target, $column-type-Target)
    - $dependent-Node[CurrentStatus] = ABSENT
    - $column-type-Node[CurrentStatus] = ABSENT
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($column-type, $column-type-Target, $column-type-Node)
- name: column type is changed to public after doing validation of a transient check constraint
  from: transient-check-constraint-Node
  kind: SameStagePrecedence
  to: column-type-Node
  query:
    - $transient-check-constraint[Type] = '*scpb.CheckConstraint'
    - $column-type[Type] = '*scpb.ColumnType'
    - joinOnDescID($transient-check-constraint, $column-type, $table-id)
    - $column-type[ColumnID] = $columnID
    - $transient-check-constraint[ReferencedColumnIDs] CONTAINS $columnID
    - $transient-check-constraint-Target[TargetStatus] = TRANSIENT_ABSENT
    - $column-type-Target[TargetStatus] = PUBLIC
    - $transient-check-constraint-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $column-type-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($transient-check-constraint, $transient-check-constraint-Target, $transient-check-constraint-Node)
    - joinTargetNode($column-type, $column-type-Target, $column-type-Node)
- name: column type removed before column family
  from: column-type-Node
  kind: Precedence
  to: column-family-Node
  query:
    - $column-type[Type] = '*scpb.ColumnType'
    - $column-family[Type] = '*scpb.ColumnFamily'
    - joinOnColumnFamilyID($column-type, $column-family, $table-id, $family-id)
    - toAbsent($column-type-Target, $column-family-Target)
    - $column-type-Node[CurrentStatus] = ABSENT
    - $column-family-Node[CurrentStatus] = ABSENT
    - joinTargetNode($column-type, $column-type-Target, $column-type-Node)
    - joinTargetNode($column-family, $column-family-Target, $column-family-Node)
- name: column type removed right before column when not dropping relation
  from: column-type-Node
  kind: SameStagePrecedence
  to: column-Node
  query:
    - $column-type[Type] = '*scpb.ColumnType'
    - descriptorIsNotBeingDropped-24.3($column-type)
    - $column[Type] = '*scpb.Column'
    - joinOnColumnID($column-type, $column, $table-id, $col-id)
    - toAbsent($column-type-Target, $column-Target)
    - $column-type-Node[CurrentStatus] = ABSENT
    - $column-Node[CurrentStatus] = ABSENT
    - joinTargetNode($column-type, $column-type-Target, $column-type-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: column type update is decomposed as a drop then add
  from: old-column-type-Node
  kind: Precedence
  to: new-column-type-Node
  query:
    - $old-column-type[Type] = '*scpb.ColumnType'
    - $new-column-type[Type] = '*scpb.ColumnType'
    - joinOnColumnID($old-column-type, $new-column-type, $table-id, $col-id)
    - $old-column-type-Target[TargetStatus] = ABSENT
    - $old-column-type-Node[CurrentStatus] = PUBLIC
    - $new-column-type-Target[TargetStatus] = PUBLIC
    - $new-column-type-Node[CurrentStatus] = ABSENT
    - joinTargetNode($old-column-type, $old-column-type-Target, $old-column-type-Node)
    - joinTargetNode($new-column-type, $new-column-type-Target, $new-column-type-Node)
- name: column writable right before column constraint is enforced.
  from: column-Node
  kind: SameStagePrecedence
  to: column-constraint-Node
  query:
    - $column[Type] = '*scpb.Column'
    - $column-constraint[Type] = '*scpb.ColumnNotNull'
    - joinOnColumnID($column, $column-constraint, $table-id, $col-id)
    - ToPublicOrTransient($column-Target, $column-constraint-Target)
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - $column-constraint-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($column, $column-Target, $column-Node)
    - joinTargetNode($column-constraint, $column-constraint-Target, $column-constraint-Node)
- name: constraint dependent public right before complex constraint
  from: dependent-Node
  kind: SameStagePrecedence
  to: complex-constraint-Node
  query:
    - $dependent[Type] = '*scpb.ConstraintComment'
    - $complex-constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - joinOnConstraintID($dependent, $complex-constraint, $table-id, $constraint-id)
    - ToPublicOrTransient($dependent-Target, $complex-constraint-Target)
    - $dependent-Node[CurrentStatus] = PUBLIC
    - $complex-constraint-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($complex-constraint, $complex-constraint-Target, $complex-constraint-Node)
- name: constraint no longer public before dependents
  from: constraint-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - $dependent[Type] = '*scpb.ConstraintComment'
    - joinOnConstraintID($constraint, $dependent, $table-id, $constraint-id)
    - toAbsent($constraint-Target, $dependent-Target)
    - $constraint-Node[CurrentStatus] = VALIDATED
    - $dependent-Node[CurrentStatus] = ABSENT
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: constraint no longer public before dependents
  from: constraint-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - $dependent[Type] = '*scpb.ConstraintComment'
    - joinOnConstraintID($constraint, $dependent, $table-id, $constraint-id)
    - transient($constraint-Target, $dependent-Target)
    - $constraint-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $dependent-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: constraint no longer public before dependents
  from: constraint-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - $dependent[Type] = '*scpb.ConstraintComment'
    - joinOnConstraintID($constraint, $dependent, $table-id, $constraint-id)
    - $constraint-Target[TargetStatus] = TRANSIENT_ABSENT
    - $constraint-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $dependent-Target[TargetStatus] = ABSENT
    - $dependent-Node[CurrentStatus] = ABSENT
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: constraint no longer public before dependents
  from: constraint-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - $dependent[Type] = '*scpb.ConstraintComment'
    - joinOnConstraintID($constraint, $dependent, $table-id, $constraint-id)
    - $constraint-Target[TargetStatus] = ABSENT
    - $constraint-Node[CurrentStatus] = VALIDATED
    - $dependent-Target[TargetStatus] = TRANSIENT_ABSENT
    - $dependent-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: cross-descriptor constraint is absent before referenced descriptor is dropped
  from: cross-desc-constraint-Node
  kind: Precedence
  to: referenced-descriptor-Node
  query:
    - $cross-desc-constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - $referenced-descriptor[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.Database', '*scpb.EnumType', '*scpb.Function', '*scpb.Schema', '*scpb.Sequence', '*scpb.Table', '*scpb.View']
    - joinReferencedDescID($cross-desc-constraint, $referenced-descriptor, $desc-id)
    - toAbsent($cross-desc-constraint-Target, $referenced-descriptor-Target)
    - $cross-desc-constraint-Node[CurrentStatus] = ABSENT
    - $referenced-descriptor-Node[CurrentStatus] = DROPPED
    - joinTargetNode($cross-desc-constraint, $cross-desc-constraint-Target, $cross-desc-constraint-Node)
    - joinTargetNode($referenced-descriptor, $referenced-descriptor-Target, $referenced-descriptor-Node)
- name: cross-descriptor constraint is absent before referencing descriptor is dropped
  from: cross-desc-constraint-Node
  kind: Precedence
  to: referencing-descriptor-Node
  query:
    - $cross-desc-constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - $referencing-descriptor[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.Database', '*scpb.EnumType', '*scpb.Function', '*scpb.Schema', '*scpb.Sequence', '*scpb.Table', '*scpb.View']
    - joinOnDescID($cross-desc-constraint, $referencing-descriptor, $desc-id)
    - toAbsent($cross-desc-constraint-Target, $referencing-descriptor-Target)
    - $cross-desc-constraint-Node[CurrentStatus] = ABSENT
    - $referencing-descriptor-Node[CurrentStatus] = DROPPED
    - joinTargetNode($cross-desc-constraint, $cross-desc-constraint-Target, $cross-desc-constraint-Node)
    - joinTargetNode($referencing-descriptor, $referencing-descriptor-Target, $referencing-descriptor-Node)
- name: dependent view absent before secondary index
  from: view-Node
  kind: Precedence
  to: index-Node
  query:
    - $view[Type] = '*scpb.View'
    - $index[Type] = '*scpb.SecondaryIndex'
    - viewReferencesIndex(*scpb.View, *scpb.SecondaryIndex)($view, $index)
    - toAbsent($view-Target, $index-Target)
    - $view-Node[CurrentStatus] = ABSENT
    - $index-Node[CurrentStatus] = ABSENT
    - joinTargetNode($view, $view-Target, $view-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: dependent view absent before secondary index
  from: view-Node
  kind: Precedence
  to: index-Node
  query:
    - $view[Type] = '*scpb.View'
    - $index[Type] = '*scpb.SecondaryIndex'
    - viewReferencesIndex(*scpb.View, *scpb.SecondaryIndex)($view, $index)
    - transient($view-Target, $index-Target)
    - $view-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($view, $view-Target, $view-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: dependent view absent before secondary index
  from: view-Node
  kind: Precedence
  to: index-Node
  query:
    - $view[Type] = '*scpb.View'
    - $index[Type] = '*scpb.SecondaryIndex'
    - viewReferencesIndex(*scpb.View, *scpb.SecondaryIndex)($view, $index)
    - $view-Target[TargetStatus] = TRANSIENT_ABSENT
    - $view-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $index-Target[TargetStatus] = ABSENT
    - $index-Node[CurrentStatus] = ABSENT
    - joinTargetNode($view, $view-Target, $view-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: dependent view absent before secondary index
  from: view-Node
  kind: Precedence
  to: index-Node
  query:
    - $view[Type] = '*scpb.View'
    - $index[Type] = '*scpb.SecondaryIndex'
    - viewReferencesIndex(*scpb.View, *scpb.SecondaryIndex)($view, $index)
    - $view-Target[TargetStatus] = ABSENT
    - $view-Node[CurrentStatus] = ABSENT
    - $index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($view, $view-Target, $view-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: dependent view no longer public before secondary index
  from: view-Node
  kind: Precedence
  to: index-Node
  query:
    - $view[Type] = '*scpb.View'
    - $index[Type] = '*scpb.SecondaryIndex'
    - viewReferencesIndex(*scpb.View, *scpb.SecondaryIndex)($view, $index)
    - toAbsent($view-Target, $index-Target)
    - $view-Node[CurrentStatus] = DROPPED
    - $index-Node[CurrentStatus] = VALIDATED
    - joinTargetNode($view, $view-Target, $view-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: dependent view no longer public before secondary index
  from: view-Node
  kind: Precedence
  to: index-Node
  query:
    - $view[Type] = '*scpb.View'
    - $index[Type] = '*scpb.SecondaryIndex'
    - viewReferencesIndex(*scpb.View, *scpb.SecondaryIndex)($view, $index)
    - transient($view-Target, $index-Target)
    - $view-Node[CurrentStatus] = TRANSIENT_DROPPED
    - $index-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - joinTargetNode($view, $view-Target, $view-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: dependent view no longer public before secondary index
  from: view-Node
  kind: Precedence
  to: index-Node
  query:
    - $view[Type] = '*scpb.View'
    - $index[Type] = '*scpb.SecondaryIndex'
    - viewReferencesIndex(*scpb.View, *scpb.SecondaryIndex)($view, $index)
    - $view-Target[TargetStatus] = TRANSIENT_ABSENT
    - $view-Node[CurrentStatus] = TRANSIENT_DROPPED
    - $index-Target[TargetStatus] = ABSENT
    - $index-Node[CurrentStatus] = VALIDATED
    - joinTargetNode($view, $view-Target, $view-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: dependent view no longer public before secondary index
  from: view-Node
  kind: Precedence
  to: index-Node
  query:
    - $view[Type] = '*scpb.View'
    - $index[Type] = '*scpb.SecondaryIndex'
    - viewReferencesIndex(*scpb.View, *scpb.SecondaryIndex)($view, $index)
    - $view-Target[TargetStatus] = ABSENT
    - $view-Node[CurrentStatus] = DROPPED
    - $index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - joinTargetNode($view, $view-Target, $view-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: dependents exist before descriptor becomes public
  from: dependent-Node
  kind: Precedence
  to: relation-Node
  query:
    - $dependent[Type] IN ['*scpb.CheckConstraint', '*scpb.CheckConstraintUnvalidated', '*scpb.Column', '*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnFamily', '*scpb.ColumnName', '*scpb.ColumnNotNull', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.CompositeTypeAttrName', '*scpb.CompositeTypeAttrType', '*scpb.ConstraintComment', '*scpb.ConstraintWithoutIndexName', '*scpb.DatabaseComment', '*scpb.DatabaseRegionConfig', '*scpb.DatabaseRoleSetting', '*scpb.DatabaseZoneConfig', '*scpb.EnumTypeValue', '*scpb.ForeignKeyConstraint', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.FunctionBody', '*scpb.FunctionLeakProof', '*scpb.FunctionName', '*scpb.FunctionNullInputBehavior', '*scpb.FunctionSecurity', '*scpb.FunctionVolatility', '*scpb.IndexColumn', '*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.LDRJobIDs', '*scpb.Namespace', '*scpb.Owner', '*scpb.PartitionZoneConfig', '*scpb.PrimaryIndex', '*scpb.RowLevelTTL', '*scpb.SchemaChild', '*scpb.SchemaComment', '*scpb.SchemaParent', '*scpb.SecondaryIndex', '*scpb.SecondaryIndexPartial', '*scpb.SequenceOption', '*scpb.SequenceOwner', '*scpb.TableComment', '*scpb.TableLocalityGlobal', '*scpb.TableLocalityPrimaryRegion', '*scpb.TableLocalityRegionalByRow', '*scpb.TableLocalitySecondaryRegion', '*scpb.TablePartitioning', '*scpb.TableSchemaLocked', '*scpb.TableZoneConfig', '*scpb.TemporaryIndex', '*scpb.Trigger', '*scpb.TriggerDeps', '*scpb.TriggerEnabled', '*scpb.TriggerEvents', '*scpb.TriggerFunctionCall', '*scpb.TriggerName', '*scpb.TriggerTiming', '*scpb.TriggerTransition', '*scpb.TriggerWhen', '*scpb.TypeComment', '*scpb.UniqueWithoutIndexConstraint', '*scpb.UniqueWithoutIndexConstraintUnvalidated', '*scpb.UserPrivileges']
    - $relation[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.Database', '*scpb.EnumType', '*scpb.Function', '*scpb.Schema', '*scpb.Sequence', '*scpb.Table', '*scpb.View']
    - joinOnDescID($dependent, $relation, $relation-id)
    - ToPublicOrTransient($dependent-Target, $relation-Target)
    - $dependent-Node[CurrentStatus] = PUBLIC
    - $relation-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($relation, $relation-Target, $relation-Node)
- name: dependents removed before column
  from: dependent-Node
  kind: Precedence
  to: column-Node
  query:
    - $dependent[Type] IN ['*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnName', '*scpb.ColumnNotNull', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.IndexColumn', '*scpb.SequenceOwner']
    - $column[Type] = '*scpb.Column'
    - joinOnColumnID($dependent, $column, $table-id, $col-id)
    - toAbsent($dependent-Target, $column-Target)
    - $dependent-Node[CurrentStatus] = ABSENT
    - $column-Node[CurrentStatus] = ABSENT
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: dependents removed before column
  from: dependent-Node
  kind: Precedence
  to: column-Node
  query:
    - $dependent[Type] IN ['*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnName', '*scpb.ColumnNotNull', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.IndexColumn', '*scpb.SequenceOwner']
    - $column[Type] = '*scpb.Column'
    - joinOnColumnID($dependent, $column, $table-id, $col-id)
    - transient($dependent-Target, $column-Target)
    - $dependent-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $column-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: dependents removed before column
  from: dependent-Node
  kind: Precedence
  to: column-Node
  query:
    - $dependent[Type] IN ['*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnName', '*scpb.ColumnNotNull', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.IndexColumn', '*scpb.SequenceOwner']
    - $column[Type] = '*scpb.Column'
    - joinOnColumnID($dependent, $column, $table-id, $col-id)
    - $dependent-Target[TargetStatus] = TRANSIENT_ABSENT
    - $dependent-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $column-Target[TargetStatus] = ABSENT
    - $column-Node[CurrentStatus] = ABSENT
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: dependents removed before column
  from: dependent-Node
  kind: Precedence
  to: column-Node
  query:
    - $dependent[Type] IN ['*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnName', '*scpb.ColumnNotNull', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.IndexColumn', '*scpb.SequenceOwner']
    - $column[Type] = '*scpb.Column'
    - joinOnColumnID($dependent, $column, $table-id, $col-id)
    - $dependent-Target[TargetStatus] = ABSENT
    - $dependent-Node[CurrentStatus] = ABSENT
    - $column-Target[TargetStatus] = TRANSIENT_ABSENT
    - $column-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: dependents removed before constraint
  from: dependents-Node
  kind: Precedence
  to: constraint-Node
  query:
    - $dependents[Type] = '*scpb.ConstraintComment'
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - joinOnConstraintID($dependents, $constraint, $table-id, $constraint-id)
    - toAbsent($dependents-Target, $constraint-Target)
    - $dependents-Node[CurrentStatus] = ABSENT
    - $constraint-Node[CurrentStatus] = ABSENT
    - joinTargetNode($dependents, $dependents-Target, $dependents-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: dependents removed before constraint
  from: dependents-Node
  kind: Precedence
  to: constraint-Node
  query:
    - $dependents[Type] = '*scpb.ConstraintComment'
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - joinOnConstraintID($dependents, $constraint, $table-id, $constraint-id)
    - transient($dependents-Target, $constraint-Target)
    - $dependents-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $constraint-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($dependents, $dependents-Target, $dependents-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: dependents removed before constraint
  from: dependents-Node
  kind: Precedence
  to: constraint-Node
  query:
    - $dependents[Type] = '*scpb.ConstraintComment'
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - joinOnConstraintID($dependents, $constraint, $table-id, $constraint-id)
    - $dependents-Target[TargetStatus] = TRANSIENT_ABSENT
    - $dependents-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $constraint-Target[TargetStatus] = ABSENT
    - $constraint-Node[CurrentStatus] = ABSENT
    - joinTargetNode($dependents, $dependents-Target, $dependents-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: dependents removed before constraint
  from: dependents-Node
  kind: Precedence
  to: constraint-Node
  query:
    - $dependents[Type] = '*scpb.ConstraintComment'
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - joinOnConstraintID($dependents, $constraint, $table-id, $constraint-id)
    - $dependents-Target[TargetStatus] = ABSENT
    - $dependents-Node[CurrentStatus] = ABSENT
    - $constraint-Target[TargetStatus] = TRANSIENT_ABSENT
    - $constraint-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($dependents, $dependents-Target, $dependents-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: dependents removed before index
  from: dependent-Node
  kind: Precedence
  to: index-Node
  query:
    - $dependent[Type] IN ['*scpb.IndexColumn', '*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.PartitionZoneConfig', '*scpb.SecondaryIndexPartial']
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - joinOnIndexID($dependent, $index, $table-id, $index-id)
    - toAbsent($dependent-Target, $index-Target)
    - $dependent-Node[CurrentStatus] = ABSENT
    - $index-Node[CurrentStatus] = ABSENT
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: dependents removed before index
  from: dependent-Node
  kind: Precedence
  to: index-Node
  query:
    - $dependent[Type] IN ['*scpb.IndexColumn', '*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.PartitionZoneConfig', '*scpb.SecondaryIndexPartial']
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - joinOnIndexID($dependent, $index, $table-id, $index-id)
    - transient($dependent-Target, $index-Target)
    - $dependent-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: dependents removed before index
  from: dependent-Node
  kind: Precedence
  to: index-Node
  query:
    - $dependent[Type] IN ['*scpb.IndexColumn', '*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.PartitionZoneConfig', '*scpb.SecondaryIndexPartial']
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - joinOnIndexID($dependent, $index, $table-id, $index-id)
    - $dependent-Target[TargetStatus] = TRANSIENT_ABSENT
    - $dependent-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $index-Target[TargetStatus] = ABSENT
    - $index-Node[CurrentStatus] = ABSENT
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: dependents removed before index
  from: dependent-Node
  kind: Precedence
  to: index-Node
  query:
    - $dependent[Type] IN ['*scpb.IndexColumn', '*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.PartitionZoneConfig', '*scpb.SecondaryIndexPartial']
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - joinOnIndexID($dependent, $index, $table-id, $index-id)
    - $dependent-Target[TargetStatus] = ABSENT
    - $dependent-Node[CurrentStatus] = ABSENT
    - $index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: dependents removed right before simple constraint
  from: dependents-Node
  kind: SameStagePrecedence
  to: constraint-Node
  query:
    - $dependents[Type] = '*scpb.ConstraintComment'
    - $constraint[Type] IN ['*scpb.CheckConstraintUnvalidated', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - joinOnConstraintID($dependents, $constraint, $table-id, $constraint-id)
    - toAbsent($dependents-Target, $constraint-Target)
    - $dependents-Node[CurrentStatus] = ABSENT
    - $constraint-Node[CurrentStatus] = ABSENT
    - joinTargetNode($dependents, $dependents-Target, $dependents-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: dependents removed right before simple constraint
  from: dependents-Node
  kind: SameStagePrecedence
  to: constraint-Node
  query:
    - $dependents[Type] = '*scpb.ConstraintComment'
    - $constraint[Type] IN ['*scpb.CheckConstraintUnvalidated', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - joinOnConstraintID($dependents, $constraint, $table-id, $constraint-id)
    - transient($dependents-Target, $constraint-Target)
    - $dependents-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $constraint-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($dependents, $dependents-Target, $dependents-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: dependents removed right before simple constraint
  from: dependents-Node
  kind: SameStagePrecedence
  to: constraint-Node
  query:
    - $dependents[Type] = '*scpb.ConstraintComment'
    - $constraint[Type] IN ['*scpb.CheckConstraintUnvalidated', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - joinOnConstraintID($dependents, $constraint, $table-id, $constraint-id)
    - $dependents-Target[TargetStatus] = TRANSIENT_ABSENT
    - $dependents-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $constraint-Target[TargetStatus] = ABSENT
    - $constraint-Node[CurrentStatus] = ABSENT
    - joinTargetNode($dependents, $dependents-Target, $dependents-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: dependents removed right before simple constraint
  from: dependents-Node
  kind: SameStagePrecedence
  to: constraint-Node
  query:
    - $dependents[Type] = '*scpb.ConstraintComment'
    - $constraint[Type] IN ['*scpb.CheckConstraintUnvalidated', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - joinOnConstraintID($dependents, $constraint, $table-id, $constraint-id)
    - $dependents-Target[TargetStatus] = ABSENT
    - $dependents-Node[CurrentStatus] = ABSENT
    - $constraint-Target[TargetStatus] = TRANSIENT_ABSENT
    - $constraint-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($dependents, $dependents-Target, $dependents-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: descriptor drop right before removing dependent between types
  from: referenced-descriptor-Node
  kind: SameStagePrecedence
  to: referencing-via-type-Node
  query:
    - $referenced-descriptor[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.EnumType']
    - $referenced-descriptor[DescID] = $fromDescID
    - $referencing-via-type[ReferencedTypeIDs] CONTAINS $fromDescID
    - $referencing-via-type[Type] = '*scpb.ColumnType'
    - toAbsent($referenced-descriptor-Target, $referencing-via-type-Target)
    - $referenced-descriptor-Node[CurrentStatus] = DROPPED
    - $referencing-via-type-Node[CurrentStatus] = ABSENT
    - joinTargetNode($referenced-descriptor, $referenced-descriptor-Target, $referenced-descriptor-Node)
    - joinTargetNode($referencing-via-type, $referencing-via-type-Target, $referencing-via-type-Node)
- name: descriptor drop right before removing dependent with attr ref
  from: referenced-descriptor-Node
  kind: SameStagePrecedence
  to: referencing-via-attr-Node
  query:
    - $referenced-descriptor[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.Database', '*scpb.EnumType', '*scpb.Function', '*scpb.Schema', '*scpb.Sequence', '*scpb.Table', '*scpb.View']
    - $referencing-via-attr[Type] IN ['*scpb.CheckConstraintUnvalidated', '*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnFamily', '*scpb.ColumnName', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.CompositeTypeAttrName', '*scpb.CompositeTypeAttrType', '*scpb.ConstraintComment', '*scpb.ConstraintWithoutIndexName', '*scpb.DatabaseComment', '*scpb.DatabaseRegionConfig', '*scpb.DatabaseRoleSetting', '*scpb.DatabaseZoneConfig', '*scpb.EnumTypeValue', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.FunctionBody', '*scpb.FunctionLeakProof', '*scpb.FunctionName', '*scpb.FunctionNullInputBehavior', '*scpb.FunctionSecurity', '*scpb.FunctionVolatility', '*scpb.IndexColumn', '*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.LDRJobIDs', '*scpb.Namespace', '*scpb.Owner', '*scpb.PartitionZoneConfig', '*scpb.RowLevelTTL', '*scpb.SchemaComment', '*scpb.SecondaryIndexPartial', '*scpb.SequenceOption', '*scpb.SequenceOwner', '*scpb.TableComment', '*scpb.TableLocalityGlobal', '*scpb.TableLocalityPrimaryRegion', '*scpb.TableLocalityRegionalByRow', '*scpb.TableLocalitySecondaryRegion', '*scpb.TablePartitioning', '*scpb.TableSchemaLocked', '*scpb.TableZoneConfig', '*scpb.Trigger', '*scpb.TriggerDeps', '*scpb.TriggerEnabled', '*scpb.TriggerEvents', '*scpb.TriggerFunctionCall', '*scpb.TriggerName', '*scpb.TriggerTiming', '*scpb.TriggerTransition', '*scpb.TriggerWhen', '*scpb.TypeComment', '*scpb.UniqueWithoutIndexConstraintUnvalidated', '*scpb.UserPrivileges']
    - joinReferencedDescID($referencing-via-attr, $referenced-descriptor, $desc-id)
    - toAbsent($referenced-descriptor-Target, $referencing-via-attr-Target)
    - $referenced-descriptor-Node[CurrentStatus] = DROPPED
    - $referencing-via-attr-Node[CurrentStatus] = ABSENT
    - joinTargetNode($referenced-descriptor, $referenced-descriptor-Target, $referenced-descriptor-Node)
    - joinTargetNode($referencing-via-attr, $referencing-via-attr-Target, $referencing-via-attr-Node)
- name: descriptor drop right before removing dependent with expr ref to sequence
  from: referenced-descriptor-Node
  kind: SameStagePrecedence
  to: referencing-via-expr-Node
  query:
    - $referenced-descriptor[Type] = '*scpb.Sequence'
    - $referenced-descriptor[DescID] = $seqID
    - $referencing-via-expr[ReferencedSequenceIDs] CONTAINS $seqID
    - $referencing-via-expr[Type] IN ['*scpb.CheckConstraintUnvalidated', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.SecondaryIndexPartial']
    - toAbsent($referenced-descriptor-Target, $referencing-via-expr-Target)
    - $referenced-descriptor-Node[CurrentStatus] = DROPPED
    - $referencing-via-expr-Node[CurrentStatus] = ABSENT
    - joinTargetNode($referenced-descriptor, $referenced-descriptor-Target, $referenced-descriptor-Node)
    - joinTargetNode($referencing-via-expr, $referencing-via-expr-Target, $referencing-via-expr-Node)
- name: descriptor drop right before removing dependent with function refs in columns
  from: referenced-descriptor-Node
  kind: SameStagePrecedence
  to: referencing-via-function-Node
  query:
    - $referenced-descriptor[Type] = '*scpb.Function'
    - $referenced-descriptor[DescID] = $fromDescID
    - $referencing-via-function[ReferencedFunctionIDs] CONTAINS $fromDescID
    - $referencing-via-function[Type] IN ['*scpb.CheckConstraintUnvalidated', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.SecondaryIndexPartial']
    - toAbsent($referenced-descriptor-Target, $referencing-via-function-Target)
    - $referenced-descriptor-Node[CurrentStatus] = DROPPED
    - $referencing-via-function-Node[CurrentStatus] = ABSENT
    - joinTargetNode($referenced-descriptor, $referenced-descriptor-Target, $referenced-descriptor-Node)
    - joinTargetNode($referencing-via-function, $referencing-via-function-Target, $referencing-via-function-Node)
- name: descriptor drop right before removing dependent with type refs in expressions
  from: referenced-descriptor-Node
  kind: SameStagePrecedence
  to: referencing-via-type-Node
  query:
    - $referenced-descriptor[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.EnumType']
    - $referenced-descriptor[DescID] = $fromDescID
    - $referencing-via-type[ReferencedTypeIDs] CONTAINS $fromDescID
    - descriptorIsNotBeingDropped-24.3($referencing-via-type)
    - $referencing-via-type[Type] IN ['*scpb.CheckConstraintUnvalidated', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.SecondaryIndexPartial']
    - toAbsent($referenced-descriptor-Target, $referencing-via-type-Target)
    - $referenced-descriptor-Node[CurrentStatus] = DROPPED
    - $referencing-via-type-Node[CurrentStatus] = ABSENT
    - joinTargetNode($referenced-descriptor, $referenced-descriptor-Target, $referenced-descriptor-Node)
    - joinTargetNode($referencing-via-type, $referencing-via-type-Target, $referencing-via-type-Node)
- name: descriptor dropped before dependent element removal
  from: descriptor-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $descriptor[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.Database', '*scpb.EnumType', '*scpb.Function', '*scpb.Schema', '*scpb.Sequence', '*scpb.Table', '*scpb.View']
    - $dependent[Type] IN ['*scpb.CheckConstraintUnvalidated', '*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnFamily', '*scpb.ColumnName', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.CompositeTypeAttrName', '*scpb.CompositeTypeAttrType', '*scpb.DatabaseComment', '*scpb.DatabaseRegionConfig', '*scpb.DatabaseRoleSetting', '*scpb.DatabaseZoneConfig', '*scpb.EnumTypeValue', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.FunctionBody', '*scpb.FunctionLeakProof', '*scpb.FunctionName', '*scpb.FunctionNullInputBehavior', '*scpb.FunctionSecurity', '*scpb.FunctionVolatility', '*scpb.IndexColumn', '*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.LDRJobIDs', '*scpb.Namespace', '*scpb.Owner', '*scpb.PartitionZoneConfig', '*scpb.RowLevelTTL', '*scpb.SchemaChild', '*scpb.SchemaComment', '*scpb.SchemaParent', '*scpb.SecondaryIndexPartial', '*scpb.SequenceOption', '*scpb.SequenceOwner', '*scpb.TableComment', '*scpb.TableLocalityGlobal', '*scpb.TableLocalityPrimaryRegion', '*scpb.TableLocalityRegionalByRow', '*scpb.TableLocalitySecondaryRegion', '*scpb.TablePartitioning', '*scpb.TableSchemaLocked', '*scpb.TableZoneConfig', '*scpb.Trigger', '*scpb.TriggerDeps', '*scpb.TriggerEnabled', '*scpb.TriggerEvents', '*scpb.TriggerFunctionCall', '*scpb.TriggerName', '*scpb.TriggerTiming', '*scpb.TriggerTransition', '*scpb.TriggerWhen', '*scpb.TypeComment', '*scpb.UniqueWithoutIndexConstraintUnvalidated', '*scpb.UserPrivileges']
    - joinOnDescID($descriptor, $dependent, $desc-id)
    - toAbsent($descriptor-Target, $dependent-Target)
    - $descriptor-Node[CurrentStatus] = DROPPED
    - $dependent-Node[CurrentStatus] = ABSENT
    - joinTargetNode($descriptor, $descriptor-Target, $descriptor-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: descriptor dropped in transaction before removal
  from: dropped-Node
  kind: PreviousTransactionPrecedence
  to: absent-Node
  query:
    - $dropped[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.Database', '*scpb.EnumType', '*scpb.Function', '*scpb.Schema', '*scpb.Sequence', '*scpb.Table', '*scpb.View']
    - $dropped[DescID] = $_
    - $dropped[Self] = $absent
    - toAbsent($dropped-Target, $absent-Target)
    - $dropped-Node[CurrentStatus] = DROPPED
    - $absent-Node[CurrentStatus] = ABSENT
    - joinTargetNode($dropped, $dropped-Target, $dropped-Node)
    - joinTargetNode($absent, $absent-Target, $absent-Node)
- name: descriptor dropped right before removing back-reference in its parent descriptor
  from: descriptor-Node
  kind: SameStagePrecedence
  to: back-reference-in-parent-descriptor-Node
  query:
    - $descriptor[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.Database', '*scpb.EnumType', '*scpb.Function', '*scpb.Schema', '*scpb.Sequence', '*scpb.Table', '*scpb.View']
    - $back-reference-in-parent-descriptor[Type] IN ['*scpb.SchemaChild', '*scpb.SchemaParent']
    - joinOnDescID($descriptor, $back-reference-in-parent-descriptor, $desc-id)
    - toAbsent($descriptor-Target, $back-reference-in-parent-descriptor-Target)
    - $descriptor-Node[CurrentStatus] = DROPPED
    - $back-reference-in-parent-descriptor-Node[CurrentStatus] = ABSENT
    - joinTargetNode($descriptor, $descriptor-Target, $descriptor-Node)
    - joinTargetNode($back-reference-in-parent-descriptor, $back-reference-in-parent-descriptor-Target, $back-reference-in-parent-descriptor-Node)
- name: descriptor existence precedes dependents
  from: relation-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $relation[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.Database', '*scpb.EnumType', '*scpb.Function', '*scpb.Schema', '*scpb.Sequence', '*scpb.Table', '*scpb.View']
    - $dependent[Type] IN ['*scpb.CheckConstraint', '*scpb.CheckConstraintUnvalidated', '*scpb.Column', '*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnFamily', '*scpb.ColumnName', '*scpb.ColumnNotNull', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.CompositeTypeAttrName', '*scpb.CompositeTypeAttrType', '*scpb.ConstraintComment', '*scpb.ConstraintWithoutIndexName', '*scpb.DatabaseComment', '*scpb.DatabaseData', '*scpb.DatabaseRegionConfig', '*scpb.DatabaseRoleSetting', '*scpb.DatabaseZoneConfig', '*scpb.EnumTypeValue', '*scpb.ForeignKeyConstraint', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.FunctionBody', '*scpb.FunctionLeakProof', '*scpb.FunctionName', '*scpb.FunctionNullInputBehavior', '*scpb.FunctionSecurity', '*scpb.FunctionVolatility', '*scpb.IndexColumn', '*scpb.IndexComment', '*scpb.IndexData', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.LDRJobIDs', '*scpb.Namespace', '*scpb.Owner', '*scpb.PartitionZoneConfig', '*scpb.PrimaryIndex', '*scpb.RowLevelTTL', '*scpb.SchemaChild', '*scpb.SchemaComment', '*scpb.SchemaParent', '*scpb.SecondaryIndex', '*scpb.SecondaryIndexPartial', '*scpb.SequenceOption', '*scpb.SequenceOwner', '*scpb.TableComment', '*scpb.TableData', '*scpb.TableLocalityGlobal', '*scpb.TableLocalityPrimaryRegion', '*scpb.TableLocalityRegionalByRow', '*scpb.TableLocalitySecondaryRegion', '*scpb.TablePartitioning', '*scpb.TableSchemaLocked', '*scpb.TableZoneConfig', '*scpb.TemporaryIndex', '*scpb.Trigger', '*scpb.TriggerDeps', '*scpb.TriggerEnabled', '*scpb.TriggerEvents', '*scpb.TriggerFunctionCall', '*scpb.TriggerName', '*scpb.TriggerTiming', '*scpb.TriggerTransition', '*scpb.TriggerWhen', '*scpb.TypeComment', '*scpb.UniqueWithoutIndexConstraint', '*scpb.UniqueWithoutIndexConstraintUnvalidated', '*scpb.UserPrivileges']
    - joinOnDescID($relation, $dependent, $relation-id)
    - ToPublicOrTransient($relation-Target, $dependent-Target)
    - $relation-Node[CurrentStatus] = DESCRIPTOR_ADDED
    - $dependent-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($relation, $relation-Target, $relation-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: descriptor removed right before garbage collection
  from: database-Node
  kind: SameStagePrecedence
  to: data-Node
  query:
    - $database[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.Database', '*scpb.EnumType', '*scpb.Function', '*scpb.Schema', '*scpb.Sequence', '*scpb.Table', '*scpb.View']
    - $data[Type] = '*scpb.DatabaseData'
    - joinOnDescID($database, $data, $db-id)
    - toAbsent($database-Target, $data-Target)
    - $database-Node[CurrentStatus] = ABSENT
    - $data-Node[CurrentStatus] = DROPPED
    - joinTargetNode($database, $database-Target, $database-Node)
    - joinTargetNode($data, $data-Target, $data-Node)
- name: ensure columns are in increasing order
  from: later-column-Node
  kind: Precedence
  to: earlier-column-Node
  query:
    - $later-column[Type] = '*scpb.Column'
    - joinTargetNode($later-column, $later-column-Target, $later-column-Node)
    - $earlier-column[Type] = '*scpb.Column'
    - joinOnDescID($later-column, $earlier-column, $table-id)
    - ToPublicOrTransient($later-column-Target, $earlier-column-Target)
    - $status IN [WRITE_ONLY, PUBLIC]
    - $later-column-Node[CurrentStatus] = $status
    - $earlier-column-Node[CurrentStatus] = $status
    - SmallerColumnIDFirst(*scpb.Column, *scpb.Column)($later-column, $earlier-column)
    - joinTargetNode($later-column, $later-column-Target, $later-column-Node)
    - joinTargetNode($earlier-column, $earlier-column-Target, $earlier-column-Node)
- name: function name should be set before parent ids
  from: function-name-Node
  kind: Precedence
  to: function-parent-Node
  query:
    - $function-name[Type] = '*scpb.FunctionName'
    - $function-parent[Type] = '*scpb.SchemaChild'
    - joinOnDescID($function-name, $function-parent, $function-id)
    - ToPublicOrTransient($function-name-Target, $function-parent-Target)
    - $function-name-Node[CurrentStatus] = PUBLIC
    - $function-parent-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($function-name, $function-name-Target, $function-name-Node)
    - joinTargetNode($function-parent, $function-parent-Target, $function-parent-Node)
- name: index data exists as soon as index accepts backfills
  from: index-name-Node
  kind: SameStagePrecedence
  to: index-Node
  query:
    - $index-name[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex']
    - $index[Type] = '*scpb.IndexData'
    - joinOnIndexID($index-name, $index, $table-id, $index-id)
    - ToPublicOrTransient($index-name-Target, $index-Target)
    - $index-name-Node[CurrentStatus] = BACKFILL_ONLY
    - $index-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($index-name, $index-name-Target, $index-name-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: index dependents exist before index becomes public
  from: dependent-Node
  kind: Precedence
  to: index-Node
  query:
    - $dependent[Type] IN ['*scpb.IndexColumn', '*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.PartitionZoneConfig', '*scpb.SecondaryIndexPartial']
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - joinOnIndexID($dependent, $index, $table-id, $index-id)
    - ToPublicOrTransient($dependent-Target, $index-Target)
    - $dependent-Node[CurrentStatus] = PUBLIC
    - $index-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: index drop mutation visible before cleaning up index columns
  from: index-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - $dependent[Type] = '*scpb.IndexColumn'
    - joinOnIndexID($index, $dependent, $table-id, $index-id)
    - toAbsent($index-Target, $dependent-Target)
    - $index-Node[CurrentStatus] = DELETE_ONLY
    - $dependent-Node[CurrentStatus] = ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: index drop mutation visible before cleaning up index columns
  from: index-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - $dependent[Type] = '*scpb.IndexColumn'
    - joinOnIndexID($index, $dependent, $table-id, $index-id)
    - transient($index-Target, $dependent-Target)
    - $index-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - $dependent-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: index drop mutation visible before cleaning up index columns
  from: index-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - $dependent[Type] = '*scpb.IndexColumn'
    - joinOnIndexID($index, $dependent, $table-id, $index-id)
    - $index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - $dependent-Target[TargetStatus] = ABSENT
    - $dependent-Node[CurrentStatus] = ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: index drop mutation visible before cleaning up index columns
  from: index-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - $dependent[Type] = '*scpb.IndexColumn'
    - joinOnIndexID($index, $dependent, $table-id, $index-id)
    - $index-Target[TargetStatus] = ABSENT
    - $index-Node[CurrentStatus] = DELETE_ONLY
    - $dependent-Target[TargetStatus] = TRANSIENT_ABSENT
    - $dependent-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: index existence precedes index dependents
  from: index-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex']
    - $dependent[Type] IN ['*scpb.IndexColumn', '*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.PartitionZoneConfig', '*scpb.SecondaryIndexPartial']
    - joinOnIndexID($index, $dependent, $table-id, $index-id)
    - ToPublicOrTransient($index-Target, $dependent-Target)
    - $index-Node[CurrentStatus] = BACKFILL_ONLY
    - $dependent-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: index is MERGED before its temp index starts to disappear
  from: index-Node
  kind: Precedence
  to: temp-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex']
    - $temp[Type] = '*scpb.TemporaryIndex'
    - joinOnDescID($index, $temp, $table-id)
    - $index[TemporaryIndexID] = $temp-index-id
    - $temp[IndexID] = $temp-index-id
    - $index-Target[TargetStatus] IN [PUBLIC, TRANSIENT_ABSENT]
    - $index-Node[CurrentStatus] = MERGED
    - $temp-Target[TargetStatus] = TRANSIENT_ABSENT
    - $temp-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($temp, $temp-Target, $temp-Node)
- name: index is ready to be validated before we validate constraint on it
  from: index-Node
  kind: Precedence
  to: constraint-Node
  query:
    - $index[Type] = '*scpb.PrimaryIndex'
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - joinOnDescID($index, $constraint, $table-id)
    - $index[IndexID] = $index-id-for-validation
    - $constraint[IndexID] = $index-id-for-validation
    - ToPublicOrTransient($index-Target, $constraint-Target)
    - $index-Node[CurrentStatus] = VALIDATED
    - $constraint-Node[CurrentStatus] = VALIDATED
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: index no longer public before dependents, excluding columns
  from: index-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - $dependent[Type] IN ['*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.PartitionZoneConfig', '*scpb.SecondaryIndexPartial']
    - joinOnIndexID($index, $dependent, $table-id, $index-id)
    - toAbsent($index-Target, $dependent-Target)
    - $index-Node[CurrentStatus] = VALIDATED
    - $dependent-Node[CurrentStatus] = ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: index no longer public before dependents, excluding columns
  from: index-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - $dependent[Type] IN ['*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.PartitionZoneConfig', '*scpb.SecondaryIndexPartial']
    - joinOnIndexID($index, $dependent, $table-id, $index-id)
    - transient($index-Target, $dependent-Target)
    - $index-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $dependent-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: index no longer public before dependents, excluding columns
  from: index-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - $dependent[Type] IN ['*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.PartitionZoneConfig', '*scpb.SecondaryIndexPartial']
    - joinOnIndexID($index, $dependent, $table-id, $index-id)
    - $index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $dependent-Target[TargetStatus] = ABSENT
    - $dependent-Node[CurrentStatus] = ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: index no longer public before dependents, excluding columns
  from: index-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - $dependent[Type] IN ['*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.PartitionZoneConfig', '*scpb.SecondaryIndexPartial']
    - joinOnIndexID($index, $dependent, $table-id, $index-id)
    - $index-Target[TargetStatus] = ABSENT
    - $index-Node[CurrentStatus] = VALIDATED
    - $dependent-Target[TargetStatus] = TRANSIENT_ABSENT
    - $dependent-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: index no longer public before index name
  from: index-Node
  kind: Precedence
  to: name-Node
  query:
    - $index[Type] = '*scpb.SecondaryIndex'
    - $name[Type] = '*scpb.IndexName'
    - joinOnIndexID($index, $name, $table-id, $index-id)
    - toAbsent($index-Target, $name-Target)
    - $index-Node[CurrentStatus] = DELETE_ONLY
    - $name-Node[CurrentStatus] = ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($name, $name-Target, $name-Node)
- name: index no longer public before index name
  from: index-Node
  kind: Precedence
  to: name-Node
  query:
    - $index[Type] = '*scpb.SecondaryIndex'
    - $name[Type] = '*scpb.IndexName'
    - joinOnIndexID($index, $name, $table-id, $index-id)
    - transient($index-Target, $name-Target)
    - $index-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - $name-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($name, $name-Target, $name-Node)
- name: index no longer public before index name
  from: index-Node
  kind: Precedence
  to: name-Node
  query:
    - $index[Type] = '*scpb.SecondaryIndex'
    - $name[Type] = '*scpb.IndexName'
    - joinOnIndexID($index, $name, $table-id, $index-id)
    - $index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - $name-Target[TargetStatus] = ABSENT
    - $name-Node[CurrentStatus] = ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($name, $name-Target, $name-Node)
- name: index no longer public before index name
  from: index-Node
  kind: Precedence
  to: name-Node
  query:
    - $index[Type] = '*scpb.SecondaryIndex'
    - $name[Type] = '*scpb.IndexName'
    - joinOnIndexID($index, $name, $table-id, $index-id)
    - $index-Target[TargetStatus] = ABSENT
    - $index-Node[CurrentStatus] = DELETE_ONLY
    - $name-Target[TargetStatus] = TRANSIENT_ABSENT
    - $name-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($name, $name-Target, $name-Node)
- name: index removed before garbage collection
  from: index-Node
  kind: Precedence
  to: index-data-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - $index-data[Type] = '*scpb.IndexData'
    - joinOnIndexID($index, $index-data, $table-id, $index-id)
    - toAbsent($index-Target, $index-data-Target)
    - $index-Node[CurrentStatus] = ABSENT
    - $index-data-Node[CurrentStatus] = DROPPED
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($index-data, $index-data-Target, $index-data-Node)
- name: index removed before garbage collection
  from: index-Node
  kind: Precedence
  to: index-data-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - $index-data[Type] = '*scpb.IndexData'
    - joinOnIndexID($index, $index-data, $table-id, $index-id)
    - transient($index-Target, $index-data-Target)
    - $index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $index-data-Node[CurrentStatus] = TRANSIENT_DROPPED
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($index-data, $index-data-Target, $index-data-Node)
- name: index removed before garbage collection
  from: index-Node
  kind: Precedence
  to: index-data-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - $index-data[Type] = '*scpb.IndexData'
    - joinOnIndexID($index, $index-data, $table-id, $index-id)
    - $index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $index-data-Target[TargetStatus] = ABSENT
    - $index-data-Node[CurrentStatus] = DROPPED
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($index-data, $index-data-Target, $index-data-Node)
- name: index removed before garbage collection
  from: index-Node
  kind: Precedence
  to: index-data-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - $index-data[Type] = '*scpb.IndexData'
    - joinOnIndexID($index, $index-data, $table-id, $index-id)
    - $index-Target[TargetStatus] = ABSENT
    - $index-Node[CurrentStatus] = ABSENT
    - $index-data-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-data-Node[CurrentStatus] = TRANSIENT_DROPPED
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($index-data, $index-data-Target, $index-data-Node)
- name: index-column added to index before index is backfilled
  from: index-column-Node
  kind: Precedence
  to: index-Node
  query:
    - $index-column[Type] = '*scpb.IndexColumn'
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex']
    - joinOnIndexID($index-column, $index, $table-id, $index-id)
    - ToPublicOrTransient($index-column-Target, $index-Target)
    - $index-column-Node[CurrentStatus] = PUBLIC
    - $index-Node[CurrentStatus] = BACKFILLED
    - joinTargetNode($index-column, $index-column-Target, $index-column-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: index-column added to index before temp index receives writes
  from: index-column-Node
  kind: Precedence
  to: index-Node
  query:
    - $index-column[Type] = '*scpb.IndexColumn'
    - $index[Type] = '*scpb.TemporaryIndex'
    - joinOnIndexID($index-column, $index, $table-id, $index-id)
    - transient($index-column-Target, $index-Target)
    - $index-column-Node[CurrentStatus] = PUBLIC
    - $index-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($index-column, $index-column-Target, $index-column-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: indexes containing column reach absent before column
  from: index-Node
  kind: Precedence
  to: column-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex']
    - $column[Type] = '*scpb.Column'
    - ColumnInIndex($index-column, $index, $table-id, $column-id, $index-id)
    - joinOnColumnID($index-column, $column, $table-id, $column-id)
    - descriptorIsNotBeingDropped-24.3($index-column)
    - toAbsent($index-Target, $column-Target)
    - $index-Node[CurrentStatus] = ABSENT
    - $column-Node[CurrentStatus] = ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: indexes containing column reach absent before column
  from: index-Node
  kind: Precedence
  to: column-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex']
    - $column[Type] = '*scpb.Column'
    - ColumnInIndex($index-column, $index, $table-id, $column-id, $index-id)
    - joinOnColumnID($index-column, $column, $table-id, $column-id)
    - descriptorIsNotBeingDropped-24.3($index-column)
    - transient($index-Target, $column-Target)
    - $index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $column-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: indexes containing column reach absent before column
  from: index-Node
  kind: Precedence
  to: column-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex']
    - $column[Type] = '*scpb.Column'
    - ColumnInIndex($index-column, $index, $table-id, $column-id, $index-id)
    - joinOnColumnID($index-column, $column, $table-id, $column-id)
    - descriptorIsNotBeingDropped-24.3($index-column)
    - $index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $column-Target[TargetStatus] = ABSENT
    - $column-Node[CurrentStatus] = ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: indexes containing column reach absent before column
  from: index-Node
  kind: Precedence
  to: column-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex']
    - $column[Type] = '*scpb.Column'
    - ColumnInIndex($index-column, $index, $table-id, $column-id, $index-id)
    - joinOnColumnID($index-column, $column, $table-id, $column-id)
    - descriptorIsNotBeingDropped-24.3($index-column)
    - $index-Target[TargetStatus] = ABSENT
    - $index-Node[CurrentStatus] = ABSENT
    - $column-Target[TargetStatus] = TRANSIENT_ABSENT
    - $column-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: namespace exist before schema parent
  from: dependent-Node
  kind: Precedence
  to: relation-Node
  query:
    - $dependent[Type] = '*scpb.Namespace'
    - $relation[Type] = '*scpb.SchemaParent'
    - joinOnDescID($dependent, $relation, $schema-id)
    - ToPublicOrTransient($dependent-Target, $relation-Target)
    - $dependent-Node[CurrentStatus] = PUBLIC
    - $relation-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($relation, $relation-Target, $relation-Node)
- name: non-data dependents removed before descriptor
  from: dependent-Node
  kind: Precedence
  to: descriptor-Node
  query:
    - $dependent[Type] IN ['*scpb.CheckConstraint', '*scpb.CheckConstraintUnvalidated', '*scpb.Column', '*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnFamily', '*scpb.ColumnName', '*scpb.ColumnNotNull', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.CompositeTypeAttrName', '*scpb.CompositeTypeAttrType', '*scpb.ConstraintComment', '*scpb.ConstraintWithoutIndexName', '*scpb.DatabaseComment', '*scpb.DatabaseRegionConfig', '*scpb.DatabaseRoleSetting', '*scpb.DatabaseZoneConfig', '*scpb.EnumTypeValue', '*scpb.ForeignKeyConstraint', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.FunctionBody', '*scpb.FunctionLeakProof', '*scpb.FunctionName', '*scpb.FunctionNullInputBehavior', '*scpb.FunctionSecurity', '*scpb.FunctionVolatility', '*scpb.IndexColumn', '*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.LDRJobIDs', '*scpb.Namespace', '*scpb.Owner', '*scpb.PartitionZoneConfig', '*scpb.PrimaryIndex', '*scpb.RowLevelTTL', '*scpb.SchemaChild', '*scpb.SchemaComment', '*scpb.SchemaParent', '*scpb.SecondaryIndex', '*scpb.SecondaryIndexPartial', '*scpb.SequenceOption', '*scpb.SequenceOwner', '*scpb.TableComment', '*scpb.TableLocalityGlobal', '*scpb.TableLocalityPrimaryRegion', '*scpb.TableLocalityRegionalByRow', '*scpb.TableLocalitySecondaryRegion', '*scpb.TablePartitioning', '*scpb.TableSchemaLocked', '*scpb.TableZoneConfig', '*scpb.TemporaryIndex', '*scpb.Trigger', '*scpb.TriggerDeps', '*scpb.TriggerEnabled', '*scpb.TriggerEvents', '*scpb.TriggerFunctionCall', '*scpb.TriggerName', '*scpb.TriggerTiming', '*scpb.TriggerTransition', '*scpb.TriggerWhen', '*scpb.TypeComment', '*scpb.UniqueWithoutIndexConstraint', '*scpb.UniqueWithoutIndexConstraintUnvalidated', '*scpb.UserPrivileges']
    - $descriptor[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.Database', '*scpb.EnumType', '*scpb.Function', '*scpb.Schema', '*scpb.Sequence', '*scpb.Table', '*scpb.View']
    - joinOnDescID($dependent, $descriptor, $desc-id)
    - toAbsent($dependent-Target, $descriptor-Target)
    - $dependent-Node[CurrentStatus] = ABSENT
    - $descriptor-Node[CurrentStatus] = ABSENT
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($descriptor, $descriptor-Target, $descriptor-Node)
- name: old index absent before new index public when swapping with transient
  from: old-primary-index-Node
  kind: Precedence
  to: new-primary-index-Node
  query:
    - $old-primary-index[Type] = '*scpb.PrimaryIndex'
    - $transient-primary-index[Type] = '*scpb.PrimaryIndex'
    - $new-primary-index[Type] = '*scpb.PrimaryIndex'
    - joinOnDescID($old-primary-index, $transient-primary-index, $table-id)
    - $old-primary-index[IndexID] = $old-index-id
    - $transient-primary-index[SourceIndexID] = $old-index-id
    - joinOnDescID($transient-primary-index, $new-primary-index, $table-id)
    - $transient-primary-index[IndexID] = $transient-index-id
    - $new-primary-index[SourceIndexID] = $transient-index-id
    - $old-primary-index-Target[TargetStatus] = ABSENT
    - $old-primary-index-Node[CurrentStatus] = ABSENT
    - $new-primary-index-Target[TargetStatus] = PUBLIC
    - $new-primary-index-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($old-primary-index, $old-primary-index-Target, $old-primary-index-Node)
    - joinTargetNode($new-primary-index, $new-primary-index-Target, $new-primary-index-Node)
- name: partial predicate removed right before secondary index when not dropping relation
  from: partial-predicate-Node
  kind: SameStagePrecedence
  to: index-Node
  query:
    - $partial-predicate[Type] = '*scpb.SecondaryIndexPartial'
    - descriptorIsNotBeingDropped-24.3($partial-predicate)
    - $index[Type] = '*scpb.SecondaryIndex'
    - joinOnIndexID($partial-predicate, $index, $table-id, $index-id)
    - toAbsent($partial-predicate-Target, $index-Target)
    - $partial-predicate-Node[CurrentStatus] = ABSENT
    - $index-Node[CurrentStatus] = ABSENT
    - joinTargetNode($partial-predicate, $partial-predicate-Target, $partial-predicate-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: partial predicate removed right before secondary index when not dropping relation
  from: partial-predicate-Node
  kind: SameStagePrecedence
  to: index-Node
  query:
    - $partial-predicate[Type] = '*scpb.SecondaryIndexPartial'
    - descriptorIsNotBeingDropped-24.3($partial-predicate)
    - $index[Type] = '*scpb.SecondaryIndex'
    - joinOnIndexID($partial-predicate, $index, $table-id, $index-id)
    - transient($partial-predicate-Target, $index-Target)
    - $partial-predicate-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($partial-predicate, $partial-predicate-Target, $partial-predicate-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: partial predicate removed right before secondary index when not dropping relation
  from: partial-predicate-Node
  kind: SameStagePrecedence
  to: index-Node
  query:
    - $partial-predicate[Type] = '*scpb.SecondaryIndexPartial'
    - descriptorIsNotBeingDropped-24.3($partial-predicate)
    - $index[Type] = '*scpb.SecondaryIndex'
    - joinOnIndexID($partial-predicate, $index, $table-id, $index-id)
    - $partial-predicate-Target[TargetStatus] = TRANSIENT_ABSENT
    - $partial-predicate-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $index-Target[TargetStatus] = ABSENT
    - $index-Node[CurrentStatus] = ABSENT
    - joinTargetNode($partial-predicate, $partial-predicate-Target, $partial-predicate-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: partial predicate removed right before secondary index when not dropping relation
  from: partial-predicate-Node
  kind: SameStagePrecedence
  to: index-Node
  query:
    - $partial-predicate[Type] = '*scpb.SecondaryIndexPartial'
    - descriptorIsNotBeingDropped-24.3($partial-predicate)
    - $index[Type] = '*scpb.SecondaryIndex'
    - joinOnIndexID($partial-predicate, $index, $table-id, $index-id)
    - $partial-predicate-Target[TargetStatus] = ABSENT
    - $partial-predicate-Node[CurrentStatus] = ABSENT
    - $index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($partial-predicate, $partial-predicate-Target, $partial-predicate-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: primary index named right before index becomes public
  from: index-name-Node
  kind: SameStagePrecedence
  to: index-Node
  query:
    - $index-name[Type] = '*scpb.IndexName'
    - $index[Type] = '*scpb.PrimaryIndex'
    - joinOnIndexID($index-name, $index, $table-id, $index-id)
    - ToPublicOrTransient($index-name-Target, $index-Target)
    - $index-name-Node[CurrentStatus] = PUBLIC
    - $index-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($index-name, $index-name-Target, $index-name-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: primary index swap
  from: old-index-Node
  kind: SameStagePrecedence
  to: new-index-Node
  query:
    - $old-index[Type] = '*scpb.PrimaryIndex'
    - $new-index[Type] = '*scpb.PrimaryIndex'
    - joinOnDescID($old-index, $new-index, $table-id)
    - $old-index[IndexID] = $old-index-id
    - $new-index[SourceIndexID] = $old-index-id
    - $old-index-Target[TargetStatus] = ABSENT
    - $old-index-Node[CurrentStatus] = VALIDATED
    - $new-index-Target[TargetStatus] IN [PUBLIC, TRANSIENT_ABSENT]
    - $new-index-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($old-index, $old-index-Target, $old-index-Node)
    - joinTargetNode($new-index, $new-index-Target, $new-index-Node)
- name: primary index swap
  from: old-index-Node
  kind: SameStagePrecedence
  to: new-index-Node
  query:
    - $old-index[Type] = '*scpb.PrimaryIndex'
    - $new-index[Type] = '*scpb.PrimaryIndex'
    - joinOnDescID($old-index, $new-index, $table-id)
    - $old-index[IndexID] = $old-index-id
    - $new-index[SourceIndexID] = $old-index-id
    - $old-index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $old-index-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $new-index-Target[TargetStatus] IN [PUBLIC, TRANSIENT_ABSENT]
    - $new-index-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($old-index, $old-index-Target, $old-index-Node)
    - joinTargetNode($new-index, $new-index-Target, $new-index-Node)
- name: primary index swap
  from: new-index-Node
  kind: SameStagePrecedence
  to: old-index-Node
  query:
    - $new-index[Type] = '*scpb.PrimaryIndex'
    - $old-index[Type] = '*scpb.PrimaryIndex'
    - joinOnDescID($new-index, $old-index, $table-id)
    - $new-index[SourceIndexID] = $old-index-id
    - $old-index[IndexID] = $old-index-id
    - $new-index-Target[TargetStatus] = ABSENT
    - $new-index-Node[CurrentStatus] = VALIDATED
    - $old-index-Target[TargetStatus] = PUBLIC
    - $old-index-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($new-index, $new-index-Target, $new-index-Node)
    - joinTargetNode($old-index, $old-index-Target, $old-index-Node)
- name: primary index with new columns should exist before secondary indexes
  from: primary-index-Node
  kind: Precedence
  to: secondary-index-Node
  query:
    - $primary-index[Type] = '*scpb.PrimaryIndex'
    - $secondary-index[Type] = '*scpb.SecondaryIndex'
    - joinOnDescID($primary-index, $secondary-index, $table-id)
    - $primary-index[IndexID] = $primary-index-id
    - $secondary-index[SourceIndexID] = $primary-index-id
    - ToPublicOrTransient($primary-index-Target, $secondary-index-Target)
    - $primary-index-Node[CurrentStatus] = PUBLIC
    - $secondary-index-Node[CurrentStatus] = BACKFILL_ONLY
    - joinTargetNode($primary-index, $primary-index-Target, $primary-index-Node)
    - joinTargetNode($secondary-index, $secondary-index-Target, $secondary-index-Node)
- name: primary index with new columns should exist before temp indexes
  from: primary-index-Node
  kind: Precedence
  to: temp-index-Node
  query:
    - $primary-index[Type] = '*scpb.PrimaryIndex'
    - $temp-index[Type] = '*scpb.TemporaryIndex'
    - joinOnDescID($primary-index, $temp-index, $table-id)
    - $primary-index[IndexID] = $primary-index-id
    - $temp-index[SourceIndexID] = $primary-index-id
    - ToPublicOrTransient($primary-index-Target, $temp-index-Target)
    - $primary-index-Node[CurrentStatus] = PUBLIC
    - $temp-index-Node[CurrentStatus] = DELETE_ONLY
    - joinTargetNode($primary-index, $primary-index-Target, $primary-index-Node)
    - joinTargetNode($temp-index, $temp-index-Target, $temp-index-Node)
- name: relation dropped before dependent column
  from: descriptor-Node
  kind: Precedence
  to: column-Node
  query:
    - $descriptor[Type] IN ['*scpb.Table', '*scpb.View', '*scpb.Sequence']
    - $column[Type] = '*scpb.Column'
    - joinOnDescID($descriptor, $column, $desc-id)
    - toAbsent($descriptor-Target, $column-Target)
    - $descriptor-Node[CurrentStatus] = DROPPED
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($descriptor, $descriptor-Target, $descriptor-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: relation dropped before dependent constraint
  from: descriptor-Node
  kind: Precedence
  to: constraint-Node
  query:
    - $descriptor[Type] = '*scpb.Table'
    - $constraint[Type] = '*scpb.ColumnNotNull'
    - joinOnDescID($descriptor, $constraint, $desc-id)
    - toAbsent($descriptor-Target, $constraint-Target)
    - $descriptor-Node[CurrentStatus] = DROPPED
    - $constraint-Node[CurrentStatus] = VALIDATED
    - joinTargetNode($descriptor, $descriptor-Target, $descriptor-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: relation dropped before dependent index
  from: descriptor-Node
  kind: Precedence
  to: index-Node
  query:
    - $descriptor[Type] IN ['*scpb.Table', '*scpb.View']
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - joinOnDescID($descriptor, $index, $desc-id)
    - toAbsent($descriptor-Target, $index-Target)
    - $descriptor-Node[CurrentStatus] = DROPPED
    - $index-Node[CurrentStatus] = VALIDATED
    - joinTargetNode($descriptor, $descriptor-Target, $descriptor-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: remove columns from index right before removing index
  from: index-column-Node
  kind: Precedence
  to: index-Node
  query:
    - $index-column[Type] = '*scpb.IndexColumn'
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - joinOnIndexID($index-column, $index, $table-id, $index-id)
    - toAbsent($index-column-Target, $index-Target)
    - $index-column-Node[CurrentStatus] = DELETE_ONLY
    - $index-Node[CurrentStatus] = ABSENT
    - joinTargetNode($index-column, $index-column-Target, $index-column-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: remove columns from index right before removing index
  from: index-column-Node
  kind: Precedence
  to: index-Node
  query:
    - $index-column[Type] = '*scpb.IndexColumn'
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - joinOnIndexID($index-column, $index, $table-id, $index-id)
    - transient($index-column-Target, $index-Target)
    - $index-column-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - $index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($index-column, $index-column-Target, $index-column-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: remove columns from index right before removing index
  from: index-column-Node
  kind: Precedence
  to: index-Node
  query:
    - $index-column[Type] = '*scpb.IndexColumn'
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - joinOnIndexID($index-column, $index, $table-id, $index-id)
    - $index-column-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-column-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - $index-Target[TargetStatus] = ABSENT
    - $index-Node[CurrentStatus] = ABSENT
    - joinTargetNode($index-column, $index-column-Target, $index-column-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: remove columns from index right before removing index
  from: index-column-Node
  kind: Precedence
  to: index-Node
  query:
    - $index-column[Type] = '*scpb.IndexColumn'
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - joinOnIndexID($index-column, $index, $table-id, $index-id)
    - $index-column-Target[TargetStatus] = ABSENT
    - $index-column-Node[CurrentStatus] = DELETE_ONLY
    - $index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($index-column, $index-column-Target, $index-column-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: replacement secondary index should be validated before the old one becomes invisible
  from: new-index-Node
  kind: Precedence
  to: old-index-Node
  query:
    - $old-index[Type] = '*scpb.SecondaryIndex'
    - $new-index[Type] = '*scpb.SecondaryIndex'
    - $old-index-Target[TargetStatus] = ABSENT
    - $new-index-Target[TargetStatus] IN [PUBLIC, TRANSIENT_ABSENT]
    - joinOnDescID($old-index, $new-index, $table-id)
    - $new-index[IndexID] = $index-id
    - $old-index[IndexID] = $old-index-id
    - $new-index[RecreateSourceIndexID] = $old-index-id
    - joinTargetNode($old-index, $old-index-Target, $old-index-Node)
    - joinTargetNode($new-index, $new-index-Target, $new-index-Node)
    - $new-index-Node[CurrentStatus] = PUBLIC
    - $old-index-Node[CurrentStatus] = VALIDATED
    - joinTargetNode($new-index, $new-index-Target, $new-index-Node)
    - joinTargetNode($old-index, $old-index-Target, $old-index-Node)
- name: schedule all GC jobs for a descriptor in the same stage
  from: data-a-Node
  kind: SameStagePrecedence
  to: data-b-Node
  query:
    - $data-a[Type] IN ['*scpb.DatabaseData', '*scpb.IndexData', '*scpb.TableData']
    - $data-b[Type] IN ['*scpb.DatabaseData', '*scpb.IndexData', '*scpb.TableData']
    - joinOnDescID($data-a, $data-b, $desc-id)
    - SmallerIDsFirst(scpb.Element, scpb.Element)($data-a, $data-b)
    - toAbsent($data-a-Target, $data-b-Target)
    - $data-a-Node[CurrentStatus] = DROPPED
    - $data-b-Node[CurrentStatus] = DROPPED
    - joinTargetNode($data-a, $data-a-Target, $data-a-Node)
    - joinTargetNode($data-b, $data-b-Target, $data-b-Node)
- name: schedule all GC jobs for a descriptor in the same stage
  from: data-a-Node
  kind: SameStagePrecedence
  to: data-b-Node
  query:
    - $data-a[Type] IN ['*scpb.DatabaseData', '*scpb.IndexData', '*scpb.TableData']
    - $data-b[Type] IN ['*scpb.DatabaseData', '*scpb.IndexData', '*scpb.TableData']
    - joinOnDescID($data-a, $data-b, $desc-id)
    - SmallerIDsFirst(scpb.Element, scpb.Element)($data-a, $data-b)
    - transient($data-a-Target, $data-b-Target)
    - $data-a-Node[CurrentStatus] = TRANSIENT_DROPPED
    - $data-b-Node[CurrentStatus] = TRANSIENT_DROPPED
    - joinTargetNode($data-a, $data-a-Target, $data-a-Node)
    - joinTargetNode($data-b, $data-b-Target, $data-b-Node)
- name: schedule all GC jobs for a descriptor in the same stage
  from: data-a-Node
  kind: SameStagePrecedence
  to: data-b-Node
  query:
    - $data-a[Type] IN ['*scpb.DatabaseData', '*scpb.IndexData', '*scpb.TableData']
    - $data-b[Type] IN ['*scpb.DatabaseData', '*scpb.IndexData', '*scpb.TableData']
    - joinOnDescID($data-a, $data-b, $desc-id)
    - SmallerIDsFirst(scpb.Element, scpb.Element)($data-a, $data-b)
    - $data-a-Target[TargetStatus] = TRANSIENT_ABSENT
    - $data-a-Node[CurrentStatus] = TRANSIENT_DROPPED
    - $data-b-Target[TargetStatus] = ABSENT
    - $data-b-Node[CurrentStatus] = DROPPED
    - joinTargetNode($data-a, $data-a-Target, $data-a-Node)
    - joinTargetNode($data-b, $data-b-Target, $data-b-Node)
- name: schedule all GC jobs for a descriptor in the same stage
  from: data-a-Node
  kind: SameStagePrecedence
  to: data-b-Node
  query:
    - $data-a[Type] IN ['*scpb.DatabaseData', '*scpb.IndexData', '*scpb.TableData']
    - $data-b[Type] IN ['*scpb.DatabaseData', '*scpb.IndexData', '*scpb.TableData']
    - joinOnDescID($data-a, $data-b, $desc-id)
    - SmallerIDsFirst(scpb.Element, scpb.Element)($data-a, $data-b)
    - $data-a-Target[TargetStatus] = ABSENT
    - $data-a-Node[CurrentStatus] = DROPPED
    - $data-b-Target[TargetStatus] = TRANSIENT_ABSENT
    - $data-b-Node[CurrentStatus] = TRANSIENT_DROPPED
    - joinTargetNode($data-a, $data-a-Target, $data-a-Node)
    - joinTargetNode($data-b, $data-b-Target, $data-b-Node)
- name: secondary index named before public (with index swap)
  from: index-Node
  kind: Precedence
  to: index-name-Node
  query:
    - $index-name[Type] = '*scpb.IndexName'
    - $index[Type] = '*scpb.SecondaryIndex'
    - joinOnIndexID($index, $index-name, $table-id, $index-id)
    - ToPublicOrTransient($index-Target, $index-name-Target)
    - $index-Node[CurrentStatus] = VALIDATED
    - $index-name-Node[CurrentStatus] = PUBLIC
    - $old-index[Type] = '*scpb.SecondaryIndex'
    - $new-index[Type] = '*scpb.SecondaryIndex'
    - $old-index-Target[TargetStatus] = ABSENT
    - $new-index-Target[TargetStatus] IN [PUBLIC, TRANSIENT_ABSENT]
    - joinOnDescID($old-index, $new-index, $table-id)
    - $new-index[IndexID] = $index-id
    - $old-index[IndexID] = $old-index-id
    - $new-index[RecreateSourceIndexID] = $old-index-id
    - joinTargetNode($old-index, $old-index-Target, $old-index-Node)
    - joinTargetNode($new-index, $new-index-Target, $new-index-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($index-name, $index-name-Target, $index-name-Node)
- name: secondary index named before validation (without index swap)
  from: index-name-Node
  kind: Precedence
  to: index-Node
  query:
    - $index-name[Type] = '*scpb.IndexName'
    - $index[Type] = '*scpb.SecondaryIndex'
    - joinOnIndexID($index-name, $index, $table-id, $index-id)
    - no secondary index swap is on going($table-id, $index-id)
    - ToPublicOrTransient($index-name-Target, $index-Target)
    - $index-name-Node[CurrentStatus] = PUBLIC
    - $index-Node[CurrentStatus] = VALIDATED
    - joinTargetNode($index-name, $index-name-Target, $index-name-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: secondary index partial no longer public before referenced column
  from: secondary-partial-index-Node
  kind: Precedence
  to: column-Node
  query:
    - $secondary-partial-index[Type] = '*scpb.SecondaryIndex'
    - $column[Type] = '*scpb.Column'
    - joinOnDescID($secondary-partial-index, $column, $table-id)
    - descriptorIsNotBeingDropped-24.3($secondary-partial-index)
    - secondaryIndexReferencesColumn(*scpb.SecondaryIndex, *scpb.Column)($secondary-partial-index, $column)
    - toAbsent($secondary-partial-index-Target, $column-Target)
    - $secondary-partial-index-Node[CurrentStatus] = DELETE_ONLY
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($secondary-partial-index, $secondary-partial-index-Target, $secondary-partial-index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: secondary index partial no longer public before referenced column
  from: secondary-partial-index-Node
  kind: Precedence
  to: column-Node
  query:
    - $secondary-partial-index[Type] = '*scpb.SecondaryIndex'
    - $column[Type] = '*scpb.Column'
    - joinOnDescID($secondary-partial-index, $column, $table-id)
    - descriptorIsNotBeingDropped-24.3($secondary-partial-index)
    - secondaryIndexReferencesColumn(*scpb.SecondaryIndex, *scpb.Column)($secondary-partial-index, $column)
    - transient($secondary-partial-index-Target, $column-Target)
    - $secondary-partial-index-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - $column-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - joinTargetNode($secondary-partial-index, $secondary-partial-index-Target, $secondary-partial-index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: secondary index partial no longer public before referenced column
  from: secondary-partial-index-Node
  kind: Precedence
  to: column-Node
  query:
    - $secondary-partial-index[Type] = '*scpb.SecondaryIndex'
    - $column[Type] = '*scpb.Column'
    - joinOnDescID($secondary-partial-index, $column, $table-id)
    - descriptorIsNotBeingDropped-24.3($secondary-partial-index)
    - secondaryIndexReferencesColumn(*scpb.SecondaryIndex, *scpb.Column)($secondary-partial-index, $column)
    - $secondary-partial-index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $secondary-partial-index-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - $column-Target[TargetStatus] = ABSENT
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($secondary-partial-index, $secondary-partial-index-Target, $secondary-partial-index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: secondary index partial no longer public before referenced column
  from: secondary-partial-index-Node
  kind: Precedence
  to: column-Node
  query:
    - $secondary-partial-index[Type] = '*scpb.SecondaryIndex'
    - $column[Type] = '*scpb.Column'
    - joinOnDescID($secondary-partial-index, $column, $table-id)
    - descriptorIsNotBeingDropped-24.3($secondary-partial-index)
    - secondaryIndexReferencesColumn(*scpb.SecondaryIndex, *scpb.Column)($secondary-partial-index, $column)
    - $secondary-partial-index-Target[TargetStatus] = ABSENT
    - $secondary-partial-index-Node[CurrentStatus] = DELETE_ONLY
    - $column-Target[TargetStatus] = TRANSIENT_ABSENT
    - $column-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - joinTargetNode($secondary-partial-index, $secondary-partial-index-Target, $secondary-partial-index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: secondary index partial no longer public before referenced column
  from: secondary-partial-index-Node
  kind: Precedence
  to: column-Node
  query:
    - $secondary-partial-index[Type] = '*scpb.SecondaryIndexPartial'
    - $column[Type] = '*scpb.Column'
    - joinOnDescID($secondary-partial-index, $column, $table-id)
    - descriptorIsNotBeingDropped-24.3($secondary-partial-index)
    - secondaryIndexReferencesColumn(*scpb.SecondaryIndexPartial, *scpb.Column)($secondary-partial-index, $column)
    - toAbsent($secondary-partial-index-Target, $column-Target)
    - $secondary-partial-index-Node[CurrentStatus] = ABSENT
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($secondary-partial-index, $secondary-partial-index-Target, $secondary-partial-index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: secondary index partial no longer public before referenced column
  from: secondary-partial-index-Node
  kind: Precedence
  to: column-Node
  query:
    - $secondary-partial-index[Type] = '*scpb.SecondaryIndexPartial'
    - $column[Type] = '*scpb.Column'
    - joinOnDescID($secondary-partial-index, $column, $table-id)
    - descriptorIsNotBeingDropped-24.3($secondary-partial-index)
    - secondaryIndexReferencesColumn(*scpb.SecondaryIndexPartial, *scpb.Column)($secondary-partial-index, $column)
    - transient($secondary-partial-index-Target, $column-Target)
    - $secondary-partial-index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $column-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - joinTargetNode($secondary-partial-index, $secondary-partial-index-Target, $secondary-partial-index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: secondary index partial no longer public before referenced column
  from: secondary-partial-index-Node
  kind: Precedence
  to: column-Node
  query:
    - $secondary-partial-index[Type] = '*scpb.SecondaryIndexPartial'
    - $column[Type] = '*scpb.Column'
    - joinOnDescID($secondary-partial-index, $column, $table-id)
    - descriptorIsNotBeingDropped-24.3($secondary-partial-index)
    - secondaryIndexReferencesColumn(*scpb.SecondaryIndexPartial, *scpb.Column)($secondary-partial-index, $column)
    - $secondary-partial-index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $secondary-partial-index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $column-Target[TargetStatus] = ABSENT
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($secondary-partial-index, $secondary-partial-index-Target, $secondary-partial-index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: secondary index partial no longer public before referenced column
  from: secondary-partial-index-Node
  kind: Precedence
  to: column-Node
  query:
    - $secondary-partial-index[Type] = '*scpb.SecondaryIndexPartial'
    - $column[Type] = '*scpb.Column'
    - joinOnDescID($secondary-partial-index, $column, $table-id)
    - descriptorIsNotBeingDropped-24.3($secondary-partial-index)
    - secondaryIndexReferencesColumn(*scpb.SecondaryIndexPartial, *scpb.Column)($secondary-partial-index, $column)
    - $secondary-partial-index-Target[TargetStatus] = ABSENT
    - $secondary-partial-index-Node[CurrentStatus] = ABSENT
    - $column-Target[TargetStatus] = TRANSIENT_ABSENT
    - $column-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - joinTargetNode($secondary-partial-index, $secondary-partial-index-Target, $secondary-partial-index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: secondary index should be validated before dependent view can be absent
  from: index-Node
  kind: Precedence
  to: view-Node
  query:
    - $index[Type] = '*scpb.SecondaryIndex'
    - $view[Type] = '*scpb.View'
    - viewReferencesIndex(*scpb.SecondaryIndex, *scpb.View)($index, $view)
    - toAbsent($index-Target, $view-Target)
    - $index-Node[CurrentStatus] = VALIDATED
    - $view-Node[CurrentStatus] = ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($view, $view-Target, $view-Node)
- name: secondary index should be validated before dependent view can be absent
  from: index-Node
  kind: Precedence
  to: view-Node
  query:
    - $index[Type] = '*scpb.SecondaryIndex'
    - $view[Type] = '*scpb.View'
    - viewReferencesIndex(*scpb.SecondaryIndex, *scpb.View)($index, $view)
    - transient($index-Target, $view-Target)
    - $index-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $view-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($view, $view-Target, $view-Node)
- name: secondary index should be validated before dependent view can be absent
  from: index-Node
  kind: Precedence
  to: view-Node
  query:
    - $index[Type] = '*scpb.SecondaryIndex'
    - $view[Type] = '*scpb.View'
    - viewReferencesIndex(*scpb.SecondaryIndex, *scpb.View)($index, $view)
    - $index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $view-Target[TargetStatus] = ABSENT
    - $view-Node[CurrentStatus] = ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($view, $view-Target, $view-Node)
- name: secondary index should be validated before dependent view can be absent
  from: index-Node
  kind: Precedence
  to: view-Node
  query:
    - $index[Type] = '*scpb.SecondaryIndex'
    - $view[Type] = '*scpb.View'
    - viewReferencesIndex(*scpb.SecondaryIndex, *scpb.View)($index, $view)
    - $index-Target[TargetStatus] = ABSENT
    - $index-Node[CurrentStatus] = VALIDATED
    - $view-Target[TargetStatus] = TRANSIENT_ABSENT
    - $view-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($view, $view-Target, $view-Node)
- name: secondary indexes containing column as key reach write-only before column
  from: index-Node
  kind: Precedence
  to: column-Node
  query:
    - $index[Type] = '*scpb.SecondaryIndex'
    - $column[Type] = '*scpb.Column'
    - ColumnInIndex($index-column, $index, $table-id, $column-id, $index-id)
    - joinOnColumnID($index-column, $column, $table-id, $column-id)
    - toAbsent($index-Target, $column-Target)
    - $index-Node[CurrentStatus] = VALIDATED
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($index-column)
    - isIndexKeyColumnKey(*scpb.IndexColumn)($index-column)
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: simple constraint public right before its dependents
  from: simple-constraint-Node
  kind: SameStagePrecedence
  to: dependent-Node
  query:
    - $simple-constraint[Type] = '*scpb.ColumnNotNull'
    - $dependent[Type] IN ['*scpb.ConstraintComment', '*scpb.ConstraintWithoutIndexName']
    - joinOnConstraintID($simple-constraint, $dependent, $table-id, $constraint-id)
    - ToPublicOrTransient($simple-constraint-Target, $dependent-Target)
    - $simple-constraint-Node[CurrentStatus] = PUBLIC
    - $dependent-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($simple-constraint, $simple-constraint-Target, $simple-constraint-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: simple constraint visible before name
  from: simple-constraint-Node
  kind: Precedence
  to: constraint-name-Node
  query:
    - $simple-constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.CheckConstraintUnvalidated', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraint', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - $constraint-name[Type] = '*scpb.ConstraintWithoutIndexName'
    - joinOnConstraintID($simple-constraint, $constraint-name, $table-id, $constraint-id)
    - ToPublicOrTransient($simple-constraint-Target, $constraint-name-Target)
    - $simple-constraint-Node[CurrentStatus] = WRITE_ONLY
    - $constraint-name-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($simple-constraint, $simple-constraint-Target, $simple-constraint-Node)
    - joinTargetNode($constraint-name, $constraint-name-Target, $constraint-name-Node)
- name: swapped primary index public before column
  from: index-Node
  kind: Precedence
  to: column-Node
  query:
    - $index[Type] = '*scpb.PrimaryIndex'
    - $column[Type] = '*scpb.Column'
    - ColumnInSwappedInPrimaryIndex($index-column, $index, $table-id, $column-id, $index-id)
    - joinOnColumnID($index-column, $column, $table-id, $column-id)
    - ToPublicOrTransient($index-Target, $column-Target)
    - $index-Node[CurrentStatus] = PUBLIC
    - $column-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: table added right before data element
  from: table-Node
  kind: Precedence
  to: data-Node
  query:
    - $table[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.Database', '*scpb.EnumType', '*scpb.Function', '*scpb.Schema', '*scpb.Sequence', '*scpb.Table', '*scpb.View']
    - $data[Type] IN ['*scpb.DatabaseData', '*scpb.IndexData', '*scpb.TableData']
    - joinOnDescID($table, $data, $table-id)
    - ToPublicOrTransient($table-Target, $data-Target)
    - $table-Node[CurrentStatus] = PUBLIC
    - $data-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($table, $table-Target, $table-Node)
    - joinTargetNode($data, $data-Target, $data-Node)
- name: table removed right before garbage collection
  from: table-Node
  kind: SameStagePrecedence
  to: data-Node
  query:
    - $table[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.Database', '*scpb.EnumType', '*scpb.Function', '*scpb.Schema', '*scpb.Sequence', '*scpb.Table', '*scpb.View']
    - $data[Type] = '*scpb.TableData'
    - joinOnDescID($table, $data, $table-id)
    - toAbsent($table-Target, $data-Target)
    - $table-Node[CurrentStatus] = ABSENT
    - $data-Node[CurrentStatus] = DROPPED
    - joinTargetNode($table, $table-Target, $table-Node)
    - joinTargetNode($data, $data-Target, $data-Node)
- name: temp index data exists as soon as temp index accepts writes
  from: temp-index-Node
  kind: SameStagePrecedence
  to: temp-index-data-Node
  query:
    - $temp-index[Type] = '*scpb.TemporaryIndex'
    - $temp-index-data[Type] = '*scpb.IndexData'
    - joinOnIndexID($temp-index, $temp-index-data, $table-id, $index-id)
    - ToPublicOrTransient($temp-index-Target, $temp-index-data-Target)
    - $temp-index-Node[CurrentStatus] = WRITE_ONLY
    - $temp-index-data-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($temp-index, $temp-index-Target, $temp-index-Node)
    - joinTargetNode($temp-index-data, $temp-index-data-Target, $temp-index-data-Node)
- name: temp index disappeared before its master index reaches WRITE_ONLY
  from: temp-Node
  kind: Precedence
  to: index-Node
  query:
    - $temp[Type] = '*scpb.TemporaryIndex'
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex']
    - joinOnDescID($temp, $index, $table-id)
    - $temp[IndexID] = $temp-index-id
    - $index[TemporaryIndexID] = $temp-index-id
    - $temp-Target[TargetStatus] = TRANSIENT_ABSENT
    - $temp-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - $index-Target[TargetStatus] IN [PUBLIC, TRANSIENT_ABSENT]
    - $index-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($temp, $temp-Target, $temp-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: temp index existence precedes index dependents
  from: index-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $index[Type] = '*scpb.TemporaryIndex'
    - $dependent[Type] IN ['*scpb.IndexColumn', '*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.PartitionZoneConfig', '*scpb.SecondaryIndexPartial']
    - joinOnIndexID($index, $dependent, $table-id, $index-id)
    - ToPublicOrTransient($index-Target, $dependent-Target)
    - $index-Node[CurrentStatus] = DELETE_ONLY
    - $dependent-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: temp index is WRITE_ONLY before backfill
  from: temp-Node
  kind: Precedence
  to: index-Node
  query:
    - $temp[Type] = '*scpb.TemporaryIndex'
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex']
    - joinOnDescID($temp, $index, $table-id)
    - $temp[IndexID] = $temp-index-id
    - $index[TemporaryIndexID] = $temp-index-id
    - $temp-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-Target[TargetStatus] IN [PUBLIC, TRANSIENT_ABSENT]
    - $temp-Node[CurrentStatus] = WRITE_ONLY
    - $index-Node[CurrentStatus] = BACKFILLED
    - joinTargetNode($temp, $temp-Target, $temp-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: trigger public before its dependents
  from: trigger-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $trigger[Type] = '*scpb.Trigger'
    - $dependent[Type] IN ['*scpb.TriggerDeps', '*scpb.TriggerEnabled', '*scpb.TriggerEvents', '*scpb.TriggerFunctionCall', '*scpb.TriggerName', '*scpb.TriggerTiming', '*scpb.TriggerTransition', '*scpb.TriggerWhen']
    - joinOnTriggerID($trigger, $dependent, $table-id, $trigger-id)
    - ToPublicOrTransient($trigger-Target, $dependent-Target)
    - $trigger-Node[CurrentStatus] = PUBLIC
    - $dependent-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($trigger, $trigger-Target, $trigger-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: trigger removed before dependents
  from: trigger-Node
  kind: Precedence
  to: dependents-Node
  query:
    - $dependents[Type] = '*scpb.Trigger'
    - $trigger[Type] IN ['*scpb.TriggerDeps', '*scpb.TriggerEnabled', '*scpb.TriggerEvents', '*scpb.TriggerFunctionCall', '*scpb.TriggerName', '*scpb.TriggerTiming', '*scpb.TriggerTransition', '*scpb.TriggerWhen']
    - joinOnTriggerID($trigger, $dependents, $table-id, $trigger-id)
    - toAbsent($trigger-Target, $dependents-Target)
    - $trigger-Node[CurrentStatus] = ABSENT
    - $dependents-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($trigger, $trigger-Target, $trigger-Node)
    - joinTargetNode($dependents, $dependents-Target, $dependents-Node)
- name: trigger removed before dependents
  from: trigger-Node
  kind: Precedence
  to: dependents-Node
  query:
    - $dependents[Type] = '*scpb.Trigger'
    - $trigger[Type] IN ['*scpb.TriggerDeps', '*scpb.TriggerEnabled', '*scpb.TriggerEvents', '*scpb.TriggerFunctionCall', '*scpb.TriggerName', '*scpb.TriggerTiming', '*scpb.TriggerTransition', '*scpb.TriggerWhen']
    - joinOnTriggerID($trigger, $dependents, $table-id, $trigger-id)
    - transient($trigger-Target, $dependents-Target)
    - $trigger-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $dependents-Node[CurrentStatus] = TRANSIENT_PUBLIC
    - joinTargetNode($trigger, $trigger-Target, $trigger-Node)
    - joinTargetNode($dependents, $dependents-Target, $dependents-Node)
- name: trigger removed before dependents
  from: trigger-Node
  kind: Precedence
  to: dependents-Node
  query:
    - $dependents[Type] = '*scpb.Trigger'
    - $trigger[Type] IN ['*scpb.TriggerDeps', '*scpb.TriggerEnabled', '*scpb.TriggerEvents', '*scpb.TriggerFunctionCall', '*scpb.TriggerName', '*scpb.TriggerTiming', '*scpb.TriggerTransition', '*scpb.TriggerWhen']
    - joinOnTriggerID($trigger, $dependents, $table-id, $trigger-id)
    - $trigger-Target[TargetStatus] = TRANSIENT_ABSENT
    - $trigger-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $dependents-Target[TargetStatus] = ABSENT
    - $dependents-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($trigger, $trigger-Target, $trigger-Node)
    - joinTargetNode($dependents, $dependents-Target, $dependents-Node)
- name: trigger removed before dependents
  from: trigger-Node
  kind: Precedence
  to: dependents-Node
  query:
    - $dependents[Type] = '*scpb.Trigger'
    - $trigger[Type] IN ['*scpb.TriggerDeps', '*scpb.TriggerEnabled', '*scpb.TriggerEvents', '*scpb.TriggerFunctionCall', '*scpb.TriggerName', '*scpb.TriggerTiming', '*scpb.TriggerTransition', '*scpb.TriggerWhen']
    - joinOnTriggerID($trigger, $dependents, $table-id, $trigger-id)
    - $trigger-Target[TargetStatus] = ABSENT
    - $trigger-Node[CurrentStatus] = ABSENT
    - $dependents-Target[TargetStatus] = TRANSIENT_ABSENT
    - $dependents-Node[CurrentStatus] = TRANSIENT_PUBLIC
    - joinTargetNode($trigger, $trigger-Target, $trigger-Node)
    - joinTargetNode($dependents, $dependents-Target, $dependents-Node)

deprules
----
- name: 'CheckConstraint transitions to ABSENT uphold 2-version invariant: PUBLIC->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = PUBLIC
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to ABSENT uphold 2-version invariant: TRANSIENT_ABSENT->ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $next-Node[CurrentStatus] = ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to ABSENT uphold 2-version invariant: TRANSIENT_VALIDATED->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to ABSENT uphold 2-version invariant: TRANSIENT_WRITE_ONLY->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to ABSENT uphold 2-version invariant: VALIDATED->ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - nodeNotExistsWithStatusIn_TRANSIENT_VALIDATED_WRITE_ONLY_TRANSIENT_WRITE_ONLY($prev-Target)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to PUBLIC uphold 2-version invariant: ABSENT->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = ABSENT
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to PUBLIC uphold 2-version invariant: VALIDATED->PUBLIC'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = PUBLIC
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to PUBLIC uphold 2-version invariant: WRITE_ONLY->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to TRANSIENT_ABSENT uphold 2-version invariant: ABSENT->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = ABSENT
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to TRANSIENT_ABSENT uphold 2-version invariant: PUBLIC->TRANSIENT_VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = PUBLIC
    - $next-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_VALIDATED->TRANSIENT_ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $next-Node[CurrentStatus] = TRANSIENT_ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - nodeNotExistsWithStatusIn_TRANSIENT_WRITE_ONLY($prev-Target)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_WRITE_ONLY->TRANSIENT_VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - $next-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to TRANSIENT_ABSENT uphold 2-version invariant: VALIDATED->PUBLIC'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = PUBLIC
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'CheckConstraint transitions to TRANSIENT_ABSENT uphold 2-version invariant: WRITE_ONLY->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.CheckConstraint'
    - $next[Type] = '*scpb.CheckConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'Column transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.Column'
    - $next[Type] = '*scpb.Column'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = DELETE_ONLY
    - $next-Node[CurrentStatus] = ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'Column transitions to ABSENT uphold 2-version invariant: PUBLIC->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.Column'
    - $next[Type] = '*scpb.Column'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = PUBLIC
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'Column transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.Column'
    - $next[Type] = '*scpb.Column'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'Column transitions to PUBLIC uphold 2-version invariant: ABSENT->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.Column'
    - $next[Type] = '*scpb.Column'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = ABSENT
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'Column transitions to PUBLIC uphold 2-version invariant: DELETE_ONLY->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.Column'
    - $next[Type] = '*scpb.Column'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = DELETE_ONLY
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'Column transitions to PUBLIC uphold 2-version invariant: WRITE_ONLY->PUBLIC'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.Column'
    - $next[Type] = '*scpb.Column'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = PUBLIC
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'ColumnNotNull transitions to ABSENT uphold 2-version invariant: PUBLIC->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.ColumnNotNull'
    - $next[Type] = '*scpb.ColumnNotNull'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = PUBLIC
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'ColumnNotNull transitions to ABSENT uphold 2-version invariant: VALIDATED->ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.ColumnNotNull'
    - $next[Type] = '*scpb.ColumnNotNull'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - nodeNotExistsWithStatusIn_WRITE_ONLY($prev-Target)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'ColumnNotNull transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.ColumnNotNull'
    - $next[Type] = '*scpb.ColumnNotNull'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'ColumnNotNull transitions to PUBLIC uphold 2-version invariant: ABSENT->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.ColumnNotNull'
    - $next[Type] = '*scpb.ColumnNotNull'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = ABSENT
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'ColumnNotNull transitions to PUBLIC uphold 2-version invariant: VALIDATED->PUBLIC'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.ColumnNotNull'
    - $next[Type] = '*scpb.ColumnNotNull'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = PUBLIC
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'ColumnNotNull transitions to PUBLIC uphold 2-version invariant: WRITE_ONLY->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.ColumnNotNull'
    - $next[Type] = '*scpb.ColumnNotNull'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: Computed column expression is dropped before the column it depends on
  from: column-expr-Node
  kind: Precedence
  to: column-Node
  query:
    - $column-expr[Type] = '*scpb.ColumnComputeExpression'
    - $column[Type] = '*scpb.Column'
    - joinOnDescID($column-expr, $column, $table-id)
    - computedColumnTypeReferencesColumn(*scpb.ColumnComputeExpression, *scpb.Column)($column-expr, $column)
    - toAbsent($column-expr-Target, $column-Target)
    - $column-expr-Node[CurrentStatus] = ABSENT
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($column-expr, $column-expr-Target, $column-expr-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: Computed column expression is dropped before the column it depends on
  from: column-expr-Node
  kind: Precedence
  to: column-Node
  query:
    - $column-expr[Type] = '*scpb.ColumnComputeExpression'
    - $column[Type] = '*scpb.Column'
    - joinOnDescID($column-expr, $column, $table-id)
    - computedColumnTypeReferencesColumn(*scpb.ColumnComputeExpression, *scpb.Column)($column-expr, $column)
    - transient($column-expr-Target, $column-Target)
    - $column-expr-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $column-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - joinTargetNode($column-expr, $column-expr-Target, $column-expr-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: Computed column expression is dropped before the column it depends on
  from: column-expr-Node
  kind: Precedence
  to: column-Node
  query:
    - $column-expr[Type] = '*scpb.ColumnComputeExpression'
    - $column[Type] = '*scpb.Column'
    - joinOnDescID($column-expr, $column, $table-id)
    - computedColumnTypeReferencesColumn(*scpb.ColumnComputeExpression, *scpb.Column)($column-expr, $column)
    - $column-expr-Target[TargetStatus] = TRANSIENT_ABSENT
    - $column-expr-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $column-Target[TargetStatus] = ABSENT
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($column-expr, $column-expr-Target, $column-expr-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: Computed column expression is dropped before the column it depends on
  from: column-expr-Node
  kind: Precedence
  to: column-Node
  query:
    - $column-expr[Type] = '*scpb.ColumnComputeExpression'
    - $column[Type] = '*scpb.Column'
    - joinOnDescID($column-expr, $column, $table-id)
    - computedColumnTypeReferencesColumn(*scpb.ColumnComputeExpression, *scpb.Column)($column-expr, $column)
    - $column-expr-Target[TargetStatus] = ABSENT
    - $column-expr-Node[CurrentStatus] = ABSENT
    - $column-Target[TargetStatus] = TRANSIENT_ABSENT
    - $column-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - joinTargetNode($column-expr, $column-expr-Target, $column-expr-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: Constraint should be hidden before name
  from: constraint-name-Node
  kind: Precedence
  to: constraint-Node
  query:
    - $constraint-name[Type] = '*scpb.ConstraintWithoutIndexName'
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.CheckConstraintUnvalidated', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraint', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - joinOnConstraintID($constraint-name, $constraint, $table-id, $constraint-id)
    - toAbsent($constraint-name-Target, $constraint-Target)
    - $constraint-name-Node[CurrentStatus] = ABSENT
    - $constraint-Node[CurrentStatus] = ABSENT
    - joinTargetNode($constraint-name, $constraint-name-Target, $constraint-name-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: Constraint should be hidden before name
  from: constraint-name-Node
  kind: Precedence
  to: constraint-Node
  query:
    - $constraint-name[Type] = '*scpb.ConstraintWithoutIndexName'
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.CheckConstraintUnvalidated', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraint', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - joinOnConstraintID($constraint-name, $constraint, $table-id, $constraint-id)
    - transient($constraint-name-Target, $constraint-Target)
    - $constraint-name-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $constraint-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($constraint-name, $constraint-name-Target, $constraint-name-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: Constraint should be hidden before name
  from: constraint-name-Node
  kind: Precedence
  to: constraint-Node
  query:
    - $constraint-name[Type] = '*scpb.ConstraintWithoutIndexName'
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.CheckConstraintUnvalidated', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraint', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - joinOnConstraintID($constraint-name, $constraint, $table-id, $constraint-id)
    - $constraint-name-Target[TargetStatus] = TRANSIENT_ABSENT
    - $constraint-name-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $constraint-Target[TargetStatus] = ABSENT
    - $constraint-Node[CurrentStatus] = ABSENT
    - joinTargetNode($constraint-name, $constraint-name-Target, $constraint-name-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: Constraint should be hidden before name
  from: constraint-name-Node
  kind: Precedence
  to: constraint-Node
  query:
    - $constraint-name[Type] = '*scpb.ConstraintWithoutIndexName'
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.CheckConstraintUnvalidated', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraint', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - joinOnConstraintID($constraint-name, $constraint, $table-id, $constraint-id)
    - $constraint-name-Target[TargetStatus] = ABSENT
    - $constraint-name-Node[CurrentStatus] = ABSENT
    - $constraint-Target[TargetStatus] = TRANSIENT_ABSENT
    - $constraint-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($constraint-name, $constraint-name-Target, $constraint-name-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: Constraint should be hidden before name
  from: constraint-Node
  kind: Precedence
  to: constraint-name-Node
  query:
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.CheckConstraintUnvalidated', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraint', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - $constraint-name[Type] = '*scpb.ConstraintWithoutIndexName'
    - joinOnConstraintID($constraint, $constraint-name, $table-id, $constraint-id)
    - toAbsent($constraint-Target, $constraint-name-Target)
    - $constraint-Node[CurrentStatus] = VALIDATED
    - $constraint-name-Node[CurrentStatus] = ABSENT
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
    - joinTargetNode($constraint-name, $constraint-name-Target, $constraint-name-Node)
- name: Constraint should be hidden before name
  from: constraint-Node
  kind: Precedence
  to: constraint-name-Node
  query:
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.CheckConstraintUnvalidated', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraint', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - $constraint-name[Type] = '*scpb.ConstraintWithoutIndexName'
    - joinOnConstraintID($constraint, $constraint-name, $table-id, $constraint-id)
    - transient($constraint-Target, $constraint-name-Target)
    - $constraint-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $constraint-name-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
    - joinTargetNode($constraint-name, $constraint-name-Target, $constraint-name-Node)
- name: Constraint should be hidden before name
  from: constraint-Node
  kind: Precedence
  to: constraint-name-Node
  query:
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.CheckConstraintUnvalidated', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraint', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - $constraint-name[Type] = '*scpb.ConstraintWithoutIndexName'
    - joinOnConstraintID($constraint, $constraint-name, $table-id, $constraint-id)
    - $constraint-Target[TargetStatus] = TRANSIENT_ABSENT
    - $constraint-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $constraint-name-Target[TargetStatus] = ABSENT
    - $constraint-name-Node[CurrentStatus] = ABSENT
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
    - joinTargetNode($constraint-name, $constraint-name-Target, $constraint-name-Node)
- name: Constraint should be hidden before name
  from: constraint-Node
  kind: Precedence
  to: constraint-name-Node
  query:
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.CheckConstraintUnvalidated', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraint', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - $constraint-name[Type] = '*scpb.ConstraintWithoutIndexName'
    - joinOnConstraintID($constraint, $constraint-name, $table-id, $constraint-id)
    - $constraint-Target[TargetStatus] = ABSENT
    - $constraint-Node[CurrentStatus] = VALIDATED
    - $constraint-name-Target[TargetStatus] = TRANSIENT_ABSENT
    - $constraint-name-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
    - joinTargetNode($constraint-name, $constraint-name-Target, $constraint-name-Node)
- name: DEFAULT or ON UPDATE existence precedes writes to column
  from: expr-Node
  kind: Precedence
  to: column-Node
  query:
    - $expr[Type] IN ['*scpb.ColumnDefaultExpression', '*scpb.ColumnOnUpdateExpression']
    - $column[Type] = '*scpb.Column'
    - joinOnColumnID($expr, $column, $table-id, $col-id)
    - ToPublicOrTransient($expr-Target, $column-Target)
    - $expr-Node[CurrentStatus] = PUBLIC
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($expr, $expr-Target, $expr-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: 'ForeignKeyConstraint transitions to ABSENT uphold 2-version invariant: PUBLIC->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.ForeignKeyConstraint'
    - $next[Type] = '*scpb.ForeignKeyConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = PUBLIC
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'ForeignKeyConstraint transitions to ABSENT uphold 2-version invariant: VALIDATED->ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.ForeignKeyConstraint'
    - $next[Type] = '*scpb.ForeignKeyConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - nodeNotExistsWithStatusIn_WRITE_ONLY($prev-Target)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'ForeignKeyConstraint transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.ForeignKeyConstraint'
    - $next[Type] = '*scpb.ForeignKeyConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'ForeignKeyConstraint transitions to PUBLIC uphold 2-version invariant: ABSENT->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.ForeignKeyConstraint'
    - $next[Type] = '*scpb.ForeignKeyConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = ABSENT
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'ForeignKeyConstraint transitions to PUBLIC uphold 2-version invariant: VALIDATED->PUBLIC'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.ForeignKeyConstraint'
    - $next[Type] = '*scpb.ForeignKeyConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = PUBLIC
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'ForeignKeyConstraint transitions to PUBLIC uphold 2-version invariant: WRITE_ONLY->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.ForeignKeyConstraint'
    - $next[Type] = '*scpb.ForeignKeyConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: New primary index should go public only after columns being dropped move to WRITE_ONLY
  from: column-Node
  kind: Precedence
  to: new-primary-index-Node
  query:
    - $column[Type] = '*scpb.Column'
    - $new-primary-index[Type] = '*scpb.PrimaryIndex'
    - ColumnInSourcePrimaryIndex($index-column, $new-primary-index, $table-id, $column-id, $index-id)
    - joinOnColumnID($index-column, $column, $table-id, $column-id)
    - $column-Target[TargetStatus] = ABSENT
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - $new-primary-index-Target[TargetStatus] = PUBLIC
    - $new-primary-index-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($column, $column-Target, $column-Node)
    - joinTargetNode($new-primary-index, $new-primary-index-Target, $new-primary-index-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: BACKFILLED->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = BACKFILLED
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: BACKFILL_ONLY->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = BACKFILL_ONLY
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = DELETE_ONLY
    - $next-Node[CurrentStatus] = ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - nodeNotExistsWithStatusIn_TRANSIENT_DELETE_ONLY_BACKFILLED_TRANSIENT_BACKFILLED_BACKFILL_ONLY_TRANSIENT_BACKFILL_ONLY($prev-Target)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: MERGED->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = MERGED
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: MERGE_ONLY->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = MERGE_ONLY
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: PUBLIC->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = PUBLIC
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: TRANSIENT_ABSENT->ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $next-Node[CurrentStatus] = ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: TRANSIENT_BACKFILLED->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_BACKFILLED
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: TRANSIENT_BACKFILL_ONLY->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_BACKFILL_ONLY
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: TRANSIENT_DELETE_ONLY->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: TRANSIENT_MERGED->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_MERGED
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: TRANSIENT_MERGE_ONLY->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_MERGE_ONLY
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: TRANSIENT_VALIDATED->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: TRANSIENT_WRITE_ONLY->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: VALIDATED->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - nodeNotExistsWithStatusIn_TRANSIENT_VALIDATED($prev-Target)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - nodeNotExistsWithStatusIn_VALIDATED_TRANSIENT_WRITE_ONLY_MERGE_ONLY_TRANSIENT_MERGE_ONLY_MERGED_TRANSIENT_MERGED($prev-Target)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to PUBLIC uphold 2-version invariant: ABSENT->BACKFILL_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = ABSENT
    - $next-Node[CurrentStatus] = BACKFILL_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to PUBLIC uphold 2-version invariant: BACKFILLED->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = BACKFILLED
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to PUBLIC uphold 2-version invariant: BACKFILL_ONLY->BACKFILLED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = BACKFILL_ONLY
    - $next-Node[CurrentStatus] = BACKFILLED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to PUBLIC uphold 2-version invariant: DELETE_ONLY->MERGE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = DELETE_ONLY
    - $next-Node[CurrentStatus] = MERGE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to PUBLIC uphold 2-version invariant: MERGED->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = MERGED
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to PUBLIC uphold 2-version invariant: MERGE_ONLY->MERGED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = MERGE_ONLY
    - $next-Node[CurrentStatus] = MERGED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to PUBLIC uphold 2-version invariant: VALIDATED->PUBLIC'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = PUBLIC
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to PUBLIC uphold 2-version invariant: WRITE_ONLY->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: ABSENT->BACKFILL_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = ABSENT
    - $next-Node[CurrentStatus] = BACKFILL_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: BACKFILLED->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = BACKFILLED
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: BACKFILL_ONLY->BACKFILLED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = BACKFILL_ONLY
    - $next-Node[CurrentStatus] = BACKFILLED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: DELETE_ONLY->MERGE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = DELETE_ONLY
    - $next-Node[CurrentStatus] = MERGE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: MERGED->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = MERGED
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: MERGE_ONLY->MERGED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = MERGE_ONLY
    - $next-Node[CurrentStatus] = MERGED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: PUBLIC->TRANSIENT_VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = PUBLIC
    - $next-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_BACKFILLED->TRANSIENT_DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_BACKFILLED
    - $next-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_BACKFILL_ONLY->TRANSIENT_DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_BACKFILL_ONLY
    - $next-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_DELETE_ONLY->TRANSIENT_ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - $next-Node[CurrentStatus] = TRANSIENT_ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - nodeNotExistsWithStatusIn_TRANSIENT_BACKFILLED_TRANSIENT_BACKFILL_ONLY($prev-Target)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_MERGED->TRANSIENT_WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_MERGED
    - $next-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_MERGE_ONLY->TRANSIENT_WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_MERGE_ONLY
    - $next-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_VALIDATED->TRANSIENT_WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $next-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_WRITE_ONLY->TRANSIENT_DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - $next-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - nodeNotExistsWithStatusIn_TRANSIENT_VALIDATED_TRANSIENT_MERGE_ONLY_TRANSIENT_MERGED($prev-Target)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: VALIDATED->PUBLIC'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = PUBLIC
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'PrimaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: WRITE_ONLY->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.PrimaryIndex'
    - $next[Type] = '*scpb.PrimaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to ABSENT uphold 2-version invariant: BACKFILLED->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = BACKFILLED
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to ABSENT uphold 2-version invariant: BACKFILL_ONLY->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = BACKFILL_ONLY
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = DELETE_ONLY
    - $next-Node[CurrentStatus] = ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - nodeNotExistsWithStatusIn_BACKFILLED_BACKFILL_ONLY($prev-Target)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to ABSENT uphold 2-version invariant: MERGED->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = MERGED
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to ABSENT uphold 2-version invariant: MERGE_ONLY->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = MERGE_ONLY
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to ABSENT uphold 2-version invariant: PUBLIC->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = PUBLIC
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to ABSENT uphold 2-version invariant: VALIDATED->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - nodeNotExistsWithStatusIn_VALIDATED_MERGE_ONLY_MERGED($prev-Target)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to PUBLIC uphold 2-version invariant: ABSENT->BACKFILL_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = ABSENT
    - $next-Node[CurrentStatus] = BACKFILL_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to PUBLIC uphold 2-version invariant: BACKFILLED->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = BACKFILLED
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to PUBLIC uphold 2-version invariant: BACKFILL_ONLY->BACKFILLED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = BACKFILL_ONLY
    - $next-Node[CurrentStatus] = BACKFILLED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to PUBLIC uphold 2-version invariant: DELETE_ONLY->MERGE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = DELETE_ONLY
    - $next-Node[CurrentStatus] = MERGE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to PUBLIC uphold 2-version invariant: MERGED->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = MERGED
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to PUBLIC uphold 2-version invariant: MERGE_ONLY->MERGED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = MERGE_ONLY
    - $next-Node[CurrentStatus] = MERGED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to PUBLIC uphold 2-version invariant: VALIDATED->PUBLIC'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = PUBLIC
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'SecondaryIndex transitions to PUBLIC uphold 2-version invariant: WRITE_ONLY->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.SecondaryIndex'
    - $next[Type] = '*scpb.SecondaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'TemporaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.TemporaryIndex'
    - $next[Type] = '*scpb.TemporaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = DELETE_ONLY
    - $next-Node[CurrentStatus] = ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - nodeNotExistsWithStatusIn_TRANSIENT_DELETE_ONLY($prev-Target)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'TemporaryIndex transitions to ABSENT uphold 2-version invariant: TRANSIENT_ABSENT->ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.TemporaryIndex'
    - $next[Type] = '*scpb.TemporaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $next-Node[CurrentStatus] = ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'TemporaryIndex transitions to ABSENT uphold 2-version invariant: TRANSIENT_DELETE_ONLY->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.TemporaryIndex'
    - $next[Type] = '*scpb.TemporaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'TemporaryIndex transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.TemporaryIndex'
    - $next[Type] = '*scpb.TemporaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: ABSENT->DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.TemporaryIndex'
    - $next[Type] = '*scpb.TemporaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = ABSENT
    - $next-Node[CurrentStatus] = DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: DELETE_ONLY->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.TemporaryIndex'
    - $next[Type] = '*scpb.TemporaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = DELETE_ONLY
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_DELETE_ONLY->TRANSIENT_ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.TemporaryIndex'
    - $next[Type] = '*scpb.TemporaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - $next-Node[CurrentStatus] = TRANSIENT_ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: WRITE_ONLY->TRANSIENT_DELETE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.TemporaryIndex'
    - $next[Type] = '*scpb.TemporaryIndex'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = TRANSIENT_ABSENT
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'UniqueWithoutIndexConstraint transitions to ABSENT uphold 2-version invariant: PUBLIC->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.UniqueWithoutIndexConstraint'
    - $next[Type] = '*scpb.UniqueWithoutIndexConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = PUBLIC
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'UniqueWithoutIndexConstraint transitions to ABSENT uphold 2-version invariant: VALIDATED->ABSENT'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.UniqueWithoutIndexConstraint'
    - $next[Type] = '*scpb.UniqueWithoutIndexConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = ABSENT
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - nodeNotExistsWithStatusIn_WRITE_ONLY($prev-Target)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'UniqueWithoutIndexConstraint transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.UniqueWithoutIndexConstraint'
    - $next[Type] = '*scpb.UniqueWithoutIndexConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = ABSENT
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'UniqueWithoutIndexConstraint transitions to PUBLIC uphold 2-version invariant: ABSENT->WRITE_ONLY'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.UniqueWithoutIndexConstraint'
    - $next[Type] = '*scpb.UniqueWithoutIndexConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = ABSENT
    - $next-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'UniqueWithoutIndexConstraint transitions to PUBLIC uphold 2-version invariant: VALIDATED->PUBLIC'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.UniqueWithoutIndexConstraint'
    - $next[Type] = '*scpb.UniqueWithoutIndexConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = VALIDATED
    - $next-Node[CurrentStatus] = PUBLIC
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: 'UniqueWithoutIndexConstraint transitions to PUBLIC uphold 2-version invariant: WRITE_ONLY->VALIDATED'
  from: prev-Node
  kind: PreviousTransactionPrecedence
  to: next-Node
  query:
    - $prev[Type] = '*scpb.UniqueWithoutIndexConstraint'
    - $next[Type] = '*scpb.UniqueWithoutIndexConstraint'
    - $prev[DescID] = $descID
    - $prev[Self] = $next
    - $prev-Target[Self] = $next-Target
    - $prev-Target[TargetStatus] = PUBLIC
    - $prev-Node[CurrentStatus] = WRITE_ONLY
    - $next-Node[CurrentStatus] = VALIDATED
    - descriptorIsNotBeingDropped-24.3($prev)
    - $descriptor-data[Type] = '*scpb.TableData'
    - joinTargetNode($descriptor-data, $descriptor-data-Target, $descriptor-data-Node)
    - $descriptor-data-Node[CurrentStatus] = PUBLIC
    - $descriptor-data[DescID] = $descID
    - descriptorIsDataNotBeingAdded-24.3($descID)
    - joinTargetNode($prev, $prev-Target, $prev-Node)
    - joinTargetNode($next, $next-Target, $next-Node)
- name: all adding indexes reached BACKFILL_ONLY before any of their columns disappear
  from: index-Node
  kind: Precedence
  to: column-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex']
    - $column[Type] = '*scpb.Column'
    - ColumnInIndex($index-column, $index, $table-id, $column-id, $index-id)
    - joinOnColumnID($index-column, $column, $table-id, $column-id)
    - $index-Target[TargetStatus] IN [PUBLIC, TRANSIENT_ABSENT]
    - $index-Node[CurrentStatus] = BACKFILL_ONLY
    - $column-Target[TargetStatus] = ABSENT
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: back-reference in parent descriptor is removed before parent descriptor is dropped
  from: back-reference-in-parent-descriptor-Node
  kind: Precedence
  to: parent-descriptor-Node
  query:
    - $back-reference-in-parent-descriptor[Type] IN ['*scpb.SchemaChild', '*scpb.SchemaParent']
    - $parent-descriptor[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.Database', '*scpb.EnumType', '*scpb.Function', '*scpb.Schema', '*scpb.Sequence', '*scpb.Table', '*scpb.View']
    - joinReferencedDescID($back-reference-in-parent-descriptor, $parent-descriptor, $desc-id)
    - toAbsent($back-reference-in-parent-descriptor-Target, $parent-descriptor-Target)
    - $back-reference-in-parent-descriptor-Node[CurrentStatus] = ABSENT
    - $parent-descriptor-Node[CurrentStatus] = DROPPED
    - joinTargetNode($back-reference-in-parent-descriptor, $back-reference-in-parent-descriptor-Target, $back-reference-in-parent-descriptor-Node)
    - joinTargetNode($parent-descriptor, $parent-descriptor-Target, $parent-descriptor-Node)
- name: column constraint removed right before column reaches write only
  from: column-constraint-Node
  kind: Precedence
  to: column-Node
  query:
    - $column-constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - $column[Type] = '*scpb.Column'
    - joinOnColumnID($column-constraint, $column, $table-id, $col-id)
    - toAbsent($column-constraint-Target, $column-Target)
    - $column-constraint-Node[CurrentStatus] = ABSENT
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($column-constraint, $column-constraint-Target, $column-constraint-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: column constraint removed right before column reaches write only
  from: column-constraint-Node
  kind: Precedence
  to: column-Node
  query:
    - $column-constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - $column[Type] = '*scpb.Column'
    - joinOnColumnID($column-constraint, $column, $table-id, $col-id)
    - transient($column-constraint-Target, $column-Target)
    - $column-constraint-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $column-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - joinTargetNode($column-constraint, $column-constraint-Target, $column-constraint-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: column constraint removed right before column reaches write only
  from: column-constraint-Node
  kind: Precedence
  to: column-Node
  query:
    - $column-constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - $column[Type] = '*scpb.Column'
    - joinOnColumnID($column-constraint, $column, $table-id, $col-id)
    - $column-constraint-Target[TargetStatus] = TRANSIENT_ABSENT
    - $column-constraint-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $column-Target[TargetStatus] = ABSENT
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($column-constraint, $column-constraint-Target, $column-constraint-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: column constraint removed right before column reaches write only
  from: column-constraint-Node
  kind: Precedence
  to: column-Node
  query:
    - $column-constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - $column[Type] = '*scpb.Column'
    - joinOnColumnID($column-constraint, $column, $table-id, $col-id)
    - $column-constraint-Target[TargetStatus] = ABSENT
    - $column-constraint-Node[CurrentStatus] = ABSENT
    - $column-Target[TargetStatus] = TRANSIENT_ABSENT
    - $column-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - joinTargetNode($column-constraint, $column-constraint-Target, $column-constraint-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: column dependents exist before column becomes public
  from: dependent-Node
  kind: Precedence
  to: column-Node
  query:
    - $dependent[Type] IN ['*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnName', '*scpb.ColumnNotNull', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.IndexColumn', '*scpb.SequenceOwner']
    - $column[Type] = '*scpb.Column'
    - joinOnColumnID($dependent, $column, $table-id, $col-id)
    - ToPublicOrTransient($dependent-Target, $column-Target)
    - $dependent-Node[CurrentStatus] = PUBLIC
    - $column-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: column existence precedes column dependents
  from: column-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $column[Type] = '*scpb.Column'
    - $dependent[Type] IN ['*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnName', '*scpb.ColumnNotNull', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.IndexColumn', '*scpb.SequenceOwner']
    - joinOnColumnID($column, $dependent, $table-id, $col-id)
    - ToPublicOrTransient($column-Target, $dependent-Target)
    - $column-Node[CurrentStatus] = DELETE_ONLY
    - $dependent-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($column, $column-Target, $column-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: column existence precedes index existence
  from: column-Node
  kind: Precedence
  to: index-Node
  query:
    - $column[Type] = '*scpb.Column'
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex']
    - joinOnColumnID($column, $index-column, $table-id, $column-id)
    - ColumnInIndex($index-column, $index, $table-id, $column-id, $index-id)
    - ToPublicOrTransient($column-Target, $index-Target)
    - $column-Node[CurrentStatus] = DELETE_ONLY
    - $index-Node[CurrentStatus] = BACKFILL_ONLY
    - joinTargetNode($column, $column-Target, $column-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: column existence precedes temp index existence
  from: column-Node
  kind: Precedence
  to: index-Node
  query:
    - $column[Type] = '*scpb.Column'
    - $index[Type] = '*scpb.TemporaryIndex'
    - joinOnColumnID($index-column, $column, $table-id, $column-id)
    - ColumnInIndex($index-column, $index, $table-id, $column-id, $index-id)
    - ToPublicOrTransient($column-Target, $index-Target)
    - $column-Node[CurrentStatus] = DELETE_ONLY
    - $index-Node[CurrentStatus] = DELETE_ONLY
    - joinTargetNode($column, $column-Target, $column-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: column is WRITE_ONLY before temporary index is WRITE_ONLY
  from: column-Node
  kind: Precedence
  to: index-Node
  query:
    - $column[Type] = '*scpb.Column'
    - $index[Type] = '*scpb.TemporaryIndex'
    - joinOnColumnID($index-column, $column, $table-id, $column-id)
    - ColumnInIndex($index-column, $index, $table-id, $column-id, $index-id)
    - ToPublicOrTransient($column-Target, $index-Target)
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - $index-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($column, $column-Target, $column-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: column name and type set right after column existence
  from: column-Node
  kind: SameStagePrecedence
  to: column-name-or-type-Node
  query:
    - $column[Type] = '*scpb.Column'
    - $column-name-or-type[Type] IN ['*scpb.ColumnName', '*scpb.ColumnType']
    - ToPublicOrTransient($column-Target, $column-name-or-type-Target)
    - $column-Node[CurrentStatus] = DELETE_ONLY
    - $column-name-or-type-Node[CurrentStatus] = PUBLIC
    - joinOnColumnID($column, $column-name-or-type, $table-id, $col-id)
    - joinTargetNode($column, $column-Target, $column-Node)
    - joinTargetNode($column-name-or-type, $column-name-or-type-Target, $column-name-or-type-Node)
- name: column no longer public before dependents
  from: column-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $column[Type] = '*scpb.Column'
    - $dependent[Type] IN ['*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnName', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.IndexColumn', '*scpb.SequenceOwner']
    - joinOnColumnID($column, $dependent, $table-id, $col-id)
    - toAbsent($column-Target, $dependent-Target)
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - $dependent-Node[CurrentStatus] = ABSENT
    - joinTargetNode($column, $column-Target, $column-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: column no longer public before dependents
  from: column-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $column[Type] = '*scpb.Column'
    - $dependent[Type] IN ['*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnName', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.IndexColumn', '*scpb.SequenceOwner']
    - joinOnColumnID($column, $dependent, $table-id, $col-id)
    - transient($column-Target, $dependent-Target)
    - $column-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - $dependent-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($column, $column-Target, $column-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: column no longer public before dependents
  from: column-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $column[Type] = '*scpb.Column'
    - $dependent[Type] IN ['*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnName', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.IndexColumn', '*scpb.SequenceOwner']
    - joinOnColumnID($column, $dependent, $table-id, $col-id)
    - $column-Target[TargetStatus] = TRANSIENT_ABSENT
    - $column-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - $dependent-Target[TargetStatus] = ABSENT
    - $dependent-Node[CurrentStatus] = ABSENT
    - joinTargetNode($column, $column-Target, $column-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: column no longer public before dependents
  from: column-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $column[Type] = '*scpb.Column'
    - $dependent[Type] IN ['*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnName', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.IndexColumn', '*scpb.SequenceOwner']
    - joinOnColumnID($column, $dependent, $table-id, $col-id)
    - $column-Target[TargetStatus] = ABSENT
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - $dependent-Target[TargetStatus] = TRANSIENT_ABSENT
    - $dependent-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($column, $column-Target, $column-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: column public before non-index-backed constraint (including hash-sharded) is created
  from: column-Node
  kind: Precedence
  to: constraint-Node
  query:
    - $column[Type] = '*scpb.Column'
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.CheckConstraintUnvalidated', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraint', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - $column[ColumnID] = $columnID
    - $constraint[ReferencedColumnIDs] CONTAINS $columnID
    - joinOnDescID($column, $constraint, $table-id)
    - ToPublicOrTransient($column-Target, $constraint-Target)
    - $column-Node[CurrentStatus] = PUBLIC
    - $constraint-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($column, $column-Target, $column-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: column type dependents removed right before column type
  from: dependent-Node
  kind: SameStagePrecedence
  to: column-type-Node
  query:
    - $dependent[Type] IN ['*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnOnUpdateExpression', '*scpb.SequenceOwner']
    - $column-type[Type] = '*scpb.ColumnType'
    - joinOnColumnID($dependent, $column-type, $table-id, $col-id)
    - toAbsent($dependent-Target, $column-type-Target)
    - $dependent-Node[CurrentStatus] = ABSENT
    - $column-type-Node[CurrentStatus] = ABSENT
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($column-type, $column-type-Target, $column-type-Node)
- name: column type is changed to public after doing validation of a transient check constraint
  from: transient-check-constraint-Node
  kind: SameStagePrecedence
  to: column-type-Node
  query:
    - $transient-check-constraint[Type] = '*scpb.CheckConstraint'
    - $column-type[Type] = '*scpb.ColumnType'
    - joinOnDescID($transient-check-constraint, $column-type, $table-id)
    - $column-type[ColumnID] = $columnID
    - $transient-check-constraint[ReferencedColumnIDs] CONTAINS $columnID
    - $transient-check-constraint-Target[TargetStatus] = TRANSIENT_ABSENT
    - $column-type-Target[TargetStatus] = PUBLIC
    - $transient-check-constraint-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $column-type-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($transient-check-constraint, $transient-check-constraint-Target, $transient-check-constraint-Node)
    - joinTargetNode($column-type, $column-type-Target, $column-type-Node)
- name: column type removed before column family
  from: column-type-Node
  kind: Precedence
  to: column-family-Node
  query:
    - $column-type[Type] = '*scpb.ColumnType'
    - $column-family[Type] = '*scpb.ColumnFamily'
    - joinOnColumnFamilyID($column-type, $column-family, $table-id, $family-id)
    - toAbsent($column-type-Target, $column-family-Target)
    - $column-type-Node[CurrentStatus] = ABSENT
    - $column-family-Node[CurrentStatus] = ABSENT
    - joinTargetNode($column-type, $column-type-Target, $column-type-Node)
    - joinTargetNode($column-family, $column-family-Target, $column-family-Node)
- name: column type removed right before column when not dropping relation
  from: column-type-Node
  kind: SameStagePrecedence
  to: column-Node
  query:
    - $column-type[Type] = '*scpb.ColumnType'
    - descriptorIsNotBeingDropped-24.3($column-type)
    - $column[Type] = '*scpb.Column'
    - joinOnColumnID($column-type, $column, $table-id, $col-id)
    - toAbsent($column-type-Target, $column-Target)
    - $column-type-Node[CurrentStatus] = ABSENT
    - $column-Node[CurrentStatus] = ABSENT
    - joinTargetNode($column-type, $column-type-Target, $column-type-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: column type update is decomposed as a drop then add
  from: old-column-type-Node
  kind: Precedence
  to: new-column-type-Node
  query:
    - $old-column-type[Type] = '*scpb.ColumnType'
    - $new-column-type[Type] = '*scpb.ColumnType'
    - joinOnColumnID($old-column-type, $new-column-type, $table-id, $col-id)
    - $old-column-type-Target[TargetStatus] = ABSENT
    - $old-column-type-Node[CurrentStatus] = PUBLIC
    - $new-column-type-Target[TargetStatus] = PUBLIC
    - $new-column-type-Node[CurrentStatus] = ABSENT
    - joinTargetNode($old-column-type, $old-column-type-Target, $old-column-type-Node)
    - joinTargetNode($new-column-type, $new-column-type-Target, $new-column-type-Node)
- name: column writable right before column constraint is enforced.
  from: column-Node
  kind: SameStagePrecedence
  to: column-constraint-Node
  query:
    - $column[Type] = '*scpb.Column'
    - $column-constraint[Type] = '*scpb.ColumnNotNull'
    - joinOnColumnID($column, $column-constraint, $table-id, $col-id)
    - ToPublicOrTransient($column-Target, $column-constraint-Target)
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - $column-constraint-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($column, $column-Target, $column-Node)
    - joinTargetNode($column-constraint, $column-constraint-Target, $column-constraint-Node)
- name: constraint dependent public right before complex constraint
  from: dependent-Node
  kind: SameStagePrecedence
  to: complex-constraint-Node
  query:
    - $dependent[Type] = '*scpb.ConstraintComment'
    - $complex-constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - joinOnConstraintID($dependent, $complex-constraint, $table-id, $constraint-id)
    - ToPublicOrTransient($dependent-Target, $complex-constraint-Target)
    - $dependent-Node[CurrentStatus] = PUBLIC
    - $complex-constraint-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($complex-constraint, $complex-constraint-Target, $complex-constraint-Node)
- name: constraint no longer public before dependents
  from: constraint-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - $dependent[Type] = '*scpb.ConstraintComment'
    - joinOnConstraintID($constraint, $dependent, $table-id, $constraint-id)
    - toAbsent($constraint-Target, $dependent-Target)
    - $constraint-Node[CurrentStatus] = VALIDATED
    - $dependent-Node[CurrentStatus] = ABSENT
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: constraint no longer public before dependents
  from: constraint-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - $dependent[Type] = '*scpb.ConstraintComment'
    - joinOnConstraintID($constraint, $dependent, $table-id, $constraint-id)
    - transient($constraint-Target, $dependent-Target)
    - $constraint-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $dependent-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: constraint no longer public before dependents
  from: constraint-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - $dependent[Type] = '*scpb.ConstraintComment'
    - joinOnConstraintID($constraint, $dependent, $table-id, $constraint-id)
    - $constraint-Target[TargetStatus] = TRANSIENT_ABSENT
    - $constraint-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $dependent-Target[TargetStatus] = ABSENT
    - $dependent-Node[CurrentStatus] = ABSENT
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: constraint no longer public before dependents
  from: constraint-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - $dependent[Type] = '*scpb.ConstraintComment'
    - joinOnConstraintID($constraint, $dependent, $table-id, $constraint-id)
    - $constraint-Target[TargetStatus] = ABSENT
    - $constraint-Node[CurrentStatus] = VALIDATED
    - $dependent-Target[TargetStatus] = TRANSIENT_ABSENT
    - $dependent-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: cross-descriptor constraint is absent before referenced descriptor is dropped
  from: cross-desc-constraint-Node
  kind: Precedence
  to: referenced-descriptor-Node
  query:
    - $cross-desc-constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - $referenced-descriptor[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.Database', '*scpb.EnumType', '*scpb.Function', '*scpb.Schema', '*scpb.Sequence', '*scpb.Table', '*scpb.View']
    - joinReferencedDescID($cross-desc-constraint, $referenced-descriptor, $desc-id)
    - toAbsent($cross-desc-constraint-Target, $referenced-descriptor-Target)
    - $cross-desc-constraint-Node[CurrentStatus] = ABSENT
    - $referenced-descriptor-Node[CurrentStatus] = DROPPED
    - joinTargetNode($cross-desc-constraint, $cross-desc-constraint-Target, $cross-desc-constraint-Node)
    - joinTargetNode($referenced-descriptor, $referenced-descriptor-Target, $referenced-descriptor-Node)
- name: cross-descriptor constraint is absent before referencing descriptor is dropped
  from: cross-desc-constraint-Node
  kind: Precedence
  to: referencing-descriptor-Node
  query:
    - $cross-desc-constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - $referencing-descriptor[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.Database', '*scpb.EnumType', '*scpb.Function', '*scpb.Schema', '*scpb.Sequence', '*scpb.Table', '*scpb.View']
    - joinOnDescID($cross-desc-constraint, $referencing-descriptor, $desc-id)
    - toAbsent($cross-desc-constraint-Target, $referencing-descriptor-Target)
    - $cross-desc-constraint-Node[CurrentStatus] = ABSENT
    - $referencing-descriptor-Node[CurrentStatus] = DROPPED
    - joinTargetNode($cross-desc-constraint, $cross-desc-constraint-Target, $cross-desc-constraint-Node)
    - joinTargetNode($referencing-descriptor, $referencing-descriptor-Target, $referencing-descriptor-Node)
- name: dependent view absent before secondary index
  from: view-Node
  kind: Precedence
  to: index-Node
  query:
    - $view[Type] = '*scpb.View'
    - $index[Type] = '*scpb.SecondaryIndex'
    - viewReferencesIndex(*scpb.View, *scpb.SecondaryIndex)($view, $index)
    - toAbsent($view-Target, $index-Target)
    - $view-Node[CurrentStatus] = ABSENT
    - $index-Node[CurrentStatus] = ABSENT
    - joinTargetNode($view, $view-Target, $view-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: dependent view absent before secondary index
  from: view-Node
  kind: Precedence
  to: index-Node
  query:
    - $view[Type] = '*scpb.View'
    - $index[Type] = '*scpb.SecondaryIndex'
    - viewReferencesIndex(*scpb.View, *scpb.SecondaryIndex)($view, $index)
    - transient($view-Target, $index-Target)
    - $view-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($view, $view-Target, $view-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: dependent view absent before secondary index
  from: view-Node
  kind: Precedence
  to: index-Node
  query:
    - $view[Type] = '*scpb.View'
    - $index[Type] = '*scpb.SecondaryIndex'
    - viewReferencesIndex(*scpb.View, *scpb.SecondaryIndex)($view, $index)
    - $view-Target[TargetStatus] = TRANSIENT_ABSENT
    - $view-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $index-Target[TargetStatus] = ABSENT
    - $index-Node[CurrentStatus] = ABSENT
    - joinTargetNode($view, $view-Target, $view-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: dependent view absent before secondary index
  from: view-Node
  kind: Precedence
  to: index-Node
  query:
    - $view[Type] = '*scpb.View'
    - $index[Type] = '*scpb.SecondaryIndex'
    - viewReferencesIndex(*scpb.View, *scpb.SecondaryIndex)($view, $index)
    - $view-Target[TargetStatus] = ABSENT
    - $view-Node[CurrentStatus] = ABSENT
    - $index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($view, $view-Target, $view-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: dependent view no longer public before secondary index
  from: view-Node
  kind: Precedence
  to: index-Node
  query:
    - $view[Type] = '*scpb.View'
    - $index[Type] = '*scpb.SecondaryIndex'
    - viewReferencesIndex(*scpb.View, *scpb.SecondaryIndex)($view, $index)
    - toAbsent($view-Target, $index-Target)
    - $view-Node[CurrentStatus] = DROPPED
    - $index-Node[CurrentStatus] = VALIDATED
    - joinTargetNode($view, $view-Target, $view-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: dependent view no longer public before secondary index
  from: view-Node
  kind: Precedence
  to: index-Node
  query:
    - $view[Type] = '*scpb.View'
    - $index[Type] = '*scpb.SecondaryIndex'
    - viewReferencesIndex(*scpb.View, *scpb.SecondaryIndex)($view, $index)
    - transient($view-Target, $index-Target)
    - $view-Node[CurrentStatus] = TRANSIENT_DROPPED
    - $index-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - joinTargetNode($view, $view-Target, $view-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: dependent view no longer public before secondary index
  from: view-Node
  kind: Precedence
  to: index-Node
  query:
    - $view[Type] = '*scpb.View'
    - $index[Type] = '*scpb.SecondaryIndex'
    - viewReferencesIndex(*scpb.View, *scpb.SecondaryIndex)($view, $index)
    - $view-Target[TargetStatus] = TRANSIENT_ABSENT
    - $view-Node[CurrentStatus] = TRANSIENT_DROPPED
    - $index-Target[TargetStatus] = ABSENT
    - $index-Node[CurrentStatus] = VALIDATED
    - joinTargetNode($view, $view-Target, $view-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: dependent view no longer public before secondary index
  from: view-Node
  kind: Precedence
  to: index-Node
  query:
    - $view[Type] = '*scpb.View'
    - $index[Type] = '*scpb.SecondaryIndex'
    - viewReferencesIndex(*scpb.View, *scpb.SecondaryIndex)($view, $index)
    - $view-Target[TargetStatus] = ABSENT
    - $view-Node[CurrentStatus] = DROPPED
    - $index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - joinTargetNode($view, $view-Target, $view-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: dependents exist before descriptor becomes public
  from: dependent-Node
  kind: Precedence
  to: relation-Node
  query:
    - $dependent[Type] IN ['*scpb.CheckConstraint', '*scpb.CheckConstraintUnvalidated', '*scpb.Column', '*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnFamily', '*scpb.ColumnName', '*scpb.ColumnNotNull', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.CompositeTypeAttrName', '*scpb.CompositeTypeAttrType', '*scpb.ConstraintComment', '*scpb.ConstraintWithoutIndexName', '*scpb.DatabaseComment', '*scpb.DatabaseRegionConfig', '*scpb.DatabaseRoleSetting', '*scpb.DatabaseZoneConfig', '*scpb.EnumTypeValue', '*scpb.ForeignKeyConstraint', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.FunctionBody', '*scpb.FunctionLeakProof', '*scpb.FunctionName', '*scpb.FunctionNullInputBehavior', '*scpb.FunctionSecurity', '*scpb.FunctionVolatility', '*scpb.IndexColumn', '*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.LDRJobIDs', '*scpb.Namespace', '*scpb.Owner', '*scpb.PartitionZoneConfig', '*scpb.PrimaryIndex', '*scpb.RowLevelTTL', '*scpb.SchemaChild', '*scpb.SchemaComment', '*scpb.SchemaParent', '*scpb.SecondaryIndex', '*scpb.SecondaryIndexPartial', '*scpb.SequenceOption', '*scpb.SequenceOwner', '*scpb.TableComment', '*scpb.TableLocalityGlobal', '*scpb.TableLocalityPrimaryRegion', '*scpb.TableLocalityRegionalByRow', '*scpb.TableLocalitySecondaryRegion', '*scpb.TablePartitioning', '*scpb.TableSchemaLocked', '*scpb.TableZoneConfig', '*scpb.TemporaryIndex', '*scpb.Trigger', '*scpb.TriggerDeps', '*scpb.TriggerEnabled', '*scpb.TriggerEvents', '*scpb.TriggerFunctionCall', '*scpb.TriggerName', '*scpb.TriggerTiming', '*scpb.TriggerTransition', '*scpb.TriggerWhen', '*scpb.TypeComment', '*scpb.UniqueWithoutIndexConstraint', '*scpb.UniqueWithoutIndexConstraintUnvalidated', '*scpb.UserPrivileges']
    - $relation[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.Database', '*scpb.EnumType', '*scpb.Function', '*scpb.Schema', '*scpb.Sequence', '*scpb.Table', '*scpb.View']
    - joinOnDescID($dependent, $relation, $relation-id)
    - ToPublicOrTransient($dependent-Target, $relation-Target)
    - $dependent-Node[CurrentStatus] = PUBLIC
    - $relation-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($relation, $relation-Target, $relation-Node)
- name: dependents removed before column
  from: dependent-Node
  kind: Precedence
  to: column-Node
  query:
    - $dependent[Type] IN ['*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnName', '*scpb.ColumnNotNull', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.IndexColumn', '*scpb.SequenceOwner']
    - $column[Type] = '*scpb.Column'
    - joinOnColumnID($dependent, $column, $table-id, $col-id)
    - toAbsent($dependent-Target, $column-Target)
    - $dependent-Node[CurrentStatus] = ABSENT
    - $column-Node[CurrentStatus] = ABSENT
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: dependents removed before column
  from: dependent-Node
  kind: Precedence
  to: column-Node
  query:
    - $dependent[Type] IN ['*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnName', '*scpb.ColumnNotNull', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.IndexColumn', '*scpb.SequenceOwner']
    - $column[Type] = '*scpb.Column'
    - joinOnColumnID($dependent, $column, $table-id, $col-id)
    - transient($dependent-Target, $column-Target)
    - $dependent-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $column-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: dependents removed before column
  from: dependent-Node
  kind: Precedence
  to: column-Node
  query:
    - $dependent[Type] IN ['*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnName', '*scpb.ColumnNotNull', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.IndexColumn', '*scpb.SequenceOwner']
    - $column[Type] = '*scpb.Column'
    - joinOnColumnID($dependent, $column, $table-id, $col-id)
    - $dependent-Target[TargetStatus] = TRANSIENT_ABSENT
    - $dependent-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $column-Target[TargetStatus] = ABSENT
    - $column-Node[CurrentStatus] = ABSENT
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: dependents removed before column
  from: dependent-Node
  kind: Precedence
  to: column-Node
  query:
    - $dependent[Type] IN ['*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnName', '*scpb.ColumnNotNull', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.IndexColumn', '*scpb.SequenceOwner']
    - $column[Type] = '*scpb.Column'
    - joinOnColumnID($dependent, $column, $table-id, $col-id)
    - $dependent-Target[TargetStatus] = ABSENT
    - $dependent-Node[CurrentStatus] = ABSENT
    - $column-Target[TargetStatus] = TRANSIENT_ABSENT
    - $column-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: dependents removed before constraint
  from: dependents-Node
  kind: Precedence
  to: constraint-Node
  query:
    - $dependents[Type] = '*scpb.ConstraintComment'
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - joinOnConstraintID($dependents, $constraint, $table-id, $constraint-id)
    - toAbsent($dependents-Target, $constraint-Target)
    - $dependents-Node[CurrentStatus] = ABSENT
    - $constraint-Node[CurrentStatus] = ABSENT
    - joinTargetNode($dependents, $dependents-Target, $dependents-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: dependents removed before constraint
  from: dependents-Node
  kind: Precedence
  to: constraint-Node
  query:
    - $dependents[Type] = '*scpb.ConstraintComment'
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - joinOnConstraintID($dependents, $constraint, $table-id, $constraint-id)
    - transient($dependents-Target, $constraint-Target)
    - $dependents-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $constraint-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($dependents, $dependents-Target, $dependents-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: dependents removed before constraint
  from: dependents-Node
  kind: Precedence
  to: constraint-Node
  query:
    - $dependents[Type] = '*scpb.ConstraintComment'
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - joinOnConstraintID($dependents, $constraint, $table-id, $constraint-id)
    - $dependents-Target[TargetStatus] = TRANSIENT_ABSENT
    - $dependents-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $constraint-Target[TargetStatus] = ABSENT
    - $constraint-Node[CurrentStatus] = ABSENT
    - joinTargetNode($dependents, $dependents-Target, $dependents-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: dependents removed before constraint
  from: dependents-Node
  kind: Precedence
  to: constraint-Node
  query:
    - $dependents[Type] = '*scpb.ConstraintComment'
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - joinOnConstraintID($dependents, $constraint, $table-id, $constraint-id)
    - $dependents-Target[TargetStatus] = ABSENT
    - $dependents-Node[CurrentStatus] = ABSENT
    - $constraint-Target[TargetStatus] = TRANSIENT_ABSENT
    - $constraint-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($dependents, $dependents-Target, $dependents-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: dependents removed before index
  from: dependent-Node
  kind: Precedence
  to: index-Node
  query:
    - $dependent[Type] IN ['*scpb.IndexColumn', '*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.PartitionZoneConfig', '*scpb.SecondaryIndexPartial']
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - joinOnIndexID($dependent, $index, $table-id, $index-id)
    - toAbsent($dependent-Target, $index-Target)
    - $dependent-Node[CurrentStatus] = ABSENT
    - $index-Node[CurrentStatus] = ABSENT
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: dependents removed before index
  from: dependent-Node
  kind: Precedence
  to: index-Node
  query:
    - $dependent[Type] IN ['*scpb.IndexColumn', '*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.PartitionZoneConfig', '*scpb.SecondaryIndexPartial']
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - joinOnIndexID($dependent, $index, $table-id, $index-id)
    - transient($dependent-Target, $index-Target)
    - $dependent-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: dependents removed before index
  from: dependent-Node
  kind: Precedence
  to: index-Node
  query:
    - $dependent[Type] IN ['*scpb.IndexColumn', '*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.PartitionZoneConfig', '*scpb.SecondaryIndexPartial']
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - joinOnIndexID($dependent, $index, $table-id, $index-id)
    - $dependent-Target[TargetStatus] = TRANSIENT_ABSENT
    - $dependent-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $index-Target[TargetStatus] = ABSENT
    - $index-Node[CurrentStatus] = ABSENT
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: dependents removed before index
  from: dependent-Node
  kind: Precedence
  to: index-Node
  query:
    - $dependent[Type] IN ['*scpb.IndexColumn', '*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.PartitionZoneConfig', '*scpb.SecondaryIndexPartial']
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - joinOnIndexID($dependent, $index, $table-id, $index-id)
    - $dependent-Target[TargetStatus] = ABSENT
    - $dependent-Node[CurrentStatus] = ABSENT
    - $index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: dependents removed right before simple constraint
  from: dependents-Node
  kind: SameStagePrecedence
  to: constraint-Node
  query:
    - $dependents[Type] = '*scpb.ConstraintComment'
    - $constraint[Type] IN ['*scpb.CheckConstraintUnvalidated', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - joinOnConstraintID($dependents, $constraint, $table-id, $constraint-id)
    - toAbsent($dependents-Target, $constraint-Target)
    - $dependents-Node[CurrentStatus] = ABSENT
    - $constraint-Node[CurrentStatus] = ABSENT
    - joinTargetNode($dependents, $dependents-Target, $dependents-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: dependents removed right before simple constraint
  from: dependents-Node
  kind: SameStagePrecedence
  to: constraint-Node
  query:
    - $dependents[Type] = '*scpb.ConstraintComment'
    - $constraint[Type] IN ['*scpb.CheckConstraintUnvalidated', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - joinOnConstraintID($dependents, $constraint, $table-id, $constraint-id)
    - transient($dependents-Target, $constraint-Target)
    - $dependents-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $constraint-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($dependents, $dependents-Target, $dependents-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: dependents removed right before simple constraint
  from: dependents-Node
  kind: SameStagePrecedence
  to: constraint-Node
  query:
    - $dependents[Type] = '*scpb.ConstraintComment'
    - $constraint[Type] IN ['*scpb.CheckConstraintUnvalidated', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - joinOnConstraintID($dependents, $constraint, $table-id, $constraint-id)
    - $dependents-Target[TargetStatus] = TRANSIENT_ABSENT
    - $dependents-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $constraint-Target[TargetStatus] = ABSENT
    - $constraint-Node[CurrentStatus] = ABSENT
    - joinTargetNode($dependents, $dependents-Target, $dependents-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: dependents removed right before simple constraint
  from: dependents-Node
  kind: SameStagePrecedence
  to: constraint-Node
  query:
    - $dependents[Type] = '*scpb.ConstraintComment'
    - $constraint[Type] IN ['*scpb.CheckConstraintUnvalidated', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - joinOnConstraintID($dependents, $constraint, $table-id, $constraint-id)
    - $dependents-Target[TargetStatus] = ABSENT
    - $dependents-Node[CurrentStatus] = ABSENT
    - $constraint-Target[TargetStatus] = TRANSIENT_ABSENT
    - $constraint-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($dependents, $dependents-Target, $dependents-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: descriptor drop right before removing dependent between types
  from: referenced-descriptor-Node
  kind: SameStagePrecedence
  to: referencing-via-type-Node
  query:
    - $referenced-descriptor[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.EnumType']
    - $referenced-descriptor[DescID] = $fromDescID
    - $referencing-via-type[ReferencedTypeIDs] CONTAINS $fromDescID
    - $referencing-via-type[Type] = '*scpb.ColumnType'
    - toAbsent($referenced-descriptor-Target, $referencing-via-type-Target)
    - $referenced-descriptor-Node[CurrentStatus] = DROPPED
    - $referencing-via-type-Node[CurrentStatus] = ABSENT
    - joinTargetNode($referenced-descriptor, $referenced-descriptor-Target, $referenced-descriptor-Node)
    - joinTargetNode($referencing-via-type, $referencing-via-type-Target, $referencing-via-type-Node)
- name: descriptor drop right before removing dependent with attr ref
  from: referenced-descriptor-Node
  kind: SameStagePrecedence
  to: referencing-via-attr-Node
  query:
    - $referenced-descriptor[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.Database', '*scpb.EnumType', '*scpb.Function', '*scpb.Schema', '*scpb.Sequence', '*scpb.Table', '*scpb.View']
    - $referencing-via-attr[Type] IN ['*scpb.CheckConstraintUnvalidated', '*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnFamily', '*scpb.ColumnName', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.CompositeTypeAttrName', '*scpb.CompositeTypeAttrType', '*scpb.ConstraintComment', '*scpb.ConstraintWithoutIndexName', '*scpb.DatabaseComment', '*scpb.DatabaseRegionConfig', '*scpb.DatabaseRoleSetting', '*scpb.DatabaseZoneConfig', '*scpb.EnumTypeValue', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.FunctionBody', '*scpb.FunctionLeakProof', '*scpb.FunctionName', '*scpb.FunctionNullInputBehavior', '*scpb.FunctionSecurity', '*scpb.FunctionVolatility', '*scpb.IndexColumn', '*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.LDRJobIDs', '*scpb.Namespace', '*scpb.Owner', '*scpb.PartitionZoneConfig', '*scpb.RowLevelTTL', '*scpb.SchemaComment', '*scpb.SecondaryIndexPartial', '*scpb.SequenceOption', '*scpb.SequenceOwner', '*scpb.TableComment', '*scpb.TableLocalityGlobal', '*scpb.TableLocalityPrimaryRegion', '*scpb.TableLocalityRegionalByRow', '*scpb.TableLocalitySecondaryRegion', '*scpb.TablePartitioning', '*scpb.TableSchemaLocked', '*scpb.TableZoneConfig', '*scpb.Trigger', '*scpb.TriggerDeps', '*scpb.TriggerEnabled', '*scpb.TriggerEvents', '*scpb.TriggerFunctionCall', '*scpb.TriggerName', '*scpb.TriggerTiming', '*scpb.TriggerTransition', '*scpb.TriggerWhen', '*scpb.TypeComment', '*scpb.UniqueWithoutIndexConstraintUnvalidated', '*scpb.UserPrivileges']
    - joinReferencedDescID($referencing-via-attr, $referenced-descriptor, $desc-id)
    - toAbsent($referenced-descriptor-Target, $referencing-via-attr-Target)
    - $referenced-descriptor-Node[CurrentStatus] = DROPPED
    - $referencing-via-attr-Node[CurrentStatus] = ABSENT
    - joinTargetNode($referenced-descriptor, $referenced-descriptor-Target, $referenced-descriptor-Node)
    - joinTargetNode($referencing-via-attr, $referencing-via-attr-Target, $referencing-via-attr-Node)
- name: descriptor drop right before removing dependent with expr ref to sequence
  from: referenced-descriptor-Node
  kind: SameStagePrecedence
  to: referencing-via-expr-Node
  query:
    - $referenced-descriptor[Type] = '*scpb.Sequence'
    - $referenced-descriptor[DescID] = $seqID
    - $referencing-via-expr[ReferencedSequenceIDs] CONTAINS $seqID
    - $referencing-via-expr[Type] IN ['*scpb.CheckConstraintUnvalidated', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.SecondaryIndexPartial']
    - toAbsent($referenced-descriptor-Target, $referencing-via-expr-Target)
    - $referenced-descriptor-Node[CurrentStatus] = DROPPED
    - $referencing-via-expr-Node[CurrentStatus] = ABSENT
    - joinTargetNode($referenced-descriptor, $referenced-descriptor-Target, $referenced-descriptor-Node)
    - joinTargetNode($referencing-via-expr, $referencing-via-expr-Target, $referencing-via-expr-Node)
- name: descriptor drop right before removing dependent with function refs in columns
  from: referenced-descriptor-Node
  kind: SameStagePrecedence
  to: referencing-via-function-Node
  query:
    - $referenced-descriptor[Type] = '*scpb.Function'
    - $referenced-descriptor[DescID] = $fromDescID
    - $referencing-via-function[ReferencedFunctionIDs] CONTAINS $fromDescID
    - $referencing-via-function[Type] IN ['*scpb.CheckConstraintUnvalidated', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.SecondaryIndexPartial']
    - toAbsent($referenced-descriptor-Target, $referencing-via-function-Target)
    - $referenced-descriptor-Node[CurrentStatus] = DROPPED
    - $referencing-via-function-Node[CurrentStatus] = ABSENT
    - joinTargetNode($referenced-descriptor, $referenced-descriptor-Target, $referenced-descriptor-Node)
    - joinTargetNode($referencing-via-function, $referencing-via-function-Target, $referencing-via-function-Node)
- name: descriptor drop right before removing dependent with type refs in expressions
  from: referenced-descriptor-Node
  kind: SameStagePrecedence
  to: referencing-via-type-Node
  query:
    - $referenced-descriptor[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.EnumType']
    - $referenced-descriptor[DescID] = $fromDescID
    - $referencing-via-type[ReferencedTypeIDs] CONTAINS $fromDescID
    - descriptorIsNotBeingDropped-24.3($referencing-via-type)
    - $referencing-via-type[Type] IN ['*scpb.CheckConstraintUnvalidated', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.SecondaryIndexPartial']
    - toAbsent($referenced-descriptor-Target, $referencing-via-type-Target)
    - $referenced-descriptor-Node[CurrentStatus] = DROPPED
    - $referencing-via-type-Node[CurrentStatus] = ABSENT
    - joinTargetNode($referenced-descriptor, $referenced-descriptor-Target, $referenced-descriptor-Node)
    - joinTargetNode($referencing-via-type, $referencing-via-type-Target, $referencing-via-type-Node)
- name: descriptor dropped before dependent element removal
  from: descriptor-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $descriptor[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.Database', '*scpb.EnumType', '*scpb.Function', '*scpb.Schema', '*scpb.Sequence', '*scpb.Table', '*scpb.View']
    - $dependent[Type] IN ['*scpb.CheckConstraintUnvalidated', '*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnFamily', '*scpb.ColumnName', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.CompositeTypeAttrName', '*scpb.CompositeTypeAttrType', '*scpb.DatabaseComment', '*scpb.DatabaseRegionConfig', '*scpb.DatabaseRoleSetting', '*scpb.DatabaseZoneConfig', '*scpb.EnumTypeValue', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.FunctionBody', '*scpb.FunctionLeakProof', '*scpb.FunctionName', '*scpb.FunctionNullInputBehavior', '*scpb.FunctionSecurity', '*scpb.FunctionVolatility', '*scpb.IndexColumn', '*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.LDRJobIDs', '*scpb.Namespace', '*scpb.Owner', '*scpb.PartitionZoneConfig', '*scpb.RowLevelTTL', '*scpb.SchemaChild', '*scpb.SchemaComment', '*scpb.SchemaParent', '*scpb.SecondaryIndexPartial', '*scpb.SequenceOption', '*scpb.SequenceOwner', '*scpb.TableComment', '*scpb.TableLocalityGlobal', '*scpb.TableLocalityPrimaryRegion', '*scpb.TableLocalityRegionalByRow', '*scpb.TableLocalitySecondaryRegion', '*scpb.TablePartitioning', '*scpb.TableSchemaLocked', '*scpb.TableZoneConfig', '*scpb.Trigger', '*scpb.TriggerDeps', '*scpb.TriggerEnabled', '*scpb.TriggerEvents', '*scpb.TriggerFunctionCall', '*scpb.TriggerName', '*scpb.TriggerTiming', '*scpb.TriggerTransition', '*scpb.TriggerWhen', '*scpb.TypeComment', '*scpb.UniqueWithoutIndexConstraintUnvalidated', '*scpb.UserPrivileges']
    - joinOnDescID($descriptor, $dependent, $desc-id)
    - toAbsent($descriptor-Target, $dependent-Target)
    - $descriptor-Node[CurrentStatus] = DROPPED
    - $dependent-Node[CurrentStatus] = ABSENT
    - joinTargetNode($descriptor, $descriptor-Target, $descriptor-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: descriptor dropped in transaction before removal
  from: dropped-Node
  kind: PreviousTransactionPrecedence
  to: absent-Node
  query:
    - $dropped[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.Database', '*scpb.EnumType', '*scpb.Function', '*scpb.Schema', '*scpb.Sequence', '*scpb.Table', '*scpb.View']
    - $dropped[DescID] = $_
    - $dropped[Self] = $absent
    - toAbsent($dropped-Target, $absent-Target)
    - $dropped-Node[CurrentStatus] = DROPPED
    - $absent-Node[CurrentStatus] = ABSENT
    - joinTargetNode($dropped, $dropped-Target, $dropped-Node)
    - joinTargetNode($absent, $absent-Target, $absent-Node)
- name: descriptor dropped right before removing back-reference in its parent descriptor
  from: descriptor-Node
  kind: SameStagePrecedence
  to: back-reference-in-parent-descriptor-Node
  query:
    - $descriptor[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.Database', '*scpb.EnumType', '*scpb.Function', '*scpb.Schema', '*scpb.Sequence', '*scpb.Table', '*scpb.View']
    - $back-reference-in-parent-descriptor[Type] IN ['*scpb.SchemaChild', '*scpb.SchemaParent']
    - joinOnDescID($descriptor, $back-reference-in-parent-descriptor, $desc-id)
    - toAbsent($descriptor-Target, $back-reference-in-parent-descriptor-Target)
    - $descriptor-Node[CurrentStatus] = DROPPED
    - $back-reference-in-parent-descriptor-Node[CurrentStatus] = ABSENT
    - joinTargetNode($descriptor, $descriptor-Target, $descriptor-Node)
    - joinTargetNode($back-reference-in-parent-descriptor, $back-reference-in-parent-descriptor-Target, $back-reference-in-parent-descriptor-Node)
- name: descriptor existence precedes dependents
  from: relation-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $relation[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.Database', '*scpb.EnumType', '*scpb.Function', '*scpb.Schema', '*scpb.Sequence', '*scpb.Table', '*scpb.View']
    - $dependent[Type] IN ['*scpb.CheckConstraint', '*scpb.CheckConstraintUnvalidated', '*scpb.Column', '*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnFamily', '*scpb.ColumnName', '*scpb.ColumnNotNull', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.CompositeTypeAttrName', '*scpb.CompositeTypeAttrType', '*scpb.ConstraintComment', '*scpb.ConstraintWithoutIndexName', '*scpb.DatabaseComment', '*scpb.DatabaseData', '*scpb.DatabaseRegionConfig', '*scpb.DatabaseRoleSetting', '*scpb.DatabaseZoneConfig', '*scpb.EnumTypeValue', '*scpb.ForeignKeyConstraint', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.FunctionBody', '*scpb.FunctionLeakProof', '*scpb.FunctionName', '*scpb.FunctionNullInputBehavior', '*scpb.FunctionSecurity', '*scpb.FunctionVolatility', '*scpb.IndexColumn', '*scpb.IndexComment', '*scpb.IndexData', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.LDRJobIDs', '*scpb.Namespace', '*scpb.Owner', '*scpb.PartitionZoneConfig', '*scpb.PrimaryIndex', '*scpb.RowLevelTTL', '*scpb.SchemaChild', '*scpb.SchemaComment', '*scpb.SchemaParent', '*scpb.SecondaryIndex', '*scpb.SecondaryIndexPartial', '*scpb.SequenceOption', '*scpb.SequenceOwner', '*scpb.TableComment', '*scpb.TableData', '*scpb.TableLocalityGlobal', '*scpb.TableLocalityPrimaryRegion', '*scpb.TableLocalityRegionalByRow', '*scpb.TableLocalitySecondaryRegion', '*scpb.TablePartitioning', '*scpb.TableSchemaLocked', '*scpb.TableZoneConfig', '*scpb.TemporaryIndex', '*scpb.Trigger', '*scpb.TriggerDeps', '*scpb.TriggerEnabled', '*scpb.TriggerEvents', '*scpb.TriggerFunctionCall', '*scpb.TriggerName', '*scpb.TriggerTiming', '*scpb.TriggerTransition', '*scpb.TriggerWhen', '*scpb.TypeComment', '*scpb.UniqueWithoutIndexConstraint', '*scpb.UniqueWithoutIndexConstraintUnvalidated', '*scpb.UserPrivileges']
    - joinOnDescID($relation, $dependent, $relation-id)
    - ToPublicOrTransient($relation-Target, $dependent-Target)
    - $relation-Node[CurrentStatus] = DESCRIPTOR_ADDED
    - $dependent-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($relation, $relation-Target, $relation-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: descriptor removed right before garbage collection
  from: database-Node
  kind: SameStagePrecedence
  to: data-Node
  query:
    - $database[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.Database', '*scpb.EnumType', '*scpb.Function', '*scpb.Schema', '*scpb.Sequence', '*scpb.Table', '*scpb.View']
    - $data[Type] = '*scpb.DatabaseData'
    - joinOnDescID($database, $data, $db-id)
    - toAbsent($database-Target, $data-Target)
    - $database-Node[CurrentStatus] = ABSENT
    - $data-Node[CurrentStatus] = DROPPED
    - joinTargetNode($database, $database-Target, $database-Node)
    - joinTargetNode($data, $data-Target, $data-Node)
- name: ensure columns are in increasing order
  from: later-column-Node
  kind: Precedence
  to: earlier-column-Node
  query:
    - $later-column[Type] = '*scpb.Column'
    - joinTargetNode($later-column, $later-column-Target, $later-column-Node)
    - $earlier-column[Type] = '*scpb.Column'
    - joinOnDescID($later-column, $earlier-column, $table-id)
    - ToPublicOrTransient($later-column-Target, $earlier-column-Target)
    - $status IN [WRITE_ONLY, PUBLIC]
    - $later-column-Node[CurrentStatus] = $status
    - $earlier-column-Node[CurrentStatus] = $status
    - SmallerColumnIDFirst(*scpb.Column, *scpb.Column)($later-column, $earlier-column)
    - joinTargetNode($later-column, $later-column-Target, $later-column-Node)
    - joinTargetNode($earlier-column, $earlier-column-Target, $earlier-column-Node)
- name: function name should be set before parent ids
  from: function-name-Node
  kind: Precedence
  to: function-parent-Node
  query:
    - $function-name[Type] = '*scpb.FunctionName'
    - $function-parent[Type] = '*scpb.SchemaChild'
    - joinOnDescID($function-name, $function-parent, $function-id)
    - ToPublicOrTransient($function-name-Target, $function-parent-Target)
    - $function-name-Node[CurrentStatus] = PUBLIC
    - $function-parent-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($function-name, $function-name-Target, $function-name-Node)
    - joinTargetNode($function-parent, $function-parent-Target, $function-parent-Node)
- name: index data exists as soon as index accepts backfills
  from: index-name-Node
  kind: SameStagePrecedence
  to: index-Node
  query:
    - $index-name[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex']
    - $index[Type] = '*scpb.IndexData'
    - joinOnIndexID($index-name, $index, $table-id, $index-id)
    - ToPublicOrTransient($index-name-Target, $index-Target)
    - $index-name-Node[CurrentStatus] = BACKFILL_ONLY
    - $index-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($index-name, $index-name-Target, $index-name-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: index dependents exist before index becomes public
  from: dependent-Node
  kind: Precedence
  to: index-Node
  query:
    - $dependent[Type] IN ['*scpb.IndexColumn', '*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.PartitionZoneConfig', '*scpb.SecondaryIndexPartial']
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - joinOnIndexID($dependent, $index, $table-id, $index-id)
    - ToPublicOrTransient($dependent-Target, $index-Target)
    - $dependent-Node[CurrentStatus] = PUBLIC
    - $index-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: index drop mutation visible before cleaning up index columns
  from: index-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - $dependent[Type] = '*scpb.IndexColumn'
    - joinOnIndexID($index, $dependent, $table-id, $index-id)
    - toAbsent($index-Target, $dependent-Target)
    - $index-Node[CurrentStatus] = DELETE_ONLY
    - $dependent-Node[CurrentStatus] = ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: index drop mutation visible before cleaning up index columns
  from: index-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - $dependent[Type] = '*scpb.IndexColumn'
    - joinOnIndexID($index, $dependent, $table-id, $index-id)
    - transient($index-Target, $dependent-Target)
    - $index-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - $dependent-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: index drop mutation visible before cleaning up index columns
  from: index-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - $dependent[Type] = '*scpb.IndexColumn'
    - joinOnIndexID($index, $dependent, $table-id, $index-id)
    - $index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - $dependent-Target[TargetStatus] = ABSENT
    - $dependent-Node[CurrentStatus] = ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: index drop mutation visible before cleaning up index columns
  from: index-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - $dependent[Type] = '*scpb.IndexColumn'
    - joinOnIndexID($index, $dependent, $table-id, $index-id)
    - $index-Target[TargetStatus] = ABSENT
    - $index-Node[CurrentStatus] = DELETE_ONLY
    - $dependent-Target[TargetStatus] = TRANSIENT_ABSENT
    - $dependent-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: index existence precedes index dependents
  from: index-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex']
    - $dependent[Type] IN ['*scpb.IndexColumn', '*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.PartitionZoneConfig', '*scpb.SecondaryIndexPartial']
    - joinOnIndexID($index, $dependent, $table-id, $index-id)
    - ToPublicOrTransient($index-Target, $dependent-Target)
    - $index-Node[CurrentStatus] = BACKFILL_ONLY
    - $dependent-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: index is MERGED before its temp index starts to disappear
  from: index-Node
  kind: Precedence
  to: temp-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex']
    - $temp[Type] = '*scpb.TemporaryIndex'
    - joinOnDescID($index, $temp, $table-id)
    - $index[TemporaryIndexID] = $temp-index-id
    - $temp[IndexID] = $temp-index-id
    - $index-Target[TargetStatus] IN [PUBLIC, TRANSIENT_ABSENT]
    - $index-Node[CurrentStatus] = MERGED
    - $temp-Target[TargetStatus] = TRANSIENT_ABSENT
    - $temp-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($temp, $temp-Target, $temp-Node)
- name: index is ready to be validated before we validate constraint on it
  from: index-Node
  kind: Precedence
  to: constraint-Node
  query:
    - $index[Type] = '*scpb.PrimaryIndex'
    - $constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.UniqueWithoutIndexConstraint']
    - joinOnDescID($index, $constraint, $table-id)
    - $index[IndexID] = $index-id-for-validation
    - $constraint[IndexID] = $index-id-for-validation
    - ToPublicOrTransient($index-Target, $constraint-Target)
    - $index-Node[CurrentStatus] = VALIDATED
    - $constraint-Node[CurrentStatus] = VALIDATED
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: index no longer public before dependents, excluding columns
  from: index-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - $dependent[Type] IN ['*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.PartitionZoneConfig', '*scpb.SecondaryIndexPartial']
    - joinOnIndexID($index, $dependent, $table-id, $index-id)
    - toAbsent($index-Target, $dependent-Target)
    - $index-Node[CurrentStatus] = VALIDATED
    - $dependent-Node[CurrentStatus] = ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: index no longer public before dependents, excluding columns
  from: index-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - $dependent[Type] IN ['*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.PartitionZoneConfig', '*scpb.SecondaryIndexPartial']
    - joinOnIndexID($index, $dependent, $table-id, $index-id)
    - transient($index-Target, $dependent-Target)
    - $index-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $dependent-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: index no longer public before dependents, excluding columns
  from: index-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - $dependent[Type] IN ['*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.PartitionZoneConfig', '*scpb.SecondaryIndexPartial']
    - joinOnIndexID($index, $dependent, $table-id, $index-id)
    - $index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $dependent-Target[TargetStatus] = ABSENT
    - $dependent-Node[CurrentStatus] = ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: index no longer public before dependents, excluding columns
  from: index-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - $dependent[Type] IN ['*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.PartitionZoneConfig', '*scpb.SecondaryIndexPartial']
    - joinOnIndexID($index, $dependent, $table-id, $index-id)
    - $index-Target[TargetStatus] = ABSENT
    - $index-Node[CurrentStatus] = VALIDATED
    - $dependent-Target[TargetStatus] = TRANSIENT_ABSENT
    - $dependent-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: index no longer public before index name
  from: index-Node
  kind: Precedence
  to: name-Node
  query:
    - $index[Type] = '*scpb.SecondaryIndex'
    - $name[Type] = '*scpb.IndexName'
    - joinOnIndexID($index, $name, $table-id, $index-id)
    - toAbsent($index-Target, $name-Target)
    - $index-Node[CurrentStatus] = DELETE_ONLY
    - $name-Node[CurrentStatus] = ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($name, $name-Target, $name-Node)
- name: index no longer public before index name
  from: index-Node
  kind: Precedence
  to: name-Node
  query:
    - $index[Type] = '*scpb.SecondaryIndex'
    - $name[Type] = '*scpb.IndexName'
    - joinOnIndexID($index, $name, $table-id, $index-id)
    - transient($index-Target, $name-Target)
    - $index-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - $name-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($name, $name-Target, $name-Node)
- name: index no longer public before index name
  from: index-Node
  kind: Precedence
  to: name-Node
  query:
    - $index[Type] = '*scpb.SecondaryIndex'
    - $name[Type] = '*scpb.IndexName'
    - joinOnIndexID($index, $name, $table-id, $index-id)
    - $index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - $name-Target[TargetStatus] = ABSENT
    - $name-Node[CurrentStatus] = ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($name, $name-Target, $name-Node)
- name: index no longer public before index name
  from: index-Node
  kind: Precedence
  to: name-Node
  query:
    - $index[Type] = '*scpb.SecondaryIndex'
    - $name[Type] = '*scpb.IndexName'
    - joinOnIndexID($index, $name, $table-id, $index-id)
    - $index-Target[TargetStatus] = ABSENT
    - $index-Node[CurrentStatus] = DELETE_ONLY
    - $name-Target[TargetStatus] = TRANSIENT_ABSENT
    - $name-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($name, $name-Target, $name-Node)
- name: index removed before garbage collection
  from: index-Node
  kind: Precedence
  to: index-data-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - $index-data[Type] = '*scpb.IndexData'
    - joinOnIndexID($index, $index-data, $table-id, $index-id)
    - toAbsent($index-Target, $index-data-Target)
    - $index-Node[CurrentStatus] = ABSENT
    - $index-data-Node[CurrentStatus] = DROPPED
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($index-data, $index-data-Target, $index-data-Node)
- name: index removed before garbage collection
  from: index-Node
  kind: Precedence
  to: index-data-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - $index-data[Type] = '*scpb.IndexData'
    - joinOnIndexID($index, $index-data, $table-id, $index-id)
    - transient($index-Target, $index-data-Target)
    - $index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $index-data-Node[CurrentStatus] = TRANSIENT_DROPPED
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($index-data, $index-data-Target, $index-data-Node)
- name: index removed before garbage collection
  from: index-Node
  kind: Precedence
  to: index-data-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - $index-data[Type] = '*scpb.IndexData'
    - joinOnIndexID($index, $index-data, $table-id, $index-id)
    - $index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $index-data-Target[TargetStatus] = ABSENT
    - $index-data-Node[CurrentStatus] = DROPPED
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($index-data, $index-data-Target, $index-data-Node)
- name: index removed before garbage collection
  from: index-Node
  kind: Precedence
  to: index-data-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - $index-data[Type] = '*scpb.IndexData'
    - joinOnIndexID($index, $index-data, $table-id, $index-id)
    - $index-Target[TargetStatus] = ABSENT
    - $index-Node[CurrentStatus] = ABSENT
    - $index-data-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-data-Node[CurrentStatus] = TRANSIENT_DROPPED
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($index-data, $index-data-Target, $index-data-Node)
- name: index-column added to index before index is backfilled
  from: index-column-Node
  kind: Precedence
  to: index-Node
  query:
    - $index-column[Type] = '*scpb.IndexColumn'
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex']
    - joinOnIndexID($index-column, $index, $table-id, $index-id)
    - ToPublicOrTransient($index-column-Target, $index-Target)
    - $index-column-Node[CurrentStatus] = PUBLIC
    - $index-Node[CurrentStatus] = BACKFILLED
    - joinTargetNode($index-column, $index-column-Target, $index-column-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: index-column added to index before temp index receives writes
  from: index-column-Node
  kind: Precedence
  to: index-Node
  query:
    - $index-column[Type] = '*scpb.IndexColumn'
    - $index[Type] = '*scpb.TemporaryIndex'
    - joinOnIndexID($index-column, $index, $table-id, $index-id)
    - transient($index-column-Target, $index-Target)
    - $index-column-Node[CurrentStatus] = PUBLIC
    - $index-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($index-column, $index-column-Target, $index-column-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: indexes containing column reach absent before column
  from: index-Node
  kind: Precedence
  to: column-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex']
    - $column[Type] = '*scpb.Column'
    - ColumnInIndex($index-column, $index, $table-id, $column-id, $index-id)
    - joinOnColumnID($index-column, $column, $table-id, $column-id)
    - descriptorIsNotBeingDropped-24.3($index-column)
    - toAbsent($index-Target, $column-Target)
    - $index-Node[CurrentStatus] = ABSENT
    - $column-Node[CurrentStatus] = ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: indexes containing column reach absent before column
  from: index-Node
  kind: Precedence
  to: column-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex']
    - $column[Type] = '*scpb.Column'
    - ColumnInIndex($index-column, $index, $table-id, $column-id, $index-id)
    - joinOnColumnID($index-column, $column, $table-id, $column-id)
    - descriptorIsNotBeingDropped-24.3($index-column)
    - transient($index-Target, $column-Target)
    - $index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $column-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: indexes containing column reach absent before column
  from: index-Node
  kind: Precedence
  to: column-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex']
    - $column[Type] = '*scpb.Column'
    - ColumnInIndex($index-column, $index, $table-id, $column-id, $index-id)
    - joinOnColumnID($index-column, $column, $table-id, $column-id)
    - descriptorIsNotBeingDropped-24.3($index-column)
    - $index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $column-Target[TargetStatus] = ABSENT
    - $column-Node[CurrentStatus] = ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: indexes containing column reach absent before column
  from: index-Node
  kind: Precedence
  to: column-Node
  query:
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex']
    - $column[Type] = '*scpb.Column'
    - ColumnInIndex($index-column, $index, $table-id, $column-id, $index-id)
    - joinOnColumnID($index-column, $column, $table-id, $column-id)
    - descriptorIsNotBeingDropped-24.3($index-column)
    - $index-Target[TargetStatus] = ABSENT
    - $index-Node[CurrentStatus] = ABSENT
    - $column-Target[TargetStatus] = TRANSIENT_ABSENT
    - $column-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: namespace exist before schema parent
  from: dependent-Node
  kind: Precedence
  to: relation-Node
  query:
    - $dependent[Type] = '*scpb.Namespace'
    - $relation[Type] = '*scpb.SchemaParent'
    - joinOnDescID($dependent, $relation, $schema-id)
    - ToPublicOrTransient($dependent-Target, $relation-Target)
    - $dependent-Node[CurrentStatus] = PUBLIC
    - $relation-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($relation, $relation-Target, $relation-Node)
- name: non-data dependents removed before descriptor
  from: dependent-Node
  kind: Precedence
  to: descriptor-Node
  query:
    - $dependent[Type] IN ['*scpb.CheckConstraint', '*scpb.CheckConstraintUnvalidated', '*scpb.Column', '*scpb.ColumnComment', '*scpb.ColumnComputeExpression', '*scpb.ColumnDefaultExpression', '*scpb.ColumnFamily', '*scpb.ColumnName', '*scpb.ColumnNotNull', '*scpb.ColumnOnUpdateExpression', '*scpb.ColumnType', '*scpb.CompositeTypeAttrName', '*scpb.CompositeTypeAttrType', '*scpb.ConstraintComment', '*scpb.ConstraintWithoutIndexName', '*scpb.DatabaseComment', '*scpb.DatabaseRegionConfig', '*scpb.DatabaseRoleSetting', '*scpb.DatabaseZoneConfig', '*scpb.EnumTypeValue', '*scpb.ForeignKeyConstraint', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.FunctionBody', '*scpb.FunctionLeakProof', '*scpb.FunctionName', '*scpb.FunctionNullInputBehavior', '*scpb.FunctionSecurity', '*scpb.FunctionVolatility', '*scpb.IndexColumn', '*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.LDRJobIDs', '*scpb.Namespace', '*scpb.Owner', '*scpb.PartitionZoneConfig', '*scpb.PrimaryIndex', '*scpb.RowLevelTTL', '*scpb.SchemaChild', '*scpb.SchemaComment', '*scpb.SchemaParent', '*scpb.SecondaryIndex', '*scpb.SecondaryIndexPartial', '*scpb.SequenceOption', '*scpb.SequenceOwner', '*scpb.TableComment', '*scpb.TableLocalityGlobal', '*scpb.TableLocalityPrimaryRegion', '*scpb.TableLocalityRegionalByRow', '*scpb.TableLocalitySecondaryRegion', '*scpb.TablePartitioning', '*scpb.TableSchemaLocked', '*scpb.TableZoneConfig', '*scpb.TemporaryIndex', '*scpb.Trigger', '*scpb.TriggerDeps', '*scpb.TriggerEnabled', '*scpb.TriggerEvents', '*scpb.TriggerFunctionCall', '*scpb.TriggerName', '*scpb.TriggerTiming', '*scpb.TriggerTransition', '*scpb.TriggerWhen', '*scpb.TypeComment', '*scpb.UniqueWithoutIndexConstraint', '*scpb.UniqueWithoutIndexConstraintUnvalidated', '*scpb.UserPrivileges']
    - $descriptor[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.Database', '*scpb.EnumType', '*scpb.Function', '*scpb.Schema', '*scpb.Sequence', '*scpb.Table', '*scpb.View']
    - joinOnDescID($dependent, $descriptor, $desc-id)
    - toAbsent($dependent-Target, $descriptor-Target)
    - $dependent-Node[CurrentStatus] = ABSENT
    - $descriptor-Node[CurrentStatus] = ABSENT
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
    - joinTargetNode($descriptor, $descriptor-Target, $descriptor-Node)
- name: old index absent before new index public when swapping with transient
  from: old-primary-index-Node
  kind: Precedence
  to: new-primary-index-Node
  query:
    - $old-primary-index[Type] = '*scpb.PrimaryIndex'
    - $transient-primary-index[Type] = '*scpb.PrimaryIndex'
    - $new-primary-index[Type] = '*scpb.PrimaryIndex'
    - joinOnDescID($old-primary-index, $transient-primary-index, $table-id)
    - $old-primary-index[IndexID] = $old-index-id
    - $transient-primary-index[SourceIndexID] = $old-index-id
    - joinOnDescID($transient-primary-index, $new-primary-index, $table-id)
    - $transient-primary-index[IndexID] = $transient-index-id
    - $new-primary-index[SourceIndexID] = $transient-index-id
    - $old-primary-index-Target[TargetStatus] = ABSENT
    - $old-primary-index-Node[CurrentStatus] = ABSENT
    - $new-primary-index-Target[TargetStatus] = PUBLIC
    - $new-primary-index-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($old-primary-index, $old-primary-index-Target, $old-primary-index-Node)
    - joinTargetNode($new-primary-index, $new-primary-index-Target, $new-primary-index-Node)
- name: partial predicate removed right before secondary index when not dropping relation
  from: partial-predicate-Node
  kind: SameStagePrecedence
  to: index-Node
  query:
    - $partial-predicate[Type] = '*scpb.SecondaryIndexPartial'
    - descriptorIsNotBeingDropped-24.3($partial-predicate)
    - $index[Type] = '*scpb.SecondaryIndex'
    - joinOnIndexID($partial-predicate, $index, $table-id, $index-id)
    - toAbsent($partial-predicate-Target, $index-Target)
    - $partial-predicate-Node[CurrentStatus] = ABSENT
    - $index-Node[CurrentStatus] = ABSENT
    - joinTargetNode($partial-predicate, $partial-predicate-Target, $partial-predicate-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: partial predicate removed right before secondary index when not dropping relation
  from: partial-predicate-Node
  kind: SameStagePrecedence
  to: index-Node
  query:
    - $partial-predicate[Type] = '*scpb.SecondaryIndexPartial'
    - descriptorIsNotBeingDropped-24.3($partial-predicate)
    - $index[Type] = '*scpb.SecondaryIndex'
    - joinOnIndexID($partial-predicate, $index, $table-id, $index-id)
    - transient($partial-predicate-Target, $index-Target)
    - $partial-predicate-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($partial-predicate, $partial-predicate-Target, $partial-predicate-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: partial predicate removed right before secondary index when not dropping relation
  from: partial-predicate-Node
  kind: SameStagePrecedence
  to: index-Node
  query:
    - $partial-predicate[Type] = '*scpb.SecondaryIndexPartial'
    - descriptorIsNotBeingDropped-24.3($partial-predicate)
    - $index[Type] = '*scpb.SecondaryIndex'
    - joinOnIndexID($partial-predicate, $index, $table-id, $index-id)
    - $partial-predicate-Target[TargetStatus] = TRANSIENT_ABSENT
    - $partial-predicate-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $index-Target[TargetStatus] = ABSENT
    - $index-Node[CurrentStatus] = ABSENT
    - joinTargetNode($partial-predicate, $partial-predicate-Target, $partial-predicate-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: partial predicate removed right before secondary index when not dropping relation
  from: partial-predicate-Node
  kind: SameStagePrecedence
  to: index-Node
  query:
    - $partial-predicate[Type] = '*scpb.SecondaryIndexPartial'
    - descriptorIsNotBeingDropped-24.3($partial-predicate)
    - $index[Type] = '*scpb.SecondaryIndex'
    - joinOnIndexID($partial-predicate, $index, $table-id, $index-id)
    - $partial-predicate-Target[TargetStatus] = ABSENT
    - $partial-predicate-Node[CurrentStatus] = ABSENT
    - $index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($partial-predicate, $partial-predicate-Target, $partial-predicate-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: primary index named right before index becomes public
  from: index-name-Node
  kind: SameStagePrecedence
  to: index-Node
  query:
    - $index-name[Type] = '*scpb.IndexName'
    - $index[Type] = '*scpb.PrimaryIndex'
    - joinOnIndexID($index-name, $index, $table-id, $index-id)
    - ToPublicOrTransient($index-name-Target, $index-Target)
    - $index-name-Node[CurrentStatus] = PUBLIC
    - $index-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($index-name, $index-name-Target, $index-name-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: primary index swap
  from: old-index-Node
  kind: SameStagePrecedence
  to: new-index-Node
  query:
    - $old-index[Type] = '*scpb.PrimaryIndex'
    - $new-index[Type] = '*scpb.PrimaryIndex'
    - joinOnDescID($old-index, $new-index, $table-id)
    - $old-index[IndexID] = $old-index-id
    - $new-index[SourceIndexID] = $old-index-id
    - $old-index-Target[TargetStatus] = ABSENT
    - $old-index-Node[CurrentStatus] = VALIDATED
    - $new-index-Target[TargetStatus] IN [PUBLIC, TRANSIENT_ABSENT]
    - $new-index-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($old-index, $old-index-Target, $old-index-Node)
    - joinTargetNode($new-index, $new-index-Target, $new-index-Node)
- name: primary index swap
  from: old-index-Node
  kind: SameStagePrecedence
  to: new-index-Node
  query:
    - $old-index[Type] = '*scpb.PrimaryIndex'
    - $new-index[Type] = '*scpb.PrimaryIndex'
    - joinOnDescID($old-index, $new-index, $table-id)
    - $old-index[IndexID] = $old-index-id
    - $new-index[SourceIndexID] = $old-index-id
    - $old-index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $old-index-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $new-index-Target[TargetStatus] IN [PUBLIC, TRANSIENT_ABSENT]
    - $new-index-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($old-index, $old-index-Target, $old-index-Node)
    - joinTargetNode($new-index, $new-index-Target, $new-index-Node)
- name: primary index swap
  from: new-index-Node
  kind: SameStagePrecedence
  to: old-index-Node
  query:
    - $new-index[Type] = '*scpb.PrimaryIndex'
    - $old-index[Type] = '*scpb.PrimaryIndex'
    - joinOnDescID($new-index, $old-index, $table-id)
    - $new-index[SourceIndexID] = $old-index-id
    - $old-index[IndexID] = $old-index-id
    - $new-index-Target[TargetStatus] = ABSENT
    - $new-index-Node[CurrentStatus] = VALIDATED
    - $old-index-Target[TargetStatus] = PUBLIC
    - $old-index-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($new-index, $new-index-Target, $new-index-Node)
    - joinTargetNode($old-index, $old-index-Target, $old-index-Node)
- name: primary index with new columns should exist before secondary indexes
  from: primary-index-Node
  kind: Precedence
  to: secondary-index-Node
  query:
    - $primary-index[Type] = '*scpb.PrimaryIndex'
    - $secondary-index[Type] = '*scpb.SecondaryIndex'
    - joinOnDescID($primary-index, $secondary-index, $table-id)
    - $primary-index[IndexID] = $primary-index-id
    - $secondary-index[SourceIndexID] = $primary-index-id
    - ToPublicOrTransient($primary-index-Target, $secondary-index-Target)
    - $primary-index-Node[CurrentStatus] = PUBLIC
    - $secondary-index-Node[CurrentStatus] = BACKFILL_ONLY
    - joinTargetNode($primary-index, $primary-index-Target, $primary-index-Node)
    - joinTargetNode($secondary-index, $secondary-index-Target, $secondary-index-Node)
- name: primary index with new columns should exist before temp indexes
  from: primary-index-Node
  kind: Precedence
  to: temp-index-Node
  query:
    - $primary-index[Type] = '*scpb.PrimaryIndex'
    - $temp-index[Type] = '*scpb.TemporaryIndex'
    - joinOnDescID($primary-index, $temp-index, $table-id)
    - $primary-index[IndexID] = $primary-index-id
    - $temp-index[SourceIndexID] = $primary-index-id
    - ToPublicOrTransient($primary-index-Target, $temp-index-Target)
    - $primary-index-Node[CurrentStatus] = PUBLIC
    - $temp-index-Node[CurrentStatus] = DELETE_ONLY
    - joinTargetNode($primary-index, $primary-index-Target, $primary-index-Node)
    - joinTargetNode($temp-index, $temp-index-Target, $temp-index-Node)
- name: relation dropped before dependent column
  from: descriptor-Node
  kind: Precedence
  to: column-Node
  query:
    - $descriptor[Type] IN ['*scpb.Table', '*scpb.View', '*scpb.Sequence']
    - $column[Type] = '*scpb.Column'
    - joinOnDescID($descriptor, $column, $desc-id)
    - toAbsent($descriptor-Target, $column-Target)
    - $descriptor-Node[CurrentStatus] = DROPPED
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($descriptor, $descriptor-Target, $descriptor-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: relation dropped before dependent constraint
  from: descriptor-Node
  kind: Precedence
  to: constraint-Node
  query:
    - $descriptor[Type] = '*scpb.Table'
    - $constraint[Type] = '*scpb.ColumnNotNull'
    - joinOnDescID($descriptor, $constraint, $desc-id)
    - toAbsent($descriptor-Target, $constraint-Target)
    - $descriptor-Node[CurrentStatus] = DROPPED
    - $constraint-Node[CurrentStatus] = VALIDATED
    - joinTargetNode($descriptor, $descriptor-Target, $descriptor-Node)
    - joinTargetNode($constraint, $constraint-Target, $constraint-Node)
- name: relation dropped before dependent index
  from: descriptor-Node
  kind: Precedence
  to: index-Node
  query:
    - $descriptor[Type] IN ['*scpb.Table', '*scpb.View']
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - joinOnDescID($descriptor, $index, $desc-id)
    - toAbsent($descriptor-Target, $index-Target)
    - $descriptor-Node[CurrentStatus] = DROPPED
    - $index-Node[CurrentStatus] = VALIDATED
    - joinTargetNode($descriptor, $descriptor-Target, $descriptor-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: remove columns from index right before removing index
  from: index-column-Node
  kind: Precedence
  to: index-Node
  query:
    - $index-column[Type] = '*scpb.IndexColumn'
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - joinOnIndexID($index-column, $index, $table-id, $index-id)
    - toAbsent($index-column-Target, $index-Target)
    - $index-column-Node[CurrentStatus] = DELETE_ONLY
    - $index-Node[CurrentStatus] = ABSENT
    - joinTargetNode($index-column, $index-column-Target, $index-column-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: remove columns from index right before removing index
  from: index-column-Node
  kind: Precedence
  to: index-Node
  query:
    - $index-column[Type] = '*scpb.IndexColumn'
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - joinOnIndexID($index-column, $index, $table-id, $index-id)
    - transient($index-column-Target, $index-Target)
    - $index-column-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - $index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($index-column, $index-column-Target, $index-column-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: remove columns from index right before removing index
  from: index-column-Node
  kind: Precedence
  to: index-Node
  query:
    - $index-column[Type] = '*scpb.IndexColumn'
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - joinOnIndexID($index-column, $index, $table-id, $index-id)
    - $index-column-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-column-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - $index-Target[TargetStatus] = ABSENT
    - $index-Node[CurrentStatus] = ABSENT
    - joinTargetNode($index-column, $index-column-Target, $index-column-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: remove columns from index right before removing index
  from: index-column-Node
  kind: Precedence
  to: index-Node
  query:
    - $index-column[Type] = '*scpb.IndexColumn'
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex', '*scpb.TemporaryIndex']
    - joinOnIndexID($index-column, $index, $table-id, $index-id)
    - $index-column-Target[TargetStatus] = ABSENT
    - $index-column-Node[CurrentStatus] = DELETE_ONLY
    - $index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($index-column, $index-column-Target, $index-column-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: replacement secondary index should be validated before the old one becomes invisible
  from: new-index-Node
  kind: Precedence
  to: old-index-Node
  query:
    - $old-index[Type] = '*scpb.SecondaryIndex'
    - $new-index[Type] = '*scpb.SecondaryIndex'
    - $old-index-Target[TargetStatus] = ABSENT
    - $new-index-Target[TargetStatus] IN [PUBLIC, TRANSIENT_ABSENT]
    - joinOnDescID($old-index, $new-index, $table-id)
    - $new-index[IndexID] = $index-id
    - $old-index[IndexID] = $old-index-id
    - $new-index[RecreateSourceIndexID] = $old-index-id
    - joinTargetNode($old-index, $old-index-Target, $old-index-Node)
    - joinTargetNode($new-index, $new-index-Target, $new-index-Node)
    - $new-index-Node[CurrentStatus] = PUBLIC
    - $old-index-Node[CurrentStatus] = VALIDATED
    - joinTargetNode($new-index, $new-index-Target, $new-index-Node)
    - joinTargetNode($old-index, $old-index-Target, $old-index-Node)
- name: schedule all GC jobs for a descriptor in the same stage
  from: data-a-Node
  kind: SameStagePrecedence
  to: data-b-Node
  query:
    - $data-a[Type] IN ['*scpb.DatabaseData', '*scpb.IndexData', '*scpb.TableData']
    - $data-b[Type] IN ['*scpb.DatabaseData', '*scpb.IndexData', '*scpb.TableData']
    - joinOnDescID($data-a, $data-b, $desc-id)
    - SmallerIDsFirst(scpb.Element, scpb.Element)($data-a, $data-b)
    - toAbsent($data-a-Target, $data-b-Target)
    - $data-a-Node[CurrentStatus] = DROPPED
    - $data-b-Node[CurrentStatus] = DROPPED
    - joinTargetNode($data-a, $data-a-Target, $data-a-Node)
    - joinTargetNode($data-b, $data-b-Target, $data-b-Node)
- name: schedule all GC jobs for a descriptor in the same stage
  from: data-a-Node
  kind: SameStagePrecedence
  to: data-b-Node
  query:
    - $data-a[Type] IN ['*scpb.DatabaseData', '*scpb.IndexData', '*scpb.TableData']
    - $data-b[Type] IN ['*scpb.DatabaseData', '*scpb.IndexData', '*scpb.TableData']
    - joinOnDescID($data-a, $data-b, $desc-id)
    - SmallerIDsFirst(scpb.Element, scpb.Element)($data-a, $data-b)
    - transient($data-a-Target, $data-b-Target)
    - $data-a-Node[CurrentStatus] = TRANSIENT_DROPPED
    - $data-b-Node[CurrentStatus] = TRANSIENT_DROPPED
    - joinTargetNode($data-a, $data-a-Target, $data-a-Node)
    - joinTargetNode($data-b, $data-b-Target, $data-b-Node)
- name: schedule all GC jobs for a descriptor in the same stage
  from: data-a-Node
  kind: SameStagePrecedence
  to: data-b-Node
  query:
    - $data-a[Type] IN ['*scpb.DatabaseData', '*scpb.IndexData', '*scpb.TableData']
    - $data-b[Type] IN ['*scpb.DatabaseData', '*scpb.IndexData', '*scpb.TableData']
    - joinOnDescID($data-a, $data-b, $desc-id)
    - SmallerIDsFirst(scpb.Element, scpb.Element)($data-a, $data-b)
    - $data-a-Target[TargetStatus] = TRANSIENT_ABSENT
    - $data-a-Node[CurrentStatus] = TRANSIENT_DROPPED
    - $data-b-Target[TargetStatus] = ABSENT
    - $data-b-Node[CurrentStatus] = DROPPED
    - joinTargetNode($data-a, $data-a-Target, $data-a-Node)
    - joinTargetNode($data-b, $data-b-Target, $data-b-Node)
- name: schedule all GC jobs for a descriptor in the same stage
  from: data-a-Node
  kind: SameStagePrecedence
  to: data-b-Node
  query:
    - $data-a[Type] IN ['*scpb.DatabaseData', '*scpb.IndexData', '*scpb.TableData']
    - $data-b[Type] IN ['*scpb.DatabaseData', '*scpb.IndexData', '*scpb.TableData']
    - joinOnDescID($data-a, $data-b, $desc-id)
    - SmallerIDsFirst(scpb.Element, scpb.Element)($data-a, $data-b)
    - $data-a-Target[TargetStatus] = ABSENT
    - $data-a-Node[CurrentStatus] = DROPPED
    - $data-b-Target[TargetStatus] = TRANSIENT_ABSENT
    - $data-b-Node[CurrentStatus] = TRANSIENT_DROPPED
    - joinTargetNode($data-a, $data-a-Target, $data-a-Node)
    - joinTargetNode($data-b, $data-b-Target, $data-b-Node)
- name: secondary index named before public (with index swap)
  from: index-Node
  kind: Precedence
  to: index-name-Node
  query:
    - $index-name[Type] = '*scpb.IndexName'
    - $index[Type] = '*scpb.SecondaryIndex'
    - joinOnIndexID($index, $index-name, $table-id, $index-id)
    - ToPublicOrTransient($index-Target, $index-name-Target)
    - $index-Node[CurrentStatus] = VALIDATED
    - $index-name-Node[CurrentStatus] = PUBLIC
    - $old-index[Type] = '*scpb.SecondaryIndex'
    - $new-index[Type] = '*scpb.SecondaryIndex'
    - $old-index-Target[TargetStatus] = ABSENT
    - $new-index-Target[TargetStatus] IN [PUBLIC, TRANSIENT_ABSENT]
    - joinOnDescID($old-index, $new-index, $table-id)
    - $new-index[IndexID] = $index-id
    - $old-index[IndexID] = $old-index-id
    - $new-index[RecreateSourceIndexID] = $old-index-id
    - joinTargetNode($old-index, $old-index-Target, $old-index-Node)
    - joinTargetNode($new-index, $new-index-Target, $new-index-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($index-name, $index-name-Target, $index-name-Node)
- name: secondary index named before validation (without index swap)
  from: index-name-Node
  kind: Precedence
  to: index-Node
  query:
    - $index-name[Type] = '*scpb.IndexName'
    - $index[Type] = '*scpb.SecondaryIndex'
    - joinOnIndexID($index-name, $index, $table-id, $index-id)
    - no secondary index swap is on going($table-id, $index-id)
    - ToPublicOrTransient($index-name-Target, $index-Target)
    - $index-name-Node[CurrentStatus] = PUBLIC
    - $index-Node[CurrentStatus] = VALIDATED
    - joinTargetNode($index-name, $index-name-Target, $index-name-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: secondary index partial no longer public before referenced column
  from: secondary-partial-index-Node
  kind: Precedence
  to: column-Node
  query:
    - $secondary-partial-index[Type] = '*scpb.SecondaryIndex'
    - $column[Type] = '*scpb.Column'
    - joinOnDescID($secondary-partial-index, $column, $table-id)
    - descriptorIsNotBeingDropped-24.3($secondary-partial-index)
    - secondaryIndexReferencesColumn(*scpb.SecondaryIndex, *scpb.Column)($secondary-partial-index, $column)
    - toAbsent($secondary-partial-index-Target, $column-Target)
    - $secondary-partial-index-Node[CurrentStatus] = DELETE_ONLY
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($secondary-partial-index, $secondary-partial-index-Target, $secondary-partial-index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: secondary index partial no longer public before referenced column
  from: secondary-partial-index-Node
  kind: Precedence
  to: column-Node
  query:
    - $secondary-partial-index[Type] = '*scpb.SecondaryIndex'
    - $column[Type] = '*scpb.Column'
    - joinOnDescID($secondary-partial-index, $column, $table-id)
    - descriptorIsNotBeingDropped-24.3($secondary-partial-index)
    - secondaryIndexReferencesColumn(*scpb.SecondaryIndex, *scpb.Column)($secondary-partial-index, $column)
    - transient($secondary-partial-index-Target, $column-Target)
    - $secondary-partial-index-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - $column-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - joinTargetNode($secondary-partial-index, $secondary-partial-index-Target, $secondary-partial-index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: secondary index partial no longer public before referenced column
  from: secondary-partial-index-Node
  kind: Precedence
  to: column-Node
  query:
    - $secondary-partial-index[Type] = '*scpb.SecondaryIndex'
    - $column[Type] = '*scpb.Column'
    - joinOnDescID($secondary-partial-index, $column, $table-id)
    - descriptorIsNotBeingDropped-24.3($secondary-partial-index)
    - secondaryIndexReferencesColumn(*scpb.SecondaryIndex, *scpb.Column)($secondary-partial-index, $column)
    - $secondary-partial-index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $secondary-partial-index-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - $column-Target[TargetStatus] = ABSENT
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($secondary-partial-index, $secondary-partial-index-Target, $secondary-partial-index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: secondary index partial no longer public before referenced column
  from: secondary-partial-index-Node
  kind: Precedence
  to: column-Node
  query:
    - $secondary-partial-index[Type] = '*scpb.SecondaryIndex'
    - $column[Type] = '*scpb.Column'
    - joinOnDescID($secondary-partial-index, $column, $table-id)
    - descriptorIsNotBeingDropped-24.3($secondary-partial-index)
    - secondaryIndexReferencesColumn(*scpb.SecondaryIndex, *scpb.Column)($secondary-partial-index, $column)
    - $secondary-partial-index-Target[TargetStatus] = ABSENT
    - $secondary-partial-index-Node[CurrentStatus] = DELETE_ONLY
    - $column-Target[TargetStatus] = TRANSIENT_ABSENT
    - $column-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - joinTargetNode($secondary-partial-index, $secondary-partial-index-Target, $secondary-partial-index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: secondary index partial no longer public before referenced column
  from: secondary-partial-index-Node
  kind: Precedence
  to: column-Node
  query:
    - $secondary-partial-index[Type] = '*scpb.SecondaryIndexPartial'
    - $column[Type] = '*scpb.Column'
    - joinOnDescID($secondary-partial-index, $column, $table-id)
    - descriptorIsNotBeingDropped-24.3($secondary-partial-index)
    - secondaryIndexReferencesColumn(*scpb.SecondaryIndexPartial, *scpb.Column)($secondary-partial-index, $column)
    - toAbsent($secondary-partial-index-Target, $column-Target)
    - $secondary-partial-index-Node[CurrentStatus] = ABSENT
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($secondary-partial-index, $secondary-partial-index-Target, $secondary-partial-index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: secondary index partial no longer public before referenced column
  from: secondary-partial-index-Node
  kind: Precedence
  to: column-Node
  query:
    - $secondary-partial-index[Type] = '*scpb.SecondaryIndexPartial'
    - $column[Type] = '*scpb.Column'
    - joinOnDescID($secondary-partial-index, $column, $table-id)
    - descriptorIsNotBeingDropped-24.3($secondary-partial-index)
    - secondaryIndexReferencesColumn(*scpb.SecondaryIndexPartial, *scpb.Column)($secondary-partial-index, $column)
    - transient($secondary-partial-index-Target, $column-Target)
    - $secondary-partial-index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $column-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - joinTargetNode($secondary-partial-index, $secondary-partial-index-Target, $secondary-partial-index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: secondary index partial no longer public before referenced column
  from: secondary-partial-index-Node
  kind: Precedence
  to: column-Node
  query:
    - $secondary-partial-index[Type] = '*scpb.SecondaryIndexPartial'
    - $column[Type] = '*scpb.Column'
    - joinOnDescID($secondary-partial-index, $column, $table-id)
    - descriptorIsNotBeingDropped-24.3($secondary-partial-index)
    - secondaryIndexReferencesColumn(*scpb.SecondaryIndexPartial, *scpb.Column)($secondary-partial-index, $column)
    - $secondary-partial-index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $secondary-partial-index-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $column-Target[TargetStatus] = ABSENT
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($secondary-partial-index, $secondary-partial-index-Target, $secondary-partial-index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: secondary index partial no longer public before referenced column
  from: secondary-partial-index-Node
  kind: Precedence
  to: column-Node
  query:
    - $secondary-partial-index[Type] = '*scpb.SecondaryIndexPartial'
    - $column[Type] = '*scpb.Column'
    - joinOnDescID($secondary-partial-index, $column, $table-id)
    - descriptorIsNotBeingDropped-24.3($secondary-partial-index)
    - secondaryIndexReferencesColumn(*scpb.SecondaryIndexPartial, *scpb.Column)($secondary-partial-index, $column)
    - $secondary-partial-index-Target[TargetStatus] = ABSENT
    - $secondary-partial-index-Node[CurrentStatus] = ABSENT
    - $column-Target[TargetStatus] = TRANSIENT_ABSENT
    - $column-Node[CurrentStatus] = TRANSIENT_WRITE_ONLY
    - joinTargetNode($secondary-partial-index, $secondary-partial-index-Target, $secondary-partial-index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: secondary index should be validated before dependent view can be absent
  from: index-Node
  kind: Precedence
  to: view-Node
  query:
    - $index[Type] = '*scpb.SecondaryIndex'
    - $view[Type] = '*scpb.View'
    - viewReferencesIndex(*scpb.SecondaryIndex, *scpb.View)($index, $view)
    - toAbsent($index-Target, $view-Target)
    - $index-Node[CurrentStatus] = VALIDATED
    - $view-Node[CurrentStatus] = ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($view, $view-Target, $view-Node)
- name: secondary index should be validated before dependent view can be absent
  from: index-Node
  kind: Precedence
  to: view-Node
  query:
    - $index[Type] = '*scpb.SecondaryIndex'
    - $view[Type] = '*scpb.View'
    - viewReferencesIndex(*scpb.SecondaryIndex, *scpb.View)($index, $view)
    - transient($index-Target, $view-Target)
    - $index-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $view-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($view, $view-Target, $view-Node)
- name: secondary index should be validated before dependent view can be absent
  from: index-Node
  kind: Precedence
  to: view-Node
  query:
    - $index[Type] = '*scpb.SecondaryIndex'
    - $view[Type] = '*scpb.View'
    - viewReferencesIndex(*scpb.SecondaryIndex, *scpb.View)($index, $view)
    - $index-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-Node[CurrentStatus] = TRANSIENT_VALIDATED
    - $view-Target[TargetStatus] = ABSENT
    - $view-Node[CurrentStatus] = ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($view, $view-Target, $view-Node)
- name: secondary index should be validated before dependent view can be absent
  from: index-Node
  kind: Precedence
  to: view-Node
  query:
    - $index[Type] = '*scpb.SecondaryIndex'
    - $view[Type] = '*scpb.View'
    - viewReferencesIndex(*scpb.SecondaryIndex, *scpb.View)($index, $view)
    - $index-Target[TargetStatus] = ABSENT
    - $index-Node[CurrentStatus] = VALIDATED
    - $view-Target[TargetStatus] = TRANSIENT_ABSENT
    - $view-Node[CurrentStatus] = TRANSIENT_ABSENT
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($view, $view-Target, $view-Node)
- name: secondary indexes containing column as key reach write-only before column
  from: index-Node
  kind: Precedence
  to: column-Node
  query:
    - $index[Type] = '*scpb.SecondaryIndex'
    - $column[Type] = '*scpb.Column'
    - ColumnInIndex($index-column, $index, $table-id, $column-id, $index-id)
    - joinOnColumnID($index-column, $column, $table-id, $column-id)
    - toAbsent($index-Target, $column-Target)
    - $index-Node[CurrentStatus] = VALIDATED
    - $column-Node[CurrentStatus] = WRITE_ONLY
    - descriptorIsNotBeingDropped-24.3($index-column)
    - isIndexKeyColumnKey(*scpb.IndexColumn)($index-column)
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: simple constraint public right before its dependents
  from: simple-constraint-Node
  kind: SameStagePrecedence
  to: dependent-Node
  query:
    - $simple-constraint[Type] = '*scpb.ColumnNotNull'
    - $dependent[Type] IN ['*scpb.ConstraintComment', '*scpb.ConstraintWithoutIndexName']
    - joinOnConstraintID($simple-constraint, $dependent, $table-id, $constraint-id)
    - ToPublicOrTransient($simple-constraint-Target, $dependent-Target)
    - $simple-constraint-Node[CurrentStatus] = PUBLIC
    - $dependent-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($simple-constraint, $simple-constraint-Target, $simple-constraint-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: simple constraint visible before name
  from: simple-constraint-Node
  kind: Precedence
  to: constraint-name-Node
  query:
    - $simple-constraint[Type] IN ['*scpb.CheckConstraint', '*scpb.CheckConstraintUnvalidated', '*scpb.ColumnNotNull', '*scpb.ForeignKeyConstraint', '*scpb.ForeignKeyConstraintUnvalidated', '*scpb.UniqueWithoutIndexConstraint', '*scpb.UniqueWithoutIndexConstraintUnvalidated']
    - $constraint-name[Type] = '*scpb.ConstraintWithoutIndexName'
    - joinOnConstraintID($simple-constraint, $constraint-name, $table-id, $constraint-id)
    - ToPublicOrTransient($simple-constraint-Target, $constraint-name-Target)
    - $simple-constraint-Node[CurrentStatus] = WRITE_ONLY
    - $constraint-name-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($simple-constraint, $simple-constraint-Target, $simple-constraint-Node)
    - joinTargetNode($constraint-name, $constraint-name-Target, $constraint-name-Node)
- name: swapped primary index public before column
  from: index-Node
  kind: Precedence
  to: column-Node
  query:
    - $index[Type] = '*scpb.PrimaryIndex'
    - $column[Type] = '*scpb.Column'
    - ColumnInSwappedInPrimaryIndex($index-column, $index, $table-id, $column-id, $index-id)
    - joinOnColumnID($index-column, $column, $table-id, $column-id)
    - ToPublicOrTransient($index-Target, $column-Target)
    - $index-Node[CurrentStatus] = PUBLIC
    - $column-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($column, $column-Target, $column-Node)
- name: table added right before data element
  from: table-Node
  kind: Precedence
  to: data-Node
  query:
    - $table[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.Database', '*scpb.EnumType', '*scpb.Function', '*scpb.Schema', '*scpb.Sequence', '*scpb.Table', '*scpb.View']
    - $data[Type] IN ['*scpb.DatabaseData', '*scpb.IndexData', '*scpb.TableData']
    - joinOnDescID($table, $data, $table-id)
    - ToPublicOrTransient($table-Target, $data-Target)
    - $table-Node[CurrentStatus] = PUBLIC
    - $data-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($table, $table-Target, $table-Node)
    - joinTargetNode($data, $data-Target, $data-Node)
- name: table removed right before garbage collection
  from: table-Node
  kind: SameStagePrecedence
  to: data-Node
  query:
    - $table[Type] IN ['*scpb.AliasType', '*scpb.CompositeType', '*scpb.Database', '*scpb.EnumType', '*scpb.Function', '*scpb.Schema', '*scpb.Sequence', '*scpb.Table', '*scpb.View']
    - $data[Type] = '*scpb.TableData'
    - joinOnDescID($table, $data, $table-id)
    - toAbsent($table-Target, $data-Target)
    - $table-Node[CurrentStatus] = ABSENT
    - $data-Node[CurrentStatus] = DROPPED
    - joinTargetNode($table, $table-Target, $table-Node)
    - joinTargetNode($data, $data-Target, $data-Node)
- name: temp index data exists as soon as temp index accepts writes
  from: temp-index-Node
  kind: SameStagePrecedence
  to: temp-index-data-Node
  query:
    - $temp-index[Type] = '*scpb.TemporaryIndex'
    - $temp-index-data[Type] = '*scpb.IndexData'
    - joinOnIndexID($temp-index, $temp-index-data, $table-id, $index-id)
    - ToPublicOrTransient($temp-index-Target, $temp-index-data-Target)
    - $temp-index-Node[CurrentStatus] = WRITE_ONLY
    - $temp-index-data-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($temp-index, $temp-index-Target, $temp-index-Node)
    - joinTargetNode($temp-index-data, $temp-index-data-Target, $temp-index-data-Node)
- name: temp index disappeared before its master index reaches WRITE_ONLY
  from: temp-Node
  kind: Precedence
  to: index-Node
  query:
    - $temp[Type] = '*scpb.TemporaryIndex'
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex']
    - joinOnDescID($temp, $index, $table-id)
    - $temp[IndexID] = $temp-index-id
    - $index[TemporaryIndexID] = $temp-index-id
    - $temp-Target[TargetStatus] = TRANSIENT_ABSENT
    - $temp-Node[CurrentStatus] = TRANSIENT_DELETE_ONLY
    - $index-Target[TargetStatus] IN [PUBLIC, TRANSIENT_ABSENT]
    - $index-Node[CurrentStatus] = WRITE_ONLY
    - joinTargetNode($temp, $temp-Target, $temp-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: temp index existence precedes index dependents
  from: index-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $index[Type] = '*scpb.TemporaryIndex'
    - $dependent[Type] IN ['*scpb.IndexColumn', '*scpb.IndexComment', '*scpb.IndexName', '*scpb.IndexPartitioning', '*scpb.IndexZoneConfig', '*scpb.PartitionZoneConfig', '*scpb.SecondaryIndexPartial']
    - joinOnIndexID($index, $dependent, $table-id, $index-id)
    - ToPublicOrTransient($index-Target, $dependent-Target)
    - $index-Node[CurrentStatus] = DELETE_ONLY
    - $dependent-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($index, $index-Target, $index-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: temp index is WRITE_ONLY before backfill
  from: temp-Node
  kind: Precedence
  to: index-Node
  query:
    - $temp[Type] = '*scpb.TemporaryIndex'
    - $index[Type] IN ['*scpb.PrimaryIndex', '*scpb.SecondaryIndex']
    - joinOnDescID($temp, $index, $table-id)
    - $temp[IndexID] = $temp-index-id
    - $index[TemporaryIndexID] = $temp-index-id
    - $temp-Target[TargetStatus] = TRANSIENT_ABSENT
    - $index-Target[TargetStatus] IN [PUBLIC, TRANSIENT_ABSENT]
    - $temp-Node[CurrentStatus] = WRITE_ONLY
    - $index-Node[CurrentStatus] = BACKFILLED
    - joinTargetNode($temp, $temp-Target, $temp-Node)
    - joinTargetNode($index, $index-Target, $index-Node)
- name: trigger public before its dependents
  from: trigger-Node
  kind: Precedence
  to: dependent-Node
  query:
    - $trigger[Type] = '*scpb.Trigger'
    - $dependent[Type] IN ['*scpb.TriggerDeps', '*scpb.TriggerEnabled', '*scpb.TriggerEvents', '*scpb.TriggerFunctionCall', '*scpb.TriggerName', '*scpb.TriggerTiming', '*scpb.TriggerTransition', '*scpb.TriggerWhen']
    - joinOnTriggerID($trigger, $dependent, $table-id, $trigger-id)
    - ToPublicOrTransient($trigger-Target, $dependent-Target)
    - $trigger-Node[CurrentStatus] = PUBLIC
    - $dependent-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($trigger, $trigger-Target, $trigger-Node)
    - joinTargetNode($dependent, $dependent-Target, $dependent-Node)
- name: trigger removed before dependents
  from: trigger-Node
  kind: Precedence
  to: dependents-Node
  query:
    - $dependents[Type] = '*scpb.Trigger'
    - $trigger[Type] IN ['*scpb.TriggerDeps', '*scpb.TriggerEnabled', '*scpb.TriggerEvents', '*scpb.TriggerFunctionCall', '*scpb.TriggerName', '*scpb.TriggerTiming', '*scpb.TriggerTransition', '*scpb.TriggerWhen']
    - joinOnTriggerID($trigger, $dependents, $table-id, $trigger-id)
    - toAbsent($trigger-Target, $dependents-Target)
    - $trigger-Node[CurrentStatus] = ABSENT
    - $dependents-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($trigger, $trigger-Target, $trigger-Node)
    - joinTargetNode($dependents, $dependents-Target, $dependents-Node)
- name: trigger removed before dependents
  from: trigger-Node
  kind: Precedence
  to: dependents-Node
  query:
    - $dependents[Type] = '*scpb.Trigger'
    - $trigger[Type] IN ['*scpb.TriggerDeps', '*scpb.TriggerEnabled', '*scpb.TriggerEvents', '*scpb.TriggerFunctionCall', '*scpb.TriggerName', '*scpb.TriggerTiming', '*scpb.TriggerTransition', '*scpb.TriggerWhen']
    - joinOnTriggerID($trigger, $dependents, $table-id, $trigger-id)
    - transient($trigger-Target, $dependents-Target)
    - $trigger-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $dependents-Node[CurrentStatus] = TRANSIENT_PUBLIC
    - joinTargetNode($trigger, $trigger-Target, $trigger-Node)
    - joinTargetNode($dependents, $dependents-Target, $dependents-Node)
- name: trigger removed before dependents
  from: trigger-Node
  kind: Precedence
  to: dependents-Node
  query:
    - $dependents[Type] = '*scpb.Trigger'
    - $trigger[Type] IN ['*scpb.TriggerDeps', '*scpb.TriggerEnabled', '*scpb.TriggerEvents', '*scpb.TriggerFunctionCall', '*scpb.TriggerName', '*scpb.TriggerTiming', '*scpb.TriggerTransition', '*scpb.TriggerWhen']
    - joinOnTriggerID($trigger, $dependents, $table-id, $trigger-id)
    - $trigger-Target[TargetStatus] = TRANSIENT_ABSENT
    - $trigger-Node[CurrentStatus] = TRANSIENT_ABSENT
    - $dependents-Target[TargetStatus] = ABSENT
    - $dependents-Node[CurrentStatus] = PUBLIC
    - joinTargetNode($trigger, $trigger-Target, $trigger-Node)
    - joinTargetNode($dependents, $dependents-Target, $dependents-Node)
- name: trigger removed before dependents
  from: trigger-Node
  kind: Precedence
  to: dependents-Node
  query:
    - $dependents[Type] = '*scpb.Trigger'
    - $trigger[Type] IN ['*scpb.TriggerDeps', '*scpb.TriggerEnabled', '*scpb.TriggerEvents', '*scpb.TriggerFunctionCall', '*scpb.TriggerName', '*scpb.TriggerTiming', '*scpb.TriggerTransition', '*scpb.TriggerWhen']
    - joinOnTriggerID($trigger, $dependents, $table-id, $trigger-id)
    - $trigger-Target[TargetStatus] = ABSENT
    - $trigger-Node[CurrentStatus] = ABSENT
    - $dependents-Target[TargetStatus] = TRANSIENT_ABSENT
    - $dependents-Node[CurrentStatus] = TRANSIENT_PUBLIC
    - joinTargetNode($trigger, $trigger-Target, $trigger-Node)
    - joinTargetNode($dependents, $dependents-Target, $dependents-Node)
