exec-ddl
CREATE TABLE bx (
  b INT PRIMARY KEY,
  x INT
)
----
TABLE bx
 ├── b int not null
 ├── x int
 └── INDEX primary
      └── b int not null

exec-ddl
CREATE TABLE cy (
  c INT PRIMARY KEY,
  y INT
)
----
TABLE cy
 ├── c int not null
 ├── y int
 └── INDEX primary
      └── c int not null

exec-ddl
CREATE TABLE dz (
  d INT PRIMARY KEY,
  z INT
)
----
TABLE dz
 ├── d int not null
 ├── z int
 └── INDEX primary
      └── d int not null

exec-ddl
CREATE TABLE abc (
  a INT PRIMARY KEY,
  b INT,
  c INT,
  d INT
)
----
TABLE abc
 ├── a int not null
 ├── b int
 ├── c int
 ├── d int
 └── INDEX primary
      └── a int not null

opt join-limit=3
SELECT * FROM abc, bx, cy WHERE a = 1 AND abc.b = bx.b AND abc.c = cy.c
----
inner-join (lookup bx)
 ├── columns: a:1(int!null) b:2(int!null) c:3(int!null) d:4(int) b:5(int!null) x:6(int) c:7(int!null) y:8(int)
 ├── key columns: [2] = [5]
 ├── cardinality: [0 - 1]
 ├── key: ()
 ├── fd: ()-->(1-8)
 ├── inner-join (lookup cy)
 │    ├── columns: a:1(int!null) abc.b:2(int) abc.c:3(int!null) d:4(int) cy.c:7(int!null) y:8(int)
 │    ├── key columns: [3] = [7]
 │    ├── cardinality: [0 - 1]
 │    ├── key: ()
 │    ├── fd: ()-->(1-4,7,8)
 │    ├── scan abc
 │    │    ├── columns: a:1(int!null) abc.b:2(int) abc.c:3(int) d:4(int)
 │    │    ├── constraint: /1: [/1 - /1]
 │    │    ├── cardinality: [0 - 1]
 │    │    ├── key: ()
 │    │    └── fd: ()-->(1-4)
 │    └── filters (true)
 └── filters (true)

opt join-limit=3
SELECT * FROM bx, abc, cy WHERE a = 1 AND abc.b = bx.b AND abc.c = cy.c
----
inner-join (lookup bx)
 ├── columns: b:1(int!null) x:2(int) a:3(int!null) b:4(int!null) c:5(int!null) d:6(int) c:7(int!null) y:8(int)
 ├── key columns: [4] = [1]
 ├── cardinality: [0 - 1]
 ├── key: ()
 ├── fd: ()-->(1-8)
 ├── inner-join (lookup cy)
 │    ├── columns: a:3(int!null) abc.b:4(int) abc.c:5(int!null) d:6(int) cy.c:7(int!null) y:8(int)
 │    ├── key columns: [5] = [7]
 │    ├── cardinality: [0 - 1]
 │    ├── key: ()
 │    ├── fd: ()-->(3-8)
 │    ├── scan abc
 │    │    ├── columns: a:3(int!null) abc.b:4(int) abc.c:5(int) d:6(int)
 │    │    ├── constraint: /3: [/1 - /1]
 │    │    ├── cardinality: [0 - 1]
 │    │    ├── key: ()
 │    │    └── fd: ()-->(3-6)
 │    └── filters (true)
 └── filters (true)

opt join-limit=3
SELECT * FROM bx, cy, abc WHERE a = 1 AND abc.b = bx.b AND abc.c = cy.c
----
inner-join (lookup bx)
 ├── columns: b:1(int!null) x:2(int) c:3(int!null) y:4(int) a:5(int!null) b:6(int!null) c:7(int!null) d:8(int)
 ├── key columns: [6] = [1]
 ├── cardinality: [0 - 1]
 ├── key: ()
 ├── fd: ()-->(1-8)
 ├── inner-join (lookup cy)
 │    ├── columns: cy.c:3(int!null) y:4(int) a:5(int!null) abc.b:6(int) abc.c:7(int!null) d:8(int)
 │    ├── key columns: [7] = [3]
 │    ├── cardinality: [0 - 1]
 │    ├── key: ()
 │    ├── fd: ()-->(3-8)
 │    ├── scan abc
 │    │    ├── columns: a:5(int!null) abc.b:6(int) abc.c:7(int) d:8(int)
 │    │    ├── constraint: /5: [/1 - /1]
 │    │    ├── cardinality: [0 - 1]
 │    │    ├── key: ()
 │    │    └── fd: ()-->(5-8)
 │    └── filters (true)
 └── filters (true)

