retrofit0.10.0-wip.8

SMO Catalog and Status

Every Schema Modification Operator (SMO) against PostgreSQL’s DDL surface, and whether its descriptor is registered in internal/oplog/catalog/operators.go, the source of truth. op info <Op> prints an operator’s catalog entry: its inverse, its tier and what it preserves. Which verbs author, recognize, render or refuse each SMO is in the per-verb references: import.md, drift.md, snapshot.md, migrate.md.

Status

CodeMeaning
✓Implemented in internal/oplog/catalog/operators.go.
not registeredNo descriptor in operators.go. The Notes column says what is not available and why.
N/A:reasonOut of scope by construction (:no-pg-primitive; :no-relational-analog for NoSQL/JSONB; :physical-surface for cluster/storage). The reason token is bare; any qualifying prose belongs in the Notes column.

In the Local name column, “none” means no registered operator carries the SMO.

Authoring data-motion SMOs. The five structural data-motion ops (CopyTable, ExtractTable, JoinTable, SplitTable, MergeTable) are first-class via op add + snapshot. Two recognizers surface a subset: drift offers accept candidates for Copy, Join, Merge, and the Extract consume arm from end-state diffs. The Extract survivor extract is advisory-only: drift-survivor-extract-unrecognized offers drop-add alone, never accept. Split is excluded: its row-axis intent is invisible in a snapshot pair. import recognizes a solid-match ExtractTable from authored-script data-flow signals (the other shapes defer to op add with an import-data-motion-deferred advisory). See drift.md and import.md § “Data-motion SMOs” for the authoring recipe and per-verb recognition behavior.

Catalog

