exec-ddl
CREATE TABLE abc (
    a INT NOT NULL,
    b INT DEFAULT (10),
    c INT AS (b + 1) STORED,
    UNIQUE(a),
    UNIQUE(b, c)
)
----
TABLE abc
 ├── a int not null
 ├── b int
 ├── c int
 ├── rowid int not null (hidden)
 ├── INDEX primary
 │    └── rowid int not null (hidden)
 ├── INDEX secondary
 │    ├── a int not null
 │    └── rowid int not null (hidden) (storing)
 └── INDEX secondary
      ├── b int
      ├── c int
      └── rowid int not null (hidden) (storing)

exec-ddl
CREATE TABLE xyz (
    x INT PRIMARY KEY,
    y INT,
    z INT,
    UNIQUE (y, z),
    UNIQUE (z, y)
)
----
TABLE xyz
 ├── x int not null
 ├── y int
 ├── z int
 ├── INDEX primary
 │    └── x int not null
 ├── INDEX secondary
 │    ├── y int
 │    ├── z int
 │    └── x int not null (storing)
 └── INDEX secondary
      ├── z int
      ├── y int
      └── x int not null (storing)

# INSERT..ON CONFLICT case. Don't inherit FDs.
build
INSERT INTO abc (a, b)
SELECT x, y FROM xyz WHERE y=1
ON CONFLICT (b, c) DO
UPDATE SET a=1, b=excluded.b+abc.c
RETURNING *
----
project
 ├── columns: a:1(int!null) b:2(int) c:3(int)
 ├── side-effects, mutations
 ├── prune: (1-3)
 └── upsert abc
      ├── columns: a:1(int!null) b:2(int) c:3(int) rowid:4(int!null)
      ├── canary column: 13
      ├── fetch columns: a:10(int) b:11(int) c:12(int) rowid:13(int)
      ├── insert-mapping:
      │    ├──  x:5 => a:1
      │    ├──  y:6 => b:2
      │    ├──  column9:9 => c:3
      │    └──  column8:8 => rowid:4
      ├── update-mapping:
      │    ├──  upsert_a:17 => a:1
      │    ├──  upsert_b:18 => b:2
      │    └──  upsert_c:19 => c:3
      ├── return-mapping:
      │    ├──  upsert_a:17 => a:1
      │    ├──  upsert_b:18 => b:2
      │    ├──  upsert_c:19 => c:3
      │    └──  upsert_rowid:20 => rowid:4
      ├── side-effects, mutations
      └── project
           ├── columns: upsert_a:17(int) upsert_b:18(int) upsert_c:19(int) upsert_rowid:20(int) x:5(int!null) y:6(int!null) column8:8(int) column9:9(int) a:10(int) b:11(int) c:12(int) rowid:13(int) column14:14(int!null) column15:15(int) column16:16(int)
           ├── side-effects
           ├── key: (5,13)
           ├── fd: ()-->(6,9,14), (5)-->(8), (13)-->(10-12), (10)-->(11-13), (11,12)~~>(10,13), (12)-->(15), (15)-->(16), (5,13)-->(17), (13,15)-->(18), (13,16)-->(19), (8,13)-->(20)
           ├── prune: (5,6,8-20)
           ├── interesting orderings: (+5) (+6) (+13) (+10) (+11,+12,+13)
           ├── project
           │    ├── columns: column16:16(int) x:5(int!null) y:6(int!null) column8:8(int) column9:9(int) a:10(int) b:11(int) c:12(int) rowid:13(int) column14:14(int!null) column15:15(int)
           │    ├── side-effects
           │    ├── key: (5,13)
           │    ├── fd: ()-->(6,9,14), (5)-->(8), (13)-->(10-12), (10)-->(11-13), (11,12)~~>(10,13), (12)-->(15), (15)-->(16)
           │    ├── prune: (5,6,8-16)
           │    ├── interesting orderings: (+5) (+6) (+13) (+10) (+11,+12,+13)
           │    ├── project
           │    │    ├── columns: column14:14(int!null) column15:15(int) x:5(int!null) y:6(int!null) column8:8(int) column9:9(int) a:10(int) b:11(int) c:12(int) rowid:13(int)
           │    │    ├── side-effects
           │    │    ├── key: (5,13)
           │    │    ├── fd: ()-->(6,9,14), (5)-->(8), (13)-->(10-12), (10)-->(11-13), (11,12)~~>(10,13), (12)-->(15)
           │    │    ├── prune: (5,6,8-15)
           │    │    ├── interesting orderings: (+5) (+6) (+13) (+10) (+11,+12,+13)
           │    │    ├── left-join
           │    │    │    ├── columns: x:5(int!null) y:6(int!null) column8:8(int) column9:9(int) a:10(int) b:11(int) c:12(int) rowid:13(int)
           │    │    │    ├── side-effects
           │    │    │    ├── key: (5,13)
           │    │    │    ├── fd: ()-->(6,9), (5)-->(8), (13)-->(10-12), (10)-->(11-13), (11,12)~~>(10,13)
           │    │    │    ├── prune: (5,8,10,13)
           │    │    │    ├── reject-nulls: (10-13)
           │    │    │    ├── interesting orderings: (+5) (+6) (+13) (+10) (+11,+12,+13)
           │    │    │    ├── project
           │    │    │    │    ├── columns: column9:9(int) x:5(int!null) y:6(int!null) column8:8(int)
           │    │    │    │    ├── side-effects
           │    │    │    │    ├── key: (5)
           │    │    │    │    ├── fd: ()-->(6,9), (5)-->(8)
           │    │    │    │    ├── prune: (5,6,8,9)
           │    │    │    │    ├── interesting orderings: (+5) (+6)
           │    │    │    │    ├── project
           │    │    │    │    │    ├── columns: column8:8(int) x:5(int!null) y:6(int!null)
           │    │    │    │    │    ├── side-effects
           │    │    │    │    │    ├── key: (5)
           │    │    │    │    │    ├── fd: ()-->(6), (5)-->(8)
           │    │    │    │    │    ├── prune: (5,6,8)
           │    │    │    │    │    ├── interesting orderings: (+5) (+6)
           │    │    │    │    │    ├── project
           │    │    │    │    │    │    ├── columns: x:5(int!null) y:6(int!null)
           │    │    │    │    │    │    ├── key: (5)
           │    │    │    │    │    │    ├── fd: ()-->(6)
           │    │    │    │    │    │    ├── prune: (5,6)
           │    │    │    │    │    │    ├── interesting orderings: (+5) (+6)
           │    │    │    │    │    │    └── select
           │    │    │    │    │    │         ├── columns: x:5(int!null) y:6(int!null) z:7(int)
           │    │    │    │    │    │         ├── key: (5)
           │    │    │    │    │    │         ├── fd: ()-->(6), (5)-->(7), (6,7)~~>(5)
           │    │    │    │    │    │         ├── prune: (5,7)
           │    │    │    │    │    │         ├── interesting orderings: (+5) (+6,+7,+5) (+7,+6,+5)
           │    │    │    │    │    │         ├── scan xyz
           │    │    │    │    │    │         │    ├── columns: x:5(int!null) y:6(int) z:7(int)
           │    │    │    │    │    │         │    ├── key: (5)
           │    │    │    │    │    │         │    ├── fd: (5)-->(6,7), (6,7)~~>(5)
           │    │    │    │    │    │         │    ├── prune: (5-7)
           │    │    │    │    │    │         │    └── interesting orderings: (+5) (+6,+7,+5) (+7,+6,+5)
           │    │    │    │    │    │         └── filters
           │    │    │    │    │    │              └── eq [type=bool, outer=(6), constraints=(/6: [/1 - /1]; tight), fd=()-->(6)]
           │    │    │    │    │    │                   ├── variable: y [type=int]
           │    │    │    │    │    │                   └── const: 1 [type=int]
           │    │    │    │    │    └── projections
           │    │    │    │    │         └── function: unique_rowid [type=int, side-effects]
           │    │    │    │    └── projections
           │    │    │    │         └── plus [type=int, outer=(6)]
           │    │    │    │              ├── variable: y [type=int]
           │    │    │    │              └── const: 1 [type=int]
           │    │    │    ├── scan abc
           │    │    │    │    ├── columns: a:10(int!null) b:11(int) c:12(int) rowid:13(int!null)
           │    │    │    │    ├── key: (13)
           │    │    │    │    ├── fd: (13)-->(10-12), (10)-->(11-13), (11,12)~~>(10,13)
           │    │    │    │    ├── prune: (10-13)
           │    │    │    │    └── interesting orderings: (+13) (+10) (+11,+12,+13)
           │    │    │    └── filters
           │    │    │         ├── eq [type=bool, outer=(6,11), constraints=(/6: (/NULL - ]; /11: (/NULL - ]), fd=(6)==(11), (11)==(6)]
           │    │    │         │    ├── variable: y [type=int]
           │    │    │         │    └── variable: b [type=int]
           │    │    │         └── eq [type=bool, outer=(9,12), constraints=(/9: (/NULL - ]; /12: (/NULL - ]), fd=(9)==(12), (12)==(9)]
           │    │    │              ├── variable: column9 [type=int]
           │    │    │              └── variable: c [type=int]
           │    │    └── projections
           │    │         ├── const: 1 [type=int]
           │    │         └── plus [type=int, outer=(6,12)]
           │    │              ├── variable: y [type=int]
           │    │              └── variable: c [type=int]
           │    └── projections
           │         └── plus [type=int, outer=(15)]
           │              ├── variable: column15 [type=int]
           │              └── const: 1 [type=int]
           └── projections
                ├── case [type=int, outer=(5,13,14)]
                │    ├── true [type=bool]
                │    ├── when [type=int]
                │    │    ├── is [type=bool]
                │    │    │    ├── variable: rowid [type=int]
                │    │    │    └── null [type=unknown]
                │    │    └── variable: x [type=int]
                │    └── variable: column14 [type=int]
                ├── case [type=int, outer=(6,13,15)]
                │    ├── true [type=bool]
                │    ├── when [type=int]
                │    │    ├── is [type=bool]
                │    │    │    ├── variable: rowid [type=int]
                │    │    │    └── null [type=unknown]
                │    │    └── variable: y [type=int]
                │    └── variable: column15 [type=int]
                ├── case [type=int, outer=(9,13,16)]
                │    ├── true [type=bool]
                │    ├── when [type=int]
                │    │    ├── is [type=bool]
                │    │    │    ├── variable: rowid [type=int]
                │    │    │    └── null [type=unknown]
                │    │    └── variable: column9 [type=int]
                │    └── variable: column16 [type=int]
                └── case [type=int, outer=(8,13)]
                     ├── true [type=bool]
                     ├── when [type=int]
                     │    ├── is [type=bool]
                     │    │    ├── variable: rowid [type=int]
                     │    │    └── null [type=unknown]
                     │    └── variable: column8 [type=int]
                     └── variable: rowid [type=int]