opt join-limit=2 expect-not=AssociateJoin
SELECT * FROM bx, cy, abc WHERE a = 1 AND abc.b = bx.b AND abc.c = cy.c
----
inner-join (lookup bx)
 ├── columns: b:1(int!null) x:2(int) c:3(int!null) y:4(int) a:5(int!null) b:6(int!null) c:7(int!null) d:8(int)
 ├── key columns: [6] = [1]
 ├── cardinality: [0 - 1]
 ├── key: ()
 ├── fd: ()-->(1-8)
 ├── inner-join (lookup cy)
 │    ├── columns: cy.c:3(int!null) y:4(int) a:5(int!null) abc.b:6(int) abc.c:7(int!null) d:8(int)
 │    ├── key columns: [7] = [3]
 │    ├── cardinality: [0 - 1]
 │    ├── key: ()
 │    ├── fd: ()-->(3-8)
 │    ├── scan abc
 │    │    ├── columns: a:5(int!null) abc.b:6(int) abc.c:7(int) d:8(int)
 │    │    ├── constraint: /5: [/1 - /1]
 │    │    ├── cardinality: [0 - 1]
 │    │    ├── key: ()
 │    │    └── fd: ()-->(5-8)
 │    └── filters (true)
 └── filters (true)

memo join-limit=3
SELECT * FROM bx, cy, abc WHERE a = 1 AND abc.b = bx.b AND abc.c = cy.c
----
memo (optimized, ~18KB, required=[presentation: b:1,x:2,c:3,y:4,a:5,b:6,c:7,d:8])
 ├── G1: (inner-join G2 G3 G4) (inner-join G3 G2 G4) (merge-join G2 G3 G5 inner-join,+1,+6) (lookup-join G3 G5 bx,keyCols=[6],outCols=(1-8)) (inner-join G6 G7 G8) (inner-join G9 G10 G11) (inner-join G7 G6 G8) (merge-join G6 G7 G5 inner-join,+3,+7) (inner-join G10 G9 G11) (lookup-join G7 G5 cy,keyCols=[7],outCols=(1-8))
 │    └── [presentation: b:1,x:2,c:3,y:4,a:5,b:6,c:7,d:8]
 │         ├── best: (lookup-join G3 G5 bx,keyCols=[6],outCols=(1-8))
 │         └── cost: 13.19
 ├── G2: (scan bx)
 │    ├── [ordering: +1]
 │    │    ├── best: (scan bx)
 │    │    └── cost: 1040.02
 │    └── []
 │         ├── best: (scan bx)
 │         └── cost: 1040.02
 ├── G3: (inner-join G6 G9 G8) (inner-join G9 G6 G8) (merge-join G6 G9 G5 inner-join,+3,+7) (lookup-join G9 G5 cy,keyCols=[7],outCols=(3-8))
 │    └── []
 │         ├── best: (lookup-join G9 G5 cy,keyCols=[7],outCols=(3-8))
 │         └── cost: 7.14
 ├── G4: (filters G12)
 ├── G5: (filters)
 ├── G6: (scan cy)
 │    ├── [ordering: +3]
 │    │    ├── best: (scan cy)
 │    │    └── cost: 1040.02
 │    └── []
 │         ├── best: (scan cy)
 │         └── cost: 1040.02
 ├── G7: (inner-join G9 G2 G4) (inner-join G2 G9 G4) (lookup-join G9 G5 bx,keyCols=[6],outCols=(1,2,5-8)) (merge-join G2 G9 G5 inner-join,+1,+6)
 │    └── []
 │         ├── best: (lookup-join G9 G5 bx,keyCols=[6],outCols=(1,2,5-8))
 │         └── cost: 7.14
 ├── G8: (filters G13)
 ├── G9: (select G14 G15) (scan abc,constrained)
 │    └── []
 │         ├── best: (scan abc,constrained)
 │         └── cost: 1.09
 ├── G10: (inner-join G6 G2 G5) (inner-join G2 G6 G5)
 │    └── []
 │         ├── best: (inner-join G6 G2 G5)
 │         └── cost: 12110.05
 ├── G11: (filters G12 G13)
 ├── G12: (eq G16 G17)
 ├── G13: (eq G18 G19)
 ├── G14: (scan abc)
 │    └── []
 │         ├── best: (scan abc)
 │         └── cost: 1080.02
 ├── G15: (filters G20)
 ├── G16: (variable abc.b)
 ├── G17: (variable bx.b)
 ├── G18: (variable abc.c)
 ├── G19: (variable cy.c)
 ├── G20: (eq G21 G22)
 ├── G21: (variable a)
 └── G22: (const 1)