SMOLocal nameStatusNotes
Schema
CreateSchemaCreateSchema✓Root element.
Table
CreateTableCreateTable✓Carries reference_data=true|false. Required on the wire: a verb reading an oplog line that omits it refuses with missing-required; a mint the author leaves off writes false. Reference-ness is an oplog attribute, not configuration: it travels with the schema’s history and re-cuts with it. Mutated afterwards by SetReferenceData.
DropTableDropTable✓import mints for each tracked-live target in bare or IF EXISTS form; an ordinary absent IF EXISTS target is suppressed. Still-active deferred-data-motion targets keep their recorded disposition.
RenameTableRenameTable✓Minted by import from ALTER TABLE … RENAME TO.
CopyTableCopyTable✓Whole-table duplication; the copy and the source are independent identities from the op forward. On a GENERATED ALWAYS identity column, migrate emits OVERRIDING SYSTEM VALUE on the INSERT … SELECT and a guarded setval aligning the copy’s fresh sequence to the copied max, so later inserts do not collide with the copied rows.
ExtractTableExtractTable✓Column-axis split: the source survives or is consumed, by remainder presence; each child copies the source primary key or is a lookup keyed by key. See ExtractTable arms. A sparse child (a row only where a moved value is present) is not an arm: author it as a keyed MoveColumn per column, as migrate.md § “Splitting an optional attribute into a sparse child table” shows.
InlineTableInlineTable✓Keyed column fold. Keeps the live table on (ElementID, birth op, rows, keys and name) and inlines each of sources into it along a recorded primary-key-to-primary-key pairing (key_pairs), then consumes that source: its other columns reparent onto the survivor with their ElementIDs and its paired key columns die with it. Mints nothing and renames nothing. A survivor row with no inlined row is padded with NULL or the column’s default; an inlined row with no survivor row is refused. The data-motion-keyed-fold advisory names the pad. Lookup arm: a source the survivor holds a foreign key onto, over survivor columns that are not its primary key, is the many-to-one fold of a shared-value child; the arm is read from the foreign key at the input cut and no parameter names it. Each survivor row takes its moved values from the one lookup row it references; a lookup row no survivor row references is deleted, graded certain (data-loss-on-apply under loss_cause unreferenced-lookup-rows).
JoinTableJoinTable✓Column-axis join along a join predicate. Joining ExtractTable’s children keeps both key columns and, under kind=full, demotes the source primary key to UNIQUE. Binary; carries predicate (SQL ON-clause) and kind ∈ {inner, left, right, full}.
UnjoinTableUnjoinTable✓Keyed table unjoin: takes a join apart along the keys its sides hold. Consumes one live table and mints exactly two children, each live column going to one child with its ElementID; the recorded keys designate each child’s key (a UNIQUE the join demoted returns as the PRIMARY KEY it was), key_pairs records the pairing, not_null_columns restores the NOT NULLs the join relaxed, and kind records the join kind (default full).
SplitTableSplitTable✓Row-axis split refactoring. Moves rows of a source it keeps (the source stays live under its ElementID and name) into N new tables of its shape, each row to the first piece whose --conditions predicate takes it. The record carries one {predicate} per piece; a row no piece takes stays in the source, and a source row is moved exactly once. PG declarative partitioning (PARTITION OF, PARTITION BY) is a physical storage attribute of a persisting table and is owned by PartitionTable, CreatePartition, AttachPartition and DetachPartition, not this op. migrate renders one block that creates the pieces, routes the rows with one statement, and copies them. A piece’s sequence starts at the source’s position; the data-motion-fresh-sequences advisory names it at op add.
MergeTableMergeTable✓Row-axis merge. Moves the rows of each source into a live into table of their shape, one --conditions predicate recorded per source; every source ends and into keeps its ElementID and name. A merge mints nothing, so op add takes <sources> <into> and no id. migrate renders one block that moves each source’s rows into into and drops the sources; the data-motion-source-consumed advisory names the ended sources. A merge mints no sequence, so it raises no data-motion-fresh-sequences advisory.
MoveColumn (simple)MoveColumn✓Cross-table relocation of an unreferenced column (no PK/FK/UNIQUE/CHECK/index participation). Identity-preserving: the column’s ElementID is unchanged across the move; only the parent table changes. MoveColumn does not rename: rename is RenameColumn, authored separately.
MoveColumn (constraint-bearing)nonenot registeredNot available: relocating a column that a key, constraint or index depends on. MoveColumn (row above) takes only an unreferenced column.
CreatePartitionCreatePartition✓Born-as-child PARTITION OF declaration under a partitioned parent; supports sub-partitioned (MIDDLE vertex) via optional partition_by / partition_columns / partition_expression.
AttachPartitionAttachPartition✓PG declarative partitioning; subordinates a free-standing table as a partition; instant with pre-existing CHECK. Ends the partition’s columns, which take the parent’s column of the same name, and mints nothing; the partition keeps its column order and per-column DEFAULT, NOT NULL, comment and generation expression.
DetachPartitionDetachPartition✓PG 14+ CONCURRENTLY two-txn model (concurrently param). Mints the detached table’s fresh columns and CHECKs, their IDs recorded in column-ids and adjacent-ids.
PartitionTable (convert)PartitionTable✓Identity-preserving convert (plain → partitioned parent), minting N partitions atomically. Not PRISM SplitTable (the parent persists; this is a storage convert, not a row-axis split).
DepartitionTable (convert)DepartitionTable✓Convert (partitioned parent → plain heap).
SetUnlogged / SetLoggednonenot registeredNot available. PostgreSQL rewrites the whole table under ACCESS EXCLUSIVE.
SetAccessMethodnonenot registeredNot available. Changing the access method (heap ↔ columnar) rewrites the whole table.
Column
AddColumnAddColumn✓Carries name, type, not_null, default, identity.
DropColumnDropColumn✓Minted by import from ALTER TABLE … DROP COLUMN.
RenameColumnRenameColumn✓Minted by import from ALTER TABLE … RENAME COLUMN.
RenameOwnedSequenceRenameOwnedSequence✓Renames the sequence a serial or identity column owns (ALTER SEQUENCE … RENAME TO); the column keeps its name and values. Minted by import from a rename of an owned sequence; a rename of any other sequence stays skipped.
CastColumn / ChangeTypeCastColumn✓ALTER COLUMN SET DATA TYPE … USING. Optional reverse (refuse, coerce) sets the down’s outcome for rows written after the cast; see migrate --down.
CopyColumnCopyColumn✓Same-table column duplication; mints a new column with type/default/nullability inherited from source unless overridden.
SetDefaultSetDefault✓Post-creation default; gates import/drift fidelity.
DropDefaultDropDefault✓Single-slot semantics.
SetColumnCommentSetColumnComment✓pg_dump round-trip.
SetTableCommentSetTableComment✓pg_dump round-trip.
SetReferenceDataSetReferenceData✓Mutates a live table’s reference_data attribute after birth: SetReferenceData(… on=<table>, value=true|false). Minted by retrofit schema ref-tables add|remove <table>, and by import/drift under --ref <table> for a table the run does not itself create. Refuses reference-data-partition on an attached partition child, naming the root to declare instead: an attached child answers its root’s value, and a detached one reverts to its own.
WitnessReferenceDataWitnessReferenceData✓Attests one reference record’s bytes at its key: WitnessReferenceData(… on=<table>, anchor=<opid>, labels=[…], digest="sha256:<64 hex>"). Written only by retrofit data witness (op add refuses it by name); renders nothing (FootprintNone). A governing witness is verified at validate, op seal, migrate and snapshot: a sealed record whose bytes no longer match is data-witness-mismatch.
SetColumnPosition / AddColumn position=noneN/A:no-pg-primitiveColumn ordinals; PG has no native reorder primitive.
AddIdentityAddIdentity✓Add identity to existing column; PG 17 forces rewrite. The minted backing sequence starts at 1 and PG does not advance it past the column’s existing values, so migrate emits a setval realignment after the ALTER (no-op on an empty table).
DropIdentityDropIdentity✓Remove identity property.
SetIdentityGenerationSetIdentityGeneration✓BY DEFAULT ↔ ALWAYS.
SetGeneratedExpressionnoneN/A:no-pg-primitiveConceptually drop+add at the op level: DropGeneratedExpression + AddColumn(generated_as=…). PG 17+ ALTER COLUMN ... SET EXPRESSION AS is a snapshot-emitter coalesce target, not a typed op.
DropGeneratedExpressionDropGeneratedExpression✓Stored generated → base column (PG 13+ DROP EXPRESSION). A virtual generated column (PG 18) is refused; drop and re-add it instead.
Constraint
AddPrimaryKey / PromoteKeyAddPrimaryKey✓
DropPrimaryKey / DemoteKeyDropPrimaryKey✓
AddForeignKey / AddReferenceAddForeignKey✓on_delete, on_update, match, deferrable, initially, not_valid; all six are carried by drift. A facet at its PG default is omitted, so no_action / simple are unreachable from the drift path.
DropForeignKey / DeleteReferenceDropForeignKey✓Optional reverse policy (refuse, not_valid or coerce per its row) sets the down’s outcome for rows written after the relaxation; see migrate --down.
AddCheckAddCheck✓Row-level predicate.
AddUniqueAddUnique✓Column-list UNIQUE; carries optional deferrable / initially.
AddNotNullAddNotNull✓Column-attribute write of the NOT NULL bit. Optional fill= sets each NULL to the value first, the roll-forward of a DropNotNull reverse=coerce; see migrate --down. On a column whose type is a domain over a composite type the fill is not refused (a domain is unmodelled), and IS NULL is row-wise there: the fill overwrites a value whose fields are all NULL, a value NOT NULL admits.
DropCheckDropCheck✓Drops a CHECK constraint; refuses a constraint of any other kind. Optional reverse policy (refuse, not_valid or coerce per its row) sets the down’s outcome for rows written after the relaxation; see migrate --down.
DropUniqueDropUnique✓Drops a UNIQUE constraint; refuses a constraint of any other kind. A UNIQUE USING INDEX constraint takes its adopted index with it. Optional reverse policy (refuse, coerce) sets the down’s outcome for rows written after the relaxation; see migrate --down.
DropNotNullDropNotNull✓Column-attribute clear of the NOT NULL bit. Optional reverse policy (refuse, not_valid or coerce per its row) sets the down’s outcome for rows written after the relaxation; see migrate --down. coerce takes fill=; not_valid returns a CHECK (<column> IS NOT NULL) NOT VALID carrier named by name= (default <table>_<column>_not_null_check). On a column whose type is a domain over a composite type neither is refused (a domain is unmodelled), and IS NULL is row-wise there: the fill overwrites a value whose fields are all NULL, and the carrier rejects one holding any NULL field, each a value NOT NULL admits; the carrier’s gap query lists only the all-NULL values.
RenameConstraintRenameConstraint✓ALTER TABLE … RENAME CONSTRAINT.
ChangePrimaryKeyChangePrimaryKey✓DropPrimaryKey + AddPrimaryKey composition produces two disconnected hyperedges in the genealogy graph; ChangePrimaryKey mints EdgeKindCrossElement linking pk_old → pk_new. Explicit-orchestration of dependent FKs (one SMO, one outcome); migrate refuses with migrate-change-primary-key-dangling-fk envelope when dependents are dangling.
SetConstraintDeferrableSetConstraintDeferrable✓FK-only deferrable toggle; UNIQUE / PK can be born deferrable via AddUnique / AddPrimaryKey but cannot be toggled post-birth (PG ALTER CONSTRAINT is FK-only).
SetConstraintInitiallyDeferredSetConstraintInitiallyDeferred✓FK-only timing toggle; same scope rule as SetConstraintDeferrable.
SetConstraintEnforcedSetConstraintEnforced✓PG 18 only; foreign-key toggle (PostgreSQL alters enforceability of FKs only). Optional reverse policy (refuse, not_valid or coerce per its row) sets the down’s outcome for rows written after the relaxation; see migrate --down.
SetConstraintInheritSetConstraintInherit✓PG 18 only; NOT NULL inheritance. Records lineage only: it emits no DDL and does not set the bit.
SetConstraintCommentSetConstraintComment✓pg_dump round-trip: import and drift read COMMENT ON CONSTRAINT … ON <table> for a primary key, foreign key, unique or check; PostgreSQL’s <table>_pkey names an unnamed primary key. RenameConstraint and the reshapes that move a constraint keep the comment, ChangePrimaryKey keeps a re-minted foreign key’s; dropping the constraint ends it. A PostgreSQL 18 named NOT NULL’s comment and a domain constraint’s stay skipped.
ValidateConstraintValidateConstraint✓ALTER TABLE … VALIDATE CONSTRAINT; pairs with the not_valid two-phase add on AddForeignKey / AddCheck.
SetReplicaIdentitySetReplicaIdentity✓Logical-replication WAL output.
Index
CreateIndexCreateIndex✓unique, method, partial predicate, nulls_not_distinct, per-key key_collations / key_opclasses, WITH storage_params.
DropIndexDropIndex✓import mints for each tracked-live target in bare or IF EXISTS form; an absent IF EXISTS target is suppressed. Optional reverse policy (refuse, coerce) sets the down’s outcome for rows written after the relaxation; see migrate --down.
RenameIndexRenameIndex✓Minted by import from ALTER INDEX … RENAME TO.
ModifyIndex (definition change)nonenot registeredNot available as one op: a definition change is a DropIndex and a CreateIndex.
Type
CreateType kind=enum / CreateEnumCreateType✓pg_dump round-trip; kind=enum carries values.
DropType / DropEnumDropType✓import evaluates each IF EXISTS target at its source position and mints only tracked-live targets. RuleNoLiveReferences: refused if any live column binds to the type.
RenameTypeRenameType✓Identity-preserving across rename.
AddEnumValueAddEnumValue✓BEFORE/AFTER positioning (mutually exclusive); CommitBoundary discipline.
RenameEnumValueRenameEnumValue✓from/to.
CreateType kind=domainnonenot registeredNot available: domains are not modelled, so a domain’s CHECK and DEFAULT bodies have no element-ID-keyed shape. CreateType covers kind=enum and kind=composite.
CreateType kind=compositeCreateType✓Born complete: attribute mutations require Drop+Create (deliberate exclusion: composite fields have no first-class identity to carry across a mutation). Import routes ALTER TYPE … {ADD|DROP|ALTER} ATTRIBUTE to the skip manifest as alter-type-attribute.
EnumDropValuenoneN/A:no-pg-primitiveNo clean PG dual-state path; permanent content loss.
View
CreateViewCreateView✓pg_dump round-trip.
DropViewDropView✓Minted by import from DROP VIEW.
RenameViewRenameView✓Minted by import from ALTER VIEW … RENAME TO.
ReplaceViewReplaceView✓CREATE OR REPLACE VIEW.
CreateMaterializedViewCreateMaterializedView✓Body element-ID-keyed; optional columns param (PG infers from SELECT when absent).
ReplaceMaterializedViewReplaceMaterializedView✓Artificial at the PG layer: no CREATE OR REPLACE MATERIALIZED VIEW exists; compiles to DROP MATERIALIZED VIEW [CASCADE] + CREATE MATERIALIZED VIEW. ElementID survives at the retrofit layer; cascade obligation surfaces at migrate-emit. Matview analogue of ChangePrimaryKey.
RenameMaterializedViewRenameMaterializedView✓Direct map to ALTER MATERIALIZED VIEW … RENAME TO; identity-preserving.
DropMaterializedViewDropMaterializedView✓
SetViewOptionnonenot registeredNot available (op info --dump lists every registered name). The PostgreSQL surface is ALTER VIEW … SET (option=…) / RESET (option) for security_invoker (PG 15+), security_barrier and check_option.
Other element kinds
Sequences (Create/Alter/Rename/Drop)noneN/A:no-pg-primitiveCatalog-only metadata at the op level. Identity reaches the wire via AddColumn(identity=…). Standalone sequences round-trip via the structured skip manifest.
Functions / Procedures (Create/Replace/Rename/Drop)CreateFunction / ReplaceFunction / RenameFunction / DropFunction✓PL/pgSQL parsing surface; bodies element-ID-keyed. Signature is identity-fixed (ReplaceFunction cannot change it).
SetFunctionCommentSetFunctionComment✓pg_dump round-trip: import and drift read COMMENT ON FUNCTION, pg_dump’s f(n integer) spelling included; a bare COMMENT ON FUNCTION f binds only when one overload of f is live. ReplaceFunction and RenameFunction keep the comment; DropFunction ends it.
Triggers (Create/Rename/Drop, Enable/Disable)CreateTrigger / RenameTrigger / EnableTrigger / DisableTrigger / DropTrigger✓Depends on functions; WHEN clause element-ID-keyed. CreateTrigger carries REFERENCING OLD/NEW TABLE as old_table / new_table.
Policies (Create/Replace/Rename/Drop, SetRowLevelSecurity)CreatePolicy / ReplacePolicy / RenamePolicy / DropPolicy / SetRowLevelSecurity✓RLS; USING / WITH CHECK expression bodies element-ID-keyed. ReplacePolicy cannot change permissive or command (use Drop+Create).
RunRawScript (DO $$ … $$; anonymous blocks)RunRawScript✓Escape hatch below the Structural/Definitional partition; CategoryOpaque, content-addressed body via ContentHash / DialectPgSQLOpaque. import mints from a DO fall-through; migrate emits verbatim under -- retrofit:raw; snapshot omits it (run-once is not current state, stderr advisory names the count); drift never synthesizes it. op add emits no data-loss advisory for it. An optional reverse_body (another single DO block, validated like body; import never mints one) is the author-declared reverse: migrate --down emits it verbatim under the same marker with a reverse-opaque note, and without it the down refuses, naming the op.
Privileges (Grant/Revoke/AlterDefault/Reassign/AlterOwner)nonenot registeredNot available. Access control is outside structural evolution and is usually handled by the deployment system.
CreateExtensionCreateExtension✓CREATE EXTENSION IF NOT EXISTS … [WITH SCHEMA …] [VERSION '…'] [CASCADE]; placement schema pre-created via CREATE SCHEMA IF NOT EXISTS.
DropExtensionDropExtension✓DROP EXTENSION IF EXISTS … [CASCADE].
NoSQL-only
SplitEntityType / MergeEntityType / ExtractEntityTypenoneN/A:no-relational-analogRelational analog already covered.
CastReference / MultReferencenoneN/A:no-relational-analogCardinality is structural in relational.
MultAggregatenoneN/A:no-relational-analogNoSQL aggregate model not adopted.
Adapt / Union (variations)noneN/A:no-relational-analogNo relational equivalent.
CastFeaturenoneN/A:no-relational-analogRelational analog is CastColumn.
MorphReference / MorphAggregatenoneN/A:no-relational-analogDocument-model reshape.
JSONB-pathway
AddAggregate / DeleteAggregatenoneN/A:no-relational-analog
NestFeature / UnnestFeaturenoneN/A:no-relational-analog
MorphRefToAggr / MorphAggrToRefnoneN/A:no-relational-analog
ChangeMultiplicitynoneN/A:no-relational-analog
DeleteVariation (Delvar)noneN/A:no-relational-analog
Cluster-scope / physical / language
CREATE DATABASE / TABLESPACE / FDW / collationsnoneN/A:physical-surfaceOutside the project’s evolution boundary.
Operator-system extensibility (CREATE OPERATOR / CAST / AGGREGATE / LANGUAGE)noneN/A:physical-surfaceSQL-language surface.
SET STORAGE / SET COMPRESSION / REINDEXnoneN/A:physical-surfacePhysical-storage knob.
CLUSTER ON / SET WITHOUT CLUSTERnoneN/A:physical-surfacePhysical-cluster affinity; same class as SET STORAGE.
REFRESH MATERIALIZED VIEWnoneN/A:physical-surfaceReplaces a materialized view’s rows and changes no catalog state, the same class as REINDEX, CLUSTER, VACUUM and TRUNCATE. import routes it to the skip manifest, as it does VACUUM.
OF / NOT OF (typed-table binding)noneN/A:physical-surfaceComposite-type row binding.
Lossy
NarrowingCastWithIntendedDataLossnoneN/A:no-pg-primitiveCastColumn is the value-preserving form.
Log
SealSeal✓Log-integrity, not schema.

