exec-ddl
CREATE TABLE a (k INT PRIMARY KEY, i INT, s STRING, d DECIMAL NOT NULL)
----
TABLE a
 ├── k int not null
 ├── i int
 ├── s string
 ├── d decimal not null
 └── INDEX primary
      └── k int not null

exec-ddl
CREATE TABLE b (x INT, z INT NOT NULL)
----
TABLE b
 ├── x int
 ├── z int not null
 ├── rowid int not null (hidden)
 └── INDEX primary
      └── rowid int not null (hidden)

opt
SELECT k, i FROM a UNION SELECT * FROM b
----
union
 ├── columns: k:8(int) i:9(int)
 ├── left columns: a.k:1(int) a.i:2(int)
 ├── right columns: x:5(int) z:6(int)
 ├── stats: [rows=2000, distinct(8,9)=2000]
 ├── cost: 2150
 ├── key: (8,9)
 ├── scan a
 │    ├── columns: a.k:1(int!null) a.i:2(int)
 │    ├── stats: [rows=1000, distinct(1,2)=1000]
 │    ├── cost: 1060
 │    ├── key: (1)
 │    └── fd: (1)-->(2)
 └── scan b
      ├── columns: x:5(int) z:6(int!null)
      ├── stats: [rows=1000, distinct(5,6)=1000]
      └── cost: 1050

opt
SELECT k, i FROM a UNION ALL SELECT * FROM b
----
union-all
 ├── columns: k:8(int) i:9(int)
 ├── left columns: a.k:1(int) a.i:2(int)
 ├── right columns: x:5(int) z:6(int)
 ├── stats: [rows=2000]
 ├── cost: 2130
 ├── scan a
 │    ├── columns: a.k:1(int!null) a.i:2(int)
 │    ├── stats: [rows=1000]
 │    ├── cost: 1060
 │    ├── key: (1)
 │    └── fd: (1)-->(2)
 └── scan b
      ├── columns: x:5(int) z:6(int!null)
      ├── stats: [rows=1000]
      └── cost: 1050

opt
SELECT k, i FROM a INTERSECT SELECT * FROM b
----
intersect
 ├── columns: k:1(int) i:2(int)
 ├── left columns: k:1(int) i:2(int)
 ├── right columns: x:5(int) z:6(int)
 ├── stats: [rows=1000, distinct(1,2)=1000]
 ├── cost: 2140
 ├── key: (1,2)
 ├── scan a
 │    ├── columns: k:1(int!null) i:2(int)
 │    ├── stats: [rows=1000, distinct(1,2)=1000]
 │    ├── cost: 1060
 │    ├── key: (1)
 │    └── fd: (1)-->(2)
 └── scan b
      ├── columns: x:5(int) z:6(int!null)
      ├── stats: [rows=1000, distinct(5,6)=1000]
      └── cost: 1050

opt
SELECT k, i FROM a INTERSECT ALL SELECT * FROM b
----
intersect-all
 ├── columns: k:1(int) i:2(int)
 ├── left columns: k:1(int) i:2(int)
 ├── right columns: x:5(int) z:6(int)
 ├── stats: [rows=1000]
 ├── cost: 2140
 ├── scan a
 │    ├── columns: k:1(int!null) i:2(int)
 │    ├── stats: [rows=1000]
 │    ├── cost: 1060
 │    ├── key: (1)
 │    └── fd: (1)-->(2)
 └── scan b
      ├── columns: x:5(int) z:6(int!null)
      ├── stats: [rows=1000]
      └── cost: 1050

opt
SELECT k, i FROM a EXCEPT SELECT * FROM b
----
except
 ├── columns: k:1(int) i:2(int)
 ├── left columns: k:1(int) i:2(int)
 ├── right columns: x:5(int) z:6(int)
 ├── stats: [rows=1000, distinct(1,2)=1000]
 ├── cost: 2140
 ├── key: (1,2)
 ├── scan a
 │    ├── columns: k:1(int!null) i:2(int)
 │    ├── stats: [rows=1000, distinct(1,2)=1000]
 │    ├── cost: 1060
 │    ├── key: (1)
 │    └── fd: (1)-->(2)
 └── scan b
      ├── columns: x:5(int) z:6(int!null)
      ├── stats: [rows=1000, distinct(5,6)=1000]
      └── cost: 1050

opt
SELECT k, i FROM a EXCEPT ALL SELECT * FROM b
----
except-all
 ├── columns: k:1(int) i:2(int)
 ├── left columns: k:1(int) i:2(int)
 ├── right columns: x:5(int) z:6(int)
 ├── stats: [rows=1000]
 ├── cost: 2140
 ├── scan a
 │    ├── columns: k:1(int!null) i:2(int)
 │    ├── stats: [rows=1000]
 │    ├── cost: 1060
 │    ├── key: (1)
 │    └── fd: (1)-->(2)
 └── scan b
      ├── columns: x:5(int) z:6(int!null)
      ├── stats: [rows=1000]
      └── cost: 1050