opt join-limit=4
SELECT * FROM bx, cy, dz, abc WHERE a = 1
----
inner-join
 ├── columns: b:1(int!null) x:2(int) c:3(int!null) y:4(int) d:5(int!null) z:6(int) a:7(int!null) b:8(int) c:9(int) d:10(int)
 ├── key: (1,3,5)
 ├── fd: ()-->(7-10), (1)-->(2), (3)-->(4), (5)-->(6)
 ├── inner-join
 │    ├── columns: cy.c:3(int!null) y:4(int) dz.d:5(int!null) z:6(int) a:7(int!null) abc.b:8(int) abc.c:9(int) abc.d:10(int)
 │    ├── key: (3,5)
 │    ├── fd: ()-->(7-10), (3)-->(4), (5)-->(6)
 │    ├── scan cy
 │    │    ├── columns: cy.c:3(int!null) y:4(int)
 │    │    ├── key: (3)
 │    │    └── fd: (3)-->(4)
 │    ├── inner-join
 │    │    ├── columns: dz.d:5(int!null) z:6(int) a:7(int!null) abc.b:8(int) abc.c:9(int) abc.d:10(int)
 │    │    ├── key: (5)
 │    │    ├── fd: ()-->(7-10), (5)-->(6)
 │    │    ├── scan dz
 │    │    │    ├── columns: dz.d:5(int!null) z:6(int)
 │    │    │    ├── key: (5)
 │    │    │    └── fd: (5)-->(6)
 │    │    ├── scan abc
 │    │    │    ├── columns: a:7(int!null) abc.b:8(int) abc.c:9(int) abc.d:10(int)
 │    │    │    ├── constraint: /7: [/1 - /1]
 │    │    │    ├── cardinality: [0 - 1]
 │    │    │    ├── key: ()
 │    │    │    └── fd: ()-->(7-10)
 │    │    └── filters (true)
 │    └── filters (true)
 ├── scan bx
 │    ├── columns: bx.b:1(int!null) x:2(int)
 │    ├── key: (1)
 │    └── fd: (1)-->(2)
 └── filters (true)