# DO NOTHING case.
build
INSERT INTO abc (a, b)
SELECT x, y FROM xyz
ON CONFLICT DO NOTHING
RETURNING *
----
project
 ├── columns: a:1(int!null) b:2(int) c:3(int)
 ├── side-effects, mutations
 ├── key: (1)
 ├── fd: (1)-->(2,3), (2)-->(3)
 ├── prune: (1-3)
 └── insert abc
      ├── columns: abc.a:1(int!null) abc.b:2(int) abc.c:3(int) abc.rowid:4(int!null)
      ├── insert-mapping:
      │    ├──  x:5 => abc.a:1
      │    ├──  y:6 => abc.b:2
      │    ├──  column9:9 => abc.c:3
      │    └──  column8:8 => abc.rowid:4
      ├── side-effects, mutations
      ├── key: (1)
      ├── fd: (1)-->(2-4), (2)-->(3)
      └── project
           ├── columns: x:5(int!null) y:6(int) column8:8(int) column9:9(int)
           ├── side-effects
           ├── key: (5)
           ├── fd: (5)-->(6,8), (6)-->(9)
           ├── prune: (5,6,8,9)
           ├── interesting orderings: (+5) (+6)
           └── select
                ├── columns: x:5(int!null) y:6(int) column8:8(int) column9:9(int) abc_3.a:18(int) abc_3.b:19(int) abc_3.c:20(int) abc_3.rowid:21(int)
                ├── side-effects
                ├── key: (5)
                ├── fd: ()-->(18-21), (5)-->(6,8), (6)-->(9)
                ├── prune: (5,8,18)
                ├── interesting orderings: (+5) (+6) (+21) (+18) (+19,+20,+21)
                ├── left-join
                │    ├── columns: x:5(int!null) y:6(int) column8:8(int) column9:9(int) abc_3.a:18(int) abc_3.b:19(int) abc_3.c:20(int) abc_3.rowid:21(int)
                │    ├── side-effects
                │    ├── key: (5,21)
                │    ├── fd: (5)-->(6,8), (6)-->(9), (21)-->(18-20), (18)-->(19-21), (19,20)~~>(18,21)
                │    ├── prune: (5,8,18,21)
                │    ├── reject-nulls: (18-21)
                │    ├── interesting orderings: (+5) (+6) (+21) (+18) (+19,+20,+21)
                │    ├── project
                │    │    ├── columns: x:5(int!null) y:6(int) column8:8(int) column9:9(int)
                │    │    ├── side-effects
                │    │    ├── key: (5)
                │    │    ├── fd: (5)-->(6,8), (6)-->(9)
                │    │    ├── prune: (5,6,8,9)
                │    │    ├── interesting orderings: (+5) (+6)
                │    │    └── select
                │    │         ├── columns: x:5(int!null) y:6(int) column8:8(int) column9:9(int) abc_2.a:14(int) abc_2.b:15(int) abc_2.c:16(int) abc_2.rowid:17(int)
                │    │         ├── side-effects
                │    │         ├── key: (5)
                │    │         ├── fd: ()-->(14-17), (5)-->(6,8), (6)-->(9)
                │    │         ├── prune: (6,8,9,15-17)
                │    │         ├── interesting orderings: (+5) (+6) (+17) (+14) (+15,+16,+17)
                │    │         ├── left-join
                │    │         │    ├── columns: x:5(int!null) y:6(int) column8:8(int) column9:9(int) abc_2.a:14(int) abc_2.b:15(int) abc_2.c:16(int) abc_2.rowid:17(int)
                │    │         │    ├── side-effects
                │    │         │    ├── key: (5,17)
                │    │         │    ├── fd: (5)-->(6,8), (6)-->(9), (17)-->(14-16), (14)-->(15-17), (15,16)~~>(14,17)
                │    │         │    ├── prune: (6,8,9,15-17)
                │    │         │    ├── reject-nulls: (14-17)
                │    │         │    ├── interesting orderings: (+5) (+6) (+17) (+14) (+15,+16,+17)
                │    │         │    ├── project
                │    │         │    │    ├── columns: x:5(int!null) y:6(int) column8:8(int) column9:9(int)
                │    │         │    │    ├── side-effects
                │    │         │    │    ├── key: (5)
                │    │         │    │    ├── fd: (5)-->(6,8), (6)-->(9)
                │    │         │    │    ├── prune: (5,6,8,9)
                │    │         │    │    ├── interesting orderings: (+5) (+6)
                │    │         │    │    └── select
                │    │         │    │         ├── columns: x:5(int!null) y:6(int) column8:8(int) column9:9(int) abc_1.a:10(int) abc_1.b:11(int) abc_1.c:12(int) abc_1.rowid:13(int)
                │    │         │    │         ├── side-effects
                │    │         │    │         ├── key: (5)
                │    │         │    │         ├── fd: ()-->(10-13), (5)-->(6,8), (6)-->(9)
                │    │         │    │         ├── prune: (5,6,9-12)
                │    │         │    │         ├── interesting orderings: (+5) (+6) (+13) (+10) (+11,+12,+13)
                │    │         │    │         ├── left-join
                │    │         │    │         │    ├── columns: x:5(int!null) y:6(int) column8:8(int) column9:9(int) abc_1.a:10(int) abc_1.b:11(int) abc_1.c:12(int) abc_1.rowid:13(int)
                │    │         │    │         │    ├── side-effects
                │    │         │    │         │    ├── key: (5,13)
                │    │         │    │         │    ├── fd: (5)-->(6,8), (6)-->(9), (13)-->(10-12), (10)-->(11-13), (11,12)~~>(10,13)
                │    │         │    │         │    ├── prune: (5,6,9-12)
                │    │         │    │         │    ├── reject-nulls: (10-13)
                │    │         │    │         │    ├── interesting orderings: (+5) (+6) (+13) (+10) (+11,+12,+13)
                │    │         │    │         │    ├── project
                │    │         │    │         │    │    ├── columns: column9:9(int) x:5(int!null) y:6(int) column8:8(int)
                │    │         │    │         │    │    ├── side-effects
                │    │         │    │         │    │    ├── key: (5)
                │    │         │    │         │    │    ├── fd: (5)-->(6,8), (6)-->(9)
                │    │         │    │         │    │    ├── prune: (5,6,8,9)
                │    │         │    │         │    │    ├── interesting orderings: (+5) (+6)
                │    │         │    │         │    │    ├── project
                │    │         │    │         │    │    │    ├── columns: column8:8(int) x:5(int!null) y:6(int)
                │    │         │    │         │    │    │    ├── side-effects
                │    │         │    │         │    │    │    ├── key: (5)
                │    │         │    │         │    │    │    ├── fd: (5)-->(6,8)
                │    │         │    │         │    │    │    ├── prune: (5,6,8)
                │    │         │    │         │    │    │    ├── interesting orderings: (+5) (+6)
                │    │         │    │         │    │    │    ├── project
                │    │         │    │         │    │    │    │    ├── columns: x:5(int!null) y:6(int)
                │    │         │    │         │    │    │    │    ├── key: (5)
                │    │         │    │         │    │    │    │    ├── fd: (5)-->(6)
                │    │         │    │         │    │    │    │    ├── prune: (5,6)
                │    │         │    │         │    │    │    │    ├── interesting orderings: (+5) (+6)
                │    │         │    │         │    │    │    │    └── scan xyz
                │    │         │    │         │    │    │    │         ├── columns: x:5(int!null) y:6(int) z:7(int)
                │    │         │    │         │    │    │    │         ├── key: (5)
                │    │         │    │         │    │    │    │         ├── fd: (5)-->(6,7), (6,7)~~>(5)
                │    │         │    │         │    │    │    │         ├── prune: (5-7)
                │    │         │    │         │    │    │    │         └── interesting orderings: (+5) (+6,+7,+5) (+7,+6,+5)
                │    │         │    │         │    │    │    └── projections
                │    │         │    │         │    │    │         └── function: unique_rowid [type=int, side-effects]
                │    │         │    │         │    │    └── projections
                │    │         │    │         │    │         └── plus [type=int, outer=(6)]
                │    │         │    │         │    │              ├── variable: y [type=int]
                │    │         │    │         │    │              └── const: 1 [type=int]
                │    │         │    │         │    ├── scan abc_1
                │    │         │    │         │    │    ├── columns: abc_1.a:10(int!null) abc_1.b:11(int) abc_1.c:12(int) abc_1.rowid:13(int!null)
                │    │         │    │         │    │    ├── key: (13)
                │    │         │    │         │    │    ├── fd: (13)-->(10-12), (10)-->(11-13), (11,12)~~>(10,13)
                │    │         │    │         │    │    ├── prune: (10-13)
                │    │         │    │         │    │    └── interesting orderings: (+13) (+10) (+11,+12,+13)
                │    │         │    │         │    └── filters
                │    │         │    │         │         └── eq [type=bool, outer=(8,13), constraints=(/8: (/NULL - ]; /13: (/NULL - ]), fd=(8)==(13), (13)==(8)]
                │    │         │    │         │              ├── variable: column8 [type=int]
                │    │         │    │         │              └── variable: abc_1.rowid [type=int]
                │    │         │    │         └── filters
                │    │         │    │              └── is [type=bool, outer=(13), constraints=(/13: [/NULL - /NULL]; tight), fd=()-->(13)]
                │    │         │    │                   ├── variable: abc_1.rowid [type=int]
                │    │         │    │                   └── null [type=unknown]
                │    │         │    ├── scan abc_2
                │    │         │    │    ├── columns: abc_2.a:14(int!null) abc_2.b:15(int) abc_2.c:16(int) abc_2.rowid:17(int!null)
                │    │         │    │    ├── key: (17)
                │    │         │    │    ├── fd: (17)-->(14-16), (14)-->(15-17), (15,16)~~>(14,17)
                │    │         │    │    ├── prune: (14-17)
                │    │         │    │    └── interesting orderings: (+17) (+14) (+15,+16,+17)
                │    │         │    └── filters
                │    │         │         └── eq [type=bool, outer=(5,14), constraints=(/5: (/NULL - ]; /14: (/NULL - ]), fd=(5)==(14), (14)==(5)]
                │    │         │              ├── variable: x [type=int]
                │    │         │              └── variable: abc_2.a [type=int]
                │    │         └── filters
                │    │              └── is [type=bool, outer=(14), constraints=(/14: [/NULL - /NULL]; tight), fd=()-->(14)]
                │    │                   ├── variable: abc_2.a [type=int]
                │    │                   └── null [type=unknown]
                │    ├── scan abc_3
                │    │    ├── columns: abc_3.a:18(int!null) abc_3.b:19(int) abc_3.c:20(int) abc_3.rowid:21(int!null)
                │    │    ├── key: (21)
                │    │    ├── fd: (21)-->(18-20), (18)-->(19-21), (19,20)~~>(18,21)
                │    │    ├── prune: (18-21)
                │    │    └── interesting orderings: (+21) (+18) (+19,+20,+21)
                │    └── filters
                │         ├── eq [type=bool, outer=(6,19), constraints=(/6: (/NULL - ]; /19: (/NULL - ]), fd=(6)==(19), (19)==(6)]
                │         │    ├── variable: y [type=int]
                │         │    └── variable: abc_3.b [type=int]
                │         └── eq [type=bool, outer=(9,20), constraints=(/9: (/NULL - ]; /20: (/NULL - ]), fd=(9)==(20), (20)==(9)]
                │              ├── variable: column9 [type=int]
                │              └── variable: abc_3.c [type=int]
                └── filters
                     └── is [type=bool, outer=(21), constraints=(/21: [/NULL - /NULL]; tight), fd=()-->(21)]
                          ├── variable: abc_3.rowid [type=int]
                          └── null [type=unknown]

