exec-ddl
CREATE TABLE abcde (
    a INT NOT NULL,
    b INT,
    c INT NOT NULL DEFAULT (10),
    d INT AS (b + c + 1) STORED,
    "e:write-only" INT NOT NULL
)
----
TABLE abcde
 ├── a int not null
 ├── b int
 ├── c int not null
 ├── d int
 ├── rowid int not null (hidden)
 ├── e int not null (mutation)
 └── INDEX primary
      └── rowid int not null (hidden)

exec-ddl
CREATE TABLE xyz (
    x TEXT PRIMARY KEY,
    y INT8 NOT NULL,
    z FLOAT8
)
----
TABLE xyz
 ├── x string not null
 ├── y int not null
 ├── z float
 └── INDEX primary
      └── x string not null

# Properties with no RETURNING clause.
build
UPDATE abcde SET b=10 WHERE a=1
----
update abcde
 ├── columns: <none>
 ├── fetch columns: a:7(int) b:8(int) c:9(int) d:10(int) rowid:11(int) e:12(int)
 ├── update-mapping:
 │    ├──  column13:13 => b:2
 │    └──  column14:14 => d:4
 ├── cardinality: [0 - 0]
 ├── side-effects, mutations
 └── project
      ├── columns: column14:14(int) a:7(int!null) b:8(int) c:9(int!null) d:10(int) rowid:11(int!null) e:12(int) column13:13(int!null)
      ├── key: (11)
      ├── fd: ()-->(7,13), (11)-->(8-10,12), (9)-->(14)
      ├── prune: (7-14)
      ├── interesting orderings: (+11)
      ├── project
      │    ├── columns: column13:13(int!null) a:7(int!null) b:8(int) c:9(int!null) d:10(int) rowid:11(int!null) e:12(int)
      │    ├── key: (11)
      │    ├── fd: ()-->(7,13), (11)-->(8-10,12)
      │    ├── prune: (7-13)
      │    ├── interesting orderings: (+11)
      │    ├── select
      │    │    ├── columns: a:7(int!null) b:8(int) c:9(int!null) d:10(int) rowid:11(int!null) e:12(int)
      │    │    ├── key: (11)
      │    │    ├── fd: ()-->(7), (11)-->(8-10,12)
      │    │    ├── prune: (8-12)
      │    │    ├── interesting orderings: (+11)
      │    │    ├── scan abcde
      │    │    │    ├── columns: a:7(int!null) b:8(int) c:9(int!null) d:10(int) rowid:11(int!null) e:12(int)
      │    │    │    ├── key: (11)
      │    │    │    ├── fd: (11)-->(7-10,12)
      │    │    │    ├── prune: (7-12)
      │    │    │    └── interesting orderings: (+11)
      │    │    └── filters
      │    │         └── eq [type=bool, outer=(7), constraints=(/7: [/1 - /1]; tight), fd=()-->(7)]
      │    │              ├── variable: a [type=int]
      │    │              └── const: 1 [type=int]
      │    └── projections
      │         └── const: 10 [type=int]
      └── projections
           └── plus [type=int, outer=(9,13)]
                ├── plus [type=int]
                │    ├── variable: column13 [type=int]
                │    └── variable: c [type=int]
                └── const: 1 [type=int]