Rollup

BucketCountComposition
✓ Implemented86 registered ops in operators.go (87 with Seal)Table family (Create/Drop/Rename/Copy/Extract/Inline/Join/Unjoin/Split/Merge, MoveColumn-simple); declarative partitioning (CreatePartition / AttachPartition / DetachPartition / PartitionTable / DepartitionTable); column family (Add/Drop/Rename/Cast/CopyColumn, RenameOwnedSequence); CreateSchema; index family (Create/Drop/Rename); view family (Create/Drop/Rename/Replace); materialized-view family (Create/Replace/Rename/Drop); column attribute-update family (SetDefault/DropDefault, AddIdentity/DropIdentity/SetIdentityGeneration, AddNotNull/DropNotNull, DropGeneratedExpression, SetColumnComment/SetTableComment); constraint family (AddPrimaryKey/DropPrimaryKey, ChangePrimaryKey, AddForeignKey/DropForeignKey, AddCheck/DropCheck, AddUnique/DropUnique, AddNotNull/DropNotNull, ValidateConstraint); constraint-attribute family (RenameConstraint, SetConstraintDeferrable, SetConstraintInitiallyDeferred, SetConstraintEnforced, SetConstraintInherit, SetConstraintComment); SetReplicaIdentity; type family (CreateType enum/composite, AddEnumValue, RenameEnumValue, RenameType, DropType); function/trigger family (Create/Replace/Rename/Drop Function, Create/Rename/Enable/Disable/Drop Trigger, SetFunctionComment); policy family (Create/Replace/Rename/Drop Policy, SetRowLevelSecurity); extension family (CreateExtension / DropExtension); RunRawScript; SetReferenceData; WitnessReferenceData; Seal.
not registered7SetViewOption, MoveColumn (constraint-bearing), SetUnlogged/SetLogged, SetAccessMethod, ModifyIndex, CreateType kind=domain, privileges.
N/A~35NoSQL-only (:no-relational-analog), JSONB-pathway (:no-relational-analog), operator-system extensibility / cluster-scope DDL / physical-storage knobs / data-axis maintenance ops (REFRESH MATERIALIZED VIEW, REINDEX, CLUSTER, VACUUM, TRUNCATE) / typed-table binding (:physical-surface), sequences (catalog-only metadata; :no-pg-primitive at op level), EnumDropValue, lossy narrowing, SetColumnPosition, SetGeneratedExpression, SO-tgd composition (:no-pg-primitive).