opt join-limit=3 format=show-all
SELECT * FROM abc, bx, cy, dz WHERE a = 1
----
inner-join
 ├── columns: a:1(int!null) b:2(int) c:3(int) d:4(int) b:5(int!null) x:6(int) c:7(int!null) y:8(int) d:9(int!null) z:10(int)
 ├── stats: [rows=1e+09]
 ├── cost: 32525668.7
 ├── key: (5,7,9)
 ├── fd: ()-->(1-4), (5)-->(6), (7)-->(8), (9)-->(10)
 ├── prune: (2-10)
 ├── interesting orderings: (+7) (+9) (+5) (+1)
 ├── inner-join
 │    ├── columns: t.public.bx.b:5(int!null) t.public.bx.x:6(int) t.public.cy.c:7(int!null) t.public.cy.y:8(int) t.public.dz.d:9(int!null) t.public.dz.z:10(int)
 │    ├── stats: [rows=1e+09]
 │    ├── cost: 10025667.6
 │    ├── key: (5,7,9)
 │    ├── fd: (5)-->(6), (7)-->(8), (9)-->(10)
 │    ├── prune: (5-10)
 │    ├── interesting orderings: (+7) (+9) (+5)
 │    ├── join-size: 3
 │    ├── inner-join
 │    │    ├── columns: t.public.cy.c:7(int!null) t.public.cy.y:8(int) t.public.dz.d:9(int!null) t.public.dz.z:10(int)
 │    │    ├── stats: [rows=1000000]
 │    │    ├── cost: 12110.05
 │    │    ├── key: (7,9)
 │    │    ├── fd: (7)-->(8), (9)-->(10)
 │    │    ├── prune: (7-10)
 │    │    ├── interesting orderings: (+7) (+9)
 │    │    ├── join-size: 2
 │    │    ├── scan t.public.cy
 │    │    │    ├── columns: t.public.cy.c:7(int!null) t.public.cy.y:8(int)
 │    │    │    ├── stats: [rows=1000]
 │    │    │    ├── cost: 1040.02
 │    │    │    ├── key: (7)
 │    │    │    ├── fd: (7)-->(8)
 │    │    │    ├── prune: (7,8)
 │    │    │    └── interesting orderings: (+7)
 │    │    ├── scan t.public.dz
 │    │    │    ├── columns: t.public.dz.d:9(int!null) t.public.dz.z:10(int)
 │    │    │    ├── stats: [rows=1000]
 │    │    │    ├── cost: 1040.02
 │    │    │    ├── key: (9)
 │    │    │    ├── fd: (9)-->(10)
 │    │    │    ├── prune: (9,10)
 │    │    │    └── interesting orderings: (+9)
 │    │    └── filters (true)
 │    ├── scan t.public.bx
 │    │    ├── columns: t.public.bx.b:5(int!null) t.public.bx.x:6(int)
 │    │    ├── stats: [rows=1000]
 │    │    ├── cost: 1040.02
 │    │    ├── key: (5)
 │    │    ├── fd: (5)-->(6)
 │    │    ├── prune: (5,6)
 │    │    └── interesting orderings: (+5)
 │    └── filters (true)
 ├── scan t.public.abc
 │    ├── columns: t.public.abc.a:1(int!null) t.public.abc.b:2(int) t.public.abc.c:3(int) t.public.abc.d:4(int)
 │    ├── constraint: /1: [/1 - /1]
 │    ├── cardinality: [0 - 1]
 │    ├── stats: [rows=1, distinct(1)=1, null(1)=0]
 │    ├── cost: 1.09
 │    ├── key: ()
 │    ├── fd: ()-->(1-4)
 │    ├── prune: (2-4)
 │    └── interesting orderings: (+1)
 └── filters (true)

# Note the difference in memo size for with and without reorder-joins, for only four tables.
# TODO(justin): Find a way to reduce this.

memo join-limit=1
SELECT * FROM bx, cy, dz, abc WHERE a = 1
----
memo (optimized, ~11KB, required=[presentation: b:1,x:2,c:3,y:4,d:5,z:6,a:7,b:8,c:9,d:10])
 ├── G1: (inner-join G2 G3 G4) (inner-join G3 G2 G4)
 │    └── [presentation: b:1,x:2,c:3,y:4,d:5,z:6,a:7,b:8,c:9,d:10]
 │         ├── best: (inner-join G3 G2 G4)
 │         └── cost: 10025691.20
 ├── G2: (scan bx)
 │    └── []
 │         ├── best: (scan bx)
 │         └── cost: 1040.02
 ├── G3: (inner-join G5 G6 G4) (inner-join G6 G5 G4)
 │    └── []
 │         ├── best: (inner-join G5 G6 G4)
 │         └── cost: 12133.67
 ├── G4: (filters)
 ├── G5: (scan cy)
 │    └── []
 │         ├── best: (scan cy)
 │         └── cost: 1040.02
 ├── G6: (inner-join G7 G8 G4) (inner-join G8 G7 G4)
 │    └── []
 │         ├── best: (inner-join G7 G8 G4)
 │         └── cost: 1063.64
 ├── G7: (scan dz)
 │    └── []
 │         ├── best: (scan dz)
 │         └── cost: 1040.02
 ├── G8: (select G9 G10) (scan abc,constrained)
 │    └── []
 │         ├── best: (scan abc,constrained)
 │         └── cost: 1.09
 ├── G9: (scan abc)
 │    └── []
 │         ├── best: (scan abc)
 │         └── cost: 1080.02
 ├── G10: (filters G11)
 ├── G11: (eq G12 G13)
 ├── G12: (variable a)
 └── G13: (const 1)

