exec-ddl
CREATE TABLE a (x INT PRIMARY KEY, y INT, f FLOAT, s STRING)
----
TABLE a
 ├── x int not null
 ├── y int
 ├── f float
 ├── s string
 └── INDEX primary
      └── x int not null

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

# --------------------------------------------------
# EliminateProject
# --------------------------------------------------

# Same order, same names.
opt expect=EliminateProject
SELECT x, y FROM a
----
scan a
 ├── columns: x:1(int!null) y:2(int)
 ├── key: (1)
 └── fd: (1)-->(2)

# Different order, aliased names.
opt expect=EliminateProject
SELECT a.y AS aliasy, a.x FROM a
----
scan a
 ├── columns: aliasy:2(int) x:1(int!null)
 ├── key: (1)
 └── fd: (1)-->(2)

# Reordered, duplicate, aliased columns.
opt expect=EliminateProject
SELECT a.y AS alias1, a.x, a.y AS alias1, a.x FROM a
----
scan a
 ├── columns: alias1:2(int) x:1(int!null) alias1:2(int) x:1(int!null)
 ├── key: (1)
 └── fd: (1)-->(2)

# Added column (projection should not be eliminated).
opt expect-not=EliminateProject
SELECT *, 1 r FROM a
----
project
 ├── columns: x:1(int!null) y:2(int) f:3(float) s:4(string) r:5(int!null)
 ├── key: (1)
 ├── fd: ()-->(5), (1)-->(2-4)
 ├── scan a
 │    ├── columns: x:1(int!null) y:2(int) f:3(float) s:4(string)
 │    ├── key: (1)
 │    └── fd: (1)-->(2-4)
 └── projections [outer=(1-4)]
      └── const: 1 [type=int]

# --------------------------------------------------
# EliminateProjectProject
# --------------------------------------------------

opt expect=EliminateProjectProject
SELECT y+1 AS r FROM (SELECT a.y FROM a, b WHERE a.x=b.x) a
----
project
 ├── columns: r:7(int)
 ├── inner-join (merge)
 │    ├── columns: a.x:1(int!null) y:2(int) b.x:5(int!null)
 │    ├── key: (5)
 │    ├── fd: (1)-->(2), (1)==(5), (5)==(1)
 │    ├── scan a
 │    │    ├── columns: a.x:1(int!null) y:2(int)
 │    │    ├── key: (1)
 │    │    ├── fd: (1)-->(2)
 │    │    └── ordering: +1
 │    ├── scan b
 │    │    ├── columns: b.x:5(int!null)
 │    │    ├── key: (5)
 │    │    └── ordering: +5
 │    └── merge-on
 │         ├── left ordering: +1
 │         ├── right ordering: +5
 │         └── true [type=bool]
 └── projections [outer=(2)]
      └── y + 1 [type=int, outer=(2)]