# UPSERT case.
build
UPSERT INTO abc (a) VALUES (1), (2) RETURNING b+c
----
project
 ├── columns: "?column?":17(int)
 ├── cardinality: [2 - ]
 ├── side-effects, mutations
 ├── prune: (17)
 ├── upsert abc
 │    ├── columns: a:1(int!null) b:2(int) c:3(int) rowid:4(int!null)
 │    ├── canary column: 12
 │    ├── fetch columns: a:9(int) b:10(int) c:11(int) rowid:12(int)
 │    ├── insert-mapping:
 │    │    ├──  column1:5 => a:1
 │    │    ├──  column6:6 => b:2
 │    │    ├──  column8:8 => c:3
 │    │    └──  column7:7 => rowid:4
 │    ├── update-mapping:
 │    │    ├──  column1:5 => a:1
 │    │    └──  upsert_c:15 => c:3
 │    ├── return-mapping:
 │    │    ├──  column1:5 => a:1
 │    │    ├──  upsert_b:14 => b:2
 │    │    ├──  upsert_c:15 => c:3
 │    │    └──  upsert_rowid:16 => rowid:4
 │    ├── cardinality: [2 - ]
 │    ├── side-effects, mutations
 │    └── project
 │         ├── columns: upsert_b:14(int) upsert_c:15(int) upsert_rowid:16(int) column1:5(int) column6:6(int!null) column7:7(int) column8:8(int) a:9(int) b:10(int) c:11(int) rowid:12(int) column13:13(int)
 │         ├── cardinality: [2 - ]
 │         ├── side-effects
 │         ├── fd: ()-->(6,8), (12)-->(9-11), (9)-->(10-12), (10,11)~~>(9,12), (10)-->(13), (10,12)-->(14), (12,13)-->(15), (7,12)-->(16)
 │         ├── prune: (5-16)
 │         ├── interesting orderings: (+12) (+9) (+10,+11,+12)
 │         ├── project
 │         │    ├── columns: column13:13(int) column1:5(int) column6:6(int!null) column7:7(int) column8:8(int) a:9(int) b:10(int) c:11(int) rowid:12(int)
 │         │    ├── cardinality: [2 - ]
 │         │    ├── side-effects
 │         │    ├── fd: ()-->(6,8), (12)-->(9-11), (9)-->(10-12), (10,11)~~>(9,12), (10)-->(13)
 │         │    ├── prune: (5-13)
 │         │    ├── interesting orderings: (+12) (+9) (+10,+11,+12)
 │         │    ├── left-join
 │         │    │    ├── columns: column1:5(int) column6:6(int!null) column7:7(int) column8:8(int) a:9(int) b:10(int) c:11(int) rowid:12(int)
 │         │    │    ├── cardinality: [2 - ]
 │         │    │    ├── side-effects
 │         │    │    ├── fd: ()-->(6,8), (12)-->(9-11), (9)-->(10-12), (10,11)~~>(9,12)
 │         │    │    ├── prune: (5,6,8-11)
 │         │    │    ├── reject-nulls: (9-12)
 │         │    │    ├── interesting orderings: (+12) (+9) (+10,+11,+12)
 │         │    │    ├── project
 │         │    │    │    ├── columns: column8:8(int) column1:5(int) column6:6(int!null) column7:7(int)
 │         │    │    │    ├── cardinality: [2 - 2]
 │         │    │    │    ├── side-effects
 │         │    │    │    ├── fd: ()-->(6,8)
 │         │    │    │    ├── prune: (5-8)
 │         │    │    │    ├── project
 │         │    │    │    │    ├── columns: column6:6(int!null) column7:7(int) column1:5(int)
 │         │    │    │    │    ├── cardinality: [2 - 2]
 │         │    │    │    │    ├── side-effects
 │         │    │    │    │    ├── fd: ()-->(6)
 │         │    │    │    │    ├── prune: (5-7)
 │         │    │    │    │    ├── values
 │         │    │    │    │    │    ├── columns: column1:5(int)
 │         │    │    │    │    │    ├── cardinality: [2 - 2]
 │         │    │    │    │    │    ├── prune: (5)
 │         │    │    │    │    │    ├── tuple [type=tuple{int}]
 │         │    │    │    │    │    │    └── const: 1 [type=int]
 │         │    │    │    │    │    └── tuple [type=tuple{int}]
 │         │    │    │    │    │         └── const: 2 [type=int]
 │         │    │    │    │    └── projections
 │         │    │    │    │         ├── const: 10 [type=int]
 │         │    │    │    │         └── function: unique_rowid [type=int, side-effects]
 │         │    │    │    └── projections
 │         │    │    │         └── plus [type=int, outer=(6)]
 │         │    │    │              ├── variable: column6 [type=int]
 │         │    │    │              └── const: 1 [type=int]
 │         │    │    ├── scan abc
 │         │    │    │    ├── columns: a:9(int!null) b:10(int) c:11(int) rowid:12(int!null)
 │         │    │    │    ├── key: (12)
 │         │    │    │    ├── fd: (12)-->(9-11), (9)-->(10-12), (10,11)~~>(9,12)
 │         │    │    │    ├── prune: (9-12)
 │         │    │    │    └── interesting orderings: (+12) (+9) (+10,+11,+12)
 │         │    │    └── filters
 │         │    │         └── eq [type=bool, outer=(7,12), constraints=(/7: (/NULL - ]; /12: (/NULL - ]), fd=(7)==(12), (12)==(7)]
 │         │    │              ├── variable: column7 [type=int]
 │         │    │              └── variable: rowid [type=int]
 │         │    └── projections
 │         │         └── plus [type=int, outer=(10)]
 │         │              ├── variable: b [type=int]
 │         │              └── const: 1 [type=int]
 │         └── projections
 │              ├── case [type=int, outer=(6,10,12)]
 │              │    ├── true [type=bool]
 │              │    ├── when [type=int]
 │              │    │    ├── is [type=bool]
 │              │    │    │    ├── variable: rowid [type=int]
 │              │    │    │    └── null [type=unknown]
 │              │    │    └── variable: column6 [type=int]
 │              │    └── variable: b [type=int]
 │              ├── case [type=int, outer=(8,12,13)]
 │              │    ├── true [type=bool]
 │              │    ├── when [type=int]
 │              │    │    ├── is [type=bool]
 │              │    │    │    ├── variable: rowid [type=int]
 │              │    │    │    └── null [type=unknown]
 │              │    │    └── variable: column8 [type=int]
 │              │    └── variable: column13 [type=int]
 │              └── case [type=int, outer=(7,12)]
 │                   ├── true [type=bool]
 │                   ├── when [type=int]
 │                   │    ├── is [type=bool]
 │                   │    │    ├── variable: rowid [type=int]
 │                   │    │    └── null [type=unknown]
 │                   │    └── variable: column7 [type=int]
 │                   └── variable: rowid [type=int]
 └── projections
      └── plus [type=int, outer=(2,3)]
           ├── variable: b [type=int]
           └── variable: c [type=int]