memo join-limit=4
SELECT * FROM bx, cy, dz, abc WHERE a = 1
----
memo (optimized, ~26KB, required=[presentation: b:1,x:2,c:3,y:4,d:5,z:6,a:7,b:8,c:9,d:10])
 ├── G1: (inner-join G2 G3 G4) (inner-join G3 G2 G4) (inner-join G5 G6 G4) (inner-join G7 G8 G4) (inner-join G9 G10 G4) (inner-join G11 G12 G4) (inner-join G13 G14 G4) (inner-join G15 G16 G4) (inner-join G6 G5 G4) (inner-join G8 G7 G4) (inner-join G10 G9 G4) (inner-join G12 G11 G4) (inner-join G14 G13 G4) (inner-join G16 G15 G4)
 │    └── [presentation: b:1,x:2,c:3,y:4,d:5,z:6,a:7,b:8,c:9,d:10]
 │         ├── best: (inner-join G3 G2 G4)
 │         └── cost: 10025691.20
 ├── G2: (scan bx)
 │    └── []
 │         ├── best: (scan bx)
 │         └── cost: 1040.02
 ├── G3: (inner-join G5 G7 G4) (inner-join G7 G5 G4) (inner-join G9 G13 G4) (inner-join G11 G15 G4) (inner-join G13 G9 G4) (inner-join G15 G11 G4)
 │    └── []
 │         ├── best: (inner-join G5 G7 G4)
 │         └── cost: 12133.67
 ├── G4: (filters)
 ├── G5: (scan cy)
 │    └── []
 │         ├── best: (scan cy)
 │         └── cost: 1040.02
 ├── G6: (inner-join G7 G2 G4) (inner-join G2 G7 G4) (inner-join G9 G16 G4) (inner-join G11 G14 G4) (inner-join G16 G9 G4) (inner-join G14 G11 G4)
 │    └── []
 │         ├── best: (inner-join G7 G2 G4)
 │         └── cost: 12133.67
 ├── G7: (inner-join G9 G11 G4) (inner-join G11 G9 G4)
 │    └── []
 │         ├── best: (inner-join G9 G11 G4)
 │         └── cost: 1063.64
 ├── G8: (inner-join G5 G2 G4) (inner-join G2 G5 G4)
 │    └── []
 │         ├── best: (inner-join G5 G2 G4)
 │         └── cost: 12110.05
 ├── G9: (scan dz)
 │    └── []
 │         ├── best: (scan dz)
 │         └── cost: 1040.02
 ├── G10: (inner-join G13 G2 G4) (inner-join G2 G13 G4) (inner-join G11 G8 G4) (inner-join G5 G16 G4) (inner-join G8 G11 G4) (inner-join G16 G5 G4)
 │    └── []
 │         ├── best: (inner-join G13 G2 G4)
 │         └── cost: 12133.67
 ├── G11: (select G17 G18) (scan abc,constrained)
 │    └── []
 │         ├── best: (scan abc,constrained)
 │         └── cost: 1.09
 ├── G12: (inner-join G15 G2 G4) (inner-join G2 G15 G4) (inner-join G9 G8 G4) (inner-join G5 G14 G4) (inner-join G8 G9 G4) (inner-join G14 G5 G4)
 │    └── []
 │         ├── best: (inner-join G15 G2 G4)
 │         └── cost: 10025667.58
 ├── G13: (inner-join G11 G5 G4) (inner-join G5 G11 G4)
 │    └── []
 │         ├── best: (inner-join G5 G11 G4)
 │         └── cost: 1063.64
 ├── G14: (inner-join G9 G2 G4) (inner-join G2 G9 G4)
 │    └── []
 │         ├── best: (inner-join G9 G2 G4)
 │         └── cost: 12110.05
 ├── G15: (inner-join G9 G5 G4) (inner-join G5 G9 G4)
 │    └── []
 │         ├── best: (inner-join G9 G5 G4)
 │         └── cost: 12110.05
 ├── G16: (inner-join G11 G2 G4) (inner-join G2 G11 G4)
 │    └── []
 │         ├── best: (inner-join G2 G11 G4)
 │         └── cost: 1063.64
 ├── G17: (scan abc)
 │    └── []
 │         ├── best: (scan abc)
 │         └── cost: 1080.02
 ├── G18: (filters G19)
 ├── G19: (eq G20 G21)
 ├── G20: (variable a)
 └── G21: (const 1)

# Regression test for #34795.
exec-ddl
CREATE TABLE a (id INT8 PRIMARY KEY)
----
TABLE a
 ├── id int not null
 └── INDEX primary
      └── id int not null