The ✓ count is the r.Register(...) total in registerOperators() in operators.go; operators_partition.go and operators_function_trigger.go hold descriptor constructors, not registrations. Aliases (PromoteKey = AddPrimaryKey; Delvar = DeleteVariation) are folded or excluded. Each constraint outcome (AddUnique, AddCheck, AddNotNull) is its own operator, and so is each drop (DropUnique, DropCheck, DropNotNull). CreateType is one registered op covering kind=enum and kind=composite.

ExtractTable arms

Authored name-based via --into <child>=<cols> / --rest, ExtractTable splits a table along its columns; see drift.md for the authoring recipe. Remainder presence decides what happens to the source, and each child either copies the source primary key or is a lookup.

Survivor arm (live columns left unassigned, or an explicit --rest). The source survives in place holding the unassigned columns, keeping its ElementID, PK constraint name, inbound FKs, triggers, privileges and table OID; only the --into children mint. --rest <name> renames the survivor in place; it never names a minted child.

Consume arm (every live column assigned, no designation). The source is consumed (PRISM EXTRACT TABLE shape). A partitioned parent or a partition is refused as its source, at op add and at replay (extract-partitioned-source): run DepartitionTable or DetachPartition first, or leave a parent’s partition key on it so the source survives.

Copy-PK child (one with no key). Every copy-PK child except the primary-key holder carries a copy of the source primary key (its own primary key, foreign key back to the holder), so a PK-less source gives it nothing to copy; extract-source-no-primary-key refuses a PK-less source at op add on both source arms. That foreign key has no ON DELETE action and the forward gives every holder row a child row, so after it no existing holder row can be deleted, a parent’s ON DELETE CASCADE into the holder included (the extract-rejoin-key-no-delete-action note names the keys).

Lookup child (one designating key with --key from=<source column>,in=<child>, repeated in key order). It is keyed by those non-primary-key columns it shares with the source and takes one row per distinct non-NULL key value. The output holding the key columns gets a foreign key to it, a key-only child is named --into "<child>=", and source rows with a NULL key column lose their moved values (the data-loss advisory names them).

Extracting an identity-bearing column is refused on the same surface, op add; ExtractTable takes no sequence alignment, since it copies no identity column.

Before 1.0, any release may change behavior; the release notes list what changed.