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

exec-ddl
CREATE TABLE b (x INT, y FLOAT)
----
TABLE b
 ├── x int
 ├── y float
 ├── rowid int not null (hidden)
 └── INDEX primary
      └── rowid int not null (hidden)

exec-ddl
CREATE TABLE c (x INT, y FLOAT, z VARCHAR, CONSTRAINT fk_x_ref_a FOREIGN KEY (x) REFERENCES a (x))
----
TABLE c
 ├── x int
 ├── y float
 ├── z string
 ├── rowid int not null (hidden)
 ├── INDEX primary
 │    └── rowid int not null (hidden)
 └── INDEX c_auto_index_fk_x_ref_a
      ├── x int
      └── rowid int not null (hidden)

build
SELECT * FROM a, b
----
project
 ├── columns: x:1(int!null) y:2(float) x:3(int) y:4(float)
 └── inner-join
      ├── columns: a.x:1(int!null) a.y:2(float) b.x:3(int) b.y:4(float) rowid:5(int!null)
      ├── scan a
      │    └── columns: a.x:1(int!null) a.y:2(float)
      ├── scan b
      │    └── columns: b.x:3(int) b.y:4(float) rowid:5(int!null)
      └── true [type=bool]

build
SELECT a.x, b.y FROM a, b WHERE a.x = b.x
----
project
 ├── columns: x:1(int!null) y:4(float)
 └── select
      ├── columns: a.x:1(int!null) a.y:2(float) b.x:3(int!null) b.y:4(float) rowid:5(int!null)
      ├── inner-join
      │    ├── columns: a.x:1(int!null) a.y:2(float) b.x:3(int) b.y:4(float) rowid:5(int!null)
      │    ├── scan a
      │    │    └── columns: a.x:1(int!null) a.y:2(float)
      │    ├── scan b
      │    │    └── columns: b.x:3(int) b.y:4(float) rowid:5(int!null)
      │    └── true [type=bool]
      └── filters [type=bool]
           └── eq [type=bool]
                ├── variable: a.x [type=int]
                └── variable: b.x [type=int]

build
SELECT * FROM c, b, a WHERE c.x = a.x AND b.x = a.x
----
project
 ├── columns: x:1(int!null) y:2(float) z:3(string) x:5(int!null) y:6(float) x:8(int!null) y:9(float)
 └── select
      ├── columns: c.x:1(int!null) c.y:2(float) z:3(string) c.rowid:4(int!null) b.x:5(int!null) b.y:6(float) b.rowid:7(int!null) a.x:8(int!null) a.y:9(float)
      ├── inner-join
      │    ├── columns: c.x:1(int) c.y:2(float) z:3(string) c.rowid:4(int!null) b.x:5(int) b.y:6(float) b.rowid:7(int!null) a.x:8(int!null) a.y:9(float)
      │    ├── scan c
      │    │    └── columns: c.x:1(int) c.y:2(float) z:3(string) c.rowid:4(int!null)
      │    ├── inner-join
      │    │    ├── columns: b.x:5(int) b.y:6(float) b.rowid:7(int!null) a.x:8(int!null) a.y:9(float)
      │    │    ├── scan b
      │    │    │    └── columns: b.x:5(int) b.y:6(float) b.rowid:7(int!null)
      │    │    ├── scan a
      │    │    │    └── columns: a.x:8(int!null) a.y:9(float)
      │    │    └── true [type=bool]
      │    └── true [type=bool]
      └── filters [type=bool]
           └── and [type=bool]
                ├── eq [type=bool]
                │    ├── variable: c.x [type=int]
                │    └── variable: a.x [type=int]
                └── eq [type=bool]
                     ├── variable: b.x [type=int]
                     └── variable: a.x [type=int]

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

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

build fully-qualify-names
SELECT a.x FROM db1.a, db2.a
----
error (42P09): ambiguous source name: "a"

build fully-qualify-names
SELECT x FROM a, b
----
error (42702): column reference "x" is ambiguous (candidates: a.x, b.x)

build fully-qualify-names
SELECT * FROM db1.a, db2.a
----
inner-join
 ├── columns: x:1(int!null) y:2(float) z:3(string) x:4(int!null) y:5(float)
 ├── scan a
 │    └── columns: db1.public.a.x:1(int!null) db1.public.a.y:2(float) db1.public.a.z:3(string)
 ├── scan a
 │    └── columns: db2.public.a.x:4(int!null) db2.public.a.y:5(float)
 └── true [type=bool]

build fully-qualify-names
SELECT * FROM a, a
----
error (42712): source name "a" specified more than once (missing AS clause)

build fully-qualify-names
SELECT * FROM t.a, a
----
error (42712): source name "a" specified more than once (missing AS clause)

build fully-qualify-names
SELECT * FROM t.a, a AS a
----
inner-join
 ├── columns: x:1(int!null) y:2(float) x:3(int!null) y:4(float)
 ├── scan a
 │    └── columns: t.public.a.x:1(int!null) t.public.a.y:2(float)
 ├── scan a
 │    └── columns: t.public.a.x:3(int!null) t.public.a.y:4(float)
 └── true [type=bool]

build fully-qualify-names
SELECT a.* FROM t.a, a AS a
----
error (42P09): ambiguous source name: "a"