opt join-limit=4
SELECT
    1
FROM
    a as a1
    INNER JOIN a as a2 ON 1 = a2.id
    INNER JOIN a AS a3 ON a1.id = a3.id
    CROSS JOIN a as a4
WHERE
    a4.id = 1 AND (SELECT true FROM a WHERE a1.id = 1)
----
project
 ├── columns: "?column?":7(int!null)
 ├── fd: ()-->(7)
 ├── inner-join
 │    ├── columns: a1.id:1(int!null) a2.id:2(int!null) a3.id:3(int!null) a4.id:4(int!null) bool:6(bool!null)
 │    ├── key: (3)
 │    ├── fd: ()-->(2,4,6), (1)==(3), (3)==(1)
 │    ├── scan a3
 │    │    ├── columns: a3.id:3(int!null)
 │    │    └── key: (3)
 │    ├── inner-join
 │    │    ├── columns: a1.id:1(int!null) a2.id:2(int!null) a4.id:4(int!null) bool:6(bool!null)
 │    │    ├── key: (1)
 │    │    ├── fd: ()-->(2,4,6)
 │    │    ├── inner-join-apply
 │    │    │    ├── columns: a1.id:1(int!null) bool:6(bool!null)
 │    │    │    ├── key: (1)
 │    │    │    ├── fd: ()-->(6)
 │    │    │    ├── scan a1
 │    │    │    │    ├── columns: a1.id:1(int!null)
 │    │    │    │    └── key: (1)
 │    │    │    ├── max1-row
 │    │    │    │    ├── columns: bool:6(bool!null)
 │    │    │    │    ├── outer: (1)
 │    │    │    │    ├── cardinality: [0 - 1]
 │    │    │    │    ├── key: ()
 │    │    │    │    ├── fd: ()-->(6)
 │    │    │    │    └── project
 │    │    │    │         ├── columns: bool:6(bool!null)
 │    │    │    │         ├── outer: (1)
 │    │    │    │         ├── fd: ()-->(6)
 │    │    │    │         ├── select
 │    │    │    │         │    ├── outer: (1)
 │    │    │    │         │    ├── scan a
 │    │    │    │         │    └── filters
 │    │    │    │         │         └── a1.id = 1 [type=bool, outer=(1), constraints=(/1: [/1 - /1]; tight), fd=()-->(1)]
 │    │    │    │         └── projections
 │    │    │    │              └── true [type=bool]
 │    │    │    └── filters
 │    │    │         └── variable: bool [type=bool, outer=(6), constraints=(/6: [/true - /true]; tight), fd=()-->(6)]
 │    │    ├── inner-join
 │    │    │    ├── columns: a2.id:2(int!null) a4.id:4(int!null)
 │    │    │    ├── cardinality: [0 - 1]
 │    │    │    ├── key: ()
 │    │    │    ├── fd: ()-->(2,4)
 │    │    │    ├── scan a2
 │    │    │    │    ├── columns: a2.id:2(int!null)
 │    │    │    │    ├── constraint: /2: [/1 - /1]
 │    │    │    │    ├── cardinality: [0 - 1]
 │    │    │    │    ├── key: ()
 │    │    │    │    └── fd: ()-->(2)
 │    │    │    ├── scan a4
 │    │    │    │    ├── columns: a4.id:4(int!null)
 │    │    │    │    ├── constraint: /4: [/1 - /1]
 │    │    │    │    ├── cardinality: [0 - 1]
 │    │    │    │    ├── key: ()
 │    │    │    │    └── fd: ()-->(4)
 │    │    │    └── filters (true)
 │    │    └── filters (true)
 │    └── filters
 │         └── a1.id = a3.id [type=bool, outer=(1,3), constraints=(/1: (/NULL - ]; /3: (/NULL - ]), fd=(1)==(3), (3)==(1)]
 └── projections
      └── const: 1 [type=int]

# Regression test for #35253.

exec-ddl
CREATE TABLE x (a INT8 PRIMARY KEY)
----
TABLE x
 ├── a int not null
 └── INDEX primary
      └── a int not null

memo join-limit=4
SELECT
    *
FROM
    x AS y
    JOIN [INSERT INTO x (a) SELECT NULL FROM x RETURNING 1] ON false
    JOIN x ON true
    JOIN [UPDATE x SET a = 1 RETURNING 1] ON true