# Properties with RETURNING clause.
build
UPDATE abcde SET b=10 WHERE a=1 RETURNING *
----
project
 ├── columns: a:1(int!null) b:2(int!null) c:3(int!null) d:4(int)
 ├── side-effects, mutations
 ├── fd: ()-->(1,2), (3)-->(4)
 ├── prune: (1-4)
 └── update abcde
      ├── columns: a:1(int!null) b:2(int!null) c:3(int!null) d:4(int) rowid:5(int!null)
      ├── fetch columns: a:7(int) b:8(int) c:9(int) d:10(int) rowid:11(int) e:12(int)
      ├── update-mapping:
      │    ├──  column13:13 => b:2
      │    └──  column14:14 => d:4
      ├── side-effects, mutations
      ├── key: (5)
      ├── fd: ()-->(1,2), (5)-->(3,4), (3)-->(4)
      └── project
           ├── columns: column14:14(int) a:7(int!null) b:8(int) c:9(int!null) d:10(int) rowid:11(int!null) e:12(int) column13:13(int!null)
           ├── key: (11)
           ├── fd: ()-->(7,13), (11)-->(8-10,12), (9)-->(14)
           ├── prune: (7-14)
           ├── interesting orderings: (+11)
           ├── project
           │    ├── columns: column13:13(int!null) a:7(int!null) b:8(int) c:9(int!null) d:10(int) rowid:11(int!null) e:12(int)
           │    ├── key: (11)
           │    ├── fd: ()-->(7,13), (11)-->(8-10,12)
           │    ├── prune: (7-13)
           │    ├── interesting orderings: (+11)
           │    ├── select
           │    │    ├── columns: a:7(int!null) b:8(int) c:9(int!null) d:10(int) rowid:11(int!null) e:12(int)
           │    │    ├── key: (11)
           │    │    ├── fd: ()-->(7), (11)-->(8-10,12)
           │    │    ├── prune: (8-12)
           │    │    ├── interesting orderings: (+11)
           │    │    ├── scan abcde
           │    │    │    ├── columns: a:7(int!null) b:8(int) c:9(int!null) d:10(int) rowid:11(int!null) e:12(int)
           │    │    │    ├── key: (11)
           │    │    │    ├── fd: (11)-->(7-10,12)
           │    │    │    ├── prune: (7-12)
           │    │    │    └── interesting orderings: (+11)
           │    │    └── filters
           │    │         └── eq [type=bool, outer=(7), constraints=(/7: [/1 - /1]; tight), fd=()-->(7)]
           │    │              ├── variable: a [type=int]
           │    │              └── const: 1 [type=int]
           │    └── projections
           │         └── const: 10 [type=int]
           └── projections
                └── plus [type=int, outer=(9,13)]
                     ├── plus [type=int]
                     │    ├── variable: column13 [type=int]
                     │    └── variable: c [type=int]
                     └── const: 1 [type=int]

# Input is cardinality 0-1 expression.
build
UPDATE abcde SET b=10 WHERE rowid=1 RETURNING *
----
project
 ├── columns: a:1(int!null) b:2(int!null) c:3(int!null) d:4(int)
 ├── cardinality: [0 - 1]
 ├── side-effects, mutations
 ├── key: ()
 ├── fd: ()-->(1-4)
 ├── prune: (1-4)
 └── update abcde
      ├── columns: a:1(int!null) b:2(int!null) c:3(int!null) d:4(int) rowid:5(int!null)
      ├── fetch columns: a:7(int) b:8(int) c:9(int) d:10(int) rowid:11(int) e:12(int)
      ├── update-mapping:
      │    ├──  column13:13 => b:2
      │    └──  column14:14 => d:4
      ├── cardinality: [0 - 1]
      ├── side-effects, mutations
      ├── key: ()
      ├── fd: ()-->(1-5)
      └── project
           ├── columns: column14:14(int) a:7(int!null) b:8(int) c:9(int!null) d:10(int) rowid:11(int!null) e:12(int) column13:13(int!null)
           ├── cardinality: [0 - 1]
           ├── key: ()
           ├── fd: ()-->(7-14)
           ├── prune: (7-14)
           ├── interesting orderings: (+11)
           ├── project
           │    ├── columns: column13:13(int!null) a:7(int!null) b:8(int) c:9(int!null) d:10(int) rowid:11(int!null) e:12(int)
           │    ├── cardinality: [0 - 1]
           │    ├── key: ()
           │    ├── fd: ()-->(7-13)
           │    ├── prune: (7-13)
           │    ├── interesting orderings: (+11)
           │    ├── select
           │    │    ├── columns: a:7(int!null) b:8(int) c:9(int!null) d:10(int) rowid:11(int!null) e:12(int)
           │    │    ├── cardinality: [0 - 1]
           │    │    ├── key: ()
           │    │    ├── fd: ()-->(7-12)
           │    │    ├── prune: (7-10,12)
           │    │    ├── interesting orderings: (+11)
           │    │    ├── scan abcde
           │    │    │    ├── columns: a:7(int!null) b:8(int) c:9(int!null) d:10(int) rowid:11(int!null) e:12(int)
           │    │    │    ├── key: (11)
           │    │    │    ├── fd: (11)-->(7-10,12)
           │    │    │    ├── prune: (7-12)
           │    │    │    └── interesting orderings: (+11)
           │    │    └── filters
           │    │         └── eq [type=bool, outer=(11), constraints=(/11: [/1 - /1]; tight), fd=()-->(11)]
           │    │              ├── variable: rowid [type=int]
           │    │              └── const: 1 [type=int]
           │    └── projections
           │         └── const: 10 [type=int]
           └── projections
                └── plus [type=int, outer=(9,13)]
                     ├── plus [type=int]
                     │    ├── variable: column13 [type=int]
                     │    └── variable: c [type=int]
                     └── const: 1 [type=int]