----
memo (optimized, ~56KB, required=[presentation: a:1,?column?:5,a:6,?column?:10])
 ├── G1: (inner-join G2 G3 G4) (inner-join G3 G2 G4) (inner-join G5 G6 G4) (inner-join G7 G8 G4) (inner-join G9 G10 G4) (inner-join G11 G12 G4) (inner-join G13 G14 G4) (inner-join G15 G16 G4) (inner-join G11 G17 G4) (inner-join G18 G16 G4) (inner-join G6 G5 G4) (inner-join G11 G19 G4) (inner-join G8 G7 G4) (inner-join G10 G9 G4) (inner-join G12 G11 G4) (inner-join G14 G13 G4) (inner-join G11 G20 G4) (inner-join G16 G15 G4) (inner-join G17 G11 G4) (inner-join G16 G18 G4) (inner-join G19 G11 G4) (inner-join G16 G21 G4) (inner-join G16 G22 G4) (inner-join G20 G11 G4) (inner-join G3 G23 G4) (inner-join G24 G16 G4) (inner-join G21 G16 G4) (inner-join G11 G25 G4) (inner-join G3 G26 G4) (inner-join G22 G16 G4) (inner-join G11 G27 G4) (inner-join G3 G28 G4) (inner-join G3 G29 G4) (inner-join G30 G16 G4) (inner-join G23 G3 G4) (inner-join G16 G24 G4) (inner-join G25 G11 G4) (inner-join G26 G3 G4) (inner-join G27 G11 G4) (inner-join G28 G3 G4) (inner-join G29 G3 G4) (inner-join G16 G30 G4)
 │    └── [presentation: a:1,?column?:5,a:6,?column?:10]
 │         ├── best: (inner-join G3 G2 G4)
 │         └── cost: 2112.64
 ├── G2: (inner-join G5 G7 G4) (inner-join G7 G5 G4) (inner-join G9 G13 G4) (inner-join G11 G15 G4) (inner-join G13 G9 G4) (inner-join G15 G11 G4) (inner-join G11 G18 G4) (inner-join G18 G11 G4)
 │    └── []
 │         ├── best: (inner-join G11 G15 G4)
 │         └── cost: 1040.08
 ├── G3: (project G31 G32)
 │    └── []
 │         ├── best: (project G31 G32)
 │         └── cost: 1060.05
 ├── G4: (filters)
 ├── G5: (inner-join G9 G11 G4) (inner-join G11 G9 G4)
 │    └── []
 │         ├── best: (inner-join G9 G11 G4)
 │         └── cost: 1040.08
 ├── G6: (inner-join G7 G3 G4) (inner-join G3 G7 G4)
 │    └── []
 │         ├── best: (inner-join G7 G3 G4)
 │         └── cost: 12110.08
 ├── G7: (scan x)
 │    └── []
 │         ├── best: (scan x)
 │         └── cost: 1020.02
 ├── G8: (inner-join G5 G3 G4) (inner-join G3 G5 G4) (inner-join G9 G16 G4) (inner-join G11 G14 G4) (inner-join G16 G9 G4) (inner-join G14 G11 G4)
 │    └── []
 │         ├── best: (inner-join G3 G5 G4)
 │         └── cost: 2112.64
 ├── G9: (values G33 id=v1)
 │    └── []
 │         ├── best: (values G33 id=v1)
 │         └── cost: 0.01
 ├── G10: (inner-join G13 G3 G4) (inner-join G3 G13 G4) (inner-join G11 G6 G4) (inner-join G7 G16 G4) (inner-join G6 G11 G4) (inner-join G16 G7 G4)
 │    └── []
 │         ├── best: (inner-join G3 G13 G4)
 │         └── cost: 3145.15
 ├── G11: (project G34 G32)
 │    └── []
 │         ├── best: (project G34 G32)
 │         └── cost: 1040.06
 ├── G12: (inner-join G15 G3 G4) (inner-join G3 G15 G4)
 │    └── []
 │         ├── best: (inner-join G3 G15 G4)
 │         └── cost: 1072.57
 ├── G13: (inner-join G11 G7 G4) (inner-join G7 G11 G4)
 │    └── []
 │         ├── best: (inner-join G7 G11 G4)
 │         └── cost: 2072.59
 ├── G14: (inner-join G9 G3 G4) (inner-join G3 G9 G4)
 │    └── []
 │         ├── best: (inner-join G3 G9 G4)
 │         └── cost: 1072.57
 ├── G15: (values G33 id=v2)
 │    └── []
 │         ├── best: (values G33 id=v2)
 │         └── cost: 0.01
 ├── G16: (inner-join G11 G3 G4) (inner-join G3 G11 G4)
 │    └── []
 │         ├── best: (inner-join G3 G11 G4)
 │         └── cost: 2112.62
 ├── G17: (inner-join G18 G3 G4) (inner-join G3 G18 G4)
 │    └── []
 │         ├── best: (inner-join G3 G18 G4)
 │         └── cost: 1072.57
 ├── G18: (values G33 id=v3)
 │    └── []
 │         ├── best: (values G33 id=v3)
 │         └── cost: 0.01
 ├── G19: (inner-join G9 G6 G4) (inner-join G6 G9 G4) (inner-join G3 G24 G4) (inner-join G24 G3 G4)
 │    └── []
 │         ├── best: (inner-join G3 G24 G4)
 │         └── cost: 1072.57
 ├── G20: (inner-join G7 G14 G4) (inner-join G14 G7 G4) (inner-join G3 G30 G4) (inner-join G30 G3 G4)
 │    └── []
 │         ├── best: (inner-join G3 G30 G4)
 │         └── cost: 1072.57
 ├── G21: (values G33 id=v6)
 │    └── []
 │         ├── best: (values G33 id=v6)
 │         └── cost: 0.01
 ├── G22: (values G33 id=v7)
 │    └── []
 │         ├── best: (values G33 id=v7)
 │         └── cost: 0.01
 ├── G23: (inner-join G24 G11 G4) (inner-join G11 G24 G4)
 │    └── []
 │         ├── best: (inner-join G24 G11 G4)
 │         └── cost: 1040.08
 ├── G24: (values G33 id=v4)
 │    └── []
 │         ├── best: (values G33 id=v4)
 │         └── cost: 0.01
 ├── G25: (inner-join G3 G21 G4) (inner-join G21 G3 G4)
 │    └── []
 │         ├── best: (inner-join G3 G21 G4)
 │         └── cost: 1072.57
 ├── G26: (inner-join G11 G21 G4) (inner-join G21 G11 G4)
 │    └── []
 │         ├── best: (inner-join G11 G21 G4)
 │         └── cost: 1040.08
 ├── G27: (inner-join G3 G22 G4) (inner-join G22 G3 G4)
 │    └── []
 │         ├── best: (inner-join G3 G22 G4)
 │         └── cost: 1072.57
 ├── G28: (inner-join G11 G22 G4) (inner-join G22 G11 G4)
 │    └── []
 │         ├── best: (inner-join G11 G22 G4)
 │         └── cost: 1040.08
 ├── G29: (inner-join G30 G11 G4) (inner-join G11 G30 G4)
 │    └── []
 │         ├── best: (inner-join G30 G11 G4)
 │         └── cost: 1040.08
 ├── G30: (values G33 id=v5)
 │    └── []
 │         ├── best: (values G33 id=v5)
 │         └── cost: 0.01
 ├── G31: (update G35 x)
 │    └── []
 │         ├── best: (update G35 x)
 │         └── cost: 1040.04
 ├── G32: (projections G36)
 ├── G33: (scalar-list)
 ├── G34: (select G37 G38)
 │    └── []
 │         ├── best: (select G37 G38)
 │         └── cost: 1040.05
 ├── G35: (project G39 G32 a)
 │    └── []
 │         ├── best: (project G39 G32 a)
 │         └── cost: 1040.03
 ├── G36: (const 1)
 ├── G37: (insert G40 x)
 │    └── []
 │         ├── best: (insert G40 x)
 │         └── cost: 1030.04
 ├── G38: (filters G41)
 ├── G39: (scan x)
 │    └── []
 │         ├── best: (scan x)
 │         └── cost: 1020.02
 ├── G40: (project G42 G43)
 │    └── []
 │         ├── best: (project G42 G43)
 │         └── cost: 1030.03
 ├── G41: (false)
 ├── G42: (scan x,cols=())
 │    └── []
 │         ├── best: (scan x,cols=())
 │         └── cost: 1010.02
 ├── G43: (projections G44)
 └── G44: (null)