# Filter FD set.
build
UPDATE abcde SET a=1 WHERE b=c RETURNING *;
----
project
 ├── columns: a:1(int!null) b:2(int!null) c:3(int!null) d:4(int)
 ├── side-effects, mutations
 ├── fd: ()-->(1), (2)==(3), (3)==(2), (2)-->(4)
 ├── prune: (1-4)
 └── update abcde
      ├── columns: a:1(int!null) b:2(int!null) c:3(int!null) d:4(int) rowid:5(int!null)
      ├── fetch columns: a:7(int) b:8(int) c:9(int) d:10(int) rowid:11(int) e:12(int)
      ├── update-mapping:
      │    ├──  column13:13 => a:1
      │    └──  column14:14 => d:4
      ├── side-effects, mutations
      ├── key: (5)
      ├── fd: ()-->(1), (2)==(3), (3)==(2), (5)-->(2-4), (2)-->(4)
      └── project
           ├── columns: column14:14(int) a:7(int!null) b:8(int!null) c:9(int!null) d:10(int) rowid:11(int!null) e:12(int) column13:13(int!null)
           ├── key: (11)
           ├── fd: ()-->(13), (11)-->(7-10,12), (8)==(9), (9)==(8), (8,9)-->(14)
           ├── prune: (7-14)
           ├── interesting orderings: (+11)
           ├── project
           │    ├── columns: column13:13(int!null) a:7(int!null) b:8(int!null) c:9(int!null) d:10(int) rowid:11(int!null) e:12(int)
           │    ├── key: (11)
           │    ├── fd: ()-->(13), (11)-->(7-10,12), (8)==(9), (9)==(8)
           │    ├── prune: (7-13)
           │    ├── interesting orderings: (+11)
           │    ├── select
           │    │    ├── columns: a:7(int!null) b:8(int!null) c:9(int!null) d:10(int) rowid:11(int!null) e:12(int)
           │    │    ├── key: (11)
           │    │    ├── fd: (11)-->(7-10,12), (8)==(9), (9)==(8)
           │    │    ├── prune: (7,10-12)
           │    │    ├── interesting orderings: (+11)
           │    │    ├── scan abcde
           │    │    │    ├── columns: a:7(int!null) b:8(int) c:9(int!null) d:10(int) rowid:11(int!null) e:12(int)
           │    │    │    ├── key: (11)
           │    │    │    ├── fd: (11)-->(7-10,12)
           │    │    │    ├── prune: (7-12)
           │    │    │    └── interesting orderings: (+11)
           │    │    └── filters
           │    │         └── eq [type=bool, outer=(8,9), constraints=(/8: (/NULL - ]; /9: (/NULL - ]), fd=(8)==(9), (9)==(8)]
           │    │              ├── variable: b [type=int]
           │    │              └── variable: c [type=int]
           │    └── projections
           │         └── const: 1 [type=int]
           └── projections
                └── plus [type=int, outer=(8,9)]
                     ├── plus [type=int]
                     │    ├── variable: b [type=int]
                     │    └── variable: c [type=int]
                     └── const: 1 [type=int]
